Merge branch 'master' into notes-search
authorENT8R <info.ent8r@gmail.com>
Tue, 9 Oct 2018 09:41:22 +0000 (11:41 +0200)
committerENT8R <info.ent8r@gmail.com>
Tue, 9 Oct 2018 09:41:22 +0000 (11:41 +0200)
333 files changed:
.gitignore
.rubocop.yml
.rubocop_todo.yml
.travis.yml
Gemfile.lock
INSTALL.md
Vagrantfile
Vendorfile
app/assets/javascripts/application.js
app/assets/javascripts/embed.js.erb
app/assets/javascripts/index.js
app/assets/javascripts/index/contextmenu.js
app/assets/javascripts/index/history.js
app/assets/javascripts/index/search.js
app/assets/javascripts/leaflet.map.js
app/assets/stylesheets/common.scss
app/assets/stylesheets/small.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/diary_entry_controller.rb
app/controllers/geocoder_controller.rb
app/controllers/issues_controller.rb
app/controllers/messages_controller.rb
app/controllers/node_controller.rb
app/controllers/notes_controller.rb
app/controllers/old_controller.rb
app/controllers/traces_controller.rb
app/controllers/users_controller.rb [moved from app/controllers/user_controller.rb with 87% similarity]
app/helpers/banner_helper.rb
app/helpers/changeset_helper.rb
app/helpers/issues_helper.rb
app/helpers/note_helper.rb
app/helpers/notifier_helper.rb
app/helpers/user_helper.rb
app/helpers/user_roles_helper.rb
app/models/changeset.rb
app/models/client_application.rb
app/models/node.rb
app/models/note.rb
app/models/notifier.rb
app/models/oauth_nonce.rb
app/models/relation.rb
app/models/request_token.rb
app/models/trace.rb
app/models/way.rb
app/views/browse/changeset.html.erb
app/views/changeset/_changeset.html.erb
app/views/changeset/_user.atom.builder
app/views/changeset/history.html.erb
app/views/changeset/index.atom.builder [moved from app/views/changeset/list.atom.builder with 81% similarity]
app/views/changeset/index.html.erb [moved from app/views/changeset/list.html.erb with 100% similarity]
app/views/diary_entry/_diary_entry.html.erb
app/views/diary_entry/_diary_index_entry.html.erb [new file with mode: 0644]
app/views/diary_entry/_diary_list_entry.html.erb [deleted file]
app/views/diary_entry/comments.html.erb
app/views/diary_entry/index.html.erb [moved from app/views/diary_entry/list.html.erb with 96% similarity]
app/views/diary_entry/rss.rss.builder
app/views/diary_entry/show.html.erb [moved from app/views/diary_entry/view.html.erb with 91% similarity]
app/views/issues/_comments.html.erb
app/views/issues/_reports.html.erb
app/views/issues/index.html.erb
app/views/layouts/_head.html.erb
app/views/layouts/_header.html.erb
app/views/layouts/map.html.erb
app/views/messages/_message_summary.html.erb
app/views/messages/_sent_message_summary.html.erb
app/views/messages/new.html.erb
app/views/messages/show.html.erb
app/views/oauth/authorize.html.erb
app/views/site/about.html.erb
app/views/traces/_trace.html.erb
app/views/traces/edit.html.erb
app/views/traces/georss.rss.builder
app/views/traces/index.html.erb [moved from app/views/traces/list.html.erb with 89% similarity]
app/views/traces/show.html.erb [moved from app/views/traces/view.html.erb with 90% similarity]
app/views/users/_api_user.builder [moved from app/views/user/_api_user.builder with 100% similarity]
app/views/users/_auth_association.html.erb [moved from app/views/user/_auth_association.html.erb with 100% similarity]
app/views/users/_contact.html.erb [moved from app/views/user/_contact.html.erb with 72% similarity]
app/views/users/_popup.html.erb [moved from app/views/user/_popup.html.erb with 100% similarity]
app/views/users/_terms.html.erb [moved from app/views/user/_terms.html.erb with 100% similarity]
app/views/users/_user.html.erb [moved from app/views/user/_user.html.erb with 66% similarity]
app/views/users/account.html.erb [moved from app/views/user/account.html.erb with 94% similarity]
app/views/users/api_read.builder [moved from app/views/user/api_read.builder with 100% similarity]
app/views/users/api_users.builder [moved from app/views/user/api_users.builder with 100% similarity]
app/views/users/blocked.html.erb [moved from app/views/user/blocked.html.erb with 100% similarity]
app/views/users/confirm.html.erb [moved from app/views/user/confirm.html.erb with 100% similarity]
app/views/users/confirm_email.html.erb [moved from app/views/user/confirm_email.html.erb with 100% similarity]
app/views/users/index.html.erb [moved from app/views/user/list.html.erb with 100% similarity]
app/views/users/login.html.erb [moved from app/views/user/login.html.erb with 94% similarity]
app/views/users/logout.html.erb [moved from app/views/user/logout.html.erb with 100% similarity]
app/views/users/lost_password.html.erb [moved from app/views/user/lost_password.html.erb with 100% similarity]
app/views/users/make_friend.html.erb [moved from app/views/user/make_friend.html.erb with 100% similarity]
app/views/users/new.html.erb [moved from app/views/user/new.html.erb with 100% similarity]
app/views/users/no_such_user.html.erb [moved from app/views/user/no_such_user.html.erb with 100% similarity]
app/views/users/remove_friend.html.erb [moved from app/views/user/remove_friend.html.erb with 100% similarity]
app/views/users/reset_password.html.erb [moved from app/views/user/reset_password.html.erb with 100% similarity]
app/views/users/show.html.erb [moved from app/views/user/view.html.erb with 94% similarity]
app/views/users/suspended.html.erb [moved from app/views/user/suspended.html.erb with 100% similarity]
app/views/users/terms.html.erb [moved from app/views/user/terms.html.erb with 100% similarity]
config/environments/development.rb
config/i18n-js.yml
config/initializers/assets.rb
config/initializers/i18n.rb
config/initializers/oauth.rb
config/jshint.yml
config/locales/af.yml
config/locales/aln.yml
config/locales/ar.yml
config/locales/arz.yml
config/locales/ast.yml
config/locales/az.yml
config/locales/ba.yml
config/locales/be-Tarask.yml
config/locales/be.yml
config/locales/bg.yml
config/locales/bn.yml
config/locales/br.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/ce.yml
config/locales/cs.yml
config/locales/cy.yml
config/locales/da.yml
config/locales/de.yml
config/locales/diq.yml
config/locales/dsb.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/fur.yml
config/locales/ga.yml
config/locales/gd.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hr.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/kab.yml
config/locales/km.yml
config/locales/kn.yml
config/locales/ko.yml
config/locales/ku-Latn.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/mo.yml
config/locales/mr.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nds.yml
config/locales/ne.yml
config/locales/nl.yml
config/locales/nn.yml
config/locales/oc.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt-PT.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/scn.yml
config/locales/sco.yml
config/locales/sk.yml
config/locales/sl.yml
config/locales/sq.yml
config/locales/sr-Latn.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/ta.yml
config/locales/te.yml
config/locales/th.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/routes.rb
config/wiki_pages.yml
db/functions/Makefile
db/migrate/021_move_to_innodb.rb
lib/bounding_box.rb
lib/classic_pagination/pagination.rb
lib/daemons/gpx_import.rb
lib/geo_record.rb
lib/gpx.rb
lib/potlatch.rb
lib/utf8.rb
script/deliver-message
script/gravatar
script/misc/update-wiki-pages
script/vagrant/setup/provision.sh
test/controllers/amf_controller_test.rb
test/controllers/browse_controller_test.rb
test/controllers/changeset_controller_test.rb
test/controllers/diary_entry_controller_test.rb
test/controllers/geocoder_controller_test.rb
test/controllers/messages_controller_test.rb
test/controllers/old_node_controller_test.rb
test/controllers/redactions_controller_test.rb
test/controllers/reports_controller_test.rb
test/controllers/site_controller_test.rb
test/controllers/swf_controller_test.rb
test/controllers/traces_controller_test.rb
test/controllers/user_blocks_controller_test.rb
test/controllers/user_roles_controller_test.rb
test/controllers/users_controller_test.rb [moved from test/controllers/user_controller_test.rb with 88% similarity]
test/factories/changeset_comments.rb
test/factories/changesets.rb
test/factories/issues.rb
test/factories/languages.rb
test/factories/messages.rb
test/factories/node.rb
test/factories/note_comments.rb
test/factories/notes.rb
test/factories/old_node.rb
test/factories/old_relation.rb
test/factories/old_relation_member.rb
test/factories/old_way.rb
test/factories/old_way_node.rb
test/factories/relation.rb
test/factories/relation_member.rb
test/factories/reports.rb
test/factories/tracepoints.rb
test/factories/traces.rb
test/factories/user.rb
test/factories/user_blocks.rb
test/factories/way.rb
test/factories/way_node.rb
test/integration/client_applications_test.rb
test/integration/user_changeset_comments_test.rb
test/integration/user_creation_test.rb
test/integration/user_diaries_test.rb
test/integration/user_login_test.rb
test/integration/user_roles_test.rb
test/integration/user_terms_seen_test.rb
test/lib/bounding_box_test.rb
test/lib/country_test.rb
test/models/changeset_test.rb
test/models/message_test.rb
test/models/node_test.rb
test/models/old_node_test.rb
test/models/relation_test.rb
test/models/tracepoint_test.rb
test/models/way_test.rb
test/system/issues_test.rb
test/system/report_user_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/locales/af.json
vendor/assets/iD/iD/locales/ar.json
vendor/assets/iD/iD/locales/ast.json
vendor/assets/iD/iD/locales/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/cy.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-AU.json [new file with mode: 0644]
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/he.json
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/lt.json
vendor/assets/iD/iD/locales/lv.json
vendor/assets/iD/iD/locales/mg.json
vendor/assets/iD/iD/locales/mk.json
vendor/assets/iD/iD/locales/ms.json
vendor/assets/iD/iD/locales/nl.json
vendor/assets/iD/iD/locales/nn.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/th.json
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/javascripts/bowser.js
vendor/assets/leaflet/leaflet.css
vendor/assets/leaflet/leaflet.js
vendor/assets/leaflet/leaflet.osm.js

index 920ca1120ba51aa6171900e39560d36c48d1343f..1a2d35c6a28cc056de2646690384138a52a03caf 100644 (file)
@@ -1,5 +1,6 @@
 log
 config/piwik.yml
+app/assets/javascripts/i18n
 public/assets
 public/attachments
 public/export
index 24d57fb37cc0b354c71674e00c8a6f9671bbdf6b..b33f9046cb87c117925cc8e290392f2021aae270 100644 (file)
@@ -1,5 +1,8 @@
 inherit_from: .rubocop_todo.yml
 
+AllCops:
+  TargetRubyVersion: 2.3
+
 Rails:
   Enabled: true
 
@@ -27,6 +30,9 @@ Rails/ApplicationRecord:
 Rails/CreateTableWithTimestamps:
   Enabled: false
 
+Rails/FindEach:
+  Enabled: false
+
 Rails/HasManyOrHasOneDependent:
   Enabled: false
 
@@ -39,7 +45,7 @@ Rails/InverseOf:
 Rails/SkipsModelValidations:
   Exclude:
     - 'db/migrate/*.rb'
-    - 'app/controllers/user_controller.rb'
+    - 'app/controllers/users_controller.rb'
 
 Style/BracesAroundHashParameters:
   EnforcedStyle: context_dependent
@@ -50,10 +56,6 @@ Style/FormatStringToken:
 Style/IfInsideElse:
   Enabled: false
 
-Style/GlobalVars:
-  Exclude:
-    - 'lib/quad_tile/extconf.rb'
-
 Style/GuardClause:
   Enabled: false
 
index f012237b31aba8b6fff09b291fa9f98ce279c6b4..8fc701cb3b7f9797cf67eba47fad086086d4b1a6 100644 (file)
@@ -1,23 +1,11 @@
 # This configuration was generated by
 # `rubocop --auto-gen-config`
-# on 2018-06-19 09:02:55 +0100 using RuboCop version 0.57.2.
+# on 2018-09-19 14:24:02 +0100 using RuboCop version 0.58.2.
 # The point is for the user to remove these configuration records
 # one by one as the offenses are removed from the code base.
 # Note that changes in the inspected code, or installation of new
 # versions of RuboCop, may require this file to be generated again.
 
-# Offense count: 34
-Lint/AmbiguousOperator:
-  Exclude:
-    - 'test/controllers/amf_controller_test.rb'
-    - 'test/controllers/changeset_controller_test.rb'
-    - 'test/lib/bounding_box_test.rb'
-    - 'test/lib/country_test.rb'
-
-# Offense count: 96
-Lint/AmbiguousRegexpLiteral:
-  Enabled: false
-
 # Offense count: 32
 # Configuration parameters: AllowSafeAssignment.
 Lint/AssignmentInCondition:
@@ -26,7 +14,7 @@ Lint/AssignmentInCondition:
     - 'app/controllers/geocoder_controller.rb'
     - 'app/controllers/notes_controller.rb'
     - 'app/controllers/traces_controller.rb'
-    - 'app/controllers/user_controller.rb'
+    - 'app/controllers/users_controller.rb'
     - 'app/controllers/user_preferences_controller.rb'
     - 'app/helpers/application_helper.rb'
     - 'app/helpers/browse_helper.rb'
@@ -40,21 +28,17 @@ Lint/AssignmentInCondition:
 Lint/HandleExceptions:
   Exclude:
     - 'app/controllers/amf_controller.rb'
-    - 'app/controllers/user_controller.rb'
-
-# Offense count: 2
-Lint/ShadowingOuterLocalVariable:
-  Exclude:
-    - 'app/views/changeset/list.atom.builder'
+    - 'app/controllers/users_controller.rb'
 
-# Offense count: 690
+# Offense count: 692
 Metrics/AbcSize:
   Max: 280
 
-# Offense count: 41
+# Offense count: 40
 # Configuration parameters: CountComments, ExcludedMethods.
+# ExcludedMethods: refine
 Metrics/BlockLength:
-  Max: 261
+  Max: 262
 
 # Offense count: 11
 # Configuration parameters: CountBlocks.
@@ -70,7 +54,7 @@ Metrics/ClassLength:
 Metrics/CyclomaticComplexity:
   Max: 20
 
-# Offense count: 688
+# Offense count: 691
 # Configuration parameters: CountComments.
 Metrics/MethodLength:
   Max: 179
@@ -85,7 +69,7 @@ Metrics/ModuleLength:
 Metrics/ParameterLists:
   Max: 9
 
-# Offense count: 71
+# Offense count: 72
 Metrics/PerceivedComplexity:
   Max: 23
 
@@ -155,7 +139,7 @@ Rails/NotNullColumn:
 # Offense count: 20
 Rails/OutputSafety:
   Exclude:
-    - 'app/controllers/user_controller.rb'
+    - 'app/controllers/users_controller.rb'
     - 'app/helpers/application_helper.rb'
     - 'app/helpers/changeset_helper.rb'
     - 'app/helpers/geocoder_helper.rb'
@@ -178,10 +162,17 @@ Style/AsciiComments:
   Exclude:
     - 'test/models/message_test.rb'
 
-# Offense count: 229
+# Offense count: 230
 Style/Documentation:
   Enabled: false
 
+# Offense count: 462
+# Cop supports --auto-correct.
+# Configuration parameters: EnforcedStyle.
+# SupportedStyles: when_needed, always, never
+Style/FrozenStringLiteralComment:
+  Enabled: false
+
 # Offense count: 2
 # Cop supports --auto-correct.
 Style/IfUnlessModifier:
@@ -194,7 +185,7 @@ Style/IfUnlessModifier:
 Style/NumericLiterals:
   MinDigits: 11
 
-# Offense count: 3064
+# Offense count: 3080
 # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
 # URISchemes: http, https
 Metrics/LineLength:
index 48ddb4a1d09d4e3f1ca0b508c123ee39b0a96b31..8ce7f5f305b317e36df70fe404bd68a2a87e110a 100644 (file)
@@ -24,6 +24,7 @@ before_script:
   - psql -U postgres -c "CREATE FUNCTION xid_to_int4(xid) RETURNS int4 AS '/tmp/libpgosm', 'xid_to_int4' LANGUAGE C STRICT" openstreetmap
   - cp config/travis.database.yml config/database.yml
   - bundle exec rake db:migrate
+  - bundle exec rake i18n:js:export
 script:
   - bundle exec rubocop -f fuubar
   - bundle exec rake jshint
index 5e8e94ff50f42c5db68e14428ac169e4114456f9..76a31e169e59a8c4aacd58ef738f2de056957302 100644 (file)
@@ -2,7 +2,7 @@ GEM
   remote: https://rubygems.org/
   specs:
     SystemTimer (1.2.3)
-    aasm (5.0.0)
+    aasm (5.0.1)
       concurrent-ruby (~> 1.0)
     actioncable (5.2.0)
       actionpack (= 5.2.0)
@@ -56,14 +56,14 @@ GEM
     ast (2.4.0)
     autoprefixer-rails (8.6.5)
       execjs
-    better_errors (2.4.0)
+    better_errors (2.5.0)
       coderay (>= 1.0.0)
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
     bigdecimal (1.1.0)
     binding_of_caller (0.8.0)
       debug_inspector (>= 0.0.1)
-    bootsnap (1.3.1)
+    bootsnap (1.3.2)
       msgpack (~> 1.0)
     builder (3.2.3)
     canonical-rails (0.2.4)
@@ -104,10 +104,10 @@ GEM
     erubi (1.7.1)
     execjs (2.7.0)
     exifr (1.3.4)
-    factory_bot (4.10.0)
+    factory_bot (4.11.1)
       activesupport (>= 3.0.0)
-    factory_bot_rails (4.10.0)
-      factory_bot (~> 4.10.0)
+    factory_bot_rails (4.11.1)
+      factory_bot (~> 4.11.1)
       railties (>= 3.0.0)
     faraday (0.12.2)
       multipart-post (>= 1.2, < 3)
@@ -124,17 +124,17 @@ GEM
       concurrent-ruby (~> 1.0)
     i18n-js (3.0.11)
       i18n (>= 0.6.6, < 2)
-    image_optim (0.26.1)
+    image_optim (0.26.2)
       exifr (~> 1.2, >= 1.2.2)
       fspath (~> 3.0)
-      image_size (~> 1.5)
+      image_size (>= 1.5, < 3)
       in_threads (~> 1.3)
       progress (~> 3.0, >= 3.0.1)
     image_optim_rails (0.4.1)
       image_optim (~> 0.24)
       rails
       sprockets
-    image_size (1.5.0)
+    image_size (2.0.0)
     in_threads (1.5.0)
     jaro_winkler (1.5.1)
     jquery-rails (4.3.3)
@@ -169,14 +169,14 @@ GEM
       nokogiri (>= 1.5.9)
     mail (2.7.0)
       mini_mime (>= 0.1.1)
-    marcel (0.3.2)
+    marcel (0.3.3)
       mimemagic (~> 0.3.2)
     method_source (0.9.0)
-    mime-types (3.2.1)
+    mime-types (3.2.2)
       mime-types-data (~> 3.2015)
     mime-types-data (3.2018.0812)
     mimemagic (0.3.2)
-    mini_mime (1.0.0)
+    mini_mime (1.0.1)
     mini_portile2 (2.3.0)
     minitest (5.11.3)
     msgpack (1.2.4)
@@ -245,7 +245,7 @@ GEM
     powerpack (0.1.2)
     progress (3.4.0)
     psych (3.0.2)
-    public_suffix (3.0.2)
+    public_suffix (3.0.3)
     puma (3.12.0)
     quad_tile (1.0.1)
     r2 (0.2.7)
@@ -301,7 +301,7 @@ GEM
       rack (>= 1.4)
     rinku (2.0.4)
     rotp (3.3.1)
-    rubocop (0.58.2)
+    rubocop (0.59.1)
       jaro_winkler (~> 1.5.1)
       parallel (~> 1.10)
       parser (>= 2.5, != 2.5.1.1)
@@ -317,7 +317,7 @@ GEM
       crass (~> 1.0.2)
       nokogiri (>= 1.4.4)
       nokogumbo (~> 1.4)
-    sass (3.5.7)
+    sass (3.6.0)
       sass-listen (~> 4.0.0)
     sass-listen (4.0.0)
       rb-fsevent (~> 0.9, >= 0.9.4)
@@ -358,7 +358,7 @@ GEM
     tins (1.16.3)
     tzinfo (1.2.5)
       thread_safe (~> 0.1)
-    uglifier (4.1.18)
+    uglifier (4.1.19)
       execjs (>= 0.3.0, < 3)
     unicode-display_width (1.4.0)
     validates_email_format_of (1.6.3)
index 768cbd540c430a3d998ed40fca36052f2dd4ed84..8e47cb2667473bac991125e237138ac39e0d457f 100644 (file)
@@ -5,7 +5,7 @@ If you want to deploy the software for your own project, then see the notes at t
 
 You can install the software directly on your machine, which is the traditional and probably best-supported approach. However, there is an alternative which may be easier: Vagrant. This installs the software into a virtual machine, which makes it easier to get a consistent development environment and may avoid installation difficulties. For Vagrant instructions, see [VAGRANT.md](VAGRANT.md).
 
-These instructions are based on Ubuntu 12.04 LTS, which is the platform used by the OSMF servers.
+These instructions are based on Ubuntu 16.04 LTS, which is the platform used by the OSMF servers.
 The instructions also work, with only minor amendments, for all other current Ubuntu releases, Fedora and MacOSX
 
 We don't recommend attempting to develop or deploy this software on Windows. If you need to use Windows, then try developing this software using Ubuntu in a virtual machine, or use [Vagrant](VAGRANT.md).
index 44d914d75a1816c9b5f7591274c70e96e182f54e..fcb4790fef74461c0f028afc5c1a6d8032426522 100644 (file)
@@ -4,22 +4,26 @@
 Vagrant.configure("2") do |config|
   # use official ubuntu image for virtualbox
   config.vm.provider "virtualbox" do |vb, override|
-    override.vm.box = "ubuntu/xenial64"
+    override.vm.box = "ubuntu/bionic64"
     override.vm.synced_folder ".", "/srv/openstreetmap-website"
     vb.customize ["modifyvm", :id, "--memory", "1024"]
     vb.customize ["modifyvm", :id, "--cpus", "2"]
+    vb.customize ["modifyvm", :id, "--uartmode1", "disconnected"]
   end
 
-  # use third party image and NFS sharing for lxc
+  # Use sshfs sharing if available, otherwise NFS sharing
+  sharing_type = Vagrant.has_plugin?("vagrant-sshfs") ? "sshfs" : "nfs"
+
+  # use third party image and sshfs or NFS sharing for lxc
   config.vm.provider "lxc" do |_, override|
-    override.vm.box = "generic/ubuntu1604"
-    override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => "nfs"
+    override.vm.box = "generic/ubuntu1804"
+    override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => sharing_type
   end
 
-  # use third party image and NFS sharing for libvirt
+  # use third party image and sshfs or NFS sharing for libvirt
   config.vm.provider "libvirt" do |_, override|
-    override.vm.box = "generic/ubuntu1604"
-    override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => "nfs"
+    override.vm.box = "generic/ubuntu1804"
+    override.vm.synced_folder ".", "/srv/openstreetmap-website", :type => sharing_type
   end
 
   # configure shared package cache if possible
index 5303d738f69a511f7500e7015b101b7f10ed0a8e..15a8eba1b04b72b3d7698f0c3d184492787da434 100644 (file)
@@ -11,13 +11,13 @@ folder 'vendor/assets' do
   end
 
   folder 'leaflet' do
-    file 'leaflet.js', 'https://unpkg.com/leaflet@1.3.3/dist/leaflet-src.js'
-    file 'leaflet.css', 'https://unpkg.com/leaflet@1.3.3/dist/leaflet.css'
+    file 'leaflet.js', 'https://unpkg.com/leaflet@1.3.4/dist/leaflet-src.js'
+    file 'leaflet.css', 'https://unpkg.com/leaflet@1.3.4/dist/leaflet.css'
 
     [ 'layers.png', 'layers-2x.png',
       'marker-icon.png', 'marker-icon-2x.png',
       'marker-shadow.png' ].each do |image|
-      file "images/#{image}", "https://unpkg.com/leaflet@1.3.3/dist/images/#{image}"
+      file "images/#{image}", "https://unpkg.com/leaflet@1.3.4/dist/images/#{image}"
     end
 
     from 'git://github.com/aratcliffe/Leaflet.contextmenu.git', :tag => 'v1.5.0' do
@@ -69,7 +69,7 @@ folder 'vendor/assets' do
 
   folder 'javascripts' do
     file 'html5shiv.js', 'https://raw.githubusercontent.com/aFarkas/html5shiv/master/src/html5shiv.js'
-    file 'bowser.js', 'https://github.com/lancedikson/bowser/releases/download/1.9.3/bowser.js'
+    file 'bowser.js', 'https://github.com/lancedikson/bowser/releases/download/1.9.4/bowser.js'
   end
 
   folder 'swfobject' do
index 4461c5ab71cc950e43a0c5ae5ac82003e0874840..654b01680847f0668d38db7cec1c639cfb493f65 100644 (file)
@@ -12,7 +12,7 @@
 //= require leaflet.map
 //= require leaflet.zoom
 //= require leaflet.locationfilter
-//= require i18n/translations
+//= require i18n
 //= require oauth
 //= require piwik
 //= require richtext
index 15839a2ecbc4af23102a608c0804a4b988d92916..36b23666a92f8ebe61481ba8d508d014a76b60bf 100644 (file)
@@ -1,6 +1,7 @@
 //= require leaflet
 //= require leaflet.osm
-//= require i18n/translations
+//= require i18n
+//= require i18n/embed
 
 window.onload = function () {
   if (navigator.languages) {
index ccf4e561c98ceacd14d0e612f77e408fc6bac734..e8e566f53a2ca698ae09000cb73d54118282fd8d 100644 (file)
@@ -187,12 +187,12 @@ $(document).ready(function () {
     $.cookie('_osm_location', OSM.locationCookie(map), { expires: expiry, path: '/' });
   });
 
-  if ($.cookie('_osm_welcome') === 'hide') {
-    $('.welcome').hide();
+  if ($.cookie('_osm_welcome') !== 'hide') {
+    $('.welcome').addClass('visible');
   }
 
   $('.welcome .close-wrap').on('click', function() {
-    $('.welcome').hide();
+    $('.welcome').removeClass('visible');
     $.cookie('_osm_welcome', 'hide', { expires: expiry, path: '/' });
   });
 
index 1ee703e604579d01444a880ec12d7e5f26dcc9be..080a4de72b14691b5328a8b12976f061901b23db 100644 (file)
@@ -49,7 +49,7 @@ OSM.initializeContextMenu = function (map) {
           lat = latlng.lat.toFixed(precision),
           lng = latlng.lng.toFixed(precision);
 
-      OSM.router.route("/search?query=" + encodeURIComponent(lat + "," + lng));
+      OSM.router.route("/search?whereami=1&query=" + encodeURIComponent(lat + "," + lng));
     }
   });
 
index d54928eb812c1ac8f8f54bf93b75f948e6365f1c..9babb6e3225689d6854a783620324c20d9d69dfd 100644 (file)
@@ -97,9 +97,25 @@ OSM.History = function(map) {
     $("[data-changeset]").each(function () {
       var changeset = $(this).data('changeset');
       if (changeset.bbox) {
-        changeset.bounds = L.latLngBounds(
-          [changeset.bbox.minlat, changeset.bbox.minlon],
-          [changeset.bbox.maxlat, changeset.bbox.maxlon]);
+        var latWidth = changeset.bbox.maxlat - changeset.bbox.minlat,
+            lonWidth = changeset.bbox.maxlon - changeset.bbox.minlon,
+            minLatWidth = 0.0004,
+            minLonWidth = 0.0008;
+
+        var bounds = [[changeset.bbox.minlat, changeset.bbox.minlon],
+                      [changeset.bbox.maxlat, changeset.bbox.maxlon]];
+
+        if (latWidth < minLatWidth) {
+          bounds[0][0] -= ((minLatWidth - latWidth) / 2);
+          bounds[1][0] += ((minLatWidth - latWidth) / 2);
+        }
+
+        if (lonWidth < minLonWidth) {
+          bounds[0][1] -= ((minLonWidth - lonWidth) / 2);
+          bounds[1][1] += ((minLonWidth - lonWidth) / 2);
+        }
+
+        changeset.bounds = L.latLngBounds(bounds);
         changesets.push(changeset);
       }
     });
index 52af38c54f338b1d76290f8195108d48a0cf5de9..ea6140e582db78dea993eccdbde6eb1659124bb9 100644 (file)
@@ -34,7 +34,7 @@ OSM.Search = function(map) {
     e.preventDefault();
     var center = map.getCenter().wrap(),
       precision = OSM.zoomPrecision(map.getZoom());
-    OSM.router.route("/search?query=" + encodeURIComponent(
+    OSM.router.route("/search?whereami=1&query=" + encodeURIComponent(
       center.lat.toFixed(precision) + "," + center.lng.toFixed(precision)
     ));
   });
index ba88e5904dca22cb3c30577ebcf16d25ba95688f..e712a8d1f415719e14746ad6ef279694c5eedc23 100644 (file)
@@ -61,6 +61,12 @@ L.OSM.Map = L.Map.extend({
       code: "G",
       name: I18n.t("javascripts.map.base.gps")
     });
+
+    this.on("layeradd", function (event) {
+      if (this.baseLayers.indexOf(event.layer) >= 0) {
+        this.setMaxZoom(event.layer.options.maxZoom);
+      }
+    });
   },
 
   updateLayers: function(layerParam) {
index f9214b24dba1a94dd84c129541bfefbd6e09cd7b..3827a368a504a18b8c8c8e55ceba5b2886b5ba76 100644 (file)
@@ -611,11 +611,18 @@ body.compact {
     height: auto;
     overflow: hidden;
 
-    #banner,
-    .welcome {
+    #banner {
       display: block;
     }
 
+    .welcome {
+      display: none;
+
+      &.visible {
+        display: block;
+      }
+    }
+
     #sidebar_content {
       display: none;
     }
@@ -971,6 +978,8 @@ header .search_forms,
 
   img.button {
     display: block;
+    width: 20px;
+    height: 20px;
   }
 
   span.force_width {
@@ -1393,9 +1402,9 @@ tr.turn:hover {
 
 /* Overrides for pages that use new layout conventions */
 
-.user-new,
-.user-create,
-.user-terms {
+.users-new,
+.users-create,
+.users-terms {
   .content-body .content-inner {
     padding: 0;
 
@@ -1406,10 +1415,10 @@ tr.turn:hover {
   }
 }
 
-.user-new,
-.user-create,
-.user-terms,
-.user-confirm {
+.users-new,
+.users-create,
+.users-terms,
+.users-confirm {
   .content-heading .content-inner {
     height: 200px;
   }
@@ -1501,7 +1510,7 @@ tr.turn:hover {
 
 /* Rules for the trace view */
 
-.trace-view {
+.trace-show {
   .trace_pending {
     color: red;
   }
@@ -1585,7 +1594,7 @@ tr.turn:hover {
   margin-left: 70px;
 }
 
-.user-view {
+.users-show {
   // Silly exception; remove when user page is redesigned.
   .content-inner {
     max-width: none;
@@ -1712,7 +1721,7 @@ tr.turn:hover {
   }
 }
 
-.diary_entry-view img.user_thumbnail {
+.diary_entry-show img.user_thumbnail {
   float: left;
 }
 
@@ -1736,7 +1745,7 @@ tr.turn:hover {
 
 /* Rules for the account confirmation page */
 
-.user-terms {
+.users-terms {
   .legale {
     border: 1px solid #ccc;
     padding: $lineheight;
index 984364736b35290d8cb38a272f1016711d6bdf22..12e21c7d8b8e9f52b007d4b0655820604d94f426 100644 (file)
@@ -126,9 +126,12 @@ body.small {
     }
   }
 
-  #sidebar .welcome,
-  #sidebar #banner {
-    display: none !important;
+  .overlay-sidebar #sidebar .welcome.visible {
+    display: none;
+  }
+
+  .overlay-sidebar #sidebar #banner {
+    display: none;
   }
 
   .leaflet-top.leaflet-right {
index 07e7669b173c4037453bac9bb07fabd718be0b5e..4f6adae5da6b08dd38b763f5aff392e53d359ce2 100644 (file)
@@ -143,6 +143,7 @@ class AmfController < ApplicationController
 
       if cstags
         return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(cstags)
+
         cstags = strip_non_xml_chars cstags
       end
 
@@ -471,7 +472,7 @@ class AmfController < ApplicationController
       return -1, t("application.setup_user_auth.blocked") if user.blocks.active.exists?
 
       query = Trace.visible_to(user)
-      query = if searchterm.to_i > 0
+      query = if searchterm.to_i.positive?
                 query.where(:id => searchterm.to_i)
               else
                 query.where("MATCH(name) AGAINST (?)", searchterm).limit(21)
@@ -497,6 +498,7 @@ class AmfController < ApplicationController
       rel = Relation.where(:id => relid).first
 
       return [-4, "relation", relid] if rel.nil? || !rel.visible
+
       [0, "", relid, rel.tags, rel.members, rel.version]
     end
   end
@@ -506,9 +508,9 @@ class AmfController < ApplicationController
 
   def findrelations(searchterm)
     rels = []
-    if searchterm.to_i > 0
+    if searchterm.to_i.positive?
       rel = Relation.where(:id => searchterm.to_i).first
-      rels.push([rel.id, rel.tags, rel.members, rel.version]) if rel && rel.visible
+      rels.push([rel.id, rel.tags, rel.members, rel.version]) if rel&.visible
     else
       RelationTag.where("v like ?", "%#{searchterm}%").limit(11).each do |t|
         rels.push([t.relation.id, t.relation.tags, t.relation.members, t.relation.version]) if t.relation.visible
@@ -533,6 +535,7 @@ class AmfController < ApplicationController
       return -1, "You must accept the contributor terms before you can edit." if REQUIRE_TERMS_AGREED && user.terms_agreed.nil?
 
       return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(tags)
+
       tags = strip_non_xml_chars tags
 
       relid = relid.to_i
@@ -542,7 +545,7 @@ class AmfController < ApplicationController
       relation = nil
       Relation.transaction do
         # create a new relation, or find the existing one
-        relation = Relation.find(relid) if relid > 0
+        relation = Relation.find(relid) if relid.positive?
         # We always need a new node, based on the data that has been sent to us
         new_relation = Relation.new
 
@@ -550,7 +553,7 @@ class AmfController < ApplicationController
         typedmembers = []
         members.each do |m|
           mid = m[1].to_i
-          if mid < 0
+          if mid.negative?
             mid = renumberednodes[mid] if m[0] == "Node"
             mid = renumberedways[mid] if m[0] == "Way"
           end
@@ -622,6 +625,7 @@ class AmfController < ApplicationController
       return -2, "Server error - way is only #{pointlist.length} points long." if pointlist.length < 2
 
       return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(attributes)
+
       attributes = strip_non_xml_chars attributes
 
       originalway = originalway.to_i
@@ -651,6 +655,7 @@ class AmfController < ApplicationController
 
           # fixup node tags in a way as well
           return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(node.tags)
+
           node.tags = strip_non_xml_chars node.tags
 
           node.tags.delete("created_by")
@@ -728,6 +733,7 @@ class AmfController < ApplicationController
       return -1, "You must accept the contributor terms before you can edit." if REQUIRE_TERMS_AGREED && user.terms_agreed.nil?
 
       return -1, "One of the tags is invalid. Linux users may need to upgrade to Flash Player 10.1." unless tags_ok(tags)
+
       tags = strip_non_xml_chars tags
 
       id = id.to_i
@@ -735,7 +741,7 @@ class AmfController < ApplicationController
       node = nil
       new_node = nil
       Node.transaction do
-        if id > 0
+        if id.positive?
           begin
             node = Node.find(id)
           rescue ActiveRecord::RecordNotFound
@@ -883,12 +889,10 @@ class AmfController < ApplicationController
   # in the +tags+ hash.
   def strip_non_xml_chars(tags)
     new_tags = {}
-    unless tags.nil?
-      tags.each do |k, v|
-        new_k = k.delete "\000-\037\ufffe\uffff", "^\011\012\015"
-        new_v = v.delete "\000-\037\ufffe\uffff", "^\011\012\015"
-        new_tags[new_k] = new_v
-      end
+    tags&.each do |k, v|
+      new_k = k.delete "\000-\037\ufffe\uffff", "^\011\012\015"
+      new_v = v.delete "\000-\037\ufffe\uffff", "^\011\012\015"
+      new_tags[new_k] = new_v
     end
     new_tags
   end
index 021ada0cdcaae4a77ad5745e5baeba5627ab16fb..81b8bca5323f3cbe33bb1a2c990679b8a9ca5cce 100644 (file)
@@ -67,7 +67,7 @@ class ApiController < ApplicationController
           if gpx_file.identifiable?
             track << (XML::Node.new("name") << gpx_file.name)
             track << (XML::Node.new("desc") << gpx_file.description)
-            track << (XML::Node.new("url") << url_for(:controller => "traces", :action => "view", :display_name => gpx_file.user.display_name, :id => gpx_file.id))
+            track << (XML::Node.new("url") << url_for(:controller => "traces", :action => "show", :display_name => gpx_file.user.display_name, :id => gpx_file.id))
           end
         else
           # use the anonymous track segment if the user hasn't allowed
index db4ae9ad392f20f91a60d6c251f8244633cc7d34..bd1995014882452fab08990432203104f5701381 100644 (file)
@@ -17,16 +17,16 @@ class ApplicationController < ActionController::Base
         session.delete(:user)
         session_expires_automatically
 
-        redirect_to :controller => "user", :action => "suspended"
+        redirect_to :controller => "users", :action => "suspended"
 
       # don't allow access to any auth-requiring part of the site unless
       # the new CTs have been seen (and accept/decline chosen).
       elsif !current_user.terms_seen && flash[:skip_terms].nil?
         flash[:notice] = t "user.terms.you need to accept or decline"
         if params[:referer]
-          redirect_to :controller => "user", :action => "terms", :referer => params[:referer]
+          redirect_to :controller => "users", :action => "terms", :referer => params[:referer]
         else
-          redirect_to :controller => "user", :action => "terms", :referer => request.fullpath
+          redirect_to :controller => "users", :action => "terms", :referer => request.fullpath
         end
       end
     elsif session[:token]
@@ -41,7 +41,7 @@ class ApplicationController < ActionController::Base
   def require_user
     unless current_user
       if request.get?
-        redirect_to :controller => "user", :action => "login", :referer => request.fullpath
+        redirect_to :controller => "users", :action => "login", :referer => request.fullpath
       else
         head :forbidden
       end
@@ -283,8 +283,7 @@ class ApplicationController < ActionController::Base
     # TODO: some sort of escaping of problem characters in the message
     response.headers["Error"] = message
 
-    if request.headers["X-Error-Format"] &&
-       request.headers["X-Error-Format"].casecmp("xml").zero?
+    if 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]}")
@@ -310,7 +309,7 @@ class ApplicationController < ActionController::Base
   helper_method :preferred_languages
 
   def set_locale(reset = false)
-    if current_user && current_user.languages.empty? && !http_accept_language.user_preferred_languages.empty?
+    if current_user&.languages&.empty? && !http_accept_language.user_preferred_languages.empty?
       current_user.languages = http_accept_language.user_preferred_languages
       current_user.save
     end
@@ -387,11 +386,11 @@ class ApplicationController < ActionController::Base
   ##
   # render a "no such user" page
   def render_unknown_user(name)
-    @title = t "user.no_such_user.title"
+    @title = t "users.no_such_user.title"
     @not_found_user = name
 
     respond_to do |format|
-      format.html { render :template => "user/no_such_user", :status => :not_found }
+      format.html { render :template => "users/no_such_user", :status => :not_found }
       format.all { head :not_found }
     end
   end
@@ -435,7 +434,7 @@ class ApplicationController < ActionController::Base
   def preferred_editor
     editor = if params[:editor]
                params[:editor]
-             elsif current_user && current_user.preferred_editor
+             elsif current_user&.preferred_editor
                current_user.preferred_editor
              else
                DEFAULT_EDITOR
index b4cb4594fb43e7dcffa9694e7b8919961e4cdfdf..89b9c6ca3078aa4f8552918ae5714993dc8cbe23 100644 (file)
@@ -58,7 +58,7 @@ class BrowseController < ApplicationController
   def changeset
     @type = "changeset"
     @changeset = Changeset.find(params[:id])
-    @comments = if current_user && current_user.moderator?
+    @comments = if current_user&.moderator?
                   @changeset.comments.unscope(:where => :visible).includes(:author)
                 else
                   @changeset.comments.includes(:author)
@@ -77,7 +77,7 @@ class BrowseController < ApplicationController
   def note
     @type = "note"
 
-    if current_user && current_user.moderator?
+    if current_user&.moderator?
       @note = Note.find(params[:id])
       @note_comments = @note.comments.unscope(:where => :visible)
     else
index 56fab0fc49cb60df161badc50c4384c8e1ce0d2b..c03ed9056a0759277b1fda313132655299cb83f9 100644 (file)
@@ -4,19 +4,19 @@ class ChangesetController < ApplicationController
   layout "site"
   require "xml/libxml"
 
-  skip_before_action :verify_authenticity_token, :except => [:list]
-  before_action :authorize_web, :only => [:list, :feed, :comments_feed]
-  before_action :set_locale, :only => [:list, :feed, :comments_feed]
+  skip_before_action :verify_authenticity_token, :except => [:index]
+  before_action :authorize_web, :only => [:index, :feed, :comments_feed]
+  before_action :set_locale, :only => [:index, :feed, :comments_feed]
   before_action :authorize, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
   before_action :require_moderator, :only => [:hide_comment, :unhide_comment]
   before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
   before_action :require_public_data, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe]
   before_action :check_api_writable, :only => [:create, :update, :upload, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
-  before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :list, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
-  before_action(:only => [:list, :feed, :comments_feed]) { |c| c.check_database_readable(true) }
-  around_action :api_call_handle_error, :except => [:list, :feed, :comments_feed]
-  around_action :api_call_timeout, :except => [:list, :feed, :comments_feed, :upload]
-  around_action :web_timeout, :only => [:list, :feed, :comments_feed]
+  before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
+  before_action(:only => [:index, :feed, :comments_feed]) { |c| c.check_database_readable(true) }
+  around_action :api_call_handle_error, :except => [:index, :feed, :comments_feed]
+  around_action :api_call_timeout, :except => [:index, :feed, :comments_feed, :upload]
+  around_action :web_timeout, :only => [:index, :feed, :comments_feed]
 
   # Helper methods for checking consistency
   include ConsistencyValidations
@@ -255,7 +255,7 @@ class ChangesetController < ApplicationController
 
   ##
   # list non-empty changesets in reverse chronological order
-  def list
+  def index
     @params = params.permit(:display_name, :bbox, :friends, :nearby, :max_id, :list)
 
     if request.format == :atom && @params[:max_id]
@@ -300,14 +300,14 @@ class ChangesetController < ApplicationController
 
       @edits = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags, :comments)
 
-      render :action => :list, :layout => false
+      render :action => :index, :layout => false
     end
   end
 
   ##
   # list edits as an atom feed
   def feed
-    list
+    index
   end
 
   ##
@@ -481,6 +481,7 @@ class ChangesetController < ApplicationController
       u = if name.nil?
             # user input checking, we don't have any UIDs < 1
             raise OSM::APIBadUserInput, "invalid user ID" if user.to_i < 1
+
             u = User.find(user.to_i)
           else
             u = User.find_by(:display_name => name)
@@ -581,7 +582,7 @@ class ChangesetController < ApplicationController
   # Get the maximum number of comments to return
   def comments_limit
     if params[:limit]
-      if params[:limit].to_i > 0 && params[:limit].to_i <= 10000
+      if params[:limit].to_i.positive? && params[:limit].to_i <= 10000
         params[:limit].to_i
       else
         raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000"
index f2c11fc741453c2ee3b643ea266eae5682281583..723fff17ec0e885c129087e003c343bfcf748bcd 100644 (file)
@@ -4,11 +4,11 @@ class DiaryEntryController < ApplicationController
   before_action :authorize_web
   before_action :set_locale
   before_action :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
-  before_action :lookup_user, :only => [:view, :comments]
+  before_action :lookup_user, :only => [:show, :comments]
   before_action :check_database_readable
   before_action :check_database_writable, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
   before_action :require_administrator, :only => [:hide, :hidecomment]
-  before_action :allow_thirdparty_images, :only => [:new, :edit, :list, :view, :comments]
+  before_action :allow_thirdparty_images, :only => [:new, :edit, :index, :show, :comments]
 
   def new
     @title = t "diary_entry.new.title"
@@ -29,7 +29,7 @@ class DiaryEntryController < ApplicationController
         # Subscribe user to diary comments
         @diary_entry.subscriptions.create(:user => current_user)
 
-        redirect_to :action => "list", :display_name => current_user.display_name
+        redirect_to :action => "index", :display_name => current_user.display_name
       else
         render :action => "edit"
       end
@@ -47,9 +47,9 @@ class DiaryEntryController < ApplicationController
     @diary_entry = DiaryEntry.find(params[:id])
 
     if current_user != @diary_entry.user
-      redirect_to :action => "view", :id => params[:id]
+      redirect_to diary_entry_path(@diary_entry.user, @diary_entry)
     elsif params[:diary_entry] && @diary_entry.update(entry_params)
-      redirect_to :action => "view", :id => params[:id]
+      redirect_to diary_entry_path(@diary_entry.user, @diary_entry)
     end
 
     set_map_location
@@ -71,9 +71,9 @@ class DiaryEntryController < ApplicationController
       # Add the commenter to the subscribers if necessary
       @entry.subscriptions.create(:user => current_user) unless @entry.subscribers.exists?(current_user.id)
 
-      redirect_to :action => "view", :display_name => @entry.user.display_name, :id => @entry.id
+      redirect_to diary_entry_path(@entry.user, @entry)
     else
-      render :action => "view"
+      render :action => "show"
     end
   rescue ActiveRecord::RecordNotFound
     render :action => "no_such_entry", :status => :not_found
@@ -84,7 +84,7 @@ class DiaryEntryController < ApplicationController
 
     diary_entry.subscriptions.create(:user => current_user) unless diary_entry.subscribers.exists?(current_user.id)
 
-    redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id
+    redirect_to diary_entry_path(diary_entry.user, diary_entry)
   rescue ActiveRecord::RecordNotFound
     render :action => "no_such_entry", :status => :not_found
   end
@@ -94,17 +94,17 @@ class DiaryEntryController < ApplicationController
 
     diary_entry.subscriptions.where(:user => current_user).delete_all if diary_entry.subscribers.exists?(current_user.id)
 
-    redirect_to :action => "view", :display_name => diary_entry.user.display_name, :id => diary_entry.id
+    redirect_to diary_entry_path(diary_entry.user, diary_entry)
   rescue ActiveRecord::RecordNotFound
     render :action => "no_such_entry", :status => :not_found
   end
 
-  def list
+  def index
     if params[:display_name]
       @user = User.active.find_by(:display_name => params[:display_name])
 
       if @user
-        @title = t "diary_entry.list.user_title", :user => @user.display_name
+        @title = t "diary_entry.index.user_title", :user => @user.display_name
         @entries = @user.diary_entries
       else
         render_unknown_user params[:display_name]
@@ -112,7 +112,7 @@ class DiaryEntryController < ApplicationController
       end
     elsif params[:friends]
       if current_user
-        @title = t "diary_entry.list.title_friends"
+        @title = t "diary_entry.index.title_friends"
         @entries = DiaryEntry.where(:user_id => current_user.friend_users)
       else
         require_user
@@ -120,7 +120,7 @@ class DiaryEntryController < ApplicationController
       end
     elsif params[:nearby]
       if current_user
-        @title = t "diary_entry.list.title_nearby"
+        @title = t "diary_entry.index.title_nearby"
         @entries = DiaryEntry.where(:user_id => current_user.nearby)
       else
         require_user
@@ -130,10 +130,10 @@ class DiaryEntryController < ApplicationController
       @entries = DiaryEntry.joins(:user).where(:users => { :status => %w[active confirmed] })
 
       if params[:language]
-        @title = t "diary_entry.list.in_language_title", :language => Language.find(params[:language]).english_name
+        @title = t "diary_entry.index.in_language_title", :language => Language.find(params[:language]).english_name
         @entries = @entries.where(:language_code => params[:language])
       else
-        @title = t "diary_entry.list.title"
+        @title = t "diary_entry.index.title"
       end
     end
 
@@ -157,7 +157,7 @@ class DiaryEntryController < ApplicationController
         @entries = user.diary_entries
         @title = t("diary_entry.feed.user.title", :user => user.display_name)
         @description = t("diary_entry.feed.user.description", :user => user.display_name)
-        @link = url_for :controller => "diary_entry", :action => "list", :display_name => user.display_name, :host => SERVER_URL, :protocol => SERVER_PROTOCOL
+        @link = url_for :controller => "diary_entry", :action => "index", :display_name => user.display_name, :host => SERVER_URL, :protocol => SERVER_PROTOCOL
       else
         head :not_found
         return
@@ -169,21 +169,21 @@ class DiaryEntryController < ApplicationController
         @entries = @entries.where(:language_code => params[:language])
         @title = t("diary_entry.feed.language.title", :language_name => Language.find(params[:language]).english_name)
         @description = t("diary_entry.feed.language.description", :language_name => Language.find(params[:language]).english_name)
-        @link = url_for :controller => "diary_entry", :action => "list", :language => params[:language], :host => SERVER_URL, :protocol => SERVER_PROTOCOL
+        @link = url_for :controller => "diary_entry", :action => "index", :language => params[:language], :host => SERVER_URL, :protocol => SERVER_PROTOCOL
       else
         @title = t("diary_entry.feed.all.title")
         @description = t("diary_entry.feed.all.description")
-        @link = url_for :controller => "diary_entry", :action => "list", :host => SERVER_URL, :protocol => SERVER_PROTOCOL
+        @link = url_for :controller => "diary_entry", :action => "index", :host => SERVER_URL, :protocol => SERVER_PROTOCOL
       end
     end
 
     @entries = @entries.visible.includes(:user).order("created_at DESC").limit(20)
   end
 
-  def view
+  def show
     @entry = @user.diary_entries.visible.where(:id => params[:id]).first
     if @entry
-      @title = t "diary_entry.view.title", :user => params[:display_name], :title => @entry.title
+      @title = t "diary_entry.show.title", :user => params[:display_name], :title => @entry.title
     else
       @title = t "diary_entry.no_such_entry.title", :id => params[:id]
       render :action => "no_such_entry", :status => :not_found
@@ -193,13 +193,13 @@ class DiaryEntryController < ApplicationController
   def hide
     entry = DiaryEntry.find(params[:id])
     entry.update(:visible => false)
-    redirect_to :action => "list", :display_name => entry.user.display_name
+    redirect_to :action => "index", :display_name => entry.user.display_name
   end
 
   def hidecomment
     comment = DiaryComment.find(params[:comment])
     comment.update(:visible => false)
-    redirect_to :action => "view", :display_name => comment.diary_entry.user.display_name, :id => comment.diary_entry.id
+    redirect_to diary_entry_path(comment.diary_entry.user, comment.diary_entry)
   end
 
   def comments
@@ -235,7 +235,7 @@ class DiaryEntryController < ApplicationController
   def require_administrator
     unless current_user.administrator?
       flash[:error] = t("user.filter.not_an_administrator")
-      redirect_to :action => "view"
+      redirect_to :action => "show"
     end
   end
 
index 384f2c24c36a86272c47c6f713426edb971316a4..da5245687f73db3fb97871fac05a47876420f017 100644 (file)
@@ -39,18 +39,44 @@ class GeocoderController < ApplicationController
   def search_latlon
     lat = params[:lat].to_f
     lon = params[:lon].to_f
-    if lat < -90 || lat > 90
-      @error = "Latitude #{lat} out of range"
-      render :action => "error"
-    elsif lon < -180 || lon > 180
-      @error = "Longitude #{lon} out of range"
-      render :action => "error"
+
+    if params[:latlon_digits]
+      # We've got two nondescript numbers for a query, which can mean both "lat, lon" or "lon, lat".
+      @results = []
+
+      if lat >= -90 && lat <= 90 && lon >= -180 && lon <= 180
+        @results.push(:lat => lat, :lon => lon,
+                      :zoom => params[:zoom],
+                      :name => "#{lat}, #{lon}")
+      end
+
+      if lon >= -90 && lon <= 90 && lat >= -180 && lat <= 180
+        @results.push(:lat => lon, :lon => lat,
+                      :zoom => params[:zoom],
+                      :name => "#{lon}, #{lat}")
+      end
+
+      if @results.empty?
+        @error = "Latitude or longitude are out of range"
+        render :action => "error"
+      else
+        render :action => "results"
+      end
     else
-      @results = [{ :lat => lat, :lon => lon,
-                    :zoom => params[:zoom],
-                    :name => "#{lat}, #{lon}" }]
+      # Coordinates in a query have come with markers for latitude and longitude.
+      if lat < -90 || lat > 90
+        @error = "Latitude #{lat} out of range"
+        render :action => "error"
+      elsif lon < -180 || lon > 180
+        @error = "Longitude #{lon} out of range"
+        render :action => "error"
+      else
+        @results = [{ :lat => lat, :lon => lon,
+                      :zoom => params[:zoom],
+                      :name => "#{lat}, #{lon}" }]
 
-      render :action => "results"
+        render :action => "results"
+      end
     end
   end
 
@@ -280,10 +306,12 @@ class GeocoderController < ApplicationController
 
       elsif latlon = query.match(/^\s*([+-]?\d+(\.\d*)?)\s*[\s,]\s*([+-]?\d+(\.\d*)?)\s*$/)
         params.merge!(:lat => latlon[1].to_f, :lon => latlon[3].to_f).delete(:query)
+
+        params[:latlon_digits] = true unless params[:whereami]
       end
     end
 
-    params.permit(:query, :lat, :lon, :zoom, :minlat, :minlon, :maxlat, :maxlon)
+    params.permit(:query, :lat, :lon, :latlon_digits, :zoom, :minlat, :minlon, :maxlat, :maxlon)
   end
 
   def nsew_to_decdeg(captures)
index d4e9a3bdfa4bec2c7e745b200c67e52a307ff086..ad38454f0650ba62ebd2dae40c1ab383c462c12a 100644 (file)
@@ -18,7 +18,7 @@ class IssuesController < ApplicationController
     @issues = Issue.visible_to(current_user)
 
     # If search
-    if params[:search_by_user] && params[:search_by_user].present?
+    if params[:search_by_user]&.present?
       @find_user = User.find_by(:display_name => params[:search_by_user])
       if @find_user
         @issues = @issues.where(:reported_user_id => @find_user.id)
@@ -28,11 +28,11 @@ class IssuesController < ApplicationController
       end
     end
 
-    @issues = @issues.where(:status => params[:status]) if params[:status] && params[:status].present?
+    @issues = @issues.where(:status => params[:status]) if params[:status]&.present?
 
-    @issues = @issues.where(:reportable_type => params[:issue_type]) if params[:issue_type] && params[:issue_type].present?
+    @issues = @issues.where(:reportable_type => params[:issue_type]) if params[:issue_type]&.present?
 
-    if params[:last_updated_by] && params[:last_updated_by].present?
+    if params[:last_updated_by]&.present?
       last_updated_by = params[:last_updated_by].to_s == "nil" ? nil : params[:last_updated_by].to_i
       @issues = @issues.where(:updated_by => last_updated_by)
     end
index d1460569243045db32ab88b05d7169771aa0ae15..13a395da8fccfc20feb59174c36ec1178a36513a 100644 (file)
@@ -4,37 +4,38 @@ class MessagesController < ApplicationController
   before_action :authorize_web
   before_action :set_locale
   before_action :require_user
-  before_action :lookup_user, :only => [:new]
+  before_action :lookup_user, :only => [:new, :create]
   before_action :check_database_readable
-  before_action :check_database_writable, :only => [:new, :reply, :mark, :destroy]
-  before_action :allow_thirdparty_images, :only => [:new, :show]
+  before_action :check_database_writable, :only => [:new, :create, :reply, :mark, :destroy]
+  before_action :allow_thirdparty_images, :only => [:new, :create, :show]
 
   # Allow the user to write a new message to another user. This action also
   # deals with the sending of that message to the other user when the user
   # clicks send.
   # The display_name param is the display name of the user that the message is being sent to.
   def new
-    if request.post?
-      if current_user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= MAX_MESSAGES_PER_HOUR
-        flash[:error] = t ".limit_exceeded"
-      else
-        @message = Message.new(message_params)
-        @message.recipient = @user
-        @message.sender = current_user
-        @message.sent_on = Time.now.getutc
-
-        if @message.save
-          flash[:notice] = t ".message_sent"
-          Notifier.message_notification(@message).deliver_now
-          redirect_to :action => :inbox
-        end
-      end
-    end
-
-    @message ||= Message.new(message_params.merge(:recipient => @user))
+    @message = Message.new(message_params.merge(:recipient => @user))
     @title = t ".title"
   end
 
+  def create
+    @message = Message.new(message_params)
+    @message.recipient = @user
+    @message.sender = current_user
+    @message.sent_on = Time.now.getutc
+
+    if current_user.sent_messages.where("sent_on >= ?", Time.now.getutc - 1.hour).count >= MAX_MESSAGES_PER_HOUR
+      flash[:error] = t ".limit_exceeded"
+      render :action => "new"
+    elsif @message.save
+      flash[:notice] = t ".message_sent"
+      Notifier.message_notification(@message).deliver_now
+      redirect_to :action => :inbox
+    else
+      render :action => "new"
+    end
+  end
+
   # Allow the user to reply to another message.
   def reply
     message = Message.find(params[:message_id])
@@ -53,7 +54,7 @@ class MessagesController < ApplicationController
       render :action => "new"
     else
       flash[:notice] = t ".wrong_user", :user => current_user.display_name
-      redirect_to :controller => "user", :action => "login", :referer => request.fullpath
+      redirect_to :controller => "users", :action => "login", :referer => request.fullpath
     end
   rescue ActiveRecord::RecordNotFound
     @title = t "messages.no_such_message.title"
@@ -70,7 +71,7 @@ class MessagesController < ApplicationController
       @message.save
     else
       flash[:notice] = t ".wrong_user", :user => current_user.display_name
-      redirect_to :controller => "user", :action => "login", :referer => request.fullpath
+      redirect_to :controller => "users", :action => "login", :referer => request.fullpath
     end
   rescue ActiveRecord::RecordNotFound
     @title = t "messages.no_such_message.title"
@@ -109,7 +110,7 @@ class MessagesController < ApplicationController
 
   # Destroy the message.
   def destroy
-    @message = Message.where("to_user_id = ? OR from_user_id = ?", current_user.id, current_user.id).find(params[:message_id])
+    @message = Message.where("to_user_id = ? OR from_user_id = ?", current_user.id, current_user.id).find(params[:id])
     @message.from_user_visible = false if @message.sender == current_user
     @message.to_user_visible = false if @message.recipient == current_user
     if @message.save && !request.xhr?
index 20baf6bb4d0285575e8faa14d92ce08fc23e4bd8..84b814a34529fae1cd3c5be327b418e5c47a04b3 100644 (file)
@@ -54,6 +54,7 @@ class NodeController < ApplicationController
     new_node = Node.from_xml(request.raw_post)
 
     raise OSM::APIBadUserInput, "The id in the url (#{node.id}) is not the same as provided in the xml (#{new_node.id})" unless new_node && new_node.id == node.id
+
     node.delete_with_history!(new_node, current_user)
     render :plain => node.version.to_s
   end
@@ -65,6 +66,7 @@ class NodeController < ApplicationController
     ids = params["nodes"].split(",").collect(&:to_i)
 
     raise OSM::APIBadUserInput, "No nodes were given to search for" if ids.empty?
+
     doc = OSM::API.new.get_xml_doc
 
     Node.find(ids).each do |node|
index 690467f0dade10aedc25ede3c8da0d5f69164e01..ba2df36807debb434acb7b77dbef8f148682c888 100644 (file)
@@ -211,7 +211,7 @@ class NotesController < ApplicationController
     # Find the note and check it is valid
     @note = Note.find(params[:id])
     raise OSM::APINotFoundError unless @note
-    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || (current_user && current_user.moderator?)
+    raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || current_user&.moderator?
 
     # Render the result
     respond_to do |format|
@@ -319,13 +319,13 @@ class NotesController < ApplicationController
         @page = (params[:page] || 1).to_i
         @page_size = 10
         @notes = @user.notes
-        @notes = @notes.visible unless current_user && current_user.moderator?
+        @notes = @notes.visible unless current_user&.moderator?
         @notes = @notes.order("updated_at DESC, id").distinct.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author).to_a
       else
-        @title = t "user.no_such_user.title"
+        @title = t "users.no_such_user.title"
         @not_found_user = params[:display_name]
 
-        render :template => "user/no_such_user", :status => :not_found
+        render :template => "users/no_such_user", :status => :not_found
       end
     end
   end
@@ -340,7 +340,7 @@ class NotesController < ApplicationController
   # Get the maximum number of results to return
   def result_limit
     if params[:limit]
-      if params[:limit].to_i > 0 && params[:limit].to_i <= 10000
+      if params[:limit].to_i.positive? && params[:limit].to_i <= 10000
         params[:limit].to_i
       else
         raise OSM::APIBadUserInput, "Note limit must be between 1 and 10000"
@@ -360,12 +360,14 @@ class NotesController < ApplicationController
                      7
                    end
 
-    if closed_since < 0
-      notes.where("status != 'hidden'")
-    elsif closed_since > 0
-      notes.where("(status = 'open' OR (status = 'closed' AND closed_at > '#{Time.now - closed_since.days}'))")
+    if closed_since.negative?
+      notes.where.not(:status => "hidden")
+    elsif closed_since.positive?
+      notes.where(:status => "open")
+           .or(notes.where(:status => "closed")
+                    .where(notes.arel_table[:closed_at].gt(Time.now - closed_since.days)))
     else
-      notes.where("status = 'open'")
+      notes.where(:status => "open")
     end
   end
 
index 9adf141d959f4a319ec39c64a97826a573faf49b..4f01b1e2a1da41b5bd4d44fb1d5ba8c623ef1f4d 100644 (file)
@@ -70,6 +70,6 @@ class OldController < ApplicationController
   private
 
   def show_redactions?
-    current_user && current_user.moderator? && params[:show_redactions] == "true"
+    current_user&.moderator? && params[:show_redactions] == "true"
   end
 end
index 8994d8a2e58df90e17535edf5ae63a6cf08b258e..b78ae295916dce42ef7ca294dec170977e14cdad 100644 (file)
@@ -12,13 +12,13 @@ class TracesController < ApplicationController
   before_action :check_api_writable, :only => [:api_create, :api_update, :api_delete]
   before_action :require_allow_read_gpx, :only => [:api_read, :api_data]
   before_action :require_allow_write_gpx, :only => [:api_create, :api_update, :api_delete]
-  before_action :offline_warning, :only => [:mine, :view]
+  before_action :offline_warning, :only => [:mine, :show]
   before_action :offline_redirect, :only => [:new, :create, :edit, :delete, :data, :api_create, :api_delete, :api_data]
   around_action :api_call_handle_error, :only => [:api_create, :api_read, :api_update, :api_delete, :api_data]
 
   # Counts and selects pages of GPX traces for various criteria (by user, tags, public etc.).
   #  target_user - if set, specifies the user to fetch traces for.  if not set will fetch all traces
-  def list
+  def index
     # from display name, pick up user id if one user's traces only
     display_name = params[:display_name]
     if display_name.present?
@@ -86,22 +86,22 @@ class TracesController < ApplicationController
   end
 
   def mine
-    redirect_to :action => :list, :display_name => current_user.display_name
+    redirect_to :action => :index, :display_name => current_user.display_name
   end
 
-  def view
+  def show
     @trace = Trace.find(params[:id])
 
-    if @trace && @trace.visible? &&
-       (@trace.public? || @trace.user == current_user)
+    if @trace&.visible? &&
+       (@trace&.public? || @trace&.user == current_user)
       @title = t ".title", :name => @trace.name
     else
       flash[:error] = t ".trace_not_found"
-      redirect_to :action => "list"
+      redirect_to :action => "index"
     end
   rescue ActiveRecord::RecordNotFound
     flash[:error] = t ".trace_not_found"
-    redirect_to :action => "list"
+    redirect_to :action => "index"
   end
 
   def new
@@ -110,12 +110,14 @@ class TracesController < ApplicationController
   end
 
   def create
+    @title = t ".upload_trace"
+
     logger.info(params[:trace][:gpx_file].class.name)
 
     if params[:trace][:gpx_file].respond_to?(:read)
       begin
-        do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
-                  params[:trace][:description], params[:trace][:visibility])
+        @trace = do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
+                           params[:trace][:description], params[:trace][:visibility])
       rescue StandardError => ex
         logger.debug ex
       end
@@ -124,7 +126,11 @@ class TracesController < ApplicationController
         flash[:notice] = t ".trace_uploaded"
         flash[:warning] = t ".traces_waiting", :count => current_user.traces.where(:inserted => false).count if current_user.traces.where(:inserted => false).count > 4
 
-        redirect_to :action => :list, :display_name => current_user.display_name
+        redirect_to :action => :index, :display_name => current_user.display_name
+      else
+        flash[:error] = t("traces.create.upload_failed") if @trace.valid?
+
+        render :action => "new"
       end
     else
       @trace = Trace.new(:name => "Dummy",
@@ -135,7 +141,7 @@ class TracesController < ApplicationController
                          :timestamp => Time.now.getutc)
       @trace.valid?
       @trace.errors.add(:gpx_file, "can't be blank")
-      @title = t ".upload_trace"
+
       render :action => "new"
     end
   end
@@ -169,13 +175,24 @@ class TracesController < ApplicationController
       head :forbidden
     else
       @title = t ".title", :name => @trace.name
+    end
+  rescue ActiveRecord::RecordNotFound
+    head :not_found
+  end
 
-      if request.post? && params[:trace]
-        @trace.description = params[:trace][:description]
-        @trace.tagstring = params[:trace][:tagstring]
-        @trace.visibility = params[:trace][:visibility]
-        redirect_to :action => "view", :display_name => current_user.display_name if @trace.save
-      end
+  def update
+    @trace = Trace.find(params[:id])
+
+    if !@trace.visible?
+      head :not_found
+    elsif current_user.nil? || @trace.user != current_user
+      head :forbidden
+    elsif @trace.update(trace_params)
+      flash[:notice] = t ".updated"
+      redirect_to :action => "show", :display_name => current_user.display_name
+    else
+      @title = t ".title", :name => @trace.name
+      render :action => "edit"
     end
   rescue ActiveRecord::RecordNotFound
     head :not_found
@@ -192,7 +209,7 @@ class TracesController < ApplicationController
       trace.visible = false
       trace.save
       flash[:notice] = t ".scheduled_for_deletion"
-      redirect_to :action => :list, :display_name => trace.user.display_name
+      redirect_to :action => :index, :display_name => trace.user.display_name
     end
   rescue ActiveRecord::RecordNotFound
     head :not_found
@@ -301,7 +318,7 @@ class TracesController < ApplicationController
     visibility = params[:visibility]
 
     if visibility.nil?
-      visibility = if params[:public] && params[:public].to_i.nonzero?
+      visibility = if params[:public]&.to_i&.nonzero?
                      "public"
                    else
                      "private"
@@ -309,11 +326,11 @@ class TracesController < ApplicationController
     end
 
     if params[:file].respond_to?(:read)
-      do_create(params[:file], tags, description, visibility)
+      trace = do_create(params[:file], tags, description, visibility)
 
-      if @trace.id
-        render :plain => @trace.id.to_s
-      elsif @trace.valid?
+      if trace.id
+        render :plain => trace.id.to_s
+      elsif trace.valid?
         head :internal_server_error
       else
         head :bad_request
@@ -337,7 +354,7 @@ class TracesController < ApplicationController
 
     # Create the trace object, falsely marked as already
     # inserted to stop the import daemon trying to load it
-    @trace = Trace.new(
+    trace = Trace.new(
       :name => name,
       :tagstring => tags,
       :description => description,
@@ -347,31 +364,33 @@ class TracesController < ApplicationController
       :timestamp => Time.now.getutc
     )
 
-    Trace.transaction do
-      begin
-        # Save the trace object
-        @trace.save!
-
-        # Rename the temporary file to the final name
-        FileUtils.mv(filename, @trace.trace_name)
-      rescue StandardError
-        # Remove the file as we have failed to update the database
-        FileUtils.rm_f(filename)
-
-        # Pass the exception on
-        raise
-      end
-
-      begin
-        # Clear the inserted flag to make the import daemon load the trace
-        @trace.inserted = false
-        @trace.save!
-      rescue StandardError
-        # Remove the file as we have failed to update the database
-        FileUtils.rm_f(@trace.trace_name)
-
-        # Pass the exception on
-        raise
+    if trace.valid?
+      Trace.transaction do
+        begin
+          # Save the trace object
+          trace.save!
+
+          # Rename the temporary file to the final name
+          FileUtils.mv(filename, trace.trace_name)
+        rescue StandardError
+          # Remove the file as we have failed to update the database
+          FileUtils.rm_f(filename)
+
+          # Pass the exception on
+          raise
+        end
+
+        begin
+          # Clear the inserted flag to make the import daemon load the trace
+          trace.inserted = false
+          trace.save!
+        rescue StandardError
+          # Remove the file as we have failed to update the database
+          FileUtils.rm_f(trace.trace_name)
+
+          # Pass the exception on
+          raise
+        end
       end
     end
 
@@ -382,6 +401,8 @@ class TracesController < ApplicationController
     else
       current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
     end
+
+    trace
   end
 
   def offline_warning
@@ -403,4 +424,8 @@ class TracesController < ApplicationController
       "public"
     end
   end
+
+  def trace_params
+    params.require(:trace).permit(:description, :tagstring, :visibility)
+  end
 end
similarity index 87%
rename from app/controllers/user_controller.rb
rename to app/controllers/users_controller.rb
index 7e22c63b4a56d75e33bacc376699d2aec248b721..d18cf188cf669ef002fbc975f6f08d091f697d6f 100644 (file)
@@ -1,4 +1,4 @@
-class UserController < ApplicationController
+class UsersController < ApplicationController
   layout "site", :except => [:api_details]
 
   skip_before_action :verify_authenticity_token, :only => [:api_read, :api_users, :api_details, :api_gpx_files, :auth_success]
@@ -14,11 +14,11 @@ class UserController < ApplicationController
   before_action :require_allow_read_prefs, :only => [:api_details]
   before_action :require_allow_read_gpx, :only => [:api_gpx_files]
   before_action :require_cookies, :only => [:new, :login, :confirm]
-  before_action :require_administrator, :only => [:set_status, :delete, :list]
+  before_action :require_administrator, :only => [:set_status, :delete, :index]
   around_action :api_call_handle_error, :only => [:api_read, :api_users, :api_details, :api_gpx_files]
   before_action :lookup_user_by_id, :only => [:api_read]
   before_action :lookup_user_by_name, :only => [:set_status, :delete]
-  before_action :allow_thirdparty_images, :only => [:view, :account]
+  before_action :allow_thirdparty_images, :only => [:show, :account]
 
   def terms
     @legale = params[:legale] || OSM.ip_to_country(request.remote_ip) || DEFAULT_LEGALE
@@ -27,9 +27,9 @@ class UserController < ApplicationController
     if request.xhr?
       render :partial => "terms"
     else
-      @title = t "user.terms.title"
+      @title = t "users.terms.title"
 
-      if current_user && current_user.terms_agreed?
+      if current_user&.terms_agreed?
         # Already agreed to terms, so just show settings
         redirect_to :action => :account, :display_name => current_user.display_name
       elsif current_user.nil? && session[:new_user].nil?
@@ -39,13 +39,13 @@ class UserController < ApplicationController
   end
 
   def save
-    @title = t "user.new.title"
+    @title = t "users.new.title"
 
     if params[:decline]
       if current_user
         current_user.terms_seen = true
 
-        flash[:notice] = t("user.new.terms declined", :url => t("user.new.terms declined url")).html_safe if current_user.save
+        flash[:notice] = t("users.new.terms declined", :url => t("users.new.terms declined url")).html_safe if current_user.save
 
         if params[:referer]
           redirect_to params[:referer]
@@ -53,7 +53,7 @@ class UserController < ApplicationController
           redirect_to :action => :account, :display_name => current_user.display_name
         end
       else
-        redirect_to t("user.terms.declined")
+        redirect_to t("users.terms.declined")
       end
     elsif current_user
       unless current_user.terms_agreed?
@@ -61,7 +61,7 @@ class UserController < ApplicationController
         current_user.terms_agreed = Time.now.getutc
         current_user.terms_seen = true
 
-        flash[:notice] = t "user.new.terms accepted" if current_user.save
+        flash[:notice] = t "users.new.terms accepted" if current_user.save
       end
 
       if params[:referer]
@@ -134,18 +134,18 @@ class UserController < ApplicationController
         current_user.errors.add(attribute, error)
       end
     end
-    @title = t "user.account.title"
+    @title = t "users.account.title"
   end
 
   def go_public
     current_user.data_public = true
     current_user.save
-    flash[:notice] = t "user.go_public.flash success"
+    flash[:notice] = t "users.go_public.flash success"
     redirect_to :action => "account", :display_name => current_user.display_name
   end
 
   def lost_password
-    @title = t "user.lost_password.title"
+    @title = t "users.lost_password.title"
 
     if params[:user] && params[:user][:email]
       user = User.visible.find_by(:email => params[:user][:email])
@@ -159,16 +159,16 @@ class UserController < ApplicationController
       if user
         token = user.tokens.create
         Notifier.lost_password(user, token).deliver_now
-        flash[:notice] = t "user.lost_password.notice email on way"
+        flash[:notice] = t "users.lost_password.notice email on way"
         redirect_to :action => "login"
       else
-        flash.now[:error] = t "user.lost_password.notice email cannot find"
+        flash.now[:error] = t "users.lost_password.notice email cannot find"
       end
     end
   end
 
   def reset_password
-    @title = t "user.reset_password.title"
+    @title = t "users.reset_password.title"
 
     if params[:token]
       token = UserToken.find_by(:token => params[:token])
@@ -184,12 +184,12 @@ class UserController < ApplicationController
 
           if current_user.save
             token.destroy
-            flash[:notice] = t "user.reset_password.flash changed"
+            flash[:notice] = t "users.reset_password.flash changed"
             successful_login(current_user)
           end
         end
       else
-        flash[:error] = t "user.reset_password.flash token bad"
+        flash[:error] = t "users.reset_password.flash token bad"
         redirect_to :action => "lost_password"
       end
     else
@@ -198,7 +198,7 @@ class UserController < ApplicationController
   end
 
   def new
-    @title = t "user.new.title"
+    @title = t "users.new.title"
     @referer = params[:referer] || session[:referer]
 
     append_content_security_policy_directives(
@@ -271,12 +271,12 @@ class UserController < ApplicationController
   end
 
   def logout
-    @title = t "user.logout.title"
+    @title = t "users.logout.title"
 
     if params[:session] == session.id
       if session[:token]
         token = UserToken.find_by(:token => session[:token])
-        token.destroy if token
+        token&.destroy
         session.delete(:token)
       end
       session.delete(:user)
@@ -292,11 +292,11 @@ class UserController < ApplicationController
   def confirm
     if request.post?
       token = UserToken.find_by(:token => params[:confirm_string])
-      if token && token.user.active?
-        flash[:error] = t("user.confirm.already active")
+      if token&.user&.active?
+        flash[:error] = t("users.confirm.already active")
         redirect_to :action => "login"
       elsif !token || token.expired?
-        flash[:error] = t("user.confirm.unknown token")
+        flash[:error] = t("users.confirm.unknown token")
         redirect_to :action => "confirm"
       else
         user = token.user
@@ -315,7 +315,7 @@ class UserController < ApplicationController
         end
 
         if token.nil? || token.user != user
-          flash[:notice] = t("user.confirm.success")
+          flash[:notice] = t("users.confirm.success")
           redirect_to :action => :login, :referer => referer
         else
           token.destroy
@@ -337,10 +337,10 @@ class UserController < ApplicationController
     token = UserToken.find_by(:token => session[:token])
 
     if user.nil? || token.nil? || token.user != user
-      flash[:error] = t "user.confirm_resend.failure", :name => params[:display_name]
+      flash[:error] = t "users.confirm_resend.failure", :name => params[:display_name]
     else
       Notifier.signup_confirm(user, user.tokens.create).deliver_now
-      flash[:notice] = t("user.confirm_resend.success", :email => user.email, :sender => SUPPORT_EMAIL).html_safe
+      flash[:notice] = t("users.confirm_resend.success", :email => user.email, :sender => SUPPORT_EMAIL).html_safe
     end
 
     redirect_to :action => "login"
@@ -349,7 +349,7 @@ class UserController < ApplicationController
   def confirm_email
     if request.post?
       token = UserToken.find_by(:token => params[:confirm_string])
-      if token && token.user.new_email?
+      if token&.user&.new_email?
         self.current_user = token.user
         current_user.email = current_user.new_email
         current_user.new_email = nil
@@ -357,9 +357,9 @@ class UserController < ApplicationController
         gravatar_enabled = gravatar_enable(current_user)
         if current_user.save
           flash[:notice] = if gravatar_enabled
-                             t("user.confirm_email.success") + " " + gravatar_status_message(current_user)
+                             t("users.confirm_email.success") + " " + gravatar_status_message(current_user)
                            else
-                             t("user.confirm_email.success")
+                             t("users.confirm_email.success")
                            end
         else
           flash[:errors] = current_user.errors
@@ -368,10 +368,10 @@ class UserController < ApplicationController
         session[:user] = current_user.id
         redirect_to :action => "account", :display_name => current_user.display_name
       elsif token
-        flash[:error] = t "user.confirm_email.failure"
+        flash[:error] = t "users.confirm_email.failure"
         redirect_to :action => "account", :display_name => token.user.display_name
       else
-        flash[:error] = t "user.confirm_email.unknown_token"
+        flash[:error] = t "users.confirm_email.unknown_token"
       end
     end
   end
@@ -409,11 +409,11 @@ class UserController < ApplicationController
     render :xml => doc.to_s
   end
 
-  def view
+  def show
     @user = User.find_by(:display_name => params[:display_name])
 
     if @user &&
-       (@user.visible? || (current_user && current_user.administrator?))
+       (@user.visible? || (current_user&.administrator?))
       @title = @user.display_name
     else
       render_unknown_user params[:display_name]
@@ -429,18 +429,18 @@ class UserController < ApplicationController
         friend.befriender = current_user
         friend.befriendee = @new_friend
         if current_user.is_friends_with?(@new_friend)
-          flash[:warning] = t "user.make_friend.already_a_friend", :name => @new_friend.display_name
+          flash[:warning] = t "users.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
+          flash[:notice] = t "users.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))
+          friend.add_error(t("users.make_friend.failed", :name => @new_friend.display_name))
         end
 
         if params[:referer]
           redirect_to params[:referer]
         else
-          redirect_to :action => "view"
+          redirect_to :action => "show"
         end
       end
     else
@@ -455,15 +455,15 @@ class UserController < ApplicationController
       if request.post?
         if current_user.is_friends_with?(@friend)
           Friend.where(:user_id => current_user.id, :friend_user_id => @friend.id).delete_all
-          flash[:notice] = t "user.remove_friend.success", :name => @friend.display_name
+          flash[:notice] = t "users.remove_friend.success", :name => @friend.display_name
         else
-          flash[:error] = t "user.remove_friend.not_a_friend", :name => @friend.display_name
+          flash[:error] = t "users.remove_friend.not_a_friend", :name => @friend.display_name
         end
 
         if params[:referer]
           redirect_to params[:referer]
         else
-          redirect_to :action => "view"
+          redirect_to :action => "show"
         end
       end
     else
@@ -476,19 +476,19 @@ class UserController < ApplicationController
   def set_status
     @user.status = params[:status]
     @user.save
-    redirect_to :action => "view", :display_name => params[:display_name]
+    redirect_to user_path(:display_name => params[:display_name])
   end
 
   ##
   # delete a user, marking them as deleted and removing personal data
   def delete
     @user.delete
-    redirect_to :action => "view", :display_name => params[:display_name]
+    redirect_to user_path(:display_name => params[:display_name])
   end
 
   ##
   # display a list of users matching specified criteria
-  def list
+  def index
     if request.post?
       ids = params[:user].keys.collect(&:to_i)
 
@@ -552,7 +552,7 @@ class UserController < ApplicationController
       if user.nil? && provider == "google"
         openid_url = auth_info[:extra][:id_info]["openid_id"]
         user = User.find_by(:auth_provider => "openid", :auth_uid => openid_url) if openid_url
-        user.update(:auth_provider => provider, :auth_uid => uid) if user
+        user&.update(:auth_provider => provider, :auth_uid => uid)
       end
 
       if user
@@ -562,9 +562,9 @@ class UserController < ApplicationController
         when "active", "confirmed" then
           successful_login(user, request.env["omniauth.params"]["referer"])
         when "suspended" then
-          failed_login t("user.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}").html_safe
+          failed_login t("users.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}").html_safe
         else
-          failed_login t("user.login.auth failure")
+          failed_login t("users.login.auth failure")
         end
       else
         redirect_to :action => "new", :nickname => name, :email => email,
@@ -576,7 +576,7 @@ class UserController < ApplicationController
   ##
   # omniauth failure callback
   def auth_failure
-    flash[:error] = t("user.auth_failure." + params[:message])
+    flash[:error] = t("users.auth_failure." + params[:message])
     redirect_to params[:origin] || login_url
   end
 
@@ -590,9 +590,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:#{SUPPORT_EMAIL}").html_safe, username
+      failed_login t("users.login.account is suspended", :webmaster => "mailto:#{SUPPORT_EMAIL}").html_safe, username
     else
-      failed_login t("user.login.auth failure"), username
+      failed_login t("users.login.auth failure"), username
     end
   end
 
@@ -727,12 +727,12 @@ class UserController < ApplicationController
       set_locale(true)
 
       if user.new_email.blank? || user.new_email == user.email
-        flash.now[:notice] = t "user.account.flash update success"
+        flash.now[:notice] = t "users.account.flash update success"
       else
         user.email = user.new_email
 
         if user.valid?
-          flash.now[:notice] = t "user.account.flash update success confirm needed"
+          flash.now[:notice] = t "users.account.flash update success confirm needed"
 
           begin
             Notifier.email_confirm(user, user.tokens.create).deliver_now
@@ -754,10 +754,10 @@ class UserController < ApplicationController
   # and return them to the user page.
   def require_administrator
     if current_user && !current_user.administrator?
-      flash[:error] = t("user.filter.not_an_administrator")
+      flash[:error] = t("users.filter.not_an_administrator")
 
       if params[:display_name]
-        redirect_to :action => "view", :display_name => params[:display_name]
+        redirect_to user_path(:display_name => params[:display_name])
       else
         redirect_to :action => "login", :referer => request.fullpath
       end
@@ -826,6 +826,7 @@ class UserController < ApplicationController
   def gravatar_enable(user)
     # code from example https://en.gravatar.com/site/implement/images/ruby/
     return false if user.image.present?
+
     hash = Digest::MD5.hexdigest(user.email.downcase)
     url = "https://www.gravatar.com/avatar/#{hash}?d=404" # without d=404 we will always get an image back
     response = OSM.http_client.get(URI.parse(url))
@@ -838,9 +839,9 @@ class UserController < ApplicationController
   # display a message about th current status of the gravatar setting
   def gravatar_status_message(user)
     if user.image_use_gravatar
-      t "user.account.gravatar.enabled"
+      t "users.account.gravatar.enabled"
     else
-      t "user.account.gravatar.disabled"
+      t "users.account.gravatar.disabled"
     end
   end
 end
index 661369454fb065b024985df35b347d0fb09c2f55..fef6eaa5e77c989c177eb0c15aed84687c844fbf 100644 (file)
@@ -26,7 +26,7 @@ module BannerHelper
 
       # rotate all banner queue positions
       index = cval.to_i
-      cookies[ckey] = index - 1 if index > 0
+      cookies[ckey] = index - 1 if index.positive?
 
       # pick banner with mininum queue position
       next if index > min_index
index 7eb389023ba54a9cfc373dda4ee6f7a39ea51215..9bcae4ad4d010ce0fe3de73bcb5b666b83e5db31 100644 (file)
@@ -1,9 +1,9 @@
 module ChangesetHelper
   def changeset_user_link(changeset)
     if changeset.user.status == "deleted"
-      t("user.no_such_user.deleted")
+      t("users.no_such_user.deleted")
     elsif changeset.user.data_public?
-      link_to(changeset.user.display_name, user_path(changeset.user.display_name))
+      link_to(changeset.user.display_name, user_path(changeset.user))
     else
       t("browse.anonymous")
     end
@@ -32,15 +32,15 @@ module ChangesetHelper
     end
   end
 
-  def changeset_list_title(params, user)
+  def changeset_index_title(params, user)
     if params[:friends] && user
-      t "changeset.list.title_friend"
+      t "changeset.index.title_friend"
     elsif params[:nearby] && user
-      t "changeset.list.title_nearby"
+      t "changeset.index.title_nearby"
     elsif params[:display_name]
-      t "changeset.list.title_user", :user => params[:display_name]
+      t "changeset.index.title_user", :user => params[:display_name]
     else
-      t "changeset.list.title"
+      t "changeset.index.title"
     end
   end
 end
index f9a84ba7dd979bdc71fca2955f4eeafa6eb1f28d..43ca98c9134c5e13d1547570da74867c2dc42d45 100644 (file)
@@ -2,11 +2,11 @@ module IssuesHelper
   def reportable_url(reportable)
     case reportable
     when DiaryEntry
-      url_for(:controller => reportable.class.name.underscore, :action => :view, :display_name => reportable.user.display_name, :id => reportable.id)
+      diary_entry_url(reportable.user, reportable)
     when User
-      url_for(:controller => reportable.class.name.underscore, :action => :view, :display_name => reportable.display_name)
+      user_url(reportable)
     when DiaryComment
-      url_for(:controller => reportable.diary_entry.class.name.underscore, :action => :view, :display_name => reportable.diary_entry.user.display_name, :id => reportable.diary_entry.id, :anchor => "comment#{reportable.id}")
+      diary_entry_url(reportable.diary_entry.user, reportable.diary_entry, :anchor => "comment#{reportable.id}")
     when Note
       url_for(:controller => :browse, :action => :note, :id => reportable.id)
     end
@@ -29,7 +29,7 @@ module IssuesHelper
     count = Issue.visible_to(current_user).open.limit(100).size
     if count > 99
       content_tag(:span, "99+", :class => "count-number")
-    elsif count > 0
+    elsif count.positive?
       content_tag(:span, count, :class => "count-number")
     end
   end
index 6ebd18345526e186833527454e72895065c36539..89c8cc376a24b7eadaa2b042be51e845306a9b62 100644 (file)
@@ -16,9 +16,9 @@ module NoteHelper
     if author.nil?
       ""
     elsif author.status == "deleted"
-      t("user.no_such_user.deleted")
+      t("users.no_such_user.deleted")
     else
-      link_to h(author.display_name), link_options.merge(:controller => "user", :action => "view", :display_name => author.display_name)
+      link_to h(author.display_name), link_options.merge(:controller => "users", :action => "show", :display_name => author.display_name)
     end
   end
 end
index dbd2d245d0dbfbccafaaef5a9af7a33188076f0f..2915a0880591b1e694db4a2d9c661756b1052af2 100644 (file)
@@ -29,6 +29,6 @@ module NotifierHelper
     # Because we can't use stylesheets in HTML emails, we need to inline the
     # styles. Rather than copy-paste the same string of CSS into every message,
     # we apply it once here, after the message has been composed.
-    html.gsub /<p>/, '<p style="color: black; margin: 0.75em 0; font-family: \'Helvetica Neue\', Arial, Sans-Serif">'
+    html.gsub(/<p>/, '<p style="color: black; margin: 0.75em 0; font-family: \'Helvetica Neue\', Arial, Sans-Serif">')
   end
 end
index 065a562c4d282ad977ef51733b9f687a811bf988..1fc8e3ed2f1e0b6f82f6e325d0425c278a3d1e87 100644 (file)
@@ -45,15 +45,15 @@ module UserHelper
   # External authentication support
 
   def openid_logo
-    image_tag "openid_small.png", :alt => t("user.login.openid_logo_alt"), :class => "openid_logo"
+    image_tag "openid_small.png", :alt => t("users.login.openid_logo_alt"), :class => "openid_logo"
   end
 
   def auth_button(name, provider, options = {})
     link_to(
-      image_tag("#{name}.png", :alt => t("user.login.auth_providers.#{name}.alt")),
+      image_tag("#{name}.png", :alt => t("users.login.auth_providers.#{name}.alt")),
       auth_path(options.merge(:provider => provider)),
       :class => "auth_button",
-      :title => t("user.login.auth_providers.#{name}.title")
+      :title => t("users.login.auth_providers.#{name}.title")
     )
   end
 
index 805abb58f38f323889cf2ebb3b1226d2a30234c2..b9430535ea3fa8702b5cbee8b3e77a7acb624c14 100644 (file)
@@ -6,24 +6,24 @@ module UserRolesHelper
   end
 
   def role_icon(user, role)
-    if current_user && current_user.administrator?
+    if current_user&.administrator?
       if user.has_role?(role)
         image = "roles/#{role}"
-        alt = t("user.view.role.revoke.#{role}")
-        title = t("user.view.role.revoke.#{role}")
+        alt = t("users.show.role.revoke.#{role}")
+        title = t("users.show.role.revoke.#{role}")
         url = revoke_role_path(:display_name => user.display_name, :role => role)
         confirm = t("user_role.revoke.are_you_sure", :name => user.display_name, :role => role)
       else
         image = "roles/blank_#{role}"
-        alt = t("user.view.role.grant.#{role}")
-        title = t("user.view.role.grant.#{role}")
+        alt = t("users.show.role.grant.#{role}")
+        title = t("users.show.role.grant.#{role}")
         url = grant_role_path(:display_name => user.display_name, :role => role)
         confirm = t("user_role.grant.are_you_sure", :name => user.display_name, :role => role)
       end
     elsif user.has_role?(role)
       image = "roles/#{role}"
-      alt = t("user.view.role.#{role}")
-      title = t("user.view.role.#{role}")
+      alt = t("users.show.role.#{role}")
+      title = t("users.show.role.#{role}")
     end
 
     if image
index 502637c2a69b8926fc84a4dac6b2403f152574d4..5cdfeb994544444f08edb72cc4f8ba42fead569d 100644 (file)
@@ -106,6 +106,7 @@ class Changeset < ActiveRecord::Base
     pt.find("tag").each do |tag|
       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
 
@@ -207,7 +208,7 @@ class Changeset < ActiveRecord::Base
 
     user_display_name_cache = {} if user_display_name_cache.nil?
 
-    if user_display_name_cache && user_display_name_cache.key?(user_id)
+    if user_display_name_cache&.key?(user_id)
       # use the cache if available
     elsif user.data_public?
       user_display_name_cache[user_id] = user.display_name
@@ -232,6 +233,7 @@ class Changeset < ActiveRecord::Base
     bbox.to_unscaled.add_bounds_to(el1, "_") if bbox.complete?
 
     el1["comments_count"] = comments.length.to_s
+    el1["changes_count"] = num_changes.to_s
 
     if include_discussion
       el2 = XML::Node.new("discussion")
index ef1a0110ec8bbeac3ed28303e13b49ce7e2b365f..d11942beb6434e7c393db40ad3cfd5f3c3c4849b 100644 (file)
@@ -51,12 +51,13 @@ class ClientApplication < ActiveRecord::Base
 
   def self.find_token(token_key)
     token = OauthToken.includes(:client_application).find_by(:token => token_key)
-    token if token && token.authorized?
+    token if token&.authorized?
   end
 
   def self.verify_request(request, options = {}, &block)
     signature = OAuth::Signature.build(request, options, &block)
     return false unless OauthNonce.remember(signature.request.nonce, signature.request.timestamp)
+
     value = signature.verify
     value
   rescue OAuth::Signature::UnknownSignatureMethod
index c09fcbd6778cbce6083c14cdd15653b3da957237..989cdee5cd20cc4a5b86d910cfedd9d54eda79ca 100644 (file)
@@ -88,19 +88,23 @@ class Node < ActiveRecord::Base
 
     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")
     raise OSM::APIBadXMLError.new("node", pt, "Changeset id is missing") if pt["changeset"].nil?
+
     node.changeset_id = pt["changeset"].to_i
 
     raise OSM::APIBadUserInput, "The node is outside this world" unless node.in_world?
 
     # version must be present unless creating
     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
       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
@@ -119,6 +123,7 @@ class Node < ActiveRecord::Base
     pt.find("tag").each do |tag|
       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
 
index b7f6928b869a75c626422b46438b81a4f7d38262..d96addbe789f3d7f62314c0d68a12e5228fae97d 100644 (file)
@@ -21,7 +21,7 @@
 class Note < ActiveRecord::Base
   include GeoRecord
 
-  has_many :comments, -> { where(:visible => true).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id
+  has_many :comments, -> { left_joins(:author).where(:visible => true, :users => { :status => [nil, "active", "confirmed"] }).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id
 
   validates :id, :uniqueness => true, :presence => { :on => :update },
                  :numericality => { :on => :update, :integer_only => true }
@@ -31,8 +31,8 @@ class Note < ActiveRecord::Base
 
   validate :validate_position
 
-  scope :visible, -> { where("status != 'hidden'") }
-  scope :invisible, -> { where("status = 'hidden'") }
+  scope :visible, -> { where.not(:status => "hidden") }
+  scope :invisible, -> { where(:status => "hidden") }
 
   after_initialize :set_defaults
 
index d08bedd8ca05a5c9f9d162a942248499a1b711bf..4b53c66f6825f1b38d5fdbde69653002762e9896 100644 (file)
@@ -8,7 +8,7 @@ class Notifier < ActionMailer::Base
 
   def signup_confirm(user, token)
     with_recipient_locale user do
-      @url = url_for(:controller => "user", :action => "confirm",
+      @url = url_for(:controller => "users", :action => "confirm",
                      :display_name => user.display_name,
                      :confirm_string => token.token)
 
@@ -20,7 +20,7 @@ class Notifier < ActionMailer::Base
   def email_confirm(user, token)
     with_recipient_locale user do
       @address = user.new_email
-      @url = url_for(:controller => "user", :action => "confirm_email",
+      @url = url_for(:controller => "users", :action => "confirm_email",
                      :confirm_string => token.token)
 
       mail :to => user.new_email,
@@ -30,7 +30,7 @@ class Notifier < ActionMailer::Base
 
   def lost_password(user, token)
     with_recipient_locale user do
-      @url = url_for(:controller => "user", :action => "reset_password",
+      @url = url_for(:controller => "users", :action => "reset_password",
                      :token => token.token)
 
       mail :to => user.email,
@@ -70,7 +70,7 @@ class Notifier < ActionMailer::Base
       @text = message.body
       @title = message.title
       @readurl = message_url(message)
-      @replyurl = reply_message_url(message)
+      @replyurl = message_reply_url(message)
       @author = @from_user
 
       attach_user_avatar(message.sender)
@@ -87,16 +87,8 @@ class Notifier < ActionMailer::Base
       @from_user = comment.user.display_name
       @text = comment.body
       @title = comment.diary_entry.title
-      @readurl = url_for(:controller => "diary_entry",
-                         :action => "view",
-                         :display_name => comment.diary_entry.user.display_name,
-                         :id => comment.diary_entry.id,
-                         :anchor => "comment#{comment.id}")
-      @commenturl = url_for(:controller => "diary_entry",
-                            :action => "view",
-                            :display_name => comment.diary_entry.user.display_name,
-                            :id => comment.diary_entry.id,
-                            :anchor => "newcomment")
+      @readurl = diary_entry_url(comment.diary_entry.user, comment.diary_entry, :anchor => "comment#{comment.id}")
+      @commenturl = diary_entry_url(comment.diary_entry.user, comment.diary_entry, :anchor => "newcomment")
       @replyurl = new_message_url(comment.user, :message => { :title => "Re: #{comment.diary_entry.title}" })
 
       @author = @from_user
@@ -112,9 +104,8 @@ class Notifier < ActionMailer::Base
   def friend_notification(friend)
     with_recipient_locale friend.befriendee do
       @friend = friend
-      @viewurl = url_for(:controller => "user", :action => "view",
-                         :display_name => @friend.befriender.display_name)
-      @friendurl = url_for(:controller => "user", :action => "make_friend",
+      @viewurl = user_url(@friend.befriender)
+      @friendurl = url_for(:controller => "users", :action => "make_friend",
                            :display_name => @friend.befriender.display_name)
       @author = @friend.befriender.display_name
 
@@ -190,8 +181,8 @@ class Notifier < ActionMailer::Base
   end
 
   def user_avatar_file_path(user)
-    image = user && user.image
-    if image && image.file?
+    image = user&.image
+    if image&.file?
       return image.path(:small)
     else
       return Rails.root.join("app", "assets", "images", "users", "images", "small.png")
index 0952f068edc6b9a9d2525206e1fd5069c8ff7516..9d2773e8f346c5b8e6789c8a314020c7a39edd41 100644 (file)
@@ -22,8 +22,10 @@ class OauthNonce < ActiveRecord::Base
   # Remembers a nonce and it's associated timestamp. It returns false if it has already been used
   def self.remember(nonce, timestamp)
     return false if Time.now.to_i - timestamp.to_i > 86400
+
     oauth_nonce = OauthNonce.create(:nonce => nonce, :timestamp => timestamp.to_i)
     return false if oauth_nonce.new_record?
+
     oauth_nonce
   end
 end
index 2495830eefaa36972f8921bf1fd8e88cac427879..202db12daa66479f379c4aeb84e49122279b1991 100644 (file)
@@ -70,12 +70,15 @@ class Relation < ActiveRecord::Base
     relation = Relation.new
 
     raise OSM::APIBadXMLError.new("relation", pt, "Version is required when updating") unless create || !pt["version"].nil?
+
     relation.version = pt["version"]
     raise OSM::APIBadXMLError.new("relation", pt, "Changeset id is missing") if pt["changeset"].nil?
+
     relation.changeset_id = pt["changeset"]
 
     unless create
       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
@@ -94,6 +97,7 @@ class Relation < ActiveRecord::Base
     pt.find("tag").each do |tag|
       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
 
@@ -106,6 +110,7 @@ class Relation < ActiveRecord::Base
     pt.find("member").each do |member|
       # 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.
@@ -207,6 +212,7 @@ class Relation < ActiveRecord::Base
       lock!
       check_consistency(self, new_relation, user)
       raise OSM::APIPreconditionFailedError, "Cannot update relation #{id}: data or member data is invalid." unless new_relation.preconditions_ok?(members)
+
       self.changeset_id = new_relation.changeset_id
       self.changeset = new_relation.changeset
       self.tags = new_relation.tags
@@ -219,6 +225,7 @@ class Relation < ActiveRecord::Base
   def create_with_history(user)
     check_create_consistency(self, user)
     raise OSM::APIPreconditionFailedError, "Cannot create relation: data or member data is invalid." unless preconditions_ok?
+
     self.version = 0
     self.visible = true
     save_with_history!
@@ -253,7 +260,8 @@ class Relation < ActiveRecord::Base
       element = model.lock("for share").find_by(:id => m[1])
 
       # and check that it is OK to use.
-      raise OSM::APIPreconditionFailedError, "Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}" unless element && element.visible? && element.preconditions_ok?
+      raise OSM::APIPreconditionFailedError, "Relation with id #{id} cannot be saved due to #{m[0]} with id #{m[1]}" unless element&.visible? && element&.preconditions_ok?
+
       hash[m[1]] = true
     end
 
@@ -267,9 +275,10 @@ class Relation < ActiveRecord::Base
   def fix_placeholders!(id_map, placeholder_id = nil)
     members.map! do |type, id, role|
       old_id = id.to_i
-      if old_id < 0
+      if old_id.negative?
         new_id = id_map[type.downcase.to_sym][old_id]
         raise OSM::APIBadUserInput, "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]
@@ -372,7 +381,7 @@ class Relation < ActiveRecord::Base
       # reasonable on the assumption that adding or removing members doesn't
       # materially change the rest of the relation.
       any_relations =
-        changed_members.collect { |_id, type| type == "relation" }
+        changed_members.collect { |type, _id, _role| type == "Relation" }
                        .inject(false) { |acc, elem| acc || elem }
 
       update_members = if tags_changed || any_relations
index 335a735bc5a4dbcab80c07d92f2791df53447509..ed0cc3ae4c89164f322f32380341f9dbcab0a7c8 100644 (file)
@@ -40,6 +40,7 @@ class RequestToken < OauthToken
 
   def authorize!(user)
     return false if authorized?
+
     self.user = user
     self.authorized_at = Time.now
     self.verifier = OAuth::Helper.generate_key(20)[0, 20] unless oauth10?
index 214b0b6470aacc20fbe1262d2b553778b55bf729..5096a81aafcb7e69e9b77d8d90b3fd9f933ec545 100644 (file)
@@ -214,10 +214,12 @@ class Trace < ActiveRecord::Base
 
   def update_from_xml_node(pt, create = false)
     raise OSM::APIBadXMLError.new("trace", pt, "visibility missing") if pt["visibility"].nil?
+
     self.visibility = pt["visibility"]
 
     unless create
       raise OSM::APIBadXMLError.new("trace", pt, "ID is required when updating.") if pt["id"].nil?
+
       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
@@ -232,6 +234,7 @@ class Trace < ActiveRecord::Base
 
     description = pt.find("description").first
     raise OSM::APIBadXMLError.new("trace", pt, "description missing") if description.nil?
+
     self.description = description.content
 
     self.tags = pt.find("tag").collect do |tag|
@@ -303,7 +306,7 @@ class Trace < ActiveRecord::Base
       tp.save!
     end
 
-    if gpx.actual_points > 0
+    if gpx.actual_points.positive?
       max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude)
       min_lat = Tracepoint.where(:gpx_id => id).minimum(:latitude)
       max_lon = Tracepoint.where(:gpx_id => id).maximum(:longitude)
index e5b73ceaaab009db0ef5855ec38c4f108d6dbce4..c95a1212296acc56746aea30c7959ef0a6678db5 100644 (file)
@@ -68,12 +68,15 @@ class Way < ActiveRecord::Base
     way = Way.new
 
     raise OSM::APIBadXMLError.new("way", pt, "Version is required when updating") unless create || !pt["version"].nil?
+
     way.version = pt["version"]
     raise OSM::APIBadXMLError.new("way", pt, "Changeset id is missing") if pt["changeset"].nil?
+
     way.changeset_id = pt["changeset"]
 
     unless create
       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
@@ -92,6 +95,7 @@ class Way < ActiveRecord::Base
     pt.find("tag").each do |tag|
       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
 
@@ -123,7 +127,7 @@ class Way < ActiveRecord::Base
         ordered_nodes[nd.sequence_id] = nd.node_id.to_s if visible_nodes[nd.node_id]
       else
         # otherwise, manually go to the db to check things
-        ordered_nodes[nd.sequence_id] = nd.node_id.to_s if nd.node && nd.node.visible?
+        ordered_nodes[nd.sequence_id] = nd.node_id.to_s if nd.node&.visible?
       end
     end
 
@@ -194,6 +198,7 @@ class Way < ActiveRecord::Base
   def create_with_history(user)
     check_create_consistency(self, user)
     raise OSM::APIPreconditionFailedError, "Cannot create way: data is invalid." unless preconditions_ok?
+
     self.version = 0
     self.visible = true
     save_with_history!
@@ -249,9 +254,10 @@ class Way < ActiveRecord::Base
   # to IDs +id_map+.
   def fix_placeholders!(id_map, placeholder_id = nil)
     nds.map! do |node_id|
-      if node_id < 0
+      if node_id.negative?
         new_id = id_map[:node][node_id]
         raise OSM::APIBadUserInput, "Placeholder node not found for reference #{node_id} in way #{id.nil? ? placeholder_id : id}" if new_id.nil?
+
         new_id
       else
         node_id
index 85b9515dfedab9442490590023bdbbf0c67977e1..81e930812c883310f7d8525d6dbdf83855743905 100644 (file)
@@ -63,7 +63,7 @@
 
   <% unless current_user %>
     <div class="notice">
-      <%= link_to(t(".join_discussion"), :controller => 'user', :action => 'login', :referer => request.fullpath) %>
+      <%= link_to(t(".join_discussion"), :controller => 'users', :action => 'login', :referer => request.fullpath) %>
     </div>
   <% end %>
 
     <% end %>
     <%=
         user = (@prev_by_user || @next_by_user).user.display_name
-        link_to content_tag(:bdi, user), :controller => "changeset", :action => "list", :display_name => user
+        link_to content_tag(:bdi, user), :controller => "changeset", :action => "index", :display_name => user
     %>
     <% if @next_by_user %>
       &middot;
index f27b0bc911be60723a8788d7efc304c4f2d32bab..03ba013a32df307f31ac7b4cb4bab182661f5168 100644 (file)
@@ -14,7 +14,7 @@
 
 <%= content_tag "li", :id => "changeset_#{changeset.id}", :data => {:changeset => changeset_data} do %>
   <h4>
-    <a class="changeset_id" href="<%= changeset_path(changeset.id) %>">
+    <a class="changeset_id" href="<%= changeset_path(changeset) %>">
       <%= changeset.tags['comment'].to_s.presence || t('browse.no_comment') %>
     </a>
   </h4>
index 61faea97f44034956fd52a4a8d1b6277235b30c4..7aa65d2c36318948de2a95cdcb4afd5bcc691e45 100644 (file)
@@ -1 +1 @@
-xml.a(user.display_name, :href => url_for(:controller => "user", :action => "view", :display_name => user.display_name))
+xml.a(user.display_name, :href => url_for(:controller => "users", :action => "view", :display_name => user.display_name))
index 17faf7f8d8e80956d8ba655b2cdf7b367460801b..ba745cb032489d833ddcf36b997fb6b3c0a49b0f 100644 (file)
@@ -5,9 +5,9 @@
 <% end -%>
 
 <%
-   set_title(changeset_list_title(params, current_user))
+   set_title(changeset_index_title(params, current_user))
    if params[:display_name]
-     @heading = t('changeset.list.title_user', :user => link_to(params[:display_name], :controller => "user", :action => "view", :display_name => params[:display_name])).html_safe
+     @heading = t('changeset.index.title_user', :user => link_to(params[:display_name], user_path(:display_name => params[:display_name]))).html_safe
    else
      @heading = @title
    end
similarity index 81%
rename from app/views/changeset/list.atom.builder
rename to app/views/changeset/index.atom.builder
index 86dd966ccc8aba18fcb3b35ed3a7d5ae14e432db..57befe117b5e39e9f726221f453eae66db277eaf 100644 (file)
@@ -1,8 +1,8 @@
 atom_feed(:language => I18n.locale, :schema_date => 2009,
           :id => url_for(@params.merge(:only_path => false)),
-          :root_url => url_for(@params.merge(:action => :list, :format => nil, :only_path => false)),
+          :root_url => url_for(@params.merge(:action => :index, :format => nil, :only_path => false)),
           "xmlns:georss" => "http://www.georss.org/georss") do |feed|
-  feed.title changeset_list_title(params, current_user)
+  feed.title changeset_index_title(params, current_user)
 
   feed.updated @edits.map { |e| [e.created_at, e.closed_at].max }.max
   feed.icon image_url("favicon.ico")
@@ -32,7 +32,7 @@ atom_feed(:language => I18n.locale, :schema_date => 2009,
       if changeset.user.data_public?
         entry.author do |author|
           author.name changeset.user.display_name
-          author.uri url_for(:controller => "user", :action => "view", :display_name => changeset.user.display_name, :only_path => false)
+          author.uri user_url(changeset.user, :only_path => false)
         end
       end
 
@@ -51,7 +51,7 @@ atom_feed(:language => I18n.locale, :schema_date => 2009,
             table.tr do |tr|
               tr.th t("browse.changeset.belongs_to")
               tr.td do |td|
-                td.a h(changeset.user.display_name), :href => url_for(:controller => "user", :action => "view", :display_name => changeset.user.display_name, :only_path => false)
+                td.a h(changeset.user.display_name), :href => user_url(changeset.user, :only_path => false)
               end
             end
           end
@@ -59,10 +59,10 @@ atom_feed(:language => I18n.locale, :schema_date => 2009,
             table.tr do |tr|
               tr.th t("browse.tag_details.tags")
               tr.td do |td|
-                td.table :cellpadding => "0" do |table|
+                td.table :cellpadding => "0" do |tag_table|
                   changeset.tags.sort.each do |tag|
-                    table.tr do |tr|
-                      tr.td << "#{h(tag[0])} = #{linkify(h(tag[1]))}"
+                    tag_table.tr do |tag_tr|
+                      tag_tr.td << "#{h(tag[0])} = #{linkify(h(tag[1]))}"
                     end
                   end
                 end
index 930f20e5ecd1e48dbe037889e44187c46c0ae97c..ec2f22601ce625925ec8dbe6fea0dea465d2744d 100644 (file)
@@ -4,10 +4,10 @@
       <%= user_thumbnail diary_entry.user %>
     <% end %>
 
-    <h2><%= link_to h(diary_entry.title), :action => 'view', :display_name => diary_entry.user.display_name, :id => diary_entry.id %></h2>
+    <h2><%= link_to h(diary_entry.title), diary_entry_path(diary_entry.user, diary_entry) %></h2>
 
     <small class='deemphasize'>
-      <%= raw(t '.posted_by', :link_user => (link_to h(diary_entry.user.display_name), user_path(diary_entry.user)), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to h(diary_entry.language.name), :controller => 'diary_entry', :action => 'list', :display_name => nil, :language => diary_entry.language_code)) %>
+      <%= raw(t '.posted_by', :link_user => (link_to h(diary_entry.user.display_name), user_path(diary_entry.user)), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to h(diary_entry.language.name), :controller => 'diary_entry', :action => 'index', :display_name => nil, :language => diary_entry.language_code)) %>
     </small>
 
   </div>
   <% end %>
 
   <ul class='secondary-actions clearfix'>
-    <% if params[:action] == 'list' %>
-      <li><%= link_to t('.comment_link'), :action => 'view', :display_name => diary_entry.user.display_name, :id => diary_entry.id, :anchor => 'newcomment' %></li>
+    <% if params[:action] == 'index' %>
+      <li><%= link_to t('.comment_link'), diary_entry_path(diary_entry.user, diary_entry, :anchor => 'newcomment') %></li>
       <li><%= link_to t('.reply_link'), new_message_path(diary_entry.user, :message => { :title => "Re: #{diary_entry.title}" }) %></li>
-      <li><%= link_to t('.comment_count', :count => diary_entry.visible_comments.count), :action => 'view', :display_name => diary_entry.user.display_name, :id => diary_entry.id, :anchor => 'comments' %></li>
+      <li><%= link_to t('.comment_count', :count => diary_entry.visible_comments.count), diary_entry_path(diary_entry.user, diary_entry, :anchor => 'comments') %></li>
     <% end %>
 
     <% if current_user && current_user == diary_entry.user %>
diff --git a/app/views/diary_entry/_diary_index_entry.html.erb b/app/views/diary_entry/_diary_index_entry.html.erb
new file mode 100644 (file)
index 0000000..3d6df4e
--- /dev/null
@@ -0,0 +1 @@
+<%= render :partial => "diary_entry", :object => diary_index_entry %>
diff --git a/app/views/diary_entry/_diary_list_entry.html.erb b/app/views/diary_entry/_diary_list_entry.html.erb
deleted file mode 100644 (file)
index ca583ef..0000000
+++ /dev/null
@@ -1 +0,0 @@
-<%= render :partial => "diary_entry", :object => diary_list_entry %>
\ No newline at end of file
index 7283a8ee12ff3ab150ca8bf8f1ccfb33c1ab9575..3960df3023758bb5f91cf5dfd1cdf7f429c0a205 100644 (file)
@@ -11,7 +11,7 @@
   <% @comments.each do |comment| -%>
   <% cl = cycle('table0', 'table1') %>
   <tr class="<%= cl %>">
-    <td width="25%"><%= link_to comment.diary_entry.title, :action => :view, :display_name => comment.diary_entry.user.display_name, :id => comment.diary_entry.id %></td>
+    <td width="25%"><%= link_to comment.diary_entry.title, diary_entry_path(comment.diary_entry.user, comment.diary_entry) %></td>
     <td width="25%"><span title="<%= l comment.created_at, :format => :friendly %>"><%= t '.ago', :ago => time_ago_in_words(comment.created_at) %></span></td>
     <td width="50%" class="richtext"><%= comment.body.to_html %></td>
   </tr>
similarity index 96%
rename from app/views/diary_entry/list.html.erb
rename to app/views/diary_entry/index.html.erb
index 2d9a4b1671f98e90d4726e2b9669c6e327e9d94d..021cb205847ffa466f061536507100f9d7372da4 100644 (file)
@@ -35,7 +35,7 @@
   <% if @user %>
     <%= render :partial => 'diary_entry', :collection => @entries %>
   <% else %>
-    <%= render :partial => 'diary_list_entry', :collection => @entries %>
+    <%= render :partial => 'diary_index_entry', :collection => @entries %>
   <% end %>
 
   <div class="pagination">
index 6ff2ed9f363b1305440851bc3cc61ed45d696c06..be627437dd9b0ea8efb863e7d845f364dbfdeb1c 100644 (file)
@@ -7,24 +7,24 @@ xml.rss("version" => "2.0",
   xml.channel do
     xml.title @title
     xml.description @description
-    xml.link url_for(:action => "list", :only_path => false)
+    xml.link url_for(:action => "index", :only_path => false)
     xml.image do
       xml.url image_url("mag_map-rss2.0.png")
       xml.title @title
       xml.width "100"
       xml.height "100"
-      xml.link url_for(:action => "list", :only_path => false)
+      xml.link url_for(:action => "index", :only_path => false)
     end
 
     @entries.each do |entry|
       xml.item do
         xml.title entry.title
-        xml.link url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :only_path => false)
-        xml.guid url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :only_path => false)
+        xml.link diary_entry_url(entry.user, entry, :only_path => false)
+        xml.guid diary_entry_url(entry.user, entry, :only_path => false)
         xml.description entry.body.to_html
         xml.dc :creator, entry.user.display_name
         xml.pubDate entry.created_at.to_s(:rfc822)
-        xml.comments url_for(:action => "view", :id => entry.id, :display_name => entry.user.display_name, :anchor => "comments", :only_path => false)
+        xml.comments diary_entry_url(entry.user, entry, :anchor => "comments", :only_path => false)
 
         if entry.latitude && entry.longitude
           xml.geo :lat, entry.latitude.to_s
similarity index 91%
rename from app/views/diary_entry/view.html.erb
rename to app/views/diary_entry/show.html.erb
index 9871da8ccfa09b5d9d8a8273e105302be5ccb521..02bebc5bc0d9f277106cbebb54551cf81daecd3c 100644 (file)
@@ -1,7 +1,7 @@
 <% content_for :heading do %>
   <div id="userinformation" >
     <%= user_image @entry.user %>
-    <h2><%= link_to t('.user_title', :user => h(@entry.user.display_name)), :action => :list %></h2>
+    <h2><%= link_to t('.user_title', :user => h(@entry.user.display_name)), :action => :index %></h2>
     <p><%= rss_link_to :action => :rss, :display_name => @entry.user.display_name %></p>
   </div>
 <% end %>
@@ -30,7 +30,7 @@
       <div class="diary-subscribe-buttons"><%= link_to t('javascripts.changesets.show.subscribe'), diary_entry_subscribe_path(:display_name => @entry.user.display_name, :id => @entry.id), :method => :post, :class => :button %></div>
     <% end %>
   <% else %>
-    <h3 id="newcomment"><%= raw t(".login_to_leave_a_comment", :login_link => link_to(t(".login"), :controller => 'user', :action => 'login', :referer => request.fullpath)) %></h3>
+    <h3 id="newcomment"><%= raw t(".login_to_leave_a_comment", :login_link => link_to(t(".login"), :controller => 'users', :action => 'login', :referer => request.fullpath)) %></h3>
   <% end %>
 </div>
 
index 4b5ae4a8f471c3fb44a178b32f5a3224805a656b..5cb99f2f16eb9ad2ecfd4bea804286673208d9cd 100644 (file)
@@ -2,9 +2,9 @@
   <% comments.each do |comment| %>
     <div class="comment">
       <div style="float:left">
-        <%= link_to user_thumbnail(comment.user), user_path(comment.user.display_name) %>
+        <%= link_to user_thumbnail(comment.user), user_path(comment.user) %>
       </div>
-      <b> <%= link_to comment.user.display_name, user_path(comment.user.display_name) %> </b> <br/>
+      <b> <%= link_to comment.user.display_name, user_path(comment.user) %> </b> <br/>
       <%= comment.body %>
     </div>
     <span class="deemphasize">
index b499288a2446d4059afcc8ea5ed0f415ade6c460..427cbe9091a5b06c78a091b10c126a15bd34d246 100644 (file)
@@ -1,9 +1,9 @@
 <% reports.each do |report| %>
   <div class="report">
     <div style="float:left">
-      <%= link_to user_thumbnail(report.user), user_path(report.user.display_name) %>
+      <%= link_to user_thumbnail(report.user), user_path(report.user) %>
     </div>
-    <%= t ".reported_by_html", :category => report.category, :user => link_to(report.user.display_name, user_path(report.user.display_name)) %>
+    <%= t ".reported_by_html", :category => report.category, :user => link_to(report.user.display_name, user_path(report.user)) %>
     <br/>
     <span class="deemphasize">
       <%= t(".updated_at", :datetime => l(report.updated_at.to_datetime, :format => :friendly)) %>
index e5e7ebc001113fa7b0ed266f4f2949c73a7e771d..bfb11ee5bfe907ba48a872ca8b6b29faa17f276e 100644 (file)
         <td><%= t ".states.#{issue.status}" %></td>
         <td><%= link_to t(".reports_count", :count => issue.reports_count), issue %></td>
         <td><%= link_to reportable_title(issue.reportable), reportable_url(issue.reportable) %></td>
-        <td><%= link_to issue.reported_user.display_name, user_path(issue.reported_user.display_name) if issue.reported_user %></td>
+        <td><%= link_to issue.reported_user.display_name, user_path(issue.reported_user) if issue.reported_user %></td>
         <td>
           <% if issue.user_updated %>
-            <%= t ".last_updated_time_user_html", :user => link_to(issue.user_updated.display_name, user_path(issue.user_updated.display_name)),
+            <%= t ".last_updated_time_user_html", :user => link_to(issue.user_updated.display_name, user_path(issue.user_updated)),
                                                   :time => distance_of_time_in_words_to_now(issue.updated_at),
                                                   :title => l(issue.updated_at) %>
           <% else %>
index 1d294dc82222c25b75194e97c406d97c0295d49c..56c3051b2884daaf7415a75c37afd68caba8aa3c 100644 (file)
@@ -3,6 +3,7 @@
   <meta name="viewport" content="width=device-width, minimum-scale=1.0, maximum-scale=1.0"/>
   <!--[if lt IE 9]><%= javascript_include_tag "html5shiv" %><![endif]-->
   <%= javascript_include_tag "application" %>
+  <%= javascript_include_tag "i18n/" + I18n.locale.to_s %>
   <%= stylesheet_link_tag "screen-#{dir}", :media => "screen" %>
   <%= stylesheet_link_tag "print-#{dir}", :media => "print" %>
   <%= stylesheet_link_tag "leaflet-all", :media => "screen, print" %>
index 6511fb17f11509822523ea8df5f6a059083c8ad9..e17c6a77be4cdfff11fc6444cdae7292b53515a4 100644 (file)
           <li>
             <%= link_to inbox_messages_path do %>
               <span class='count-number'><%= number_with_delimiter(current_user.new_messages.size) %></span>
-              <%= t('user.view.my messages') %>
+              <%= t('users.show.my messages') %>
             <% end %>
           </li>
           <li>
-            <%= link_to t('user.view.my profile'), user_path(:display_name => current_user.display_name) %>
+            <%= link_to t('users.show.my profile'), user_path(current_user) %>
           </li>
           <li>
-            <%= link_to t('user.view.my settings'), :controller => 'user', :action => 'account', :display_name => current_user.display_name %>
+            <%= link_to t('users.show.my settings'), :controller => 'users', :action => 'account', :display_name => current_user.display_name %>
           </li>
           <li class="divider"></li>
           <li>
index 534ff13c019117aedb8a9e1c76e769247d25ba75..05f070914b2cd7e235fc9f0fd477eca235c749db 100644 (file)
@@ -43,9 +43,8 @@
         <h2><%= t 'layouts.intro_header' %></h2>
         <div class="close-wrap"><span class="icon close"></span></div>
         <p><%= t 'layouts.intro_text' %></p>
-        <p><%= t 'layouts.partners_html',
+        <p><%= t 'layouts.hosting_partners_html',
                :ucl => link_to(t('layouts.partners_ucl'), "https://www.ucl.ac.uk"),
-               :ic => link_to(t('layouts.partners_ic'), "https://www.imperial.ac.uk/"),
                :bytemark => link_to(t('layouts.partners_bytemark'), "https://www.bytemark.co.uk"),
                :partners => link_to(t('layouts.partners_partners'), "https://hardware.openstreetmap.org/thanks/") %>
         </p>
index 1e4cd8934532c2f56a8ed28373bef2db39a575fa..6ed41a0e0bf984eb8296dbf575597d92791dad44 100644 (file)
@@ -2,7 +2,7 @@
   <td class="inbox-sender"><%= link_to h(message_summary.sender.display_name), user_path(message_summary.sender) %></td>
   <td class="inbox-subject"><%= link_to h(message_summary.title), message_path(message_summary) %></td>
   <td class="inbox-sent"><%= l message_summary.sent_on, :format => :friendly %></td>
-  <td class="inbox-mark-unread"><%= button_to t('.unread_button'), mark_message_path(message_summary, :mark => 'unread'), { :remote => true } %></td>
-  <td class="inbox-mark-read"><%= button_to t('.read_button'), mark_message_path(message_summary, :mark => 'read'), { :remote => true } %></td>
-  <td class="inbox-destroy"><%= button_to t('.destroy_button'), destroy_message_path(message_summary, :referer => request.fullpath), { :remote => true } %></td>
+  <td class="inbox-mark-unread"><%= button_to t('.unread_button'), message_mark_path(message_summary, :mark => 'unread'), { :remote => true } %></td>
+  <td class="inbox-mark-read"><%= button_to t('.read_button'), message_mark_path(message_summary, :mark => 'read'), { :remote => true } %></td>
+  <td class="inbox-destroy"><%= button_to t('.destroy_button'), message_path(message_summary, :referer => request.fullpath), { :method => :delete, :remote => true } %></td>
 </tr>
index a9346fb5ee9343879dbcf51ab641f5dfe0fd39c1..028ab135b9ac79d9b931326404796ebefe7c31f7 100644 (file)
@@ -2,5 +2,5 @@
   <td class="inbox-sender"><%= link_to h(sent_message_summary.recipient.display_name), user_path(sent_message_summary.recipient) %></td>
   <td class="inbox-subject"><%= link_to h(sent_message_summary.title), message_path(sent_message_summary) %></td>
   <td class="inbox-sent"><%= l sent_message_summary.sent_on, :format => :friendly %></td>
-  <td class="inbox-destroy"><%= button_to t('.destroy_button'), destroy_message_path(sent_message_summary, :referer => request.fullpath), { :remote => true } %></td>
+  <td class="inbox-destroy"><%= button_to t('.destroy_button'), message_path(sent_message_summary, :referer => request.fullpath), { :method => :delete, :remote => true } %></td>
 </tr>
index e33bc176d107427b31678f9fbe2602111348a119..2c008732c1eb389b411c6df0c3e8e7f3b00631d1 100644 (file)
@@ -4,7 +4,8 @@
 
 <%= error_messages_for 'message' %>
 
-<%= form_for :message, :html => { :class => 'standard-form' }, :url => new_message_path(@message.recipient) do |f| %>
+<%= form_for @message, :html => { :class => 'standard-form' } do |f| %>
+  <%= hidden_field_tag :display_name, @message.recipient.display_name %>
   <fieldset>
     <div class='form-row'>
       <label class="standard-label" for="message_title"><%= t '.subject' %></label>
index 934cfb99a74499a27fa43372fffea2bc5674613d..e3634e232807a9600e6157d41a017e5ffed93784 100644 (file)
@@ -14,9 +14,9 @@
   <div class="richtext"><%= @message.body.to_html %></div>
 
   <div class='message-buttons buttons'>
-    <%= button_to t('.reply_button'), reply_message_path(@message), :class => 'reply-button' %>
-    <%= button_to t('.unread_button'), mark_message_path(@message, :mark => 'unread'), :class => 'mark-unread-button' %>
-    <%= button_to t('.destroy_button'), destroy_message_path(@message), :class => 'destroy-button' %>
+    <%= button_to t('.reply_button'), message_reply_path(@message), :class => 'reply-button' %>
+    <%= button_to t('.unread_button'), message_mark_path(@message, :mark => 'unread'), :class => 'mark-unread-button' %>
+    <%= button_to t('.destroy_button'), message_path(@message), :method => 'delete', :class => 'destroy-button' %>
 
 <% else %>
 
index efb7de7ec995065294fdf243db2f62a8a988e689..d53181c172ef2776e269e5a53ddc1a3d58ce8e8e 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t ".title" %></h1>
 <% end %>
 
-<p><%= raw t(".request_access", :app_name => link_to(@token.client_application.name, @token.client_application.url), :user => link_to(current_user.display_name, :controller => :user, :action => :view, :display_name => current_user.display_name)) %></p>
+<p><%= raw t(".request_access", :app_name => link_to(@token.client_application.name, @token.client_application.url), :user => link_to(current_user.display_name, user_path(current_user))) %></p>
 
 <%= form_tag authorize_url do %>
   <%= hidden_field_tag "oauth_token", @token.token %>
index 702a0243d19f7aaf06e4233b0657b60b21477219..111815c12598eb52de4e35855de19d25a4f2266a 100644 (file)
@@ -32,9 +32,8 @@
 
   <div class='section' id='partners'>
     <h2><div class='icon partners'></div><%= t ".partners_title" %></h2>
-    <p><%= t 'layouts.partners_html',
+    <p><%= t 'layouts.hosting_partners_html',
              :ucl => link_to(t('layouts.partners_ucl'), "https://www.ucl.ac.uk"),
-             :ic => link_to(t('layouts.partners_ic'), "https://www.imperial.ac.uk/"),
              :bytemark => link_to(t('layouts.partners_bytemark'), "https://www.bytemark.co.uk"),
              :partners => link_to(t('layouts.partners_partners'), "https://hardware.openstreetmap.org/thanks/") %>
     </p>
index 9b8b16a6384dbc690068695aaa561bd77c961226..b81e190255a07ef0a0733d43268b40f1bcb16b22 100644 (file)
@@ -3,13 +3,13 @@
   <td class="<%= cl %>">
     <% if STATUS != :gpx_offline %>
       <% if trace.inserted %>
-        <a href="<%= url_for :controller => 'traces', :action => 'view', :id => trace.id, :display_name => trace.user.display_name %>"><img src="<%= url_for :controller => 'traces', :action => 'icon', :id => trace.id, :display_name => trace.user.display_name %>" border="0" alt="" /></a>
+        <a href="<%= url_for :controller => 'traces', :action => 'show', :id => trace.id, :display_name => trace.user.display_name %>"><img src="<%= url_for :controller => 'traces', :action => 'icon', :id => trace.id, :display_name => trace.user.display_name %>" border="0" alt="" /></a>
       <% else %>
         <span class="trace_pending"><%= t '.pending' %></span>
       <% end %>
     <% end %>
   </td>
-  <td class="<%= cl %>"><%= link_to trace.name, { :controller => 'traces', :action => 'view', :display_name => trace.user.display_name, :id => trace.id } %>
+  <td class="<%= cl %>"><%= link_to trace.name, { :controller => 'traces', :action => 'show', :display_name => trace.user.display_name, :id => trace.id } %>
     <span class="trace_summary" title="<%= trace.timestamp %>"> ...
       <% if trace.inserted %>
         (<%= t '.count_points', :count => trace.size.to_s.gsub(/(\d)(?=(\d{3})+$)/,'\1,') %>)
index 6657a33adc53b3a38ff7c93cbba006a30f12cd3e..b5b4a84d667fc9523406607df8f9861169c843e3 100644 (file)
@@ -4,7 +4,7 @@
 
 <img src="<%= url_for :controller => 'traces', :action => 'picture', :id => @trace.id, :display_name => @trace.user.display_name %>">
 
-<%= form_for @trace, :method => :post, :url => { :action => "edit" } do |f| %>
+<%= form_for @trace do |f| %>
 
 <div id='edit-trace-form' class='standard-form'>
   <fieldset>
index 66dad596da9e6f4bbb6678e906c07c9eb007cb23..b17192ec81a1943da715d773817daa1d97ab1335 100644 (file)
@@ -7,22 +7,22 @@ xml.rss("version" => "2.0",
   xml.channel do
     xml.title t(".title")
     xml.description t(".title")
-    xml.link url_for(:controller => :traces, :action => :list, :only_path => false)
+    xml.link url_for(:controller => :traces, :action => :index, :only_path => false)
 
     xml.image do
       xml.url image_url("mag_map-rss2.0.png")
       xml.title t(".title")
       xml.width 100
       xml.height 100
-      xml.link url_for(:controller => :traces, :action => :list, :only_path => false)
+      xml.link url_for(:controller => :traces, :action => :index, :only_path => false)
     end
 
     @traces.each do |trace|
       xml.item do
         xml.title trace.name
 
-        xml.link url_for(:controller => :traces, :action => :view, :id => trace.id, :display_name => trace.user.display_name, :only_path => false)
-        xml.guid url_for(:controller => :traces, :action => :view, :id => trace.id, :display_name => trace.user.display_name, :only_path => false)
+        xml.link url_for(:controller => :traces, :action => :show, :id => trace.id, :display_name => trace.user.display_name, :only_path => false)
+        xml.guid url_for(:controller => :traces, :action => :show, :id => trace.id, :display_name => trace.user.display_name, :only_path => false)
 
         xml.description do
           xml.cdata! render(:partial => "description", :object => trace, :formats => [:html])
similarity index 89%
rename from app/views/traces/list.html.erb
rename to app/views/traces/index.html.erb
index 3cd90f3e7345894f7144212a92caf56c46a30138..0fcaeb6f7e6e8c430bab3797fb9b7e4493ac5452 100644 (file)
@@ -5,11 +5,11 @@
     <li><%= rss_link_to :action => 'georss', :display_name => @display_name, :tag => @tag %></li>
     <li><%= link_to t('.upload_trace'), new_trace_path %></li>
     <% if @tag %>
-      <li><%= link_to t('.see_all_traces'), :controller => 'traces', :action => 'list', :display_name => nil, :tag => nil, :page => nil %></li>
+      <li><%= link_to t('.see_all_traces'), :controller => 'traces', :action => 'index', :display_name => nil, :tag => nil, :page => nil %></li>
       <li><%= link_to t('.see_my_traces'), :action => 'mine', :tag => nil, :page => nil %></li>
     <% else %>
       <% if @display_name %>
-        <li><%= link_to t('.see_all_traces'), :controller => 'traces', :action => 'list', :display_name => nil, :tag => nil, :page => nil %></li>
+        <li><%= link_to t('.see_all_traces'), :controller => 'traces', :action => 'index', :display_name => nil, :tag => nil, :page => nil %></li>
       <% end %>
       <% if current_user && current_user != @target_user %>
         <li><%= link_to t('.see_my_traces'), :action => 'mine', :tag => nil, :page => nil %></li>
similarity index 90%
rename from app/views/traces/view.html.erb
rename to app/views/traces/show.html.erb
index 648160c2f64ed3ad872f01d39624dee16e054082..178cfbe73235d9e677e8407554b55ab42f254dd7 100644 (file)
@@ -40,7 +40,7 @@
     <td><%= t '.tags' %></td>
     <td>
     <% unless @trace.tags.empty? %>
-      <%= raw(@trace.tags.collect { |tag| link_to tag.tag, { :controller => 'traces', :action => 'list', :tag => tag.tag, :id => nil } }.join(", ")) %>
+      <%= raw(@trace.tags.collect { |tag| link_to tag.tag, { :controller => 'traces', :action => 'index', :tag => tag.tag, :id => nil } }.join(", ")) %>
     <% else %>
       <i><%= t '.none' %></i>
     <% end %>
 <% if current_user && (current_user==@trace.user || current_user.administrator? || current_user.moderator?)%>
   <div class="buttons">
     <% if current_user == @trace.user %>
-      <div>
-        <%= button_to t('.edit_track'), trace_edit_path(@trace) %>
-      </div>
+      <%= link_to t('.edit_trace'), edit_trace_path(@trace), :class => "button" %>
     <% end %>
-    <%= button_to t('.delete_track'), { :controller => 'traces', :action => 'delete', :id => @trace.id }, :data => { :confirm => t('.confirm_delete') } %>
+    <%= button_to t('.delete_trace'), { :controller => 'traces', :action => 'delete', :id => @trace.id }, :data => { :confirm => t('.confirm_delete') } %>
   </div>
 <% end %>
similarity index 72%
rename from app/views/user/_contact.html.erb
rename to app/views/users/_contact.html.erb
index 6132833718b417ed0eb1cf901819eccd646d4e07..bcc2faf354bf54f4a1987a20deefd4d815c3c0f4 100644 (file)
       <% if @user.home_lon and @user.home_lat and contact.home_lon and contact.home_lat %>
         <% distance = @user.distance(contact) %>
         <% if distance < 1 %>
-          (<%= t 'user.view.m away', :count => (distance * 1000).round %>)
+          (<%= t 'user.show.m away', :count => (distance * 1000).round %>)
         <% else %>
-          (<%= t 'user.view.km away', :count => distance.round %>)
+          (<%= t 'user.show.km away', :count => distance.round %>)
         <% end %>
       <% end %>
     </p>
     <p>
       <% changeset = contact.changesets.first %>
       <% if changeset %>
-        <%= t('user.view.latest edit', :ago => t('user.view.ago', :time_in_words_ago => time_ago_in_words(changeset.created_at))) %>
+        <%= t('user.show.latest edit', :ago => t('user.show.ago', :time_in_words_ago => time_ago_in_words(changeset.created_at))) %>
         <% comment = changeset.tags['comment'].to_s != '' ? changeset.tags['comment'] : t('browse.no_comment') %>
         "<%= link_to(comment,
                             {:controller => 'browse', :action => 'changeset', :id => changeset.id},
     </p>
 
     <ul class='secondary-actions clearfix deemphasize'>
-      <li><%= link_to t('user.view.send message'), new_message_path(contact) %></li>
+      <li><%= link_to t('users.show.send message'), new_message_path(contact) %></li>
       <li>
         <% if current_user.is_friends_with?(contact) %>
-          <%= link_to t('user.view.remove as friend'), remove_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
+          <%= link_to t('users.show.remove as friend'), remove_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
         <% else %>
-          <%= link_to t('user.view.add as friend'), make_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
+          <%= link_to t('users.show.add as friend'), make_friend_path(:display_name => contact.display_name, :referer => request.fullpath), :method => :post %>
       <% end %>
       </li>
     </ul>
similarity index 66%
rename from app/views/user/_user.html.erb
rename to app/views/users/_user.html.erb
index b1ea3f299c053d4e72e39339d38b8e9dd2b9d0e0..b9b7bc96345b259bece5f30784112788b11de970 100644 (file)
@@ -7,14 +7,14 @@
   <td>
     <p>
       <% if user.creation_ip %>
-        <%= raw t 'user.list.summary',
-            :name => link_to(h(user.display_name), :action => "view", :display_name => user.display_name),
+        <%= raw t 'users.index.summary',
+            :name => link_to(h(user.display_name), user_path(user)),
             :ip_address => link_to(user.creation_ip, :ip => user.creation_ip),
             :date => l(user.creation_time, :format => :friendly)
         %>
       <% else %>
-        <%= raw t 'user.list.summary_no_ip',
-            :name => link_to(h(user.display_name), :action => "view", :display_name => user.display_name),
+        <%= raw t 'users.index.summary_no_ip',
+            :name => link_to(h(user.display_name), user_path(user)),
             :date => l(user.creation_time, :format => :friendly)
         %>
       <% end %>
similarity index 94%
rename from app/views/user/account.html.erb
rename to app/views/users/account.html.erb
index 16fbc46ca828bfc48ab6854beccaf30a9b2ee47d..7638b7a770ed9162be1c78b0c4e7cf5f7e30faf2 100644 (file)
@@ -6,7 +6,7 @@
   <h1><%= t '.my settings' %></h1>
   <ul class='secondary-actions clearfix'>
     <li><%= link_to t('.return to profile'), user_path(current_user) %></li>
-    <li><%= link_to t('user.view.oauth settings'), :controller => 'oauth_clients', :action => 'index' %></li>
+    <li><%= link_to t('users.show.oauth settings'), :controller => 'oauth_clients', :action => 'index' %></li>
   </ul>
 <% end %>
 
@@ -14,7 +14,7 @@
 <%= form_for current_user, :url => { :action => :account }, :method => :post, :html => { :multipart => true, :id => 'accountForm', :class => 'standard-form', :autocomplete => :off } do |f| %>
   <fieldset>
     <div class="form-row">
-      <label class="standard-label"><%= t 'user.new.display name' %></label>
+      <label class="standard-label"><%= t 'users.new.display name' %></label>
       <%= f.text_field :display_name %>
     </div>
   </fieldset>
 
   <fieldset>
     <div class="form-row">
-        <label class="standard-label"><%= t 'user.new.password' %></label>
+        <label class="standard-label"><%= t 'users.new.password' %></label>
       <%= f.password_field :pass_crypt, {:value => '', :autocomplete => :off} %>
     </div>
 
     <div class="form-row">
-      <label class="standard-label"><%= t 'user.new.confirm password' %></label>
+      <label class="standard-label"><%= t 'users.new.confirm password' %></label>
       <%= f.password_field :pass_crypt_confirmation, {:value => '', :autocomplete => :off} %>
     </div>
   </fieldset>
@@ -79,7 +79,7 @@
           <% end %>
         <% else %>
           <%= t '.contributor terms.not yet agreed' %>
-          <%= link_to t('.contributor terms.review link text'), :controller => 'user', :action => 'terms' %>
+          <%= link_to t('.contributor terms.review link text'), :controller => 'users', :action => 'terms' %>
         <% end %>
       </span>
     </div>
similarity index 94%
rename from app/views/user/login.html.erb
rename to app/views/users/login.html.erb
index 21705e358644634d6d3a30d2ac9c23821b5ef2ff..0944d7809868d5f0d1324df6dee01d3b96d5fd74 100644 (file)
@@ -28,7 +28,7 @@
           <%= password_field_tag "password", "", :tabindex => 2 %>
         </div>
         <span class="form-help deemphasize">
-          <%= link_to t('.lost password link'), :controller => 'user', :action => 'lost_password' %>
+          <%= link_to t('.lost password link'), :controller => 'users', :action => 'lost_password' %>
         </span>
       </fieldset>
 
@@ -69,7 +69,7 @@
         <div id='login_openid_url' class='form-row'>
           <label for='openid_url' class="standard-label"><%= raw t '.openid', :logo => openid_logo %></label>
           <%= text_field_tag("openid_url", "", { :tabindex => 3, :class => "openid_url" }) %>
-          <span class="minorNote">(<a href="<%= t 'user.account.openid.link' %>" target="_new"><%= t 'user.account.openid.link text' %></a>)</span>
+          <span class="minorNote">(<a href="<%= t 'users.account.openid.link' %>" target="_new"><%= t 'users.account.openid.link text' %></a>)</span>
         </div>
 
         <div class='form-row'>
similarity index 94%
rename from app/views/user/view.html.erb
rename to app/views/users/show.html.erb
index 0acb3f0145a622e05207d1bb109c18083064e503..7aa3abd2782b958ee8761ca7edf25f7d1d44e052 100644 (file)
@@ -7,7 +7,7 @@
         <!-- Displaying user's own profile page to themself -->
         <ul class='secondary-actions clearfix'>
           <li>
-            <%= link_to t('.my edits'), :controller => 'changeset', :action => 'list', :display_name => current_user.display_name %>
+            <%= link_to t('.my edits'), :controller => 'changeset', :action => 'index', :display_name => current_user.display_name %>
             <span class='count-number'><%= number_with_delimiter(current_user.changesets.size) %></span>
           </li>
           <li>
             <span class='count-number'><%= number_with_delimiter(current_user.traces.size) %></span>
           </li>
           <li>
-            <%= link_to t('.my diary'), :controller => 'diary_entry', :action => 'list', :display_name => current_user.display_name %>
+            <%= link_to t('.my diary'), :controller => 'diary_entry', :action => 'index', :display_name => current_user.display_name %>
             <span class='count-number'><%= number_with_delimiter(current_user.diary_entries.size) %></span>
           </li>
           <li>
             <%= link_to t('.my comments' ), :controller => 'diary_entry', :action => 'comments', :display_name => current_user.display_name %>
           </li>
           <li>
-            <%= link_to t('.my settings'), :controller => 'user', :action => 'account', :display_name => current_user.display_name %>
+            <%= link_to t('.my settings'), :controller => 'users', :action => 'account', :display_name => current_user.display_name %>
           </li>
 
           <% if current_user.blocks.exists? %>
         <ul class='secondary-actions clearfix'>
 
           <li>
-            <%= link_to t('.edits'), :controller => 'changeset', :action => 'list', :display_name => @user.display_name %>
+            <%= link_to t('.edits'), :controller => 'changeset', :action => 'index', :display_name => @user.display_name %>
             <span class='count-number'><%= number_with_delimiter(@user.changesets.size) %></span>
           </li>
           <li>
             <%= link_to t('.notes'), :controller => 'notes', :action=> 'mine' %>
           </li>
           <li>
-            <%= link_to t('.traces'), :controller => 'traces', :action => 'list', :display_name => @user.display_name %>
+            <%= link_to t('.traces'), :controller => 'traces', :action => 'index', :display_name => @user.display_name %>
             <span class='count-number'><%= number_with_delimiter(@user.traces.size) %></span>
           </li>
 
@@ -66,7 +66,7 @@
             <%= link_to t('.send message'), new_message_path(@user) %>
           </li>
           <li>
-            <%= link_to t('.diary'), :controller => 'diary_entry', :action => 'list', :display_name => @user.display_name %>
+            <%= link_to t('.diary'), :controller => 'diary_entry', :action => 'index', :display_name => @user.display_name %>
             <span class='count-number'><%= number_with_delimiter(@user.diary_entries.size) %></span>
           </li>
           <li>
   <% if current_user and @user.id == current_user.id %>
     <% if @user.home_lat.nil? or @user.home_lon.nil? %>
       <div id="map" class="content_map">
-        <p id="no_home_location"><%= raw(t '.if set location', :settings_link => (link_to t('.settings_link_text'), :controller => 'user', :action => 'account', :display_name => current_user.display_name)) %></p>
+        <p id="no_home_location"><%= raw(t '.if set location', :settings_link => (link_to t('.settings_link_text'), :controller => 'users', :action => 'account', :display_name => current_user.display_name)) %></p>
       </div>
     <% else %>
       <% content_for :head do %>
index 9065ed8e35b83518a9291393c5c45329876f731b..b7e60eb4fd9ad352854f96bcee53fa52d3518afc 100644 (file)
@@ -52,6 +52,9 @@ Rails.application.configure do
   # Suppress logger output for asset requests.
   config.assets.quiet = true
 
+  # Export translations automatically
+  config.middleware.use I18n::JS::Middleware
+
   # Raises error for missing translations
   # config.action_view.raise_on_missing_translations = true
 
index 14495453866ffa28892422fa47a0e1976c91f512..fa970345f8992064002b761b6e2cfadf5d7e0912 100644 (file)
@@ -1,27 +1,8 @@
-# Split context in several files.
-# By default only one file with all translations is exported and
-# no configuration is required. Your settings for asset pipeline
-# are automatically recognized.
-#
-# If you want to split translations into several files or specify
-# locale contexts that will be exported, just use this file to do
-# so.
-#
-# If you're going to use the Rails 3.1 asset pipeline, change
-# the following configuration to something like this:
-#
-#   translations:
-#     - file: "app/assets/javascripts/i18n/translations.js"
-#
-# If you're running an old version, you can use something
-# like this:
-#
-#   translations:
-#     - file: "public/javascripts/translations.js"
-#       only: "*"
-#
+export_i18n_js: false
+
 translations:
-  - file: "app/assets/javascripts/i18n/translations.js"
+  - file: "app/assets/javascripts/i18n/%{locale}.js"
+    pretty_print: true
     only:
     - "*.date"
     - "*.time"
@@ -33,3 +14,7 @@ translations:
     - "*.diary_entry.edit.marker_text"
     - "*.layouts.project_name.title"
     - "*.geocoder.search_osm_nominatim.*"
+  - file: "app/assets/javascripts/i18n/embed.js"
+    pretty_print: true
+    only:
+    - "*.javascripts.embed.*"
index 5f8a4de5ff6d792bd18edef0fad024506093bc28..7bd35daf6acaa08322599b59b6589ac68461ae4c 100644 (file)
@@ -13,7 +13,7 @@ Rails.application.config.assets.paths << Rails.root.join("config")
 # application.js, application.css, and all non-JS/CSS in the 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 login.js diary_entry.js messages.js edit/*.js]
+Rails.application.config.assets.precompile += %w[user.js login.js diary_entry.js messages.js edit/*.js i18n/*.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]
index 89ff677fb2c4aeacd53ebf06ae9cca24ffa02bd4..b4399a9f868348640deece25f915345fda95fe5a 100644 (file)
@@ -5,6 +5,7 @@ module I18n
         super
       rescue InvalidPluralizationData => ex
         raise ex unless ex.entry.key?(:other)
+
         ex.entry[:other]
       end
     end
index 421ca2bf9395f503e1f72582aaf201633a877375..122c2e6513838eb90b609c15701592193a65c049 100644 (file)
@@ -52,6 +52,7 @@ module OpenStreetMap
     def oauth1_verify(request, options = {}, &block)
       signature = OAuth::Signature.build(request, options, &block)
       return false unless OauthNonce.remember(signature.request.nonce, signature.request.timestamp)
+
       value = signature.verify
       if request.ssl? && !value
         http_request = request.dup
index 65996983fe5ca8bc47aee57d1a5eef45a78a6588..a7e22486be30795e32fb5d795ebb5a063773e4f7 100644 (file)
@@ -1,6 +1,7 @@
 files:
   - "**/*.js"
 exclude_paths:
+  - "app/assets/javascripts/i18n"
   - "vendor/assets/javascripts"
 options:
   eqeqeq: true
index e93cf5949cc723a2c073583b9728ff8a845619f4..16eac7f5eceee69a32eb711de3a0015568383e73 100644 (file)
@@ -222,7 +222,7 @@ af:
       user: Gebruiker
       comment: Opmerking
       area: Gebied
-    list:
+    index:
       title: Wysigingsstel
       empty: Geen wysigingstelle gevind nie.
       empty_area: Geen wysigingstelle in hierdie gebied.
@@ -243,7 +243,7 @@ af:
     new:
       title: Nuwe dagboekinskrywing
       publish_button: Publiseer
-    list:
+    index:
       title: Gebruikersdagboeke
       title_friends: Dagboeke van vriende
       title_nearby: Gebruikers in die omgewing se dagboeke
@@ -266,7 +266,7 @@ af:
       use_map_link: benut kaart
       save_button: Stoor
       marker_text: Ligging van dagboekinskrywing
-    view:
+    show:
       title: '%{user} se dagboek | %{title}'
       user_title: '%{user} se dagboek'
       leave_a_comment: Lewer kommentaar
@@ -924,6 +924,7 @@ af:
       body: Teks
       send_button: Stuur
       back_to_inbox: Terug na in-vakkie
+    create:
       message_sent: Boodskap is gestuur
     no_such_message:
       title: Geen so 'n boodskap nie
@@ -1040,7 +1041,7 @@ af:
       get_directions_title: Kry rigtingaanwysings tussen twee punte
       from: Vanaf
       to: Na
-      where_am_i: Waar is ek tans?
+      where_am_i: Waar is dié?
       submit_text: Soek
     key:
       table:
@@ -1169,7 +1170,7 @@ af:
       visibility_help: wat beteken dit?
     trace_optionals:
       tags: Merkers
-    view:
+    show:
       title: Besigtig spoor %{name}
       heading: Besigtig spoor %{name}
       pending: HANGEND
@@ -1184,8 +1185,8 @@ af:
       description: 'Beskrywing:'
       tags: 'Merkers:'
       none: Geen
-      edit_track: Wysig hierdie spoor
-      delete_track: Verwyder hierdie spoor
+      edit_trace: Wysig hierdie spoor
+      delete_trace: Verwyder hierdie spoor
       trace_not_found: Spoor onverkrygbaar!
       visibility: 'Sigbaarheid:'
     trace_paging_nav:
@@ -1205,7 +1206,7 @@ af:
       by: deur
       in: in
       map: kaart
-    list:
+    index:
       public_traces: Openbare GPS-spore
       public_traces_from: Openbare GPS-spore van %{user}
       tagged_with: gemerk met %{tags}
@@ -1272,7 +1273,7 @@ af:
       allow_write_api: wysig die kaart.
     not_found:
       sorry: Jammer, die %{type} blyk onverkrygbaar te wees.
-  user:
+  users:
     login:
       title: Meld aan
       heading: Meld aan
@@ -1339,7 +1340,7 @@ af:
       heading: Die gebruiker %{user} bestaan nie
       body: Daar is geen gebruiker met die naam %{user} nie. Gaan u spelling na, of
         u het moontlik op 'n foutiewe skakel geklik.
-    view:
+    show:
       my diary: My Dagboek
       new diary entry: nuwe dagboekinskrywing
       my edits: My Redigerings
@@ -1450,7 +1451,7 @@ af:
     remove_friend:
       success: '%{name} is uit u vriendekring verwyder.'
       not_a_friend: '%{name} is nie een van u vriende nie.'
-    list:
+    index:
       title: Gebruikers
       heading: Gebruikers
       summary: '%{name} geskep vanaf %{ip_address} op %{date}'
index 6df35fbd1fe1d64f09d65e22317493593e362db2..1e2a4aec33eccaf3f67708196f966415605633c1 100644 (file)
@@ -142,13 +142,13 @@ aln:
       user: Përdorues
       comment: Koment
       area: Zonë
-    list:
+    index:
       title: Changesets
       title_user: Changesets nga %{user}
   diary_entry:
     new:
       title: Hyrja e re Ditari
-    list:
+    index:
       title: ditarë Përdorues ,
       user_title: Ditari i %{user}
       in_language_title: Shënimet e Ditarit në %{language}
@@ -169,7 +169,7 @@ aln:
       use_map_link: Harta e përdorimit
       save_button: Ruje
       marker_text: Vendndodhja Ditari hyrje
-    view:
+    show:
       title: ditari i %{user} | %{title}
       user_title: ditari i %{user}
       leave_a_comment: Lene naj koment
@@ -688,6 +688,7 @@ aln:
       body: Organ
       send_button: Dërgo
       back_to_inbox: Kthehu në postë
+    create:
       message_sent: Mesazhi u dërgu
       limit_exceeded: Ju keni dërguar shumë mesazhe kohët e fundit. Ju lutem prisni
         një kohë para se të dërgoni ndonjë tjetër.
@@ -967,7 +968,7 @@ aln:
       visibility_help: Çka do me than kjo?
     trace_optionals:
       tags: Etiketat
-    view:
+    show:
       title: Duke par gjurmën %{name}
       heading: Tuj i kqyr t'dhanat %{name}
       pending: DUKE PRITUR
@@ -982,8 +983,8 @@ aln:
       description: 'Përshkrimi:'
       tags: 'Etiketat:'
       none: Asnjo
-      edit_track: Ndrysho kët gjurm
-      delete_track: Fshij kët gjurm
+      edit_trace: Ndrysho kët gjurm
+      delete_trace: Fshij kët gjurm
       trace_not_found: Gjurma nuk u gjet!
       visibility: 'Dukshmënia:'
     trace_paging_nav:
@@ -1004,7 +1005,7 @@ aln:
       by: nga
       in: në
       map: harta
-    list:
+    index:
       public_traces: Të dhanat publike të GPS-it
       public_traces_from: Të dhana publike të GPS-it pej %{user}
       tagged_with: ' e etikume me %{tags}'
@@ -1098,7 +1099,7 @@ aln:
       flash: Përditësuar më të dhënat e klientit me sukses
     destroy:
       flash: Shkatërruar kërkesë e klientit regjistrimit
-  user:
+  users:
     login:
       title: Kyçu
       heading: Kycu
@@ -1166,7 +1167,7 @@ aln:
       heading: Ky shfrytzues %{user} nuk egziston
       body: Na vjen keq, ska shfrytëzues me kët emën %{user}. Ju lutemi kontrolloni
         shkrimin, ose nashta linku ku keni kliku asht gabim.
-    view:
+    show:
       my diary: ditari im
       new diary entry: hyrje e re ne ditar
       my edits: ndryshimet e mia
@@ -1290,7 +1291,7 @@ aln:
       not_a_friend: '%{name} nuk osht njoni pi shokve tu.'
     filter:
       not_an_administrator: Ju duhet të jeni administrator për me kry kët veprim.
-    list:
+    index:
       title: Perdoruesit
       heading: Perdoruesit
       showing:
index 48778993de4ef8882095b6bcdd6102a5a628d2a5..1449409ea10872eb4e6b2f697f14b6d7589a957a 100644 (file)
@@ -42,40 +42,40 @@ ar:
     models:
       acl: لائحة التحكم بالوصول
       changeset: حزمة التغييرات
-      changeset_tag: سمة حزمة التغييرات
-      country: البلد/الدولة
+      changeset_tag: وسم مجموعة التغييرات
+      country: البلد
       diary_comment: تعليق يومية
       diary_entry: مدخلة يومية
       friend: صديق
       language: اللغة
       message: الرسالة
       node: عقدة
-      node_tag: سمة عقدة
+      node_tag: وسم عقدة
       notifier: المخطر
       old_node: عقدة قديمة
-      old_node_tag: سمة عقدة قديمة
+      old_node_tag: وسم عقدة قديمة
       old_relation: علاقة قديمة
       old_relation_member: عضو علاقة قديم
-      old_relation_tag: سمة علاقة قديمة
-      old_way: طريق قديم
+      old_relation_tag: وسم علاقة قديمة
+      old_way: طريقةط قديمة
       old_way_node: عقدة طريق قديمة
-      old_way_tag: سمة طريق قديمة
+      old_way_tag: وسم طريق قديم
       relation: علاقة
       relation_member: عضو علاقة
-      relation_tag: سمة علاقة
+      relation_tag: وسم علاقة
       session: جلسة
       trace: أثر
       tracepoint: نقطة أثر
       tracetag: سمة الأثر
       user: المستخدم
       user_preference: تفضيل المستخدم
-      user_token: نموذج المستخدم
-      way: طريق
+      user_token: رمز المستخدم
+      way: طريقة
       way_node: عقدة طريق
       way_tag: سمة طريق
     attributes:
       diary_comment:
-        body: نص الرسالة
+        body: الجسم
       diary_entry:
         user: المستخدم
         title: الموضوع
@@ -97,7 +97,7 @@ ar:
       message:
         sender: المرسل
         title: الموضوع
-        body: نص الرسالة
+        body: الجسم
         recipient: المستلم
       user:
         email: البريد الإلكتروني
@@ -112,11 +112,11 @@ ar:
       name: Potlatch 1
       description: Potlatch 1 (محرّر ضمن المتصفح)
     id:
-      name: Ù\85عرÙ\91Ù\81
-      description: iD (محرِّر عبر المتصفِّح)
+      name: معرف
+      description: معرف (محرر عبر المتصفِّح)
     potlatch2:
       name: Potlatch 2
-      description: Potlatch 2 (محرّر ضمن المتصفح)
+      description: Potlatch 2 (محرر ضمن المتصفح)
     remote:
       name: تحكم عن بعد
       description: تحكم عن بعد (JOSM أو Merkaartor)
@@ -130,12 +130,12 @@ ar:
     edited_by_html: تم التعديل قبل <abbr title='%{title}'>%{time}</abbr> على يد %{user}
     closed_by_html: تم الإغلاق قبل <abbr title='%{title}'>%{time}</abbr> على يد %{user}
     version: الإصدار
-    in_changeset: التغييرات
+    in_changeset: مجموعة التغييرات
     anonymous: مجهول
     no_comment: (لا تعليق)
     part_of: جزء من
-    download_xml: Ø­Ù\85Ù\91ل XML
-    view_history: السجل
+    download_xml: ØªÙ\86زÙ\8aل XML
+    view_history: Ø¹Ø±Ø¶ Ø§Ù\84سجÙ\84
     view_details: شاهد التفاصيل
     location: 'الموقع:'
     changeset:
@@ -175,14 +175,14 @@ ar:
       history_title: 'تاريخ الصلة: %{name}'
       members: الأعضاء
     relation_member:
-      entry_role: '%{type} %{name} كــ %{role}'
+      entry_role: '%{type} %{name} كــ%{role}'
       type:
         node: عقدة
         way: طريق
         relation: علاقة
     containing_relation:
       entry: العلاقة %{relation_name}
-      entry_role: العلاقة %{relation_name} (كــ %{relation_role})
+      entry_role: العلاقة %{relation_name} (كــ%{relation_role})
     not_found:
       sorry: 'عفوًا، تعذر العثور على %{type} #%{id}.'
       type:
@@ -215,11 +215,11 @@ ar:
     tag_details:
       tags: الوسوم
       wiki_link:
-        key: صفحة وصف الويكي لعلامة %{key}
-        tag: صفحة وصف الويكي لعلامة %{key}=%{value}
-      wikidata_link: ØµÙ\81حة %{page} Ø¹Ù\84Ù\89 Ù\88Ù\8aÙ\83Ù\8a Ø¯Ø§ØªØ§
-      wikipedia_link: الـ%{page} مقالة على ويكيبيديا
-      telephone_link: اتصل بـ %{phone_number}
+        key: صفحة وصف الويكي للوسم %{key}
+        tag: صفحة وصف الويكي للوسم %{key}=%{value}
+      wikidata_link: Ø§Ù\84عÙ\86صر %{page} Ø¹Ù\84Ù\89 Ù\88Ù\8aÙ\83Ù\8a Ø¨Ù\8aاÙ\86ات
+      wikipedia_link: مقالة %{page} على ويكيبيديا
+      telephone_link: اتصل بـ%{phone_number}
     note:
       title: 'ملاحظة: %{id}'
       new_note: ملاحظة جديدة
@@ -233,15 +233,16 @@ ar:
       commented_by: تعليق من %{user} قبل <abbr title='%{exact_time}'>%{when} </abbr>
       commented_by_anonymous: تعليق من مجهول قبل <abbr title='%{exact_time}'>%{when}
         </abbr>
-      closed_by: حلّه %{user} قبل <abbr title='%{exact_time}'>%{when} </abbr>
-      closed_by_anonymous: حلّه مجهول قبل <abbr title='%{exact_time}'>%{when} </abbr>
+      closed_by: تم الحل بواسطة %{user} قبل <abbr title='%{exact_time}'>%{when} </abbr>
+      closed_by_anonymous: تم الحل بواسطة مجهول قبل <abbr title='%{exact_time}'>%{when}
+        </abbr>
       reopened_by: أعاد تنشيطه %{user} قبل <abbr title='%{exact_time}'>%{when} </abbr>
       reopened_by_anonymous: أعاد تنشيطه مجهول قبل <abbr title='%{exact_time}'>%{when}
         </abbr>
       hidden_by: أخفاه %{user} قبل <abbr title='%{exact_time}'>%{when} =</abbr>
-      report: أبلغ هذه الملاحظة
+      report: أبلغ عن هذه الملاحظة
     query:
-      title: إشارات الاستفهام
+      title: ميزات الاستفهام
       introduction: اضغط على الخريطة لمعرفة النقاط القريبة
       nearby: نقاط قريبة
       enclosing: نقاط مرافقة
@@ -255,12 +256,12 @@ ar:
       no_edits: (لا تعديلات)
       view_changeset_details: اعرض تفاصيل حزمة التغييرات
     changesets:
-      id: Ø±Ù\82Ù\85
-      saved_at: حُفظ في
+      id: Ø§Ù\84Ù\85عرÙ\81
+      saved_at: حُفِظ في
       user: المستخدم
       comment: التعليق
       area: منطقة
-    list:
+    index:
       title: حزم التغييرات
       title_user: حزم التغييرات بواسطة %{user}
       title_friend: مجموعات تغييرات بواسطة أصدقائي
@@ -270,13 +271,13 @@ ar:
       empty_user: لم يُعثَر على أي حزم تغييرات لهذا المستخدم.
       no_more: لم يُعثَر على حزم تغييرات أخرى.
       no_more_area: لم يُعثَر على حزم تغييرات أخرى في هذه المنطقة.
-      no_more_user: ' يُعثَر على حزم تغييرات أخرى لهذا المستخدم.'
+      no_more_user: لم يُعثَر على حزم تغييرات أخرى لهذا المستخدم.
       load_more: حمِّل المزيد؟
     timeout:
-      sorry: Ø¹Ø°Ø±Ø§Ù\8bØ\8c Ù\84Ù\82د Ø¥Ø³ØªÙ\85رت لائحة حزم التغييرات اللتي طلبتها وقتاً طويلاً للسحب.
+      sorry: Ø¹Ø°Ø±Ø§Ù\8bØ\8c Ù\84Ù\82د Ø§Ø³ØªØºØ±Ù\82ت لائحة حزم التغييرات اللتي طلبتها وقتاً طويلاً للسحب.
     rss:
       title_all: مناقشة مجموعة تغيير خريطة الشارع المفتوحة
-      title_particular: 'مناقشة #%{changeset_id} مجموعة تغيير خريطة الشارع المفتوحة'
+      title_particular: مناقشة مجموعة تغيير خريطة الشارع المفتوحة %{changeset_id}
       comment: 'تعليق جديد على مجموعة التغيير #%{changeset_id} بواسطة %{author}'
       commented_at_html: تم التحديث قبل %{when}
       commented_at_by_html: تم التحديث قبل %{when} بواسطة %{user}
@@ -285,22 +286,22 @@ ar:
     new:
       title: مدخلة يومية جديدة
       publish_button: نشر
-    list:
+    index:
       title: يوميات المستخدمين
       title_friends: يوميات الأصدقاء
-      title_nearby: يوميات/مفكرات المستخدمين في المقبرة
+      title_nearby: يوميات المستخدمين القريبين
       user_title: يومية %{user}
       in_language_title: مدخلات اليومية باللغة %{language}
       new: مدخلة يومية جديدة
       new_title: تأليف إدخال جديد في مذكرات المستخدم الخاصة بي
-      no_entries: لا يوجد مدخلات يومية
-      recent_entries: Ø¥Ø¯Ø®Ø§Ù\84ات Ù\8aÙ\88Ù\85Ù\8aات Ø§Ù\84حدÙ\8aثة
+      no_entries: لا توجد مدخلات يومية
+      recent_entries: إدخالات يوميات حديثة
       older_entries: المدخلات الأقدم
       newer_entries: المدخلات الأحدث
     edit:
-      title: Ø¹Ø¯Ù\91Ù\84 Ù\85دخÙ\84Ø© Ù\8aÙ\88Ù\85Ù\8aØ©
+      title: عدل مدخلة يومية
       subject: 'الموضوع:'
-      body: 'نص الرسالة:'
+      body: 'النص:'
       language: 'اللغة:'
       location: 'الموقع:'
       latitude: 'خط العرض:'
@@ -308,7 +309,7 @@ ar:
       use_map_link: استخدم الخريطة
       save_button: احفظ
       marker_text: موقع مدخلة اليومية
-    view:
+    show:
       title: يوميات %{user} | %{title}
       user_title: يومية %{user}
       leave_a_comment: اترك تعليقًا
@@ -316,26 +317,26 @@ ar:
       login: تسجيل الدخول
       save_button: احفظ
     no_such_entry:
-      title: Ù\85دخÙ\84Ø© Ù\8aÙ\88Ù\85Ù\8aØ© ØºÙ\8aر Ù\85Ù\88جÙ\88دة
-      heading: 'لا يوجد مدخلة بالمعرّف: %{id}'
-      body: عذرًا، لا يوجد مدخلة يومية أو تعليق بالمعرّف %{id}. يرجى تدقيق التهجئة،
-        أو ربما يكون الرابط الذي تم النقر عليه خاطئ.
+      title: Ù\84ا ØªÙ\88جد Ù\85Ø«Ù\84 Ù\87Ø°Ù\87 Ø§Ù\84Ù\8aÙ\88Ù\85Ù\8aة
+      heading: 'لا توجد مدخلة بالمعرف: %{id}'
+      body: عذرًا، لا توجد مدخلة يومية أو تعليق بالمعرف %{id}؛ يُرجَى تدقيق التهجئة،
+        أو ربما يكون الرابط الذي نقرت عليه خاطئا.
     diary_entry:
-      posted_by: أُرسل بواسطة %{link_user} في %{created} باللغة %{language_link}
-      comment_link: Ø¹Ù\84Ù\91Ù\82 Ø¹Ù\84Ù\89 Ù\87Ø°Ù\87 Ø§Ù\84Ù\85دخÙ\84Ø©
-      reply_link: Ø±Ø¯ Ø¨رسالة
+      posted_by: نُشِر بواسطة %{link_user} في %{created} باللغة %{language_link}
+      comment_link: علق على هذه المدخلة
+      reply_link: Ø±Ø¯ Ø¹Ù\84Ù\89 Ù\87Ø°Ù\87 Ø§Ù\84رسالة
       comment_count:
         zero: لا تعليق
         one: '%{count} تعليق'
-        other: '%{count} تعليق'
-      edit_link: Ø¹Ø¯Ù\91Ù\84 Ù\87Ø°Ù\87 Ø§Ù\84Ù\85دخÙ\84Ø©
+        other: '%{count} تعليقات'
+      edit_link: عدل هذه المدخلة
       hide_link: اخفِ هذه المدخلة
-      confirm: Ø£Ù\83Ù\91د
-      report: أببلغ عن هذه المذكرة
+      confirm: ØªØ£Ù\83Ù\8aد
+      report: أبلغ عن هذه المدخلة
     diary_comment:
-      comment_from: تعليق من %{link_user}  في %{comment_created_at}
+      comment_from: تعليق من %{link_user} في %{comment_created_at}
       hide_link: اخفِ هذا التعليق
-      confirm: Ø£Ù\83Ù\91د
+      confirm: ØªØ£Ù\83Ù\8aد
       report: أبلغ عن هذا التعليق
     location:
       location: 'الموقع:'
@@ -343,18 +344,16 @@ ar:
       edit: تعديل
     feed:
       user:
-        title: مدخلات يومية خريطة الشارع المفتوحة للمستخدم %{user}
-        description: المدخلات الحديثة في يومية خريطة الشارع المفتوحة بواسطة المستخدم
-          %{user}
+        title: مدخلات يومية خريطة الشارع المفتوحة للمستخدم ل%{user}
+        description: المدخلات الحديثة في يومية خريطة الشارع المفتوحة من %{user}
       language:
-        title: مدخلات يومية خريطة الشارع المفتوحة باللغة %{language_name}
-        description: المدخلات الحديثة في يومية مستخدمي خريطة الشارع المفتوحة باللغة
-          %{language_name}
+        title: مدخلات يومية خريطة الشارع المفتوحة ب%{language_name}
+        description: المدخلات الحديثة في يومية مستخدمي خريطة الشارع المفتوحة ب%{language_name}
       all:
         title: مدخلات اليومية في خريطة الشارع المفتوحة
         description: المدخلات الحديثة في يومية مستخدمي خريطة الشارع المفتوحة
     comments:
-      has_commented_on: '%{display_name} Ø¹Ù\84Ù\91Ù\82 Ø¹Ù\84Ù\89 Ù\85دخÙ\84ات Ø§Ù\84Ù\8aÙ\88Ù\85Ù\8aØ© Ø§Ù\84تاÙ\84Ù\8aØ©'
+      has_commented_on: '%{display_name} علق على مدخلات اليومية التالية'
       post: إرسال
       when: متى
       comment: التعليق
@@ -377,7 +376,7 @@ ar:
         aerialway:
           cable_car: عربة قطار هوائي
           chair_lift: كرسي تلفريك
-          drag_lift: اسحبها لليسار
+          drag_lift: اسحب لليسار
           gondola: تلفريك
           platter: مصعد تزلج
           pylon: نقطة تعليق
@@ -415,7 +414,7 @@ ar:
           car_sharing: مشاركة سيارات
           car_wash: غسيل سيارات
           casino: نادي قمار
-          charging_station: Ù\85حطة ØªØ¹Ø¨Ø¦Ø©
+          charging_station: Ù\85حطة Ø´Ø­Ù\86
           childcare: رعاية الأطفال
           cinema: سينما
           clinic: عيادة
@@ -447,7 +446,7 @@ ar:
           monastery: دير
           motorcycle_parking: مرآب دراجات نارية
           nightclub: نادي ليلي
-          nursing_home: دار رعاية مسنين/معاقين
+          nursing_home: دار رعاية
           office: مكتب
           parking: موقف سيارات
           parking_entrance: مدخل مرآب
@@ -467,9 +466,9 @@ ar:
           sauna: حمّام بخاري حار
           school: مدرسة
           shelter: ملجأ
-          shop: متجر/دكان/حانوت
+          shop: متجر
           shower: غسيل بالدش
-          social_centre: Ù\85رÙ\83ز Ø¥جتماعي
+          social_centre: Ù\85رÙ\83ز Ø§جتماعي
           social_club: نادي اجتماعي
           social_facility: مرفق اجتماعي
           studio: ستوديو
@@ -482,11 +481,11 @@ ar:
           university: جامعة
           vending_machine: آلة بيع
           veterinary: جراحة بيطرية
-          village_hall: Ù\85بÙ\86Ù\89/دار Ø§Ù\84قرية
+          village_hall: Ù\82اعة قرية
           waste_basket: سلة نفايات
           waste_disposal: التخلص من النفايات
           water_point: موقع مياه
-          youth_centre: مركز نشاطات للشباب
+          youth_centre: مركز شباب
         boundary:
           administrative: حدود إدارية
           census: حدود تعدادية
@@ -504,7 +503,7 @@ ar:
         craft:
           brewery: مصنع الجعة
           carpenter: نجار
-          electrician: اختصاصي كهرباء
+          electrician: كهربائي
           gardener: بستاني
           painter: رسام
           photographer: مصور
@@ -532,7 +531,7 @@ ar:
           emergency_access_point: نقطة دخول طوارئ
           footway: ممر للمشاة
           ford: مخاضة
-          give_way: Ø§Ø´Ø§Ø±Ø© ØªÙ\85Ù\87Ù\84
+          give_way: Ø¥Ø´Ø§Ø±Ø© Ø¥Ù\81ساح Ø§Ù\84طرÙ\8aÙ\82
           living_street: شارع سكني
           milestone: معلم
           motorway: طريق سريع
@@ -544,10 +543,10 @@ ar:
           platform: منصة
           primary: طريق أولي
           primary_link: طريق أولي
-          proposed: طريق تحت الإنشاء
+          proposed: طريق مقترح
           raceway: حلبة سباق
           residential: طريق سكني
-          rest_area: Ù\85Ù\86Ø·Ù\82Ø© Ø¥ستراحة
+          rest_area: Ù\85Ù\86Ø·Ù\82Ø© Ø§ستراحة
           road: طريق
           secondary: طريق ثانوي
           secondary_link: طريق ثانوي
@@ -565,12 +564,12 @@ ar:
           trunk: طريق رئيسي
           trunk_link: طريق رئيسي
           turning_loop: جولة
-          unclassified: Ø·Ø±Ù\8aÙ\82 ØºÙ\8aر Ù\85صÙ\86Ù\91Ù\81
+          unclassified: طريق غير مصنف
           "yes": طريق
         historic:
           archaeological_site: موقع أثري
           battlefield: ساحة معركة
-          boundary_stone: Ø­Ø¬Ø±/صخرة ØªØ¹Ù\84Ù\8aÙ\85 حدود
+          boundary_stone: ØµØ®Ø±Ø© حدود
           building: مبنى تاريخي
           bunker: برج دفاعي
           castle: قلعة
@@ -584,14 +583,14 @@ ar:
           manor: عزبة
           memorial: نصب تذكاري
           mine: منجم
-          mine_shaft: منجم
+          mine_shaft: Ù\81تحة Ù\85Ù\86جÙ\85
           monument: أثر
           roman_road: طريق روماني
           ruins: أطلال
           stone: حجر
           tomb: قبر
           tower: برج
-          wayside_cross: ØµÙ\84Ù\8aب ØªØ°Ù\83ارÙ\8a
+          wayside_cross: ØµÙ\84Ù\8aب Ø¬Ø§Ù\86ب Ø·Ø±Ù\8aÙ\82
           wayside_shrine: مزار جانب طريق
           wreck: حطام
           "yes": موقع تاريخي
@@ -624,10 +623,10 @@ ar:
           reservoir: خزان
           reservoir_watershed: خزان مستجمعات المياه
           residential: منطقة سكنية
-          retail: بيع بالمفرق
+          retail: بيع بالتجزئة
           road: منطقة الطريق
           village_green: أرض خضراء
-          vineyard: كرم عنب
+          vineyard: حقل عنب
           "yes": استخدام الأرض
         leisure:
           beach_resort: شاطئ منتجع
@@ -653,13 +652,13 @@ ar:
           sauna: حمّام بخاري حار
           slipway: مزلقة
           sports_centre: مركز رياضي
-          stadium: مدرج ألعاب رياضية
-          swimming_pool: بركة سباحة
+          stadium: ستاد
+          swimming_pool: مسبح
           track: مضمار سباق
           water_park: منتزه ألعاب مائية
           "yes": وقت الفراغ
         man_made:
-          adit: مدخل الى منجم
+          adit: مدخل منجم
           beacon: منارة
           beehive: خلية نحل
           breakwater: مكسر أمواج
@@ -669,15 +668,15 @@ ar:
           crane: رافعة
           dolphin: مرسى
           dyke: حاجز
-          embankment: Ø³Ø§Ù\8aÙ\84Ù\87
+          embankment: Ø³Ø¯
           flagpole: سارية علم
           gasometer: مقياس غاز
           groyne: مصد أمواج
           kiln: تنور
           lighthouse: منارة
-          mast: Ø­Ø§Ù\81ظة Ø§Ù\86تÙ\8aÙ\86ا
-          mine: Ù\84غم
-          mineshaft: Ù\85Ù\86جÙ\85 Ø£Ù\84غام
+          mast: Ø³Ø§Ø±Ù\8aØ©
+          mine: Ù\85Ù\86جم
+          mineshaft: Ù\81تحة Ù\85Ù\86جم
           monitoring_station: محطة مراقبة
           petroleum_well: بئر بترول
           pier: رصيف بحري
@@ -704,7 +703,7 @@ ar:
         natural:
           bay: خليج
           beach: شاطئ
-          cape: Ø±Ø£Ø³ (أرض Ø¯Ø§Ø®Ù\84Ø© Ù\81Ù\8a Ø§Ù\84بحر(
+          cape: Ø®Ù\84Ù\8aج
           cave_entrance: مدخل كهف
           cliff: جرف
           crater: فوهة بركان
@@ -713,7 +712,7 @@ ar:
           fjord: مضيق بحري
           forest: غابة
           geyser: نافورة ماء حار
-          glacier: نهر/بحر جليدي
+          glacier: نهر جليدي
           grassland: أرض عشبية
           heath: أرض بور
           hill: تلة
@@ -724,7 +723,7 @@ ar:
           mud: وحل
           peak: ذروة
           point: نقطة
-          reef: Ø³Ù\84سÙ\84Ø© ØµØ®Ù\88ر Ù\82رب Ø³Ø·Ø­ Ø§Ù\84Ù\85اء
+          reef: Ø´Ø¹Ø§Ø¨
           ridge: أرض مرتفعة
           rock: صخرة
           saddle: سرج
@@ -1088,9 +1087,9 @@ ar:
     intro_text: إن OpenStreetMap هي خريطة العالم, أنشئت بواسطة أشخاص مثلك وحرة الاستخدام
       برخصة مفتوحة.
     intro_2_create_account: أنشئ حساب مستخدم
-    partners_html: الضيافة مدعومة من %{ucl}, %{ic} و %{bytemark}, و %{partners} آخرون.
+    hosting_partners_html: يتم دعم الاستضافة بواسطة %{ucl} و%{bytemark} و%{partners}
+      آخرين.
     partners_ucl: UCL
-    partners_ic: كلية امبراطورية لندن
     partners_bytemark: استضافة Bytemark
     partners_partners: الشركاء
     osm_offline: حاليًا قاعدة بيانات خريطة الشارع المفتوحة مغلقة بينما يتم الانتهاء
@@ -1243,6 +1242,7 @@ ar:
       body: نص الرسالة
       send_button: أرسل
       back_to_inbox: العودة إلى صندوق الوارد
+    create:
       message_sent: تم إرسال الرسالة
       limit_exceeded: لقد أرسلت الكثير من الرسائل مؤخرًا. الرجاء الانتظار بعض الوقت
         قبل أن تحاول إرسال المزيد.
@@ -1754,6 +1754,7 @@ ar:
       upload_trace: ارفع أثر جي بي إس
       trace_uploaded: لقد تم تحميل ملفك الجي بي إكس ويتنظر الإدراج في قاعدة البيانات.
         وهذا يحدث عادًة خلال نصف ساعة، وسيتم إرسال رسالة إلكترونية لك عند الانتهاء.
+      upload_failed: عذرا، فشل تحميل GPX، تم تنبيه إداري إلى الخطأ، حاول مرة اخرى
       traces_waiting: لديك %{count} أثر في انتظار التحميل. يرجى مراعاة الانتظار قبل
         تحميل أكثر من ذلك، بحيث تتجنب إعاقة طابور التحميل لباقي المستخدمين.
     edit:
@@ -1773,9 +1774,11 @@ ar:
       save_button: احفظ التغييرات
       visibility: 'الرؤية:'
       visibility_help: ماذا يعني هذا؟
+    update:
+      updated: تم تحديث التتبع
     trace_optionals:
       tags: الوسوم
-    view:
+    show:
       title: عرض الأثر %{name}
       heading: عرض الأثر %{name}
       pending: في الانتظار
@@ -1790,8 +1793,8 @@ ar:
       description: 'الوصف:'
       tags: 'الوسوم:'
       none: لا يوجد
-      edit_track: عدل هذا الأثر
-      delete_track: احذف هذا الأثر
+      edit_trace: عدل هذا الأثر
+      delete_trace: احذف هذا الأثر
       trace_not_found: لم يتم العثور على الأثر!
       visibility: 'الرؤية:'
       confirm_delete: احذف هذا الأثر
@@ -1815,7 +1818,7 @@ ar:
       by: مِن قِبَل
       in: في
       map: خريطة
-    list:
+    index:
       public_traces: آثار جي بي إس عمومية
       my_traces: أثري في GPS
       public_traces_from: آثار جي بي إس عمومية من %{user}
@@ -1945,13 +1948,13 @@ ar:
       flash: تم تحديث معلومات العميل بنجاح
     destroy:
       flash: دمّر تسجيل التطبيق
-  user:
+  users:
     login:
       title: تسجيل الدخول
       heading: تسجيل الدخول
       email or username: 'عنوان البريد الإلكتروني أو اسم المستخدم:'
       password: 'كلمة السر:'
-      openid: '%{logo} OpenID:'
+      openid: '%{logo} معرف مفتوح:'
       remember: 'تذكرني:'
       lost password link: أنسيت كلمة المرور؟
       login_button: تسجيل الدخول
@@ -2052,6 +2055,7 @@ ar:
       terms accepted: نشكرك على قبول شروط المساهم الجديدة!
       terms declined: نحن نأسف أن كنت قد قررت عدم قبول شروط المساهمة الجديدة. لمزيد
         من المعلومات، يرجى الاطلاع على <a href="%{url}">صفحة الويكي هذه</a>.
+      terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
     terms:
       title: 'شروط المساهم:'
       heading: 'شروط المساهم:'
@@ -2059,10 +2063,12 @@ ar:
         شروط هذا الاتفاق على مشاركاتك الموجودة حاليًا والمستقبلية.
       consider_pd: وبالإضافة إلى الاتفاقية أعلاه، أريد أن تكون مساهماتي ملكية عامة.
       consider_pd_why: ما هذا؟
+      consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
       guidance: 'معلومات للمساعدة في فهم هذه المصطلحات: <a href="%{summary}"> ملخص
         قابل للقراءة بالإنسان </a> وبعض <a href="%{translations}"> ترجمة غير رسمية
         </a>'
       agree: أوافق
+      declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
       decline: انخفاض
       you need to accept or decline: الرجاء القراءة ومن ثم قبول أو رفض شروط المساهمة
         الجديدة للمتابعة.
@@ -2077,7 +2083,7 @@ ar:
       body: عذرًا، لا يوجد مستخدم بالاسم %{user}. يرجى تدقيق الاسم، أو ربما يكون الرابط
         الذي تم النقر عليه خاطئ.
       deleted: تم حذفه
-    view:
+    show:
       my diary: اليوميات
       new diary entry: مدخلة يومية جديدة
       my edits: المُساهمات
@@ -2179,6 +2185,7 @@ ar:
         review link text: يرجى اتباع هذا الرابط في الوقت الذي يناسبك لمراجعة وقبول
           شروط المساهمة الجديدة.
         agreed_with_pd: وقد أعلنتَ أيضًا أنك تعتبر تعديلاتك ملكية عامة.
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: ما هذا؟
       profile description: 'وصف الملف الشخصي:'
       preferred languages: 'اللغات المفضّلة:'
@@ -2186,6 +2193,7 @@ ar:
       image: "\uFEFFالصورة:"
       gravatar:
         gravatar: استخدام Gravatar
+        link: https://wiki.openstreetmap.org/wiki/Gravatar
         link text: ما هذا؟
         disabled: تم تعطيل Gravatar .
         enabled: تم تمكين عرض Gravatar الخاص بك.
@@ -2248,7 +2256,7 @@ ar:
       not_a_friend: '%{name} ليس من أحد أصدقائك.'
     filter:
       not_an_administrator: عليك أن تكون إداري لتنفيذ هذا الإجراء.
-    list:
+    index:
       title: المستخدمون
       heading: المستخدمون
       showing:
index 002836589c13fec0acf082bc8d1574c2268db602..57cb37b091a179b7b0542c87f8589460ce510a9e 100644 (file)
@@ -75,7 +75,7 @@ arz:
         pass_crypt: كلمه المرور
   browse:
     changeset:
-      title: حزمه التغييرات
+      title: 'حزمه التغييرات: %{id}'
       changesetxml: حزمه التغييرات إكس إم إل
       osmchangexml: osmChange XML
       feed:
@@ -101,10 +101,10 @@ arz:
       load_data: تحميل البيانات
       loading: تحميل...
     tag_details:
-      tags: 'الوسوم:'
+      tags: الوسوم
   changeset:
     changeset_paging_nav:
-      showing_page: Ø¥Ø¸Ù\87ار Ø§Ù\84صÙ\81Ø­Ù\87 %{page}
+      showing_page: الصفحه %{page}
       next: التالى »
       previous: «السابق
     changeset:
@@ -117,13 +117,13 @@ arz:
       user: المستخدم
       comment: التعليق
       area: منطقة
-    list:
+    index:
       title: حزم التغييرات
       title_user: حزم التغييرات بواسطه %{user}
   diary_entry:
     new:
       title: مدخله يوميه جديدة
-    list:
+    index:
       title: يوميات المستخدمين
       user_title: يوميه %{user}
       in_language_title: مدخلات اليوميه باللغه %{language}
@@ -144,7 +144,7 @@ arz:
       use_map_link: استخدم الخريطة
       save_button: احفظ
       marker_text: موقع مدخله اليومية
-    view:
+    show:
       title: يوميات المستخدمين | %{user}
       user_title: يوميه %{user}
       leave_a_comment: اترك تعليقًا
@@ -526,17 +526,17 @@ arz:
   layouts:
     logo:
       alt_text: شعار خريطه الشارع المفتوحة
-    home: Ø§Ù\84صÙ\81Ø­Ù\87 Ø§Ù\84رئÙ\8aسÙ\8aØ©
+    home: Ø±Ù\88Ø­ Ù\84Ù\84صÙ\81Ø­Ù\87 Ø§Ù\84رئÙ\8aسÙ\8aÙ\87
     logout: اخرج
     log_in: دخول
     log_in_tooltip: سجّل الدخول مع حساب موجود
-    sign_up: Ø£Ù\86شئ Ø­Ø³Ø§Ø¨Ù\8bا
+    sign_up: Ø§Ø¹Ù\85Ù\84 Ø­Ø³Ø§Ø¨
     sign_up_tooltip: أنشئ حسابًا كى تستطيع المساهمة
     edit: عدّل هذه الخريطة
     history: تاريخ
     export: صدِّر
     gps_traces: آثار جى بى أس
-    gps_traces_tooltip: Ø¹Ø§Ù\84ج Ø§Ù\84آثار
+    gps_traces_tooltip: Ø§ØªØ­Ù\83Ù\85 Ù\81Ù\89 Ø§Ø«Ø§Ø± GPS
     user_diaries: يوميات المستخدمين
     user_diaries_tooltip: اعرض يوميات المستخدمين
     tag_line: ويكى خريطه العالم الحرة
@@ -581,7 +581,7 @@ arz:
         loaded_successfully: تم تحميل بنجاح %{trace_points} نقطه من أصل %{possible_points}
           نقطه ممكنه.
     signup_confirm:
-      subject: '[خريطه الشارع المفتوحة] أكّد عنوان بريدك الإلكتروني'
+      subject: '[خريطه الشارع المفتوحه] اهلا بيك فى اوبن ستريت ماب'
     email_confirm:
       subject: '[خريطه الشارع المفتوحة] أكّد عنوان بريدك الإلكتروني'
     email_confirm_plain:
@@ -626,6 +626,7 @@ arz:
       body: نص الرسالة
       send_button: أرسل
       back_to_inbox: العوده إلى صندوق الوارد
+    create:
       message_sent: تم إرسال الرسالة
       limit_exceeded: لقد أرسلت الكثير من الرسائل مؤخرًا. الرجاء الانتظار بعض الوقت
         قبل أن تحاول إرسال المزيد.
@@ -798,7 +799,7 @@ arz:
       visibility_help: ماذا يعنى هذا؟
     trace_optionals:
       tags: الوسوم
-    view:
+    show:
       title: عرض الأثر %{name}
       heading: عرض الأثر %{name}
       pending: فى الانتظار
@@ -813,8 +814,8 @@ arz:
       description: 'الوصف:'
       tags: 'الوسوم:'
       none: لا يوجد
-      edit_track: عدّل هذا الأثر
-      delete_track: احذف هذا الأثر
+      edit_trace: عدّل هذا الأثر
+      delete_trace: احذف هذا الأثر
       trace_not_found: لم يتم العثور على الأثر!
       visibility: 'الرؤية:'
     trace:
@@ -831,7 +832,7 @@ arz:
       by: بواسطة
       in: في
       map: خريطة
-    list:
+    index:
       public_traces: آثار جى بى إس عمومية
       public_traces_from: آثار جى بى إس عموميه من %{user}
       tagged_with: ' موسوم مع %{tags}'
@@ -917,7 +918,7 @@ arz:
       flash: تم تحديث معلومات العميل بنجاح
     destroy:
       flash: دمّر تسجيل التطبيق
-  user:
+  users:
     login:
       title: ولوج
       heading: ولوج
@@ -947,7 +948,7 @@ arz:
       flash changed: كلمه المرور الخاصه بك قد تغيرت.
       flash token bad: لم تجد تلك المعلومات، تحقق من الرابط ربما؟
     new:
-      title: Ø£Ù\86شئ حساب
+      title: Ø§Ø¹Ù\85Ù\84 حساب
       no_auto_account_create: للأسف نحن غير قادرين فى الوقت الحالى على إنشاء حساب
         لك تلقائيًا.
       contact_webmaster: يرجى الاتصال <a href="mailto:webmaster@openstreetmap.org">بمسؤول
@@ -971,7 +972,7 @@ arz:
       heading: المستخدم %{user} غير موجود
       body: عذرًا، لا يوجد مستخدم بالاسم %{user}. يرجى تدقيق الاسم، أو ربما يكون الرابط
         الذى تم النقر عليه خاطئ.
-    view:
+    show:
       my diary: يوميتي
       new diary entry: مدخله يوميه جديدة
       my edits: مساهمات
@@ -1027,7 +1028,7 @@ arz:
       public editing:
         heading: 'تعديل عام:'
         enabled: مفعّل. غير مجهول ويمكنك تعديل البيانات.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: ما هذا؟
         disabled: مُعطل ولا يمكن تعديل البيانات، جميع التعديلات السابقه مجهوله الهويه.
         disabled link text: لماذا لا أستطيع التعديل؟
@@ -1053,7 +1054,7 @@ arz:
         بريدك الإلكترونى لمذكره تأكيد العنوان الإلكترونى الجديد.
       flash update success: تم تحديث معلومات المستخدم بنجاح.
     confirm:
-      heading: Ø£Ù\83Ù\91د Ø­Ø³Ø§Ø¨ Ø§Ù\84Ù\85ستخدÙ\85
+      heading: Ø±Ø§Ø¬Ø¹ Ø§Ù\8aÙ\85Ù\8aÙ\84Ù\83!
       press confirm button: اضغط على زر التأكيد أدناه لتنشيط حسابك.
       button: أكّد
       success: تم تأكيد حسابك، شكرًا للاشتراك!
@@ -1062,14 +1063,14 @@ arz:
       press confirm button: اضغط على زر تأكيد أدناه لتأكيد عنوان بريدك الإلكترونى
         الجديد.
       button: أكّد
-      success: ØªÙ\85 ØªØ£Ù\83Ù\8aد Ø¹Ù\86Ù\88اÙ\86 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\89Ø\8c Ø´Ù\83رÙ\8bا Ù\84Ù\84اشتراÙ\83!
+      success: ØªÙ\85 ØªØ£Ù\83Ù\8aد ØªØºÙ\8aÙ\8aر Ø¹Ù\86Ù\88اÙ\86 Ø¨Ø±Ù\8aدÙ\83 Ø§Ù\84Ø¥Ù\84Ù\83ترÙ\88Ù\86Ù\89!
       failure: عنوان بريد إلكترونى تم تفعيله مسبقًا بهذه البيانات.
     set_home:
       flash success: موقع المنزل حُفظ بنجاح
     go_public:
       flash success: جميع تعديلاتك الآن عامه، ومسموح لك بالتعديل الآن.
     make_friend:
-      success: '%{name} الآن صديقك.'
+      success: '%{name} الآن صديقك!'
       failed: عفوًا، تعذر إضافه %{name} كصديق.
       already_a_friend: حاليًا أنت و %{name} أصدقاء.
     remove_friend:
index 9e4efc1a4bcd58fc20d1c1f4da9e4236cd268611..4ec26908a708b9f972a45872f6e305133cada268 100644 (file)
@@ -233,7 +233,7 @@ ast:
       user: Usuariu
       comment: Comentariu
       area: Área
-    list:
+    index:
       title: Conxuntos de cambeos
       title_user: Conxuntos de cambeos de %{user}
       title_friend: Conxuntos de cambeos de los mios collacios
@@ -259,7 +259,7 @@ ast:
     new:
       title: Nueva entrada del diariu
       publish_button: Espublizar
-    list:
+    index:
       title: Diarios d'usuarios
       title_friends: Diarios de collacios
       title_nearby: Diarios d'usuarios cercanos
@@ -282,7 +282,7 @@ ast:
       use_map_link: usar mapa
       save_button: Guardar
       marker_text: Allugamientu de la entrada del diariu
-    view:
+    show:
       title: Diariu de %{user} | %{title}
       user_title: Diariu de %{user}
       leave_a_comment: Dexar un comentariu
@@ -1013,14 +1013,17 @@ ast:
       categories:
         diary_entry:
           spam_label: Esta entrada del diariu ye/contien spam
+          offensive_label: Esta entrada del diariu ye picardiosa/ofensible
           threat_label: Esta entrada del diariu contien una amenaza
           other_label: Otros
         diary_comment:
           spam_label: Esti comentariu del diariu ye/contien spam
+          offensive_label: Esti comentariu del diariu ye picardiosu/ofensible
           threat_label: Esti comentariu del diariu contien una amenaza
           other_label: Otros
         user:
           spam_label: Esti perfil d'usuariu ye/contien spam
+          offensive_label: Esti perfil d'usuariu ye picardiosu/ofensible
           threat_label: Esti perfil d'usuariu contien una amenaza
           vandal_label: Esti usuariu ye un vándalu
           other_label: Otros
@@ -1058,10 +1061,7 @@ ast:
     intro_text: OpenStreetMap ye un mapa del mundu, creáu por persones como tu y d'usu
       llibre baxo una llicencia abierta.
     intro_2_create_account: Crear una cuenta d'usuariu
-    partners_html: L'agospiamientu tien l'encontu de %{ucl}, %{bytemark}, %{ic}, y
-      otros %{partners}.
     partners_ucl: UCL
-    partners_ic: Imperial College de Londres
     partners_bytemark: Bytemark Hosting
     partners_partners: asociaos
     osm_offline: La base de datos d'OpenStreetMap anguaño ta desconectada mentanto
@@ -1220,6 +1220,7 @@ ast:
       body: Cuerpu
       send_button: Unviar
       back_to_inbox: Tornar al buzón d'entrada
+    create:
       message_sent: Mensaxe unviáu
       limit_exceeded: Últimamente unviasti abondos mensaxes. Has d'esperar daqué enantes
         de poder unviar más.
@@ -1724,6 +1725,8 @@ ast:
       trace_uploaded: El to ficheru GPX se xubió y ta esperando p'amestase a la base
         de datos. De vezu, esto tendría d'asoceder en media hora, y se t'unviará un
         corréu al completase.
+      upload_failed: Sentímoslo, falló la carga del GPX. Avisóse del error a un alministrador.
+        Tenta nuevamente.
       traces_waiting: '{PLURAL|one=Tien %{count} traza esperando pa xubir. Considere
         esperar a qu''esta termine enantes de xubir más, col envís de nun bloquiar
         la cola pa otros usuarios.|Tien %{count} traces esperando pa xubir. Considere
@@ -1746,9 +1749,11 @@ ast:
       save_button: Guardar cambeos
       visibility: 'Visibilidá:'
       visibility_help: ¿qué ye esto?
+    update:
+      updated: Xubióse la traza
     trace_optionals:
       tags: Etiquetes
-    view:
+    show:
       title: Amosando la traza %{name}
       heading: Amosando la traza %{name}
       pending: PENDIENTE
@@ -1763,8 +1768,8 @@ ast:
       description: 'Descripción:'
       tags: 'Etiquetes:'
       none: Dengún
-      edit_track: Editar esta traza
-      delete_track: Desaniciar esta traza
+      edit_trace: Editar esta traza
+      delete_trace: Desaniciar esta traza
       trace_not_found: ¡Nun s'alcontró la traza!
       visibility: 'Visibilidá:'
       confirm_delete: ¿Desaniciar esta traza?
@@ -1788,7 +1793,7 @@ ast:
       by: por
       in: en
       map: mapa
-    list:
+    index:
       public_traces: Traces GPS públiques
       my_traces: Les mios traces GPS
       public_traces_from: Traces GPS públiques de %{user}
@@ -1924,7 +1929,7 @@ ast:
       flash: S'anovó la información del cliente correutamente
     destroy:
       flash: Se destruyó'l rexistru de l'aplicación cliente
-  user:
+  users:
     login:
       title: Entrar
       heading: Entrar
@@ -2059,7 +2064,7 @@ ast:
       body: Lo siento, nun hai dengún usuariu col nome %{user}. Comprueba la escritura
         o si calcasti nun enllaz enquivocáu.
       deleted: desaniciao
-    view:
+    show:
       my diary: El mio diariu
       new diary entry: nueva entrada del diariu
       my edits: Les mios ediciones
@@ -2240,7 +2245,7 @@ ast:
       not_a_friend: '%{name} nun ye unu de los tos amigos.'
     filter:
       not_an_administrator: Has de ser alministrador pa facer esa aición.
-    list:
+    index:
       title: Usuarios
       heading: Usuarios
       showing:
index 4ca07644beed8beed3cf73bcfc0d3c9ecdfd9f8c..a7a01cdd2ac7eb6bd62fdbe3aaea0c5d54f2e98d 100644 (file)
@@ -113,10 +113,13 @@ az:
     anonymous: anonim
     no_comment: (şərhsiz)
     download_xml: XML endir
+    view_history: Tarixçəyə bax
+    view_details: Xüsusiyyətlərə bax
     location: 'Yerləşməsi:'
     changeset:
       title: 'Dəyişikliklər dəsti: %{id}'
       belongs_to: Müəllif
+      node: (%{count}) nöqtə
       changesetxml: XML dəyişikliklər dəsti
       osmchangexml: osmChange XML
       feed:
@@ -182,7 +185,7 @@ az:
       user: İstifadəçi
       comment: Şərh
       area: Ərazi
-    list:
+    index:
       title: Dəyişikliklər dəsti
       title_user: '%{user} tərəfindən edilmiş dəyişikliklər dəsti'
       title_friend: Dostlarınız tərəfindən edilmiş dəyişikliklər dəsti
@@ -195,7 +198,8 @@ az:
   diary_entry:
     new:
       title: Yeni Gündəlik Yazısı
-    list:
+      publish_button: Nəşr et
+    index:
       title: İstifadəçi gündəlikləri
       title_friends: Dostların gündəlikləri
       title_nearby: Yaxınlıqdakı İstifadəçilərin Gündəlikləri
@@ -218,7 +222,7 @@ az:
       use_map_link: xəritə üzərində göstər
       save_button: Qeyd et
       marker_text: Gundəlik yazısının yazıldığı yer
-    view:
+    show:
       title: İstifadəçi %{user} gündəliyi | %{title}
       user_title: İstifadəçi %{user} gündəliyi
       leave_a_comment: Şərh yaz
@@ -281,7 +285,10 @@ az:
           aerodrome: Aerodrom
           apron: Perron
           gate: Enmə zonasına çıxış
+          hangar: Anqar
           helipad: Vertalyot meydançası
+          holding_position: Gözləmə yeri
+          parking_position: Parkinq yeri
           runway: Uçuş-enmə zolağı
           taxiway: Sürmə yolu
           terminal: Terminal
@@ -306,6 +313,7 @@ az:
           charging_station: Şarj Stansiyası
           cinema: Kinoteatr
           clinic: Klinika
+          clock: Saat
           college: Kollec
           community_centre: İctimai mərkəz
           courthouse: Məhkəmə yeri
@@ -321,6 +329,7 @@ az:
           food_court: Açıq havada Yeməkxana
           fountain: Fontan
           fuel: Yanacaq doldurma
+          gambling: Oyun evi
           grave_yard: Qəbirsanlıq
           hospital: Qospital
           hunting_stand: Ov stendi
@@ -328,10 +337,12 @@ az:
           kindergarten: Uşaq bağçası
           library: Kitabxana
           marketplace: Bazar meydanı
+          monastery: Monastr
           nightclub: Gecə klubu
           nursing_home: Qocalar evi
           office: Ofis
           parking: Dayanacaq
+          parking_space: Parkinq ərazisi
           pharmacy: Aptek
           place_of_worship: Sitayişgah
           police: Polis
@@ -377,15 +388,38 @@ az:
           "yes": Körpü
         building:
           "yes": Tikili
+        craft:
+          brewery: Pivə zavodu
+          carpenter: Dülgər
+          electrician: Elektrik
+          gardener: Bağban
+          painter: Malyar
+          photographer: Fotoqraf
+          plumber: Santexnik
+          shoemaker: Pinəçi
+          tailor: Dərzi
+          "yes": Sənətkar Dükanı
+        emergency:
+          ambulance_station: Təcili tibbi yardım məntəqəsi
+          assembly_point: Yığışma nöqtəsi
+          defibrillator: Defibrilliyator
+          landing_site: Qəza Eniş Yeri
+          phone: Fövqəladə hallar üçün telefon
+          water_tank: Fövqəladə hallar üçün su çəni
+          "yes": Fövqəladə hallar üçün
         highway:
+          abandoned: İstifadəsiz Yol
           bridleway: Atlı yolu
           bus_guideway: Gəzinti Avtobus xətti
           bus_stop: Avtobus dayanacağı
           construction: Yol təmirdədir
+          corridor: Koridor
           cycleway: Velocığır
+          elevator: Lift
           emergency_access_point: Təcili yardım məntəqəsi
           footway: Tratuar (Piyada yolu)
           ford: Çay keçidi
+          give_way: Yol Ver işarəsi
           living_street: Yaşayış küçəsi
           milestone: Məsafə dirəyi
           motorway: Avtomagistral
@@ -396,6 +430,7 @@ az:
           platform: Platforma
           primary: Birinci dərəcəli yol
           primary_link: Birinci dərəcəli yol
+          proposed: Layihələşdirilən Yol
           raceway: Otüş yolu
           residential: Küçə
           rest_area: Dincəlmə güşəsi
@@ -406,18 +441,23 @@ az:
           services: Yolətrafı Servislər
           speed_camera: Sürət kamerası
           steps: Pilləkənlər
+          stop: Dur İşarəsi
+          street_lamp: Küçə fənəri
           tertiary: Üçüncü dərəcəli yol
           tertiary_link: Üçüncü dərəcəli yol
           track: Torpaq yol
+          traffic_signals: Svetafor
           trail: Cığır
           trunk: Baş yol
           trunk_link: Baş yol
           unclassified: Təsnifatsız yol
+          "yes": Yol
         historic:
           archaeological_site: Arxeoloji qazıntılar
           battlefield: Döyüş meydanı
           boundary_stone: Sərhəd daşı
-          building: Tikili
+          building: Tarixi Tikili
+          bunker: Bunker
           castle: Qala
           church: Kilsə
           fort: Qala
@@ -730,7 +770,6 @@ az:
     edit_with: '%{editor} köməyi ilə dəyişdir'
     tag_line: Azad Viki Dünya Xəritəsi
     intro_2_create_account: İstifadəçi hesabı yarat
-    partners_ic: London İmperial Kolleci tərəfindən
     partners_bytemark: Bytemark Hosting
     partners_partners: partnyorlar
     help: Kömək
@@ -804,6 +843,7 @@ az:
       body: 'Mətn:'
       send_button: Göndər
       back_to_inbox: Gələnlərə geri qayıt
+    create:
       message_sent: Mesaj göndərildi
       limit_exceeded: Siz yaxın vaxtlarda çoxlu mesaj göndərmisiniz. Göndərməzdən
         əvvəl bir az gözləyin.
@@ -968,7 +1008,7 @@ az:
       owner: 'Sahibi:'
       description: 'İzah:'
       save_button: Dəyişiklikləri yadda saxla
-    view:
+    show:
       filename: 'Fayl adı:'
       download: yüklə
       start_coordinates: 'Başlanğıc koordinatları:'
@@ -990,7 +1030,7 @@ az:
       revoke: Ləğv et!
     form:
       name: Ad
-  user:
+  users:
     login:
       title: Daxil olun
       heading: Daxil olun
@@ -1032,7 +1072,7 @@ az:
       legale_names:
         france: Fransa
         italy: İtaliya
-    view:
+    show:
       my diary: mənim gündəliyim
       my edits: mənim redaktələrim
       my comments: mənim şərhlərim
@@ -1088,7 +1128,7 @@ az:
     remove_friend:
       heading: '%{user} dostluqdan silək?'
       button: Dostluqdan sil
-    list:
+    index:
       title: İstifadəçilər
       heading: İstifadəçilər
       hide: Seçilmiş istifadəçiləri gizlət
index 4d4c3c5adcd9ae2b3212e7c5a13374a32f0b778a..3a1e75b61dfb77089596ace119405f54ec2cb3cb 100644 (file)
@@ -245,7 +245,7 @@ ba:
       user: Ҡулланыусы
       comment: Комментарий
       area: Өлкә
-    list:
+    index:
       title: Төҙәтеүҙәр пакеты
       title_user: ' %{user} ҡулланыусыһының төҙәтеүҙәр пакеты'
       title_friend: Дуҫтарығыҙҙың төҙәтеүҙәре пакеты
@@ -271,7 +271,7 @@ ba:
     new:
       title: Яңы көндәлеккә инеү
       publish_button: Баҫтырырға
-    list:
+    index:
       title: Көндәлектәр
       title_friends: Дуҫтарың көндәлектәре
       title_nearby: Йәнәш ҡатнашыусылар көндәлеге
@@ -291,7 +291,7 @@ ba:
       use_map_link: картаны ҡуллан
       save_button: Һаҡларға
       marker_text: Көндәлек яҙыу урыны
-    view:
+    show:
       title: '%{ҡулланыусы}ның көндәлеге|%{титул}'
       user_title: '%{ҡулланыусы}ның көндәлеге'
       leave_a_comment: Фекер ҡалдыр
index 17687c4172adcfe09b5fd8657990833824ee206f..41a46639a5c479e175d090038bc665467f73450d 100644 (file)
@@ -172,7 +172,7 @@ be-Tarask:
       user: Карыстальнік
       comment: Камэнтар
       area: Абшар
-    list:
+    index:
       title: Наборы зьменаў
       title_user: Набор зьменаў %{user}
       title_friend: Наборы зьменаў маіх сяброў
@@ -183,7 +183,7 @@ be-Tarask:
   diary_entry:
     new:
       title: Новы запіс у дзёньніку
-    list:
+    index:
       title: Дзёньнікі карыстальнікаў
       title_friends: Дзёньнікі сяброў
       title_nearby: Дзёньнікі суседніх удзельнікаў
@@ -206,7 +206,7 @@ be-Tarask:
       use_map_link: на мапе
       save_button: Захаваць
       marker_text: Месцазнаходжаньне запісу дзёньніка
-    view:
+    show:
       title: Дзёньнік %{user} | %{title}
       user_title: Дзёньнік %{user}
       leave_a_comment: Пакінуць камэнтар
@@ -667,9 +667,7 @@ be-Tarask:
     edit_with: Рэдагаваць праз %{editor}
     tag_line: Вольная Wiki-мапа сьвету
     intro_2_create_account: Стварыце рахунак
-    partners_html: Гостынг падтрымліваецца %{ucl}, %{bytemark}, %{ic} і іншымі %{partners}.
     partners_ucl: UCL
-    partners_ic: Лёнданскім імпэрскім каледжам
     osm_offline: База зьвестак OpenStreetMap у цяперашні момант недаступная, таму
       што праводзяцца неабходныя тэхнічныя работы.
     osm_read_only: База зьвестак OpenStreetMap у цяперашні момант даступная толькі
@@ -772,6 +770,7 @@ be-Tarask:
       body: Тэкст
       send_button: Даслаць
       back_to_inbox: Вярнуцца да ўваходных
+    create:
       message_sent: Паведамленьне дасланае
       limit_exceeded: Вы даслалі шмат паведамленьняў у апошні час. Калі ласка, пачакайце,
         перад тым, як адпраўляць зноў.
@@ -1078,7 +1077,7 @@ be-Tarask:
       visibility_help: што гэта азначае?
     trace_optionals:
       tags: Тэгі
-    view:
+    show:
       title: Прагляд трэку %{name}
       heading: Прагляд трэку %{name}
       pending: ЧАКАЕ
@@ -1093,8 +1092,8 @@ be-Tarask:
       description: 'Апісаньне:'
       tags: 'Тэгі:'
       none: Няма
-      edit_track: Рэдагаваць гэты трэк
-      delete_track: Выдаліць гэты трэк
+      edit_trace: Рэдагаваць гэты трэк
+      delete_trace: Выдаліць гэты трэк
       trace_not_found: Трэк ня знойдзены!
       visibility: 'Бачнасьць:'
     trace_paging_nav:
@@ -1115,7 +1114,7 @@ be-Tarask:
       by: аўтар
       in: у
       map: мапа
-    list:
+    index:
       public_traces: Публічныя GPS-трэкі
       public_traces_from: Публічныя GPS-трэкі ўдзельніка %{user}
       tagged_with: ' пазначаныя %{tags}'
@@ -1211,7 +1210,7 @@ be-Tarask:
       flash: Кліенцкая інфармацыя была абноўленая пасьпяхова
     destroy:
       flash: Зьнішчаная рэгістрацыя кліенцкага дастасаваньня
-  user:
+  users:
     login:
       title: Увайсьці
       heading: Уваход
@@ -1311,7 +1310,7 @@ be-Tarask:
       heading: Удзельнік %{user} не існуе
       body: Прабачце, няма ўдзельніка з іменем %{user}. Калі ласка, праверце дакладнасьць
         напісаньня, ці, магчыма, спасылка па якой Вы перайшлі, няслушная.
-    view:
+    show:
       my diary: Мой дзёньнік
       new diary entry: новы запіс у дзёньніку
       my edits: Мае рэдагаваньні
@@ -1470,7 +1469,7 @@ be-Tarask:
     filter:
       not_an_administrator: Вам неабходна быць адміністратарам, каб выканаць гэтае
         дзеяньне.
-    list:
+    index:
       title: Удзельнікі
       heading: Карыстальнікі
       showing:
index e5f9bb95ccfea9c8cb89dd634b5d7d2e8daaec50..4b3a4e68d0c96dc0d1f4e1475668c92624b2e97f 100644 (file)
@@ -238,7 +238,7 @@ be:
       user: Карыстальнік
       comment: Каментар
       area: Мясцовасць
-    list:
+    index:
       title: Наборы зменаў
       title_user: Набор зменаў ад %{user}
       title_friend: Наборы зменаў ад вашых сяброў
@@ -263,7 +263,7 @@ be:
     new:
       title: Новы запіс дзённіку
       publish_button: Апублікаваць
-    list:
+    index:
       title: Дзённікі карыстальнікаў
       title_friends: Дзённікі сяброў
       title_nearby: Дзённікі карыстальнікаў паблізу
@@ -286,7 +286,7 @@ be:
       use_map_link: карыстацца картай
       save_button: Запісаць
       marker_text: Месцазнаходжанне запісу дзённіку
-    view:
+    show:
       title: Дзённік карыстальніка | %{user}
       user_title: Дзённік %{user}
       leave_a_comment: Пакінуць каментар
@@ -883,9 +883,7 @@ be:
     intro_text: OpenStreetMap - гэта карта свету, створаная людзьмі, як вы, і бясплатная
       для выкарыстання на ўмовах адкрытай ліцэнзіі.
     intro_2_create_account: Стварыць рахунак удзельніка
-    partners_html: Хостынг падтрымліваецца %{ucl}, %{ic} і %{bytemark}, і іншымі %{partners}.
     partners_ucl: UCL
-    partners_ic: Imperial College London
     partners_bytemark: Bytemark Hosting
     partners_partners: партнёрамi
     osm_offline: База дадзеных OpenStreetMap зараз па-за сецівам, таму што праходзіць
@@ -1050,6 +1048,7 @@ be:
       body: Тэкст
       send_button: Даслаць
       back_to_inbox: Вярнуцца да уваходных
+    create:
       message_sent: Паведамленне адпраўлена
       limit_exceeded: Вы адправілі шмат паведамленняў нядаўна. Калі ласка, пачакайце
         некаторы час, перш чым спрабаваць адаслаць наступныя.
@@ -1575,7 +1574,7 @@ be:
       visibility_help: што гэта значыць?
     trace_optionals:
       tags: Тэгі
-    view:
+    show:
       title: Прагляд следу %{name}
       heading: Прагляд следу %{name}
       pending: У ЧАРЗЕ
@@ -1590,8 +1589,8 @@ be:
       description: 'Апісанне:'
       tags: 'Тэгі:'
       none: Няма
-      edit_track: Рэдагаваць гэты след
-      delete_track: Выдаліць гэты след
+      edit_trace: Рэдагаваць гэты след
+      delete_trace: Выдаліць гэты след
       trace_not_found: След не знойдзены!
       visibility: 'Бачнасць:'
     trace_paging_nav:
@@ -1614,7 +1613,7 @@ be:
       by: карыстальнікам
       in: у
       map: карта
-    list:
+    index:
       public_traces: Агульныя GPS-сляды
       public_traces_from: Агульныя GPS-сляды карыстальніка %{user}
       description: Агляд нядаўна дададзеных GPS-слядоў
@@ -1742,7 +1741,7 @@ be:
       flash: Кліенцкая інфармацыя была абноўленая паспяхова
     destroy:
       flash: Знішчаная рэгістрацыя кліенцкага дастасавання
-  user:
+  users:
     login:
       title: Уваход
       heading: Уваход
@@ -1878,7 +1877,7 @@ be:
       body: Прабачце, карыстальнік %{user} не знойдзены. Please check your spelling,
         Калі ласка, праверце свой правапіс, ці, магчыма, вам далі няправільную спасылку.
       deleted: выдалены
-    view:
+    show:
       my diary: Мой дзённік
       new diary entry: новы запіс у дзённіку
       my edits: Мае змены
@@ -2054,7 +2053,7 @@ be:
     filter:
       not_an_administrator: Вам неабходна мець правы адміністратара для выканання
         гэтага дзеяння.
-    list:
+    index:
       title: Удзельнікі
       heading: Удзельнікі
       showing:
index 34d1c1ddb1aff0df019b0798d539f9a5ffa84b2e..6299b5c5ce7cd5f7e4abdf16eccbf070e817f662 100644 (file)
@@ -190,7 +190,7 @@ bg:
       user: Потребител
       comment: Коментар
       area: Област
-    list:
+    index:
       title: Списък с промени
       title_user: Списък с промени на %{user}
       title_friend: Списъци с промени на Ваши приятели
@@ -209,7 +209,7 @@ bg:
     new:
       title: Нов запис в дневника
       publish_button: Публикуване
-    list:
+    index:
       title: Дневници на потребителите
       title_friends: Дневници на приятели
       title_nearby: Дневници на потребители наблизо
@@ -227,7 +227,7 @@ bg:
       longitude: 'Географска дължина:'
       use_map_link: използвай карта
       save_button: Съхраняване
-    view:
+    show:
       title: Дневник на потребител %{user} | %{title}
       user_title: дневник на %{user}
       leave_a_comment: Оставете коментар
@@ -779,6 +779,7 @@ bg:
       subject: Тема
       body: Текст
       send_button: Изпращане
+    create:
       message_sent: Съобщението е изпратено
     no_such_message:
       title: Няма такова съобщение
@@ -1007,7 +1008,7 @@ bg:
       visibility: 'Видимост:'
     trace_optionals:
       tags: Етикети
-    view:
+    show:
       pending: Обработва се
       filename: 'Име на файл:'
       download: изтегляне
@@ -1016,7 +1017,7 @@ bg:
       owner: 'Собственик:'
       description: 'Описание:'
       tags: 'Етикети:'
-      edit_track: Редактиране на тази следа
+      edit_trace: Редактиране на тази следа
       trace_not_found: Следата не е открита!
       visibility: 'Видимост:'
     trace_paging_nav:
@@ -1034,7 +1035,7 @@ bg:
       by: от
       in: в
       map: карта
-    list:
+    index:
       public_traces: Публични GPS-следи
       public_traces_from: Публични GPS-следи от потребител %{user}
       upload_trace: Качете GPS-следа
@@ -1057,7 +1058,7 @@ bg:
     form:
       name: Име
       allow_write_api: промяна на картата.
-  user:
+  users:
     login:
       title: Вписване
       heading: Вписване
@@ -1132,7 +1133,7 @@ bg:
       title: Няма такъв потребител
       heading: Потребителят %{user} не съществува
       deleted: изтрито
-    view:
+    show:
       my edits: Mоите редакции
       my traces: Моите следи
       my notes: Моите бележки
@@ -1206,7 +1207,7 @@ bg:
       heading: Потвърдете смяната на електронната поща
     remove_friend:
       success: '%{name} беше премахнат от списъка с приятелите.'
-    list:
+    index:
       title: Потребители
       heading: Потребители
   user_role:
index d06cfb68a033521b8a0634338647819a1ca02fa6..b248348721fc0fc2c513577adf00b34524b45bd4 100644 (file)
@@ -242,7 +242,7 @@ bn:
       user: ব্যবহারকারী
       comment: মন্তব্য
       area: এলাকা
-    list:
+    index:
       title: পরিবর্তনসমূহ
       title_user: '%{user} দ্বারা পরিবর্তন ধার্য'
       title_friend: আমার বন্ধুদের দ্বারা পরিবর্তনসেট
@@ -268,7 +268,7 @@ bn:
     new:
       title: নতুন দিনলিপির ভুক্তি
       publish_button: প্রকাশ করুন
-    list:
+    index:
       title: ব্যবহারকারীর দিনলিপি
       title_friends: বন্ধুর দিনলিপি
       title_nearby: নিকটবর্তী ব্যবহারকারীর দিনলিপি
@@ -291,7 +291,7 @@ bn:
       use_map_link: মানচিত্র ব্যবহার করুন
       save_button: সংরক্ষণ
       marker_text: দিনলিপির ভুক্তির অবস্থান
-    view:
+    show:
       title: '%{user}-এর দিনলিপি | %{title}'
       user_title: '%{user}-এর দিনলিপি'
       leave_a_comment: মন্তব্য করুন
@@ -858,10 +858,7 @@ bn:
     intro_text: ওপেনস্ট্রীটম্যাপ বিশ্বের, একটি মানচিত্র; যা আপনার মতো মানুষের দ্বারা
       নির্মিত এবং এটি মুক্ত লাইসেন্সের অধীনে বিনামূল্যে ব্যবহারযোগ্য।
     intro_2_create_account: একটি ব্যবহারকারী অ্যাকাউন্ট তৈরি করুন
-    partners_html: হোস্টিং %{ucl}, %{bytemark}, %{ic}, এবং অন্যান্য %{partners} কর্তৃক
-      সমর্থিত।
     partners_ucl: UCL
-    partners_ic: ইম্পেরিয়াল মহাবিদ্যালয় লন্ডন
     partners_partners: সহযোগীগণ
     help: সাহায্য
     about: পরিচিতি
@@ -952,6 +949,7 @@ bn:
       body: মূলাংশ
       send_button: পাঠান
       back_to_inbox: অন্তঃবক্সে ফেরৎ যান
+    create:
       message_sent: বার্তা পাঠানো হয়েছে
       limit_exceeded: সাম্প্রতিক আপনি একগুচ্ছ বার্তা পাঠিয়েছেন। আর কোন বার্তা পাঠানোর
         পূর্বে দয়া করে কিছুক্ষণ অপেক্ষা করুন।
@@ -1185,6 +1183,8 @@ bn:
       trace_uploaded: আপনার জিপিএক্স ফাইলটি আপলোড হয়েছে এবং ডাটাবেইজ এ অন্তর্ভুক্তির
         জন্য অপেক্ষা করছে। সাধারণত, এটি আধা ঘন্টার মধ্যেই সম্পন্ন হয় এবং সমাপ্ত হতেই
         আপনার কাছে একটি ই-মেইল পৌছে যাবে।
+      upload_failed: দুঃখিত, GPX আপলোড ব্যর্থ হয়েছে। একজন প্রশাসককে ত্রুটিটি জানানো
+        হয়েছে। অনুগ্রহপূর্বক আবার চেষ্টা করুন
       traces_waiting: আপনার %{count}টি অনুসরণ আপলোড হতে বাকি আছে। দয়া করে এগুলো আপলোড
         হওয়া পর্যন্ত অপেক্ষা করুন, যেন অন্য ব্যবহারকারীদের অনুসরণ আপলোড করার সুযোগ
         দেয়া যায়।
@@ -1206,7 +1206,7 @@ bn:
       visibility_help: এটার মানে কি?
     trace_optionals:
       tags: ট্যাগসমূহ
-    view:
+    show:
       title: '%{name} অনুসরণটি দেখছেন'
       heading: '%{name} অনুসরণটি দেখছেন'
       pending: অমিমাংসিত
@@ -1221,8 +1221,8 @@ bn:
       description: 'বিবরণ:'
       tags: 'ট্যাগসমূহ:'
       none: কোনটিই নয়
-      edit_track: এই অনুসরণটি সম্পাদনা করুন
-      delete_track: এই অনুসরণটি মুছে ফেলুন
+      edit_trace: এই অনুসরণটি সম্পাদনা করুন
+      delete_trace: এই অনুসরণটি মুছে ফেলুন
       trace_not_found: অনুসরণ পাওযা যায়নি।
       visibility: 'দৃষ্টিযোগ্যতা:'
     trace_paging_nav:
@@ -1241,7 +1241,7 @@ bn:
       trackable: অনুসরণযোগ্য
       by: দ্বারা
       map: মানচিত্র
-    list:
+    index:
       upload_trace: অনুসরণ আপলোড
       see_all_traces: সব অনুসরণগুলো দেখুন
     offline_warning:
@@ -1266,7 +1266,7 @@ bn:
       issued_at: অনুমোদনের তারিখ
     form:
       name: নাম
-  user:
+  users:
     login:
       title: প্রবেশ
       heading: প্রবেশ
@@ -1322,7 +1322,7 @@ bn:
         france: ফ্রান্স
         italy: ইতালি
         rest_of_world: অন্যান্য দেশসমূহ
-    view:
+    show:
       my edits: আমার সম্পাদনা
       my profile: আমার প্রোফাইল
       my settings: আমার সেটিংস
@@ -1381,7 +1381,7 @@ bn:
     go_public:
       flash success: আপনার সকল সম্পাদনা এখন উন্মুক্ত, এবং এখন আপনার সম্পাদনের অনুমতি
         রয়েছে।
-    list:
+    index:
       title: ব্যবহারকারীগণ
       heading: ব্যবহারকারীগণ
     auth_association:
index 8ae969b1b1e7acee2e89dfba202e0686a0ca8a79..c7c0e2c99cf3da8f6fc10a5c099a893443860bee 100644 (file)
@@ -239,7 +239,7 @@ br:
       user: Implijer
       comment: Addispleg
       area: Takad
-    list:
+    index:
       title: Hollad kemmoù
       title_user: Strolladoù kemmoù gant %{user}
       title_friend: Hollad ar c'hemmoù degaset gant ho mignoned
@@ -265,7 +265,7 @@ br:
     new:
       title: Enmoned nevez en deizlevr
       publish_button: Embann
-    list:
+    index:
       title: Deizlevrioù an implijerien
       title_friends: Marilhoù ar vignoned
       title_nearby: Marilhoù mignoned a-dost
@@ -288,7 +288,7 @@ br:
       use_map_link: implijout ar gartenn
       save_button: Enrollañ
       marker_text: Lec'hiadur an enmoned en deizlevr
-    view:
+    show:
       title: Deizlevr %{user} | %{title}
       user_title: Deizlevr %{user}
       leave_a_comment: Lezel un addispleg
@@ -336,7 +336,7 @@ br:
         pennadoù deizlevr-mañ
       post: Postañ
       when: Peur
-      comment: Addipleg
+      comment: Addispleg
       ago: '%{ago} zo'
       newer_comments: Evezhiadennoù nevesoo'h
       older_comments: Evezhiadennoù koshañ
@@ -636,6 +636,7 @@ br:
           water_park: Kreizenn dour
           "yes": Diduamantoù
         man_made:
+          adit: Toullenn moned d'ar mengleuz
           beacon: Tour-tan
           beehive: Ruskenn
           breakwater: Diwagenner
@@ -719,7 +720,7 @@ br:
           accountant: Kontour
           administrative: Melestradur
           architect: Ti-savour
-          association: kevredigezh
+          association: Kevredigezh
           company: Embregerezh
           educational_institution: Ensavadur desavadurel
           employment_agency: Ajañs evit al labour
@@ -933,6 +934,55 @@ br:
     results:
       no_results: N'eus bet kavet respont ebet
       more_results: Muioc'h a zisoc'hoù
+  issues:
+    index:
+      title: Kudennoù
+      select_status: Diuzañ ur statud
+      select_last_updated_by: Diuzañ an hizivadenn diwezhañ gant
+      not_updated: Nann hizvivaet
+      search: Klask
+      search_guidance: 'Kudennoù enklask :'
+      user_not_found: N'eus ket eus an implijer
+      status: Statud
+      reports: Danevelloù
+      last_updated: Hizivaet da ziwezhañ
+      last_updated_time_html: <abbr title='%{title}'>%{time} zo</abbr>
+      last_updated_time_user_html: <abbr title='%{title}'>%{time} zo</abbr> by %{user}
+      link_to_reports: Gwelet an danevelloù
+      reports_count:
+        one: 1 Danevell
+        other: '%{count} Danevelloù'
+      states:
+        ignored: Lezet a-gostez
+        open: Digor
+        resolved: Diskoulmet
+    update:
+      new_report: Enrollet mat eo bet ho tanevell
+      successful_update: Hizivaet mat eo bet ho tanevell
+    show:
+      title: '%{status} Kudenn #%{issue_id}'
+      reports:
+        zero: Danevell ebet
+        one: 1 rapport
+        other: '%{count} danevelloù'
+      resolve: Diskoulmañ
+      ignore: Lezel a-gostez
+      reopen: Addigeriñ
+      read_reports: Lenn an danevelloù
+      new_reports: Danevelloù nevez
+      other_issues_against_this_user: Kudennoù all a sell ouzh an implijer-mañ
+      no_other_issues: Kudenn all ebet gant an implijer-mañ.
+      comments_on_this_issue: Displegadennoù war ar gudenn-mañ
+    comments:
+      created_at: D'an %{datetime}
+    reports:
+      updated_at: D'an %{datetime}
+    helper:
+      reportable_title:
+        note: 'Notenn #%{note_id}'
+  issue_comments:
+    create:
+      comment_created: Krouet mat eo bet hoc'h evezhiadenn.
   layouts:
     logo:
       alt_text: Logo OpenStreetMap
@@ -958,10 +1008,7 @@ br:
     intro_text: Ur gartenn eus ar bed eo OprenStreetMap, krouet gant tud eveldoc'h
       ha frank hec'h implij dindan un aotre-implij digor.
     intro_2_create_account: Krouiñ ur gont implijer
-    partners_html: '%{ucl}, %{ic}, %{bytemark}, ha %{partners} all a ra war-dro an
-      herberc''hiañ.'
     partners_ucl: ↓"Universiy College" Londrez
-    partners_ic: Skolaj impalaerel Londrez
     partners_bytemark: ↓Herberc'hiañ Bytemark
     partners_partners: Kevelourien
     osm_offline: Ezlinenn eo diaz roadennoù OpenStreetMap evit bremañ e-pad ma pleder
@@ -1136,6 +1183,7 @@ br:
       body: Korf
       send_button: Kas
       back_to_inbox: Distreiñ d'ar voest resev
+    create:
       message_sent: Kemennadenn kaset
       limit_exceeded: Kalz a gemennadennoù hoc'h eus kaset nevez zo.  Gortozit ur
         pennadig a-raok klask kas re all.
@@ -1661,7 +1709,7 @@ br:
       visibility_help: Petra a dalvez an dra-mañ ?
     trace_optionals:
       tags: Tikedennoù
-    view:
+    show:
       title: O welet ar roud %{name}
       heading: O welet ar roud %{name}
       pending: WAR C'HORTOZ
@@ -1676,8 +1724,8 @@ br:
       description: 'Deskrivadur :'
       tags: 'Tikedennoù :'
       none: Hini ebet
-      edit_track: Aozañ ar roudenn-mañ
-      delete_track: Dilemel ar roudenn-mañ
+      edit_trace: Aozañ ar roudenn-mañ
+      delete_trace: Dilemel ar roudenn-mañ
       trace_not_found: N'eo ket bet kavet ar roud !
       visibility: 'Gwelusted :'
     trace_paging_nav:
@@ -1700,7 +1748,7 @@ br:
       by: gant
       in: e-barzh
       map: kartenn
-    list:
+    index:
       public_traces: Roudoù GPS foran
       public_traces_from: Roudoù GPS foran gant %{user}
       description: Furchal ar roud GPS pellgarget nevez zo
@@ -1828,7 +1876,7 @@ br:
       flash: Hizivaet eo bet titouroù an arval
     destroy:
       flash: Distrujet eo bet marilhadur an arload arval
-  user:
+  users:
     login:
       title: Kevreañ
       heading: Kevreañ
@@ -1968,7 +2016,7 @@ br:
       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:
+    show:
       my diary: ma deizlevr
       new diary entry: enmoned nevez en deizlevr
       my edits: ma aozadennoù
@@ -2147,7 +2195,7 @@ br:
       not_a_friend: '%{name} n''eo ket unan eus ho mignoned.'
     filter:
       not_an_administrator: Ret eo deoc'h bezañ merour evit kas an ober-mañ da benn.
-    list:
+    index:
       title: Implijerien
       heading: Implijerien
       showing:
index e83d1904bc8762b08f0f62cbd6a12ce15442fcb6..31f2224b0ab7add03a9ed3cef130ff56c6e6cdd9 100644 (file)
@@ -203,7 +203,7 @@ bs:
       user: Korisnik
       comment: Komentar
       area: Područje
-    list:
+    index:
       title: Setovi promjena
       title_user: Setovi promjena od %{user}
       title_friend: Setovi promjena vaših prijatelja
@@ -218,7 +218,7 @@ bs:
     new:
       title: Novi unos u dnevnik
       publish_button: Objavi
-    list:
+    index: