]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/2452'
authorTom Hughes <tom@compton.nu>
Wed, 18 Dec 2019 18:23:42 +0000 (18:23 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 18 Dec 2019 18:23:42 +0000 (18:23 +0000)
31 files changed:
.rubocop_todo.yml
Gemfile
Gemfile.lock
app/assets/stylesheets/common.scss
app/assets/stylesheets/parameters.scss
app/controllers/api/amf_controller.rb
app/controllers/site_controller.rb
app/models/user.rb
app/views/browse/note.html.erb
app/views/diary_entries/comments.html.erb
app/views/notes/mine.html.erb
app/views/oauth_clients/index.html.erb
app/views/site/edit.html.erb
app/views/user_blocks/_blocks.html.erb
app/views/users/index.html.erb
config/initializers/i18n.rb
config/locales/en.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/fa.yml
config/locales/fr.yml
config/locales/it.yml
config/locales/pl.yml
config/locales/sco.yml
test/controllers/api/changesets_controller_test.rb
test/controllers/api/relations_controller_test.rb
test/controllers/site_controller_test.rb
test/helpers/note_helper_test.rb
test/integration/compressed_requests_test.rb
test/lib/i18n_test.rb
test/test_helper.rb

index 054e10cda85f1b763b58440f18122fc0bd244617..f768dddc628819d712b3ced01d72782d887e1aba 100644 (file)
@@ -31,6 +31,7 @@ Lint/SuppressedException:
   Exclude:
     - 'app/controllers/api/amf_controller.rb'
     - 'app/controllers/users_controller.rb'
+    - 'app/controllers/site_controller.rb'
 
 # Offense count: 701
 Metrics/AbcSize:
diff --git a/Gemfile b/Gemfile
index d7739491172f55d499e652c2bc6941bde9f62bf8..466d733235ab4b8d59e59837ad2f3e608199dd60 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 source "https://rubygems.org"
 
 # Require rails
-gem "rails", "6.0.1"
+gem "rails", "6.0.2"
 
 # Require things which have moved to gems in ruby 1.9
 gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
@@ -40,6 +40,7 @@ gem "autoprefixer-rails"
 gem "image_optim_rails"
 
 # Load rails plugins
+gem "actionpack-page_caching", ">= 1.2.0"
 gem "active_record_union"
 gem "activerecord-import"
 gem "bootstrap", "~> 4.3.1"
@@ -51,7 +52,6 @@ gem "dynamic_form"
 gem "http_accept_language", "~> 2.0.0"
 gem "i18n-js", ">= 3.0.0"
 gem "oauth-plugin", ">= 0.5.1"
-gem "openstreetmap-actionpack-page_caching", ">= 1.1.2", :require => "actionpack/page_caching"
 gem "openstreetmap-deadlock_retry", ">= 1.3.0", :require => "deadlock_retry"
 gem "rack-cors"
 gem "rails-i18n", "~> 4.0.0"
index 5af33d9a18ed98d05f94725d75e6e6268c58ae80..cc2d7deafde8f9b4e990cc519a6d0c83efa292c2 100644 (file)
@@ -4,60 +4,62 @@ GEM
     SystemTimer (1.2.3)
     aasm (5.0.6)
       concurrent-ruby (~> 1.0)
-    actioncable (6.0.1)
-      actionpack (= 6.0.1)
+    actioncable (6.0.2)
+      actionpack (= 6.0.2)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailbox (6.0.1)
-      actionpack (= 6.0.1)
-      activejob (= 6.0.1)
-      activerecord (= 6.0.1)
-      activestorage (= 6.0.1)
-      activesupport (= 6.0.1)
+    actionmailbox (6.0.2)
+      actionpack (= 6.0.2)
+      activejob (= 6.0.2)
+      activerecord (= 6.0.2)
+      activestorage (= 6.0.2)
+      activesupport (= 6.0.2)
       mail (>= 2.7.1)
-    actionmailer (6.0.1)
-      actionpack (= 6.0.1)
-      actionview (= 6.0.1)
-      activejob (= 6.0.1)
+    actionmailer (6.0.2)
+      actionpack (= 6.0.2)
+      actionview (= 6.0.2)
+      activejob (= 6.0.2)
       mail (~> 2.5, >= 2.5.4)
       rails-dom-testing (~> 2.0)
-    actionpack (6.0.1)
-      actionview (= 6.0.1)
-      activesupport (= 6.0.1)
+    actionpack (6.0.2)
+      actionview (= 6.0.2)
+      activesupport (= 6.0.2)
       rack (~> 2.0)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.2.0)
-    actiontext (6.0.1)
-      actionpack (= 6.0.1)
-      activerecord (= 6.0.1)
-      activestorage (= 6.0.1)
-      activesupport (= 6.0.1)
+    actionpack-page_caching (1.2.0)
+      actionpack (>= 5.0.0)
+    actiontext (6.0.2)
+      actionpack (= 6.0.2)
+      activerecord (= 6.0.2)
+      activestorage (= 6.0.2)
+      activesupport (= 6.0.2)
       nokogiri (>= 1.8.5)
-    actionview (6.0.1)
-      activesupport (= 6.0.1)
+    actionview (6.0.2)
+      activesupport (= 6.0.2)
       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.1)
-      activesupport (= 6.0.1)
+    activejob (6.0.2)
+      activesupport (= 6.0.2)
       globalid (>= 0.3.6)
-    activemodel (6.0.1)
-      activesupport (= 6.0.1)
-    activerecord (6.0.1)
-      activemodel (= 6.0.1)
-      activesupport (= 6.0.1)
+    activemodel (6.0.2)
+      activesupport (= 6.0.2)
+    activerecord (6.0.2)
+      activemodel (= 6.0.2)
+      activesupport (= 6.0.2)
     activerecord-import (1.0.3)
       activerecord (>= 3.2)
-    activestorage (6.0.1)
-      actionpack (= 6.0.1)
-      activejob (= 6.0.1)
-      activerecord (= 6.0.1)
+    activestorage (6.0.2)
+      actionpack (= 6.0.2)
+      activejob (= 6.0.2)
+      activerecord (= 6.0.2)
       marcel (~> 0.3.1)
-    activesupport (6.0.1)
+    activesupport (6.0.2)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 0.7, < 2)
       minitest (~> 5.1)
@@ -72,13 +74,13 @@ GEM
     autoprefixer-rails (9.7.3)
       execjs
     aws-eventstream (1.0.3)
-    aws-partitions (1.251.0)
-    aws-sdk-core (3.84.0)
+    aws-partitions (1.254.0)
+    aws-sdk-core (3.85.1)
       aws-eventstream (~> 1.0, >= 1.0.2)
       aws-partitions (~> 1, >= 1.239.0)
       aws-sigv4 (~> 1.1)
       jmespath (~> 1.0)
-    aws-sdk-kms (1.26.0)
+    aws-sdk-kms (1.27.0)
       aws-sdk-core (~> 3, >= 3.71.0)
       aws-sigv4 (~> 1.1)
     aws-sdk-s3 (1.59.0)
@@ -109,7 +111,7 @@ GEM
       popper_js (>= 1.14.3, < 2)
       sassc-rails (>= 2.0.0)
     browser (2.7.1)
-    builder (3.2.3)
+    builder (3.2.4)
     bzip2-ffi (1.0.0)
       ffi (~> 1.0)
     cancancan (3.0.1)
@@ -238,7 +240,7 @@ GEM
       rails-dom-testing (>= 1, < 3)
       railties (>= 4.2.0)
       thor (>= 0.14, < 2.0)
-    json (2.2.0)
+    json (2.3.0)
     jwt (2.2.1)
     kgio (2.11.2)
     kramdown (2.1.0)
@@ -312,8 +314,6 @@ GEM
     omniauth-windowslive (0.0.12)
       multi_json (~> 1.12)
       omniauth-oauth2 (~> 1.4)
-    openstreetmap-actionpack-page_caching (1.1.2)
-      actionpack (>= 5.0.0)
     openstreetmap-deadlock_retry (1.3.0)
     parallel (1.19.1)
     parser (2.6.5.0)
@@ -339,20 +339,20 @@ GEM
     rack-test (1.1.0)
       rack (>= 1.0, < 3)
     rack-uri_sanitizer (0.0.2)
-    rails (6.0.1)
-      actioncable (= 6.0.1)
-      actionmailbox (= 6.0.1)
-      actionmailer (= 6.0.1)
-      actionpack (= 6.0.1)
-      actiontext (= 6.0.1)
-      actionview (= 6.0.1)
-      activejob (= 6.0.1)
-      activemodel (= 6.0.1)
-      activerecord (= 6.0.1)
-      activestorage (= 6.0.1)
-      activesupport (= 6.0.1)
+    rails (6.0.2)
+      actioncable (= 6.0.2)
+      actionmailbox (= 6.0.2)
+      actionmailer (= 6.0.2)
+      actionpack (= 6.0.2)
+      actiontext (= 6.0.2)
+      actionview (= 6.0.2)
+      activejob (= 6.0.2)
+      activemodel (= 6.0.2)
+      activerecord (= 6.0.2)
+      activestorage (= 6.0.2)
+      activesupport (= 6.0.2)
       bundler (>= 1.3.0)
-      railties (= 6.0.1)
+      railties (= 6.0.2)
       sprockets-rails (>= 2.0.0)
     rails-controller-testing (1.0.4)
       actionpack (>= 5.0.1.x)
@@ -366,9 +366,9 @@ GEM
     rails-i18n (4.0.2)
       i18n (~> 0.6)
       rails (>= 4.0)
-    railties (6.0.1)
-      actionpack (= 6.0.1)
-      activesupport (= 6.0.1)
+    railties (6.0.2)
+      actionpack (= 6.0.2)
+      activesupport (= 6.0.2)
       method_source
       rake (>= 0.8.7)
       thor (>= 0.20.3, < 2.0)
@@ -461,6 +461,7 @@ PLATFORMS
 DEPENDENCIES
   SystemTimer (>= 1.1.3)
   aasm
+  actionpack-page_caching (>= 1.2.0)
   active_record_union
   activerecord-import
   annotate
@@ -512,7 +513,6 @@ DEPENDENCIES
   omniauth-mediawiki (>= 0.0.4)
   omniauth-openid
   omniauth-windowslive
-  openstreetmap-actionpack-page_caching (>= 1.1.2)
   openstreetmap-deadlock_retry (>= 1.3.0)
   pg
   poltergeist
@@ -522,7 +522,7 @@ DEPENDENCIES
   r2 (~> 0.2.7)
   rack-cors
   rack-uri_sanitizer
-  rails (= 6.0.1)
+  rails (= 6.0.2)
   rails-controller-testing
   rails-i18n (~> 4.0.0)
   rinku (>= 2.0.6)
index 6031526f4be0f2e3a474f7fe2429e215034c1a42..6e73da63b31d0df9b7e7b6e18b0bee2d51948767 100644 (file)
@@ -186,8 +186,8 @@ a {
 
 hr {
   border: none;
-  background-color: #ccc;
-  color: #ccc;
+  background-color: $grey;
+  color: $grey;
   height: 1px;
 }
 
@@ -213,7 +213,7 @@ table {
 /* Utility for de-emphasizing content */
 
 .deemphasize {
-  color: #999;
+  color: $darkgrey;
   a {
     color: $blue;
   }
@@ -321,11 +321,11 @@ nav.primary {
   }
 
   .disabled a {
-    color: #ccc;
+    color: $grey;
     cursor: default;
 
     .caret {
-      border-top-color: #ccc;
+      border-top-color: $grey;
     }
   }
 
@@ -496,7 +496,7 @@ body.compact {
   }
 
   &.active {
-    background-color: #9ed485;
+    background-color: $vibrant-green;
   }
 
   .icon {
@@ -683,7 +683,7 @@ body.compact {
     overflow: auto;
 
     .section {
-      border-bottom: 1px solid #DDD;
+      border-bottom: 1px solid $grey;
       padding: 10px 20px;
     }
 
@@ -693,14 +693,14 @@ body.compact {
       font-size:20px;
       line-height:10px;
       color:#222;
-      border:1px solid #ddd;
+      border:1px solid $grey;
     }
 
     .tooltip {
       opacity: 1;
-      border: 1px solid #ccc;
+      border: 1px solid $grey;
       .tooltip-arrow {
-        border-top-color: #ccc;
+        border-top-color: $grey;
       }
     }
   }
@@ -759,7 +759,7 @@ body.compact {
       font-size: 13px;
       margin-bottom: 8px;
     }
-    li.disabled { color: #999; }
+    li.disabled { color: $darkgrey; }
   }
 }
 
@@ -863,7 +863,7 @@ body.compact {
   position: relative;
   padding: $lineheight/2 $lineheight;
   // background: $offwhite;
-  // border-bottom: 1px solid #ccc;
+  // border-bottom: 1px solid $grey;
   > .close {
     float: right;
     margin-top: 2px;
@@ -930,7 +930,7 @@ header .search_forms,
 
   input:focus {
     outline: none;
-    box-shadow: 0px 0px 7px #9ED485;
+    box-shadow: 0px 0px 7px $vibrant-green;
   }
 
   input[type=submit].float {
@@ -1076,10 +1076,10 @@ p#routing_summary {
 td.instruction, td.distance {
     padding-top: $lineheight/5;
     padding-bottom: $lineheight/5;
-    border-bottom: 1px solid #DDD;
+    border-bottom: 1px solid $grey;
 }
 td.distance {
-    color: #BBB;
+    color: $darkgrey;
     text-align: right;
     font-size: x-small;
 }
@@ -1110,7 +1110,7 @@ tr.turn:hover {
 #sidebar .changesets {
   li {
     padding: 15px 20px;
-    border-bottom: 1px solid #ddd;
+    border-bottom: 1px solid $grey;
     cursor: pointer;
 
     &.selected { background: $list-highlight; }
@@ -1126,7 +1126,7 @@ tr.turn:hover {
 
   .comments {
     float: right;
-    color: #999;
+    color: $darkgrey;
   }
 
   .comments-0 {
@@ -1144,7 +1144,7 @@ tr.turn:hover {
 #sidebar_content {
   .browse-section {
     padding: $lineheight/2 $lineheight;
-    border-bottom: 1px solid #ddd;
+    border-bottom: 1px solid $grey;
 
     h4:first-child {
       margin-top: 0;
@@ -1159,7 +1159,7 @@ tr.turn:hover {
   .paginate {
     float: right;
     padding: 1px 6px;
-    border: 1px solid #eee;
+    border: 1px solid $lightgrey;
     border-radius: 3px;
   }
 
@@ -1173,7 +1173,7 @@ tr.turn:hover {
     h4 {
       padding: 5px 0 5px 10px;
       font-size: 12px;
-      border: 1px solid #CCC;
+      border: 1px solid $grey;
       border-radius: 4px 4px 0 0;
       background-color: #F6F6F6;
     }
@@ -1182,7 +1182,7 @@ tr.turn:hover {
       padding: 7px 10px;
       font-size: 12px;
       background-color: #FFF;
-      border: 1px solid #CCC;
+      border: 1px solid $grey;
       border-top: 0;
       border-radius: 0 0 4px 4px;
     }
@@ -1190,14 +1190,14 @@ tr.turn:hover {
 
   .browse-tag-list {
     background-color: #F6F6F6;
-    border: 1px solid #ddd;
+    border: 1px solid $grey;
     border-radius: 3px;
     font-size: 12px;
     table-layout: fixed;
     border-collapse: separate;
 
     th, td {
-      border-bottom: 1px solid #ddd;
+      border-bottom: 1px solid $grey;
     }
 
     tr:last-child th, tr:last-child td {
@@ -1218,7 +1218,7 @@ tr.turn:hover {
     }
 
     .browse-tag-v {
-      border-left: 1px solid #ddd;
+      border-left: 1px solid $grey;
       background-color: #fff;
     }
 
@@ -1287,7 +1287,7 @@ tr.turn:hover {
     ul {
       li {
         padding: 15px 20px;
-        border-bottom: 1px solid #ddd;
+        border-bottom: 1px solid $grey;
 
         &.query-result {
           cursor: pointer;
@@ -1321,8 +1321,8 @@ tr.turn:hover {
   }
 
   .export_boxy {
-    background: #eee;
-    border: 1px solid #ccc;
+    background: $lightgrey;
+    border: 1px solid $grey;
     border-radius: 3px;
 
     #maxlat { margin-top: -1px; }
@@ -1479,7 +1479,7 @@ tr.turn:hover {
   position: relative;
   width: 45%;
   height: 400px;
-  border: 1px solid #ccc;
+  border: 1px solid $grey;
   margin-bottom: $lineheight;
   float: right;
 }
@@ -1581,7 +1581,7 @@ tr.turn:hover {
 
 .activity-block {
   clear: left;
-  border-bottom: 1px solid #ccc;
+  border-bottom: 1px solid $grey;
   padding-bottom: $lineheight;
   float: left;
   h3 {
@@ -1666,7 +1666,7 @@ tr.turn:hover {
   position: relative;
   padding-top: $lineheight;
   padding-bottom: $lineheight/2;
-  border-top: 1px solid #ccc;
+  border-top: 1px solid $grey;
 
   &:first-of-type {
     margin-top: $lineheight/2;
@@ -1707,12 +1707,12 @@ tr.turn:hover {
     position: relative;
     width: 90%;
     height: 400px;
-    border: 1px solid #ccc;
+    border: 1px solid $grey;
     display: none;
     margin-bottom: $lineheight;
   }
   #newcomment {
-    border-top: 1px solid #ccc;
+    border-top: 1px solid $grey;
     padding-top: $lineheight;
     margin-top: $lineheight/2;
   }
@@ -1720,13 +1720,13 @@ tr.turn:hover {
     max-width: 740px;
   }
   .diary-comment {
-    border-top: 1px dashed #ccc;
+    border-top: 1px dashed $grey;
     padding-top: $lineheight/2;
     padding-bottom: $lineheight/2;
     &:first-child {
       margin-top: $lineheight/2;
       padding-top: $lineheight;
-      border-top: 1px solid #ccc;
+      border-top: 1px solid $grey;
     }
     &.deemphasize {
       background-color: #fee;
@@ -1767,7 +1767,7 @@ tr.turn:hover {
 
 .users-terms {
   .legale {
-    border: 1px solid #ccc;
+    border: 1px solid $grey;
     padding: $lineheight;
     margin-bottom: $lineheight;
     overflow: auto;
@@ -1796,7 +1796,7 @@ tr.turn:hover {
   position: relative;
   width: 500px;
   height: 400px;
-  border: 1px solid #ccc;
+  border: 1px solid $grey;
 }
 
 #accountForm .user_image {
@@ -1848,17 +1848,17 @@ tr.turn:hover {
 
 .messages {
   width: 100%;
-  border: 1px solid #ddd;
+  border: 1px solid $grey;
 
   input[type="submit"] {
     margin: auto;
   }
   tbody tr {
-    border-top: 1px solid #ccc;
+    border-top: 1px solid $grey;
   }
 
   .inbox-row {
-    background: #f8f8ff;
+    background: $offwhite;
   }
 
   .inbox-row-unread {
@@ -1893,7 +1893,7 @@ tr.turn:hover {
 .info-line {
   margin-bottom: $lineheight;
   padding: $lineheight/4 0px 4px 0px;
-  border-bottom: 1px solid #ccc;
+  border-bottom: 1px solid $grey;
 
   form, form div {
     display: inline;
@@ -2082,7 +2082,7 @@ input[type="password"],
 textarea {
   color: #222;
   background-color: #fff;
-  border: 1px solid #ccc;
+  border: 1px solid $grey;
   padding: 2px 5px;
   margin: 0;
   width: 200px;
@@ -2102,7 +2102,7 @@ textarea {
 img.user_image {
   max-width: 100px;
   max-height: 100px;
-  border: 1px solid #ccc;
+  border: 1px solid $grey;
   margin-bottom: $lineheight;
   float: left;
   margin-right: $lineheight;
@@ -2111,7 +2111,7 @@ img.user_image {
 img.user_thumbnail {
   max-width: 50px;
   max-height: 50px;
-  border: 1px solid #ccc;
+  border: 1px solid $grey;
   margin-right: $lineheight;
 }
 
@@ -2120,7 +2120,7 @@ img.user_thumbnail_tiny {
   height: auto;
   max-width: 25px;
   max-height: 25px;
-  border: 1px solid #ccc;
+  border: 1px solid $grey;
 }
 
 /* Rules for geo microformats */
@@ -2150,7 +2150,7 @@ ul.secondary-actions {
     display: block;
     float: left;
     list-style: none;
-    border-left: 1px solid #ccc;
+    border-left: 1px solid $grey;
     padding-left: $lineheight/2;
     margin-right: $lineheight/2;
     &:first-child {
@@ -2307,7 +2307,7 @@ a.button {
 .prose {
   h1, h2 {
     padding-bottom: $lineheight/2;
-    border-bottom: 1px dashed #cccccc;
+    border-bottom: 1px dashed $grey;
     margin-bottom: $lineheight/2;
   }
 
@@ -2325,13 +2325,13 @@ a.button {
 
   code {
     font-size: 13px;
-    background: #e8e8e8;
+    background: $lightgrey;
     padding: 2px 3px;
   }
 
   pre {
     font-size: 13px;
-    background: #e8e8e8;
+    background: $lightgrey;
     padding: 2px 3px;
     white-space: pre-wrap;
 
@@ -2352,7 +2352,7 @@ a.button {
     border-left: $lineheight solid $offwhite;
     padding-left: $lineheight;
     margin: 0;
-    color: #7E7E7E;
+    color: $darkgrey;
   }
 
   ul, ol {
@@ -2425,7 +2425,7 @@ input.richtext_title[type="text"] {
     display: inline-block;
     vertical-align: top;
     margin-left: 15px;
-    background-color: #f8f8ff;
+    background-color: $offwhite;
     padding: $lineheight/2;
     width: 220px;
 
@@ -2434,7 +2434,7 @@ input.richtext_title[type="text"] {
     }
 
     h4.heading, li {
-      border-bottom: 1px solid #ccc;
+      border-bottom: 1px solid $grey;
       margin-bottom: $lineheight/4;
       padding-bottom: $lineheight/4;
     }
@@ -2463,7 +2463,7 @@ input.richtext_title[type="text"] {
 
 .note_list {
   tr.creator {
-    background-color: #eeeeee;
+    background-color: $lightgrey;
   }
 
   td {
@@ -2525,7 +2525,7 @@ input.richtext_title[type="text"] {
   margin: 0;
   list-style: none;
   background-color: #ffffff;
-  border: 1px solid #ccc;
+  border: 1px solid $grey;
   border-radius: 0 3px 3px;
   *border-right-width: 2px;
   *border-bottom-width: 2px;
@@ -2544,7 +2544,7 @@ input.richtext_title[type="text"] {
   margin: 9px 1px;
   *margin: -5px 0 5px;
   overflow: hidden;
-  background-color: #e5e5e5;
+  background-color: $lightgrey;
   border-bottom: 1px solid #ffffff;
 }
 
@@ -2579,7 +2579,7 @@ input.richtext_title[type="text"] {
 .dropdown-menu > .disabled > a,
 .dropdown-menu > .disabled > a:hover,
 .dropdown-menu > .disabled > a:focus {
-  color: #999999;
+  color: $darkgrey;
 }
 
 .dropdown-menu > .disabled > a:hover,
@@ -2692,8 +2692,7 @@ input.richtext_title[type="text"] {
 }
 
 .site-about #content {
-  //background-color: #000;
-  background-color: #eee;
+  background-color: $lightgrey;
   background-position: 50% 50%;
   background-repeat: no-repeat;
   background-size: cover;
@@ -2707,7 +2706,7 @@ input.richtext_title[type="text"] {
     right: 20px;
     bottom: 60px;
     text-shadow: #000 0px 1px 5px;
-    color: #eee;
+    color: $lightgrey;
     opacity: 0.8;
     display: none;
   }
@@ -2767,7 +2766,7 @@ input.richtext_title[type="text"] {
       font-weight: 300;
       font-size: 34px;
       span {
-        color: #76c551;
+        color: $vibrant-green;
       }
     }
 
@@ -2781,7 +2780,7 @@ input.richtext_title[type="text"] {
       background-repeat: no-repeat;
       background-image: image-url('about/osm.png');
       background-size: cover;
-      background-color: #76c551;
+      background-color: $vibrant-green;
     }
 
     .byosm {
@@ -2795,7 +2794,7 @@ input.richtext_title[type="text"] {
       font: 500 20px/24px Helvetica, Arial, sans-serif;
       white-space: nowrap;
       color: #fff;
-      background: #76c551;
+      background: $vibrant-green;
     }
 
     .byosm span {
@@ -2852,7 +2851,7 @@ input.richtext_title[type="text"] {
 }
 
 .read-reports {
-  background: #eee;
+  background: $lightgrey;
   opacity: 0.7;
 }
 
index 1cae5ba2f557df0ee0236ab58063e4cd7c51cd4f..90fbd74b7d035c65530e1f66dd15427d5f751bc4 100644 (file)
@@ -2,10 +2,11 @@
 $lineheight: 20px;
 $typeheight: 14px;
 
-$offwhite: #f4f4ff;
+$offwhite: #f8f8ff;
 $blue: #7092FF;
 $lightblue: #B8C5F0;
 $green: #7ebc6f;
+$vibrant-green: #76c551;
 $grey: #CCC;
 $red: red;
 $lightgrey: #EEE;
index 4dbc16fd287dd7a88f2f90703ecbdb19e4d7e53a..db8982d43278237df950f2889b5078b84aef69f2 100644 (file)
@@ -906,21 +906,21 @@ module Api
     # Alternative SQL queries for getway/whichways
 
     def sql_find_ways_in_area(bbox)
-      sql = <<-SQL
-      SELECT DISTINCT current_ways.id AS wayid,current_ways.version AS version
-        FROM current_way_nodes
-      INNER JOIN current_nodes ON current_nodes.id=current_way_nodes.node_id
-      INNER JOIN current_ways  ON current_ways.id =current_way_nodes.id
-         WHERE current_nodes.visible=TRUE
-         AND current_ways.visible=TRUE
-         AND #{OSM.sql_for_area(bbox, 'current_nodes.')}
+      sql = <<~SQL
+        SELECT DISTINCT current_ways.id AS wayid,current_ways.version AS version
+          FROM current_way_nodes
+        INNER JOIN current_nodes ON current_nodes.id=current_way_nodes.node_id
+        INNER JOIN current_ways  ON current_ways.id =current_way_nodes.id
+           WHERE current_nodes.visible=TRUE
+           AND current_ways.visible=TRUE
+           AND #{OSM.sql_for_area(bbox, 'current_nodes.')}
       SQL
       ActiveRecord::Base.connection.select_all(sql).collect { |a| [a["wayid"].to_i, a["version"].to_i] }
     end
 
     def sql_find_pois_in_area(bbox)
       pois = []
-      sql = <<-SQL
+      sql = <<~SQL
         SELECT current_nodes.id,current_nodes.latitude*0.0000001 AS lat,current_nodes.longitude*0.0000001 AS lon,current_nodes.version
         FROM current_nodes
          LEFT OUTER JOIN current_way_nodes cwn ON cwn.node_id=current_nodes.id
@@ -941,7 +941,7 @@ module Api
     def sql_find_relations_in_area_and_ways(bbox, way_ids)
       # ** It would be more Potlatchy to get relations for nodes within ways
       #    during 'getway', not here
-      sql = <<-SQL
+      sql = <<~SQL
         SELECT DISTINCT cr.id AS relid,cr.version AS version
         FROM current_relations cr
         INNER JOIN current_relation_members crm ON crm.id=cr.id
@@ -949,13 +949,13 @@ module Api
          WHERE #{OSM.sql_for_area(bbox, 'cn.')}
       SQL
       unless way_ids.empty?
-        sql += <<-SQL
-         UNION
-          SELECT DISTINCT cr.id AS relid,cr.version AS version
-          FROM current_relations cr
-          INNER JOIN current_relation_members crm ON crm.id=cr.id
-           WHERE crm.member_type='Way'
-           AND crm.member_id IN (#{way_ids.join(',')})
+        sql += <<~SQL
+          UNION
+           SELECT DISTINCT cr.id AS relid,cr.version AS version
+           FROM current_relations cr
+           INNER JOIN current_relation_members crm ON crm.id=cr.id
+            WHERE crm.member_type='Way'
+            AND crm.member_id IN (#{way_ids.join(',')})
         SQL
       end
       ActiveRecord::Base.connection.select_all(sql).collect { |a| [a["relid"].to_i, a["version"].to_i] }
@@ -963,7 +963,7 @@ module Api
 
     def sql_get_nodes_in_way(wayid)
       points = []
-      sql = <<-SQL
+      sql = <<~SQL
         SELECT latitude*0.0000001 AS lat,longitude*0.0000001 AS lon,current_nodes.id,current_nodes.version
         FROM current_way_nodes,current_nodes
          WHERE current_way_nodes.id=#{wayid.to_i}
index 57ac075010fd837609a4170ab96883c78ff83c3d..3a69eed120e1299ed90287c2f15ae96cb0515823 100644 (file)
@@ -77,26 +77,30 @@ class SiteController < ApplicationController
       )
     end
 
-    if params[:node]
-      bbox = Node.find(params[:node]).bbox.to_unscaled
-      @lat = bbox.centre_lat
-      @lon = bbox.centre_lon
-      @zoom = 18
-    elsif params[:way]
-      bbox = Way.find(params[:way]).bbox.to_unscaled
-      @lat = bbox.centre_lat
-      @lon = bbox.centre_lon
-      @zoom = 17
-    elsif params[:note]
-      note = Note.find(params[:note])
-      @lat = note.lat
-      @lon = note.lon
-      @zoom = 17
-    elsif params[:gpx] && current_user
-      trace = Trace.visible_to(current_user).find(params[:gpx])
-      @lat = trace.latitude
-      @lon = trace.longitude
-      @zoom = 16
+    begin
+      if params[:node]
+        bbox = Node.visible.find(params[:node]).bbox.to_unscaled
+        @lat = bbox.centre_lat
+        @lon = bbox.centre_lon
+        @zoom = 18
+      elsif params[:way]
+        bbox = Way.visible.find(params[:way]).bbox.to_unscaled
+        @lat = bbox.centre_lat
+        @lon = bbox.centre_lon
+        @zoom = 17
+      elsif params[:note]
+        note = Note.visible.find(params[:note])
+        @lat = note.lat
+        @lon = note.lon
+        @zoom = 17
+      elsif params[:gpx] && current_user
+        trace = Trace.visible_to(current_user).find(params[:gpx])
+        @lat = trace.latitude
+        @lon = trace.longitude
+        @zoom = 16
+      end
+    rescue ActiveRecord::RecordNotFound
+      # don't try and derive a location from a missing/deleted object
     end
   end
 
index 6099823897473a04ab83a12e6ff90ef4fcb1e40f..518cb94ccf29a81223671520c23dd09d5c467d1d 100644 (file)
@@ -46,8 +46,6 @@
 class User < ApplicationRecord
   require "xml/libxml"
 
-  self.ignored_columns = ["nearby"]
-
   has_many :traces, -> { where(:visible => true) }
   has_many :diary_entries, -> { order(:created_at => :desc) }
   has_many :diary_comments, -> { order(:created_at => :desc) }
index f68dfbe2eae5bfc2a8bd1cbb5778214604075d0f..2389598bcb61b3612984d26d98d66908de9a3430 100644 (file)
@@ -12,7 +12,7 @@
   </div>
 
   <div class="details" data-coordinates="<%= @note.lat %>,<%= @note.lon %>" data-status="<%= @note.status %>">
-    <%= note_event("open", @note.created_at, @note.author) %>
+    <%= note_event("opened", @note.created_at, @note.author) %>
     <% if @note.status == "closed" %>
       <br />
       <%= note_event(@note.status, @note.closed_at, @note_comments.last.author) %>
index 56dba30b875d81d9f37eab7654c323167ee61ae9..00045efc08f992058930b2d18417c29fcc232b16 100644 (file)
@@ -3,11 +3,13 @@
 <% end %>
 
 <table class="messages" width="100%">
-  <tr>
-    <th width="25%"><%= t ".post" %></th>
-    <th width="25%"><%= t ".when" %></th>
-    <th width="50%"><%= t ".comment" %></th>
-  </tr>
+  <thead>
+    <tr>
+      <th width="25%"><%= t ".post" %></th>
+      <th width="25%"><%= t ".when" %></th>
+      <th width="50%"><%= t ".comment" %></th>
+    </tr>
+  </thead>
   <% @comments.each do |comment| -%>
   <% cl = cycle("table0", "table1") %>
   <tr class="<%= cl %><%= " deemphasize" unless comment.visible? %>">
index c7015578b24ed575ba913cfad7cd4567f990c755..266349b30ab9f5d8c916f0993746529b12bd59e4 100644 (file)
@@ -6,14 +6,16 @@
 <%= render :partial => "notes_paging_nav" %>
 
 <table class="note_list">
-  <tr>
-    <th></th>
-    <th><%= t ".id" %></th>
-    <th><%= t ".creator" %></th>
-    <th><%= t ".description" %></th>
-    <th><%= t ".created_at" %></th>
-    <th><%= t ".last_changed" %></th>
-  </tr>
+  <thead>
+    <tr>
+      <th></th>
+      <th><%= t ".id" %></th>
+      <th><%= t ".creator" %></th>
+      <th><%= t ".description" %></th>
+      <th><%= t ".created_at" %></th>
+      <th><%= t ".last_changed" %></th>
+    </tr>
+  </thead>
 <% @notes.each do |note| -%>
   <tr<% if note.author == @user %> class="creator"<% end %>>
     <td>
index f1dc4afcd67e829e5c75ca8a5d37010d695ff995..54bb4f9f6f4133d17341adc6f0751f7810fe30ab 100644 (file)
@@ -6,11 +6,13 @@
 <h3><%= t ".my_tokens" %></h3>
 <p><%= t ".list_tokens" %></p>
 <table>
-  <tr>
-    <th><%= t ".application" %></th>
-    <th><%= t ".issued_at" %></th>
-    <th>&nbsp;</th>
-  </tr>
+  <thead>
+    <tr>
+      <th><%= t ".application" %></th>
+      <th><%= t ".issued_at" %></th>
+      <th>&nbsp;</th>
+    </tr>
+  </thead>
   <% @tokens.each do |token| %>
     <tr>
       <td><%= link_to token.client_application.name, token.client_application.url %></td>
index cfc28f0246d3297d157553e04ebc7aa02514fdd9..1dba95e5db5108942a83bdc88c53cd9bdf0378d4 100644 (file)
@@ -5,7 +5,7 @@
     <p><%= t "layouts.osm_read_only" %></p>
   <% elsif !current_user.data_public? %>
     <p><%= t ".not_public" %></p>
-    <p><%= raw t ".not_public_description", :user_page => (link_to t(".user_page_link"), :controller => "user", :action => "account", :display_name => current_user.display_name, :anchor => "public") %></p>
+    <p><%= raw t ".not_public_description", :user_page => (link_to t(".user_page_link"), :controller => "users", :action => "account", :display_name => current_user.display_name, :anchor => "public") %></p>
     <p><%= raw t "site.edit.anon_edits", :link => link_to(t(".anon_edits_link_text"), t(".anon_edits_link")) %></p>
   <% else %>
     <%= render :partial => preferred_editor %>
index 2f7f54a19a2638eb4c017f55f3a1b62c060559de..03ee7ae8e0163f61b1374b602c02a3dd373e080b 100644 (file)
@@ -1,20 +1,22 @@
 <table id="block_list" cellpadding="3">
-  <tr>
-    <% if show_user_name %>
-    <th><%= t ".display_name" %></th>
-    <% end %>
-    <% if show_creator_name %>
-    <th><%= t ".creator_name" %></th>
-    <% end %>
-    <th><%= t ".reason" %></th>
-    <th><%= t ".status" %></th>
-    <th><%= t ".revoker_name" %></th>
-    <th></th>
-    <th></th>
-    <% if show_revoke_link %>
-    <th></th>
-    <% end %>
-  </tr>
+  <thead>
+    <tr>
+      <% if show_user_name %>
+      <th><%= t ".display_name" %></th>
+      <% end %>
+      <% if show_creator_name %>
+      <th><%= t ".creator_name" %></th>
+      <% end %>
+      <th><%= t ".reason" %></th>
+      <th><%= t ".status" %></th>
+      <th><%= t ".revoker_name" %></th>
+      <th></th>
+      <th></th>
+      <% if show_revoke_link %>
+      <th></th>
+      <% end %>
+    </tr>
+  </thead>
   <%= render :partial => "block", :locals => { :show_revoke_link => show_revoke_link, :show_user_name => show_user_name, :show_creator_name => show_creator_name }, :collection => @user_blocks %>
 </table>
 
index f1ef5b5380f4460e84b31676b97a3b444c740bf6..01b7c60aa11bbbae82a013d8f7ae1a63c4b30fb6 100644 (file)
     <%= hidden_field_tag :ip, params[:ip] if params[:ip] %>
     <%= hidden_field_tag :page, params[:page] if params[:page] %>
     <table id="user_list">
-      <tr>
-        <td colspan="2">
-          <%= t ".showing",
-                :page => @user_pages.current_page.number,
-                :first_item => @user_pages.current_page.first_item,
-                :last_item => @user_pages.current_page.last_item,
-                :items => @user_pages.item_count,
-                :count => @user_pages.current_page.last_item - @user_pages.current_page.first_item + 1 %>
-          <% if @user_pages.page_count > 1 %>
-          | <%= raw pagination_links_each(@user_pages, {}) { |n| link_to n, @params.merge(:page => n) } %>
-          <% end %>
-        </td>
-        <td>
-          <%= check_box_tag "user_all", "1", false %>
-        </td>
-      </tr>
+      <thead>
+        <tr>
+          <td colspan="2">
+            <%= t ".showing",
+                  :page => @user_pages.current_page.number,
+                  :first_item => @user_pages.current_page.first_item,
+                  :last_item => @user_pages.current_page.last_item,
+                  :items => @user_pages.item_count,
+                  :count => @user_pages.current_page.last_item - @user_pages.current_page.first_item + 1 %>
+            <% if @user_pages.page_count > 1 %>
+            | <%= raw pagination_links_each(@user_pages, {}) { |n| link_to n, @params.merge(:page => n) } %>
+            <% end %>
+          </td>
+          <td>
+            <%= check_box_tag "user_all", "1", false %>
+          </td>
+        </tr>
+      </thead>
       <%= render @users %>
     </table>
 
index 6e09300170d239d2fbc9171d90ffca06cc2d265d..266e41cbb98d501435ba985efbdba9af475c8d63 100644 (file)
@@ -42,6 +42,12 @@ I18n.fallbacks.map("no" => "nb")
 
 I18n.enforce_available_locales = false
 
+if Rails.env.test?
+  I18n.exception_handler = proc do |exception|
+    raise exception.to_exception
+  end
+end
+
 Rails.configuration.after_initialize do
   I18n.available_locales
 end
index 917c06a954de363ac0252424575fc8208b6fa87d..b99e068b879bfea7f615a9cc9a8548594f8afd76 100644 (file)
@@ -288,8 +288,8 @@ en:
       open_title: "Unresolved note #%{note_name}"
       closed_title: "Resolved note #%{note_name}"
       hidden_title: "Hidden note #%{note_name}"
-      open_by: "Created by %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
-      open_by_anonymous: "Created by anonymous <abbr title='%{exact_time}'>%{when}</abbr>"
+      opened_by: "Created by %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
+      opened_by_anonymous: "Created by anonymous <abbr title='%{exact_time}'>%{when}</abbr>"
       commented_by: "Comment from %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
       commented_by_anonymous: "Comment from anonymous <abbr title='%{exact_time}'>%{when}</abbr>"
       closed_by: "Resolved by %{user} <abbr title='%{exact_time}'>%{when}</abbr>"
@@ -1882,7 +1882,7 @@ en:
       upload_trace: "Upload a trace"
       see_all_traces: "See all traces"
       see_my_traces: "See my traces"
-    delete:
+    destroy:
       scheduled_for_deletion: "Trace scheduled for deletion"
     make_public:
       made_public: "Trace made public"
index 22a4584c788621cbdfa6f603c07f0919093404b5..f7be862235833564bc77c114925797a32fbafd88 100644 (file)
@@ -2454,9 +2454,9 @@ eo:
       revoke: Malbloki!
       flash: Ĉi tiu blokado estas nuligita.
     helper:
-      time_future: Finiĝos %{time}.
+      time_future: Finiĝos post %{time}.
       until_login: Aktiva ĝis la uzanto ensalutos.
-      time_future_and_until_login: Finiĝos dum %{time} kaj post la uzanto ensalutos.
+      time_future_and_until_login: Finiĝos post %{time} kaj post la uzanto ensalutos.
       time_past: Finiĝis %{time}.
       block_duration:
         hours:
index 69cd1cefbcb3ef05aefd0b329071078c3c71d948..ac57406644afb3c61c238314f832cfea7617585d 100644 (file)
@@ -339,6 +339,7 @@ es:
         tag: La página en el wiki con la descripción de la etiqueta %{key}=%{value}
       wikidata_link: El elemento %{page} en Wikidata
       wikipedia_link: El artículo %{page} en Wikipedia
+      wikimedia_commons_link: El item %{page} en Wikipedia Commons
       telephone_link: Llamar al %{phone_number}
       colour_preview: Vista previa del color %{colour_value}
     note:
@@ -1693,7 +1694,7 @@ es:
         temas de cartografía.
       welcome:
         url: /welcome
-        title: Le damos la bienvenida a OSM
+        title: Bienvenido a OpenStreetMap
         description: Comenzar con esta guía rápida que cubre lo básico de OpenStreetMap.
       beginners_guide:
         url: https://wiki.openstreetmap.org/wiki/ES:Beginners%27_guide
@@ -1728,7 +1729,7 @@ es:
       wiki:
         url: https://wiki.openstreetmap.org/wiki/ES:Main_Page
         title: Wiki de OpenStreetMap
-        description: Explora el wiki para obtener documentación detallada de OSM.
+        description: Explora el wiki para obtener documentación detallada de OpenStreetMap.
     sidebar:
       search_results: Resultados de la búsqueda
       close: Cerrar
index 7fcd4acc73e749aa96765af9412b72d63e2cb952..42beb3f8cd880a39097cc3e035a4af7b9f4a2f4d 100644 (file)
@@ -1309,7 +1309,7 @@ fa:
           ایجاد کردید، نظر داد
         commented_changeset: ‏%{commenter} برای بستهٔ تغییری که %{changeset_author}
           در %{time} ایجاد کرده و شما مشترک آن هستید، یک نظر نوشت
-        partial_changeset_with_comment: دارای نظر «%{changeset_comment}»
+        partial_changeset_with_comment: 'با این توضیح بستهٔ تغییر: «%{changeset_comment}»'
         partial_changeset_without_comment: بدون توضیح
       details: 'اطلاعات بیشتر دربارهٔ بستهٔ تغییر را می‌توانید اینجا ببینید: %{url}'
       unsubscribe: برای لغو اطلاع‌رسانی‌های مربوط به این بستهٔ تغییر، به %{url} بروید
@@ -1606,7 +1606,7 @@ fa:
           description: دریافت این محدوده از یکی از آینه‌های پایگاه‌دادهٔ OpenStreetMap
         geofabrik:
           title: دانلودهای Geofabrik
-          description: استخراج اطلاعات قاره‌ها، کشورها، و شهرهای منتخب که به‌طور منظم
+          description: گزیدهٔ اطلاعات قاره‌ها، کشورها، و شهرهای منتخب که به‌طور منظم
             روزآمد می‌شود
         metro:
           title: خلاصه های مترو
index 4ad3a0a8707d7cee9580e564cd59236cfcfd3ba9..6c1ce59bd399d39467775577731a138bdd3639d6 100644 (file)
@@ -61,6 +61,7 @@
 # Author: Sherbrooke
 # Author: Syl
 # Author: The RedBurn
+# Author: Thibaut120094
 # Author: Trial
 # Author: Tuxxic
 # Author: Urhixidur
@@ -239,7 +240,7 @@ fr:
       rss:
         title: Notes OpenStreetMap
         description_area: Une liste de notes, signalées, commentées ou fermées dans
-          votre zone [(%{min_lat} ; %{min_lon}) – (%{max_lat} ; %{max_lon})]
+          votre zone [(%{min_lat} ; %{min_lon}) – (%{max_lat} ; %{max_lon})]
         description_item: Un fil RSS pour la note %{id}
         opened: nouvelle note (près de %{place})
         commented: nouveau commentaire (près de %{place})
@@ -405,15 +406,15 @@ fr:
         met trop de temps pour être chargée.
   changeset_comments:
     comment:
-      comment: Nouveau commentaire sur le groupe de modifications nº%{changeset_id}
+      comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
         par %{author}
       commented_at_by_html: Mis à jour le %{when} par %{user}
     comments:
-      comment: Nouveau commentaire sur le groupe de modifications nº%{changeset_id}
+      comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
         par %{author}
     index:
       title_all: Discussion sur le groupe de modifications OpenStreetMap
-      title_particular: Discussion sur le groupe de modifications OpenStreetMap nº%{changeset_id}
+      title_particular: Discussion sur le groupe de modifications OpenStreetMap nº %{changeset_id}
     timeout:
       sorry: Désolé, la liste des commentaires d’ensembles de modifications que vous
         avez demandée est trop longue à récupérer.
@@ -421,12 +422,12 @@ fr:
     new:
       title: Nouvelle entrée du journal
     form:
-      subject: 'Sujet:'
-      body: 'Corps:'
-      language: 'Langue:'
-      location: 'Lieu:'
-      latitude: 'Latitude:'
-      longitude: 'Longitude:'
+      subject: 'Sujet :'
+      body: 'Corps :'
+      language: 'Langue :'
+      location: 'Lieu :'
+      latitude: 'Latitude :'
+      longitude: 'Longitude :'
       use_map_link: utiliser la carte
     index:
       title: Journaux des utilisateurs
@@ -451,7 +452,7 @@ fr:
       login: Se connecter
     no_such_entry:
       title: Aucune entrée du journal correspondante
-      heading: 'Aucune entrée avec l’id: %{id}'
+      heading: 'Aucune entrée avec l’id : %{id}'
       body: Désolé, il n’y a aucune entrée ou commentaire dans le journal avec l’id
         %{id}. Veuillez vérifier votre orthographe ou la validité du lien que vous
         avez cliqué.
@@ -475,7 +476,7 @@ fr:
       confirm: Confirmer
       report: Signaler ce commentaire
     location:
-      location: 'Lieu:'
+      location: 'Lieu :'
       view: Afficher
       edit: Modifier
     feed:
@@ -667,7 +668,7 @@ fr:
           emergency_access_point: Point d’accès d’urgence
           footway: Chemin piéton
           ford: Gué
-          give_way: Panneau « Cédez le passage »
+          give_way: Panneau « Cédez le passage »
           living_street: Rue en zone de rencontre
           milestone: Borne kilométrique
           motorway: Autoroute
@@ -690,7 +691,7 @@ fr:
           services: Services autoroutiers
           speed_camera: Radar de vitesse
           steps: Escalier
-          stop: Panneau « Stop / Arrêt »
+          stop: Panneau « Stop / Arrêt »
           street_lamp: Lampadaire
           tertiary: Route tertiaire
           tertiary_link: Route tertiaire
@@ -1102,7 +1103,7 @@ fr:
       reported_user: Utilisateur signalé
       not_updated: Non mis à jour
       search: Rechercher
-      search_guidance: 'Problèmes de recherche:'
+      search_guidance: 'Problèmes de recherche :'
       user_not_found: L’utilisateur n’existe pas
       issues_not_found: Aucun problème trouvé de ce type
       status: État
@@ -1125,7 +1126,7 @@ fr:
       successful_update: Votre rapport a bien été mis à jour
       provide_details: Veuillez fournir les détails demandés
     show:
-      title: Problème %{status} nº%{issue_id}
+      title: Problème %{status} nº %{issue_id}
       reports:
         zero: Aucun rapport
         one: 1 rapport
@@ -1143,21 +1144,21 @@ fr:
       no_other_issues: Aucun autre problème avec cet utilisateur.
       comments_on_this_issue: Commentaires sur ce problème
     resolve:
-      resolved: L’état du problème a été mis à « Résolu »
+      resolved: L’état du problème a été mis à « Résolu »
     ignore:
-      ignored: L’état du problème a été mis à « Ignoré »
+      ignored: L’état du problème a été mis à « Ignoré »
     reopen:
-      reopened: L’état du problème a été mis à « Ouvert »
+      reopened: L’état du problème a été mis à « Ouvert »
     comments:
       created_at: Le %{datetime}
-      reassign_param: Réaffecter le problème?
+      reassign_param: Réaffecter le problème ?
     reports:
       updated_at: Le %{datetime}
       reported_by_html: Signalé comme %{category} par %{user}
     helper:
       reportable_title:
-        diary_comment: '%{entry_title}, commentaire nº%{comment_id}'
-        note: Note nº%{note_id}
+        diary_comment: '%{entry_title}, commentaire nº %{comment_id}'
+        note: Note nº %{note_id}
   issue_comments:
     create:
       comment_created: Votre commentaire a bien été créé
@@ -1166,13 +1167,13 @@ fr:
       title_html: Rapport %{link}
       missing_params: Impossible de créer un nouveau rapport
       details: Veuillez fournir plus de détails sur le problème (obligatoire).
-      select: 'Sélectionnez un motif pour votre rapport:'
+      select: 'Sélectionnez un motif pour votre rapport :'
       disclaimer:
         intro: 'Avant d’envoyer votre rapport aux modérateurs du site, veuillez vous
-          assurer que:'
-        not_just_mistake: vous êtes certain que le problème n’est pas juste une erreur ;
-        unable_to_fix: vous êtes incapable de régler le problème par vous-même ou
-          avec l’aide des membres de votre proche communauté ;
+          assurer que :'
+        not_just_mistake: Vous êtes certain que le problème n’est pas juste une erreur
+        unable_to_fix: Vous ne pouvez pas régler le problème par vous-même ou avec
+          l’aide des membres de votre proche communauté 
         resolve_with_user: vous avez déjà essayé de résoudre le problème avec l’utilisateur
           concerné.
       categories:
@@ -1222,7 +1223,7 @@ fr:
     user_diaries_tooltip: Voir les journaux d’utilisateurs
     edit_with: Modifier avec %{editor}
     tag_line: La carte wiki libre du monde
-    intro_header: Bienvenue dans OpenStreetMap!
+    intro_header: Bienvenue dans OpenStreetMap !
     intro_text: OpenStreetMap est une carte du monde, créée par des gens comme vous
       et libre d’utilisation sous licence libre.
     intro_2_create_account: Créez un compte d’utilisateur
@@ -1256,44 +1257,44 @@ fr:
         journal'
       hi: Bonjour %{to_user},
       header: '%{from_user} a publié un commentaire sur un article récent du journal
-        OpenStreetMap avec le sujet %{subject}:'
+        OpenStreetMap avec le sujet %{subject} :'
       footer: Vous pouvez également lire le commentaire sur %{readurl}, le commenter
         sur %{commenturl} ou répondre sur %{replyurl}
     message_notification:
       hi: Bonjour %{to_user},
       header: '%{from_user} vous a envoyé un message depuis OpenStreetMap avec le
-        sujet %{subject}:'
+        sujet %{subject} :'
       footer_html: Vous pouvez aussi lire le message à %{readurl} et vous pouvez y
         répondre à %{replyurl}
     friend_notification:
       hi: Bonjour %{to_user},
       subject: '[OpenStreetMap] %{user} vous a ajouté comme ami'
       had_added_you: '%{user} vous a ajouté comme ami dans OpenStreetMap.'
-      see_their_profile: 'Vous pouvez voir son profil ici: %{userurl}.'
-      befriend_them: 'Vous pouvez également l''ajouter comme ami ici: %{befriendurl}.'
+      see_their_profile: 'Vous pouvez voir son profil ici : %{userurl}.'
+      befriend_them: 'Vous pouvez également l''ajouter comme ami ici : %{befriendurl}.'
     gpx_notification:
       greeting: Bonjour,
       your_gpx_file: Il semble que votre fichier GPX
       with_description: avec la description
-      and_the_tags: 'et les mots-clés suivants:'
+      and_the_tags: 'et les mots-clés suivants :'
       and_no_tags: et sans mot-clé.
       failure:
         subject: '[OpenStreetMap] Échec de l’import GPX'
-        failed_to_import: 'n’a pas pu être importé. Voici l’erreur:'
+        failed_to_import: 'n’a pas pu être importé. Voici l’erreur :'
         more_info_1: Plus d’informations sur les échecs d’import GPX et comment les
           éviter
-        more_info_2: 'peuvent être trouvés sur:'
+        more_info_2: 'peuvent être trouvés sur :'
       success:
         subject: '[OpenStreetMap] Import GPX réussi'
         loaded_successfully: s’est chargé correctement avec %{trace_points} des %{possible_points}
           points possibles.
     signup_confirm:
       subject: '[OpenStreetMap] Bienvenue dans OpenStreetMap'
-      greeting: Bonjour!
+      greeting: Bonjour !
       created: Quelqu’un (vous, espérons-le) vient juste de créer un compte sur %{site_url}.
       confirm: 'Avant que nous fassions quoi que ce soit d’autre, nous avons besoin
-        d’une confirmation que cette demande provient bien de vous; si c’est le cas,
-        veuillez cliquer le lien ci-dessous pour confirmer votre compte:'
+        d’une confirmation que cette demande provient bien de vous ; si c’est le cas,
+        veuillez cliquer le lien ci-dessous pour confirmer votre compte :'
       welcome: Une fois votre compte confirmé, nous vous fournirons des informations
         supplémentaires pour bien démarrer.
     email_confirm:
@@ -1366,7 +1367,7 @@ fr:
         partial_changeset_without_comment: sans commentaire
       details: Plus de détails sur l’ensemble de modifications à %{url}.
       unsubscribe: Pour vous désabonner des mises à jour de cet ensemble de modifications,
-        visitez %{url} et cliquez sur « Désabonner ».
+        visitez %{url} et cliquez sur « Désabonner ».
   messages:
     inbox:
       title: Boîte de réception
@@ -1385,7 +1386,7 @@ fr:
       subject: Objet
       date: Date
       no_messages_yet: Vous n’avez actuellement aucun message. Pourquoi ne pas entrer
-        en contact avec quelques %{people_mapping_nearby_link}?
+        en contact avec quelques %{people_mapping_nearby_link} ?
       people_mapping_nearby: personnes qui cartographient aux alentours
     message_summary:
       unread_button: Marquer comme non lu
@@ -1417,11 +1418,11 @@ fr:
       to: À
       subject: Objet
       date: Date
-      no_sent_messages: Vous n’avez encore envoyé aucun message. Pourquoi ne pas entrez
-        en contact avec quelques %{people_mapping_nearby_link} ?
+      no_sent_messages: Vous n’avez pas encore envoyé de message. Pourquoi ne pas
+        entrez en contact avec quelques %{people_mapping_nearby_link} ?
       people_mapping_nearby: personnes proche de vous
     reply:
-      wrong_user: Vous êtes identifié(e) comme « %{user} » mais le message auquel
+      wrong_user: Vous êtes identifié(e) comme « %{user} » mais le message auquel
         vous souhaitez répondre n’a pas été envoyé à cet utilisateur. Veuillez vous
         connecter avec l’identifiant correct pour pouvoir répondre.
     show:
@@ -1434,7 +1435,7 @@ fr:
       destroy_button: Supprimer
       back: Retour
       to: À
-      wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
+      wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
         de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné. Veuillez
         vous connecter avec l’identifiant correct pour pouvoir le lire.
     sent_message_summary:
@@ -1447,7 +1448,7 @@ fr:
   site:
     about:
       next: Suivant
-      copyright_html: ©Contributeurs<br /> d’OpenStreetMap
+      copyright_html: © Contributeurs<br /> d’OpenStreetMap
       used_by: '%{name} fournit des données cartographiques sur des milliers de sites
         web, applications mobiles et appareils'
       lede_text: OpenStreetMap est bâti par une communauté de cartographes bénévoles
@@ -1469,7 +1470,7 @@ fr:
         communautaires</a> et \nle site web de la <a href=\"https://www.osmfoundation.org/\">Fondation
         OSM</a>."
       open_data_title: Données ouvertes
-      open_data_html: 'OpenStreetMap est en <i>données ouvertes</i>: vous êtes libre
+      open_data_html: 'OpenStreetMap est en <i>données ouvertes</i> : vous êtes libre
         de l’utiliser dans n’importe quel but tant que vous créditez OpenStreetMap
         et ses contributeurs. Si vous modifiez ou vous appuyez sur les données d’une
         façon quelconque, vous pouvez distribuer le résultat seulement suivant la
@@ -1516,17 +1517,17 @@ fr:
           la licence <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
           Commons paternité – partage à l’identique 2.0</a> (CC-BY-SA).
         credit_title_html: Comment créditer OpenStreetMap
-        credit_1_html: Nous demandons que votre crédit comporte la mention «© les
-          contributeurs d’OpenStreetMap».
+        credit_1_html: Nous demandons que votre crédit comporte la mention « © les
+          contributeurs d’OpenStreetMap ».
         credit_2_html: |-
           Vous devez également préciser clairement que les données sont disponibles sous la licence
           ODbL (Open Database License) et, si vous utilisez les tuiles de notre carte, que la carte est sous la
           licence CC BY-SA. Vous pouvez mentionner ceci avec un lien hypertexte vers
           <a href="https://www.openstreetmap.org/copyright">cette page de mentions légales</a>.
-          Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en son adresse complète openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org.
+          Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en son adresse complète openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org.
         credit_3_html: |-
           Pour une carte électronique navigable, le crédit devrait apparaître dans un coin de la carte.
-          Par exemple:
+          Par exemple :
         attribution_example:
           alt: Exemple d’attribution d’OpenStreetMap sur une page Internet
           title: Exemple d’attribution
@@ -1544,30 +1545,30 @@ fr:
         contributors_title_html: Nos contributeurs
         contributors_intro_html: 'Nos contributeurs sont des milliers de personnes.
           Nous incluons également des données publiées sous licence ouverte par des
-          agences nationales de cartographie et par d’autres sources, notamment:'
+          agences nationales de cartographie et par d’autres sources, notamment :'
         contributors_at_html: |-
-          <strong>Autriche</strong>: contient des données sur la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous
+          <strong>Autriche</strong> : contient des données sur la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous
           licence <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), la
           <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région du Vorarlberg</a> et la
           région du Tyrol (sous licence <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT avec amendements</a>).
         contributors_au_html: |-
-          <strong>Australie</strong>: contient des données sourcées de
+          <strong>Australie</strong> : contient des données sourcées de
           <a href="https://www.psma.com.au/psma-data-copyright-and-disclaimer">PSMA Australia Limited</a> publiées sous la licence
           <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> accordée par le Commonwealth d’Australie.
-        contributors_ca_html: '<strong>Canada</strong>: contient des données de <em>GeoBase</em>®,
+        contributors_ca_html: '<strong>Canada</strong> : contient des données de <em>GeoBase</em>®,
           <em>GeoGratis</em> (© Département des Ressources naturelles du Canada),
           <em>CanVec</em> (© Département des Ressources naturelles du Canada) et <em>StatCan</em>
           (Division Géographie, Statistiques du Canada).'
-        contributors_fi_html: '<strong>Finlande</strong>: contient des données de
+        contributors_fi_html: '<strong>Finlande</strong> : contient des données de
           la Base de données topographique de l’Inspection nationale du territoire
           de Finlande et d’autres ensembles de données, sous <a href="https://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">licence
           NLSFI</a>.'
-        contributors_fr_html: '<strong>France</strong>: contient des données de la
+        contributors_fr_html: '<strong>France</strong> : contient des données de la
           <em>Direction générale des finances publiques</em> (anciennement la <em>Direction
           générale des impôts</em>).'
-        contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données © <abbr
+        contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données © <abbr
           title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="https://www.and.com/">www.and.com</a>).'
-        contributors_nz_html: "<strong>Nouvelle-Zélande</strong>: contient des données
+        contributors_nz_html: "<strong>Nouvelle-Zélande</strong> : contient des données
           provenant du <a href=\"https://data.linz.govt.nz/\">service de données LINZ</a>
           et pour la réutilisation, sous licence  \n<a href=\"https://creativecommons.org/licenses/by/4.0/\">CC
           BY 4.0</a>."
@@ -1581,10 +1582,10 @@ fr:
           sous licence <a href="https://creativecommons.org/licenses/by/4.0/">CC BY
           4.0</a> pour la réutilisation .'
         contributors_za_html: |-
-          <strong>Afrique du Sud</strong> : contient des données issues de la <a href="http://www.ngi.gov.za/">Direction principale des
+          <strong>Afrique du Sud</strong> : contient des données issues de la <a href="http://www.ngi.gov.za/">Direction principale des
           Informations Géospatiales Nationales</a>, copyright de l’État réservé.
         contributors_gb_html: |-
-          <strong>Royaume-Uni</strong>: contient des données issues de
+          <strong>Royaume-Uni</strong> : contient des données issues de
           l’<em>Ordnance Survey</em> © 2010–2019 Droits d’auteurs et de la
           base de données de la Couronne.
         contributors_footer_1_html: Pour plus de détails sur celles-ci et sur les
@@ -1658,8 +1659,8 @@ fr:
       export_details: Les données d’OpenStreetMap sont publiées sous la <a href="https://opendatacommons.org/licenses/odbl/1.0/">licence
         Open Data Commons Open Database</a> (ODbL).
       too_large:
-        advice: 'Si l’export ci-dessus échoue, veuillez envisager l’utilisation d’une
-          des sources listées ci-dessous :'
+        advice: 'Si l’export ci-dessus échoue, veuillez envisager l’utilisation de
+          l’une des sources listées ci-dessous :'
         body: Cette zone est trop vaste pour être exportée au format OpenStreetMap
           XML. Veuillez zoomer ou sélectionner une zone plus petite, ou utiliser une
           des sources suivantes pour le téléchargement de données massives.
@@ -1751,7 +1752,7 @@ fr:
       welcomemat:
         url: https://wiki.openstreetmap.org/wiki/FR:Page_principale
         title: Pour les organisations
-        description: Dans une organisation qui fait des plans pour OpenStreetMap?
+        description: Dans une organisation qui fait des plans pour OpenStreetMap ?
           Trouvez ce que vous avez besoin de savoir dans le tapis d’accueil.
       wiki:
         url: https://wiki.openstreetmap.org/wiki/FR:Page_principale
@@ -1858,7 +1859,7 @@ fr:
       alt: Texte alternatif
       url: URL
     welcome:
-      title: Bienvenue!
+      title: Bienvenue !
       introduction_html: Bienvenue à OpenStreetMap, la carte du monde libre et éditable.
         Maintenant que vous êtes enregistré, vous avez tout ce qu’il faut pour commencer
         à cartographier. Ce qui suit est un petit guide des choses les plus importantes
@@ -1866,7 +1867,7 @@ fr:
       whats_on_the_map:
         title: Ce qu’il y a sur la carte
         on_html: OpenStreetMap sert à cartographier des objets qui sont à la fois
-          <em>réels et actuels</em>— il contient des millions de bâtiments, de routes
+          <em>réels et actuels</em> — il contient des millions de bâtiments, de routes
           et d’autres détails sur des lieux. Vous pouvez cartographier n’importe quel
           élément du monde réel qui vous intéresse.
         off_html: Ce qui est par contre <em>exclu</em> sont les données subjectives
@@ -1888,7 +1889,7 @@ fr:
           à propos d’un nœud ou d’un chemin, comme le nom d’un restaurant ou la limite
           de vitesse d’une route.
       rules:
-        title: Règles!
+        title: Règles !
         paragraph_1_html: OpenStreetMap a quelques règles formelles, mais nous attendons
           de tous les participants une collaboration et une communication avec la
           communauté. Si vous envisagez d’autres activités que la modification à la
@@ -1896,18 +1897,18 @@ fr:
           importations</a> et <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>les
           modifications automatiques</a>.
       questions:
-        title: Des questions?
+        title: Des questions ?
         paragraph_1_html: |-
           OpenStreetMap propose plusieurs ressources pour apprendre à travailler dans le projet, pour poser des questions et y répondre, et pour discuter et documenter les sujets de cartographie en collaboration avec d’autres utilisateurs.
-          <a href='%{help_url}'>Trouver de l’aide ici</a>. Dans une organisation qui fait des plans pour OpenStreetMap? <a href='https://welcome.openstreetmap.org/'>Vérifiez votre tapis d’accueil</a>.
+          <a href='%{help_url}'>Trouver de l’aide ici</a>. Dans une organisation qui fait des plans pour OpenStreetMap ? <a href='https://welcome.openstreetmap.org/'>Vérifiez votre tapis d’accueil</a>.
       start_mapping: Commencer à cartographier
       add_a_note:
-        title: Pas le temps d’effectuer les modifications ? Ajoutez une note !
+        title: Pas le temps d’effectuer les modifications ? Ajoutez une note !
         paragraph_1_html: |-
           Si vous voulez juste une petite correction et n’avez pas le temps de vous
           enregistrer sur le projet et d’apprendre à effectuer les modifications, il est facile d’ajouter une note.
         paragraph_2_html: |-
-          Allez simplement sur <a href='%{map_url}'>la carte</a> et cliquez sur l’icône note:
+          Allez simplement sur <a href='%{map_url}'>la carte</a> et cliquez sur l’icône note :
           <span class='icon note'></span>. Cela ajoutera un marqueur sur la carte, que vous pouvez déplacer en faisant glisser la carte. Ajoutez votre message puis cliquez sur Enregistrer, et d’autres contributeurs iront regarder.
   traces:
     visibility:
@@ -1981,7 +1982,7 @@ fr:
       delete_trace: Supprimer cette piste
       trace_not_found: Trace non trouvée !
       visibility: 'Visibilité :'
-      confirm_delete: Supprimer cette trace?
+      confirm_delete: Supprimer cette trace ?
     trace_paging_nav:
       showing_page: Page %{page}
       older: Anciennes traces
@@ -2431,7 +2432,7 @@ fr:
         confirmer votre nouvelle adresse courriel.
       flash update success: Informations sur l’utilisateur mises à jour avec succès.
     confirm:
-      heading: Vérifiez votre courriel!
+      heading: Vérifiez votre courriel !
       introduction_1: Nous vous avons envoyé un courriel de confirmation.
       introduction_2: Confirmez votre compte en cliquant sur le lien dans le courriel
         et vous pourrez commencer à cartographier.
@@ -2456,7 +2457,7 @@ fr:
       press confirm button: Appuyez sur le bouton Confirmer ci-dessous pour confirmer
         votre nouvelle adresse de courriel.
       button: Confirmer
-      success: Modification de votre adresse de courriel confirmée!
+      success: Modification de votre adresse de courriel confirmée !
       failure: Une adresse de courriel a déjà été confirmée avec ce jeton d’authentification.
       unknown_token: Ce code de confirmation a expiré ou n’existe pas.
     set_home:
@@ -2726,7 +2727,7 @@ fr:
         unhide_comment: démasquer
     notes:
       new:
-        intro: Vous avez repéré une erreur ou un manque? Faites-le savoir aux autres
+        intro: Vous avez repéré une erreur ou un manque ? Faites-le savoir aux autres
           cartographes afin qu’ils puissent y remédier. Déplacez le marqueur à la
           position exacte et écrivez une note pour expliquer le problème.
         advice: Votre note est publique et peut être utilisée pour mettre à jour la
index b7c27363661084a1dd278ccb1ba6d3a739bce863..6943654bc2db63b94a42fb8515fecfe0b36c3d6a 100644 (file)
@@ -423,7 +423,7 @@ it:
       user_title: Diario di %{user}
       leave_a_comment: Lascia un commento
       login_to_leave_a_comment: '%{login_link} per lasciare un commento'
-      login: Accedi
+      login: Entra
     no_such_entry:
       title: Nessuna voce del diario
       heading: 'Nessuna voce con l''identificativo: %{id}'
index e6a64dfffcc7c7f01ef72e797facc4ffe49dce37..7547069d6720b84e6276b89b0b9bb59ba6ecc31d 100644 (file)
@@ -50,6 +50,7 @@
 # Author: Teiron
 # Author: The Polish
 # Author: Ty221
+# Author: WaldiSt
 # Author: Woytecr
 # Author: Wpedzich
 # Author: Yarl
@@ -89,6 +90,7 @@ pl:
     errors:
       messages:
         invalid_email_address: nie wygląda na poprawny adres e-mail
+        email_address_not_routable: nie jest routowalny
     models:
       acl: Lista kontroli dostępu
       changeset: Zestaw zmian
@@ -1577,10 +1579,10 @@ pl:
           że udostępniający je podmiot popiera OpenStreetMap, udziela jakiejkolwiek
           gwarancji lub ponosi jakąkolwiek odpowiedzialność.
         infringement_title_html: Naruszenia praw autorskich
-        infringement_1_html: Użytkownicy OpenStreetMap powinni pamiętać, aby nigdy
-          nie dodawać danych z żadnych źródeł chronionych prawami autorskimi (jak
-          np. Google Maps i&nbsp;większość map drukowanych) bez wyraźnego pozwolenia
-          właściciela praw autorskich.
+        infringement_1_html: Autorzy OpenStreetMap powinni pamiętać, aby nigdy nie
+          dodawać danych z żadnych źródeł chronionych prawami autorskimi (jak np.
+          Google Maps i&nbsp;większość map drukowanych) bez wyraźnego pozwolenia właściciela
+          praw autorskich.
         infringement_2_html: Jeśli uważasz, że materiał chroniony prawem autorskim
           został niewłaściwie dodany do bazy OpenStreetMap, zajrzyj pod adres naszej
           <a href="https://www.osmfoundation.org/wiki/License/Takedown_procedure">procedury
@@ -2224,6 +2226,15 @@ pl:
       title: Warunki
       heading: Warunki
       heading_ct: Warunki uczestnictwa
+      read and accept with tou: Przeczytaj Warunki uczestnictwa i Warunki użytkowania,
+        zaznacz oba pola wyboru po zakończeniu, a następnie naciśnij przycisk Kontynuuj.
+      contributor_terms_explain: Niniejsza umowa reguluje warunki twoich obecnych
+        i przyszłych wkładów.
+      read_ct: Przeczytałem i akceptuję powyższe warunki współautora
+      tou_explain_html: Te %{tou_link} regulują korzystanie ze strony internetowej
+        i innej infrastruktury zapewnianej przez OSMF. Kliknij link, przeczytaj i
+        zaakceptuj tekst.
+      read_tou: Przeczytałem i akceptuję Warunki użytkowania
       consider_pd: Oprócz powyższych warunków, stwierdzam również, że mój wkład jest
         w domenie publicznej
       consider_pd_why: co to oznacza?
index 40face15c58fb962196c274421b66850740036b2..e19cdaa6e06f5524ae6d6cb4f9b53a140100f1a9 100644 (file)
@@ -4,6 +4,7 @@
 # Author: Abijeet Patro
 # Author: AmaryllisGardener
 # Author: John Reid
+# Author: MJL
 ---
 sco:
   time:
@@ -68,7 +69,7 @@ sco:
         latitude: Latitude
         longitude: Longitude
         public: Public
-        description: Description
+        description: Descreeption
       message:
         sender: Sender
         title: Subject
@@ -78,7 +79,7 @@ sco:
         email: Email
         active: Active
         display_name: Display Name
-        description: Description
+        description: Descreeption
         languages: Leids
         pass_crypt: Passwird
   editor:
@@ -1164,6 +1165,6 @@ sco:
       centre_map: Centre cairt here
   redactions:
     edit:
-      description: Description
+      description: Descreeption
       heading: Eedit redaction
 ...
index be6b84b47aa76e52b3fcbd3c0ff327d628797d14..7579ffee794cbc56d4dd4723bd9eadab9960290a 100644 (file)
@@ -282,7 +282,7 @@ module Api
 
       # simple diff to change a node, way and relation by removing
       # their tags
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
@@ -298,7 +298,7 @@ module Api
           </relation>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset_id }, :body => diff
@@ -311,7 +311,7 @@ CHANGESET
 
       # simple diff to change a node, way and relation by removing
       # their tags
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
@@ -327,7 +327,7 @@ CHANGESET
           </relation>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset_id }, :body => diff
@@ -340,7 +340,7 @@ CHANGESET
 
       # simple diff to change a node, way and relation by removing
       # their tags
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
@@ -356,7 +356,7 @@ CHANGESET
           </relation>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset_id }, :body => diff
@@ -381,7 +381,7 @@ CHANGESET
       basic_authorization user.email, "test"
 
       # simple diff to create a node way and relation using placeholders
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
@@ -400,7 +400,7 @@ CHANGESET
           </relation>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -529,7 +529,7 @@ CHANGESET
       changeset_id = @response.body.to_i
 
       # upload some widely-spaced nodes, spiralling positive and negative
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id='-1' lon='-20' lat='-10' changeset='#{changeset_id}'/>
@@ -552,7 +552,7 @@ CHANGESET
           <node id='-18' lon='179.9'  lat='89.9' changeset='#{changeset_id}'/>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it, which used to cause an error like "PGError: ERROR:
       # integer out of range" (bug #2152). but shouldn't any more.
@@ -683,7 +683,7 @@ CHANGESET
       basic_authorization changeset.user.email, "test"
 
       # simple diff to create a node way and relation using placeholders
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
@@ -691,7 +691,7 @@ CHANGESET
           </node>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -713,7 +713,7 @@ CHANGESET
       basic_authorization changeset.user.email, "test"
 
       # simple diff to create a node way and relation using placeholders
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
@@ -733,7 +733,7 @@ CHANGESET
           </relation>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -772,7 +772,7 @@ CHANGESET
       basic_authorization changeset.user.email, "test"
 
       # simple diff to create a node way and relation using placeholders
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
@@ -794,7 +794,7 @@ CHANGESET
           </node>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -817,7 +817,7 @@ CHANGESET
       # change the location of a node multiple times, each time referencing
       # the last version. doesn't this depend on version numbers being
       # sequential?
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
@@ -830,7 +830,7 @@ CHANGESET
           <node id='#{node.id}' lon='9' lat='9' changeset='#{changeset.id}' version='8'/>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -852,14 +852,14 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
           <node id='#{node.id}' lon='1' lat='1' changeset='#{changeset.id}' version='1'/>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -874,13 +874,13 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
          <node id='1' lon='1' lat='1' changeset='#{changeset.id}'/>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -895,13 +895,13 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
           <ping>
            <node id='1' lon='1' lat='1' changeset='#{changeset.id}' />
           </ping>
         </osmChange>
-CHANGESET
+      CHANGESET
       post :upload, :params => { :id => changeset.id }, :body => diff
       assert_response :bad_request, "Shouldn't be able to upload a diff with the action ping"
       assert_equal @response.body, "Unknown action ping, choices are create, modify, delete"
@@ -920,7 +920,7 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify><node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}'
           version='1'></node>
@@ -932,7 +932,7 @@ CHANGESET
            <member type='relation' role='some' ref='#{other_relation.id}'/>
           </relation>
          </modify></osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -955,7 +955,7 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id='-1' lon='0' lat='0' changeset='#{changeset.id}'>
@@ -969,7 +969,7 @@ CHANGESET
           <node id='-1' lon='2' lat='2' changeset='#{changeset.id}' version='2'/>
          </delete>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -989,7 +989,7 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id='-1' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
@@ -997,7 +997,7 @@ CHANGESET
           <node id='-1' lon='2' lat='2' changeset='#{changeset.id}' version='2'/>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -1014,7 +1014,7 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
@@ -1028,7 +1028,7 @@ CHANGESET
           </way>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -1037,7 +1037,7 @@ CHANGESET
       assert_equal "Placeholder node not found for reference -4 in way -1", @response.body
 
       # the same again, but this time use an existing way
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
@@ -1051,7 +1051,7 @@ CHANGESET
           </way>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -1069,7 +1069,7 @@ CHANGESET
 
       basic_authorization changeset.user.email, "test"
 
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
@@ -1083,7 +1083,7 @@ CHANGESET
           </relation>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -1092,7 +1092,7 @@ CHANGESET
       assert_equal "Placeholder Node not found for reference -4 in relation -1.", @response.body
 
       # the same again, but this time use an existing relation
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <create>
           <node id="-1" lon="0" lat="0" changeset="#{changeset.id}" version="1"/>
@@ -1106,7 +1106,7 @@ CHANGESET
           </relation>
          </create>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset.id }, :body => diff
@@ -1266,7 +1266,7 @@ CHANGESET
       changeset_id = @response.body.to_i
 
       # add a diff to it
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <modify>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
@@ -1279,7 +1279,7 @@ CHANGESET
           <node id='#{node.id}' lon='9' lat='9' changeset='#{changeset_id}' version='8'/>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset_id }, :body => diff
@@ -1310,7 +1310,7 @@ CHANGESET
       assert_response :success
       changeset_id = @response.body.to_i
 
-      diff = <<OSMFILE.strip_heredoc
+      diff = <<~OSMFILE
         <osmChange version="0.6" generator="JOSM">
         <create version="0.6" generator="JOSM">
           <node id='-1' visible='true' changeset='#{changeset_id}' lat='51.49619982187321' lon='-0.18722061869438314' />
@@ -1337,7 +1337,7 @@ CHANGESET
           </way>
         </create>
         </osmChange>
-OSMFILE
+      OSMFILE
 
       # upload it
       post :upload, :params => { :id => changeset_id }, :body => diff
@@ -1372,7 +1372,7 @@ OSMFILE
       changeset_id = @response.body.to_i
 
       # add a diff to it
-      diff = <<CHANGESET.strip_heredoc
+      diff = <<~CHANGESET
         <osmChange>
          <delete>
           <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
@@ -1392,7 +1392,7 @@ OSMFILE
           </way>
          </modify>
         </osmChange>
-CHANGESET
+      CHANGESET
 
       # upload it
       post :upload, :params => { :id => changeset_id }, :body => diff
index 1b54e4863c52fe6024bd6a0eb1079012b40e1c24..b7c17a176485f3a448539e16cc23a3898b7c13a4 100644 (file)
@@ -737,7 +737,7 @@ module Api
 
       basic_authorization user.email, "test"
 
-      doc_str = <<OSM.strip_heredoc
+      doc_str = <<~OSM
         <osm>
          <relation changeset='#{changeset.id}'>
           <member ref='#{node1.id}' type='node' role='first'/>
@@ -746,7 +746,7 @@ module Api
           <member ref='#{way2.id}' type='way' role='fourth'/>
          </relation>
         </osm>
-OSM
+      OSM
       doc = XML::Parser.string(doc_str).parse
 
       put :create, :body => doc.to_s
@@ -795,7 +795,7 @@ OSM
       node1 = create(:node)
       node2 = create(:node)
 
-      doc_str = <<OSM.strip_heredoc
+      doc_str = <<~OSM
         <osm>
          <relation changeset='#{changeset.id}'>
           <member ref='#{node1.id}' type='node' role='forward'/>
@@ -804,7 +804,7 @@ OSM
           <member ref='#{node2.id}' type='node' role='forward'/>
          </relation>
         </osm>
-OSM
+      OSM
       doc = XML::Parser.string(doc_str).parse
 
       ## First try with the private user
@@ -836,7 +836,7 @@ OSM
       node3 = create(:node)
       node4 = create(:node)
 
-      doc_str = <<OSM.strip_heredoc
+      doc_str = <<~OSM
         <osm>
          <relation changeset='#{changeset.id}'>
           <member ref='#{node1.id}' type='node' role='forward'/>
@@ -845,7 +845,7 @@ OSM
           <member ref='#{node2.id}' type='node' role='forward'/>
          </relation>
         </osm>
-OSM
+      OSM
       doc = XML::Parser.string(doc_str).parse
       basic_authorization user.email, "test"
 
index c7826062ba52ba7aca177f3b4412df75c5135510..a798013dbe40e5a5b8e6ee6084a5cb824ad4cc7e 100644 (file)
@@ -170,6 +170,14 @@ class SiteControllerTest < ActionController::TestCase
     assert_redirected_to :controller => :users, :action => :login, :referer => "/edit"
   end
 
+  # Test the error when trying to edit without public edits
+  def test_edit_non_public
+    get :edit, :session => { :user => create(:user, :data_public => false) }
+    assert_response :success
+    assert_template "edit"
+    assert_select "a[href='https://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits']"
+  end
+
   # Test the right editor gets used when the user hasn't set a preference
   def test_edit_without_preference
     get :edit, :session => { :user => create(:user) }
@@ -251,11 +259,31 @@ class SiteControllerTest < ActionController::TestCase
     assert_equal 18, assigns(:zoom)
   end
 
+  # Test editing inaccessible nodes
+  def test_edit_with_inaccessible_nodes
+    user = create(:user)
+    deleted_node = create(:node, :lat => 1.0, :lon => 1.0, :visible => false)
+
+    get :edit, :params => { :node => 99999 }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+
+    get :edit, :params => { :node => deleted_node.id }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+  end
+
   # Test editing a specific way
   def test_edit_with_way
     user = create(:user)
     node = create(:node, :lat => 3, :lon => 3)
-    way  = create(:way)
+    way = create(:way)
     create(:way_node, :node => node, :way => way)
 
     get :edit, :params => { :way => way.id }, :session => { :user => user }
@@ -266,6 +294,26 @@ class SiteControllerTest < ActionController::TestCase
     assert_equal 17, assigns(:zoom)
   end
 
+  # Test editing inaccessible ways
+  def test_edit_with_inaccessible_ways
+    user = create(:user)
+    deleted_way = create(:way, :visible => false)
+
+    get :edit, :params => { :way => 99999 }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+
+    get :edit, :params => { :way => deleted_way.id }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+  end
+
   # Test editing a specific note
   def test_edit_with_note
     user = create(:user)
@@ -281,10 +329,32 @@ class SiteControllerTest < ActionController::TestCase
     assert_equal 17, assigns(:zoom)
   end
 
+  # Test editing inaccessible notes
+  def test_edit_with_inaccessible_notes
+    user = create(:user)
+    deleted_note = create(:note, :status => "hidden") do |n|
+      n.comments.create(:author_id => user.id)
+    end
+
+    get :edit, :params => { :note => 99999 }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+
+    get :edit, :params => { :note => deleted_note.id }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+  end
+
   # Test editing a specific GPX trace
   def test_edit_with_gpx
     user = create(:user)
-    gpx  = create(:trace, :latitude => 1, :longitude => 1)
+    gpx = create(:trace, :latitude => 1, :longitude => 1)
 
     get :edit, :params => { :gpx => gpx.id }, :session => { :user => user }
     assert_response :success
@@ -294,6 +364,34 @@ class SiteControllerTest < ActionController::TestCase
     assert_equal 16, assigns(:zoom)
   end
 
+  # Test editing inaccessible GPX traces
+  def test_edit_with_inaccessible_gpxes
+    user = create(:user)
+    deleted_gpx = create(:trace, :deleted, :latitude => 1, :longitude => 1)
+    private_gpx = create(:trace, :latitude => 1, :longitude => 1, :visibility => "private")
+
+    get :edit, :params => { :gpx => 99999 }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+
+    get :edit, :params => { :gpx => deleted_gpx.id }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+
+    get :edit, :params => { :gpx => private_gpx.id }, :session => { :user => user }
+    assert_response :success
+    assert_template "edit"
+    assert_nil assigns(:lat)
+    assert_nil assigns(:lon)
+    assert_nil assigns(:zoom)
+  end
+
   # Test the edit page redirects
   def test_edit_redirect
     get :edit, :params => { :lat => 4, :lon => 5 }
index ce82f3ab5b9df6c9daabe78a28e656cae17a2408..838217e405afd05c297c66bee32046158df8d46a 100644 (file)
@@ -8,7 +8,7 @@ class NoteHelperTest < ActionView::TestCase
     date = Time.new(2014, 3, 5, 21, 37, 45, "+00:00")
     user = create(:user)
 
-    assert_match %r{^Created by anonymous <abbr title='Wed, 05 Mar 2014 21:37:45 \+0000'><span title=" 5 March 2014 at 21:37">.* ago</span></abbr>$}, note_event("open", date, nil)
+    assert_match %r{^Created by anonymous <abbr title='Wed, 05 Mar 2014 21:37:45 \+0000'><span title=" 5 March 2014 at 21:37">.* ago</span></abbr>$}, note_event("opened", date, nil)
     assert_match %r{^Resolved by <a href="/user/#{ERB::Util.u(user.display_name)}">#{user.display_name}</a> <abbr title='Wed, 05 Mar 2014 21:37:45 \+0000'><span title=" 5 March 2014 at 21:37">.* ago</span></abbr>$}, note_event("closed", date, user)
   end
 
index 6ea875a9d482b8f911b07497f299b21c166fead8..55db373d00963dfb4655cd636860f8d955978076 100644 (file)
@@ -16,7 +16,7 @@ class CompressedRequestsTest < ActionDispatch::IntegrationTest
 
     # simple diff to change a node, way and relation by removing
     # their tags
-    diff = <<CHANGESET.strip_heredoc
+    diff = <<~CHANGESET
       <osmChange>
        <modify>
         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
@@ -32,7 +32,7 @@ class CompressedRequestsTest < ActionDispatch::IntegrationTest
         </relation>
        </modify>
       </osmChange>
-CHANGESET
+    CHANGESET
 
     # upload it
     post "/api/0.6/changeset/#{changeset.id}/upload",
@@ -65,7 +65,7 @@ CHANGESET
 
     # simple diff to change a node, way and relation by removing
     # their tags
-    diff = <<CHANGESET.strip_heredoc
+    diff = <<~CHANGESET
       <osmChange>
        <modify>
         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
@@ -81,7 +81,7 @@ CHANGESET
         </relation>
        </modify>
       </osmChange>
-CHANGESET
+    CHANGESET
 
     # upload it
     post "/api/0.6/changeset/#{changeset.id}/upload",
@@ -115,7 +115,7 @@ CHANGESET
 
     # simple diff to change a node, way and relation by removing
     # their tags
-    diff = <<CHANGESET.strip_heredoc
+    diff = <<~CHANGESET
       <osmChange>
        <modify>
         <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
@@ -131,7 +131,7 @@ CHANGESET
         </relation>
        </modify>
       </osmChange>
-CHANGESET
+    CHANGESET
 
     # upload it
     post "/api/0.6/changeset/#{changeset.id}/upload",
index 3aa528ceb819db6244b9e54b7b971d005657cb23..cdfd234af46c284a3e71d727e26bbf110b8365d5 100644 (file)
@@ -3,51 +3,53 @@ require "test_helper"
 class I18nTest < ActiveSupport::TestCase
   I18n.available_locales.each do |locale|
     define_method("test_#{locale.to_s.underscore}".to_sym) do
-      # plural_keys = plural_keys(locale)
+      without_i18n_exceptions do
+        # plural_keys = plural_keys(locale)
 
-      translation_keys.each do |key|
-        variables = []
+        translation_keys.each do |key|
+          variables = []
 
-        default_value = I18n.t(key, :locale => I18n.default_locale)
+          default_value = I18n.t(key, :locale => I18n.default_locale)
 
-        if default_value.is_a?(Hash)
-          variables.push("count")
+          if default_value.is_a?(Hash)
+            variables.push("count")
 
-          default_value.each_value do |subvalue|
-            subvalue.scan(/%\{(\w+)\}/) do
+            default_value.each_value do |subvalue|
+              subvalue.scan(/%\{(\w+)\}/) do
+                variables.push(Regexp.last_match(1))
+              end
+            end
+          else
+            default_value.scan(/%\{(\w+)\}/) do
               variables.push(Regexp.last_match(1))
             end
           end
-        else
-          default_value.scan(/%\{(\w+)\}/) do
-            variables.push(Regexp.last_match(1))
-          end
-        end
 
-        variables.push("attribute") if key =~ /^(active(model|record)\.)?errors\./
+          variables.push("attribute") if key =~ /^(active(model|record)\.)?errors\./
 
-        value = I18n.t(key, :locale => locale, :fallback => true)
+          value = I18n.t(key, :locale => locale, :fallback => true)
 
-        if value.is_a?(Hash)
-          value.each do |subkey, subvalue|
-            # assert plural_keys.include?(subkey), "#{key}.#{subkey} is not a valid plural key"
+          if value.is_a?(Hash)
+            value.each do |subkey, subvalue|
+              # assert plural_keys.include?(subkey), "#{key}.#{subkey} is not a valid plural key"
 
-            next if subvalue.nil?
+              next if subvalue.nil?
 
-            subvalue.scan(/%\{(\w+)\}/) do
-              assert variables.include?(Regexp.last_match(1)), "#{key}.#{subkey} uses unknown interpolation variable #{Regexp.last_match(1)}"
+              subvalue.scan(/%\{(\w+)\}/) do
+                assert variables.include?(Regexp.last_match(1)), "#{key}.#{subkey} uses unknown interpolation variable #{Regexp.last_match(1)}"
+              end
             end
-          end
-        else
-          assert value.is_a?(String), "#{key} is not a string"
+          else
+            assert value.is_a?(String), "#{key} is not a string"
 
-          value.scan(/%\{(\w+)\}/) do
-            assert variables.include?(Regexp.last_match(1)), "#{key} uses unknown interpolation variable #{Regexp.last_match(1)}"
+            value.scan(/%\{(\w+)\}/) do
+              assert variables.include?(Regexp.last_match(1)), "#{key} uses unknown interpolation variable #{Regexp.last_match(1)}"
+            end
           end
         end
-      end
 
-      assert %w[ltr rtl].include?(I18n.t("html.dir", :locale => locale)), "html.dir must be ltr or rtl"
+        assert %w[ltr rtl].include?(I18n.t("html.dir", :locale => locale)), "html.dir must be ltr or rtl"
+      end
     end
   end
 
index 05385b4f9c8678b85b207e352fe047e52bb9956c..4d9372148f270cd447df619f1c438f2f4335b238 100644 (file)
@@ -42,6 +42,18 @@ module ActiveSupport
       end
     end
 
+    ##
+    # execute a block with missing translation exceptions suppressed
+    def without_i18n_exceptions
+      exception_handler = I18n.exception_handler
+      begin
+        I18n.exception_handler = nil
+        yield
+      ensure
+        I18n.exception_handler = exception_handler
+      end
+    end
+
     ##
     # work round minitest insanity that causes it to tell you
     # to use assert_nil to test for nil, which is fine if you're