]> git.openstreetmap.org Git - rails.git/commitdiff
Merge pull request #2624 from francois2metz/diary-entry
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 3 Jun 2020 12:11:04 +0000 (14:11 +0200)
committerGitHub <noreply@github.com>
Wed, 3 Jun 2020 12:11:04 +0000 (14:11 +0200)
Add link to my diary in the diary index

31 files changed:
Gemfile
Gemfile.lock
app/controllers/application_controller.rb
app/mailers/notifier.rb
config/locales/be.yml
config/locales/br.yml
config/locales/ce.yml
config/locales/cs.yml
config/locales/diq.yml
config/locales/eo.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/hu.yml
config/locales/id.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ko.yml
config/locales/ne.yml
config/locales/pl.yml
config/locales/pt-PT.yml
config/locales/ru.yml
config/locales/sc.yml [new file with mode: 0644]
config/locales/sk.yml
config/locales/sv.yml
config/locales/tr.yml
config/locales/zh-CN.yml
config/routes.rb
lib/classic_pagination/pagination.rb
test/controllers/api/traces_controller_test.rb
test/controllers/users_controller_test.rb
test/test_helper.rb

diff --git a/Gemfile b/Gemfile
index af7b3c5e4edc3798f3f78436c922bb4eb1855b27..8aa907764ca628af2e79012b9007408b96a99be3 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 source "https://rubygems.org"
 
 # Require rails
-gem "rails", "6.0.3"
+gem "rails", "6.0.3.1"
 
 # Require things which have moved to gems in ruby 1.9
 gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
index 71edffcd0b84f2da1ff2af587915fdd98647bb26..8e6d4ab851d30cf91f358f9cd7c7d2ab24c4c4be 100644 (file)
@@ -4,62 +4,62 @@ GEM
     SystemTimer (1.2.3)
     aasm (5.0.8)
       concurrent-ruby (~> 1.0)
-    actioncable (6.0.3)
-      actionpack (= 6.0.3)
+    actioncable (6.0.3.1)
+      actionpack (= 6.0.3.1)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailbox (6.0.3)
-      actionpack (= 6.0.3)
-      activejob (= 6.0.3)
-      activerecord (= 6.0.3)
-      activestorage (= 6.0.3)
-      activesupport (= 6.0.3)
+    actionmailbox (6.0.3.1)
+      actionpack (= 6.0.3.1)
+      activejob (= 6.0.3.1)
+      activerecord (= 6.0.3.1)
+      activestorage (= 6.0.3.1)
+      activesupport (= 6.0.3.1)
       mail (>= 2.7.1)
-    actionmailer (6.0.3)
-      actionpack (= 6.0.3)
-      actionview (= 6.0.3)
-      activejob (= 6.0.3)
+    actionmailer (6.0.3.1)
+      actionpack (= 6.0.3.1)
+      actionview (= 6.0.3.1)
+      activejob (= 6.0.3.1)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 2.0)
-    actionpack (6.0.3)
-      actionview (= 6.0.3)
-      activesupport (= 6.0.3)
+    actionpack (6.0.3.1)
+      actionview (= 6.0.3.1)
+      activesupport (= 6.0.3.1)
       rack (~> 2.0, >= 2.0.8)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.2.0)
     actionpack-page_caching (1.2.2)
       actionpack (>= 5.0.0)
-    actiontext (6.0.3)
-      actionpack (= 6.0.3)
-      activerecord (= 6.0.3)
-      activestorage (= 6.0.3)
-      activesupport (= 6.0.3)
+    actiontext (6.0.3.1)
+      actionpack (= 6.0.3.1)
+      activerecord (= 6.0.3.1)
+      activestorage (= 6.0.3.1)
+      activesupport (= 6.0.3.1)
       nokogiri (>= 1.8.5)
-    actionview (6.0.3)
-      activesupport (= 6.0.3)
+    actionview (6.0.3.1)
+      activesupport (= 6.0.3.1)
       builder (~> 3.1)
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.1, >= 1.2.0)
     active_record_union (1.3.0)
       activerecord (>= 4.0)
-    activejob (6.0.3)
-      activesupport (= 6.0.3)
+    activejob (6.0.3.1)
+      activesupport (= 6.0.3.1)
       globalid (>= 0.3.6)
-    activemodel (6.0.3)
-      activesupport (= 6.0.3)
-    activerecord (6.0.3)
-      activemodel (= 6.0.3)
-      activesupport (= 6.0.3)
-    activerecord-import (1.0.4)
+    activemodel (6.0.3.1)
+      activesupport (= 6.0.3.1)
+    activerecord (6.0.3.1)
+      activemodel (= 6.0.3.1)
+      activesupport (= 6.0.3.1)
+    activerecord-import (1.0.5)
       activerecord (>= 3.2)
-    activestorage (6.0.3)
-      actionpack (= 6.0.3)
-      activejob (= 6.0.3)
-      activerecord (= 6.0.3)
+    activestorage (6.0.3.1)
+      actionpack (= 6.0.3.1)
+      activejob (= 6.0.3.1)
+      activerecord (= 6.0.3.1)
       marcel (~> 0.3.1)
-    activesupport (6.0.3)
+    activesupport (6.0.3.1)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 0.7, < 2)
       minitest (~> 5.1)
@@ -74,26 +74,26 @@ GEM
     autoprefixer-rails (9.7.6)
       execjs
     aws-eventstream (1.1.0)
-    aws-partitions (1.310.0)
-    aws-sdk-core (3.94.1)
+    aws-partitions (1.321.0)
+    aws-sdk-core (3.96.1)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.239.0)
       aws-sigv4 (~> 1.1)
       jmespath (~> 1.0)
-    aws-sdk-kms (1.30.0)
+    aws-sdk-kms (1.31.0)
       aws-sdk-core (~> 3, >= 3.71.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.63.1)
-      aws-sdk-core (~> 3, >= 3.83.0)
+    aws-sdk-s3 (1.66.0)
+      aws-sdk-core (~> 3, >= 3.96.1)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.1)
     aws-sigv4 (1.1.3)
       aws-eventstream (~> 1.0, >= 1.0.2)
-    better_errors (2.7.0)
+    better_errors (2.7.1)
       coderay (>= 1.0.0)
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
-    better_html (1.0.14)
+    better_html (1.0.15)
       actionview (>= 4.0)
       activesupport (>= 4.0)
       ast (~> 2.0)
@@ -110,14 +110,14 @@ GEM
       autoprefixer-rails (>= 9.1.0)
       popper_js (>= 1.14.3, < 2)
       sassc-rails (>= 2.0.0)
-    browser (4.0.0)
+    browser (4.1.0)
     builder (3.2.4)
     bzip2-ffi (1.0.0)
       ffi (~> 1.0)
     cancancan (3.1.0)
     canonical-rails (0.2.8)
       rails (>= 4.1, < 6.1)
-    capybara (3.32.1)
+    capybara (3.32.2)
       addressable
       mini_mime (>= 0.1.3)
       nokogiri (~> 1.8)
@@ -127,7 +127,7 @@ GEM
       xpath (~> 3.2)
     childprocess (3.0.0)
     coderay (1.1.2)
-    composite_primary_keys (12.0.1)
+    composite_primary_keys (12.0.2)
       activerecord (~> 6.0.0)
     concurrent-ruby (1.1.6)
     config (2.2.1)
@@ -167,7 +167,7 @@ GEM
       concurrent-ruby (~> 1.0)
       dry-core (~> 0.2)
       dry-equalizer (~> 0.2)
-    dry-schema (1.5.0)
+    dry-schema (1.5.1)
       concurrent-ruby (~> 1.0)
       dry-configurable (~> 0.8, >= 0.8.3)
       dry-core (~> 0.4)
@@ -190,7 +190,7 @@ GEM
       dry-initializer (~> 3.0)
       dry-schema (~> 1.5)
     dynamic_form (1.1.4)
-    erb_lint (0.0.32)
+    erb_lint (0.0.33)
       activesupport
       better_html (~> 1.0.7)
       html_tokenizer
@@ -236,11 +236,10 @@ GEM
       sprockets
     image_size (2.0.2)
     in_threads (1.5.4)
-    jaro_winkler (1.5.4)
     jbuilder (2.10.0)
       activesupport (>= 5.0.0)
     jmespath (1.4.0)
-    jquery-rails (4.3.5)
+    jquery-rails (4.4.0)
       rails-dom-testing (>= 1, < 3)
       railties (>= 4.2.0)
       thor (>= 0.14, < 2.0)
@@ -249,7 +248,7 @@ GEM
     kgio (2.11.3)
     kramdown (2.2.1)
       rexml
-    libxml-ruby (3.1.0)
+    libxml-ruby (3.2.0)
     listen (3.2.1)
       rb-fsevent (~> 0.10, >= 0.10.3)
       rb-inotify (~> 0.9, >= 0.9.10)
@@ -271,7 +270,7 @@ GEM
     mini_magick (4.10.1)
     mini_mime (1.0.2)
     mini_portile2 (2.4.0)
-    minitest (5.14.0)
+    minitest (5.14.1)
     msgpack (1.3.3)
     multi_json (1.14.1)
     multi_xml (0.6.0)
@@ -322,14 +321,14 @@ GEM
       omniauth-oauth2 (~> 1.4)
     openstreetmap-deadlock_retry (1.3.0)
     parallel (1.19.1)
-    parser (2.7.1.2)
+    parser (2.7.1.3)
       ast (~> 2.4.0)
     pg (1.2.3)
     popper_js (1.16.0)
     progress (3.5.2)
     psych (3.1.0)
-    public_suffix (4.0.4)
-    puma (3.12.4)
+    public_suffix (4.0.5)
+    puma (3.12.6)
     quad_tile (1.0.1)
     r2 (0.2.7)
     rack (2.2.2)
@@ -341,20 +340,20 @@ GEM
     rack-test (1.1.0)
       rack (>= 1.0, < 3)
     rack-uri_sanitizer (0.0.2)
-    rails (6.0.3)
-      actioncable (= 6.0.3)
-      actionmailbox (= 6.0.3)
-      actionmailer (= 6.0.3)
-      actionpack (= 6.0.3)
-      actiontext (= 6.0.3)
-      actionview (= 6.0.3)
-      activejob (= 6.0.3)
-      activemodel (= 6.0.3)
-      activerecord (= 6.0.3)
-      activestorage (= 6.0.3)
-      activesupport (= 6.0.3)
+    rails (6.0.3.1)
+      actioncable (= 6.0.3.1)
+      actionmailbox (= 6.0.3.1)
+      actionmailer (= 6.0.3.1)
+      actionpack (= 6.0.3.1)
+      actiontext (= 6.0.3.1)
+      actionview (= 6.0.3.1)
+      activejob (= 6.0.3.1)
+      activemodel (= 6.0.3.1)
+      activerecord (= 6.0.3.1)
+      activestorage (= 6.0.3.1)
+      activesupport (= 6.0.3.1)
       bundler (>= 1.3.0)
-      railties (= 6.0.3)
+      railties (= 6.0.3.1)
       sprockets-rails (>= 2.0.0)
     rails-controller-testing (1.0.4)
       actionpack (>= 5.0.1.x)
@@ -368,9 +367,9 @@ GEM
     rails-i18n (4.0.2)
       i18n (~> 0.6)
       rails (>= 4.0)
-    railties (6.0.3)
-      actionpack (= 6.0.3)
-      activesupport (= 6.0.3)
+    railties (6.0.3.1)
+      actionpack (= 6.0.3.1)
+      activesupport (= 6.0.3.1)
       method_source
       rake (>= 0.8.7)
       thor (>= 0.20.3, < 2.0)
@@ -386,17 +385,19 @@ GEM
     rinku (2.0.6)
     rotp (6.0.0)
       addressable (~> 2.7)
-    rubocop (0.82.0)
-      jaro_winkler (~> 1.5.1)
+    rubocop (0.84.0)
       parallel (~> 1.10)
       parser (>= 2.7.0.1)
       rainbow (>= 2.2.2, < 4.0)
       rexml
+      rubocop-ast (>= 0.0.3)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 1.4.0, < 2.0)
+    rubocop-ast (0.0.3)
+      parser (>= 2.7.0.1)
     rubocop-minitest (0.9.0)
       rubocop (>= 0.74)
-    rubocop-performance (1.5.2)
+    rubocop-performance (1.6.0)
       rubocop (>= 0.71.0)
     rubocop-rails (2.5.2)
       activesupport
@@ -435,7 +436,7 @@ GEM
       actionpack (>= 4.0)
       activesupport (>= 4.0)
       sprockets (>= 3.0.0)
-    strong_migrations (0.6.4)
+    strong_migrations (0.6.8)
       activerecord (>= 5)
     sync (0.5.0)
     term-ansicolor (1.7.1)
@@ -443,7 +444,7 @@ GEM
     thor (1.0.1)
     thread_safe (0.3.6)
     tilt (2.0.10)
-    tins (1.24.1)
+    tins (1.25.0)
       sync
     tzinfo (1.2.7)
       thread_safe (~> 0.1)
@@ -457,7 +458,7 @@ GEM
       addressable (>= 2.3.6)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
-    websocket-driver (0.7.1)
+    websocket-driver (0.7.2)
       websocket-extensions (>= 0.1.0)
     websocket-extensions (0.1.4)
     xpath (3.2.0)
@@ -529,7 +530,7 @@ DEPENDENCIES
   r2 (~> 0.2.7)
   rack-cors
   rack-uri_sanitizer
-  rails (= 6.0.3)
+  rails (= 6.0.3.1)
   rails-controller-testing
   rails-i18n (~> 4.0.0)
   rinku (>= 2.0.6)
index f419460ee77bc97762ad6c9bc230d0718cb88c9b..0099845942e80326ac8c0145d25986c551427e39 100644 (file)
@@ -10,6 +10,7 @@ class ApplicationController < ActionController::Base
   around_action :better_errors_allow_inline, :if => proc { Rails.env.development? }
 
   attr_accessor :current_user
+
   helper_method :current_user
 
   private
index c60dff84b9f0265cfc66137cb5cac3271529e324..cebb4693973c6a772e4d8db609ef7b3ff97e86e8 100644 (file)
@@ -192,7 +192,12 @@ class Notifier < ApplicationMailer
   def user_avatar_file(user)
     avatar = user&.avatar
     if avatar&.attached?
-      avatar.variant(:resize => "50x50>").blob.download
+      if avatar.variable?
+        image = avatar.variant(:resize => "50x50>").processed
+        image.service.download(image.key)
+      else
+        avatar.blob.download
+      end
     else
       File.read(Rails.root.join("app/assets/images/avatar_small.png"))
     end
index 7e610654cf5ea3be4197af65273e9d5a651f641c..aac982dddc25794b634a789eb45d5a20f3e1f8b7 100644 (file)
@@ -1895,8 +1895,8 @@ be:
     create:
       upload_trace: Адаслаць GPS-след
       trace_uploaded: Ваш GPX-файл быў адасланы і чакае ўстаўкі ў базу дадзеных. Гэта
-        звычайна робіцца не больш за паўгадзіны. Вы атрымаеце працврджанне аб заканчэнні
-        працэсу па электроннай пошце
+        звычайна робіцца не больш за паўгадзіны. Вы атрымаеце працверджанне аб заканчэнні
+        працэсу па электроннай пошце.
       upload_failed: На жаль, загрузка GPX не атрымалася. Адміністратар быў праінфармаваны
         пра памылку. Калі ласка, паспрабуйце яшчэ раз
       traces_waiting: У вас %{count} след у чарзе. Калі ласка, пачакайце, пакуль яны
@@ -2237,8 +2237,8 @@ be:
     no_such_user:
       title: Няма такога карыстальніка
       heading: Карыстальнік %{user} не існуе
-      body: Прабачце, карыстальнік %{user} не знойдзены. Please check your spelling,
-        Ð\9aалÑ\96 Ð»Ð°Ñ\81ка, Ð¿Ñ\80авеÑ\80Ñ\86е Ñ\81вой Ð¿Ñ\80авапÑ\96Ñ\81, Ñ\86Ñ\96, Ð¼Ð°Ð³Ñ\87Ñ\8bма, Ð²Ð°Ð¼ Ð´Ð°Ð»Ñ\96 Ð½Ñ\8fпÑ\80авÑ\96лÑ\8cнÑ\83Ñ\8e Ñ\81паÑ\81Ñ\8bлкÑ\83.
+      body: Прабачце, карыстальнік %{user} не знойдзены. Калі ласка, праверце свой
+        правапіс, ці, магчыма, вам далі няправільную спасылку.
       deleted: выдалены
     show:
       my diary: Мой дзённік
index 41085c4dd93cc4b3ed7cba4a425e32a7f6d06969..32e04ac6ea5aa900090a72957a8f8fdb7c0778e8 100644 (file)
@@ -7,6 +7,7 @@
 # Author: Fulup
 # Author: Gwendal
 # Author: Gwenn-Ael
+# Author: Iriep
 # Author: Macofe
 # Author: Nemo bis
 # Author: Shirayuki
@@ -34,7 +35,7 @@ br:
         create: Krouiñ ar skridaozadenn
         update: Enrollañ ar skridaozadenn
       trace:
-        create: Enporzhiañ
+        create: Pellgas
         update: Enrollañ ar c'hemmoù
       user_block:
         create: Krouiñ ur stankadur
@@ -42,14 +43,14 @@ br:
   activerecord:
     errors:
       messages:
-        invalid_email_address: Ne hañval ket bezañ ur chomlec'h postel reizh.
+        invalid_email_address: ne ziskouez ket bezañ ur chomlec'h postel mat
         email_address_not_routable: n'haller ket routañ
     models:
-      acl: Roll kontroll moned
-      changeset: Strollad kemm
-      changeset_tag: Tikedenn ar strollad kemm
+      acl: Listenn kontroll moned
+      changeset: Hollad cheñchamant
+      changeset_tag: Tikedenn an hollad cheñchamant
       country: Bro
-      diary_comment: Addispleg eus an deizlevr
+      diary_comment: Evezhiadenn an deizlevr
       diary_entry: Enmoned en deizlevr
       friend: Mignon
       issue: Kudenn
@@ -57,11 +58,11 @@ br:
       message: Kemennadenn
       node: Skoulm
       node_tag: Tikedenn ar skoulm
-      notifier: Kemenn
+      notifier: Kemenner
       old_node: Skoulm kozh
       old_node_tag: Tikedenn ar skoulm kozh
       old_relation: Darempred kozh
-      old_relation_member: Ezel darempred kozh
+      old_relation_member: Ezel an darempred kozh
       old_relation_tag: Tikedenn an darempred kozh
       old_way: Hent kozh
       old_way_node: Skoulm an hent kozh
@@ -69,16 +70,16 @@ br:
       relation: Darempred
       relation_member: Ezel an darempred
       relation_tag: Tikedenn an darempred
-      report: Titourañ
+      report: Danevell
       session: Dalc'h
       trace: Roud
       tracepoint: Poent eus ar roud
       tracetag: Tikedenn ar roud
       user: Implijer
-      user_preference: Penndibaboù Implijer
+      user_preference: Arventennoù Implijer
       user_token: Jedouer an implijer
       way: Hent
-      way_node: Skoulm eus an hent
+      way_node: Skoulm an hent
       way_tag: Tikedenn an hent
     attributes:
       diary_comment:
@@ -86,7 +87,7 @@ br:
       diary_entry:
         user: Implijer
         title: Danvez
-        latitude: Ledred
+        latitude: Lec'hed
         longitude: Hedred
         language: Yezh
       friend:
@@ -97,7 +98,7 @@ br:
         visible: Gwelus
         name: Anv
         size: Ment
-        latitude: Ledred
+        latitude: Lec'hed
         longitude: Hedred
         public: Foran
         description: Deskrivadur
@@ -116,72 +117,72 @@ br:
   datetime:
     distance_in_words_ago:
       about_x_hours:
-        one: war-dro un eurvezh zo zo
-        other: war-dro %{count} eurvezh zo
+        one: war-dro un eurvezh 'zo 'zo
+        other: war-dro %{count} eurvezh 'zo
       about_x_months:
-        one: war-dro miz zo zo
-        other: war-dro %{count} miz zo
+        one: war-dro miz 'zo 'zo
+        other: war-dro %{count} miz 'zo
       about_x_years:
-        one: bloaz zo bennak
-        two: war-dro %{count} vloaz zo
-        few: war-dro %{count} bloaz zo
-        many: war-dro %{count} bloaz zo
-        other: war-dro %{count} bloaz zo
+        one: bloaz 'zo bennak
+        two: war-dro %{count} 'vloaz zo
+        few: war-dro %{count} bloaz 'zo
+        many: war-dro %{count} bloaz 'zo
+        other: war-dro %{count} bloaz 'zo
       almost_x_years:
-        one: bloaz zo bennak
-        two: war-dro %{count} vloaz zo
-        few: war-dro %{count} bloaz zo
-        many: war-dro %{count} bloaz zo
-        other: war-dro %{count} bloaz zo
-      half_a_minute: un hanter vunutenn zo
+        one: bloaz 'zo bennak
+        two: war-dro %{count} vloaz 'zo
+        few: war-dro %{count} bloaz 'zo
+        many: war-dro %{count} bloaz 'zo
+        other: war-dro %{count} bloaz 'zo
+      half_a_minute: un hanter vunutenn 'zo
       less_than_x_seconds:
-        one: nebeutoc'h eget un eilenn zo
-        two: nebeutoc'h eget %{count} eilenn zo
-        few: nebeutoc'h eget %{count} eilenn zo
-        many: nebeutoc'h eget %{count} eilenn zo
-        other: nebeutoc'h eget %{count} eilenn zo
+        one: nebeutoc'h eget un eilenn 'zo
+        two: nebeutoc'h eget %{count} eilenn 'zo
+        few: nebeutoc'h eget %{count} eilenn 'zo
+        many: nebeutoc'h eget %{count} eilenn 'zo
+        other: nebeutoc'h eget %{count} eilenn 'zo
       less_than_x_minutes:
-        one: nebeutoc'h eget un nunutenn zo
-        two: nebeutoc'h eget %{count} vunutenn zo
-        few: nebeutoc'h eget %{count} munutenn zo
-        many: nebeutoc'h eget %{count} munutenn zo
-        other: nebeutoc'h eget %{count} munutenn zo
+        one: nebeutoc'h eget un nunutenn 'zo
+        two: nebeutoc'h eget %{count} vunutenn 'zo
+        few: nebeutoc'h eget %{count} munutenn 'zo
+        many: nebeutoc'h eget %{count} munutenn 'zo
+        other: nebeutoc'h eget %{count} munutenn 'zo
       over_x_years:
-        one: ouzhpenn bloaz zo
-        two: ouzhpenn %{count} vloaz zo
-        few: ouzhpenn %{count} bloaz zo
-        many: ouzhpenn %{count} bloaz zo
-        other: ouzhpenn %{count} bloaz zo
+        one: ouzhpenn bloaz 'zo
+        two: ouzhpenn %{count} vloaz 'zo
+        few: ouzhpenn %{count} bloaz 'zo
+        many: ouzhpenn %{count} bloaz 'zo
+        other: ouzhpenn %{count} bloaz 'zo
       x_seconds:
-        one: un eilenn zo
-        two: '%{count} eilenn zo'
-        few: '%{count} eilenn zo'
-        many: '%{count} eilenn zo'
-        other: '%{count} eilenn zo'
+        one: un eilenn 'zo
+        two: '%{count} eilenn ''zo'
+        few: '%{count} eilenn ''zo'
+        many: '%{count} eilenn ''zo'
+        other: '%{count} eilenn ''zo'
       x_minutes:
-        one: ur vunutenn zo
-        two: '%{count} vunutenn zo'
-        few: '%{count} munutenn zo'
-        many: '%{count} munutenn zo'
-        other: '%{count} munutenn zo'
+        one: ur vunutenn 'zo
+        two: '%{count} vunutenn ''zo'
+        few: '%{count} munutenn ''zo'
+        many: '%{count} munutenn ''zo'
+        other: '%{count} munutenn ''zo'
       x_days:
-        one: un deiz zo
-        two: '%{count} zeiz zo'
-        few: '%{count} deiz zo'
-        many: '%{count} deiz zo'
-        other: '%{count} deiz zo'
+        one: un deiz 'zo
+        two: '%{count} zeiz ''zo'
+        few: '%{count} deiz ''zo'
+        many: '%{count} deiz ''zo'
+        other: '%{count} deiz ''zo'
       x_months:
-        one: miz zo
-        two: '%{count} viz zo'
-        few: '%{count} miz zo'
-        many: '%{count} miz zo'
-        other: '%{count} miz zo'
+        one: miz 'zo
+        two: '%{count} viz ''zo'
+        few: '%{count} miz ''zo'
+        many: '%{count} miz ''zo'
+        other: '%{count} miz ''zo'
       x_years:
-        one: bloaz zo
-        two: '%{count} vloaz zo'
-        few: '%{count} bloaz zo'
-        many: '%{count} bloaz zo'
-        other: '%{count} bloaz zo'
+        one: bloaz 'zo
+        two: '%{count} vloaz ''zo'
+        few: '%{count} bloaz ''zo'
+        many: '%{count} bloaz ''zo'
+        other: '%{count} bloaz ''zo'
   editor:
     default: Dre ziouer (%{name} er mare-mañ)
     potlatch:
@@ -208,14 +209,14 @@ br:
   api:
     notes:
       comment:
-        opened_at_html: Bet krouet %{when}zo
+        opened_at_html: Bet krouet %{when} 'zo
         opened_at_by_html: Bet krouet %{when} gant %{user}
         commented_at_html: Hizivaet %{when}
         commented_at_by_html: Hizivaet %{when} gant %{user}
         closed_at_html: Diskoulmet %{when}
         closed_at_by_html: Diskoulmet %{when} gant %{user}
-        reopened_at_html: adweredekaet %{when}
-        reopened_at_by_html: Adweredekaet %{when} gant %{user}
+        reopened_at_html: Adenaouet %{when}
+        reopened_at_by_html: Adenaouet %{when} gant %{user}
       rss:
         title: Notennoù OpenStreetMap
         description_area: Ur roll notennoù, addispleget, gant evezhiadennoù pe serret
@@ -224,7 +225,7 @@ br:
         opened: notenn nevez (tost da %{place})
         commented: evezhiadenn nevez (tost da %{place})
         closed: notenn serret (tost da %{place})
-        reopened: notenn adweredekaet (tost da %{place})
+        reopened: notenn adenaouet (tost da %{place})
       entry:
         comment: Evezhiadenn
         full: Notenn glok
@@ -238,16 +239,16 @@ br:
     edited_by_html: Aozet <abbr title='%{title}'>%{time}</abbr> gant %{user}
     closed_by_html: Serret <abbr title='%{title}'>%{time}</abbr> gant %{user}
     version: Stumm
-    in_changeset: Strollad kemm
+    in_changeset: Hollad cheñchamant
     anonymous: dizanv
-    no_comment: (addispleg ebet)
+    no_comment: (evezhiadenn ebet)
     part_of: Lodenn eus
     download_xml: Pellgargañ XML
     view_history: Gwelet an istor
     view_details: ↓Gwelet ar munudoù
-    location: 'Lec''h :'
+    location: 'Lec''hiadur:'
     changeset:
-      title: 'Strollad kemmoù : %{id}'
+      title: 'Hollad cheñchamantoù: %{id}'
       belongs_to: Aozer
       node: Skoulmoù (%{count})
       node_paginated: Skoulmoù (%{x}-%{y} diwar %{count})
@@ -255,31 +256,31 @@ br:
       way_paginated: Hentoù (%{x}-%{y} diwar %{count})
       relation: Darempredoù (%{count})
       relation_paginated: Darempredoù (%{x}-%{y} diwar %{count})
-      comment: Addisplegoù(%{count})
-      hidden_commented_by: Addispleg kuzhet gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      commented_by: Addispleg gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      changesetxml: Strollad kemmoù XML
-      osmchangexml: osmChange XML
+      comment: Evezhiadennoù(%{count})
+      hidden_commented_by: Evezhiadenn kuzhet gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
+      commented_by: Evezhiadenn gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
+      changesetxml: Hollad cheñchamantoù XML
+      osmchangexml: Cheñchoùosm XML
       feed:
-        title: Strollad kemmoù %{id}
-        title_comment: Strollad kemmoù %{id} - %{comment}
-      join_discussion: Kevreañ evit kaozeal
+        title: Hollad cheñchamantoù %{id}
+        title_comment: Hollad cheñchamantoù %{id} - %{comment}
+      join_discussion: Kevreit evit mont er gaozeadenn
       discussion: Kaozeadenn
-      still_open: Strollad kemmoù digor - an diviz a zigoro ur wech ma vo serret ar
-        strollad kemmoù.
+      still_open: Hollad cheñchamantoù digor - an diviz a zigoro ur wech ma vo serret
+        an hollad cheñchamantoù.
     node:
-      title_html: 'Skoulm : %{name}'
-      history_title_html: 'Istor ar skoulm : %{name}'
+      title_html: 'Skoulm: %{name}'
+      history_title_html: 'Istor ar skoulm: %{name}'
     way:
-      title_html: 'Hent : %{name}'
-      history_title_html: 'Istor an hent : %{name}'
+      title_html: 'Hent: %{name}'
+      history_title_html: 'Istor an hent: %{name}'
       nodes: Skoulmoù
       also_part_of_html:
         one: lodenn eus an hent %{related_ways}
         other: lodenn eus an hentoù %{related_ways}
     relation:
-      title_html: 'Darempred : %{name}'
-      history_title_html: 'Istor an darempred : %{name}'
+      title_html: 'Darempred: %{name}'
+      history_title_html: 'Istor an darempred: %{name}'
       members: Izili
     relation_member:
       entry_role_html: '%{type} %{name} evel %{role}'
@@ -291,12 +292,12 @@ br:
       entry_html: Darempred %{relation_name}
       entry_role_html: Darempred %{relation_name} (evel %{relation_role})
     not_found:
-      sorry: 'Ho tigarez, an %{type} #%{id} n''eo ket bet kavet.'
+      sorry: 'Ho tigarez, n''heller ket kavout %{type} #%{id}.'
       type:
         node: skoulm
         way: hent
         relation: darempred
-        changeset: strollad kemm
+        changeset: hollad cheñchamant
         note: notenn
     timeout:
       sorry: Digarezit, ar roadennoù evit ar seurt %{type}  ha gant an id %{id} a
@@ -305,12 +306,12 @@ br:
         node: skoulm
         way: hent
         relation: darempred
-        changeset: strollad kemm
+        changeset: hollad cheñchamant
         note: notenn
     redacted:
       redaction: ↓Aozañ %{id}
       message_html: ↓Stumm %{version} eus an %{type}-mañ na c'hall ket bezañ diskouezet
-        evel m"eo bet aozet. Sellit ouzh %{redaction_link} evit gouzout hiroc'h, mar
+        evel m'eo bet aozet. Sellit ouzh %{redaction_link} evit gouzout hiroc'h, mar
         plij.
       type:
         node: skoulm
@@ -318,7 +319,7 @@ br:
         relation: darempred
     start_rjs:
       feature_warning: Kargañ %{num_features} a elfennoù a ray d'ho merdeer bezañ
-        gorrek. Ha sur oc'h e fell deoc'h dikwel ar roadenoù-se ?
+        gorrek. Ha sur oc'h e fell deoc'h diskwel ar roadennoù-se ?
       load_data: Kargañ ar roadennoù
       loading: O kargañ...
     tag_details:
@@ -332,154 +333,157 @@ br:
       telephone_link: Gervel %{phone_number}
       colour_preview: Rakwel al liv %{colour_value}
     note:
-      title: 'Notenn : %{id}'
+      title: 'Notenn: %{id}'
       new_note: Notenn nevez
       description: Deskrivadur
-      open_title: 'Notenn n''eo ket diskoulmet : %{note_name}'
-      closed_title: 'Notenn diskoulmet %{note_name}'
+      open_title: 'Neket bet diskoulmet an notenn #%{note_name}'
+      closed_title: 'Notenn diskoulmet #%{note_name}'
       hidden_title: 'Notenn kuzhet #%{note_name}'
-      opened_by: Krouet gant %{user} <abbr title='%{exact_time}'>%{when} zo</abbr>
+      opened_by: Krouet gant %{user} <abbr title='%{exact_time}'>%{when} 'zo</abbr>
       opened_by_anonymous: Krouet gant un den dianav <abbr title='%{exact_time}'>%{when}
-        zo</abbr>
-      commented_by: Addispleg gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      commented_by_anonymous: Addispleg gant un den dianv <abbr title='%{exact_time}'>%{when}</abbr>
-      closed_by: Diskoulmet gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      closed_by_anonymous: Diskoulmet gant un den dianv <abbr title='%{exact_time}'>%{when}</abbr>
-      reopened_by: Adweredekaet gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      reopened_by_anonymous: Adweredekaet gant un den dianv <abbr title='%{exact_time}'>%{when}</abbr>
-      hidden_by: Kuzhet gant %{user} <abbr title='%{exact_time}'>%{when}</abbr>
-      report: Disklêriañ an notenn-mañ
+        'zo</abbr>
+      commented_by: Evezhiadenn gant %{user} <abbr title='%{exact_time}'>%{when} 'zo</abbr>
+      commented_by_anonymous: Evezhiadenn gant un den dizanv <abbr title='%{exact_time}'>%{when}
+        'zo</abbr>
+      closed_by: Diskoulmet gant %{user} <abbr title='%{exact_time}'>%{when} 'zo</abbr>
+      closed_by_anonymous: Diskoulmet gant un den dizanv <abbr title='%{exact_time}'>%{when}
+        'zo</abbr>
+      reopened_by: Adenaouet gant %{user} <abbr title='%{exact_time}'>%{when} 'zo</abbr>
+      reopened_by_anonymous: Adenaouet gant un den dizanv <abbr title='%{exact_time}'>%{when}
+        'zo</abbr>
+      hidden_by: Kuzhet gant %{user} <abbr title='%{exact_time}'>%{when} 'zo</abbr>
+      report: Signaliñ an notenn-mañ
     query:
       title: Arc'hweladurioù enklask
       introduction: Klikit war ar gartenn evit kavout arc'hweladurioù e-kichen.
       nearby: Arc'hweladurioù e-kichen
-      enclosing: Arc'hweladurioù stag
+      enclosing: Arc'hweladurioù enklozañ
   changesets:
     changeset_paging_nav:
-      showing_page: Pajenn%{page}
+      showing_page: Pajenn %{page}
       next: War-lerc'h »
       previous: « Kent
     changeset:
       anonymous: Dizanv
-      no_edits: (kemm ebet)
-      view_changeset_details: Gwelet munudoù ar strollad kemm
+      no_edits: (aozadenn ebet)
+      view_changeset_details: Gwelet munudoù an hollad cheñchamant
     changesets:
       id: ID
-      saved_at: Enrollet da
+      saved_at: Enrollet an/ar
       user: Implijer
-      comment: Addispleg
+      comment: Evezhiadenn
       area: Takad
     index:
-      title: Strollad kemm
-      title_user: Strolladoù kemmoù gant %{user}
-      title_friend: Strollad kemmoù degaset gant ma mignoned
-      title_nearby: Strollad kemmoù deuet gant implijerien a-dost
-      empty: N'eus ket kavet strollad kemmoù ebet.
-      empty_area: Strollad kemmoù ebet en takad-mañ.
-      empty_user: Strollad kemmoù ebet gant an implijer-mañ.
-      no_more: N'eus ket bet kavet strolladoù kemmoù all.
-      no_more_area: Strollad kemmoù all ebet ken en takad-mañ.
-      no_more_user: Strollad kemmoù ebet all ken gant an implijer-mañ.
+      title: Hollad cheñchamant
+      title_user: Hollad cheñchamantoù %{user}
+      title_friend: Hollad cheñchamantoù degaset gant ma mignoned
+      title_nearby: Hollad cheñchamantoù graet gant implijerien a-dost
+      empty: N'eus bet kavet hollad cheñchamant ebet.
+      empty_area: Hollad cheñchamant ebet en takad-mañ.
+      empty_user: Hollad cheñchamant ebet gant an implijer-mañ.
+      no_more: N'eus bet kavet hollad cheñchamantoù ouzhpenn.
+      no_more_area: Hollad cheñchamant ouzhpenn ebet ken en takad-mañ.
+      no_more_user: Hollad cheñchamant ouzhpenn ebet ken gant an implijer-mañ.
       load_more: Kargañ muioc'h
     timeout:
       sorry: Ho tigarez, re hir eo adtapout ar roll cheñchamantoù hoc'h eus goulennet.
   changeset_comments:
     comment:
-      comment: 'Addispleg nevez diwar-benn ar strollad kemmoù #%{changeset_id} dre
-        %{author}'
+      comment: 'Evezhiadenn nevez diwar-benn an hollad cheñchamantoù #%{changeset_id}
+        gant %{author}'
       commented_at_by_html: Hizivaet %{when} gant %{user}
     comments:
-      comment: Addispleg nevez war ar strollad kemmoù %{changeset_id} gant %{author}
+      comment: Evezhiadenn nevez war an hollad cheñchamantoù %{changeset_id} gant
+        %{author}
     index:
-      title_all: Kaozeal diwar-benn an holl gemmoù degaset en OpenStreetMap
-      title_particular: 'Kaoz diwar-benn an holl gemmoù #%{changeset_id}degaset en
-        OpenStreetMap'
+      title_all: Kaozeadenn hollad cheñchamantoù OpenStreetMap
+      title_particular: 'Kaozeadenn hollad cheñchamantoù #%{changeset_id} OpenStreetMap'
     timeout:
-      sorry: Ho tigarez, re hir eo adtapout ar roll evezhiadennoù  hoc'h eus goulennet.
+      sorry: Ho tigarez, re hir eo adtapout ar roll evezhiadennoù ho peus goulennet.
   diary_entries:
     new:
       title: Enmoned nevez en deizlevr
     form:
-      subject: 'Danvez :'
-      body: 'Korf :'
-      language: 'Yezh :'
-      location: 'Lec''hiadur :'
-      latitude: 'Ledred :'
-      longitude: 'Hedred :'
+      subject: 'Danvez:'
+      body: 'Korf:'
+      language: 'Yezh:'
+      location: 'Lec''hiadur:'
+      latitude: 'Lec''hed:'
+      longitude: 'Hedred:'
       use_map_link: implijout ar gartenn
     index:
       title: Deizlevrioù an implijerien
       title_friends: Deizlevrioù ar vignoned
-      title_nearby: Deizlevrioù ar vignoned a-dost
+      title_nearby: Deizlevrioù ar vignoned tost
       user_title: Deizlevr %{user}
-      in_language_title: Enmonedoù en deizlevr e %{language}
-      new: Enmoned nevez en deizlevr
-      new_title: Ouzhpennañ un enmoned nevez d'ho teizlevr
-      no_entries: Enmoned ebet en ho teizlevr
-      recent_entries: 'Enmonedoù nevez en deizlevr :'
-      older_entries: Enmonedoù koshañ
-      newer_entries: Enmonedoù nevesañ
+      in_language_title: Enmontoù en deizlevr e %{language}
+      new: Enmont nevez en deizlevr
+      new_title: Ouzhpennañ un enmont nevez d'ho teizlevr
+      no_entries: Enmont ebet en ho teizlevr
+      recent_entries: 'Enmontoù nevez en deizlevr:'
+      older_entries: Enmont koshañ
+      newer_entries: Enmont nevesañ
     edit:
-      title: Kemmañ enmoned an deizlevr
-      marker_text: Lec'hiadur an enmoned en deizlevr
+      title: Aozañ enmont an deizlevr
+      marker_text: Lec'hiadur an enmont en deizlevr
     show:
       title: Deizlevr %{user} | %{title}
       user_title: Deizlevr %{user}
-      leave_a_comment: Lezel un addispleg
-      login_to_leave_a_comment_html: '%{login_link} evit lezel un addispleg'
+      leave_a_comment: Skrivañ un evezhiadenn
+      login_to_leave_a_comment_html: '%{login_link} evit skrivañ un evezhiadenn'
       login: Kevreañ
     no_such_entry:
-      title: Enmoned ebet evel-se en deizlevr
-      heading: 'Enmoned ebet gant an id : %{id}'
-      body: Ho tigarez, n'eus enmoned deizlevr ebet nag addsiqpleg ebet gant an id
+      title: Enmont ebet en deizlevr kenglotus
+      heading: 'Enmont ebet gant an id: %{id}'
+      body: Ho tigarez, n'eus enmont deizlevr ebet nag evezhiadenn ebet gant an id
         %{id}. Gwiriit hag-eñ eo skrivet mat, pe marteze hoc'h eus kliket war ul liamm
         fall.
     diary_entry:
       posted_by_html: Postet gant %{link_user} da %{created} e %{language_link}
-      comment_link: Addisplegañ an enmoned-mañ
-      reply_link: Respont d'an enmoned-mañ
+      comment_link: Skrivañ un evezhiadenn d'an enmont-mañ
+      reply_link: Respont d'an enmont-mañ
       comment_count:
         one: Un addispleg
-        zero: Addispleg ebet
-        other: '%{count} addipleg'
-      edit_link: Aozañ an enmoned-mañ
-      hide_link: Kuzhat an enmoned-mañ
-      unhide_link: Diguzhat an enmoned-mañ
+        zero: Evezhiadenn ebet
+        other: '%{count} evezhiadenn'
+      edit_link: Aozañ an enmont-mañ
+      hide_link: Kuzhat an enmont-mañ
+      unhide_link: Diguzhat an enmont-mañ
       confirm: Kadarnaat
-      report: Disklêriañ an enmoned-mañ
+      report: Signaliñ an enmont-mañ
     diary_comment:
-      comment_from_html: Addispleg gant %{link_user}  d'an %{comment_created_at}
-      hide_link: Kuzhat an addispleg-mañ
+      comment_from_html: Evezhiadenn a-berzh %{link_user} d'an %{comment_created_at}
+      hide_link: Kuzhat an evezhiadenn-mañ
       unhide_link: Diguzhat an evezhiadenn-mañ
       confirm: Kadarnaat
-      report: Diskêriañ an evheziadenn-mañ
+      report: Signaliñ an evezhiadenn-mañ
     location:
-      location: 'Lec''hiadur :'
+      location: 'Lec''hiadur:'
       view: Diskwel
-      edit: Kemm
+      edit: Aoz
     feed:
       user:
-        title: Enmonedoù deizlevr OpenStreetMap evit %{user}
-        description: Enmonedoù nevez e deizlevr OpenStreetMap gant %{user}
+        title: Enmontoù deizlevr OpenStreetMap gant %{user}
+        description: Enmontoù nevez e deizlevr OpenStreetMap gant %{user}
       language:
-        title: Enmonedoù deizlevr OpenStreetMap e %{language_name}
-        description: Enmonedoù nevez a-walc'h e deizlevr implijerien OpenStreetMap
+        title: Enmontoù deizlevr OpenStreetMap e %{language_name}
+        description: Enmontoù nevez a-walc'h e deizlevr implijerien OpenStreetMap
           e %{language_name}
       all:
-        title: Enmonedoù en deizlevr OpenStreetMap
-        description: Enmonedoù nevez en deizlevr gant implijerien eus OpenStreetMap
+        title: Enmontoù en deizlevr OpenStreetMap
+        description: Enmontoù nevez en deizlevr gant implijerien OpenStreetMap
     comments:
-      has_commented_on: ↓%{display_name} en deus graet evezhiadennoù diwar-benn ar
-        pennadoù deizlevr-mañ
-      post: Postañ
-      when: Peur
-      comment: Addispleg
-      newer_comments: Evezhiadennoù neveso'h
+      has_commented_on: ↓%{display_name} en deus skrivet evezhiadennoù diwar-benn
+        ar pennadoù deizlevr-mañ
+      post: Embann
+      when: Pegoulz
+      comment: Evezhiadenn
+      newer_comments: Evezhiadennoù neves
       older_comments: Evezhiadennoù koshañ
   geocoder:
     search:
       title:
-        latlon_html: Disoc'hoù diwar <a href="https://openstreetmap.org/">Internal</a>
+        latlon_html: Disoc'hoù diwar <a href="https://openstreetmap.org/">Diabarzh</a>
         ca_postcode_html: Disoc'hoù diwar <a href="https://geocoder.ca/">Geocoder.CA</a>
         osm_nominatim_html: Disoc'hoù diwar <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
           Nominatim</a>
@@ -490,14 +494,14 @@ br:
     search_osm_nominatim:
       prefix:
         aerialway:
-          cable_car: Fungarr
+          cable_car: Karr-fun
           chair_lift: fungador
           drag_lift: Teleski
-          gondola: Funlogell
+          gondola: Logell-fun
           platter: Saver pladoù
           pylon: Peul
-          station: Arsav funlogell
-          t-bar: Sav barrenn e T
+          station: Arsav logell-fun
+          t-bar: Sav barrenn e T
         aeroway:
           aerodrome: Nijva
           airstrip: Leurenn bradañ
@@ -506,50 +510,50 @@ br:
           hangar: Karrdi
           helipad: biñsporzh
           holding_position: Post gortoz
-          parking_position: Plas park
-          runway: Leurenn
-          taxiway: Roudenn evit an taksioù
-          terminal: Termenva
+          parking_position: Plas parkva
+          runway: Hent
+          taxiway: Hent-taksioù aerborzh
+          terminal: Terminal
         amenity:
-          animal_shelter: Goudor evit al loened
-          arts_centre: Kreizenn arz
-          atm: Bilhedaouer
+          animal_shelter: Lec'h-goudor evit al loened
+          arts_centre: Kreizenn an arzoù
+          atm: Bilhedaouerezh
           bank: Ti-bank
           bar: Tavarn
           bbq: Regezer
           bench: Skaoñ
-          bicycle_parking: Parklec'h evit ar beloioù
-          bicycle_rental: Feurmiñ beloioù
-          biergarten: Liorzh ar bier
-          boat_rental: Feurmiñ bagoù
-          brothel: Bordel
+          bicycle_parking: Parklec'h beloioù
+          bicycle_rental: Lec'h feurmiñ beloioù
+          biergarten: Braeerezh en aer vras
+          boat_rental: Lec'h feurmiñ bagoù
+          brothel: Bordell
           bureau_de_change: Burev eskemm
           bus_station: Arsav bus
           cafe: Kafedi
-          car_rental: Feurmiñ kirri
+          car_rental: Lec'h feurmiñ kirri
           car_sharing: Leur genweturañ
-          car_wash: Gwalc'hiñ kirri
+          car_wash: Lec'h gwalc'hiñ kirri
           casino: Kazino
           charging_station: Savlec'h adkargañ
           childcare: Diwaller bugale
           cinema: Sinema
           clinic: Klinikenn
           clock: Horolaj
-          college: Skol-veur pe skol-uhel
+          college: Skol-veur
           community_centre: Sal liezimplij
           courthouse: Lez-varn
           crematorium: Krematoriom
           dentist: Dentour
           doctors: Mezeien
           drinking_water: Dour mat da evañ
-          driving_school: Skol bleinañ
+          driving_school: Skol vleinañ
           embassy: Kannati
-          fast_food: Fast Food
+          fast_food: Pretierezh prim
           ferry_terminal: Porzh karrlistri
           fire_station: Kazarn pomperien
           food_court: ↓Predva
           fountain: Feunteun
-          fuel: Trelosk
+          fuel: Dour-tan
           gambling: C'hoari arc'hant
           grave_yard: Bered
           grit_bin: Bailh holen
@@ -562,7 +566,7 @@ br:
           monastery: Manati
           motorcycle_parking: Parklec'h evit marc'hoù-tan
           nightclub: Klub-noz
-          nursing_home: Ti yec'hed
+          nursing_home: Ti-medisin ar retredidi
           office: Burev
           parking: Parklec'h
           parking_entrance: Mont tre ur parklec'h
@@ -595,7 +599,7 @@ br:
           toilets: Privezioù
           townhall: Ti-kêr
           university: Skol-veur
-          vending_machine: Ingaler emgefre
+          vending_machine: Mekanik gwerzhañ
           veterinary: Surjianerezh evit al loened
           village_hall: Sal ar gumun
           waste_basket: Pod-lastez
@@ -632,7 +636,7 @@ br:
           assembly_point: Lec'h bodañ
           defibrillator: Difibrilator
           landing_site: Tachenn bradañ trumm
-          phone: Pellgomzer evit an trummad
+          phone: Pellgomzer evit an urjañs
           water_tank: Beol dour trumm
           "yes": Trummadoù
         highway:
@@ -645,7 +649,7 @@ br:
           cycleway: Roudenn divrodegoù
           elevator: Pignerez
           emergency_access_point: Poent moned trummadoù
-          footway: Gwenodenn evit an droadeien
+          footway: Gwenodenn evit an dud war-droad
           ford: Roudour
           give_way: Panell "Lezit da dremen"
           living_street: Straed annez
@@ -655,8 +659,8 @@ br:
           motorway_link: Gourhent
           passing_place: Lec'h tremen
           path: Gwenodenn
-          pedestrian: Hent evit an droadeien
-          platform: Leurenn
+          pedestrian: Hent evit an dud war-droad
+          platform: Pladfurm
           primary: Hent kentañ renk
           primary_link: Pennhent
           proposed: Hent kinniget
@@ -1344,11 +1348,11 @@ br:
           kemmoù'
         subject_other: '[OpenStreetMap] %{commenter} en deus addispleget unan eus
           ho notennoù a sell ouzhoc''h'
-        your_changeset: '[OpenStreetMap] %{commenter} en deus addispleget unan eus
-          ho holladoù kemmoù krouet d''an %{time}'
-        commented_changeset: '%{commenter} en deus lezet un evezhiadenn war un hollad
-          cheñchamantoù kartenn emaoc''h oc''h evezhiañ, krouet gant %{changeset_author}
-          d''an %{time}'
+        your_changeset: '%{commenter} en deus skrivet un evezhiadenn d''an/ar %{time}
+          war unan eus ho hollad cheñchamantoù'
+        commented_changeset: '%{commenter} en deus skrivet un evezhiadenn d''an/ar
+          %{time} war un hollad cheñchamantoù emaoc''h o sellet outañ hag a zo bet
+          krouet gant %{changeset_author}'
         partial_changeset_with_comment: gant an addispleg '%{changeset_comment}'
         partial_changeset_without_comment: Hep evezhiadenn
       details: Muioc'h a ditouroù war an holl cheñchamantoù e %{url}.
@@ -1454,17 +1458,11 @@ br:
         ouzh <a href=''%{copyright_path}''>Aotre-eilañ ha pajenn an aotre-implij</a>
         evit gouzout hiroc''h.'
       legal_title: Lezennel
-      legal_1_html: "Al lec'hienn-mañ hag e-leizh a servijoù all kar zo korvoet ent
-        furmel gant an <a href=\"https://osmfoundation.org/\">Diazezaddur OpenStreetMap</a>
-        (OSMF) \nen anv ar gumuniezh.\nEvit implijout an holl servijoù kinniget gant
-        an OSMF e ranker doujañ d'hor \n<a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">
-        Politikerezh war an implijoù degemeret</a> ha d'hor <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">Politikerzh
-        prevezded</a>.\n<br>\nKit <a href=\"https://osmfoundation.org/Contact\">contacter
-        l'OSMF</a> e darempred gant an OSMF</a>, mar plij, m'ho peus goulennoù da
-        sevel diwar-benn an aotreoù-implijout, ar gwirioù oberour pe diwar-benn goulennoù
-        lezennel all.\n<br>\nOpenStreetMap, al logo gant ar brasaer ha ''State of
-        the Map'' zo<a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">merkoù
-        marilhet OSMF</a>."
+      legal_1_html: |-
+        Al lec'hienn-mañ ha kalz servijoù liammet ouzhpenn a vez operataet gant <a href='https://osmfoundation.org/'>Diazezadur OpenStreetMap</a> (OSMF)
+        en anv ar gumuniezh. Implijout hor servijoù operataet gant OSMF a zo suj d'hon
+        <a href="https://wiki.osmfoundation.org/wiki/Terms_of_Use">Termoù Implij</a>, <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
+        Politikerezh an implijoù degemeret</a> hag hon <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Folitikerezh prevezded</a>.
       partners_title: Kevelerien
     copyright:
       foreign:
index 9d2c1caeb786196ca1b774ae7562443888b834d8..6f3dfa95b652a56451c45d4ad9a0914dd194d76c 100644 (file)
@@ -312,7 +312,7 @@ ce:
     changeset_paging_nav:
       showing_page: АгӀо %{page}
       next: ТӀехьа йогӀург →
-      previous: ← Хьалха йоьдург
+      previous: ← Хьалхара
     changeset:
       anonymous: Аноним
       no_edits: (нисдарш дац)
@@ -890,7 +890,7 @@ ce:
         entry:
           track: Ворданан некъ
     richtext_area:
-      preview: Хьалха хьажар
+      preview: Хьалххе хьажар
     markdown_help:
       subheading: Корталг
       link: Хьажорг
@@ -921,7 +921,7 @@ ce:
       password: 'Пароль:'
       openid_html: '%{logo} OpenID:'
       remember: 'Дагалаца со:'
-      lost password link: Ð\9fаÑ\80олÑ\8c Ð¹Ð¸Ñ\86елла?
+      lost password link: Ð\99иÑ\86Ñ\8aелла Ð¿Ð°Ñ\80олÑ\8c?
       login_button: ЧугӀо
       register now: ДӀадазло
     logout:
@@ -930,7 +930,7 @@ ce:
       logout_button: Болх дӀаберзор
     lost_password:
       title: Пароль меттахӀоттаяр
-      heading: Йицелла пароль?
+      heading: Йицъелла пароль?
       email address: 'Электронан поштан адрес:'
       new password button: Керла пароль кхосса соьга
     reset_password:
@@ -1060,7 +1060,7 @@ ce:
       revoker_name: ДӀаяьккхина блок
       showing_page: АгӀо %{page}
       next: ТӀехьа йогӀург →
-      previous: ← Хьалха йоьдург
+      previous: ← Хьалхара
   notes:
     mine:
       heading: '%{user} декъашхочун билгалонаш'
index fd8779f5d9b1e27d3e4f036b86afa9e3de520075..18dfe3f2031f4413612e333710e5a3320861a072 100644 (file)
@@ -99,6 +99,7 @@ cs:
       relation: Relace
       relation_member: Člen relace
       relation_tag: Tag relace
+      report: Hlášení
       session: Relace
       trace: Stopa
       tracepoint: Bod stopy
@@ -167,8 +168,8 @@ cs:
         one: více než před rokem
         other: před více než %{count} lety
       x_seconds:
-        one: před vteřinou
-        other: před %{count} vteřinami
+        one: před sekundou
+        other: před %{count} sekundami
       x_minutes:
         one: před minutou
         other: před %{count} minutami
@@ -324,6 +325,7 @@ cs:
         tag: Stránka s popisem značky %{key}=%{value} na wiki
       wikidata_link: Položka %{page} na Wikidatech
       wikipedia_link: Článek %{page} na Wikipedii
+      wikimedia_commons_link: Položka %{page} na Wikimedia Commons
       telephone_link: Volat %{phone_number}
       colour_preview: Náhled barvy %{colour_value}
     note:
@@ -778,7 +780,7 @@ cs:
           crane: Jeřáb
           dolphin: Kotvicí bod
           dyke: Hráz
-          embankment: Nábřeží
+          embankment: Násep
           flagpole: Vlajkový stožár
           gasometer: Plynojem
           groyne: Vlnolam
@@ -1253,8 +1255,10 @@ cs:
         import_failures_url: http://wiki.openstreetmap.org/wiki/GPX_Import_Failures?uselang=cs
       success:
         subject: '[OpenStreetMap] Úspěšný import GPX'
-        loaded_successfully: se úspěšně nahrál s %{trace_points} z možných %{possible_points}
-          bodů.
+        loaded_successfully:
+          one: se úspěšně nahrál s %{trace_points} z možného 1 bodu.
+          other: se úspěšně nahrál s %{trace_points} z možných %{possible_points}
+            bodů.
     signup_confirm:
       subject: '[OpenStreetMap] Vítejte v OpenStreetMap'
       greeting: Ahoj!
@@ -1438,10 +1442,16 @@ cs:
         pod stejnou licencí. Podrobnosti najdete na stránce <a href=''%{copyright_path}''>Autorská
         práva a licence</a>.'
       legal_title: Právní informace
-      legal_1_html: |-
-        Tento web a mnoho dalších souvisejících služeb za komunitu oficiálně provozuje <a href='https://osmfoundation.org/'>OpenStreetMap Foundation</a> (OSMF). Použití všech služeb provozovaných OSMF podléhá našim <a href="https://wiki.osmfoundation.org/wiki/Terms_of_Use">Podmínkám užití</a>, <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Pravidlům přijatelného užití</a> a našim <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Pravidlům ochrany osobních údajů</a>.
-        <br>
+      legal_1_html: Tento web a mnoho dalších souvisejících služeb za komunitu oficiálně
+        provozuje <a href='https://osmfoundation.org/'>OpenStreetMap Foundation</a>
+        (OSMF). Použití všech služeb provozovaných OSMF podléhá našim <a href="https://wiki.osmfoundation.org/wiki/Terms_of_Use">Podmínkám
+        užití</a>, <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Pravidlům
+        přijatelného užití</a> a našim <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">Pravidlům
+        ochrany osobních údajů</a>.
+      legal_2_html: |-
         Pokud máte problémy či dotazy týkající se licencování, autorských práv či jiných právních záležitostí, <a href='https://osmfoundation.org/Contact'>kontaktujte prosím OSMF</a>.
+        <br>
+        OpenStreetMap, logo s lupou a State of the Map jsou <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">registrované ochranné známky OSMF</a>.
       partners_title: Partneři
     copyright:
       foreign:
@@ -1915,7 +1925,8 @@ cs:
       pending: ZPRACOVÁVÁ SE
       count_points:
         one: 1 bod
-        other: '%{count} bodů'
+        few: '%{count} body'
+        many: '%{count} bodů'
       more: více
       trace_details: Zobrazit podrobnosti stopy
       view_map: Zobrazit mapu
@@ -2498,16 +2509,20 @@ cs:
           other: '%{count} hodiny'
         days:
           one: 1 den
-          other: '%{count} dnů'
+          few: '%{count} dny'
+          many: '%{count} dnů'
         weeks:
           one: 1 týden
-          other: '%{count} týdnů'
+          few: '%{count} týdny'
+          many: '%{count} týdnů'
         months:
           one: 1 měsíc
-          other: '%{count} měsíců'
+          few: '%{count} měsíce'
+          many: '%{count} měsíců'
         years:
           one: 1 rok
-          other: '%{count} let'
+          few: '%{count} roky'
+          many: '%{count} let'
     blocks_on:
       title: Zablokování uživatele %{name}
       heading_html: Seznam zablokování uživatele %{name}
@@ -2589,10 +2604,12 @@ cs:
         title: Ukázat moji polohu
         metersPopup:
           one: Od tohoto bodu jste vzdáleni metr
-          other: Od tohoto bodu jste vzdáleni %{count} metrů
+          few: Od tohoto bodu jste vzdáleni %{count} metry
+          many: Od tohoto bodu jste vzdáleni %{count} metrů
         feetPopup:
           one: Od tohoto bodu jste vzdáleni jednu stopu
-          other: Od tohoto bodu jste vzdáleni %{count} stop
+          few: Od tohoto bodu jste vzdáleni %{count} stopy
+          many: Od tohoto bodu jste vzdáleni %{count} stop
       base:
         standard: Standardní
         cycle_map: Cyklomapa
@@ -2608,6 +2625,11 @@ cs:
       copyright: © <a href='%{copyright_url}'>přispěvatelé OpenStreetMap</a>
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>Poskytněte dar</a>
       terms: <a href='%{terms_url}' target='_blank'>Pravidla webu a API</a>
+      thunderforest: Dlaždice díky <a href='%{thunderforest_url}' target='_blank'>Andy
+        Allanovi</a>
+      hotosm: Styl dlaždic <a href='%{hotosm_url}' target='_blank'>Humanitárního týmu
+        OpenStreetMap</a> provozuje <a href='%{osmfrance_url}' target='_blank'>OpenStreetMap
+        Francie</a>
     site:
       edit_tooltip: Upravit mapu
       edit_disabled_tooltip: Pro editaci mapy přejděte na větší měřítko
index be475269992ec987492dd003d10179adc240a239..812bb1e9b1157385acb1e4668f93579f2af498d1 100644 (file)
@@ -398,7 +398,7 @@ diq:
           university: Uniwersita
           vending_machine: Makineya Roten
           veterinary: Veteriner
-          village_hall: Wedey Dewer
+          village_hall: Wedaya Dewe
           waste_basket: Tenkey Sıloy
           waste_disposal: Cay sıloy
           youth_centre: Merkezê Gencan
@@ -646,7 +646,7 @@ diq:
           suburb: Mahle / Banliyö
           town: bacar
           unincorporated_area: Wareyo Yewnêbiyaye
-          village: Dew
+          village: Dewe
           "yes": Ca
         railway:
           abandoned: Asınraya Terkkerdiye
index 9845e2e37aa4a9c006a8c95f7b93bb42f473b51e..b6107081c3f4d94873b37e59f71433a3aba8d1c6 100644 (file)
@@ -1373,7 +1373,7 @@ eo:
       reply_button: Respondi
       unread_button: Marki kiel nelegitan
       destroy_button: Forigi
-      back: Reen
+      back: Reveni
       to: Al
       wrong_user: Vi estas ensalutinta kiel '%{user}', sed la mesaĝo, kiun vi volas
         legi estas sendita al tiu uzanto. Bonvolu ensaluti kiel propra uzanto por
index 58173153ae68eb55e502d24ea1dd72e907fe46c0..54daac79eaba6001f5521bec6143580e3f2bd564 100644 (file)
@@ -193,8 +193,11 @@ fa:
   auth:
     providers:
       none: هیچ‌کدام
+      openid: OpenID
       google: گوگل
       facebook: فیس‌بوک
+      windowslive: ویندوز لایو
+      github: گیت‌هاب
       wikipedia: ویکی‌پدیا
   api:
     notes:
@@ -487,8 +490,10 @@ fa:
           platter: بالابر بشقابی
           pylon: ستون
           station: ایستگاه راه هوایی
+          t-bar: T-Bar چپ
         aeroway:
           aerodrome: فرودگاه هواپیما
+          airstrip: پایگاه هوایی
           apron: پیشگاه
           gate: ورودی
           hangar: آشیانه هواپیما
@@ -540,6 +545,7 @@ fa:
           fuel: پمپ بنزین
           gambling: قمار
           grave_yard: محوطهٔ گورستان
+          grit_bin: گریت‌بین
           hospital: بیمارستان
           hunting_stand: شکارگاه
           ice_cream: بستنی فروشی
@@ -596,6 +602,7 @@ fa:
           protected_area: منطقه حفاظت‌شده
         bridge:
           aqueduct: قنات
+          boardwalk: Boardwalk
           suspension: پل معلق
           swing: پل نوسان
           viaduct: پل راه آهن روی دره
@@ -615,6 +622,7 @@ fa:
           "yes": فروشگاه قایق
         emergency:
           ambulance_station: ایستگاه آمبولانس
+          assembly_point: نقطه جمع‌شدن
           defibrillator: برگرداننده تپش قلب
           landing_site: محوطه فرود اضطراری
           phone: تلفن اضطراری
@@ -759,6 +767,7 @@ fa:
           water_park: پارک آبی
           "yes": فراغت
         man_made:
+          adit: مدخل
           beacon: نشانهٔ دریایی
           beehive: کندو عسل
           breakwater: موج‌شکن
@@ -766,7 +775,9 @@ fa:
           bunker_silo: پناهگاه
           chimney: دودکش
           crane: جرثقیل
+          dolphin: محل پهلوگیری
           dyke: خاکریز
+          embankment: پشته
           flagpole: میله پرچم
           gasometer: گازسنج
           groyne: آبشکن
@@ -787,6 +798,7 @@ fa:
           watermill: آسیاب آبی
           water_tower: برج آب
           water_well: خوب
+          water_works: مربوط به آب
           windmill: آسیاب بادی
           works: کارخانه
           "yes": ساخت بشر
@@ -969,6 +981,7 @@ fa:
           organic: فروشگاه مواد غذایی آلی
           outdoor: فروشگاه رو باز
           paint: رنگ‌فروشی
+          pawnbroker: كارگشا
           pet: فروشگاه حیوانات خانگی
           pharmacy: داروخانه
           photo: فروشگاه عکس
@@ -1109,6 +1122,7 @@ fa:
       reopened: وضعیت مسئله روی «باز» تنظیم شد
     comments:
       comment_from_html: نظر از %{user_link} در %{comment_created_at}
+      reassign_param: مشکل تخصیص مجدد؟
     reports:
       reported_by_html: در %{updated_at}،‏ %{user} آن را به‌عنوان %{category} گزارش
         کرد
@@ -1864,7 +1878,7 @@ fa:
     visibility:
       private: خصوصی (همرسانی فقط به‌صورت گمنام، نقاط نامرتب)
       public: عمومی (نمایش در لیست ردها اما گمنام، نقاط نامرتب)
-      trackable: قابل ردیابی (همرسانی فقط به‌صورت ناشناس، نقاط مرتب همراه با مهر زمان)
+      trackable: قابل ردیابی (همرسانی فقط به‌صورت گمنام، نقاط مرتب همراه با مهر زمان)
       identifiable: قابل شناسایی (نمایش در لیست ردها و قابل شناسایی، نقاط مرتب همراه
         با مهر زمان)
     new:
@@ -2695,6 +2709,10 @@ fa:
           %{directions}
         onramp_right_without_exit: از خروجی سمت راست به %{name} بپیچید
         onramp_right_with_directions: به راست بپیچید و به رمپ بروید به‌سمت %{directions}
+        onramp_right_with_name_directions: در رامپ به راست به %{name} بروید، به‌سمت
+          %{directions}
+        onramp_right_without_directions: چرخش به راست به سوی رمپ
+        onramp_right: چرخش به راست به سوی رمپ
         endofroad_right_without_exit: در انتهای مسیر به طرف راست به %{name} بپیچید
         merge_right_without_exit: کمی به راست به %{name}
         fork_right_without_exit: در محل جداشدن به طرف راست به %{name} بپیچید
@@ -2704,6 +2722,10 @@ fa:
         sharp_left_without_exit: کاملاً به چپ به %{name} بپیچید
         turn_left_without_exit: به چپ به %{name} بپیچید
         offramp_left: انتخاب رمپ سمت چپ
+        offramp_left_with_exit: از خروجی %{exit} طرف چپ خارج شوید
+        offramp_left_with_exit_name: در چپ از خروجی %{exit} به %{name} بروید
+        offramp_left_with_exit_directions: در چپ از خروجی %{exit} به‌سمت %{directions}
+          بروید
         offramp_left_with_name: خروجی طرف چپ به %{name} را انتخاب کنید
         onramp_left_without_exit: از خروجی سمت چپ به %{name} بپیچید
         onramp_left_without_directions: چرخش به چپ به سمت رمپ
index db8e99dca248bed755dd8326bd6b3d2515674a6d..f1683c444a758b9379e13ce8b9e8294fef78787b 100644 (file)
@@ -1,6 +1,7 @@
 # Messages for Finnish (suomi)
 # Exported from translatewiki.net
 # Export driver: phpyaml
+# Author: 01miki10
 # Author: Abijeet Patro
 # Author: Alluk.
 # Author: Antsa
@@ -81,6 +82,7 @@ fi:
       diary_comment: Päiväkirjakommentti
       diary_entry: Päiväkirjamerkintä
       friend: Kaveri
+      issue: Ongelma
       language: Kieli
       message: Viesti
       node: Piste
@@ -97,6 +99,7 @@ fi:
       relation: Relaatio
       relation_member: Relaation jäsen
       relation_tag: Relaation tagi
+      report: Raportti
       session: Istunto
       trace: Jälki
       tracepoint: Jälkipiste
@@ -193,6 +196,15 @@ fi:
     remote:
       name: Kauko-ohjaus
       description: Kauko-ohjaus (JOSM tai Merkaartor)
+  auth:
+    providers:
+      none: Ei mitään
+      openid: OpenID
+      google: Google
+      facebook: Facebook
+      windowslive: Windows Live
+      github: GitHub
+      wikipedia: Wikipedia
   api:
     notes:
       comment:
@@ -1113,9 +1125,10 @@ fi:
     reopen:
       reopened: Tapaus on merkitty käsittelyssä olevaksi
     comments:
+      comment_from_html: Kommentti käyttäjältä %{user_link} %{comment_created_at}
       reassign_param: Haluatko määrittää tapauksen tilan uudelleen?
     reports:
-      reported_by_html: Käyttäjä %{user} ilmiantanut merkinnällä %{category}
+      reported_by_html: Käyttäjä %{user} ilmiantanut merkinnällä %{category} %{updated_at}
     helper:
       reportable_title:
         diary_comment: '%{entry_title}, kommenttitunnus %{comment_id}'
@@ -1420,16 +1433,9 @@ fi:
         Lisätietoja on <a href=''%{copyright_path}''>Tekijänoikeus ja lisenssi</a>
         -sivulla.'
       legal_title: Lakitekninen jako
-      legal_1_html: "Tämä ja monet muut OSM-sivustot ovat muodollisesti <a href='https://osmfoundation.org/'>OpenStreetMap-säätiön</a>
-        (OSMF) hallinnoimia OSM-yhteisön puolesta. Kaikkien näiden sivustojen käyttöön
-        sovelletaan <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nsallitun
-        käytön käytäntöjä</a>, <a href=\"https://wiki.osmfoundation.org/wiki/Terms_of_Use\">käyttöehtoja</a>
-        ja <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">tietosuojakäytäntöä</a>
-        (molemmat sisällöt saatavilla vain englanniksi).\n<br> \n<a href='https://osmfoundation.org/Contact'>Ota
-        yhteys OSMF:ään</a> lisensointi-, tekijänoikeus- ja muissa lakiteknisissä
-        kysymyksissä.\n<br>\nNimi OpenStreetMap, suurennuslasilogo ja slogan State
-        of the Map ovat <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">säätiön
-        rekisteröimiä tavaramerkkejä</a>."
+      legal_1_html: |-
+        Tämä sivusto ja monet siihen liittyvät palvelut ovat muodollisesti <a href='https://osmfoundation.org/'>OpenStreetMap-säätiön</a> (OSMF) hallinnoimia OSM-yhteisön puolesta. Kaikkien OSMF:n hallinnoimien palveluiden käyttöön sovelletaan <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">
+        sallitun käytön käytäntöjä</a>, <a href="https://wiki.osmfoundation.org/wiki/Terms_of_Use">käyttöehtoja</a> ja <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">tietosuojakäytäntöä</a> (molemmat sisällöt saatavilla vain englanniksi).
       partners_title: Kumppanit
     copyright:
       foreign:
@@ -2583,6 +2589,12 @@ fi:
         out: Loitonna
       locate:
         title: Näytä oma sijaintini
+        metersPopup:
+          one: Olet yhden metrin etäisyydellä tästä pisteessä
+          other: Olet %{count} metrin etäisyydellä tästä pisteestä
+        feetPopup:
+          one: Olet yhden jalan etäisyydellä tästä pisteestä
+          other: Olet %{count} jalan etäisyydellä tästä pisteestä
       base:
         standard: Perinteinen
         cycle_map: Pyöräilykartta
index c7739624895ef3e2420192eae27fbd41850ab4c5..2711ea746a644ca84b6215c5e7d0f6e4a76db8e1 100644 (file)
@@ -1328,7 +1328,7 @@ hu:
       old_messages:
         one: egy régi üzeneted
         other: '%{count} régi üzeneted'
-      from: Innen
+      from: Feladó
       subject: Tárgy
       date: Érkezett
       no_messages_yet_html: Nincs még üzeneted. Miért nem veszed fel a kapcsolatot
@@ -1361,7 +1361,7 @@ hu:
       messages:
         one: Egy elküldött üzeneted van
         other: '%{count} elküldött üzeneted van'
-      to: Ide
+      to: Címzett
       subject: Tárgy
       date: Elküldve
       no_sent_messages_html: Nincs még elküldött üzeneted. Miért nem veszed fel a
@@ -1373,14 +1373,14 @@ hu:
         jelentkezz be a helyes felhasználóval.
     show:
       title: Üzenet olvasása
-      from: Innen
+      from: Feladó
       subject: Tárgy
       date: Érkezett
       reply_button: Válasz
       unread_button: Jelölés olvasatlanként
       destroy_button: Törlés
       back: Vissza
-      to: Ide
+      to: Címzett
       wrong_user: „%{user}” néven jelentkeztél be, de a levelet, amit lekérdeztél
         olvasásra, nem ez a felhasználó küldte vagy kapta. Annak érdekében, hogy elolvashasd
         a levelet, jelentkezz be a helyes felhasználóval.
@@ -1859,7 +1859,7 @@ hu:
     create:
       upload_trace: GPS nyomvonal feltöltése
       trace_uploaded: A GPX fájl feltöltése megtörtént, és várakozik az adatbázisba
-        való beillesztésre. Ez általában fél órán belül megtörténik, és fogsz kapni
+        való beillesztésre. Ez általában fél órán belül megtörténik, és kapni fogsz
         egy e-mailt, amint elkészült.
       upload_failed: A GPX feltöltése meghiúsult. Kérjük próbálja újra.
       traces_waiting: '%{count} nyomvonalad várakozik feltöltésre. Kérlek fontold
index ea34bc3fe6c58d768c47bb42d1d2a79be511e44b..39a712501935de485618ab3fcdbde7f55a41b0a1 100644 (file)
@@ -10,6 +10,7 @@
 # Author: Dewisulistio
 # Author: Emirhartato
 # Author: Farras
+# Author: Hanif Al Husaini
 # Author: HarryMahar
 # Author: Hidayatsrf
 # Author: Ilham151096
@@ -58,6 +59,7 @@ id:
   activerecord:
     errors:
       messages:
+        invalid_email_address: tidak tampak sebagai alamat e-mail yang sah
         email_address_not_routable: tidak dapat dirutekan
     models:
       acl: Daftar Kontrol Akses
@@ -67,6 +69,7 @@ id:
       diary_comment: Komentar pada Catatan Harian
       diary_entry: Entri Catatan harian
       friend: Teman
+      issue: Masalah
       language: Bahasa
       message: Pesan
       node: Node/Titik
@@ -83,6 +86,7 @@ id:
       relation: Relasi
       relation_member: Anggota Relasi
       relation_tag: Tag Relasi
+      report: Laporan
       session: Sesi
       trace: Jejak
       tracepoint: Titik Digitasi
@@ -128,7 +132,43 @@ id:
         pass_crypt: Kata Sandi
   datetime:
     distance_in_words_ago:
+      about_x_hours:
+        one: sekitar 1 jam yang lalu
+        other: sekitar %{count} jam yang lalu
+      about_x_months:
+        one: sekitar 1 bulan yang lalu
+        other: sekitar %{count} bulan yang lalu
+      about_x_years:
+        one: sekitar 1 tahun yang lalu
+        other: sekitar %{count} tahun yang lalu
+      almost_x_years:
+        one: hampir 1 tahun yang lalu
+        other: hampir %{count} tahun yang lalu
       half_a_minute: setengah menit yang lalu
+      less_than_x_seconds:
+        one: tak sampai 1 detik yang lalu
+        other: tak sampai %{count} detik yang lalu
+      less_than_x_minutes:
+        one: tak sampai 1 menit yang lalu
+        other: tak sampai %{count} menit yang lalu
+      over_x_years:
+        one: lebih dari 1 tahun yang lalu
+        other: lebih dari %{count} tahun yang lalu
+      x_seconds:
+        one: 1 detik yang lalu
+        other: '%{count} detik yang lalu'
+      x_minutes:
+        one: 1 menit yang lalu
+        other: '%{count} menit yang lalu'
+      x_days:
+        one: 1 hari yang lalu
+        other: '%{count} hari yang lalu'
+      x_months:
+        one: 1 bulan yang lalu
+        other: '%{count} bulan yang lalu'
+      x_years:
+        one: 1 tahun yang lalu
+        other: '%{count} tahun yang lalu'
   editor:
     default: Standar (saat ini %{name})
     potlatch:
@@ -143,6 +183,15 @@ id:
     remote:
       name: Pengendali Jarak Jauh
       description: Remote Control (JOSM atau Merkaartor)
+  auth:
+    providers:
+      none: Tidak ada
+      openid: OpenID
+      google: Google
+      facebook: Facebook
+      windowslive: Windows Live
+      github: GitHub
+      wikipedia: Wikipedia
   api:
     notes:
       comment:
@@ -207,6 +256,8 @@ id:
         title_comment: Set Perubahan %{id} - %{comment}
       join_discussion: Masuk untuk bergabung diskusi
       discussion: Diskusi
+      still_open: Set perubahan masih terbuka - diskusi akan dibuka ketika set perubahan
+        telah ditutup.
     node:
       title_html: 'Simpul: %{name}'
       history_title_html: 'Riwayat Simpul: %{name}'
@@ -266,6 +317,7 @@ id:
         tag: Deskripsi halaman wiki untuk  %{key}=%{value} tag
       wikidata_link: Item %{page} di Wikidata
       wikipedia_link: Artikel %{page} di Wikipedia
+      wikimedia_commons_link: Item %{page} di Wikimedia Commons
       telephone_link: Hubungi %{phone_number}
     note:
       title: 'Catatan: %{id}'
@@ -330,7 +382,7 @@ id:
   changeset_comments:
     comment:
       comment: 'Komentar baru di set perubahan #%{changeset_id} oleh %{author}'
-      commented_at_by_html: Diperbarui %{when} yang lalu oleh %{user}
+      commented_at_by_html: Diperbarui %{when} oleh %{user}
     comments:
       comment: 'Komentar baru di set perubahan #%{changeset_id} oleh %{author}'
     index:
@@ -441,6 +493,7 @@ id:
           gate: Gerbang
           hangar: Hanggar
           helipad: Helipad
+          parking_position: Posisi Parkir
           runway: Landasan pacu
           taxiway: Landas hubung
           terminal: Terminal
@@ -712,6 +765,7 @@ id:
           crane: Derek
           embankment: Tanggul
           flagpole: Tiang Bendera
+          gasometer: Kilang
           kiln: Tanur
           lighthouse: Mercusuar
           mine: Tambang
@@ -998,6 +1052,7 @@ id:
       title: Isu
       select_status: Pilih Status
       select_type: Pilih Jenis
+      not_updated: Tidak Diperbarui
       search: Cari
       user_not_found: Pengguna tidak ada
       issues_not_found: Isu tidak ditemukan
@@ -1116,6 +1171,7 @@ id:
     partners_ucl: UCL
     partners_bytemark: Hosting Bytemark
     partners_partners: mitra
+    tou: Ketentuan Penggunaan
     osm_offline: Database OpenStreetMap saat ini sedang dimatikan karena sedang dilakukan
       pekerjaan pemeliharaan database penting.
     osm_read_only: OpenStreetMap database saat ini adalah pada mode read-only (hanya
@@ -1638,6 +1694,7 @@ id:
       where_am_i: Di mana ini?
       where_am_i_title: Deskripsikan lokasi Anda saat ini menggunakan mesin pencari
       submit_text: Lanjut
+      reverse_directions_text: Balikkan Arah
     key:
       table:
         entry:
@@ -1712,7 +1769,7 @@ id:
       edit: Edit
       preview: Tinjauan
     markdown_help:
-      title_html: Diurai dengan <a href="https://daringfireball.net/projects/markdown/">Markdown</a>
+      title_html: Diurai dengan <a href="https://kramdown.gettalong.org/quickref.html">kramdown</a>
       headings: Judul
       heading: Judul
       subheading: Subjudul
@@ -1785,6 +1842,7 @@ id:
       identifiable: Dapat Diidentifikasi (ditampilkan dalam daftar jejak dan sebagai
         diidentifikasi, mengatur poin dengan waktu pengambilan)
     new:
+      upload_trace: Unggah Jejak GPS
       upload_gpx: 'Unggah File GPX:'
       description: Deskripsi
       tags: 'Tags:'
@@ -1822,6 +1880,8 @@ id:
       tags_help: dipisahkan oleh koma
       visibility: Visibilitas
       visibility_help: apa artinya ini?
+    update:
+      updated: Jejak diperbarui
     trace_optionals:
       tags: 'Tags:'
     show:
@@ -1843,6 +1903,7 @@ id:
       delete_trace: Hapus trek ini
       trace_not_found: Jejak tidak ditemukan!
       visibility: Visibilitas
+      confirm_delete: Hapus jejak ini?
     trace_paging_nav:
       showing_page: Halaman %{page}
       older: Jejak-jejak Lama
@@ -2556,7 +2617,9 @@ id:
     directions:
       ascend: Naik
       engines:
+        fossgis_osrm_bike: Sepeda (OSRM)
         fossgis_osrm_car: Mobil (OSRM)
+        fossgis_osrm_foot: Jalan Kaki (OSRM)
         graphhopper_bicycle: Sepeda (GraphHopper)
         graphhopper_car: Mobil (GraphHopper)
         graphhopper_foot: Jalan Kaki (GraphHopper)
@@ -2565,7 +2628,7 @@ id:
       distance: Jarak
       errors:
         no_route: Gagal menemukan rute antara dua tempat tersebut.
-        no_place: Maaf - tempat tidak ditemukan.
+        no_place: Maaf - '%{place}' tidak ditemukan.
       instructions:
         continue_without_exit: Lurus ke %{name}
         slight_right_without_exit: Kanan sedikit ke %{name}
@@ -2587,10 +2650,10 @@ id:
         slight_left_without_exit: Kiri sedikit ke %{name}
         via_point_without_exit: (lewat tempat)
         follow_without_exit: Ikuti %{name}
-        roundabout_without_exit: Di bundaran ambil %{name}
+        roundabout_without_exit: Di bundaran ambil keluar ke %{name}
         leave_roundabout_without_exit: Tinggalkan bundaran - %{name}
         stay_roundabout_without_exit: Tetap di bundaran - %{name}
-        start_without_exit: Mulai di ujung %{name}
+        start_without_exit: Mulai di %{name}
         destination_without_exit: Tiba di tujuan
         against_oneway_without_exit: Lawan arah pada %{name}
         end_oneway_without_exit: Akhir dari satu arah pada %{name}
index 91f727600df4275b6821351d9bab963d32ad59e9..48115b6a297d0285136422d8aa3f2ff7478e63ab 100644 (file)
@@ -93,6 +93,7 @@ it:
       diary_comment: Commento al diario
       diary_entry: Voce del diario
       friend: Amico
+      issue: Problema
       language: Lingua
       message: Messaggio
       node: Nodo
@@ -109,6 +110,7 @@ it:
       relation: Relazione
       relation_member: Membro della relazione
       relation_tag: Etichetta della relazione
+      report: Segnalazione
       session: Sessione
       trace: Tracciato
       tracepoint: Punto del tracciato
@@ -444,7 +446,7 @@ it:
         %{id}. Controlla la digitazione, oppure potrebbe essere che il collegamento
         che si è seguito sia errato.
     diary_entry:
-      posted_by_html: Inviato da %{link_user} il %{created} in %{language_link}
+      posted_by_html: Pubblicato da %{link_user} il %{created} in %{language_link}
       comment_link: Commenta questa voce
       reply_link: Rispondi a questa voce
       comment_count:
@@ -2659,6 +2661,12 @@ it:
         out: Zoom indietro
       locate:
         title: Mostra la mia posizione
+        metersPopup:
+          one: Ti trovi entro un metro da questo punto
+          other: Ti trovi entro %{count} metri da questo punto
+        feetPopup:
+          one: Ti trovi entro un piede da questo punto
+          other: Ti trovi entro %{count} piedi da questo punto
       base:
         standard: Standard
         cycle_map: Mappa ciclabile
@@ -2675,6 +2683,11 @@ it:
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>Fai una donazione</a>
       terms: <a href='%{terms_url}' target='_blank'>Condizioni del sito web e delle
         API</a>
+      thunderforest: Tasselli forniti da <a href='%{thunderforest_url}' target='_blank'>Andy
+        Allan</a>
+      hotosm: Stile dei tasselli di <a href='%{hotosm_url}' target='_blank'>Humanitarian
+        OpenStreetMap Team</a> ospitato da <a href='%{osmfrance_url}' target='_blank'>OpenStreetMap
+        France</a>
     site:
       edit_tooltip: Modifica la mappa
       edit_disabled_tooltip: Zooma per modificare la mappa
@@ -2686,7 +2699,7 @@ it:
       queryfeature_disabled_tooltip: Ingrandisci sugli elementi della ricerca
     changesets:
       show:
-        comment: Commento
+        comment: Commenta
         subscribe: Iscriviti
         unsubscribe: Cancella iscrizione
         hide_comment: nascondi
index d86dbf368f1a29bcf13330d0de81ad5139793d1f..d073beeb68aaa16e62eaed243161f5b671c811ac 100644 (file)
@@ -85,6 +85,7 @@ ja:
       diary_comment: 日記コメント
       diary_entry: 日記エントリ
       friend: 友達
+      issue: 問題点
       language: 言語
       message: メッセージ
       node: ノード
@@ -101,6 +102,7 @@ ja:
       relation: リレーション
       relation_member: リレーションのメンバー
       relation_tag: リレーションのタグ
+      report: 報告
       session: セッション
       trace: トレース
       tracepoint: トレースポイント
@@ -202,6 +204,12 @@ ja:
       description: 遠隔制御 (JOSM または Merkaartor)
   auth:
     providers:
+      none: なし
+      openid: OpenID
+      google: Google
+      facebook: Facebook
+      windowslive: Windows Live
+      github: GitHub
       wikipedia: ウィキペディア
   api:
     notes:
@@ -321,6 +329,7 @@ ja:
         tag: '%{key}=%{value} タグのウィキでの説明ページ'
       wikidata_link: Wikidataの%{page}項目目
       wikipedia_link: ウィキペディアの %{page} 記事
+      wikimedia_commons_link: ウィキメディアコモンズの項目The %{page}件
       telephone_link: '%{phone_number}に電話'
       colour_preview: 色彩%{colour_value}プレビュー
     note:
@@ -1113,6 +1122,7 @@ ja:
     reopen:
       reopened: 問題の状態は「未解決」に設定されました
     comments:
+      comment_from_html: '%{comment_created_at} の %{user_link} さんからのコメント'
       reassign_param: 問題を再度、割り当てますか?
     reports:
       reported_by_html: '%{user}による %{category} として%{updated_at}に報告済み'
@@ -1379,6 +1389,10 @@ ja:
       legal_1_html: このサイトおよびその他の関連サービスは、コミュニティを代表して<a href='https://osmfoundation.org/'>OpenStreetMap財団</a>
         (OSMF) が運営しています。OpenStreetMap財団の運営するサービス利用者は、私たちの定める<a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">利用規定</a>ならびに当財団の<a
         href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">プライバシーに関する規定</a>の対象となります。
+      legal_2_html: |-
+        ライセンス、著作権その他の法的案件のお問い合わせは<a href='https://osmfoundation.org/Contact'>OSMF</a>宛てにお願いします。
+        <br>
+        OpenStreetMap、拡大鏡のロゴならびにState of the Mapはいずれも<a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">OSMFの登録商標です</a>。
       partners_title: パートナー
     copyright:
       foreign:
@@ -1891,6 +1905,7 @@ ja:
       revoke: 取り消す!
       my_apps: クライアント アプリケーション
       no_apps_html: OSMのサイトで使用するアプリケーションを新しく %{oauth} で登録するにはOAuthリクエストの前にあらかじめwebから登録しておく必要があります。
+      oauth: OAuth
       registered_apps: '以下のクライアント アプリケーションが登録済みです:'
       register_new: アプリケーションの登録
     form:
@@ -2394,6 +2409,12 @@ ja:
         out: 縮小
       locate:
         title: 現在地を表示
+        metersPopup:
+          one: この地点は1メートル以内
+          other: この地点まで%{count}メートル
+        feetPopup:
+          one: この地点から1フット
+          other: この地点まで%{count}フィート
       base:
         standard: 標準
         cycle_map: サイクリングマップ
@@ -2409,6 +2430,10 @@ ja:
       copyright: © <a href='%{copyright_url}'>OpenStreetMap 協力者</a>
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>寄付する</a>
       terms: <a href='%{terms_url}' target='_blank'>ウェブサイトおよびAPI規約</a>
+      thunderforest: タイルは <a href='%{thunderforest_url}' target='_blank'>Andy Allen</a>
+        のご好意による
+      hotosm: タイル様式のホストは<a href='%{osmfrance_url}' target='_blank'>OpenStreetMap フランス</a>であり<a
+        href='%{hotosm_url}' target='_blank'>人道OpenStreetMap チーム</a>のご好意による
     site:
       edit_tooltip: 地図を編集
       edit_disabled_tooltip: 地図を編集するには拡大してください
index 54adbd8d9ecdda02043071ad93422cbb947d9f85..aefd776883fa9499867b61a27af88a68c9ed4e00 100644 (file)
@@ -8,6 +8,7 @@
 # Author: Asdfqwer51
 # Author: B891202
 # Author: CYAN
+# Author: Codenstory
 # Author: D6283
 # Author: Freebiekr
 # Author: Garam
@@ -32,6 +33,8 @@
 # Author: 予弦
 # Author: 神樂坂秀吉
 # Author: 고솜
+# Author: 그냥기여자
+# Author: 렌즈
 # Author: 밥풀떼기
 # Author: 아라
 # Author: 한림
@@ -134,7 +137,7 @@ ko:
       user:
         email: 이메일
         active: 활성
-        display_name: 표시 이름
+        display_name: 표시되는 이름
         description: 설명
         languages: 언어
         pass_crypt: 비밀번호
@@ -1377,6 +1380,11 @@ ko:
         약관</a>, <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">허용할
         수 있는 이용 정책</a> 및 <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy">개인정보처리방침</a>
         조건 하에서 이루어집니다.
+      legal_2_html: |-
+        라이선스나 저작권, 법률 관련 의문점이 있다면
+        <a href='https://osmfoundation.org/Contact'>오픈스트리트맵 재단으로 문의</a>해주세요.
+        <br>
+        오픈스트리트맵, 돋보기와 지도 로고는 <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">오픈스트리트맵 재단의 등록 상표입니다</a>.
       partners_title: 파트너
     copyright:
       foreign:
@@ -2260,7 +2268,7 @@ ko:
     go_public:
       flash success: 지금 모든 편집을 공개하고, 편집을 허용하지 않습니다.
     make_friend:
-      heading: '%{user}님을 친구로 추가할까요?'
+      heading: '%{user} 님을 친구로 추가할까요?'
       button: 친구 추가
       success: '%{name}님은 이제 친구입니다!'
       failed: 죄송합니다, %{name}님을 친구로 추가하는 데 실패했습니다.
index 2800372c2bc8c59f19b624bf534a69e4355dcc42..2a1715abadc613529547df4f2c1bb117716cadc6 100644 (file)
@@ -41,7 +41,7 @@ ne:
     models:
       acl: अनुमति नियन्त्रण सूची
       changeset: परिवर्तनहरू सूची
-      changeset_tag: à¤\9aà¥\87नà¥\8dà¤\9cसà¥\87à¤\9f à¤\9fà¥\8dयाà¤\97
+      changeset_tag: à¤ªà¤°à¤¿à¤µà¤°à¥\8dतनसमà¥\82ह à¤\9aिनà¥\8b
       country: देश
       diary_comment: डायरी टिप्पणी
       diary_entry: डायरी प्रविष्टी
@@ -49,7 +49,7 @@ ne:
       language: भाषा
       message: सन्देश
       node: नोड
-      node_tag: à¤¨à¥\8bड à¤\9fà¥\8dयाà¤\97
+      node_tag: à¤¨à¥\8bड à¤\9aिनà¥\8b
       notifier: सुचक
       old_node: पूरानो नोड
       old_node_tag: पूरानो नोड ट्याग
@@ -61,7 +61,7 @@ ne:
       old_way_tag: पूरानो बाटो ट्याग
       relation: रिलेशन
       relation_member: रिलेशन सदस्य
-      relation_tag: à¤°à¤¿à¤²à¥\87शन à¤\9fà¥\8dयाà¤\97
+      relation_tag: à¤¸à¤®à¥\8dबनà¥\8dध à¤\9aिनà¥\8b
       session: सत्र
       trace: ट्रेस
       tracepoint: ट्रेस बिन्दु
@@ -71,7 +71,7 @@ ne:
       user_token: प्रयोगकर्ता टोकन
       way: बाटो
       way_node: बाटो नोड
-      way_tag: à¤¬à¤¾à¤\9fà¥\8b à¤\9fà¥\8dयाà¤\97
+      way_tag: à¤®à¤¾à¤°à¥\8dà¤\97 à¤\9aिनà¥\8b
     attributes:
       diary_comment:
         body: बडी
@@ -225,7 +225,7 @@ ne:
     tag_details:
       tags: ट्यागहरू
       wiki_link:
-        key: '%{key} à¤¸à¤\82à¤\95à¥\87तको लागि विकि विवरण पृष्ठ'
+        key: '%{key} à¤\9aिनà¥\8bको लागि विकि विवरण पृष्ठ'
         tag: '%{key}=%{value} संकेतको लागि विकि विवरण पृष्ठ'
       wikidata_link: '%{page} वस्तु विकिडेटा मा'
       wikipedia_link: '%{page}को बारेमा विकिपीडियामा भएको लेख'
index 2d2b80a52055ca2e37deee8919cd4a879ab9be4a..3b1de84988bf545cec54adaf2d3fa00937582ebd 100644 (file)
@@ -966,7 +966,7 @@ pl:
           books: Księgarnia
           boutique: Butik
           butcher: Sklep mięsny
-          car: Sklep samochodowy
+          car: Sprzedaż samochodów
           car_parts: Sklep z częściami samochodowymi
           car_repair: Warsztat samochodowy
           carpet: Sklep z dywanami
index a5e97ea356c2a0ccd2c5b149644066701c7f2ab3..53ab1d42ee38e60c45b3ba59ce6fbc0b44c1b99d 100644 (file)
@@ -1260,9 +1260,9 @@ pt-PT:
       success:
         subject: '[OpenStreetMap] Importação de GPX bem-sucedida'
         loaded_successfully:
-          one: carregado com sucesso com %{trace_points} de um 1 ponto possível.
-          other: carregados com sucesso com %{trace_points} de %{possible_points}
-            pontos possíveis.
+          one: carregado com %{trace_points} de entre um 1 ponto possível.
+          other: carregado com %{trace_points} de entre  %{possible_points} pontos
+            possíveis.
     signup_confirm:
       subject: '[OpenStreetMap] Bem-vind@ ao OpenStreetMap'
       greeting: Olá!
index 9851074dda8d6d81978cb00c27b26537323d7cb3..0454948e55a432b13d8f01b32d8c6a2ff391964d 100644 (file)
@@ -12,6 +12,7 @@
 # Author: Alexey zakharenkov
 # Author: Amire80
 # Author: Andrewsh
+# Author: Banonotit
 # Author: BushmanK
 # Author: CM3X
 # Author: Calibrator
@@ -1308,9 +1309,10 @@ ru:
         import_failures_url: http://wiki.openstreetmap.org/wiki/GPX_Import_Failures
       success:
         subject: '[OpenStreetMap] Импорт GPX прошёл успешно'
-        loaded_successfully: |-
-          успешно загружено %{trace_points} точек из
-          %{possible_points} возможных.
+        loaded_successfully:
+          one: успешно загружена %{trace_points} точка из 1 возможной.
+          few: успешно загружены %{trace_points} точки из %{possible_points} возможных.
+          many: успешно загружено %{trace_points} точек из %{possible_points} возможных.
     signup_confirm:
       subject: '[OpenStreetMap] Добро пожаловать в OpenStreetMap'
       greeting: Привет!
@@ -2067,9 +2069,9 @@ ru:
       allow_to: 'Разрешить этому приложению:'
       allow_read_prefs: читать ваши пользовательские настройки
       allow_write_prefs: изменять ваши настройки на сайте
-      allow_write_diary: Ñ\81оздаваÑ\82Ñ\8c Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐ¾Ð²Ñ\8bе Ð·Ð°Ð¿Ð¸Ñ\81и, ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82аÑ\80ии, заводить друзей
-      allow_write_api: изменять данные
-      allow_read_gpx: читать ваши частные GPS-треки
+      allow_write_diary: Ñ\81оздаваÑ\82Ñ\8c Ð·Ð°Ð¿Ð¸Ñ\81и Ð² Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÐµ Ð¸ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ\82иÑ\80оваÑ\82Ñ\8c, заводить друзей
+      allow_write_api: редактировать карту.
+      allow_read_gpx: читать ваши частные GPS-треки.
       allow_write_gpx: передавать GPS-треки на сервер
       allow_write_notes: изменять заметки
       grant_access: Предоставить доступ
@@ -2103,11 +2105,10 @@ ru:
       delete: Удаление клиента
       confirm: Вы уверены?
       requests: 'Запрос следующих разрешений со стороны пользователя:'
-      allow_read_prefs: читать их пользовательские настройки
+      allow_read_prefs: читать их пользовательские настройки.
       allow_write_prefs: изменять их пользовательские настройки.
-      allow_write_diary: создавать дневниковые записи, комментарии, устанавливать
-        друзей
-      allow_write_api: изменять карту
+      allow_write_diary: создавать записи в дневники и комментировать, заводить друзей.
+      allow_write_api: изменять карту.
       allow_read_gpx: читать их частные GPS-треки
       allow_write_gpx: передавать GPS-треки на сервер.
       allow_write_notes: изменять заметки.
@@ -2127,17 +2128,17 @@ ru:
       registered_apps: 'У вас зарегистрированы следующие клиентские приложения:'
       register_new: Зарегистрировать ваше приложение
     form:
-      name: Ð\98мÑ\8f
-      required: Ð¢Ñ\80ебÑ\83еÑ\82Ñ\81Ñ\8f
+      name: Ð\9dазвание
+      required: Ð¾Ð±Ñ\8fзаÑ\82елÑ\8cно
       url: Основной URL приложения
-      callback_url: URL обратного вызова
-      support_url: URL поддержки
+      callback_url: Callback URL
+      support_url: URL Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8cÑ\81кой Ð¿Ð¾Ð´Ð´ÐµÑ\80жки
       requests: 'Запросить у пользователя следующие разрешения:'
       allow_read_prefs: читать их пользовательские настройки
       allow_write_prefs: изменять их пользовательские настройки
       allow_write_diary: создать дневниковые записи, комментарии, устанавливать друзей
       allow_write_api: изменять карту.
-      allow_read_gpx: читать их частные GPS-треки
+      allow_read_gpx: читать их частные GPS-треки.
       allow_write_gpx: передавать GPS-треки на сервер.
       allow_write_notes: изменять заметки.
     not_found:
diff --git a/config/locales/sc.yml b/config/locales/sc.yml
new file mode 100644 (file)
index 0000000..2975971
--- /dev/null
@@ -0,0 +1,1067 @@
+# Messages for Sardinian (sardu)
+# Exported from translatewiki.net
+# Export driver: phpyaml
+# Author: Abijeet Patro
+# Author: L2212
+# Author: Placebo2
+# Author: Via maxima
+---
+sc:
+  time:
+    formats:
+      friendly: '%e %B %Y a is %H:%M'
+  helpers:
+    submit:
+      diary_comment:
+        create: Sarva
+      diary_entry:
+        create: Pùblica
+        update: Agiorna
+      issue_comment:
+        create: Agiunghe unu cumentu
+      message:
+        create: Imbia
+      client_application:
+        create: Registra·ti
+        update: Modìfica
+      redaction:
+        create: Crea una revisione
+      trace:
+        create: Càrriga
+        update: Sarva sas modìficas
+      user_block:
+        create: Crea unu blocu
+        update: Agiorna su blocu
+  activerecord:
+    errors:
+      messages:
+        invalid_email_address: non paret èssere un'indiritzu de posta eletrònica vàlidu
+    models:
+      acl: Lista de Controllu de Atzessu
+      country: Istadu
+      friend: Amigu
+      language: Limba
+      message: Messàgiu
+      node: Nodu
+      node_tag: Etichetta de su nodu
+      old_node: Nodu betzu
+      old_node_tag: Etichetta betza de su nodu
+      old_relation: Relata betza
+      old_relation_member: Membru de sa relata betza
+      old_relation_tag: Eticheta de sa relata betza
+      old_way: Caminu betzu
+      old_way_node: Nodu de su caminu betzu
+      old_way_tag: Eticheta de su caminu betzu
+      relation: Relata
+      relation_member: Membru de sa relata
+      relation_tag: Eticheta de sa relata
+      session: Sessione
+      trace: Sestadu
+      tracepoint: Puntu de su sestadu
+      tracetag: Eticheta de su sestadu
+      user: Impreadore
+      user_preference: Preferèntzias de s'impreadore
+      user_token: Còdighe de s'impreadore
+      way: Caminu
+      way_node: Nodu de su caminu
+    attributes:
+      diary_comment:
+        body: Corpus
+      diary_entry:
+        user: Impreadore
+        title: 'Sugetu:'
+        latitude: Latitùdine
+        longitude: Longitùdine
+        language: Limba
+      friend:
+        user: Impreadore
+        friend: Amigu
+      trace:
+        user: Impreadore
+        visible: Visìbile
+        name: Nùmene
+        size: Mannesa
+        latitude: Latitùdine
+        longitude: Longitùdine
+        public: Pùblicu
+        description: Descritzione
+      message:
+        title: Ogetu
+        body: Corpus
+        recipient: Destinatàriu
+      user:
+        email: E-lìtera
+        active: Ativu
+        description: Descritzione
+        languages: Limbas
+        pass_crypt: Crae
+  datetime:
+    distance_in_words_ago:
+      half_a_minute: mesu minutu a como
+  editor:
+    id:
+      name: |2-
+
+        iD
+      description: iD (acontzadore in lìnia)
+    potlatch2:
+      name: Potlatch 2
+      description: Potlatch 2 (acontzadore in lìnia)
+    remote:
+      name: Controllu Remotu
+      description: Controllu Remotu (JOSM o Merkaartor)
+  auth:
+    providers:
+      openid: OpenID
+      google: Google
+      facebook: Facebook
+      windowslive: Windows Live
+      github: GitHub
+      wikipedia: Wikipedia
+  api:
+    notes:
+      rss:
+        title: Notas de OpenStreetMap
+      entry:
+        comment: Cummentu
+        full: Nota intrea
+  browse:
+    created: Creadu
+    closed: Serradu
+    version: Versione
+    anonymous: anònimu
+    part_of: Parte de
+    download_xml: Iscàrriga XML
+    view_history: Càstia Istòria
+    view_details: Mustra Detàllios
+    location: 'Logu:'
+    changeset:
+      belongs_to: Autore
+      join_discussion: Intra pro t'aunire a s'arresonu
+      discussion: Arresonu
+    way:
+      nodes: Nodos
+    relation:
+      members: Membros
+    relation_member:
+      type:
+        node: Nodu
+        way: Caminu
+        relation: Relata
+    containing_relation:
+      entry_html: Relata %{relation_name}
+      entry_role_html: Relata %{relation_name} (as %{relation_role})
+    not_found:
+      type:
+        node: nodu
+        way: caminu
+        relation: relata
+        note: nota
+    timeout:
+      type:
+        node: nodu
+        way: caminu
+        relation: relata
+        note: nota
+    redacted:
+      redaction: Revisione %{id}
+      message_html: Sa versione %{version} de custa %{type} non podet èssere ammustrada
+        ca est istada revisionada. Pro praghere òompia·ti %{redaction_link} pro àteras
+        informatziones.
+      type:
+        node: nodu
+        way: caminu
+        relation: relata
+    start_rjs:
+      load_data: Càrriga Datos
+      loading: Carrigamentu...
+    tag_details:
+      tags: Etichetas
+    note:
+      title: 'Nota: %{id}'
+      new_note: Nota noa
+      description: Descritzione
+  changesets:
+    changeset_paging_nav:
+      showing_page: Pàgina %{page}
+      next: Imbeniente »
+      previous: « Pretzedente
+    changeset:
+      anonymous: Anònimu
+    changesets:
+      id: ID
+      user: Impitadore
+      comment: Cummentu
+  diary_entries:
+    form:
+      subject: 'Ogetu:'
+      body: 'Corpus:'
+      language: 'Limba:'
+      location: 'Logu:'
+      latitude: 'Latitùdine:'
+      longitude: 'Longitùdine:'
+    show:
+      leave_a_comment: Lassa unu cummentu
+      login: Intra
+    diary_entry:
+      confirm: Cunfirma
+    diary_comment:
+      confirm: Cunfirma
+    location:
+      location: 'Logu:'
+      edit: Càmbia
+    comments:
+      when: Cando
+      comment: Cummentu
+      newer_comments: Cummentos prus noos
+      older_comments: Cummentos prus antigos
+  geocoder:
+    search_osm_nominatim:
+      prefix:
+        aerialway:
+          cable_car: Funivia
+          chair_lift: Ascensore carrotzina
+          drag_lift: Sciovia
+          platter: Sciovia a piatellu
+          pylon: Turre de sa funivia
+          station: Istatzione sciovia
+          t-bar: Sciovia a àncora
+        aeroway:
+          aerodrome: Aeròdromu
+          helipad: Eliportu
+          parking_position: Positzione parchègiu
+          runway: Pista
+          taxiway: Carrera de furriada
+          terminal: Terminale
+        amenity:
+          animal_shelter: Imbaru pro animales
+          atm: Isportellu automàticu
+          bank: Banca
+          bar: Tzilleri
+          bench: Panchita/banchina
+          bicycle_parking: Parchègiu pro Bitzicletas
+          bicycle_rental: Afitu de Bitzicletas
+          boat_rental: Afitu de Imbarcatziones
+          brothel: Casinu
+          bureau_de_change: Cambia-dinare
+          bus_station: Istatzione de Postales
+          cafe: Cafeteria
+          car_rental: Afitu de Veturas
+          car_sharing: Cumpartzidura de veturas
+          car_wash: Autolavàgiu
+          casino: Casinò
+          charging_station: Istatzione de carrigamentu
+          childcare: Assistèntzia a sos pitzinnos
+          cinema: Tzìnema
+          clinic: Clìnica
+          clock: Relògiu
+          college: Iscola superiore
+          courthouse: Tribunale
+          crematorium: Crematòriu
+          dentist: Dentista
+          doctors: Dotores
+          drinking_water: Abba Potàbile
+          driving_school: Autoiscola
+          embassy: Ambasciada
+          ferry_terminal: Terminale navios
+          fire_station: Pompieres
+          food_court: Corte de màndigu (Food court)
+          fountain: Funtana
+          fuel: Carburante
+          gambling: Giogu de arriscu
+          grave_yard: Campusantu
+          grit_bin: Cassione de arena
+          hospital: Ispidale
+          hunting_stand: Posta de cassa
+          ice_cream: Geladeria
+          kindergarten: Parcu de giogos
+          library: Biblioteca
+          marketplace: Mercadu
+          monastery: Monastèriu
+          motorcycle_parking: Parchègiu pro Mototzicletas
+          nightclub: Locale noturnu
+          nursing_home: Domo de cura
+          office: Ufìtziu
+          parking: Parchègiu
+          parking_entrance: Intrada de su Parchègiu
+          parking_space: Parchègiu
+          pharmacy: Apotecaria
+          place_of_worship: Logu de cultu
+          police: Politzia
+          post_box: Cassita postale
+          post_office: Ufìtziu postale
+          prison: Presone
+          public_building: Telèfonu Pùblicu
+          recycling: Puntu de Retziclàgiu
+          restaurant: Ristorante
+          retirement_home: Residèntzia Geriàtrica
+          sauna: Sàuna
+          school: Iscola
+          shelter: Imbaru
+          shop: Butega
+          shower: Dòtzia
+          social_centre: Tzentru Sotziale
+          social_facility: Istrutura pro servìtzios sotziales
+          studio: Istùdiu
+          swimming_pool: Piscina
+          taxi: Taxi
+          telephone: Telèfonu Pùblicu
+          theatre: Teatru
+          toilets: Còmodu
+          townhall: Munitzìpiu
+          university: Universidade
+          vending_machine: Distribudore automàticu
+          veterinary: Chirurgia veterinària
+          village_hall: Munitzìpiu
+          waste_basket: Cuntenidore de Arga
+          waste_disposal: Cuntenidore de Arga
+          water_point: Puntu de abba
+          youth_centre: Tzentru Giovanile
+        boundary:
+          administrative: Lìmite Amministrativu
+          national_park: Parcu Natzionale
+          protected_area: Àrea amparada
+        bridge:
+          aqueduct: Acuedotu
+          boardwalk: 'Istrutura ponte: pontigra'
+          suspension: Ponte suspesu
+          swing: Ponte giratori
+          viaduct: Ponte
+          "yes": Ponte
+        building:
+          "yes": Edifitziu
+        craft:
+          brewery: Fàbrica de birra
+          carpenter: Mastru de linna
+          electrician: Eletritzista
+          gardener: Giardinere
+          painter: Pintore
+          photographer: Fotògrafu
+          plumber: Idràulicu
+          shoemaker: Cartzeraju
+          tailor: Draperi
+          "yes": Butega de artesania
+        emergency:
+          ambulance_station: Istatzione ambulàntzias
+          assembly_point: Puntu de reunione
+          defibrillator: Defibrillatore
+          landing_site: Logu de aterràgiu de emergèntzia
+          phone: Telèfonu de Emergèntzias
+          water_tank: Depòsitu de Abba de Emergèntzia
+          "yes": Emergèntzia
+        highway:
+          abandoned: Ferrovia abbandonada
+          bridleway: Caminu pro caddos
+          bus_stop: Firmada de su Postale
+          construction: Caminu in costrutzione
+          cycleway: Pista Tziclàbile
+          elevator: Ascensore
+          emergency_access_point: Logu de intrada de emergèntzia
+          ford: Badu
+          give_way: Sinnale de Tzèdere su Passu
+          living_street: Carrera Residentziale
+          motorway: Autostrada
+          motorway_junction: Nodu Viàriu
+          passing_place: Logu de coladòrgiu
+          path: Caminu
+          platform: Andana pro postale o tramvia
+          primary: Caminu printzipale
+          primary_link: Caminu printzipale
+          raceway: Tzircùitu automobilìsticu
+          residential: Carrera residentziale
+          rest_area: Àrea de Pasu
+          road: Carrera
+          secondary: Carrera segundària
+          secondary_link: Carrera segundària
+          service: Carrera de Servìtziu
+          speed_camera: Autovelox
+          steps: Iscalinos
+          stop: Signale de istop
+          street_lamp: Lampione
+          tertiary: Carrera Tertziària
+          tertiary_link: Carrera Tertziària
+          track: Sestadu
+          turning_loop: Rotonda de cambiamentu de sensu
+          unclassified: Carrera senza classificatzione
+          "yes": Carrera
+        historic:
+          archaeological_site: Sìtiu Archeològicu
+          battlefield: Campu de Batalla
+          boundary_stone: Pedra de làcana
+          castle: Casteddu
+          church: Crèsia
+          city_gate: Porta de sa Tzitade
+          citywalls: Murallas de sa Tzitade
+          fort: Forte
+          heritage: Patrimoniu de s'umanidade
+          house: Domo
+          icon: Icona
+          manor: Villa
+          memorial: Memoriale
+          monument: Monumentu
+          roman_road: Carreggiada romana
+          ruins: Ruinas
+          stone: Pedra
+          tomb: Tumba
+          tower: Turre
+          wayside_cross: Rughe istòrica
+          wayside_shrine: Tabernàculu istòricu
+          wreck: Relitu
+          "yes": Sìtiu Istòricu
+        junction:
+          "yes": Giuntura de su caminu
+        landuse:
+          allotments: Giardinos familiares
+          basin: Batzinu
+          cemetery: Campusantu
+          commercial: Zona Cummertziale
+          conservation: Cunservatzione
+          construction: Fraigada
+          farm: Fatoria
+          farmland: Terras de coltivu
+          farmyard: Corrale
+          forest: Litu
+          garages: Garàgios
+          grass: Erva
+          industrial: Zona Industriale
+          landfill: Muntonàrgiu
+          meadow: Pradu
+          military: Zona Militare
+          orchard: Frutedu
+          quarry: Cava
+          railway: Ferrovia
+          recreation_ground: Zona de recreu
+          reservoir: Batzinu
+          residential: Àrea residentziale
+          retail: Bèndida
+          village_green: Àrea birde comune de sa bidda
+          vineyard: Bìngia
+          "yes": Impreu de su terrinu
+        leisure:
+          beach_resort: Cumplessu turìsticu de marina
+          common: Terrinu comunale
+          dog_park: Parcu pro sos Canes
+          fishing: Àrea de Pisca
+          fitness_centre: Palestra
+          fitness_station: Palestra a s'abertu
+          garden: Giardinu
+          golf_course: Campu de golf
+          horse_riding: Ecuitatzione
+          ice_rink: Pista de Astra
+          marina: Marina (portu minore)
+          miniature_golf: Minigolf
+          nature_reserve: Reserva naturale
+          park: Parcu
+          playground: Parcu pro Pitzinnos
+          recreation_ground: Zona de recreu
+          resort: Cumplessu turìsticu
+          sauna: Sàuna
+          slipway: Lassinadòrgiu
+          sports_centre: Tzentru isportivu
+          stadium: Istàdiu
+          swimming_pool: Piscina
+          track: Pista pro cùrrere
+          water_park: Parcu de abba
+          "yes": Tempus lìberu
+        man_made:
+          adit: Intrada de una galleria minerària
+          beacon: Sinnale marinu
+          breakwater: Paraundas
+          bridge: Ponte
+          chimney: Fumajolu
+          crane: Grue
+          dyke: Àrgine
+          flagpole: Palu de bandera
+          gasometer: Gasòmetru
+          groyne: Paraundas (Groyne)
+          kiln: Furru (kiln)
+          lighthouse: Faru
+          mast: Àrbore (de sa nave)
+          monitoring_station: Istatzione de cuntrollu
+          petroleum_well: Putzu petrolìferu
+          pier: Pontinu
+          pipeline: Tubadura
+          silo: Lòssia
+          storage_tank: Serbatòiu
+          surveillance: Videobardiamentu
+          tower: Turre
+          wastewater_plant: Depuradore
+          watermill: Mulinu a abba
+          water_tower: Turre ìdrica
+          water_well: Putzu petrolìferu
+          water_works: Istrutura idràulica
+          windmill: Mulinu a bentu
+          works: Fàbrica
+          "yes": Artifitziale
+        military:
+          airfield: Aeroportu militare
+          barracks: Caserma
+          "yes": Militare
+        mountain_pass:
+          "yes": Coladòrgiu montanu
+        natural:
+          bay: Baja
+          beach: Marina
+          cape: Cabu
+          cave_entrance: Intrada de sa gruta
+          cliff: Iscameddu
+          crater: Cratere
+          dune: Duna
+          fjord: Costera
+          forest: Litu
+          glacier: Niera
+          grassland: Pradu
+          heath: Ghiddostraju
+          hill: Montigru
+          island: Ìsula
+          land: Terra
+          marsh: Benale
+          moor: Ormègiu
+          mud: Ludu
+          peak: Bicu
+          point: Puntu
+          reef: Costera
+          ridge: Serra de monte
+          rock: Roca
+          saddle: Sedda
+          sand: Arena
+          scrub: Prunitzàrgiu
+          spring: Bena
+          stone: Pedra
+          strait: Astrintura
+          tree: Àrbore
+          valley: Badde
+          volcano: Vulcanu
+          water: Abba
+          wetland: Paule
+          wood: Buscu
+        office:
+          accountant: Contàbile
+          administrative: Amministratzione
+          architect: Architetu
+          association: Assòtziu
+          company: Azienda
+          educational_institution: Istitutzione educativa
+          employment_agency: Agèntzia pro su traballu
+          estate_agent: Butega immobiliare
+          government: Ufìtziu guvernativu
+          it: Ufìtziu IT
+          lawyer: Abogadu
+          telecommunication: Ufìtziu de telecomunicatziones
+          travel_agent: Agèntzia de biàgios
+          "yes": Ufìtziu
+        place:
+          allotments: Giardinos familiares
+          city: Tzitade
+          country: Paisu
+          county: Contea
+          farm: Fatoria
+          hamlet: Bidditzolu
+          house: Domo
+          houses: Domos
+          island: Ìsula
+          islet: Isuledda
+          isolated_dwelling: Domo isolada
+          locality: Localidade
+          municipality: Munitzìpiu
+          neighbourhood: Bighinadu
+          postcode: Còdighe postale
+          quarter: Bighinadu
+          region: Regione
+          sea: Mare
+          square: Pratza
+          state: Istadu
+          subdivision: Partzidura
+          suburb: Trighinzu - apendìtziu
+          town: Tzitade
+          village: Bidda
+          "yes": Logu
+        railway:
+          abandoned: Ferrovia abbandonada
+          construction: Ferrandeu in costrutzione
+          disused: Ferrandeu in disavesu
+          halt: Firmada de sos trenos
+          junction: Nodu ferruviàriu
+          level_crossing: passagiù a livellu
+          light_rail: Trenu lèbiu
+          monorail: Monorotàia
+          narrow_gauge: Ferrovia abbandonada
+          subway: Metropolitana
+          subway_entrance: Intrada de sa metropolitana
+          tram_stop: Firmada de su tram
+        shop:
+          alcohol: Licorista
+          antiques: Anticuàriu
+          art: Butega de arte
+          bakery: Paneteri
+          beauty: Salone de bellesa
+          beverages: Butega de bèvidas
+          bicycle: Butega de bitzicletas
+          bookmaker: Iscummissas
+          books: Libreria
+          boutique: Boutique
+          butcher: Carnitzeria
+          car_parts: Cantos de ricàmbiu pro automòbiles
+          car_repair: Riparatzione màchina
+          clothes: Butega de bestires
+          computer: Butega de informàtica
+          convenience: Buteghedda
+          copyshop: Copisteria
+          deli: Gastronomia
+          department_store: Supermercadu
+          doityourself: Butega de bricolatge
+          dry_cleaning: Sabunadura "a sicu"
+          electronics: Butega de eletrònica
+          estate_agent: Butega immobiliare
+          florist: Froraju
+          food: Alimentares
+          funeral_directors: Pompas fùnebres
+          furniture: Mòbiles
+          gallery: Galleria
+          general: Empòriu
+          gift: Butega de donos
+          hairdresser: Pilucheri
+          hardware: Ferramenta
+          interior_decoration: Decoradura de internos
+          laundry: Samunadòrgiu
+          lottery: Loteria
+          mall: Tzentru cummertziale
+          market: Mercadu
+          massage: Messàgiu
+          motorcycle: Butega de mototzicletas
+          newsagent: Agentzia de imprenta
+          optician: Òticu
+          paint: Butega de Pinturas
+          pawnbroker: Monte de piedade
+          pharmacy: Apotecaria
+          photo: Fotògrafu
+          second_hand: Ogetos de segunda manu
+          supermarket: Supermercadu
+          tailor: Draperi
+          tobacco: Istancu
+          travel_agency: Agèntzia de biàgios
+          tyres: Butega de pneumàticos
+          variety_store: Butega de ogetos baratos
+          wine: Butega de binos
+          "yes": Butega
+        tourism:
+          alpine_hut: Pinnetu alpinu
+          artwork: Òpera de arte
+          attraction: Atratzione
+          bed_and_breakfast: Bed and Breakfast
+          cabin: Cabina
+          camp_site: Campègiu
+          caravan_site: Campeggio pro roulotte
+          gallery: Galleria
+          guest_house: Pensione
+          hostel: Ostellu
+          information: Informatziones
+          museum: Museu
+          picnic_site: Àrea de recreu
+          theme_park: Parcu temàticu
+          viewpoint: Puntu panoràmicu
+        tunnel:
+          "yes": Galleria
+        waterway:
+          boatyard: Cantiere navale
+          canal: Canale
+          dam: Diga
+          lock_gate: Ghenna de serradura
+          mooring: Ormègiu
+          rapids: Tràinos
+          river: Riu
+          stream: Traghinu/Trainu
+          waterfall: Istrampu
+          weir: Nassàrgiu
+    description:
+      types:
+        cities: Tzitades
+        towns: Tzitadinas
+        places: Logos
+    results:
+      no_results: Perunu resultadu agadadu
+      more_results: Àteros risultados
+  issues:
+    index:
+      title: Problemas
+      search: Chirca
+      status: Istadu
+      reports: Raportos
+      last_updated: Ùrtimu agiornamentu
+      link_to_reports: Abbàida su raportu
+  reports:
+    new:
+      categories:
+        diary_entry:
+          other_label: Àteru
+        diary_comment:
+          other_label: Àteru
+        user:
+          other_label: Àteru
+        note:
+          other_label: Àteru
+  layouts:
+    logo:
+      alt_text: Logotipu de OpenStreetMap
+    logout: Essi
+    log_in: Intra
+    sign_up: Iscrie·ti
+    edit: Modìfica
+    history: Cronologia
+    export: Esporta
+    issues: Problemas
+    data: Datos
+    tou: Conditziones de impreu
+    help: Agiudu
+    about: Informatziones
+    copyright: Deretu de autore
+    community: Comunidade
+    foundation: Fundatzione
+    learn_more: Leghe àteru
+    more: Àteru
+  notifier:
+    diary_comment_notification:
+      hi: Salude %{to_user},
+      header: '%{from_user} at cummentadu s''intrada cuotidiana de OpenStreetMap cun
+        su tema %{subject}:'
+      footer: Podes lèghere su cummentu fintzas in %{readurl} e cummentare in %{commenturl}
+        o rispònnere in %{replyurl}
+    message_notification:
+      hi: Salude %{to_user},
+      header: '%{from_user} at imbiadu unu messàgiu a traessu de OpenStreetMap cun
+        su tema %{subject}:'
+      footer_html: Podes lèghere su messàgiu fintzas in %{readurl} e podes rispònnere
+        in %{replyurl}
+    friend_notification:
+      hi: Salude %{to_user},
+      subject: '[OpenStreetMap] %{user} t''at annànghidu a sa lista de amigos'
+      had_added_you: '%{user} t''at annantu comente a amigu in OpenStreetMap.'
+      see_their_profile: Podes bìdere su profilu suo in %{userurl}.
+      befriend_them: Lu/a podes fintzas annànghere comente a amigu/a in %{befriendurl}.
+    gpx_notification:
+      greeting: Salude,
+      your_gpx_file: Paret chi fu GPX file tuo
+      with_description: cun sa descritzione
+      and_the_tags: 'e sas etichetas imbenientes:'
+      and_no_tags: e peruna eticheta.
+      failure:
+        subject: '[OpenStreetMap] Faddina de importatzione de GPX'
+        failed_to_import: 'non si podet importare. Sa faddina est istada:'
+        more_info_1: Prus informatzione in relatzione a errores de importatzione de
+          GPX e comente los evitare
+        more_info_2: 'los podes agatare a:'
+      success:
+        subject: '[OpenStreetMap] Importatzione de GPX curreta'
+        loaded_successfully: carrigadu in manera curreta cun %{trace_points} puntos
+          in unu totale de %{possible_points} puntos possìbiles.
+    signup_confirm:
+      subject: '[OpenStreetMap] Bene bènnidos a OpenStreetMap'
+      greeting: Salude!
+      created: Calicunu (isperamus tue matessi) at creadu commo·commo unu contu a
+        %{site_url}.
+      confirm: 'Primu de totu, depimus cunfirmare chi custa petitzione de creatzione
+        de contu est bostra; si l''est, incarcades subra su ligàmene imbeniente pro
+        la cunfirmare:'
+    email_confirm:
+      subject: '[OpenStreetMap] Cunfirma s''indiritzu de posta'
+    email_confirm_plain:
+      greeting: Salude,
+      hopefully_you: Calicunu (isperamus tue matessi) cheret cambiare s'indiritzu
+        eletrònicu tuo dae %{server_url} cun %{new_address}.
+    email_confirm_html:
+      greeting: Salude,
+      hopefully_you: Calicunu (isperamus tue matessi) cheret cambiare s'indiritzu
+        eletrònicu tuo dae %{server_url} cun %{new_address}.
+    lost_password_plain:
+      greeting: Salude,
+    lost_password_html:
+      greeting: Salude,
+    note_comment_notification:
+      greeting: Salude,
+    changeset_comment_notification:
+      hi: Salude %{to_user},
+      greeting: Salude,
+  messages:
+    inbox:
+      from: Dae
+      subject: 'Sugetu:'
+      date: Data
+    message_summary:
+      unread_button: Sinna comente no lèghidu
+      read_button: Sinna comente lèghidu
+      reply_button: Risponde
+      destroy_button: Cantzella
+    new:
+      title: Imbia messàgiu
+      send_message_to_html: Imbia unu messàgiu nou a %{name}
+      subject: 'Sugetu:'
+      body: Corpus
+    create:
+      message_sent: Messàgiu imbiadu
+    outbox:
+      to: Cara a
+      subject: 'Sugetu:'
+      date: Data
+    show:
+      from: Dae
+      subject: 'Sugetu:'
+      date: Data
+      reply_button: Risponde
+      unread_button: Sinna comente no lèghidu
+      destroy_button: Cantzella
+      back: In palas
+      to: Cara a
+    sent_message_summary:
+      destroy_button: Cantzella
+    destroy:
+      destroyed: Messàgiu iscantzelladu
+  site:
+    index:
+      createnote: Annanghe una nota
+    export:
+      title: Esporta
+      options: Optziones
+      format: Formadu
+      scale: Iscala
+      max: màssimu
+      image_size: Mannària de s'immàgine
+      zoom: Ismanniamentu
+      export_button: Esporta
+    fixthemap:
+      how_to_help:
+        title: Comente agiudare
+        join_the_community:
+          title: Auni·ti a sa comunidade
+    help:
+      welcome:
+        url: /bene bènnidu
+    sidebar:
+      search_results: Risultados de sa chirca
+      close: Serra
+    search:
+      search: Chirca
+      get_directions: Otene indicatziones
+      from: Dae
+      to: Cara a
+      submit_text: Bae
+    key:
+      table:
+        entry:
+          motorway: Autostrada
+          primary: Caminu printzipale
+          secondary: Carrera segundària
+          unclassified: Carrera chene classificatzione
+          track: Sestadu
+          bridleway: Caminu pro caddos
+          cycleway: Pista tziclàbile
+          footway: Caminu pro pedones
+          rail: Ferrovia
+          subway: Metropolitana
+          tram:
+          - Trenu lèbiu/metropolitana lèbia
+          - Tram
+          cable:
+          - Funivia
+          - ascensore carrotzina
+          runway:
+            1: carrera de furriada
+          apron:
+            1: terminale
+          admin: Làcana amministrativa
+          forest: Litu
+          wood: Buscu
+          golf: Campu de golf
+          park: Parcu
+          resident: Àrea de residèntzia
+          common:
+          - Comunu
+          - pradu
+          industrial: Àrea industriale
+          commercial: Àrea cummertziale
+          lake:
+          - Lagu
+          - batzinu
+          farm: Fatoria
+          cemetery: Campusantu
+          allotments: Giardinos familiares
+          centre: Tzentru isportivu
+          reserve: Reserva naturale
+          military: Zona militare
+          school:
+          - Iscola
+          - universidade
+          private: Atzessu privadu
+          destination: Atzessu pro sa destinatzione
+          bicycle_shop: Butega de bitzicletas
+          bicycle_parking: Parchègiu pro bitzicletas
+          toilets: Còmodu
+    richtext_area:
+      edit: Modìfica
+      preview: Anteprima
+    markdown_help:
+      link: Ligàmene
+      text: Testu
+      image: Immàgine
+    welcome:
+      title: Bene bènnidu!
+      rules:
+        title: Règulas!
+      add_a_note:
+        title: No Time To Edit? Annanghe una nota!
+  traces:
+    new:
+      description: 'Descritzione:'
+      tags: 'Etichetas:'
+      visibility: 'Visibilidade:'
+      visibility_help: ite cheret nàrrere?
+      help: Agiudu
+    create:
+      upload_failed: Sorry, the GPX upload failed. An administrator has been alerted
+        to the error. Torra·bi a proare.
+    edit:
+      filename: 'Nùmene documentu:'
+      download: iscàrriga
+      points: 'Puntos:'
+      map: mapa
+      edit: modìfica
+      owner: 'Mere:'
+      description: 'Descritzione:'
+      tags: 'Etichetas:'
+      visibility: 'Visibilidade:'
+      visibility_help: ite cheret nàrrere?
+    trace_optionals:
+      tags: Etichetas
+    show:
+      filename: 'Nùmene documentu:'
+      download: iscàrriga
+      points: 'Puntos:'
+      map: mapa
+      edit: modìfica
+      owner: 'Mere:'
+      description: 'Descritzione:'
+      tags: 'Etichetas:'
+      visibility: 'Visibilidade:'
+    trace_paging_nav:
+      showing_page: Pàgina %{page}
+    trace:
+      edit: modìfica
+      by: De
+      map: mapa
+  oauth_clients:
+    form:
+      name: Nùmene
+  users:
+    login:
+      title: Intra
+      heading: Intra
+      login_button: Intra
+    new:
+      title: Iscrie·ti
+      continue: Iscrie·ti
+    terms:
+      continue: Sighi
+      decline: Refuda
+      legale_names:
+        france: Frantza
+        italy: Itàlia
+    show:
+      my profile: Su profilu meu
+      edits: Modìficas
+      description: Descritzione
+      settings_link_text: impostatziones
+      confirm: Cunfirma
+    popup:
+      friend: Amigu
+    account:
+      latitude: 'Latitùdine:'
+      longitude: 'Longitùdine:'
+      save changes button: Sarva sas modìficas
+    confirm:
+      button: Cunfirma
+    confirm_email:
+      button: Cunfirma
+  user_role:
+    grant:
+      confirm: Cunfirma
+    revoke:
+      confirm: Cunfirma
+  user_blocks:
+    show:
+      created: Creadu
+      status: Istadu
+      edit: Modìfica
+    block:
+      edit: Modìfica
+    blocks:
+      creator_name: Creadore
+      status: Istadu
+      showing_page: Pàgina %{page}
+      next: Imbeniente »
+      previous: « Pretzedente
+  notes:
+    mine:
+      creator: Creadore
+      description: Descritzione
+  javascripts:
+    close: Serra
+    share:
+      title: Cumpartzi
+      cancel: Annulla
+      image: Immàgine
+      long_link: Ligàmene
+      short_link: Ligàmene curtzu
+      format: 'Formadu:'
+      scale: 'Iscala:'
+      download: Iscàrriga
+      short_url: URL curtzu
+    map:
+      locate:
+        title: Ammustra sa positzione mea
+    changesets:
+      show:
+        comment: Cummentu
+        subscribe: Sutaiscrie·ti
+        unsubscribe: Annulla sa sutiscritzione
+        hide_comment: cua
+        unhide_comment: ammustra
+    notes:
+      show:
+        hide: Cua
+        comment: Cummentu
+    directions:
+      engines:
+        fossgis_osrm_bike: Bitzicleta (OSRM)
+        fossgis_osrm_car: Màchina (OSRM)
+        fossgis_osrm_foot: A pee (OSRM)
+        graphhopper_bicycle: Bitzicleta (GraphHopper)
+        graphhopper_car: Màchina (GraphHopper)
+        graphhopper_foot: A pee (GraphHopper)
+      directions: Indicatziones
+      distance: Distàntzia
+    query:
+      node: Nodu
+      way: Caminu
+      relation: Relata
+  redactions:
+    edit:
+      description: Descritzione
+      heading: Modìfica sa revisione
+      title: Modìfica sa revisione
+    index:
+      empty: Non b'ant revisiones de ammustrare.
+      heading: Lista de revisiones
+      title: Lista de revisiones
+    new:
+      description: Descritzione
+      heading: Inserta informatziones pro una revisione noa
+    show:
+      description: 'Descritzione:'
+      heading: Ammustrende sa revisione "%{title}"
+      edit: Modìfica custa revisione
+    create:
+      flash: Revisione creada.
+    destroy:
+      not_empty: Sa revisione no est bòida. Pro praghere iscontza totu sas versiones
+        chi apartenent a custa revisione in antis de l'iscantzellare.
+      error: B'at àpidu una faddina in s'iscantzellamentu de custa revisione.
+...
index 089f3f75ec79ccc09de3d42f8f3206ada06de607..2d30f00ebfb4d1efa2aca2ad56e80719939893dd 100644 (file)
@@ -2,6 +2,7 @@
 # Exported from translatewiki.net
 # Export driver: phpyaml
 # Author: Abijeet Patro
+# Author: Chiak
 # Author: Helix84
 # Author: Jose1711
 # Author: KuboF
@@ -60,6 +61,7 @@ sk:
       diary_comment: Komentár k denníku
       diary_entry: Záznam denníka
       friend: Priateľ
+      issue: Problém
       language: Jazyk
       message: Správa
       node: Uzol
@@ -76,6 +78,7 @@ sk:
       relation: Relácia
       relation_member: Člen relácie
       relation_tag: Značka relácie
+      report: Hlásenie
       session: Relácia
       trace: Stopa
       tracepoint: Bod stopy
@@ -119,6 +122,9 @@ sk:
         description: Popis
         languages: Jazyky
         pass_crypt: Heslo
+  datetime:
+    distance_in_words_ago:
+      half_a_minute: pred pol minútou
   editor:
     default: Predvolený (v súčasnosti %{name})
     potlatch:
@@ -133,6 +139,14 @@ sk:
     remote:
       name: Diaľkové ovládanie
       description: Diaľkové ovládanie (JOSM alebo Merkaartor)
+  auth:
+    providers:
+      openid: OpenID
+      google: Google
+      facebook: Facebook
+      windowslive: Windows Live
+      github: GitHub
+      wikipedia: Wikipédia
   api:
     notes:
       comment:
@@ -344,7 +358,7 @@ sk:
     location:
       location: 'Poloha:'
       view: Zobraziť
-      edit: Editovať
+      edit: Upraviť
     feed:
       user:
         title: Záznamy OpenStreetMap denníka používateľa %{user}
@@ -413,6 +427,7 @@ sk:
           charging_station: Nabíjacia stanica
           cinema: Kino
           clinic: Poliklinika
+          clock: Hodiny
           college: Vysoká škola
           community_centre: Kultúrne stredisko
           courthouse: Súd
@@ -565,6 +580,8 @@ sk:
           wayside_cross: Božie muky
           wayside_shrine: Malá kaplnka pri ceste
           wreck: Zrúcanina
+        junction:
+          "yes": Križovatka
         landuse:
           allotments: Záhradkárske osady
           basin: Vodná nádrž
@@ -601,6 +618,7 @@ sk:
           bird_hide: Vtáčia pozorovateľňa
           common: Verejné priestranstvo
           dog_park: Psí park
+          firepit: Ohnisko
           fishing: Rybolov (športový)
           fitness_centre: Fitnescentrum
           fitness_station: Fitnes zastávka
@@ -622,13 +640,26 @@ sk:
           swimming_pool: Plaváreň
           track: Bežecká dráha
           water_park: Aquapark
+          "yes": Voľný čas
         man_made:
+          beacon: Maják
+          bridge: Most
+          bunker_silo: Bunker
+          chimney: Komín
+          crane: Žeriav
+          embankment: Násyp
+          gasometer: Plynojem
           lighthouse: Maják
+          mast: Stožiar
           mine: Baňa
           mineshaft: Šachta bane
+          petroleum_well: Ropný vrt
           pipeline: Vodovod
           silo: Silo
           tower: Veža
+          water_tower: Vodojem
+          water_well: Studňa
+          windmill: Veterný mlyn
           works: Továreň
           "yes": Vytvorené človekom
         military:
@@ -706,12 +737,14 @@ sk:
           postcode: PSČ
           region: Región
           sea: More
+          square: Námestie
           state: Štát
           subdivision: Pododdelenie
           suburb: Mestský obvod
           town: Mesto 10 tis.-100 tis.
           unincorporated_area: Nezaradená oblasť
           village: Obec 200-10 tis.
+          "yes": Miesto
         railway:
           abandoned: Zrušená železničná trať
           construction: Železnica vo výstavbe
@@ -743,6 +776,7 @@ sk:
           beauty: Salón krásy
           beverages: Občerstvenie
           bicycle: Obchod s bicyklami
+          bookmaker: Stávková kancelária
           books: Kníhkupectvo
           boutique: Butik
           butcher: Mäsiarstvo
@@ -781,11 +815,14 @@ sk:
           hairdresser: Kaderníctvo,holičstvo
           hardware: Železiarstvo
           hifi: Hi-Fi
+          houseware: Domáce potreby
           jewelry: Zlatníctvo
           kiosk: Novinový stánok
           laundry: Práčovňa
+          lottery: Lotéria
           mall: Pešia zóna
           market: Obchod
+          massage: Masáž
           mobile_phone: Obchod s mobilnými telefónmi
           motorcycle: Motocyklový obchod
           music: Hudobniny
@@ -793,6 +830,7 @@ sk:
           optician: Očná optika
           organic: Obchod so zdravou výživou
           outdoor: Turistický obchod
+          pawnbroker: Záložňa
           pet: Chovprodukt
           pharmacy: Lekáreň
           photo: Fotokino
@@ -802,10 +840,12 @@ sk:
           stationery: Papierníctvo
           supermarket: Supermarket
           tailor: Krajčír
+          tobacco: Trafika
           toys: Hračkárstvo
           travel_agency: Cestovná kancelária
+          tyres: Pneuservis
           video: Videopožičovňa, predaj DVD
-          wine: Mimo povolenia
+          wine: Vináreň
           "yes": Obchod
         tourism:
           alpine_hut: Vysokohorská chata
@@ -869,6 +909,19 @@ sk:
     results:
       no_results: Neboli nájdené žiadne výsledky
       more_results: Viac výsledkov
+  issues:
+    index:
+      search: Hľadať
+      user_not_found: Používateľ neexistuje
+      status: Stav
+      states:
+        ignored: Ignorované
+        open: Otvorené
+        resolved: Vyriešené
+    show:
+      resolve: Vyriešiť
+      ignore: Ignorovať
+      reopen: Znovu otvoriť
   reports:
     new:
       title_html: Nahlásiť %{link}
@@ -909,6 +962,7 @@ sk:
     edit: Upraviť
     history: História
     export: Export
+    issues: Problémy
     data: Údaje
     export_data: Export údajov
     gps_traces: GPS stopy
@@ -921,9 +975,10 @@ sk:
     intro_text: OpenStreetMap je mapa sveta, vytvorené ľuďmi ako vy, voľne využiteľná
       pod slobodnou licenciou.
     intro_2_create_account: Založte si konto
-    partners_ucl: VR centrum UCL
+    partners_ucl: UCL
     partners_bytemark: Bytemark Hosting
     partners_partners: partneri
+    tou: Podmienky používania
     osm_offline: OpenStreetMap databáza je teraz offline, zatiaľ čo potrebná údržba
       databázy naďalej prebieha.
     osm_read_only: OpenStreetMap databáza je teraz len v móde čítania (bez možnosti
@@ -1080,6 +1135,7 @@ sk:
       date: Dátum
       reply_button: Odpovedať
       unread_button: Označiť ako neprečítané
+      destroy_button: Zmazať
       back: Späť
       to: Komu
       wrong_user: Ste prihlásený ako „%{user}“, ale správa, ktorú si chcete prečítať,
@@ -1267,6 +1323,7 @@ sk:
           title: Pripojte sa ku komunite
     help:
       welcome:
+        url: /welcome
         title: Vitajte na OSM
       beginners_guide:
         url: http://wiki.openstreetmap.org/wiki/Sk:Beginners%27_guide
@@ -1277,9 +1334,11 @@ sk:
         title: Fóra
       irc:
         title: IRC
+      switch2osm:
+        title: switch2osm
       wiki:
         url: http://wiki.openstreetmap.org/
-        title: wiki.openstreetmap.org
+        title: OpenStreetMap Wiki
     sidebar:
       search_results: Výsledky vyhľadávania
       close: Zavrieť
@@ -1289,7 +1348,7 @@ sk:
       get_directions_title: Vyhľadať trasu medzi dvoma bodmi
       from: Odkiaľ
       to: Kam
-      where_am_i: Kde som?
+      where_am_i: Kde je toto?
       where_am_i_title: Opis aktuálnej polohy pomocou vyhľadávača
       submit_text: hľ.
       reverse_directions_text: Obrátiť smer
@@ -1573,6 +1632,7 @@ sk:
       no_apps_html: Máte nejakú aplikáciu, využívajúcu štandard %{oauth}, ktorá by
         s nami mala spolupracovať? Aplikáciu je potrebné najprv zaregistrovať, až
         potom sem bude môcť posielať OAuth požiadavky.
+      oauth: OAuth
       registered_apps: 'Máte zaregistrované nasledujúce klientské aplikácie:'
       register_new: Zaregistrovať aplikáciu
     form:
@@ -2029,6 +2089,7 @@ sk:
       previous: « Predchádzajúca stránka
   notes:
     mine:
+      id: ID
       creator: Autor
       description: Popis
       created_at: Vytvorené
@@ -2042,6 +2103,7 @@ sk:
       link: Odkaz alebo HTML
       long_link: Odkaz
       short_link: Krátky odkaz
+      geo_uri: Geo URI
       embed: HTML
       custom_dimensions: Nastaviť vlastné rozmery
       format: 'Formát:'
@@ -2085,6 +2147,8 @@ sk:
       createnote_disabled_tooltip: Pre vloženie poznámky priblížte mapu
     changesets:
       show:
+        subscribe: Odoberať
+        unsubscribe: Zrušiť odoberanie
         hide_comment: skryť
         unhide_comment: zobraziť
     notes:
@@ -2095,11 +2159,15 @@ sk:
         add: Pridať poznámku
       show:
         hide: Skryť
+        resolve: Vyriešiť
     directions:
       ascend: Stúpanie
       engines:
+        fossgis_osrm_bike: Bicykel (OSRM)
         fossgis_osrm_car: Automobil (OSRM)
+        fossgis_osrm_foot: Pešo (OSRM)
         graphhopper_bicycle: Bicykel (GraphHopper)
+        graphhopper_car: Automobil (GraphHopper)
         graphhopper_foot: Pešo (GraphHopper)
       descend: Klesanie
       directions: Trasa
index 49d5f240048c638a2c763ca2320059987b5196c4..ef3eab0659914c989441c97f682b6b9808007186 100644 (file)
@@ -42,6 +42,7 @@
 # Author: Ufred
 # Author: Umeaboy
 # Author: VickyC
+# Author: Westis
 # Author: WikiPhoenix
 # Author: Zvenzzon
 ---
@@ -1755,7 +1756,7 @@ sv:
           primary: Primär väg (riksväg)
           secondary: Sekundär väg (större länsväg)
           unclassified: Oklassificerad väg
-          track: Spår
+          track: Traktorväg
           bridleway: Ridstig
           cycleway: Cykelväg
           cycleway_national: Nationell cykelväg
index 3635c91337476513f1bbdbf1d54e41326009c9e6..f32340c34773404654c693d9ace5c4066970923c 100644 (file)
@@ -481,7 +481,7 @@ tr:
         description: OpenStreetMap kullanıcıların en son günlük girdileri
     comments:
       has_commented_on: '%{display_name} aşağıdaki günlük girdilerini yorumladı'
-      post: Yazı
+      post: Gönder
       when: Tarih
       comment: Yorum
       newer_comments: Daha Yeni Yorumlar
@@ -1682,7 +1682,7 @@ tr:
       longitude: 'Boylam:'
       output: Çıktı
       paste_html: Yukarıdaki HTML kodu kopyalayıp websitesinde yapıştırabilir
-      export_button: Çıkart
+      export_button: Dışa aktar
     fixthemap:
       title: Sorun bildir / Haritayı onar
       how_to_help:
index 295803a3fd3073aac7b5348c9ba54af0c24589fe..0ce831a8a29a1b2630d9bc62f4aaa211e8198216 100644 (file)
@@ -2411,6 +2411,9 @@ zh-CN:
         out: 缩小
       locate:
         title: 显示我的位置
+        metersPopup:
+          one: 你距离该点1米
+          other: 你距离该点%{count}米
         feetPopup:
           one: 你就在这个位置的一英尺范围内
           other: 你就在这个位置的%{count}英尺范围内
@@ -2429,6 +2432,9 @@ zh-CN:
       copyright: © <a href='%{copyright_url}'>OpenStreetMap 贡献者</a>
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>捐赠</a>
       terms: <a href='%{terms_url}' target='_blank'>网站和API使用条款</a>
+      thunderforest: 地图图块来源<a href='%{thunderforest_url}' target='_blank'>Andy Allan</a>
+      hotosm: 图块风格作者为<a href='%{hotosm_url}' target='_blank'>Humanitarian OpenStreetMap
+        Team</a>,由<a href='%{osmfrance_url}' target='_blank'>OpenStreetMap France</a>托管
     site:
       edit_tooltip: 编辑地图
       edit_disabled_tooltip: 放大地图以编辑
index e181bda19272460496d0b29bcd02e38aa0dbebda..b48dad73379d3bbcf4fc9b65a5fa7d2d4f061e4e 100644 (file)
@@ -73,11 +73,11 @@ OpenStreetMap::Application.routes.draw do
     end
 
     post "gpx/create" => "api/traces#create"
-    get "gpx/:id" => "api/traces#show", :id => /\d+/
+    get "gpx/:id" => "api/traces#show", :as => :api_trace, :id => /\d+/
     put "gpx/:id" => "api/traces#update", :id => /\d+/
     delete "gpx/:id" => "api/traces#destroy", :id => /\d+/
     get "gpx/:id/details" => "api/traces#show", :id => /\d+/
-    get "gpx/:id/data" => "api/traces#data"
+    get "gpx/:id/data" => "api/traces#data", :as => :api_trace_data
 
     # AMF (ActionScript) API
     post "amf/read" => "api/amf#amf_read"
@@ -161,7 +161,7 @@ OpenStreetMap::Application.routes.draw do
   post "/user/new" => "users#create"
   get "/user/terms" => "users#terms"
   post "/user/save" => "users#save"
-  get "/user/:display_name/confirm/resend" => "users#confirm_resend"
+  get "/user/:display_name/confirm/resend" => "users#confirm_resend", :as => :user_confirm_resend
   match "/user/:display_name/confirm" => "users#confirm", :via => [:get, :post]
   match "/user/confirm" => "users#confirm", :via => [:get, :post]
   match "/user/confirm-email" => "users#confirm_email", :via => [:get, :post]
@@ -238,7 +238,7 @@ OpenStreetMap::Application.routes.draw do
   get "/user/:display_name" => "users#show", :as => "user"
   match "/user/:display_name/make_friend" => "users#make_friend", :via => [:get, :post], :as => "make_friend"
   match "/user/:display_name/remove_friend" => "users#remove_friend", :via => [:get, :post], :as => "remove_friend"
-  match "/user/:display_name/account" => "users#account", :via => [:get, :post]
+  match "/user/:display_name/account" => "users#account", :via => [:get, :post], :as => "user_account"
   get "/user/:display_name/set_status" => "users#set_status", :as => :set_status_user
   get "/user/:display_name/delete" => "users#delete", :as => :delete_user
 
index dbeaf5a408e66dfd757b6d63fb5ea639a49c44bc..b435a7111611783a3fe2fca880fb5f191f3b80c6 100644 (file)
@@ -309,6 +309,7 @@ module ActionController
           @number = 1 unless @paginator.has_page_number? @number
         end
         attr_reader :paginator, :number
+
         alias to_i number
 
         # Compares two Page objects and returns true when they represent the
index 14136ec20b5b1a9ce1afddc9fc143ec033a40bea..ea8476453512f7e0adcc0481378a7285d2c82f52 100644 (file)
@@ -1,7 +1,7 @@
 require "test_helper"
 
 module Api
-  class TracesControllerTest < ActionController::TestCase
+  class TracesControllerTest < ActionDispatch::IntegrationTest
     # Use temporary directories with unique names for each test
     # This allows the tests to be run in parallel.
     def setup
@@ -56,17 +56,17 @@ module Api
       public_trace_file = create(:trace, :visibility => "public")
 
       # First with no auth
-      get :show, :params => { :id => public_trace_file.id }
+      get api_trace_path(public_trace_file)
       assert_response :unauthorized
 
       # Now with some other user, which should work since the trace is public
-      basic_authorization create(:user).display_name, "test"
-      get :show, :params => { :id => public_trace_file.id }
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      get api_trace_path(public_trace_file), :headers => auth_header
       assert_response :success
 
       # And finally we should be able to do it with the owner of the trace
-      basic_authorization public_trace_file.user.display_name, "test"
-      get :show, :params => { :id => public_trace_file.id }
+      auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
+      get api_trace_path(public_trace_file), :headers => auth_header
       assert_response :success
     end
 
@@ -75,17 +75,17 @@ module Api
       anon_trace_file = create(:trace, :visibility => "private")
 
       # First with no auth
-      get :show, :params => { :id => anon_trace_file.id }
+      get api_trace_path(anon_trace_file)
       assert_response :unauthorized
 
       # Now try with another user, which shouldn't work since the trace is anon
-      basic_authorization create(:user).display_name, "test"
-      get :show, :params => { :id => anon_trace_file.id }
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      get api_trace_path(anon_trace_file), :headers => auth_header
       assert_response :forbidden
 
       # And finally we should be able to get the trace details with the trace owner
-      basic_authorization anon_trace_file.user.display_name, "test"
-      get :show, :params => { :id => anon_trace_file.id }
+      auth_header = basic_authorization_header anon_trace_file.user.display_name, "test"
+      get api_trace_path(anon_trace_file), :headers => auth_header
       assert_response :success
     end
 
@@ -94,17 +94,17 @@ module Api
       deleted_trace_file = create(:trace, :deleted)
 
       # Try first with no auth, as it should require it
-      get :show, :params => { :id => 0 }
+      get api_trace_path(:id => 0)
       assert_response :unauthorized
 
       # Login, and try again
-      basic_authorization deleted_trace_file.user.display_name, "test"
-      get :show, :params => { :id => 0 }
+      auth_header = basic_authorization_header deleted_trace_file.user.display_name, "test"
+      get api_trace_path(:id => 0), :headers => auth_header
       assert_response :not_found
 
       # Now try a trace which did exist but has been deleted
-      basic_authorization deleted_trace_file.user.display_name, "test"
-      get :show, :params => { :id => deleted_trace_file.id }
+      auth_header = basic_authorization_header deleted_trace_file.user.display_name, "test"
+      get api_trace_path(deleted_trace_file), :headers => auth_header
       assert_response :not_found
     end
 
@@ -113,17 +113,17 @@ module Api
       public_trace_file = create(:trace, :visibility => "public", :fixture => "a")
 
       # First with no auth
-      get :data, :params => { :id => public_trace_file.id }
+      get api_trace_data_path(public_trace_file)
       assert_response :unauthorized
 
       # Now with some other user, which should work since the trace is public
-      basic_authorization create(:user).display_name, "test"
-      get :data, :params => { :id => public_trace_file.id }
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      get api_trace_data_path(public_trace_file), :headers => auth_header
       check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
 
       # And finally we should be able to do it with the owner of the trace
-      basic_authorization public_trace_file.user.display_name, "test"
-      get :data, :params => { :id => public_trace_file.id }
+      auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
+      get api_trace_data_path(public_trace_file), :headers => auth_header
       check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
     end
 
@@ -132,18 +132,18 @@ module Api
       identifiable_trace_file = create(:trace, :visibility => "identifiable", :fixture => "d")
 
       # Authenticate as the owner of the trace we will be using
-      basic_authorization identifiable_trace_file.user.display_name, "test"
+      auth_header = basic_authorization_header identifiable_trace_file.user.display_name, "test"
 
       # First get the data as is
-      get :data, :params => { :id => identifiable_trace_file.id }
+      get api_trace_data_path(identifiable_trace_file), :headers => auth_header
       check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/x-gzip", "gpx.gz"
 
       # Now ask explicitly for XML format
-      get :data, :params => { :id => identifiable_trace_file.id, :format => "xml" }
+      get api_trace_data_path(identifiable_trace_file, :format => "xml"), :headers => auth_header
       check_trace_data identifiable_trace_file, "abd6675fdf3024a84fc0a1deac147c0d", "application/xml", "xml"
 
       # Now ask explicitly for GPX format
-      get :data, :params => { :id => identifiable_trace_file.id, :format => "gpx" }
+      get api_trace_data_path(identifiable_trace_file, :format => "gpx"), :headers => auth_header
       check_trace_data identifiable_trace_file, "abd6675fdf3024a84fc0a1deac147c0d"
     end
 
@@ -152,17 +152,17 @@ module Api
       anon_trace_file = create(:trace, :visibility => "private", :fixture => "b")
 
       # First with no auth
-      get :data, :params => { :id => anon_trace_file.id }
+      get api_trace_data_path(anon_trace_file)
       assert_response :unauthorized
 
       # Now with some other user, which shouldn't work since the trace is anon
-      basic_authorization create(:user).display_name, "test"
-      get :data, :params => { :id => anon_trace_file.id }
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      get api_trace_data_path(anon_trace_file), :headers => auth_header
       assert_response :forbidden
 
       # And finally we should be able to do it with the owner of the trace
-      basic_authorization anon_trace_file.user.display_name, "test"
-      get :data, :params => { :id => anon_trace_file.id }
+      auth_header = basic_authorization_header anon_trace_file.user.display_name, "test"
+      get api_trace_data_path(anon_trace_file), :headers => auth_header
       check_trace_data anon_trace_file, "db4cb5ed2d7d2b627b3b504296c4f701"
     end
 
@@ -171,17 +171,17 @@ module Api
       deleted_trace_file = create(:trace, :deleted)
 
       # Try first with no auth, as it should require it
-      get :data, :params => { :id => 0 }
+      get api_trace_data_path(:id => 0)
       assert_response :unauthorized
 
       # Login, and try again
-      basic_authorization create(:user).display_name, "test"
-      get :data, :params => { :id => 0 }
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      get api_trace_data_path(:id => 0), :headers => auth_header
       assert_response :not_found
 
       # Now try a trace which did exist but has been deleted
-      basic_authorization deleted_trace_file.user.display_name, "test"
-      get :data, :params => { :id => deleted_trace_file.id }
+      auth_header = basic_authorization_header deleted_trace_file.user.display_name, "test"
+      get api_trace_data_path(deleted_trace_file), :headers => auth_header
       assert_response :not_found
     end
 
@@ -193,7 +193,7 @@ module Api
       user = create(:user)
 
       # First with no auth
-      post :create, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }
+      post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }
       assert_response :unauthorized
 
       # Rewind the file
@@ -202,8 +202,8 @@ module Api
       # Now authenticated
       create(:user_preference, :user => user, :k => "gps.trace.visibility", :v => "identifiable")
       assert_not_equal "trackable", user.preferences.where(:k => "gps.trace.visibility").first.v
-      basic_authorization user.display_name, "test"
-      post :create, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }
+      auth_header = basic_authorization_header user.display_name, "test"
+      post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }, :headers => auth_header
       assert_response :success
       trace = Trace.find(response.body.to_i)
       assert_equal "a.gpx", trace.name
@@ -220,8 +220,8 @@ module Api
 
       # Now authenticated, with the legacy public flag
       assert_not_equal "public", user.preferences.where(:k => "gps.trace.visibility").first.v
-      basic_authorization user.display_name, "test"
-      post :create, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 1 }
+      auth_header = basic_authorization_header user.display_name, "test"
+      post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 1 }, :headers => auth_header
       assert_response :success
       trace = Trace.find(response.body.to_i)
       assert_equal "a.gpx", trace.name
@@ -239,8 +239,8 @@ module Api
       # Now authenticated, with the legacy private flag
       second_user = create(:user)
       assert_nil second_user.preferences.where(:k => "gps.trace.visibility").first
-      basic_authorization second_user.display_name, "test"
-      post :create, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 0 }
+      auth_header = basic_authorization_header second_user.display_name, "test"
+      post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 0 }, :headers => auth_header
       assert_response :success
       trace = Trace.find(response.body.to_i)
       assert_equal "a.gpx", trace.name
@@ -260,36 +260,36 @@ module Api
       anon_trace_file = create(:trace, :visibility => "private")
 
       # First with no auth
-      put :update, :params => { :id => public_trace_file.id }, :body => create_trace_xml(public_trace_file)
+      put api_trace_path(public_trace_file), :params => create_trace_xml(public_trace_file)
       assert_response :unauthorized
 
       # Now with some other user, which should fail
-      basic_authorization create(:user).display_name, "test"
-      put :update, :params => { :id => public_trace_file.id }, :body => create_trace_xml(public_trace_file)
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      put api_trace_path(public_trace_file), :params => create_trace_xml(public_trace_file), :headers => auth_header
       assert_response :forbidden
 
       # Now with a trace which doesn't exist
-      basic_authorization create(:user).display_name, "test"
-      put :update, :params => { :id => 0 }, :body => create_trace_xml(public_trace_file)
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      put api_trace_path(:id => 0), :params => create_trace_xml(public_trace_file), :headers => auth_header
       assert_response :not_found
 
       # Now with a trace which did exist but has been deleted
-      basic_authorization deleted_trace_file.user.display_name, "test"
-      put :update, :params => { :id => deleted_trace_file.id }, :body => create_trace_xml(deleted_trace_file)
+      auth_header = basic_authorization_header deleted_trace_file.user.display_name, "test"
+      put api_trace_path(deleted_trace_file), :params => create_trace_xml(deleted_trace_file), :headers => auth_header
       assert_response :not_found
 
       # Now try an update with the wrong ID
-      basic_authorization public_trace_file.user.display_name, "test"
-      put :update, :params => { :id => public_trace_file.id }, :body => create_trace_xml(anon_trace_file)
+      auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
+      put api_trace_path(public_trace_file), :params => create_trace_xml(anon_trace_file), :headers => auth_header
       assert_response :bad_request,
                       "should not be able to update a trace with a different ID from the XML"
 
       # And finally try an update that should work
-      basic_authorization public_trace_file.user.display_name, "test"
+      auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
       t = public_trace_file
       t.description = "Changed description"
       t.visibility = "private"
-      put :update, :params => { :id => t.id }, :body => create_trace_xml(t)
+      put api_trace_path(t), :params => create_trace_xml(t), :headers => auth_header
       assert_response :success
       nt = Trace.find(t.id)
       assert_equal nt.description, t.description
@@ -300,9 +300,9 @@ module Api
     def test_update_tags
       tracetag = create(:tracetag)
       trace = tracetag.trace
-      basic_authorization trace.user.display_name, "test"
+      auth_header = basic_authorization_header trace.user.display_name, "test"
 
-      put :update, :params => { :id => trace.id }, :body => create_trace_xml(trace)
+      put api_trace_path(trace), :params => create_trace_xml(trace), :headers => auth_header
       assert_response :success
 
       updated = Trace.find(trace.id)
@@ -317,27 +317,27 @@ module Api
       public_trace_file = create(:trace, :visibility => "public")
 
       # First with no auth
-      delete :destroy, :params => { :id => public_trace_file.id }
+      delete api_trace_path(public_trace_file)
       assert_response :unauthorized
 
       # Now with some other user, which should fail
-      basic_authorization create(:user).display_name, "test"
-      delete :destroy, :params => { :id => public_trace_file.id }
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      delete api_trace_path(public_trace_file), :headers => auth_header
       assert_response :forbidden
 
       # Now with a trace which doesn't exist
-      basic_authorization create(:user).display_name, "test"
-      delete :destroy, :params => { :id => 0 }
+      auth_header = basic_authorization_header create(:user).display_name, "test"
+      delete api_trace_path(:id => 0), :headers => auth_header
       assert_response :not_found
 
       # And finally we should be able to do it with the owner of the trace
-      basic_authorization public_trace_file.user.display_name, "test"
-      delete :destroy, :params => { :id => public_trace_file.id }
+      auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
+      delete api_trace_path(public_trace_file), :headers => auth_header
       assert_response :success
 
       # Try it a second time, which should fail
-      basic_authorization public_trace_file.user.display_name, "test"
-      delete :destroy, :params => { :id => public_trace_file.id }
+      auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
+      delete api_trace_path(public_trace_file), :headers => auth_header
       assert_response :not_found
     end
 
index a0d85ada36dd03ce8eba699ff4e7e8009d5c3575..ed128902ef43600bd1b77d7223615dc807af6250 100644 (file)
@@ -1,6 +1,6 @@
 require "test_helper"
 
-class UsersControllerTest < ActionController::TestCase
+class UsersControllerTest < ActionDispatch::IntegrationTest
   ##
   # test all routes which lead to this controller
   def test_routes
@@ -167,11 +167,11 @@ class UsersControllerTest < ActionController::TestCase
 
   # The user creation page loads
   def test_new_view
-    get :new
+    get user_new_path
     assert_response :redirect
     assert_redirected_to user_new_path(:cookie_test => "true")
 
-    get :new, :params => { :cookie_test => "true" }, :session => { :cookie_test => true }
+    get user_new_path, :params => { :cookie_test => "true" }
     assert_response :success
 
     assert_select "html", :count => 1 do
@@ -194,19 +194,13 @@ class UsersControllerTest < ActionController::TestCase
   end
 
   def test_new_view_logged_in
-    session[:user] = create(:user).id
+    session_for(create(:user))
 
-    get :new
-    assert_response :redirect
-    assert_redirected_to user_new_path(:cookie_test => "true")
-    get :new, :params => { :cookie_test => "true" }
+    get user_new_path
     assert_response :redirect
     assert_redirected_to root_path
 
-    get :new, :params => { :referer => "/test" }
-    assert_response :redirect
-    assert_redirected_to user_new_path(:referer => "/test", :cookie_test => "true")
-    get :new, :params => { :referer => "/test", :cookie_test => "true" }
+    get user_new_path, :params => { :referer => "/test" }
     assert_response :redirect
     assert_redirected_to "/test"
   end
@@ -214,10 +208,18 @@ class UsersControllerTest < ActionController::TestCase
   def test_new_success
     user = build(:user, :pending)
 
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_new_path, :params => { :user => user.attributes }
+        end
+      end
+    end
+
     assert_difference "User.count", 1 do
       assert_difference "ActionMailer::Base.deliveries.size", 1 do
         perform_enqueued_jobs do
-          post :save, :session => { :new_user => user }, :params => { :read_ct => 1, :read_tou => 1 }
+          post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
         end
       end
     end
@@ -236,12 +238,12 @@ class UsersControllerTest < ActionController::TestCase
 
   def test_new_duplicate_email
     user = build(:user, :pending)
-    user.email = create(:user).email
+    create(:user, :email => user.email)
 
     assert_no_difference "User.count" do
       assert_no_difference "ActionMailer::Base.deliveries.size" do
         perform_enqueued_jobs do
-          post :save, :session => { :new_user => user }, :params => { :read_ct => 1, :read_tou => 1 }
+          post user_new_path, :params => { :user => user.attributes }
         end
       end
     end
@@ -251,14 +253,26 @@ class UsersControllerTest < ActionController::TestCase
     assert_select "form > fieldset > div.standard-form-row > input.field_with_errors#user_email"
   end
 
-  def test_new_duplicate_email_uppercase
+  def test_save_duplicate_email
     user = build(:user, :pending)
-    user.email = create(:user).email.upcase
 
+    # Set up our user as being half-way through registration
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_new_path, :params => { :user => user.attributes }
+        end
+      end
+    end
+
+    # Now create another user with that email
+    create(:user, :email => user.email)
+
+    # Check that the second half of registration fails
     assert_no_difference "User.count" do
       assert_no_difference "ActionMailer::Base.deliveries.size" do
         perform_enqueued_jobs do
-          post :save, :session => { :new_user => user }, :params => { :read_ct => 1, :read_tou => 1 }
+          post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
         end
       end
     end
@@ -268,14 +282,55 @@ class UsersControllerTest < ActionController::TestCase
     assert_select "form > fieldset > div.standard-form-row > input.field_with_errors#user_email"
   end
 
-  def test_new_duplicate_name
+  def test_save_duplicate_email_uppercase
     user = build(:user, :pending)
-    user.display_name = create(:user).display_name
 
+    # Set up our user as being half-way through registration
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_new_path, :params => { :user => user.attributes }
+        end
+      end
+    end
+
+    # Now create another user with that email, but uppercased
+    create(:user, :email => user.email.upcase)
+
+    # Check that the second half of registration fails
     assert_no_difference "User.count" do
       assert_no_difference "ActionMailer::Base.deliveries.size" do
         perform_enqueued_jobs do
-          post :save, :session => { :new_user => user }, :params => { :read_ct => 1, :read_tou => 1 }
+          post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+        end
+      end
+    end
+
+    assert_response :success
+    assert_template "new"
+    assert_select "form > fieldset > div.standard-form-row > input.field_with_errors#user_email"
+  end
+
+  def test_save_duplicate_name
+    user = build(:user, :pending)
+
+    # Set up our user as being half-way through registration
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_new_path, :params => { :user => user.attributes }
+        end
+      end
+    end
+
+    # Now create another user with that display name
+    create(:user, :display_name => user.display_name)
+
+    # Check that the second half of registration fails
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
         end
       end
     end
@@ -285,14 +340,26 @@ class UsersControllerTest < ActionController::TestCase
     assert_select "form > fieldset > div.standard-form-row > input.field_with_errors#user_display_name"
   end
 
-  def test_new_duplicate_name_uppercase
+  def test_save_duplicate_name_uppercase
     user = build(:user, :pending)
-    user.display_name = create(:user).display_name.upcase
 
+    # Set up our user as being half-way through registration
     assert_no_difference "User.count" do
       assert_no_difference "ActionMailer::Base.deliveries.size" do
         perform_enqueued_jobs do
-          post :save, :session => { :new_user => user }, :params => { :read_ct => 1, :read_tou => 1 }
+          post user_new_path, :params => { :user => user.attributes }
+        end
+      end
+    end
+
+    # Now create another user with that display_name, but uppercased
+    create(:user, :display_name => user.display_name.upcase)
+
+    # Check that the second half of registration fails
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
         end
       end
     end
@@ -302,14 +369,26 @@ class UsersControllerTest < ActionController::TestCase
     assert_select "form > fieldset > div.standard-form-row > input.field_with_errors#user_display_name"
   end
 
-  def test_new_blocked_domain
+  def test_save_blocked_domain
     user = build(:user, :pending, :email => "user@example.net")
+
+    # Set up our user as being half-way through registration
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_new_path, :params => { :user => user.attributes }
+        end
+      end
+    end
+
+    # Now block that domain
     create(:acl, :domain => "example.net", :k => "no_account_creation")
 
+    # Check that the second half of registration fails
     assert_no_difference "User.count" do
       assert_no_difference "ActionMailer::Base.deliveries.size" do
         perform_enqueued_jobs do
-          post :save, :session => { :new_user => user }, :params => { :read_ct => 1, :read_tou => 1 }
+          post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
         end
       end
     end
@@ -321,175 +400,218 @@ class UsersControllerTest < ActionController::TestCase
   def test_save_referer_params
     user = build(:user, :pending)
 
+    # Set up our user as being half-way through registration
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_new_path, :params => { :user => user.attributes, :referer => "/edit?editor=id#map=1/2/3" }
+        end
+      end
+    end
+
     assert_difference "User.count", 1 do
       assert_difference "ActionMailer::Base.deliveries.size", 1 do
         perform_enqueued_jobs do
-          post :save, :session => { :new_user => user,
-                                    :referer => "/edit?editor=id#map=1/2/3" },
-                      :params => { :read_ct => 1, :read_tou => 1 }
+          post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
         end
       end
     end
 
     assert_equal welcome_path(:editor => "id", :zoom => 1, :lat => 2, :lon => 3),
-                 user.tokens.order("id DESC").first.referer
+                 User.find_by(:email => user.email).tokens.order("id DESC").first.referer
 
     ActionMailer::Base.deliveries.clear
   end
 
   def test_logout_without_referer
-    post :logout
+    post logout_path
     assert_response :redirect
     assert_redirected_to root_path
   end
 
   def test_logout_with_referer
-    post :logout, :params => { :referer => "/test" }
+    post logout_path, :params => { :referer => "/test" }
     assert_response :redirect
     assert_redirected_to "/test"
   end
 
   def test_logout_fallback_without_referer
-    get :logout
+    get logout_path
     assert_response :success
     assert_template :logout
     assert_select "input[name=referer][value=?]", ""
   end
 
   def test_logout_fallback_with_referer
-    get :logout, :params => { :referer => "/test" }
+    get logout_path, :params => { :referer => "/test" }
     assert_response :success
     assert_template :logout
     assert_select "input[name=referer][value=?]", "/test"
   end
 
-  def test_logout_with_token
-    token = create(:user).tokens.create
-
-    session[:token] = token.token
+  def test_logout_removes_session_token
+    user = build(:user, :pending)
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
 
-    post :logout
+    assert_difference "User.find_by(:email => user.email).tokens.count", -1 do
+      post logout_path
+    end
     assert_response :redirect
     assert_redirected_to root_path
-    assert_nil session[:token]
-    assert_nil UserToken.where(:id => token.id).first
   end
 
   def test_confirm_get
-    user = create(:user, :pending)
-    confirm_string = user.tokens.create.token
+    user = build(:user, :pending)
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create.token
 
-    @request.cookies["_osm_session"] = user.display_name
-    get :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_response :success
     assert_template :confirm
   end
 
   def test_confirm_get_already_confirmed
-    user = create(:user)
-    confirm_string = user.tokens.create.token
+    user = build(:user, :pending)
+    stub_gravatar_request(user.email)
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create.token
+
+    # Get the confirmation page
+    get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    assert_response :success
+    assert_template :confirm
 
-    @request.cookies["_osm_session"] = user.display_name
-    get :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    # Confirm the user
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    assert_redirected_to welcome_path
+
+    # Now try to get the confirmation page again
+    get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_response :redirect
     assert_redirected_to root_path
   end
 
   def test_confirm_success_no_token_no_referer
-    user = create(:user, :pending)
+    user = build(:user, :pending)
     stub_gravatar_request(user.email)
-    confirm_string = user.tokens.create.token
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create.token
+
+    post logout_path
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to login_path
     assert_match(/Confirmed your account/, flash[:notice])
   end
 
   def test_confirm_success_good_token_no_referer
-    user = create(:user, :pending)
+    user = build(:user, :pending)
     stub_gravatar_request(user.email)
-    confirm_string = user.tokens.create.token
-    token = user.tokens.create.token
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create.token
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to welcome_path
   end
 
   def test_confirm_success_bad_token_no_referer
-    user = create(:user, :pending)
+    user = build(:user, :pending)
     stub_gravatar_request(user.email)
-    confirm_string = user.tokens.create.token
-    token = create(:user).tokens.create.token
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create.token
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
+    post logout_path
+    session_for(create(:user))
+
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to login_path
     assert_match(/Confirmed your account/, flash[:notice])
   end
 
   def test_confirm_success_no_token_with_referer
-    user = create(:user, :pending)
+    user = build(:user, :pending)
     stub_gravatar_request(user.email)
-    confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
+
+    post logout_path
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to login_path(:referer => new_diary_entry_path)
     assert_match(/Confirmed your account/, flash[:notice])
   end
 
   def test_confirm_success_good_token_with_referer
-    user = create(:user, :pending)
+    user = build(:user, :pending)
     stub_gravatar_request(user.email)
-    confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
-    token = user.tokens.create.token
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to new_diary_entry_path
   end
 
   def test_confirm_success_bad_token_with_referer
-    user = create(:user, :pending)
+    user = build(:user, :pending)
     stub_gravatar_request(user.email)
-    confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
-    token = create(:user).tokens.create.token
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
+
+    post logout_path
+    session_for(create(:user))
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to login_path(:referer => new_diary_entry_path)
     assert_match(/Confirmed your account/, flash[:notice])
   end
 
   def test_confirm_expired_token
-    user = create(:user, :pending)
-    confirm_string = user.tokens.create(:expiry => 1.day.ago).token
+    user = build(:user, :pending)
+    stub_gravatar_request(user.email)
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create(:expiry => 1.day.ago).token
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to :action => "confirm"
     assert_match(/confirmation code has expired/, flash[:error])
   end
 
   def test_confirm_already_confirmed
-    user = create(:user)
-    confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
+    user = build(:user, :pending)
+    stub_gravatar_request(user.email)
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
+    confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
+
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    assert_redirected_to new_diary_entry_path
 
-    @request.cookies["_osm_session"] = user.display_name
-    post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
+    post logout_path
+
+    confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
+    post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
     assert_redirected_to :action => "login"
     assert_match(/already been confirmed/, flash[:error])
   end
 
   def test_confirm_resend_success
-    user = create(:user, :pending)
-    session[:token] = user.tokens.create.token
+    user = build(:user, :pending)
+    post user_new_path, :params => { :user => user.attributes }
+    post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
 
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        get :confirm_resend, :params => { :display_name => user.display_name }
+        get user_confirm_resend_path(user)
       end
     end
 
@@ -505,10 +627,13 @@ class UsersControllerTest < ActionController::TestCase
   end
 
   def test_confirm_resend_no_token
-    user = create(:user, :pending)
+    user = build(:user, :pending)
+    # only complete first half of registration
+    post user_new_path, :params => { :user => user.attributes }
+
     assert_no_difference "ActionMailer::Base.deliveries.size" do
       perform_enqueued_jobs do
-        get :confirm_resend, :params => { :display_name => user.display_name }
+        get user_confirm_resend_path(user)
       end
     end
 
@@ -520,7 +645,7 @@ class UsersControllerTest < ActionController::TestCase
   def test_confirm_resend_unknown_user
     assert_no_difference "ActionMailer::Base.deliveries.size" do
       perform_enqueued_jobs do
-        get :confirm_resend, :params => { :display_name => "No Such User" }
+        get user_confirm_resend_path(:display_name => "No Such User")
       end
     end
 
@@ -533,7 +658,7 @@ class UsersControllerTest < ActionController::TestCase
     user = create(:user)
     confirm_string = user.tokens.create.token
 
-    get :confirm_email, :params => { :confirm_string => confirm_string }
+    get user_confirm_email_path, :params => { :confirm_string => confirm_string }
     assert_response :success
     assert_template :confirm_email
   end
@@ -543,7 +668,7 @@ class UsersControllerTest < ActionController::TestCase
     stub_gravatar_request(user.new_email)
     confirm_string = user.tokens.create.token
 
-    post :confirm_email, :params => { :confirm_string => confirm_string }
+    post user_confirm_email_path, :params => { :confirm_string => confirm_string }
     assert_response :redirect
     assert_redirected_to :action => :account, :display_name => user.display_name
     assert_match(/Confirmed your change of email address/, flash[:notice])
@@ -553,14 +678,14 @@ class UsersControllerTest < ActionController::TestCase
     user = create(:user)
     confirm_string = user.tokens.create.token
 
-    post :confirm_email, :params => { :confirm_string => confirm_string }
+    post user_confirm_email_path, :params => { :confirm_string => confirm_string }
     assert_response :redirect
     assert_redirected_to :action => :account, :display_name => user.display_name
     assert_match(/already been confirmed/, flash[:error])
   end
 
   def test_confirm_email_bad_token
-    post :confirm_email, :params => { :confirm_string => "XXXXX" }
+    post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
     assert_response :success
     assert_template :confirm_email
     assert_match(/confirmation code has expired or does not exist/, flash[:error])
@@ -577,7 +702,7 @@ class UsersControllerTest < ActionController::TestCase
     confirm_string = user.tokens.create.token
     # precondition gravatar should be turned off
     assert_not user.image_use_gravatar
-    post :confirm_email, :params => { :confirm_string => confirm_string }
+    post user_confirm_email_path, :params => { :confirm_string => confirm_string }
     assert_response :redirect
     assert_redirected_to :action => :account, :display_name => user.display_name
     assert_match(/Confirmed your change of email address/, flash[:notice])
@@ -592,7 +717,7 @@ class UsersControllerTest < ActionController::TestCase
     confirm_string = user.tokens.create.token
     # precondition gravatar should be turned on
     assert user.image_use_gravatar
-    post :confirm_email, :params => { :confirm_string => confirm_string }
+    post user_confirm_email_path, :params => { :confirm_string => confirm_string }
     assert_response :redirect
     assert_redirected_to :action => :account, :display_name => user.display_name
     assert_match(/Confirmed your change of email address/, flash[:notice])
@@ -601,7 +726,19 @@ class UsersControllerTest < ActionController::TestCase
   end
 
   def test_terms_new_user
-    get :terms, :session => { :new_user => User.new }
+    user = build(:user, :pending)
+
+    # Set up our user as being half-way through registration
+    assert_no_difference "User.count" do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post user_new_path, :params => { :user => user.attributes }
+        end
+      end
+    end
+
+    get user_terms_path
+
     assert_response :success
     assert_template :terms
   end
@@ -609,9 +746,9 @@ class UsersControllerTest < ActionController::TestCase
   def test_terms_agreed
     user = create(:user, :terms_seen => true, :terms_agreed => Date.yesterday)
 
-    session[:user] = user.id
+    session_for(user)
 
-    get :terms
+    get user_terms_path
     assert_response :redirect
     assert_redirected_to :action => :account, :display_name => user.display_name
   end
@@ -619,13 +756,13 @@ class UsersControllerTest < ActionController::TestCase
   def test_terms_not_seen_without_referer
     user = create(:user, :terms_seen => false, :terms_agreed => nil)
 
-    session[:user] = user.id
+    session_for(user)
 
-    get :terms
+    get user_terms_path
     assert_response :success
     assert_template :terms
 
-    post :save, :params => { :user => { :consider_pd => true }, :read_ct => 1, :read_tou => 1 }
+    post user_save_path, :params => { :user => { :consider_pd => true }, :read_ct => 1, :read_tou => 1 }
     assert_response :redirect
     assert_redirected_to :action => :account, :display_name => user.display_name
     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
@@ -640,13 +777,13 @@ class UsersControllerTest < ActionController::TestCase
   def test_terms_not_seen_with_referer
     user = create(:user, :terms_seen => false, :terms_agreed => nil)
 
-    session[:user] = user.id
+    session_for(user)
 
-    get :terms, :params => { :referer => "/test" }
+    get user_terms_path, :params => { :referer => "/test" }
     assert_response :success
     assert_template :terms
 
-    post :save, :params => { :user => { :consider_pd => true }, :referer => "/test", :read_ct => 1, :read_tou => 1 }
+    post user_save_path, :params => { :user => { :consider_pd => true }, :referer => "/test", :read_ct => 1, :read_tou => 1 }
     assert_response :redirect
     assert_redirected_to "/test"
     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
@@ -662,16 +799,19 @@ class UsersControllerTest < ActionController::TestCase
   # that your request is redirected to view the terms
   def test_terms_not_seen_redirection
     user = create(:user, :terms_seen => false, :terms_agreed => nil)
-    session[:user] = user.id
+    session_for(user)
 
-    get :account, :params => { :display_name => user.display_name }
+    get user_account_path(user)
     assert_response :redirect
     assert_redirected_to :action => :terms, :referer => "/user/#{ERB::Util.u(user.display_name)}/account"
   end
 
   def test_go_public
     user = create(:user, :data_public => false)
-    post :go_public, :session => { :user => user }
+    session_for(user)
+
+    post user_go_public_path
+
     assert_response :redirect
     assert_redirected_to :action => :account, :display_name => user.display_name
     assert User.find(user.id).data_public
@@ -679,7 +819,7 @@ class UsersControllerTest < ActionController::TestCase
 
   def test_lost_password
     # Test fetching the lost password page
-    get :lost_password
+    get user_forgot_password_path
     assert_response :success
     assert_template :lost_password
     assert_select "div#notice", false
@@ -691,7 +831,7 @@ class UsersControllerTest < ActionController::TestCase
 
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        post :lost_password, :params => { :user => { :email => user.email } }
+        post user_forgot_password_path, :params => { :user => { :email => user.email } }
       end
     end
     assert_response :redirect
@@ -706,7 +846,7 @@ class UsersControllerTest < ActionController::TestCase
     # that has the same address in a different case
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        post :lost_password, :params => { :user => { :email => user.email.upcase } }
+        post user_forgot_password_path, :params => { :user => { :email => user.email.upcase } }
       end
     end
     assert_response :redirect
@@ -721,7 +861,7 @@ class UsersControllerTest < ActionController::TestCase
     # for more than one user but not an exact match for either
     assert_no_difference "ActionMailer::Base.deliveries.size" do
       perform_enqueued_jobs do
-        post :lost_password, :params => { :user => { :email => user.email.titlecase } }
+        post user_forgot_password_path, :params => { :user => { :email => user.email.titlecase } }
       end
     end
     assert_response :success
@@ -733,7 +873,7 @@ class UsersControllerTest < ActionController::TestCase
     third_user = create(:user)
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        post :lost_password, :params => { :user => { :email => third_user.email } }
+        post user_forgot_password_path, :params => { :user => { :email => third_user.email } }
       end
     end
     assert_response :redirect
@@ -748,7 +888,7 @@ class UsersControllerTest < ActionController::TestCase
     # same (case insensitively unique) address in a different case
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        post :lost_password, :params => { :user => { :email => third_user.email.upcase } }
+        post user_forgot_password_path, :params => { :user => { :email => third_user.email.upcase } }
       end
     end
     assert_response :redirect
@@ -763,11 +903,11 @@ class UsersControllerTest < ActionController::TestCase
   def test_reset_password
     user = create(:user, :pending)
     # Test a request with no token
-    get :reset_password
+    get user_reset_password_path
     assert_response :bad_request
 
     # Test a request with a bogus token
-    get :reset_password, :params => { :token => "made_up_token" }
+    get user_reset_password_path, :params => { :token => "made_up_token" }
     assert_response :redirect
     assert_redirected_to :action => :lost_password
 
@@ -775,18 +915,18 @@ class UsersControllerTest < ActionController::TestCase
     token = user.tokens.create
 
     # Test a request with a valid token
-    get :reset_password, :params => { :token => token.token }
+    get user_reset_password_path, :params => { :token => token.token }
     assert_response :success
     assert_template :reset_password
 
     # Test that errors are reported for erroneous submissions
-    post :reset_password, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "different_password" } }
+    post user_reset_password_path, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "different_password" } }
     assert_response :success
     assert_template :reset_password
     assert_select "div#errorExplanation"
 
     # Test setting a new password
-    post :reset_password, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "new_password" } }
+    post user_reset_password_path, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "new_password" } }
     assert_response :redirect
     assert_redirected_to root_path
     assert_equal user.id, session[:user]
@@ -806,16 +946,18 @@ class UsersControllerTest < ActionController::TestCase
 
     # Make sure that you are redirected to the login page when
     # you are not logged in
-    get :account, :params => { :display_name => user.display_name }
+    get user_account_path(user)
     assert_response :redirect
     assert_redirected_to :action => "login", :referer => "/user/#{ERB::Util.u(user.display_name)}/account"
 
     # Make sure that you are blocked when not logged in as the right user
-    get :account, :params => { :display_name => user.display_name }, :session => { :user => create(:user) }
+    session_for(create(:user))
+    get user_account_path(user)
     assert_response :forbidden
 
     # Make sure we get the page when we are logged in as the right user
-    get :account, :params => { :display_name => user.display_name }, :session => { :user => user }
+    session_for(user)
+    get user_account_path(user)
     assert_response :success
     assert_template :account
     assert_select "form#accountForm" do |form|
@@ -827,7 +969,7 @@ class UsersControllerTest < ActionController::TestCase
     # Updating the description should work
     user.description = "new description"
     user.preferred_editor = "default"
-    post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => user.attributes }
     assert_response :success
     assert_template :account
     assert_select "div#errorExplanation", false
@@ -836,7 +978,7 @@ class UsersControllerTest < ActionController::TestCase
 
     # Changing to a invalid editor should fail
     user.preferred_editor = "unknown"
-    post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => user.attributes }
     assert_response :success
     assert_template :account
     assert_select ".notice", false
@@ -845,7 +987,7 @@ class UsersControllerTest < ActionController::TestCase
 
     # Changing to a valid editor should work
     user.preferred_editor = "potlatch2"
-    post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => user.attributes }
     assert_response :success
     assert_template :account
     assert_select "div#errorExplanation", false
@@ -854,7 +996,7 @@ class UsersControllerTest < ActionController::TestCase
 
     # Changing to the default editor should work
     user.preferred_editor = "default"
-    post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => user.attributes }
     assert_response :success
     assert_template :account
     assert_select "div#errorExplanation", false
@@ -863,7 +1005,7 @@ class UsersControllerTest < ActionController::TestCase
 
     # Changing to an uploaded image should work
     image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
-    post :account, :params => { :display_name => user.display_name, :avatar_action => "new", :user => user.attributes.merge(:avatar => image) }, :session => { :user => user }
+    post user_account_path(user), :params => { :avatar_action => "new", :user => user.attributes.merge(:avatar => image) }
     assert_response :success
     assert_template :account
     assert_select "div#errorExplanation", false
@@ -871,7 +1013,7 @@ class UsersControllerTest < ActionController::TestCase
     assert_select "form#accountForm > fieldset > div.standard-form-row.accountImage input[name=avatar_action][checked][value=?]", "keep"
 
     # Changing to a gravatar image should work
-    post :account, :params => { :display_name => user.display_name, :avatar_action => "gravatar", :user => user.attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :avatar_action => "gravatar", :user => user.attributes }
     assert_response :success
     assert_template :account
     assert_select "div#errorExplanation", false
@@ -879,7 +1021,7 @@ class UsersControllerTest < ActionController::TestCase
     assert_select "form#accountForm > fieldset > div.standard-form-row.accountImage input[name=avatar_action][checked][value=?]", "gravatar"
 
     # Removing the image should work
-    post :account, :params => { :display_name => user.display_name, :avatar_action => "delete", :user => user.attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :avatar_action => "delete", :user => user.attributes }
     assert_response :success
     assert_template :account
     assert_select "div#errorExplanation", false
@@ -887,13 +1029,13 @@ class UsersControllerTest < ActionController::TestCase
     assert_select "form#accountForm > fieldset > div.standard-form-row.accountImage input[name=avatar_action][checked]", false
 
     # Adding external authentication should redirect to the auth provider
-    post :account, :params => { :display_name => user.display_name, :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }
     assert_response :redirect
     assert_redirected_to auth_path(:provider => "openid", :openid_url => "https://www.google.com/accounts/o8/id", :origin => "/user/#{ERB::Util.u(user.display_name)}/account")
 
     # Changing name to one that exists should fail
     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
-    post :account, :params => { :display_name => user.display_name, :user => new_attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => new_attributes }
     assert_response :success
     assert_template :account
     assert_select ".notice", false
@@ -902,7 +1044,7 @@ class UsersControllerTest < ActionController::TestCase
 
     # Changing name to one that exists should fail, regardless of case
     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
-    post :account, :params => { :display_name => user.display_name, :user => new_attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => new_attributes }
     assert_response :success
     assert_template :account
     assert_select ".notice", false
@@ -911,7 +1053,7 @@ class UsersControllerTest < ActionController::TestCase
 
     # Changing name to one that doesn't exist should work
     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
-    post :account, :params => { :display_name => user.display_name, :user => new_attributes }, :session => { :user => user }
+    post user_account_path(user), :params => { :user => new_attributes }
     assert_response :success
     assert_template :account
     assert_select "div#errorExplanation", false
@@ -925,7 +1067,7 @@ class UsersControllerTest < ActionController::TestCase
     user.new_email = create(:user).email
     assert_no_difference "ActionMailer::Base.deliveries.size" do
       perform_enqueued_jobs do
-        post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+        post user_account_path(user), :params => { :user => user.attributes }
       end
     end
     assert_response :success
@@ -938,7 +1080,7 @@ class UsersControllerTest < ActionController::TestCase
     user.new_email = create(:user).email.upcase
     assert_no_difference "ActionMailer::Base.deliveries.size" do
       perform_enqueued_jobs do
-        post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+        post user_account_path(user), :params => { :user => user.attributes }
       end
     end
     assert_response :success
@@ -951,7 +1093,7 @@ class UsersControllerTest < ActionController::TestCase
     user.new_email = "new_tester@example.com"
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+        post user_account_path(user), :params => { :user => user.attributes }
       end
     end
     assert_response :success
@@ -969,7 +1111,7 @@ class UsersControllerTest < ActionController::TestCase
   # information for the user
   def test_show
     # Test a non-existent user
-    get :show, :params => { :display_name => "unknown" }
+    get user_path(:display_name => "unknown")
     assert_response :not_found
 
     # Test a normal user
@@ -978,7 +1120,7 @@ class UsersControllerTest < ActionController::TestCase
     create(:friendship, :befriender => user, :befriendee => friend_user)
     create(:changeset, :user => friend_user)
 
-    get :show, :params => { :display_name => user.display_name }
+    get user_path(user)
     assert_response :success
     assert_select "div#userinformation" do
       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
@@ -997,7 +1139,7 @@ class UsersControllerTest < ActionController::TestCase
     # Test a user who has been blocked
     blocked_user = create(:user)
     create(:user_block, :user => blocked_user)
-    get :show, :params => { :display_name => blocked_user.display_name }
+    get user_path(blocked_user)
     assert_response :success
     assert_select "div#userinformation" do
       assert_select "a[href^='/user/#{ERB::Util.u(blocked_user.display_name)}/history']", 1
@@ -1013,7 +1155,7 @@ class UsersControllerTest < ActionController::TestCase
     # Test a moderator who has applied blocks
     moderator_user = create(:moderator_user)
     create(:user_block, :creator => moderator_user)
-    get :show, :params => { :display_name => moderator_user.display_name }
+    get user_path(moderator_user)
     assert_response :success
     assert_select "div#userinformation" do
       assert_select "a[href^='/user/#{ERB::Util.u(moderator_user.display_name)}/history']", 1
@@ -1027,10 +1169,10 @@ class UsersControllerTest < ActionController::TestCase
     end
 
     # Login as a normal user
-    session[:user] = user.id
+    session_for(user)
 
     # Test the normal user
-    get :show, :params => { :display_name => user.display_name }
+    get user_path(user)
     assert_response :success
     assert_select "div#userinformation" do
       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
@@ -1049,10 +1191,10 @@ class UsersControllerTest < ActionController::TestCase
     end
 
     # Login as a moderator
-    session[:user] = create(:moderator_user).id
+    session_for(create(:moderator_user))
 
     # Test the normal user
-    get :show, :params => { :display_name => user.display_name }
+    get user_path(user)
     assert_response :success
     assert_select "div#userinformation" do
       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
@@ -1072,13 +1214,13 @@ class UsersControllerTest < ActionController::TestCase
     seen_user = create(:user, :terms_seen => true, :terms_agreed => nil)
     not_seen_user = create(:user, :terms_seen => false, :terms_agreed => nil)
 
-    get :show, :params => { :display_name => agreed_user.display_name }
+    get user_path(agreed_user)
     assert_response :success
     assert_select "div#userinformation" do
       assert_select "p", :count => 0, :text => /Contributor terms/
     end
 
-    get :show, :params => { :display_name => seen_user.display_name }
+    get user_path(seen_user)
     assert_response :success
     # put @response.body
     assert_select "div#userinformation" do
@@ -1086,7 +1228,7 @@ class UsersControllerTest < ActionController::TestCase
       assert_select "p", /Declined/
     end
 
-    get :show, :params => { :display_name => not_seen_user.display_name }
+    get user_path(not_seen_user)
     assert_response :success
     assert_select "div#userinformation" do
       assert_select "p", :count => 1, :text => /Contributor terms/
@@ -1103,16 +1245,18 @@ class UsersControllerTest < ActionController::TestCase
     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
 
     # When not logged in a GET should ask us to login
-    get :make_friend, :params => { :display_name => friend.display_name }
+    get make_friend_path(friend)
     assert_redirected_to :action => "login", :referer => make_friend_path(:display_name => friend.display_name)
 
     # When not logged in a POST should error
-    post :make_friend, :params => { :display_name => friend.display_name }
+    post make_friend_path(friend)
     assert_response :forbidden
     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
 
+    session_for(user)
+
     # When logged in a GET should get a confirmation page
-    get :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+    get make_friend_path(friend)
     assert_response :success
     assert_template :make_friend
     assert_select "form" do
@@ -1124,7 +1268,7 @@ class UsersControllerTest < ActionController::TestCase
     # When logged in a POST should add the friendship
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+        post make_friend_path(friend)
       end
     end
     assert_redirected_to user_path(friend)
@@ -1138,7 +1282,7 @@ class UsersControllerTest < ActionController::TestCase
     # A second POST should report that the friendship already exists
     assert_no_difference "ActionMailer::Base.deliveries.size" do
       perform_enqueued_jobs do
-        post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+        post make_friend_path(friend)
       end
     end
     assert_redirected_to user_path(friend)
@@ -1150,12 +1294,13 @@ class UsersControllerTest < ActionController::TestCase
     # Get users to work with
     user = create(:user)
     friend = create(:user)
+    session_for(user)
 
     # Check that the users aren't already friends
     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
 
     # The GET should preserve any referer
-    get :make_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
+    get make_friend_path(friend), :params => { :referer => "/test" }
     assert_response :success
     assert_template :make_friend
     assert_select "form" do
@@ -1167,7 +1312,7 @@ class UsersControllerTest < ActionController::TestCase
     # When logged in a POST should add the friendship and refer us
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       perform_enqueued_jobs do
-        post :make_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
+        post make_friend_path(friend), :params => { :referer => "/test" }
       end
     end
     assert_redirected_to "/test"
@@ -1181,7 +1326,8 @@ class UsersControllerTest < ActionController::TestCase
 
   def test_make_friend_unkown_user
     # Should error when a bogus user is specified
-    get :make_friend, :params => { :display_name => "No Such User" }, :session => { :user => create(:user) }
+    session_for(create(:user))
+    get make_friend_path(:display_name => "No Such User")
     assert_response :not_found
     assert_template :no_such_user
   end
@@ -1196,16 +1342,18 @@ class UsersControllerTest < ActionController::TestCase
     assert Friendship.where(:befriender => user, :befriendee => friend).first
 
     # When not logged in a GET should ask us to login
-    get :remove_friend, :params => { :display_name => friend.display_name }
+    get remove_friend_path(friend)
     assert_redirected_to :action => "login", :referer => remove_friend_path(:display_name => friend.display_name)
 
     # When not logged in a POST should error
-    post :remove_friend, :params => { :display_name => friend.display_name }
+    post remove_friend_path, :params => { :display_name => friend.display_name }
     assert_response :forbidden
     assert Friendship.where(:befriender => user, :befriendee => friend).first
 
+    session_for(user)
+
     # When logged in a GET should get a confirmation page
-    get :remove_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+    get remove_friend_path(friend)
     assert_response :success
     assert_template :remove_friend
     assert_select "form" do
@@ -1215,13 +1363,13 @@ class UsersControllerTest < ActionController::TestCase
     assert Friendship.where(:befriender => user, :befriendee => friend).first
 
     # When logged in a POST should remove the friendship
-    post :remove_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+    post remove_friend_path(friend)
     assert_redirected_to user_path(friend)
     assert_match(/was removed from your friends/, flash[:notice])
     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
 
     # A second POST should report that the friendship does not exist
-    post :remove_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+    post remove_friend_path(friend)
     assert_redirected_to user_path(friend)
     assert_match(/is not one of your friends/, flash[:error])
     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
@@ -1232,12 +1380,13 @@ class UsersControllerTest < ActionController::TestCase
     user = create(:user)
     friend = create(:user)
     create(:friendship, :befriender => user, :befriendee => friend)
+    session_for(user)
 
     # Check that the users are friends
     assert Friendship.where(:befriender => user, :befriendee => friend).first
 
     # The GET should preserve any referer
-    get :remove_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
+    get remove_friend_path(friend), :params => { :referer => "/test" }
     assert_response :success
     assert_template :remove_friend
     assert_select "form" do
@@ -1247,7 +1396,7 @@ class UsersControllerTest < ActionController::TestCase
     assert Friendship.where(:befriender => user, :befriendee => friend).first
 
     # When logged in a POST should remove the friendship and refer
-    post :remove_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
+    post remove_friend_path(friend), :params => { :referer => "/test" }
     assert_redirected_to "/test"
     assert_match(/was removed from your friends/, flash[:notice])
     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
@@ -1255,7 +1404,8 @@ class UsersControllerTest < ActionController::TestCase
 
   def test_remove_friend_unkown_user
     # Should error when a bogus user is specified
-    get :remove_friend, :params => { :display_name => "No Such User" }, :session => { :user => create(:user) }
+    session_for(create(:user))
+    get remove_friend_path(:display_name => "No Such User")
     assert_response :not_found
     assert_template :no_such_user
   end
@@ -1264,17 +1414,19 @@ class UsersControllerTest < ActionController::TestCase
     user = create(:user)
 
     # Try without logging in
-    get :set_status, :params => { :display_name => user.display_name, :status => "suspended" }
+    get set_status_user_path(user), :params => { :status => "suspended" }
     assert_response :redirect
     assert_redirected_to :action => :login, :referer => set_status_user_path(:status => "suspended")
 
     # Now try as a normal user
-    get :set_status, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => user }
+    session_for(user)
+    get set_status_user_path(user), :params => { :status => "suspended" }
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
 
     # Finally try as an administrator
-    get :set_status, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => create(:administrator_user) }
+    session_for(create(:administrator_user))
+    get set_status_user_path(user), :params => { :status => "suspended" }
     assert_response :redirect
     assert_redirected_to :action => :show, :display_name => user.display_name
     assert_equal "suspended", User.find(user.id).status
@@ -1284,17 +1436,19 @@ class UsersControllerTest < ActionController::TestCase
     user = create(:user, :home_lat => 12.1, :home_lon => 12.1, :description => "test")
 
     # Try without logging in
-    get :delete, :params => { :display_name => user.display_name, :status => "suspended" }
+    get delete_user_path(user), :params => { :status => "suspended" }
     assert_response :redirect
     assert_redirected_to :action => :login, :referer => delete_user_path(:status => "suspended")
 
     # Now try as a normal user
-    get :delete, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => user }
+    session_for(user)
+    get delete_user_path(user), :params => { :status => "suspended" }
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
 
     # Finally try as an administrator
-    get :delete, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => create(:administrator_user) }
+    session_for(create(:administrator_user))
+    get delete_user_path(user), :params => { :status => "suspended" }
     assert_response :redirect
     assert_redirected_to :action => :show, :display_name => user.display_name
 
@@ -1324,41 +1478,41 @@ class UsersControllerTest < ActionController::TestCase
     assert_equal 7, User.count
 
     # Shouldn't work when not logged in
-    get :index
+    get users_path
     assert_response :redirect
     assert_redirected_to :action => :login, :referer => users_path
 
-    session[:user] = user.id
+    session_for(user)
 
     # Shouldn't work when logged in as a normal user
-    get :index
+    get users_path
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
 
-    session[:user] = moderator_user.id
+    session_for(moderator_user)
 
     # Shouldn't work when logged in as a moderator
-    get :index
+    get users_path
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
 
-    session[:user] = administrator_user.id
+    session_for(administrator_user)
 
     # Note there is a header row, so all row counts are users + 1
     # Should work when logged in as an administrator
-    get :index
+    get users_path
     assert_response :success
     assert_template :index
     assert_select "table#user_list tr", :count => 7 + 1
 
     # Should be able to limit by status
-    get :index, :params => { :status => "suspended" }
+    get users_path, :params => { :status => "suspended" }
     assert_response :success
     assert_template :index
     assert_select "table#user_list tr", :count => 1 + 1
 
     # Should be able to limit by IP address
-    get :index, :params => { :ip => "1.2.3.4" }
+    get users_path, :params => { :ip => "1.2.3.4" }
     assert_response :success
     assert_template :index
     assert_select "table#user_list tr", :count => 1 + 1
@@ -1371,22 +1525,22 @@ class UsersControllerTest < ActionController::TestCase
                   :pass_crypt => "extraextra")
     end
 
-    session[:user] = create(:administrator_user).id
+    session_for(create(:administrator_user))
 
     # 100 examples, an administrator, and a granter for the admin.
     assert_equal 102, User.count
 
-    get :index
+    get users_path
     assert_response :success
     assert_template :index
     assert_select "table#user_list tr", :count => 51
 
-    get :index, :params => { :page => 2 }
+    get users_path, :params => { :page => 2 }
     assert_response :success
     assert_template :index
     assert_select "table#user_list tr", :count => 51
 
-    get :index, :params => { :page => 3 }
+    get users_path, :params => { :page => 3 }
     assert_response :success
     assert_template :index
     assert_select "table#user_list tr", :count => 3
@@ -1398,40 +1552,40 @@ class UsersControllerTest < ActionController::TestCase
 
     # Shouldn't work when not logged in
     assert_no_difference "User.active.count" do
-      post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
+      post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
     end
     assert_response :forbidden
 
     assert_equal "pending", inactive_user.reload.status
     assert_equal "suspended", suspended_user.reload.status
 
-    session[:user] = create(:user).id
+    session_for(create(:user))
 
     # Shouldn't work when logged in as a normal user
     assert_no_difference "User.active.count" do
-      post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
+      post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
     end
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert_equal "pending", inactive_user.reload.status
     assert_equal "suspended", suspended_user.reload.status
 
-    session[:user] = create(:moderator_user).id
+    session_for(create(:moderator_user))
 
     # Shouldn't work when logged in as a moderator
     assert_no_difference "User.active.count" do
-      post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
+      post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
     end
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert_equal "pending", inactive_user.reload.status
     assert_equal "suspended", suspended_user.reload.status
 
-    session[:user] = create(:administrator_user).id
+    session_for(create(:administrator_user))
 
     # Should work when logged in as an administrator
     assert_difference "User.active.count", 2 do
-      post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
+      post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
     end
     assert_response :redirect
     assert_redirected_to :action => :index
@@ -1445,40 +1599,40 @@ class UsersControllerTest < ActionController::TestCase
 
     # Shouldn't work when not logged in
     assert_no_difference "User.active.count" do
-      post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
+      post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
     end
     assert_response :forbidden
 
     assert_equal "active", normal_user.reload.status
     assert_equal "confirmed", confirmed_user.reload.status
 
-    session[:user] = create(:user).id
+    session_for(create(:user))
 
     # Shouldn't work when logged in as a normal user
     assert_no_difference "User.active.count" do
-      post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
+      post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
     end
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert_equal "active", normal_user.reload.status
     assert_equal "confirmed", confirmed_user.reload.status
 
-    session[:user] = create(:moderator_user).id
+    session_for(create(:moderator_user))
 
     # Shouldn't work when logged in as a moderator
     assert_no_difference "User.active.count" do
-      post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
+      post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
     end
     assert_response :redirect
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert_equal "active", normal_user.reload.status
     assert_equal "confirmed", confirmed_user.reload.status
 
-    session[:user] = create(:administrator_user).id
+    session_for(create(:administrator_user))
 
     # Should work when logged in as an administrator
     assert_difference "User.active.count", -2 do
-      post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
+      post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
     end
     assert_response :redirect
     assert_redirected_to :action => :index
index c02b23728cc41ec0425d2f215948f6dd321fee52..9354e664600cd87eccfe4d3107b125bb4b692005 100644 (file)
@@ -115,12 +115,6 @@ module ActiveSupport
       assert_equal a.tags, b.tags, "tags on node #{a.id}"
     end
 
-    ##
-    # set request headers for HTTP basic authentication
-    def basic_authorization(user, pass)
-      @request.env["HTTP_AUTHORIZATION"] = format("Basic %{auth}", :auth => Base64.encode64("#{user}:#{pass}"))
-    end
-
     ##
     # return request header for HTTP Basic Authorization
     def basic_authorization_header(user, pass)