]> git.openstreetmap.org Git - rails.git/commitdiff
Merge pull request #4249 from AntonKhorev/no-traces-nav-empty-li
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 27 Sep 2023 14:33:58 +0000 (15:33 +0100)
committerGitHub <noreply@github.com>
Wed, 27 Sep 2023 14:33:58 +0000 (15:33 +0100)
Change traces feed and upload button alignment

72 files changed:
.rubocop.yml
Gemfile.lock
Vendorfile
app/abilities/api_ability.rb
app/assets/images/banners/StateoftheMapEurope_2023.png [new file with mode: 0644]
app/assets/javascripts/index/directions.js
app/assets/javascripts/leaflet.map.js
app/assets/javascripts/osm.js.erb
app/assets/stylesheets/common.scss
app/assets/stylesheets/print.scss
app/controllers/api/user_blocks_controller.rb [new file with mode: 0644]
app/helpers/banner_helper.rb
app/views/api/user_blocks/_user_block.json.jbuilder [new file with mode: 0644]
app/views/api/user_blocks/_user_block.xml.builder [new file with mode: 0644]
app/views/api/user_blocks/show.json.jbuilder [new file with mode: 0644]
app/views/api/user_blocks/show.xml.builder [new file with mode: 0644]
app/views/browse/changeset.html.erb
app/views/notes/show.html.erb
app/views/sessions/new.html.erb
app/views/site/export.html.erb
config/banners.yml
config/initializers/secure_headers.rb
config/locales/ar.yml
config/locales/bg.yml
config/locales/br.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/de.yml
config/locales/el.yml
config/locales/en.yml
config/locales/es.yml
config/locales/gl.yml
config/locales/ia.yml
config/locales/it.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/nn.yml
config/locales/pt.yml
config/locales/ru.yml
config/locales/sl.yml
config/locales/sv.yml
config/locales/tr.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/routes.rb
config/settings.yml
test/controllers/api/changesets_controller_test.rb
test/controllers/api/nodes_controller_test.rb
test/controllers/api/relations_controller_test.rb
test/controllers/api/user_blocks_controller_test.rb [new file with mode: 0644]
test/controllers/api/users_controller_test.rb
test/controllers/api/ways_controller_test.rb
test/controllers/changesets_controller_test.rb
test/controllers/user_blocks_controller_test.rb
test/lib/locale_test.rb
test/lib/password_hash_test.rb
test/lib/short_link_test.rb
test/system/account_deletion_test.rb
test/system/diary_entry_test.rb
test/system/issues_test.rb
test/system/preferences_test.rb
test/system/report_diary_comment_test.rb
test/system/report_diary_entry_test.rb
test/system/report_note_test.rb
test/system/report_user_test.rb
test/system/user_logout_test.rb
test/system/user_signup_test.rb
test/system/user_status_change_test.rb
test/system/view_communities_test.rb
test/test_helper.rb
vendor/assets/leaflet/leaflet.osm.js
yarn.lock

index f8060f9484cc72939fd84e9ac2f94a98804468b4..dc2a33a35b05d863e828a7afd5649ec8461534b4 100644 (file)
@@ -17,11 +17,6 @@ AllCops:
 Rails:
   Enabled: true
 
-# Config can be removed after https://github.com/rubocop/rubocop-factory_bot/issues/53
-FactoryBot/AssociationStyle:
-  Include:
-    - 'test/factories/**/*'
-
 Layout/ExtraSpacing:
   AllowForAlignment: true
 
index 5f36ab05577303c14fe2d8fa35f00d55d19ba3fc..d224d95eec5eda5c5918e9f9edf0965d24931a61 100644 (file)
@@ -86,8 +86,8 @@ GEM
     autoprefixer-rails (10.4.15.0)
       execjs (~> 2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.820.0)
-    aws-sdk-core (3.181.0)
+    aws-partitions (1.828.0)
+    aws-sdk-core (3.183.1)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.5)
@@ -95,7 +95,7 @@ GEM
     aws-sdk-kms (1.71.0)
       aws-sdk-core (~> 3, >= 3.177.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.134.0)
+    aws-sdk-s3 (1.135.0)
       aws-sdk-core (~> 3, >= 3.181.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.6)
@@ -121,9 +121,9 @@ GEM
       autoprefixer-rails (>= 9.1.0)
       popper_js (>= 2.9.3, < 3)
       sassc-rails (>= 2.0.0)
-    bootstrap_form (5.2.3)
-      actionpack (>= 6.0)
-      activemodel (>= 6.0)
+    bootstrap_form (5.3.2)
+      actionpack (>= 6.1)
+      activemodel (>= 6.1)
     brakeman (6.0.1)
     brotli (0.4.0)
     browser (5.3.1)
@@ -152,7 +152,7 @@ GEM
     crack (0.4.5)
       rexml
     crass (1.0.6)
-    dalli (3.2.5)
+    dalli (3.2.6)
     date (3.3.3)
     debug_inspector (1.1.0)
     deep_merge (1.2.2)
@@ -206,7 +206,7 @@ GEM
       rubocop
       smart_properties
     erubi (1.12.0)
-    execjs (2.9.0)
+    execjs (2.9.1)
     exifr (1.4.0)
     factory_bot (6.2.1)
       activesupport (>= 5.0.0)
@@ -218,11 +218,11 @@ GEM
       faraday-net_http (>= 2.0, < 3.1)
       ruby2_keywords (>= 0.0.4)
     faraday-net_http (3.0.2)
-    ffi (1.15.5)
+    ffi (1.16.2)
     ffi-compiler (1.0.1)
       ffi (>= 1.0.0)
       rake
-    ffi-libarchive (1.1.3)
+    ffi-libarchive (1.1.13)
       ffi (~> 1.0)
     frozen_record (0.27.0)
       activemodel
@@ -313,7 +313,7 @@ GEM
       net-protocol
     net-protocol (0.2.1)
       timeout
-    net-smtp (0.3.3)
+    net-smtp (0.4.0)
       net-protocol
     nio4r (2.5.9)
     nokogiri (1.15.4)
@@ -450,16 +450,16 @@ GEM
       unicode-display_width (>= 2.4.0, < 3.0)
     rubocop-ast (1.29.0)
       parser (>= 3.2.1.0)
-    rubocop-capybara (2.18.0)
+    rubocop-capybara (2.19.0)
       rubocop (~> 1.41)
-    rubocop-factory_bot (2.23.1)
+    rubocop-factory_bot (2.24.0)
       rubocop (~> 1.33)
-    rubocop-minitest (0.31.1)
+    rubocop-minitest (0.32.1)
       rubocop (>= 1.39, < 2.0)
-    rubocop-performance (1.19.0)
+    rubocop-performance (1.19.1)
       rubocop (>= 1.7.0, < 2.0)
       rubocop-ast (>= 0.4.0)
-    rubocop-rails (2.21.0)
+    rubocop-rails (2.21.1)
       activesupport (>= 4.2.0)
       rack (>= 1.1)
       rubocop (>= 1.33.0, < 2.0)
@@ -471,7 +471,7 @@ GEM
       ffi (~> 1.12)
     ruby2_keywords (0.0.5)
     rubyzip (2.3.2)
-    sanitize (6.0.2)
+    sanitize (6.1.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.12.0)
     sassc (2.4.0)
@@ -483,7 +483,7 @@ GEM
       sprockets-rails
       tilt
     secure_headers (6.5.0)
-    selenium-webdriver (4.12.0)
+    selenium-webdriver (4.13.1)
       rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2, < 3.0)
       websocket (~> 1.0)
@@ -508,14 +508,14 @@ GEM
       actionpack (>= 5.2)
       activesupport (>= 5.2)
       sprockets (>= 3.0.0)
-    strong_migrations (1.6.1)
+    strong_migrations (1.6.3)
       activerecord (>= 5.2)
     terminal-table (3.0.2)
       unicode-display_width (>= 1.1.1, < 3)
     terser (1.1.18)
       execjs (>= 0.3.0, < 3)
     thor (1.2.2)
-    tilt (2.2.0)
+    tilt (2.3.0)
     timeout (0.4.0)
     tzinfo (2.0.6)
       concurrent-ruby (~> 1.0)
@@ -528,13 +528,13 @@ GEM
       addressable (>= 2.8.0)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
-    websocket (1.2.9)
+    websocket (1.2.10)
     websocket-driver (0.7.6)
       websocket-extensions (>= 0.1.0)
     websocket-extensions (0.1.5)
     xpath (3.2.0)
       nokogiri (~> 1.8)
-    zeitwerk (2.6.11)
+    zeitwerk (2.6.12)
 
 PLATFORMS
   ruby
index 680ed2225cc529bd167d03fe22bc9bd14f34185c..4c6a80839d9264fd60cfa760bdb4f12d0bf7b0ed 100644 (file)
@@ -15,7 +15,7 @@ folder 'vendor/assets' do
       folder 'img', 'src/img'
     end
 
-    from 'https://github.com/jfirebaugh/leaflet-osm.git' do
+    from 'https://github.com/openstreetmap/leaflet-osm.git' do
       file 'leaflet.osm.js', 'leaflet-osm.js'
     end
 
index 9b274ec845d299f2ee6af894e80cb0f3ac0dac3a..fe39f5eb5aa2475a4d1c56fa9456e9a8842d117a 100644 (file)
@@ -21,6 +21,7 @@ class ApiAbility
       can [:history, :version], OldNode
       can [:history, :version], OldWay
       can [:history, :version], OldRelation
+      can [:show], UserBlock
     end
 
     if user&.active?
diff --git a/app/assets/images/banners/StateoftheMapEurope_2023.png b/app/assets/images/banners/StateoftheMapEurope_2023.png
new file mode 100644 (file)
index 0000000..33e9db9
Binary files /dev/null and b/app/assets/images/banners/StateoftheMapEurope_2023.png differ
index 7bd0891a34e920956f0e80c3ed12a0f59e4bd9f7..c86c8ad02ccde0813d9ae03c6011505bd6933536 100644 (file)
@@ -268,7 +268,8 @@ OSM.Directions = function (map) {
           I18n.t("javascripts.directions.descend") + ": " + formatHeight(route.descend) + ".");
       }
 
-      var turnByTurnTable = $("<table class='mb-3'>");
+      var turnByTurnTable = $("<table class='table table-sm mb-3'>")
+        .append($("<tbody>"));
       var directionsCloseButton = $("<button type='button' class='btn-close'>")
         .attr("aria-label", I18n.t("javascripts.close"));
 
@@ -304,8 +305,8 @@ OSM.Directions = function (map) {
         }
 
         var row = $("<tr class='turn'/>");
-        row.append("<td><div class='direction i" + direction + "'/></td> ");
-        row.append("<td class='instruction'>" + instruction);
+        row.append("<td class='border-0'><div class='direction i" + direction + "'/></td> ");
+        row.append("<td>" + instruction);
         row.append("<td class='distance'>" + dist);
 
         row.on("click", function () {
index 6e61100f2effb01dbfdc7c255a1d51245c1f6741..e1e0e64fde0b58433a7cd204d570e50410c3ba27 100644 (file)
@@ -51,6 +51,13 @@ L.OSM.Map = L.Map.extend({
     }).prop("outerHTML");
     var thunderforest = I18n.t("javascripts.map.thunderforest_credit", { thunderforest_link: thunderforest_link });
 
+    var tracestrack_link = $("<a>", {
+      href: "https://www.tracestrack.com/",
+      target: "_blank",
+      text: I18n.t("javascripts.map.tracestrack")
+    }).prop("outerHTML");
+    var tracestrack = I18n.t("javascripts.map.tracestrack_credit", { tracestrack_link: tracestrack_link });
+
     var memomaps_link = $("<a>", {
       href: "https://memomaps.de/",
       target: "_blank",
@@ -99,6 +106,16 @@ L.OSM.Map = L.Map.extend({
       }));
     }
 
+    if (OSM.TRACESTRACK_KEY) {
+      this.baseLayers.push(new L.OSM.TracestrackTopo({
+        attribution: copyright + ". " + tracestrack + ". " + terms,
+        apikey: OSM.TRACESTRACK_KEY,
+        code: "P",
+        keyid: "tracestracktopo",
+        name: I18n.t("javascripts.map.base.tracestracktop_topo")
+      }));
+    }
+
     this.baseLayers.push(new L.OSM.OPNVKarte({
       attribution: copyright + ". " + memomaps + ". " + terms,
       code: "O",
index 0ffd35e2ceabfc922889ce572b727e8db3e272a2..0a0f5c67a7c5a9df678e3cb1e7168f46f90434ee 100644 (file)
@@ -25,6 +25,10 @@ OSM = {
   THUNDERFOREST_KEY:       <%= Settings.thunderforest_key.to_json %>,
 <% end %>
 
+<% if Settings.key?(:tracestrack_key) %>
+  TRACESTRACK_KEY:         <%= Settings.tracestrack_key.to_json %>,
+<% end %>
+
   MARKER_GREEN:            <%= image_path("marker-green.png").to_json %>,
   MARKER_RED:              <%= image_path("marker-red.png").to_json %>,
 
index 2cd357845929be2bdff8dfe9947ee3ddfb2ad992..b95d1fcd60202c5072d962d0520a45ac2f3e9106 100644 (file)
@@ -23,7 +23,7 @@ small, aside {
 
 .small_icon {
   vertical-align: middle;
-  margin-right: $lineheight/4;
+  margin-right: $lineheight * 0.25;
 }
 
 [dir=rtl] { /* no-r2 */ text-align: right; }
@@ -102,7 +102,7 @@ header {
 
   > * {
     height: 100%;
-    padding: $lineheight/2;
+    padding: $lineheight * 0.5;
   }
 
   h1, nav.primary {
@@ -698,11 +698,6 @@ div.direction {
 div.direction.i#{$i} { background-position: #{($i)*-20}px 0px; }
 }
 
-td.instruction, td.distance {
-    padding-top: $lineheight/5;
-    padding-bottom: $lineheight/5;
-    border-bottom: 1px solid $grey;
-}
 td.distance {
     color: $darkgrey;
     text-align: right;
@@ -809,15 +804,6 @@ tr.turn:hover {
     }
   }
 
-  .note-comments li, .changeset-comments li {
-    margin: $lineheight/2 0;
-
-    p {
-      margin: 10px 6px 0 6px;
-      line-height: 1.5;
-    }
-  }
-
   .subscribe-buttons input {
     font-size: 90%;
     line-height: 15px;
@@ -891,18 +877,6 @@ tr.turn:hover {
     }
     #minlat { margin-bottom: -1px; }
   }
-
-  .export_bound {
-    margin: $lineheight/4;
-  }
-
-  dl {
-    padding-left: $lineheight/2;
-    dd {
-      margin-left: 0;
-      margin-bottom: 10px;
-    }
-  }
 }
 
 /* Rules for edit pages */
@@ -1002,7 +976,7 @@ tr.turn:hover {
 /* Rules for the user map */
 
 .content_map .leaflet-popup-content {
-  margin: $lineheight/2;
+  margin: $spacer;
   min-height: 50px;
 }
 
@@ -1038,20 +1012,6 @@ tr.turn:hover {
     &:first-child {
       border-top: 1px solid $grey;
     }
-    p {
-      margin-bottom: $lineheight/2;
-    }
-  }
-}
-
-/* Rules for the log in page */
-
-#login_auth_buttons {
-  margin-bottom: 0;
-
-  li {
-    float: left;
-    padding: $lineheight/4 $lineheight/2;
   }
 }
 
@@ -1142,9 +1102,9 @@ nav.secondary-actions {
       flex-basis: auto;
       list-style: none;
       border-left: 1px solid $grey;
-      padding-left: $lineheight/2;
-      margin-right: $lineheight/2;
-      margin-bottom: $lineheight/8;
+      padding-left: $lineheight * 0.5;
+      margin-right: $lineheight * 0.5;
+      margin-bottom: $lineheight * 0.125;
     }
   }
 }
index 71fdf3978086dab10841e66ca4cb40615ed05810..a4afdf576e7e7261956fcd00345ac491bd432db2 100644 (file)
@@ -1,30 +1,58 @@
+html {
+  height: 100%;
+}
+
+body {
+  height: 100%;
+  margin: 0;
+}
+
+#content {
+  height: 100%;
+}
+
 header,
-#sidebar,
-#permalink,
 .leaflet-control {
   display: none;
 }
 
-html {
-  height: 100%;
+.map-layout .overlay-sidebar #sidebar {
+  display: none;
+}
+
+.map-layout #sidebar {
+  page-break-after: always;
+
+  & > * {
+    display: none;
+  }
+  #sidebar_content {
+    display: unset;
+  }
+
+  button,
+  input,
+  textarea,
+  .secondary-actions {
+    display: none;
+  }
+}
+
+#map-ui {
+  display: none !important;
 }
 
 #map {
-  position: absolute !important;
-  top: 0;
-  bottom: 40px;
-  left: 0;
-  right: 0;
+  position: relative;
+  height: calc(100% - 40px);
+  box-sizing: border-box;
   border: 1px solid black;
 }
 
 /* Rules for attribution text under the main map shown on printouts */
 
 #attribution {
-  position: absolute !important;
-  bottom: 0;
-  left: 0;
-  right: 0;
+  page-break-inside: avoid;
   height: 40px;
   font-size: 12px;
   text-align: center;
diff --git a/app/controllers/api/user_blocks_controller.rb b/app/controllers/api/user_blocks_controller.rb
new file mode 100644 (file)
index 0000000..19fd4b4
--- /dev/null
@@ -0,0 +1,18 @@
+module Api
+  class UserBlocksController < ApiController
+    before_action :check_api_readable
+
+    authorize_resource
+
+    around_action :api_call_handle_error, :api_call_timeout
+    before_action :set_request_formats
+
+    def show
+      raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+
+      @user_block = UserBlock.find(params[:id])
+    rescue ActiveRecord::RecordNotFound
+      raise OSM::APINotFoundError
+    end
+  end
+end
index 17c6eace3d4eb2cf4c4f24e5d208ab07925acdd7..9048d484001d2d5c12ef23591798bac65532302e 100644 (file)
@@ -1,13 +1,19 @@
 module BannerHelper
   def active_banners
     BANNERS.reject do |_k, v|
-      enddate = v[:enddate]
       begin
-        parsed = enddate && Date.parse(enddate)
+        startdate = v[:startdate] && Date.parse(v[:startdate])
       rescue StandardError
-        parsed = nil
+        startdate = nil
       end
-      !parsed.is_a?(Date) || (parsed.is_a?(Date) && parsed.past?)
+
+      begin
+        enddate = v[:enddate] && Date.parse(v[:enddate])
+      rescue StandardError
+        enddate = nil
+      end
+
+      startdate&.future? || enddate&.past?
     end
   end
 
diff --git a/app/views/api/user_blocks/_user_block.json.jbuilder b/app/views/api/user_blocks/_user_block.json.jbuilder
new file mode 100644 (file)
index 0000000..3288dd6
--- /dev/null
@@ -0,0 +1,13 @@
+json.user_block do
+  json.id user_block.id
+  json.created_at user_block.created_at.xmlschema
+  json.updated_at user_block.updated_at.xmlschema
+  json.ends_at user_block.ends_at.xmlschema
+  json.needs_view user_block.needs_view
+
+  json.user :uid => user_block.user_id, :user => user_block.user.display_name
+  json.creator :uid => user_block.creator_id, :user => user_block.creator.display_name
+  json.revoker :uid => user_block.revoker_id, :user => user_block.revoker.display_name if user_block.revoker
+
+  json.reason user_block.reason
+end
diff --git a/app/views/api/user_blocks/_user_block.xml.builder b/app/views/api/user_blocks/_user_block.xml.builder
new file mode 100644 (file)
index 0000000..a41dc56
--- /dev/null
@@ -0,0 +1,14 @@
+attrs = {
+  "id" => user_block.id,
+  "created_at" => user_block.created_at.xmlschema,
+  "updated_at" => user_block.updated_at.xmlschema,
+  "ends_at" => user_block.ends_at.xmlschema,
+  "needs_view" => user_block.needs_view
+}
+
+xml.user_block(attrs) do
+  xml.user :uid => user_block.user_id, :user => user_block.user.display_name
+  xml.creator :uid => user_block.creator_id, :user => user_block.creator.display_name
+  xml.revoker :uid => user_block.revoker_id, :user => user_block.revoker.display_name if user_block.revoker
+  xml.reason user_block.reason
+end
diff --git a/app/views/api/user_blocks/show.json.jbuilder b/app/views/api/user_blocks/show.json.jbuilder
new file mode 100644 (file)
index 0000000..6cfc0de
--- /dev/null
@@ -0,0 +1,3 @@
+json.partial! "api/root_attributes"
+
+json.partial! @user_block
diff --git a/app/views/api/user_blocks/show.xml.builder b/app/views/api/user_blocks/show.xml.builder
new file mode 100644 (file)
index 0000000..eff666b
--- /dev/null
@@ -0,0 +1,5 @@
+xml.instruct!
+
+xml.osm(OSM::API.new.xml_root_attributes) do |osm|
+  osm << (render(@user_block) || "")
+end
index b5c360a03db4c15fa80cc1db03fd176a40d856c7..9acbd05ae03992fc923f82f03420cf8c7b4ce8d1 100644 (file)
@@ -46,7 +46,9 @@
                     — <span class="action-button" data-comment-id="<%= comment.id %>" data-method="POST" data-url="<%= changeset_comment_hide_url(comment.id) %>"><%= t("javascripts.changesets.show.hide_comment") %></span>
                   <% end %>
                 </small>
-                <%= comment.body.to_html %>
+                <div class="mx-2">
+                  <%= comment.body.to_html %>
+                </div>
               </li>
             <% elsif current_user and current_user.moderator? %>
               <li id="c<%= comment.id %>">
@@ -57,7 +59,9 @@
                         :user => link_to(comment.author.display_name, user_path(comment.author))) %>
                   — <span class="action-button text-muted" data-comment-id="<%= comment.id %>" data-method="POST" data-url="<%= changeset_comment_unhide_url(comment.id) %>"><%= t("javascripts.changesets.show.unhide_comment") %></span>
                  </small>
-                <%= comment.body.to_html %>
+                <div class="mx-2">
+                  <%= comment.body.to_html %>
+                </div>
               </li>
             <% end %>
           <% end %>
index 2378d8c2ec973fcab1bc8ed6ea48c62a56b5e9ea..3bb97b484289396ffeec14167cff936401c52ad0 100644 (file)
@@ -34,7 +34,9 @@
         <% @note_comments.drop(1).each do |comment| %>
           <li id="c<%= comment.id %>">
             <small class='text-muted'><%= note_event(comment.event, comment.created_at, comment.author) %></small>
-            <%= comment.body.to_html %>
+            <div class="mx-2">
+              <%= comment.body.to_html %>
+            </div>
           </li>
         <% end %>
       </ul>
index dea65f768985860104b27651a7ff6bb600702b41..03755730bdd411fd7c3f027041d0855917b46776 100644 (file)
     <div class="mb-3">
       <label class="form-label"><%= t ".with external" %></label>
 
-      <ul class='list-unstyled' id="login_auth_buttons">
-        <li><%= link_to image_tag("openid.png", :alt => t(".auth_providers.openid.title")), "#", :id => "openid_open_url", :title => t(".auth_providers.openid.title") %></li>
-        <% if Settings.key?(:google_auth_id) -%>
-        <li><%= auth_button "google", "google" %></li>
-        <% end -%>
-        <% if Settings.key?(:facebook_auth_id) -%>
-        <li><%= auth_button "facebook", "facebook" %></li>
-        <% end -%>
-        <% if Settings.key?(:microsoft_auth_id) -%>
-        <li><%= auth_button "microsoft", "microsoft" %></li>
-        <% end -%>
-        <% if Settings.key?(:github_auth_id) -%>
-        <li><%= auth_button "github", "github" %></li>
-        <% end -%>
-        <% if Settings.key?(:wikipedia_auth_id) -%>
-        <li><%= auth_button "wikipedia", "wikipedia" %></li>
+      <ul class='list-inline' id="login_auth_buttons">
+        <li class="list-inline-item me-3"><%= link_to image_tag("openid.png", :alt => t(".auth_providers.openid.title")), "#", :id => "openid_open_url", :title => t(".auth_providers.openid.title") %></li>
+        <% %w[google facebook microsoft github wikipedia].each do |provider| %>
+          <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
+            <li class="list-inline-item me-3"><%= auth_button provider, provider %></li>
+          <% end -%>
         <% end -%>
       </ul>
 
index a314cb151416c836a7bfa6e5d79f1c889f6906ce..bb66c665ad147445d2b337c6795997efb3301d40 100644 (file)
@@ -9,8 +9,8 @@
     <div class='export_boxy border border-grey rounded'>
       <%= text_field_tag("maxlat", nil, :size => 10, :autocomplete => "off", :class => "export_bound form-control mx-auto") %>
       <div class="clearfix">
-        <%= text_field_tag("minlon", nil, :size => 10, :autocomplete => "off", :class => "export_bound form-control") %>
-        <%= text_field_tag("maxlon", nil, :size => 10, :autocomplete => "off", :class => "export_bound form-control") %>
+        <%= text_field_tag("minlon", nil, :size => 10, :autocomplete => "off", :class => "export_bound form-control my-2") %>
+        <%= text_field_tag("maxlon", nil, :size => 10, :autocomplete => "off", :class => "export_bound form-control my-2") %>
       </div>
       <%= text_field_tag("minlat", nil, :size => 10, :autocomplete => "off", :class => "export_bound form-control mx-auto") %>
       </div>
index c2a4df07b2ae4440186053193d6acb59c20a6cef..23256643d67965a158fccaf85bb24b2abbfc7bc1 100644 (file)
@@ -8,3 +8,10 @@ donate_2023:
     - [banners/donate_2023_1@2x.jpg, 2x]
   dark: true
   enddate: 2023-dec-31
+sotmeu_2023:
+  id: sotmeu_2023
+  alt: State of the Map Europe 2023
+  link: https://stateofthemap.eu/
+  img: banners/StateoftheMapEurope_2023.png
+  startdate: 2023-oct-05
+  enddate: 2023-nov-05
index e710019da30b70fcc7e8b98e870b63573ccfb3cd..778b5b827aff877439565a0a322ddc1809f28678 100644 (file)
@@ -7,7 +7,7 @@ csp_policy = {
   :form_action => %w['self'],
   :frame_ancestors => %w['self'],
   :frame_src => %w['self'],
-  :img_src => %w['self' data: www.gravatar.com *.wp.com tile.openstreetmap.org *.tile.openstreetmap.org *.tile.thunderforest.com tileserver.memomaps.de *.openstreetmap.fr],
+  :img_src => %w['self' data: www.gravatar.com *.wp.com tile.openstreetmap.org *.tile.openstreetmap.org *.tile.thunderforest.com tileserver.memomaps.de tile.tracestrack.com *.openstreetmap.fr],
   :manifest_src => %w['self'],
   :media_src => %w['none'],
   :object_src => %w['self'],
index 7ba39bd48af77be5c59b5de9b57387396208731f..823be1ad61ce91b5dbb4d197ed6e318d40d9452d 100644 (file)
@@ -2342,6 +2342,7 @@ ar:
       public_traces_from: آثار جي بي إس عمومية من %{user}
       description: تصفح أحدث مسارات GPS المرفوعة
       tagged_with: بالوسم %{tags}
+      wiki_page: صفحة ويكي
       upload_trace: حمل أثر
       my_traces: أثري في GPS
     destroy:
index 384fb420225dba57839238efbf9e700747477f36..3c75867fe10ceaaae21fe2bd55db02b60963513b 100644 (file)
@@ -1088,8 +1088,8 @@ bg:
         level2: Държавна граница
         level4: Държавна граница
         level5: Граница на региона
-        level6: Ð\94Ñ\8aÑ\80жавна граница
-        level8: Ð\93Ñ\80аниÑ\86а Ð½Ð° Ð³Ñ\80ада
+        level6: Ð\9eблаÑ\81Ñ\82на граница
+        level8: Ð\93Ñ\80аниÑ\86а Ð½Ð° Ð·ÐµÐ¼Ð»Ð¸Ñ\89е
         level9: Граница на селото
         level10: Граница на предградията
       types:
index 21cd87eb61a4fe7612f6727f65bca31a16ce1099..081c526a84e5e579fb0f2a643d0476fc2a9d4856 100644 (file)
@@ -297,6 +297,7 @@ br:
         retain_caveats: 'Koulskoude, miret e vo un nebeut titouroù diwar ho penn e
           OpenStreetMap goude ma vefe bet dilamet ho kont:'
         retain_edits: Ho kemmoù degaset d'ar gartenn, ma'z eus anezho, a vo dalc'het.
+        retain_traces: Ar roudoù ho peus enporzhiet, ma'z eus anezho, a vo dalc'het.
         retain_diary_entries: Hoc'h enmonedoù hag evezhiadennoù en deiz-levr, ma'z
           eus anezho, a vo miret met kuzhet e vint.
         retain_changeset_discussions: Ho kaozeadennoù, ma'z eus anezho, a vo miret.
@@ -757,6 +758,7 @@ br:
           public_bath: Kibelldi foran
           public_bookcase: Levraoueg foran
           public_building: Savadur foran
+          ranger_station: Post gward-koad
           recycling: Lec'h adaozañ
           restaurant: Preti
           school: Skol
@@ -1987,6 +1989,8 @@ br:
           title: Skouer deverkadur
         more_title_html: Titouroù ouzhpenn
         more_1_1_osmf_licence_page: Pajenn aotre-implijout diazezadur OSM
+        more_2_1_api_usage_policy: Politikerezh implij an API
+        more_2_1_tile_usage_policy: Politikerezh implij an teol
         contributors_title_html: Hor c'henlabourerien
         contributors_intro_html: 'Miliadoù a hiniennoù a labour ganimp. Ebarzhiñ a
           reomp ivez roadennoù digor eus ajañsoù kartennañ hag eus mamennoù all, hag
@@ -2816,7 +2820,7 @@ br:
     index:
       title: Notennoù kaset pe addispleget gant %{user}
       heading: notennoù %{user}
-      subheading_html: Notennoù kaset pe addispleget gant %{user}
+      subheading_html: Notennoù %{submitted} pe %{commented} gant %{user}
       subheading_submitted: kaset
       subheading_commented: skrivet war
       no_notes: Notenn ebet
index 580a997d6d7c889b2ba061a392ca990af1fc338e..7347dcee2c901cac97d195ee8e45cb391921847d 100644 (file)
@@ -2062,6 +2062,8 @@ ca:
         contributors_au_australia: Austràlia
         contributors_ca_canada: Canadà
         contributors_fi_finland: Finlàndia
+        contributors_fr_credit_html: '%{france}: Conté dades d''origen de la «Direction
+          Générale des Impôts».'
         contributors_fr_france: França
         contributors_nl_netherlands: Països Baixos
         contributors_nz_new_zealand: Nova Zelanda
@@ -2069,6 +2071,7 @@ ca:
         contributors_rs_serbia: Sèrbia
         contributors_rs_rgz: Autoritat geodèsica sèrbia
         contributors_si_slovenia: Eslovènia
+        contributors_si_gu: Autoritat de topografia i cartografia
         contributors_si_mkgp: Ministeri d'Agricultura, Forestal i Alimentació
         contributors_es_credit_html: |-
           %{spain}: conté dades procedents de
@@ -2752,6 +2755,7 @@ ca:
       remove as friend: Deixa l'amistat
       add as friend: Afegeix com a amic
       mapper since: 'Cartografiant des de:'
+      uid: 'ID d''usuari:'
       ct status: 'Termes de col·laboració:'
       ct undecided: No decidit
       ct declined: Rebutjat
index ba372331cdd60ccb0d9e36bc51dd7a0d466d9f5f..494e3db258aa1e5345084fdda0601ea8df325b94 100644 (file)
@@ -7,6 +7,7 @@
 # Author: Bilykralik16
 # Author: Chmee2
 # Author: Cvanca
+# Author: Decamexd
 # Author: DemonioCZ
 # Author: DoubyCz
 # Author: Dvorapa
@@ -61,7 +62,7 @@ cs:
       prompt: Vyberte soubor
     submit:
       diary_comment:
-        create: Odeslat
+        create: Okomentovat
       diary_entry:
         create: Publikovat
         update: Aktualizovat
@@ -70,11 +71,11 @@ cs:
       message:
         create: Odeslat
       client_application:
-        create: Zaregistrovat
+        create: Registrovat
         update: Aktualizovat
       oauth2_application:
-        create: Zaregistrovat
-        update: Uložit
+        create: Registrovat
+        update: Aktualizovat
       redaction:
         create: Vytvořit redakci
         update: Uložit redakci
@@ -87,7 +88,7 @@ cs:
   activerecord:
     errors:
       messages:
-        invalid_email_address: nevypadá jako platná e-mailová adresa
+        invalid_email_address: ne platná e-mailová adresa
         email_address_not_routable: není routovatelná
     models:
       acl: Seznam přístupových práv
@@ -143,8 +144,8 @@ cs:
         user: Uživatel
         title: Nadpis
         body: Obsah
-        latitude: Šířka
-        longitude: Délka
+        latitude: Zeměpisná šířka
+        longitude: Zeměpisná délka
         language_code: Jazyk
       doorkeeper/application:
         name: Název
@@ -159,8 +160,8 @@ cs:
         visible: Viditelný
         name: Název souboru
         size: Velikost
-        latitude: Šířka
-        longitude: Délka
+        latitude: Zeměpisná šířka
+        longitude: Zeměpisná délka
         public: Veřejná
         description: Popis
         gpx_file: Nahrát GPX soubor
@@ -182,7 +183,7 @@ cs:
         auth_uid: Autentifikační UID
         email: E-mail
         email_confirmation: Potvrzení e-mailu
-        new_email: nová emailová adresa
+        new_email: Nová emailová adresa
         active: Aktivní
         display_name: Zobrazované jméno
         description: Popis profilu
@@ -302,6 +303,7 @@ cs:
         reopened_at_by_html: Reaktivováno %{when} od %{user}
       rss:
         title: Poznámky OpenStreetMap
+        description_all: Seznam nahlášených, komentovaných nebo uzavřených poznámek
         description_area: Seznam poznámek hlášených, komentovaných nebo uzavřených
           ve vaší oblasti [(%{min_lat}|%{min_lon}) – (%{max_lat}|%{max_lon})]
         description_item: RSS kanál k poznámce %{id}
@@ -1915,6 +1917,9 @@ cs:
       home location: Poloha domova
       no home location: Nezadali jste polohu svého bydliště.
       update home location on click: Upravit pozici domova při kliknutí na mapu?
+      show: Zobrazit
+      delete: Smazat
+      undelete: Vrátit smazání
     update:
       success: Profil nastaven.
       failure: Nepodařilo se nastavit profil.
@@ -1968,7 +1973,8 @@ cs:
       support: podporu
   shared:
     markdown_help:
-      heading_html: Analyzováno pomocí %{kramdown_link}
+      heading_html: Zpracovává se %{kramdown_link}
+      kramdown: kramdownem
       headings: Nadpisy
       heading: Nadpis
       subheading: Podnadpis
@@ -2105,6 +2111,7 @@ cs:
         contributors_at_austria: Rakousko
         contributors_at_stadt_wien: města Vídně
         contributors_at_cc_by: CC BY
+        contributors_at_cc_by_url: https://creativecommons.org/licenses/by/3.0/at/deed.cs
         contributors_at_land_vorarlberg: země Vorarlbersko
         contributors_at_cc_by_at_with_amendments: CC BY AT s dodatky
         contributors_au_credit_html: '%{australia}: Zahrnuje nebo využívá Administrative
@@ -2825,6 +2832,7 @@ cs:
       remove as friend: Odebrat z přátel
       add as friend: Přidat do přátel
       mapper since: 'Účastník projektu od:'
+      uid: 'ID uživatele:'
       ct status: 'Podmínky pro přispěvatele:'
       ct undecided: Nerozhodnuto
       ct declined: Odmítnuty
index b4b1b24aa99a663ac359b4cc255a240a281d4f98..8eff4d8060cf3ff18d94a714780295941082870a 100644 (file)
@@ -316,6 +316,7 @@ de:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -331,6 +332,8 @@ de:
         reopened_at_by_html: '%{when} von %{user} reaktiviert'
       rss:
         title: OpenStreetMap-Hinweise
+        description_all: Eine Liste der gemeldeten, kommentierten oder geschlossenen
+          Notizen
         description_area: Übersicht der gemeldeten, kommentierten oder geschlossen
           Hinweise im Bereich [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})].
         description_item: Ein RSS-Feed für Hinweis %{id}
@@ -1946,6 +1949,9 @@ de:
       home location: Heimatstandort
       no home location: Du hast noch keinen Standort angegeben.
       update home location on click: Standort beim Klick auf die Karte aktualisieren
+      show: Anzeigen
+      delete: Löschen
+      undelete: Löschen rückgängig machen
     update:
       success: Profil aktualisiert.
       failure: Profil konnte nicht aktualisiert werden.
@@ -2448,6 +2454,7 @@ de:
           fehlt, dich einzuarbeiten, wie man in OSM Daten editiert, so gib einfach
           einen Hinweis/melde einen Fehler, dann kann sich ein anderer Mapper darum
           kümmern.
+        the_map: die Karte
     communities:
       title: Gemeinschaften
       lede_text: |-
@@ -2459,13 +2466,14 @@ de:
         about_text: Lokale Verbände sind Gruppen auf Landesebene oder Regionsebene,
           die den formellen Schritt unternommen haben, einen gemeinnützigen Rechtskörper
           zu gründen. Sie repräsentieren die Karte und Kartographen der Region, wenn
-          Sie mit der örtlichen Regierung, Wirtschaft oder den Medien zu tun haben.
+          sie mit der örtlichen Regierung, Wirtschaft oder den Medien zu tun haben.
           Sie haben auch eine Zusammengehörigkeit mit der OpenStreetMap Foundation
           (OSMF) gebildet, was ihnen eine Verbindung zu der Rechts- und Urheberrechtsabteilung
           gibt.
         list_text: 'Folgende Gemeinschaften sind offiziell als lokale Verbände eingetragen:'
       other_groups:
         title: Andere Gruppen
+        communities_wiki: Community-Wiki-Seite
   traces:
     visibility:
       private: Privat (werden nur als anonyme, unsortierte Punkte ohne Zeitangaben
@@ -2552,6 +2560,7 @@ de:
       empty_title: Noch nichts vorhanden
       empty_upload_html: '%{upload_link} oder erfahren Sie mehr über GPS-Tracks auf
         der %{wiki_link}.'
+      upload_new: Einen neuen Track hochladen
       wiki_page: Wiki-Seite
       upload_trace: Lade einen Track hoch
       all_traces: Alle Tracks
@@ -2820,6 +2829,7 @@ de:
       remove as friend: Freund entfernen
       add as friend: Freund hinzufügen
       mapper since: 'Mapper seit:'
+      uid: 'Benutzer-ID:'
       ct status: 'Bedingungen für Mitwirkende:'
       ct undecided: Unentschlossen
       ct declined: Abgelehnt
@@ -3020,7 +3030,9 @@ de:
     index:
       title: Hinweise/Fehler erstellt oder kommentiert von %{user}
       heading: Hinweise von %{user}
-      subheading_html: Hinweise/Fehler erstellt oder kommentiert von %{user}
+      subheading_html: Hinweise/Fehler %{submitted} oder %{commented} von %{user}
+      subheading_submitted: eingereicht
+      subheading_commented: kommentiert
       no_notes: Keine Hinweise
       id: ID
       creator: Ersteller
index fea612abb2e792e45d9f69fd2423e87d53f4d9ec..7b2c93fde5e92824a2430eaebbd6df25ad7b74bd 100644 (file)
@@ -270,6 +270,7 @@ el:
         reopened_at_by_html: Επανενεργοποιήθηκε %{when} από τον %{user}
       rss:
         title: Σημειώσεις OpenStreetMap
+        description_all: Μια λίστα με αναφερόμενες, σχολιασμένες ή κλειστές σημειώσεις
         description_area: Μια λίστα με σημειώσεις, που αναφέρθηκαν, σχολιάστηκαν ή
           επιλύθηκαν στην περιοχή σας [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]
         description_item: Μια τροφοδοσία rss για τη σημείωση %{id}
@@ -336,6 +337,10 @@ el:
       delete_account: Διαγραφή λογαριασμού...
     go_public:
       heading: Δημόσια επεξεργασία
+      currently_not_public: Προς το παρόν, οι αλλαγές σας είναι ανώνυμες και οι άνθρωποι
+        δεν μπορούν να σας στείλουν μηνύματα ή να δουν την τοποθεσία σας. Για να δείξετε
+        τι επεξεργαστήκατε και να επιτρέψετε στους άλλους να επικοινωνήσουν μαζί σας
+        μέσω του ιστότοπου, κάντε κλικ στο παρακάτω κουμπί.
       only_public_can_edit: Από την αλλαγή του API 0.6, μόνο οι δημόσιοι χρήστες μπορούν
         να επεξεργάζονται τα δεδομένα χάρτη.
       find_out_why: μάθετε γιατί
@@ -578,7 +583,6 @@ el:
       comment_link: Σχολιάστε την καταχώρηση
       reply_link: Αποστολή μηνύματος στον συγγραφέα
       comment_count:
-        zero: Χωρίς σχόλια
         one: '%{count} σχόλιο'
         other: '%{count} σχόλια'
       no_comments: Κανένα σχόλιο
@@ -1465,8 +1469,7 @@ el:
     show:
       title: '%{status} Ζήτημα #%{issue_id}'
       reports:
-        zero: Καμία αναφορά
-        one: 1 αναφορά
+        one: '%{count} αναφορά'
         other: '%{count} αναφορές'
       no_reports: Καμία αναφορά
       report_created_at: Αναφέρθηκε για πρώτη φορά στις %{datetime}
@@ -1540,7 +1543,7 @@ el:
   layouts:
     logo:
       alt_text: Λογότυπο OpenStreetMap
-    home: Î\9cεÏ\84άβαÏ\83η Ï\83Ï\84ο Î£Ï\80ίÏ\84ι
+    home: Î\94είξε Ï\84ο Ï\83Ï\80ίÏ\84ι Î¼Î¿Ï\85
     logout: Αποσύνδεση
     log_in: Σύνδεση
     sign_up: Εγγραφή
@@ -1876,7 +1879,7 @@ el:
       delete image: Αφαίρεση της τρέχουσας εικόνας
       replace image: Αντικατάσταση της τρέχουσας εικόνας
       image size hint: (τετράγωνες εικόνες τουλάχιστον 100 x 100 λειτουργούν καλύτερα)
-      home location: Τοποθεσία Σπιτιού
+      home location: Τοποθεσία σπιτιού
       no home location: Δεν έχετε εισάγει την τοποθεσία του σπιτιού σας.
       update home location on click: Ενημέρωση τοποθεσίας σπιτιού όταν κάνω κλικ στον
         χάρτη;
@@ -1968,11 +1971,22 @@ el:
         χρησιμοποιούν αεροφωτογραφίες, συσκευές GPS και τοπικούς χάρτες χαμηλής τεχνολογίας
         για να σιγουρευτούν πως το OSM είναι ακριβής και ενημερωμένο.
       community_driven_title: Βασίζεται στην κοινότητα
+      community_driven_1_html: |-
+        Η κοινότητα του OpenStreetMap είναι ποικίλη, παθιασμένη και αυξάνεται καθημερινά.
+        Οι συνεισφέροντες μας, περιλαμβάνουν ενθουσιώδεις χαρτογράφους, επαγγελματίες GIS, μηχανικούς
+        που τρέχουν τους διακομιστές OSM, ανθρωπιστές που χαρτογραφούν περιοχές που έχουν πληγεί από καταστροφές,
+        και πολλά άλλα.
+        Για να μάθετε περισσότερα σχετικά με την κοινότητα, δείτε στον ιστότοπο %{osm_blog_link}, %{user_diaries_link}, %{community_blogs_link} και στο %{osm_foundation_link}.
       community_driven_osm_blog: Ιστολόγιο OpenStreetMap
       community_driven_user_diaries: ημερολόγια χρηστών
       community_driven_community_blogs: ιστολόγια κοινότητας
       community_driven_osm_foundation: Ίδρυμα OSM
       open_data_title: Ανοικτά Δεδομένα
+      open_data_1_html: 'Το OpenStreetMap είναι %{open_data}: είστε ελεύθεροι να την
+        χρησιμοποιήστε για οποιονδήποτε σκοπό, εφόσον μνημονεύετε το OpenStreetMap
+        και τους συνεισφέροντές του. Εάν προσαρμόσετε ή αξιοποιήσετε αυτά τα δεδομένα
+        με συγκεκριμένους τρόπους, πρέπει να διανείμετε το αποτέλεσμα μόνο υπό την
+        ίδια άδεια χρήσης. Δείτε τη σελίδα %{copyright_license_link} για λεπτομέρειες.'
       open_data_open_data: ανοιχτά δεδομένα
       open_data_copyright_license: Σελίδα Πνευματικών Δικαιωμάτων και Άδειας Χρήσης
       legal_title: Νομικό
@@ -2704,7 +2718,7 @@ el:
       diary: Ημερολόγιο
       edits: Επεξεργασίες
       traces: Ίχνη
-      notes: Σημειώσεις Χάρτη
+      notes: Σημειώσεις χάρτη
       remove as friend: Αφαίρεση Φίλου
       add as friend: Προσθήκη Φίλου
       mapper since: 'Χαρτογράφος από:'
@@ -2902,7 +2916,7 @@ el:
     index:
       title: Σημειώσεις που υποβλήθηκαν ή σχολιάστηκαν από τον %{user}
       heading: σημειώσεις του %{user}
-      subheading_html: Σημειώσεις που υποβλήθηκαν ή σχολιάστηκαν από τον %{user}
+      subheading_html: Σημειώσεις που %{submitted} ή %{commented} από τον %{user}
       no_notes: Χωρίς σημειώσεις
       id: Αναγνωριστικό
       creator: Δημιουργός
@@ -2981,7 +2995,7 @@ el:
         in: Μεγέθυνση
         out: Σμίκρυνση
       locate:
-        title: Προβολή της Τοποθεσίας μου
+        title: Προβολή της τοποθεσίας μου
         metersPopup:
           one: Είστε εντός %{count} μέτρου από το σημείο
           other: Είστε εντός %{count} μέτρων από το σημείο
@@ -2990,18 +3004,18 @@ el:
           other: Είστε εντός %{count} ποδιών από το σημείο
       base:
         standard: Κανονικός
-        cyclosm: CyclOSM
-        cycle_map: Î§Î¬Ï\81Ï\84ηÏ\82 Î Î¿Î´Î·Î»Î±Ï\83ίαÏ\82
-        transport_map: Î£Ï\85γκοινÏ\89νιακÏ\8cÏ\82 Î§Î¬Ï\81Ï\84ηÏ\82
+        cyclosm: CyclOSM ποδηλασία
+        cycle_map: Î Î¿Î´Î·Î»Î±Ï\83ία
+        transport_map: Î£Ï\85γκοινÏ\89νία
         hot: Ανθρωπιστικός
-        opnvkarte: ÖPNVKarte
+        opnvkarte: ÖPNVKarte συγκοινωνίες
       layers:
-        header: Στρώματα Χάρτη
-        notes: Σημειώσεις Χάρτη
-        data: Δεδομένα Χάρτη
+        header: Στρώματα
+        notes: Σημειώσεις χάρτη
+        data: Δεδομένα χάρτη
         gps: Δημόσια ίχνη GPS
         overlays: Ενεργοποίηση επικαλύψεων για την αντιμετώπιση προβλημάτων του χάρτη
-        title: Στρώματα
+        title: Στρώματα χάρτη
       openstreetmap_contributors: Συνεισφέροντες OpenStreetMap
       make_a_donation: Κάντε μια δωρεά
       website_and_api_terms: Όροι ιστότοπου και API
index ec845dc7c412426cae4875c7ee7d56fe84f30619..530dad2079f530f8134ee38cd37a020e68baafeb 100644 (file)
@@ -2966,6 +2966,7 @@ en:
         cyclosm: CyclOSM
         cycle_map: Cycle Map
         transport_map: Transport Map
+        tracestracktop_topo: Tracestrack Topo
         hot: Humanitarian
         opnvkarte: ÖPNVKarte
       layers:
@@ -2986,6 +2987,8 @@ en:
       andy_allan: Andy Allan
       opnvkarte_credit: "Tiles courtesy of %{memomaps_link}"
       memomaps: MeMoMaps
+      tracestrack_credit: "Tiles courtesy of %{tracestrack_link}"
+      tracestrack: Tracestrack
       hotosm_credit: "Tiles style by %{hotosm_link} hosted by %{osm_france_link}"
       hotosm_name: Humanitarian OpenStreetMap Team
     site:
index a7d9f8ea2960a6cc55fac310e44dd117378a8236..3fe57337bcaf4fe1d63a3c7974be86c037660dcb 100644 (file)
@@ -357,7 +357,7 @@ es:
         retain_changeset_discussions: Tus discusiones sobre conjuntos de cambios,
           si las hay, se conservarán.
         retain_email: Tu dirección de correo electrónico se conservará.
-        confirm_delete: ¿Lo confirma?
+        confirm_delete: ¿Estás seguro?
         cancel: Cancelar
   accounts:
     edit:
@@ -1795,7 +1795,7 @@ es:
       success: Cuenta confirmada, !gracias por registrarte!
       already active: Esta cuenta ya ha sido confirmada.
       unknown token: Ese código de confirmación ha caducado o no existe.
-      resend_html: Si necesita que le reenviemos el mensaje de confirmación, %{reconfirm_link}.
+      resend_html: Si necesitas que te reenviemos el mensaje de confirmación, %{reconfirm_link}.
       click_here: has clic aquí
     confirm_resend:
       failure: No se ha encontrado el usuario %{name}
@@ -2093,8 +2093,8 @@ es:
           2.0
         introduction_3_creative_commons_url: https://creativecommons.org/licenses/by-sa/2.0/deed.es
         credit_title_html: Cómo dar reconocimiento a OpenStreetMap
-        credit_1_html: 'Cuando utilice datos de OpenStreetMap, deberá hacer las dos
-          cosas siguientes:'
+        credit_1_html: 'Cuando utilices datos de OpenStreetMap, deberás hacer las
+          siguientes dos cosas:'
         credit_2_1: Proporciona crédito a OpenStreetMap mostrando nuestro aviso de
           derechos de autor.
         credit_2_2: Especifica que los datos están disponibles bajo la Licencia de
@@ -2673,7 +2673,7 @@ es:
       grant_access: Otorgar acceso
     authorize_success:
       title: Solicitud de autorización permitida
-      allowed_html: Has concedido acceso a tu cuenta a la aplicación %{app_name}.
+      allowed_html: Has otorgado acceso a tu cuenta a la aplicación %{app_name}.
       verification: El código de verificación es %{code}.
     authorize_failure:
       title: Falló la solicitud de autorización
@@ -2888,7 +2888,7 @@ es:
         administrator: Este usuario es un administrador
         moderator: Este usuario es un moderador
         grant:
-          administrator: Adjudicar acceso de administrador
+          administrator: Otorgar acceso de administrador
           moderator: Adjudicar acceso de moderador
         revoke:
           administrator: Revocar acceso de administrador
@@ -2952,7 +2952,7 @@ es:
       not_revoke_admin_current_user: No se pudo revocar el rol de administrador del
         usuario actual.
     grant:
-      title: Confirmar adjudicación de rol
+      title: Confirmar otorgamiento de rol
       heading: Confirmar adjudicación de rol
       are_you_sure: ¿Estás seguro de que deseas otorgar el rol `%{role}' al usuario
         `%{name}'?
@@ -2962,7 +2962,7 @@ es:
     revoke:
       title: Confirmar revocación de rol
       heading: Confirmar revocación de rol
-      are_you_sure: ¿Está seguro de que desea revocar el rol `%{role}' del usuario
+      are_you_sure: ¿Estás seguro de que deseas revocar el rol `%{role}' del usuario
         `%{name}'?
       confirm: Confirmar
       fail: No se pudo revocar el rol `%{role}' del usuario `%{name}'. Comprueba que
@@ -3006,7 +3006,7 @@ es:
       heading_html: Revocando el bloqueo sobre %{block_on} por %{block_by}
       time_future: Este bloqueo finalizará en %{time}.
       past: Este bloqueo terminó %{time} y no puede ser revocado ahora.
-      confirm: ¿Está seguro de que desea revocar este bloqueo?
+      confirm: ¿Estás seguro de que deseas revocar este bloqueo?
       revoke: ¡Revocar!
       flash: Este bloqueo ha sido revocado.
     helper:
index ff0b9635cb77c3f6bc0ceec9bc5254f2bd651ea3..7446bf54b83cfee34f77bd42b9b5a6444bf22e51 100644 (file)
@@ -3068,6 +3068,7 @@ gl:
         cyclosm: CyclOSM (Ciclista)
         cycle_map: Ciclista
         transport_map: Transporte
+        tracestracktop_topo: Tracestrack Topo
         hot: Humanitario
         opnvkarte: ÖPNVKarte (Transporte)
       layers:
@@ -3086,6 +3087,8 @@ gl:
       andy_allan: Andy Allan
       opnvkarte_credit: Mosaicos cortesía de %{memomaps_link}
       memomaps: MeMoMaps
+      tracestrack_credit: Mosaicos cortesía de %{tracestrack_link}
+      tracestrack: Tracestrack
       hotosm_credit: Estilo de mosaicos do %{hotosm_link} aloxado por %{osm_france_link}
       hotosm_name: equipo humanitario do OpenStreetMap
     site:
index ab854d1e536c6c680895d13645691f3a2b60867e..da1b37ba13b67647d016fb93e0aafc813edfb143 100644 (file)
@@ -3045,6 +3045,7 @@ ia:
         cyclosm: CyclOSM
         cycle_map: Carta cyclista
         transport_map: Carta de transporto
+        tracestracktop_topo: Tracestrack Topo
         hot: Humanitario
         opnvkarte: ÖPNVKarte
       layers:
@@ -3063,6 +3064,8 @@ ia:
       andy_allan: Andy Allan
       opnvkarte_credit: Tegulas fornite per %{memomaps_link}
       memomaps: MeMoMaps
+      tracestrack_credit: Tegulas fornite per %{tracestrack_link}
+      tracestrack: Tracestrack
       hotosm_credit: Stilo de tegulas per %{hotosm_link} albergate per %{osm_france_link}
       hotosm_name: le Equipa Humanitari de OpenStreetMap
     site:
index bd9cb3c7dc073960d8b415400ff69706f53fea49..2600c31f361a2b5c5024148759edd51012f796d2 100644 (file)
@@ -288,6 +288,7 @@ it:
         reopened_at_by_html: Riaperta %{when} da %{user}
       rss:
         title: Note di OpenStreetMap
+        description_all: Un elenco di note segnalate, commentate o chiuse
         description_area: Una lista di note inserite, commentate o chiuse nella tua
           area [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]
         description_item: Feed rss per la nota %{id}
@@ -2126,6 +2127,7 @@ it:
           (informazioni pubbliche della Serbia), 2018.
         contributors_rs_serbia: Serbia
         contributors_rs_rgz: Autorità geodetica serba
+        contributors_rs_open_data_portal: Portale nazionale degli open data
         contributors_si_credit_html: |-
           %{slovenia}: Contiene i dati provenienti dall'%{gu_link} e dal %{mkgp_link}
           (informazioni pubbliche della Slovenia).
@@ -3121,6 +3123,7 @@ it:
       andy_allan: Andy Allan
       opnvkarte_credit: Tasselli per gentile concessione di %{memomaps_link}
       memomaps: MeMoMaps
+      tracestrack_credit: Tasselli per gentile concessione di %{tracestrack_link}
       hotosm_credit: Stile tasselli di %{hotosm_link} ospitato da %{osm_france_link}
       hotosm_name: La squadra di OpenStreetMap Humanitarian
     site:
index 4133eec391f12f7233f178329d0151d87d394c5e..3edc42d98c4a4b0e4cc727df3d7b01dcf4bc44e3 100644 (file)
@@ -7,6 +7,7 @@
 # Author: Cuu508
 # Author: Danieldegroot2
 # Author: Edgars2007
+# Author: Edgarsdna
 # Author: GreenZeb
 # Author: Jmg.cmdi
 # Author: Karlis
@@ -156,6 +157,10 @@ lv:
   datetime:
     distance_in_words_ago:
       half_a_minute: pirms pusminūtes
+      less_than_x_minutes:
+        zero: pirms mazāk nekā %{count} minūtēm
+        one: pirms mazāk nekā %{count} minūtes
+        other: pirms mazāk nekā %{count} minūtēm
   editor:
     default: Noklusējuma (pašlaik %{name})
     id:
@@ -253,6 +258,10 @@ lv:
     anonymous: anonīms
     no_comment: (nav komentāru)
     part_of: Daļa no
+    part_of_relations:
+      zero: '%{count} attiecības'
+      one: '%{count} attiecība'
+      other: '%{count} attiecības'
     download_xml: Lejupielādēt XML
     view_history: Skatīt vēsturi
     view_details: Skatīt detaļas
@@ -385,6 +394,9 @@ lv:
       nearby mapper: Kartētājs tuvējā apkārtnē
       friend: Draugs
     show:
+      title: Mans vadības panelis
+      no_home_location_html: '%{edit_profile_link} un iestatiet savu atrašanās vietu,
+        lai redzētu tuvumā esošos lietotājus.'
       my friends: Mani draugi
       no friends: Tu  vēl neesi pievienojis draugus.
       nearby users: Citi tuvumā esoši lietotāji
@@ -1195,6 +1207,7 @@ lv:
     help: Palīdzība
     about: Par
     copyright: Autortiesības
+    communities: Kopienas
     community: Kopiena
     community_blogs: Kopienas emuāri
     community_blogs_title: OpenStreetMap kopienas locekļu emuāri
@@ -1489,6 +1502,7 @@ lv:
   site:
     about:
       next: Tālāk
+      heading_html: '%{copyright}OpenStreetMap %{br} datu sniedzēji'
       used_by_html: '%{name} darbina kartes datus simtiem mājaslapu, mobilajās aplikācijās
         un aparatūras ierīcēs'
       lede_text: OpenStreetMap būvē kartētāju kopiena, kuri iegulda un uztur datus
@@ -1676,6 +1690,7 @@ lv:
       where_am_i: Kur tas ir?
       where_am_i_title: Aprakstiet pašreizējo atrašanās vietu izmantojot meklētāju
       submit_text: OK
+      reverse_directions_text: Apgriezt virzienu
     key:
       table:
         entry:
@@ -1769,6 +1784,20 @@ lv:
         para_1: Ja tu vēlies labot ko mazu un nav laika lai piereģistrētos vai iemācītos
           kā rediģēt, ir iespējams vienkārši atstāt piezīmi.
         the_map: karte
+    communities:
+      title: Kopienas
+      lede_text: |-
+        OpenStreetMap veido vai izmanto cilvēki no visas pasaules.
+        Daudzi piedalās individuāli, bet citi ir izveidojuši kopienas.
+        Šīs grupas ir dažāda lieluma un pārstāv dažādas ģeogrāfiskās teritorijas - no mazām pilsētām līdz lieliem daudzvalstu reģioniem.
+        Tās var būt arī formālas vai neformālas.
+      local_chapters:
+        list_text: 'Šādas kopienas ir oficiāli izveidotas kā vietējās nodaļas:'
+      other_groups:
+        other_groups_html: |-
+          Nav nepieciešams formāli izveidot grupu tādā pašā apjomā kā vietējās nodaļas.
+          Patiešām, daudzas grupas ļoti veiksmīgi pastāv kā neformāla cilvēku pulcēšanās vai kā
+          kopienas grupa. Tās var izveidot vai pievienoties ikviens. Vairāk lasiet %{communities_wiki_link}.
   traces:
     visibility:
       private: Privāts (kopīgots kā anonīms, nesakārtoti punkti)
@@ -1981,6 +2010,8 @@ lv:
       my profile: Mans profils
       my settings: Mani iestatījumi
       my comments: Mani komentāri
+      my_preferences: Mani iestatījumi
+      my_dashboard: Mans vadības panelis
       blocks on me: Bloki uz mani
       blocks by me: Manis piešķirtie Bloki
       send message: Nosūtīt ziņojumu
@@ -2166,6 +2197,7 @@ lv:
       open_title: 'Neatrisināta piezīme: #%{note_name}'
       closed_title: 'Atrisināta piezīme: #%{note_name}'
       hidden_title: 'Paslēpta piezīme #%{note_name}'
+      event_opened_by_html: Izveidoja %{user} %{time_ago}
       report: Ziņot par šo piezīmi
       anonymous_warning: Šī piezīme ietver komentārus no anonīmiem lietotājiem, kurus
         nepieciešams pārbaudīt neatkarīgi.
@@ -2174,6 +2206,10 @@ lv:
       reactivate: Atkal aktivizēt
       comment_and_resolve: Komentēt un atrisināt
       comment: Komentēt
+      report_link_html: Ja šajā piezīmē ir konfidenciāla informācija, kas jādzēš,
+        varat %{link}.
+      other_problems_resolve: Visas pārējās problēmas, kas saistītas ar piezīmi, lūdzu,
+        atrisiniet paši, pievienojot komentāru.
     new:
       title: Jauna piezīme
       intro: Piezīmes domātas, lai norādītu uz kartes kļūdām. Ja vēlies pamēģināt
@@ -2182,6 +2218,9 @@ lv:
         precīzāk un detalizētāk visu izklāsti, kā arī marķieri novieto pēc iespējas
         pareizākajā pozīcijā. (Lūdzu neizmantojiet personīgo informāciju vai arī informāciju
         no citām ar autortiesībām aizsargātām kartēm.)
+      advice: Jūsu piezīme ir publiska, un to var izmantot kartes atjaunināšanai,
+        tāpēc neievadiet personisku informāciju vai informāciju no kartēm vai direktoriju
+        sarakstiem, uz kuriem attiecas autortiesības.
       add: Pievienot piezīmi
   javascripts:
     close: Aizvērt
@@ -2197,6 +2236,7 @@ lv:
       custom_dimensions: Uzstādīt pielāgotus izmērus
       format: 'Formāts:'
       scale: 'Mērogs:'
+      image_dimensions: Attēlā būs redzams standarta slānis %{width} x %{height}
       download: Lejupielādēt
       short_url: Īsais URL
       include_marker: Iekļaut marķieri
@@ -2228,6 +2268,8 @@ lv:
         data: Kartes dati
         overlays: Iespējot pārklājumus, lai novērstu trūkumus kartei
         title: Slāņi
+      make_a_donation: Veikt ziedojumu
+      website_and_api_terms: Tīmekļa vietnes un API noteikumi
     site:
       edit_tooltip: Rediģēt karti
       edit_disabled_tooltip: Pietuvini, lai rediģētu karti
@@ -2246,10 +2288,12 @@ lv:
         unhide_comment: parādīt
     edit_help: Pārvieto karti un pietuvini vietai, kuru vēlies labot, tad spied šeit.
     directions:
+      ascend: Kāpums
       engines:
         fossgis_osrm_car: Ar mašīnu (OSRM)
         graphhopper_bicycle: Ar velosipēdu (GraphHopper)
         graphhopper_foot: Ar kājām (GraphHopper)
+      descend: Kritums
       directions: Norādes
       distance: Attālums
       errors:
@@ -2285,7 +2329,7 @@ lv:
         end_oneway_without_exit: Vienvirziena ceļa beigas pie %{name}
         roundabout_with_exit: Pēc apkārtceļa nogriezieties uz izejas %{exit} pie %{name}
         unnamed: nenosaukts ceļš
-        courtesy: Virzienos, pieklājīgi no %{link}
+        courtesy: Norādes no %{link}
         exit_counts:
           first: "1."
           second: "2."
index 9828a724543ffb0c23bd25bb0f458e1931b96b57..f6045106faf0271f872ba376c330914d2ac31510 100644 (file)
@@ -3032,6 +3032,7 @@ mk:
         cyclosm: CyclOSM
         cycle_map: Велосипедска
         transport_map: Сообраќајна
+        tracestracktop_topo: Tracestrack Топо
         hot: Хуманитарна
         opnvkarte: ÖPNVKarte
       layers:
@@ -3050,6 +3051,8 @@ mk:
       andy_allan: Енди Алан
       opnvkarte_credit: Полињата се доставени од %{memomaps_link}
       memomaps: MeMoMaps
+      tracestrack_credit: Полињата се доставени од %{tracestrack_link}
+      tracestrack: Tracestrack
       hotosm_credit: Стилот на полињата е од %{hotosm_link} вдомен од %{osm_france_link}
       hotosm_name: Екипа на Хуманитарната OpenStreetMap
     site:
index 4e140327aa901fc92014605253171a8204504864..2b594f0bbf5565b08c7d083cfd77b5be512b67d7 100644 (file)
@@ -413,7 +413,7 @@ nn:
     query:
       title: Finn objekt
       introduction: Klikk på kartet for å visa objekt i nærleiken.
-      nearby: Nærliggjande funksjonar
+      nearby: Nærliggjande objekt
       enclosing: Omgjevande objekt
   changesets:
     changeset_paging_nav:
index 3f1b8ee129eec9e09a6e1ecb36083f3b5f88b727..f290f65e46d93903bda685c7aea57bc1aa7d5555 100644 (file)
@@ -14,6 +14,7 @@
 # Author: Duke of Wikipädia
 # Author: EVinente
 # Author: Eduardoaddad
+# Author: Felipe L. Ewald
 # Author: Fmca
 # Author: FranciscoDS
 # Author: Ftrebien
@@ -286,6 +287,7 @@ pt:
         reopened_at_by_html: Reativado %{when} por %{user}
       rss:
         title: Notas do OpenStreetMap
+        description_all: Uma lista de notas relatadas, comentadas ou fechadas
         description_area: Uma lista de notas relatadas, comentadas ou encerradas na
           sua área [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]
         description_item: Um feed RSS para a nota %{id}
@@ -2808,6 +2810,7 @@ pt:
       remove as friend: Desfazer amizade
       add as friend: Adicionar como amigo
       mapper since: 'Mapeador desde:'
+      uid: 'ID do usário:'
       ct status: 'Termos do contribuidor:'
       ct undecided: Não decidido
       ct declined: Discordo
@@ -3090,6 +3093,7 @@ pt:
         cyclosm: CyclOSM
         cycle_map: Ciclístico
         transport_map: Transporte Público
+        tracestracktop_topo: Tracestrack Topo
         hot: Humanitário
         opnvkarte: ÖPNVKarte
       layers:
@@ -3108,6 +3112,8 @@ pt:
       andy_allan: Andy Allan
       opnvkarte_credit: Mosaico cortesia de %{memomaps_link}
       memomaps: MeMoMaps
+      tracestrack_credit: Mosaico cortesia de %{tracestrack_link}
+      tracestrack: Tracestrack
       hotosm_credit: Estilo de mosaico por %{hotosm_link} hospedado por %{osm_france_link}
       hotosm_name: Humanitarian OpenStreetMap Team
     site:
index f96ebc04874d4e4cb0c124477477c95eac93d5e0..b3626cb1554a5474c31cc000f82677ba7d6fd1ed 100644 (file)
@@ -79,6 +79,7 @@
 # Author: Putnik
 # Author: Pvwww
 # Author: Redredsonia
+# Author: Rich Flight22
 # Author: Riliam
 # Author: Rivka Silinsky
 # Author: Ruila
@@ -964,6 +965,7 @@ ru:
           ambulance_station: Станция скорой медицинской помощи
           assembly_point: Место сбора
           defibrillator: Дефибриллятор
+          fire_extinguisher: Огнетушитель
           fire_water_pond: Пожарный водоём
           landing_site: Место аварийной посадки
           phone: Телефон экстренной связи
@@ -1019,6 +1021,7 @@ ru:
           unclassified: Дорога местного значения
           "yes": Дорога
         historic:
+          aircraft: Историческое воздушное судно
           archaeological_site: Раскопки
           battlefield: Поле боя
           boundary_stone: Пограничный камень
@@ -2109,6 +2112,7 @@ ru:
         contributors_nl_netherlands: Нидерланды
         contributors_nz_new_zealand: Новая Зеландия
         contributors_nz_cc_by: CC BY 4.0
+        contributors_rs_serbia: Сербия
         contributors_si_slovenia: Словения
         contributors_es_spain: Испания
         contributors_es_ign: IGN
index c80fdce462dbb9564139fc6cdc1777906c171570..6a81b5d2a2d152b0a28079f84b5976abe8851187 100644 (file)
@@ -3115,6 +3115,7 @@ sl:
         cyclosm: CyclOSM
         cycle_map: Kolesarska karta
         transport_map: Prometna karta
+        tracestracktop_topo: Tracestrack Topo
         hot: Humanitarno
         opnvkarte: ÖPNVKarte
       layers:
@@ -3133,6 +3134,8 @@ sl:
       andy_allan: Andy Allan
       opnvkarte_credit: Ploščice z dovoljenjem %{memomaps_link}
       memomaps: MeMoMaps
+      tracestrack_credit: Ploščice z dovoljenjem %{tracestrack_link}
+      tracestrack: Tracestrack
       hotosm_credit: Slog ploščic %{hotosm_link}, gosti jih %{osm_france_link}
       hotosm_name: Humanitarna ekipa OpenStreetMap
     site:
index 08a76ff6bed1c3c2a03f711ed245650992ae7b00..b6f09dd7365f59582ecd3aad6f2a7f8998a9620f 100644 (file)
@@ -49,6 +49,7 @@
 # Author: VickyC
 # Author: Westis
 # Author: WikiPhoenix
+# Author: Yupik
 # Author: Zvenzzon
 ---
 sv:
@@ -1844,6 +1845,7 @@ sv:
       home location: Hemposition
       no home location: Du har inte angivit någon hemposition.
       update home location on click: Uppdatera hemposition när jag klickar på kartan?
+      show: Visa
     update:
       success: Profil uppdaterad.
       failure: Kunde inte uppdatera profilen.
index 2e3dcf1f44775ddaaea6ad2b877459b6f3a24455..301b5d8cd29b973af586225673adb8671b98c005 100644 (file)
@@ -2731,7 +2731,7 @@ tr:
         paragraph_2: Katkıda bulunmaya başlamak için kaydolun. Hesabınızı onaylamak
           için bir e-posta göndereceğiz.
       display name description: Herkes tarafından görünecek bir kullanıcı adı. Bu
-        adı istediğin zaman 'tercihlerim' bölümünde değiştirebilirsin.
+        adı istediğiniz zaman ayarlar bölümünde değiştirebilirsiniz.
       external auth: 'Üçüncü Taraf Kimlik Doğrulaması:'
       use external auth: 'Alternatif olarak bir üçüncü parti uygulaması kullanarak
         oturum aç:'
index 6d242234f9a64861e033a79f2b598f2c72f494d9..f29d9382eee1dd3dee4ac5fa0aede3f8216b39bd 100644 (file)
@@ -39,6 +39,7 @@
 # Author: LaoShuBaby
 # Author: Lepus
 # Author: Liangent
+# Author: LittlePaw365
 # Author: Liuxinyu970226
 # Author: Mmyangfl
 # Author: Mywood
@@ -54,6 +55,7 @@
 # Author: StarrySky
 # Author: StephDC
 # Author: TianyinLee
+# Author: Tntchn
 # Author: TsuyaMarisa
 # Author: Vikarna
 # Author: VulpesVulpes825
@@ -303,6 +305,7 @@ zh-CN:
         reopened_at_by_html: '%{user}于%{when}重新激活'
       rss:
         title: OpenStreetMap 注记
+        description_all: 已报告、评论或关闭的注记列表
         description_area: 在您的区域 [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]
           报告、评论或关闭的注记列表
         description_item: 注记 %{id} 的简易信息聚合馈送
@@ -1278,7 +1281,7 @@ zh-CN:
           carpet: 地毯店
           charity: 慈善商店
           cheese: 奶酪店
-          chemist: 化学品
+          chemist: 药妆
           chocolate: 巧克力店
           clothes: 服装店
           coffee: 咖啡店
@@ -2577,6 +2580,7 @@ zh-CN:
       remove as friend: 删除朋友
       add as friend: 添加朋友
       mapper since: 绘图者注册于:
+      uid: 用户ID:
       ct status: 贡献者条款:
       ct undecided: 未决定
       ct declined: 已拒绝
@@ -2839,6 +2843,7 @@ zh-CN:
         cyclosm: 自行车地图
         cycle_map: 骑行运动地图
         transport_map: 交通运输地图
+        tracestracktop_topo: 地形地貌地图
         hot: 人道救援地图
         opnvkarte: 公共交通地图
       layers:
@@ -2857,6 +2862,8 @@ zh-CN:
       andy_allan: Andy Allan
       opnvkarte_credit: '%{memomaps_link}提供的图块'
       memomaps: MeMoMaps
+      tracestrack_credit: '%{tracestrack_link}提供的图块'
+      tracestrack: 踪迹地图
       hotosm_credit: 由%{osm_france_link}托管的%{hotosm_link}图块风格
       hotosm_name: 人道主义开放街图团队
     site:
@@ -3005,8 +3012,8 @@ zh-CN:
       flash: 修订已销毁。
       error: 销毁该修订时出错。
   validations:
-    leading_whitespace: 具有领先的空白
-    trailing_whitespace: 具有尾随空白
+    leading_whitespace: 有前导空格
+    trailing_whitespace: 有尾随空格
     invalid_characters: 包含无效字符
     url_characters: 包含特殊URL字符 (%{characters})
 ...
index 17a708be0107d6a6cc8f3a7841e21ca61593d571..b61dd8fa6867fc3f4155fdba09d2ec86844e6a89 100644 (file)
@@ -37,6 +37,7 @@
 # Author: StarrySky
 # Author: StephDC
 # Author: SupaplexTW
+# Author: Tntchn
 # Author: TongcyDai
 # Author: Wehwei
 # Author: Winston Sung
@@ -1249,7 +1250,7 @@ zh-TW:
           carpet: 地毯店
           charity: 慈善商店
           cheese: 起士店鋪
-          chemist: 化學材料行
+          chemist: 藥妝店
           chocolate: 巧克力店鋪
           clothes: 服飾店
           coffee: 咖啡店
@@ -1931,7 +1932,7 @@ zh-TW:
           儘管 OpenStreetMap 是開放資料,我們不對第三方提供免費的地圖 API。
           請參閱我們的%{api_usage_policy_link}、%{tile_usage_policy_link}、和%{nominatim_usage_policy_link}。
         more_2_1_api_usage_policy: API 使用方針
-        more_2_1_tile_usage_policy: å½±å\83\8få¡\8a使用方針
+        more_2_1_tile_usage_policy: å\9c\96ç£\9a使用方針
         more_2_1_nominatim_usage_policy: 提名使用方針
         contributors_title_html: 我們的貢獻者
         contributors_intro_html: 我們的貢獻者為成千上萬的人。我們也收納了從國家測繪機構及其他來源等取得的開放版權資料,其中包括:
@@ -2823,6 +2824,7 @@ zh-TW:
         cyclosm: CyclOSM
         cycle_map: 自行車地圖
         transport_map: 交通運輸地圖
+        tracestracktop_topo: 蹤跡地圖地形
         hot: 人道救援
         opnvkarte: 公共交通地圖
       layers:
@@ -2835,13 +2837,15 @@ zh-TW:
       openstreetmap_contributors: OpenStreetMap 貢獻者
       make_a_donation: 捐款
       website_and_api_terms: 網站和 API 條款
-      cyclosm_credit: ç\94± %{osm_france_link} ä»£ç®¡ç\9a\84 %{cyclosm_link} æ\89\80æ\8f\90ä¾\9bå½±å\83\8få¡\8a樣式
+      cyclosm_credit: ç\94± %{osm_france_link} ä»£ç®¡ç\9a\84 %{cyclosm_link} æ\89\80æ\8f\90ä¾\9bå\9c\96ç£\9a樣式
       osm_france: OpenStreetMap 法國
-      thunderforest_credit: '%{thunderforest_link} æ\8f\90ä¾\9bç\9a\84å½±å\83\8få¡\8a'
+      thunderforest_credit: '%{thunderforest_link} æ\8f\90ä¾\9bç\9a\84å\9c\96ç£\9a'
       andy_allan: Andy Allan
-      opnvkarte_credit: '%{memomaps_link} æ\8f\90ä¾\9bç\9a\84å½±å\83\8få¡\8a'
+      opnvkarte_credit: '%{memomaps_link} æ\8f\90ä¾\9bç\9a\84å\9c\96ç£\9a'
       memomaps: MeMoMaps
-      hotosm_credit: 由 %{osm_france_link} 代管的 %{hotosm_link} 所提供影像塊樣式
+      tracestrack_credit: '%{tracestrack_link} 提供的圖磚'
+      tracestrack: 蹤跡地圖
+      hotosm_credit: 由 %{osm_france_link} 代管的 %{hotosm_link} 所提供圖磚樣式
       hotosm_name: OpenStreetMap 人道主義團隊
     site:
       edit_tooltip: 編輯地圖
index 415f8a01bd9b5dc1b677fe8e3261b51ea709c8f4..404e7b0a3fcf6345fec4f22af26a022676f91392 100644 (file)
@@ -102,6 +102,8 @@ OpenStreetMap::Application.routes.draw do
     post "notes/editPOIexec" => "api/notes#comment"
     get "notes/getGPX" => "api/notes#index", :format => "gpx"
     get "notes/getRSSfeed" => "api/notes#feed", :format => "rss"
+
+    resources :user_blocks, :only => [:show], :constraints => { :id => /\d+/ }, :controller => "api/user_blocks", :as => :api_user_blocks
   end
 
   # Data browsing
index 3ea298efcb4378f4073397d02d301d785c772ff2..e228247e03d617b5a4d1cd957b21b6498dca01e3 100644 (file)
@@ -117,6 +117,8 @@ fossgis_valhalla_url: "https://valhalla1.openstreetmap.de/route"
 #wikipedia_auth_secret: ""
 # Thunderforest authentication details
 #thunderforest_key: ""
+# Tracestrack authentication details
+#tracestrack_key: ""
 # Key for generating TOTP tokens
 #totp_key: ""
 # Enforce Content-Security-Policy
index 4339844140e2df80bcc856a7cfff56137dacb031..b4bc4a5abd21345126dd08b75fe88381dfd940fc 100644 (file)
@@ -199,7 +199,7 @@ module Api
       assert_equal Settings.api_version, js["version"]
       assert_equal Settings.generator, js["generator"]
       assert_equal changeset.id, js["changeset"]["id"]
-      assert js["changeset"]["open"]
+      assert_operator js["changeset"], :[], "open"
       assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
       assert_nil js["changeset"]["closed_at"]
       assert_nil js["changeset"]["tags"]
@@ -215,7 +215,7 @@ module Api
       assert_equal Settings.api_version, js["version"]
       assert_equal Settings.generator, js["generator"]
       assert_equal changeset.id, js["changeset"]["id"]
-      assert js["changeset"]["open"]
+      assert_operator js["changeset"], :[], "open"
       assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
       assert_nil js["changeset"]["closed_at"]
       assert_nil js["changeset"]["tags"]
@@ -697,10 +697,10 @@ module Api
 
       # check that the changeset bbox is within bounds
       cs = Changeset.find(changeset_id)
-      assert cs.min_lon >= -180 * GeoRecord::SCALE, "Minimum longitude (#{cs.min_lon / GeoRecord::SCALE}) should be >= -180 to be valid."
-      assert cs.max_lon <= 180 * GeoRecord::SCALE, "Maximum longitude (#{cs.max_lon / GeoRecord::SCALE}) should be <= 180 to be valid."
-      assert cs.min_lat >= -90 * GeoRecord::SCALE, "Minimum latitude (#{cs.min_lat / GeoRecord::SCALE}) should be >= -90 to be valid."
-      assert cs.max_lat <= 90 * GeoRecord::SCALE, "Maximum latitude (#{cs.max_lat / GeoRecord::SCALE}) should be <= 90 to be valid."
+      assert_operator cs.min_lon, :>=, -180 * GeoRecord::SCALE, "Minimum longitude (#{cs.min_lon / GeoRecord::SCALE}) should be >= -180 to be valid."
+      assert_operator cs.max_lon, :<=, 180 * GeoRecord::SCALE, "Maximum longitude (#{cs.max_lon / GeoRecord::SCALE}) should be <= 180 to be valid."
+      assert_operator cs.min_lat, :>=, -90 * GeoRecord::SCALE, "Minimum latitude (#{cs.min_lat / GeoRecord::SCALE}) should be >= -90 to be valid."
+      assert_operator cs.max_lat, :<=, 90 * GeoRecord::SCALE, "Maximum latitude (#{cs.max_lat / GeoRecord::SCALE}) should be <= 90 to be valid."
     end
 
     ##
index 95658842b8e498212acf6610e3aaf92ef8d52866..9e680dd068cd9c8fa69fdcb37214aa4a137944cb 100644 (file)
@@ -258,8 +258,7 @@ module Api
 
       # valid delete should return the new version number, which should
       # be greater than the old version number
-      assert @response.body.to_i > node.version,
-             "delete request should return a new version number for node"
+      assert_operator @response.body.to_i, :>, node.version, "delete request should return a new version number for node"
 
       # deleting the same node twice doesn't work
       xml = xml_for_node(node)
index 7f2c196654476c6499f058728952e0e2a17348aa..7d011c17ff3678c76dce61c391cee4acf7ddaf4a 100644 (file)
@@ -612,8 +612,7 @@ module Api
 
       # valid delete should return the new version number, which should
       # be greater than the old version number
-      assert @response.body.to_i > multi_tag_relation.version,
-             "delete request should return a new version number for relation"
+      assert_operator @response.body.to_i, :>, multi_tag_relation.version, "delete request should return a new version number for relation"
 
       # this won't work since the relation is already deleted
       xml = update_changeset(xml_for_relation(deleted_relation), changeset.id)
diff --git a/test/controllers/api/user_blocks_controller_test.rb b/test/controllers/api/user_blocks_controller_test.rb
new file mode 100644 (file)
index 0000000..c8bdc1d
--- /dev/null
@@ -0,0 +1,36 @@
+require "test_helper"
+
+module Api
+  class UserBlocksControllerTest < ActionDispatch::IntegrationTest
+    def test_routes
+      assert_routing(
+        { :path => "/api/0.6/user_blocks/1", :method => :get },
+        { :controller => "api/user_blocks", :action => "show", :id => "1" }
+      )
+      assert_routing(
+        { :path => "/api/0.6/user_blocks/1.json", :method => :get },
+        { :controller => "api/user_blocks", :action => "show", :id => "1", :format => "json" }
+      )
+    end
+
+    def test_show
+      block = create(:user_block)
+
+      get api_user_block_path(:id => block)
+      assert_response :success
+      assert_select "user_block[id='#{block.id}']", 1
+
+      get api_user_block_path(:id => block, :format => "json")
+      assert_response :success
+      js = ActiveSupport::JSON.decode(@response.body)
+      assert_not_nil js
+      assert_equal block.id, js["user_block"]["id"]
+    end
+
+    def test_show_not_found
+      get api_user_block_path(:id => 123)
+      assert_response :not_found
+      assert_equal "text/plain", @response.media_type
+    end
+  end
+end
index aa4bf1e9de85010ac51ba86793a421c6a2a39b84..8e7079b851a2cf7b79ae62bd3495e1dd7d8d43e2 100644 (file)
@@ -731,7 +731,7 @@ module Api
     def check_json_details(js, user, include_private, include_email)
       assert_equal user.id, js["user"]["id"]
       assert_equal user.description, js["user"]["description"]
-      assert js["user"]["contributor_terms"]["agreed"]
+      assert_operator js["user"]["contributor_terms"], :[], "agreed"
 
       if include_private
         assert_not js["user"]["contributor_terms"]["pd"]
index 0cf30e4fffb176fb1d34b931fcab7934f4cf1a37..2bed0e5d67e7644ad1165471c55c53501cbef515 100644 (file)
@@ -379,8 +379,7 @@ module Api
       # check the returned value - should be the new version number
       # valid delete should return the new version number, which should
       # be greater than the old version number
-      assert @response.body.to_i > way.version,
-             "delete request should return a new version number for way"
+      assert_operator @response.body.to_i, :>, way.version, "delete request should return a new version number for way"
 
       # this won't work since the way is already deleted
       xml = xml_for_way(deleted_way)
index a71b5e8feb615773063a7c435c3a23350f524d48..79fd7a571e5f7b919d85b796d5baa879588c2663 100644 (file)
@@ -321,7 +321,7 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
   ##
   # check the result of a feed
   def check_feed_result(changesets)
-    assert changesets.size <= 20
+    assert_operator changesets.size, :<=, 20
 
     assert_select "feed", :count => [changesets.size, 1].min do
       assert_select "> title", :count => 1, :text => /^Changesets/
index 16a77624c75ee8dabc02fb62bb85242e44ee6631..27022c973748deaa3b0f9937d728824b5532ca16 100644 (file)
@@ -356,7 +356,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     assert_response :success
     assert_template "revoke"
     b = UserBlock.find(active_block.id)
-    assert b.ends_at - Time.now.utc > 100
+    assert_operator b.ends_at - Time.now.utc, :>, 100
 
     # Check that revoking a block works using POST
     post revoke_user_block_path(:id => active_block, :confirm => true)
index d842390388473757180b18ecd41118df0065d696..9aec035d1c45006b74cfb176dfbc85b08950c256 100644 (file)
@@ -80,7 +80,7 @@ class LocaleTest < ActiveSupport::TestCase
   end
 
   def test_available
-    assert Locale.available.count <= I18n.available_locales.count
+    assert_operator Locale.available.count, :<=, I18n.available_locales.count
   end
 
   def test_preferred
index 2a42de12366e0a58678859e73d17d947ecf3203e..9bfd734969d34aa548a13aac62bdb981c31da550 100644 (file)
@@ -61,6 +61,6 @@ class PasswordHashTest < ActiveSupport::TestCase
     format = Argon2::HashFormat.new(hash)
 
     assert_equal "argon2id", format.variant
-    assert format.version <= 19
+    assert_operator format.version, :<=, 19
   end
 end
index a0a1023bb5a558235350d3f2bb74f115acb5e239..a32e1ac205b14a29e67f2e3d47d9bb203385bb2a 100644 (file)
@@ -20,7 +20,7 @@ class ShortLinkTest < ActiveSupport::TestCase
       # smaller range.
       distance = Math.sqrt(((lat - lat2)**2) + ((lon - lon2)**2))
       max_distance = 360.0 / (1 << (zoom + 8)) * 0.5 * Math.sqrt(5)
-      assert max_distance > distance, "Maximum expected error exceeded: #{max_distance} <= #{distance} for (#{lat}, #{lon}, #{zoom})."
+      assert_operator max_distance, :>, distance, "Maximum expected error exceeded: #{max_distance} <= #{distance} for (#{lat}, #{lon}, #{zoom})."
     end
   end
 
index 5a55c5838cb6bda7cb6bb4ee776e3ac53cc7e1b6..87e981c6426500443bcbf6811cef581f8ffce9b1 100644 (file)
@@ -9,9 +9,9 @@ class AccountDeletionTest < ApplicationSystemTestCase
   test "the status is deleted and the personal data removed" do
     visit edit_account_path
 
-    click_on "Delete Account..."
+    click_link "Delete Account..."
     accept_confirm do
-      click_on "Delete Account"
+      click_link "Delete Account"
     end
 
     assert_current_path root_path
@@ -23,9 +23,9 @@ class AccountDeletionTest < ApplicationSystemTestCase
   test "the user is signed out after deletion" do
     visit edit_account_path
 
-    click_on "Delete Account..."
+    click_link "Delete Account..."
     accept_confirm do
-      click_on "Delete Account"
+      click_link "Delete Account"
     end
 
     assert_content "Log In"
@@ -34,9 +34,9 @@ class AccountDeletionTest < ApplicationSystemTestCase
   test "the user is shown a confirmation flash message" do
     visit edit_account_path
 
-    click_on "Delete Account..."
+    click_link "Delete Account..."
     accept_confirm do
-      click_on "Delete Account"
+      click_link "Delete Account"
     end
 
     assert_content "Account Deleted"
index 31e6d7b075e3ba3b9ebb07d6efc3177c0eedeca9..554b89a6db05a3ec2b3353acfe69d9b78c088cf9 100644 (file)
@@ -10,7 +10,7 @@ class DiaryEntrySystemTest < ApplicationSystemTestCase
     sign_in_as(create(:user))
     visit diary_entries_path
 
-    click_on "Send a message to the author"
+    click_link "Send a message to the author"
 
     assert_content "Send a new message"
     assert_equal "Re: #{@diary_entry.title}", page.find_field("Subject").value
index b9b989c075132a9604d01c911dc2017f2613538f..a40306e3c7b1a5064770d8bdbd345eff47750672 100644 (file)
@@ -80,21 +80,21 @@ class IssuesTest < ApplicationSystemTestCase
     # No issues against the user
     visit issues_path
     fill_in "search_by_user", :with => good_user.display_name
-    click_on "Search"
+    click_button "Search"
     assert_no_content I18n.t("issues.index.user_not_found")
     assert_content I18n.t("issues.index.issues_not_found")
 
     # User doesn't exist
     visit issues_path
     fill_in "search_by_user", :with => "Nonexistent User"
-    click_on "Search"
+    click_button "Search"
     assert_content I18n.t("issues.index.user_not_found")
     assert_content I18n.t("issues.index.issues_not_found")
 
     # Find Issue against bad_user
     visit issues_path
     fill_in "search_by_user", :with => bad_user.display_name
-    click_on "Search"
+    click_button "Search"
     assert_no_content I18n.t("issues.index.user_not_found")
     assert_no_content I18n.t("issues.index.issues_not_found")
   end
@@ -106,7 +106,7 @@ class IssuesTest < ApplicationSystemTestCase
     visit issue_path(issue)
 
     fill_in :issue_comment_body, :with => "test comment"
-    click_on "Add Comment"
+    click_button "Add Comment"
     assert_content I18n.t("issue_comments.create.comment_created")
     assert_content "test comment"
 
@@ -123,7 +123,7 @@ class IssuesTest < ApplicationSystemTestCase
 
     fill_in :issue_comment_body, :with => "reassigning to moderators"
     check :reassign
-    click_on "Add Comment"
+    click_button "Add Comment"
 
     assert_content "and the issue was reassigned"
     assert_current_path issues_path(:status => "open")
@@ -140,7 +140,7 @@ class IssuesTest < ApplicationSystemTestCase
 
     fill_in :issue_comment_body, :with => "reassigning to moderators"
     check :reassign
-    click_on "Add Comment"
+    click_button "Add Comment"
 
     assert_content "and the issue was reassigned"
     assert_current_path issue_path(issue)
index 59a7209f5b4d3728fbb8f3049e4db4a03f0326f4..b071b1f73842663839dd9ad81c670d6d333fa1dd 100644 (file)
@@ -5,7 +5,7 @@ class PreferencesTest < ApplicationSystemTestCase
     sign_in_as(create(:user))
 
     visit edit_preferences_path
-    click_on "Update Preferences"
+    click_button "Update Preferences"
 
     assert_content "Preferences updated"
   end
@@ -15,7 +15,7 @@ class PreferencesTest < ApplicationSystemTestCase
 
     visit edit_preferences_path
     fill_in "Preferred Languages", :with => "fr"
-    click_on "Update Preferences"
+    click_button "Update Preferences"
 
     assert_content "Préférences mises à jour"
   end
index 3504ab061fdeb5c4270036efa49807b1a9c9427f..15ef1ad3c5177f8ff0e01cf8d689395dc08bb8a4 100644 (file)
@@ -19,14 +19,14 @@ class ReportDiaryCommentTest < ApplicationSystemTestCase
     visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
     assert_content @diary_entry.title
 
-    click_on I18n.t("diary_entries.diary_comment.report")
+    click_link I18n.t("diary_entries.diary_comment.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.diary_comment.spam_label")
     fill_in "report_details", :with => "This comment is spam"
     assert_difference "Issue.count", 1 do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     assert_content "Your report has been registered successfully"
index efb1070653de48b766cdaf7c5dc6221cdd5bbf97..d4e49b714ffd32b9e2d4077926863eae7fc41efc 100644 (file)
@@ -18,14 +18,14 @@ class ReportDiaryEntryTest < ApplicationSystemTestCase
     visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
     assert_content @diary_entry.title
 
-    click_on I18n.t("diary_entries.diary_entry.report")
+    click_link I18n.t("diary_entries.diary_entry.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.diary_entry.spam_label")
     fill_in "report_details", :with => "This is advertising"
     assert_difference "Issue.count", 1 do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     assert_content "Your report has been registered successfully"
@@ -42,14 +42,14 @@ class ReportDiaryEntryTest < ApplicationSystemTestCase
     visit diary_entry_path(@diary_entry.user.display_name, @diary_entry)
     assert_content @diary_entry.title
 
-    click_on I18n.t("diary_entries.diary_entry.report")
+    click_link I18n.t("diary_entries.diary_entry.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.diary_entry.spam_label")
     fill_in "report_details", :with => "This is advertising"
     assert_no_difference "Issue.count" do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     issue.reload
index 79894eb897d4a514e3ebb94b5a89a680a1bcedf5..b7e1bfc9eaebd4c7252e383871d31b9cd28a6e40 100644 (file)
@@ -14,14 +14,14 @@ class ReportNoteTest < ApplicationSystemTestCase
     sign_in_as(create(:user))
     visit note_path(note)
 
-    click_on I18n.t("notes.show.report")
+    click_link I18n.t("notes.show.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.note.spam_label")
     fill_in "report_details", :with => "This is spam"
     assert_difference "Issue.count", 1 do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     assert_content "Your report has been registered successfully"
@@ -35,14 +35,14 @@ class ReportNoteTest < ApplicationSystemTestCase
     sign_in_as(create(:user))
     visit note_path(note)
 
-    click_on I18n.t("notes.show.report")
+    click_link I18n.t("notes.show.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.note.spam_label")
     fill_in "report_details", :with => "This is spam"
     assert_difference "Issue.count", 1 do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     assert_content "Your report has been registered successfully"
index 7a9e800c8c0da99ebf7351d6a863d9c8cec8ba7a..9a0abe9ea2e5920a78cc8e87f706f661f328c207 100644 (file)
@@ -14,14 +14,14 @@ class ReportUserTest < ApplicationSystemTestCase
     sign_in_as(create(:user))
     visit user_path(user)
 
-    click_on I18n.t("users.show.report")
+    click_link I18n.t("users.show.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.user.vandal_label")
     fill_in "report_details", :with => "This user is a vandal"
     assert_difference "Issue.count", 1 do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     assert_content "Your report has been registered successfully"
@@ -35,14 +35,14 @@ class ReportUserTest < ApplicationSystemTestCase
     sign_in_as(create(:user))
     visit user_path(user)
 
-    click_on I18n.t("users.show.report")
+    click_link I18n.t("users.show.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.user.vandal_label")
     fill_in "report_details", :with => "This user is a vandal"
     assert_difference "Issue.count", 1 do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     assert_content "Your report has been registered successfully"
@@ -52,14 +52,14 @@ class ReportUserTest < ApplicationSystemTestCase
 
     visit user_path(user)
 
-    click_on I18n.t("users.show.report")
+    click_link I18n.t("users.show.report")
     assert_content "Report"
     assert_content I18n.t("reports.new.disclaimer.intro")
 
     choose I18n.t("reports.new.categories.user.spam_label")
     fill_in "report_details", :with => "This user is a spammer"
     assert_no_difference "Issue.count" do
-      click_on "Create Report"
+      click_button "Create Report"
     end
 
     assert_content "Your report has been registered successfully"
index a097b63747a1281f82ee7e1b658580bbad7c42e9..fc27b7c1884ed606823f660d9c2ec73f5059bfa5 100644 (file)
@@ -6,8 +6,8 @@ class UserLogoutTest < ApplicationSystemTestCase
     sign_in_as(user)
     assert_no_content "Log In"
 
-    click_on user.display_name
-    click_on "Log Out"
+    click_button user.display_name
+    click_link "Log Out"
     assert_content "Log In"
   end
 
@@ -17,8 +17,8 @@ class UserLogoutTest < ApplicationSystemTestCase
     visit traces_path
     assert_no_content "Log In"
 
-    click_on user.display_name
-    click_on "Log Out"
+    click_button user.display_name
+    click_link "Log Out"
     assert_content "Log In"
     assert_content "Public GPS Traces"
   end
index 5bd88f5a445cadba27891cb62a4af897a4445710..88899d7105b2fc2b74a896c7291a017c7f080701 100644 (file)
@@ -4,7 +4,7 @@ class UserSignupTest < ApplicationSystemTestCase
   test "Sign up from login page" do
     visit login_path
 
-    click_on "Register now"
+    click_link "Register now"
 
     assert_content "Confirm Password"
   end
@@ -13,7 +13,7 @@ class UserSignupTest < ApplicationSystemTestCase
     user = build(:user)
 
     visit root_path
-    click_on "Sign Up"
+    click_link "Sign Up"
     fill_in "Email", :with => user.email
     fill_in "Email Confirmation", :with => user.email
     fill_in "Display Name", :with => user.display_name
@@ -22,7 +22,7 @@ class UserSignupTest < ApplicationSystemTestCase
     click_button "Sign Up"
 
     assert_content "Contributor terms"
-    click_on "Cancel"
+    click_button "Cancel"
 
     assert_current_path "https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined"
   end
index 30b923732414805ffa98ec08f7c3e409cd24596d..e4cca1eab5bba38a97fefb866aeb4a0b626a3ca3 100644 (file)
@@ -10,7 +10,7 @@ class UserStatusChangeTest < ApplicationSystemTestCase
     user = create(:user, :suspended)
     visit user_path(user)
     accept_confirm do
-      click_on "Unsuspend"
+      click_link "Unsuspend"
     end
 
     assert_no_content "Unsuspend"
@@ -22,7 +22,7 @@ class UserStatusChangeTest < ApplicationSystemTestCase
     user = create(:user, :suspended)
     visit user_path(user)
     accept_confirm do
-      click_on "Confirm"
+      click_link "Confirm"
     end
 
     assert_no_content "Unsuspend"
index 349d0a5bf742c4c97faf980f6055118a4ea10dad..539daaa30933c5e9c8fb3fd3aac278d6cca3cba8 100644 (file)
@@ -13,7 +13,7 @@ class ViewCommunitiesTest < ApplicationSystemTestCase
 
     visit edit_preferences_path
     fill_in "Preferred Languages", :with => "fr"
-    click_on "Update Preferences"
+    click_button "Update Preferences"
 
     visit "/communities"
     assert_link "OpenStreetMap États-Unis", :href => "https://www.openstreetmap.us/"
index 7157abf5a71ed0ef153b70c50c3436a6b99c00c2..68749c0f70f595e00b322b21acee0215b7d46b51 100644 (file)
@@ -245,7 +245,7 @@ module ActiveSupport
       visit login_path
       fill_in "username", :with => user.email
       fill_in "password", :with => "test"
-      click_on "Login", :match => :first
+      click_button "Login", :match => :first
     end
 
     def session_for(user)
index 6e8e20ba68fe5deac22fbfa09a2e5b61a49f9e2f..0e51f34086a974478e44550921495494ba9f5359 100644 (file)
@@ -61,6 +61,14 @@ L.OSM.HOT = L.OSM.TileLayer.extend({
   }
 });
 
+L.OSM.TracestrackTopo = L.OSM.TileLayer.extend({
+  options: {
+    url: 'https://tile.tracestrack.com/topo__/{z}/{x}/{y}.png?key={apikey}',
+    maxZoom: 19,
+    attribution: '© <a href="https://www.openstreetmap.org/copyright" target="_blank">OpenStreetMap</a> contributors. Tiles courtesy of <a href="https://www.tracestrack.com/" target="_blank">Tracestrack Maps</a>'
+  }
+});
+
 L.OSM.GPS = L.OSM.TileLayer.extend({
   options: {
     url: 'https://gps.tile.openstreetmap.org/lines/{z}/{x}/{y}.png',
index c2b53e18b346acb9d7a4360295402bcfb61b5271..bde99b23e26e3c4564fb8a8ff9de0f5da3601c09 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@8.49.0":
-  version "8.49.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.49.0.tgz#86f79756004a97fa4df866835093f1df3d03c333"
-  integrity sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==
+"@eslint/js@8.50.0":
+  version "8.50.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.50.0.tgz#9e93b850f0f3fa35f5fa59adfd03adae8488e484"
+  integrity sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==
 
 "@humanwhocodes/config-array@^0.11.11":
   version "0.11.11"
@@ -224,14 +224,14 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
   integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
 
 eslint@^8.0.0:
-  version "8.49.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.49.0.tgz#09d80a89bdb4edee2efcf6964623af1054bf6d42"
-  integrity sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==
+  version "8.50.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.50.0.tgz#2ae6015fee0240fcd3f83e1e25df0287f487d6b2"
+  integrity sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.6.1"
     "@eslint/eslintrc" "^2.1.2"
-    "@eslint/js" "8.49.0"
+    "@eslint/js" "8.50.0"
     "@humanwhocodes/config-array" "^0.11.11"
     "@humanwhocodes/module-importer" "^1.0.1"
     "@nodelib/fs.walk" "^1.2.8"