]> git.openstreetmap.org Git - rails.git/commitdiff
Merge pull request #4150 from AntonKhorev/note-table-bootstrap-highlight
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 16 Aug 2023 12:35:47 +0000 (13:35 +0100)
committerGitHub <noreply@github.com>
Wed, 16 Aug 2023 12:35:47 +0000 (13:35 +0100)
Use Bootstrap highlight class in note tables

60 files changed:
.rubocop_todo.yml
Gemfile.lock
app/assets/images/banners/donate_2023_1.jpg [new file with mode: 0644]
app/assets/images/banners/donate_2023_1@2x.jpg [new file with mode: 0644]
app/assets/images/banners/sotm_2022.png [deleted file]
app/assets/javascripts/messages.js
app/assets/javascripts/user.js
app/assets/stylesheets/common.scss
app/controllers/api/capabilities_controller.rb
app/controllers/api/changesets_controller.rb
app/controllers/diary_entries_controller.rb
app/controllers/issue_comments_controller.rb
app/controllers/user_roles_controller.rb
app/controllers/users_controller.rb
app/helpers/application_helper.rb
app/helpers/user_roles_helper.rb
app/mailers/user_mailer.rb
app/models/user.rb
app/views/api/capabilities/show.json.jbuilder [new file with mode: 0644]
app/views/api/users/_user.json.jbuilder
app/views/api/users/_user.xml.builder
app/views/dashboards/_contact.html.erb
app/views/dashboards/show.html.erb
app/views/diary_entries/_diary_comment.html.erb
app/views/diary_entries/_diary_entry.html.erb
app/views/diary_entries/_form.html.erb
app/views/diary_entries/show.html.erb
app/views/layouts/_banner.html.erb
app/views/layouts/map.html.erb
app/views/messages/_message_summary.html.erb
app/views/messages/_sent_message_summary.html.erb
app/views/messages/inbox.html.erb
app/views/messages/outbox.html.erb
app/views/messages/show.html.erb
app/views/profiles/edit.html.erb
app/views/user_mailer/_message_body.html.erb
config/banners.yml
config/locales/af.yml
config/locales/bg.yml
config/locales/cy.yml
config/locales/en.yml
config/locales/es.yml
config/locales/fr.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/lb.yml
config/locales/mk.yml
config/locales/nb.yml
config/locales/nl.yml
config/locales/skr-arab.yml
config/locales/sl.yml
config/locales/zh-TW.yml
test/controllers/api/capabilities_controller_test.rb
test/controllers/api/changesets_controller_test.rb
test/controllers/api/relations_controller_test.rb
test/controllers/diary_entries_controller_test.rb
test/models/user_test.rb
yarn.lock

index 527c793545f61d6307aedff2f35df3f69cf307cc..db94a610b8fe20aecc9ebc4851cba172c0afc05f 100644 (file)
@@ -92,16 +92,6 @@ Minitest/EmptyLineBeforeAssertionMethods:
 Minitest/MultipleAssertions:
   Max: 54
 
-# Offense count: 1
-# Configuration parameters: NamePrefix, ForbiddenPrefixes, AllowedMethods, MethodDefinitionMacros.
-# NamePrefix: is_, has_, have_
-# ForbiddenPrefixes: is_, has_, have_
-# AllowedMethods: is_a?
-# MethodDefinitionMacros: define_method, define_singleton_method
-Naming/PredicateName:
-  Exclude:
-    - 'app/models/user.rb'
-
 # Offense count: 1
 # This cop supports unsafe autocorrection (--autocorrect-all).
 Rails/ActionControllerFlashBeforeRender:
index dc2bb6080cff7c4ab155e0626e70d90ec913e5f7..b75e9360678aa89124b6ee8d7f5ce5558c77a796 100644 (file)
@@ -3,73 +3,73 @@ GEM
   specs:
     aasm (5.5.0)
       concurrent-ruby (~> 1.0)
-    actioncable (7.0.6)
-      actionpack (= 7.0.6)
-      activesupport (= 7.0.6)
+    actioncable (7.0.7)
+      actionpack (= 7.0.7)
+      activesupport (= 7.0.7)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailbox (7.0.6)
-      actionpack (= 7.0.6)
-      activejob (= 7.0.6)
-      activerecord (= 7.0.6)
-      activestorage (= 7.0.6)
-      activesupport (= 7.0.6)
+    actionmailbox (7.0.7)
+      actionpack (= 7.0.7)
+      activejob (= 7.0.7)
+      activerecord (= 7.0.7)
+      activestorage (= 7.0.7)
+      activesupport (= 7.0.7)
       mail (>= 2.7.1)
       net-imap
       net-pop
       net-smtp
-    actionmailer (7.0.6)
-      actionpack (= 7.0.6)
-      actionview (= 7.0.6)
-      activejob (= 7.0.6)
-      activesupport (= 7.0.6)
+    actionmailer (7.0.7)
+      actionpack (= 7.0.7)
+      actionview (= 7.0.7)
+      activejob (= 7.0.7)
+      activesupport (= 7.0.7)
       mail (~> 2.5, >= 2.5.4)
       net-imap
       net-pop
       net-smtp
       rails-dom-testing (~> 2.0)
-    actionpack (7.0.6)
-      actionview (= 7.0.6)
-      activesupport (= 7.0.6)
+    actionpack (7.0.7)
+      actionview (= 7.0.7)
+      activesupport (= 7.0.7)
       rack (~> 2.0, >= 2.2.4)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.2.0)
     actionpack-page_caching (1.2.4)
       actionpack (>= 4.0.0)
-    actiontext (7.0.6)
-      actionpack (= 7.0.6)
-      activerecord (= 7.0.6)
-      activestorage (= 7.0.6)
-      activesupport (= 7.0.6)
+    actiontext (7.0.7)
+      actionpack (= 7.0.7)
+      activerecord (= 7.0.7)
+      activestorage (= 7.0.7)
+      activesupport (= 7.0.7)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.0.6)
-      activesupport (= 7.0.6)
+    actionview (7.0.7)
+      activesupport (= 7.0.7)
       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 (7.0.6)
-      activesupport (= 7.0.6)
+    activejob (7.0.7)
+      activesupport (= 7.0.7)
       globalid (>= 0.3.6)
-    activemodel (7.0.6)
-      activesupport (= 7.0.6)
-    activerecord (7.0.6)
-      activemodel (= 7.0.6)
-      activesupport (= 7.0.6)
+    activemodel (7.0.7)
+      activesupport (= 7.0.7)
+    activerecord (7.0.7)
+      activemodel (= 7.0.7)
+      activesupport (= 7.0.7)
     activerecord-import (1.4.1)
       activerecord (>= 4.2)
-    activestorage (7.0.6)
-      actionpack (= 7.0.6)
-      activejob (= 7.0.6)
-      activerecord (= 7.0.6)
-      activesupport (= 7.0.6)
+    activestorage (7.0.7)
+      actionpack (= 7.0.7)
+      activejob (= 7.0.7)
+      activerecord (= 7.0.7)
+      activesupport (= 7.0.7)
       marcel (~> 1.0)
       mini_mime (>= 1.1.0)
-    activesupport (7.0.6)
+    activesupport (7.0.7)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
@@ -86,8 +86,8 @@ GEM
     autoprefixer-rails (10.4.13.0)
       execjs (~> 2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.799.0)
-    aws-sdk-core (3.180.2)
+    aws-partitions (1.804.0)
+    aws-sdk-core (3.180.3)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.5)
@@ -95,12 +95,13 @@ GEM
     aws-sdk-kms (1.71.0)
       aws-sdk-core (~> 3, >= 3.177.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.132.0)
+    aws-sdk-s3 (1.132.1)
       aws-sdk-core (~> 3, >= 3.179.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.6)
     aws-sigv4 (1.6.0)
       aws-eventstream (~> 1, >= 1.0.2)
+    base64 (0.1.1)
     better_errors (2.10.1)
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
@@ -314,7 +315,7 @@ GEM
     net-smtp (0.3.3)
       net-protocol
     nio4r (2.5.9)
-    nokogiri (1.15.3)
+    nokogiri (1.15.4)
       mini_portile2 (~> 2.8.2)
       racc (~> 1.4)
     oauth (0.4.7)
@@ -368,7 +369,7 @@ GEM
       ast (~> 2.4.1)
       racc
     pg (1.5.3)
-    popper_js (2.11.7)
+    popper_js (2.11.8)
     progress (3.6.0)
     public_suffix (5.0.3)
     puma (5.6.6)
@@ -387,20 +388,20 @@ GEM
     rack-test (2.1.0)
       rack (>= 1.3)
     rack-uri_sanitizer (0.0.2)
-    rails (7.0.6)
-      actioncable (= 7.0.6)
-      actionmailbox (= 7.0.6)
-      actionmailer (= 7.0.6)
-      actionpack (= 7.0.6)
-      actiontext (= 7.0.6)
-      actionview (= 7.0.6)
-      activejob (= 7.0.6)
-      activemodel (= 7.0.6)
-      activerecord (= 7.0.6)
-      activestorage (= 7.0.6)
-      activesupport (= 7.0.6)
+    rails (7.0.7)
+      actioncable (= 7.0.7)
+      actionmailbox (= 7.0.7)
+      actionmailer (= 7.0.7)
+      actionpack (= 7.0.7)
+      actiontext (= 7.0.7)
+      actionview (= 7.0.7)
+      activejob (= 7.0.7)
+      activemodel (= 7.0.7)
+      activerecord (= 7.0.7)
+      activestorage (= 7.0.7)
+      activesupport (= 7.0.7)
       bundler (>= 1.15.0)
-      railties (= 7.0.6)
+      railties (= 7.0.7)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -412,12 +413,12 @@ GEM
     rails-html-sanitizer (1.6.0)
       loofah (~> 2.21)
       nokogiri (~> 1.14)
-    rails-i18n (7.0.6)
+    rails-i18n (7.0.8)
       i18n (>= 0.7, < 2)
       railties (>= 6.0.0, < 8)
-    railties (7.0.6)
-      actionpack (= 7.0.6)
-      activesupport (= 7.0.6)
+    railties (7.0.7)
+      actionpack (= 7.0.7)
+      activesupport (= 7.0.7)
       method_source
       rake (>= 12.2)
       thor (~> 1.0)
@@ -434,7 +435,8 @@ GEM
     rinku (2.0.6)
     rotp (6.2.2)
     rouge (4.1.3)
-    rubocop (1.55.1)
+    rubocop (1.56.0)
+      base64 (~> 0.1.1)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)
@@ -453,7 +455,7 @@ GEM
       rubocop (~> 1.33)
     rubocop-minitest (0.31.0)
       rubocop (>= 1.39, < 2.0)
-    rubocop-performance (1.18.0)
+    rubocop-performance (1.19.0)
       rubocop (>= 1.7.0, < 2.0)
       rubocop-ast (>= 0.4.0)
     rubocop-rails (2.20.2)
@@ -505,7 +507,7 @@ GEM
       actionpack (>= 5.2)
       activesupport (>= 5.2)
       sprockets (>= 3.0.0)
-    strong_migrations (1.6.0)
+    strong_migrations (1.6.1)
       activerecord (>= 5.2)
     terminal-table (3.0.2)
       unicode-display_width (>= 1.1.1, < 3)
diff --git a/app/assets/images/banners/donate_2023_1.jpg b/app/assets/images/banners/donate_2023_1.jpg
new file mode 100644 (file)
index 0000000..0a445b5
Binary files /dev/null and b/app/assets/images/banners/donate_2023_1.jpg differ
diff --git a/app/assets/images/banners/donate_2023_1@2x.jpg b/app/assets/images/banners/donate_2023_1@2x.jpg
new file mode 100644 (file)
index 0000000..8f519b6
Binary files /dev/null and b/app/assets/images/banners/donate_2023_1@2x.jpg differ
diff --git a/app/assets/images/banners/sotm_2022.png b/app/assets/images/banners/sotm_2022.png
deleted file mode 100644 (file)
index e6cc0cd..0000000
Binary files a/app/assets/images/banners/sotm_2022.png and /dev/null differ
index 0cae79a58cd2924255f0daead205e9bf7effb033..5accc1a6036fb94ec958eaf8f5c803832ecf3c09 100644 (file)
@@ -1,30 +1,34 @@
 $(document).ready(function () {
   $(".inbox-mark-unread").on("ajax:success", function (event, data) {
-    $("#inboxanchor").remove();
-    $(".user-button").before(data.inboxanchor);
-
-    $("#inbox-count").replaceWith(data.inbox_count);
-
-    $(this).parents(".inbox-row").removeClass("inbox-row").addClass("inbox-row-unread");
+    updateHtml(data);
+    updateReadState(this, false);
   });
 
   $(".inbox-mark-read").on("ajax:success", function (event, data) {
-    $("#inboxanchor").remove();
-    $(".user-button").before(data.inboxanchor);
+    updateHtml(data);
+    updateReadState(this, true);
+  });
 
-    $("#inbox-count").replaceWith(data.inbox_count);
+  $(".inbox-destroy").on("ajax:success", function (event, data) {
+    updateHtml(data);
 
-    $(this).parents(".inbox-row-unread").removeClass("inbox-row-unread").addClass("inbox-row");
+    $(this).closest("tr").fadeOut(800, "linear", function () {
+      $(this).remove();
+    });
   });
 
-  $(".inbox-destroy").on("ajax:success", function (event, data) {
+  function updateHtml(data) {
     $("#inboxanchor").remove();
     $(".user-button").before(data.inboxanchor);
 
     $("#inbox-count").replaceWith(data.inbox_count);
-
-    $(this).parents(".inbox-row, .inbox-row-unread").fadeOut(800, "linear", function () {
-      $(this).remove();
-    });
-  });
+  }
+
+  function updateReadState(target, isRead) {
+    $(target).closest("tr")
+      .toggleClass("inbox-row", isRead)
+      .toggleClass("inbox-row-unread", !isRead)
+      .find(".inbox-mark-unread").prop("hidden", !isRead).end()
+      .find(".inbox-mark-read").prop("hidden", isRead);
+  }
 });
index 964f187f9795d7861ffc7ceb6b0c8f3514234e5b..146d876f789643d20abfed4043cbf44989c8af59 100644 (file)
@@ -1,8 +1,11 @@
 //= require leaflet.locatecontrol/src/L.Control.Locate
 
 $(document).ready(function () {
+  var defaultHomeZoom = 12;
+  var map, marker, deleted_lat, deleted_lon;
+
   if ($("#map").length) {
-    var map = L.map("map", {
+    map = L.map("map", {
       attributionControl: false,
       zoomControl: false
     }).addLayer(new L.OSM.Mapnik());
@@ -35,13 +38,17 @@ $(document).ready(function () {
       .addClass("control-button");
 
     if (OSM.home) {
-      map.setView([OSM.home.lat, OSM.home.lon], 12);
+      map.setView([OSM.home.lat, OSM.home.lon], defaultHomeZoom);
     } else {
       map.setView([0, 0], 0);
     }
 
     if ($("#map").hasClass("set_location")) {
-      var marker = L.marker([0, 0], { icon: OSM.getUserIcon() });
+      marker = L.marker([0, 0], {
+        icon: OSM.getUserIcon(),
+        keyboard: false,
+        interactive: false
+      });
 
       if (OSM.home) {
         marker.setLatLng([OSM.home.lat, OSM.home.lon]);
@@ -49,18 +56,65 @@ $(document).ready(function () {
       }
 
       map.on("click", function (e) {
-        if ($("#updatehome").is(":checked")) {
-          var zoom = map.getZoom(),
-              precision = OSM.zoomPrecision(zoom),
-              location = e.latlng.wrap();
+        if (!$("#updatehome").is(":checked")) return;
+
+        var zoom = map.getZoom(),
+            precision = OSM.zoomPrecision(zoom),
+            location = e.latlng.wrap();
+
+        $("#home_lat").val(location.lat.toFixed(precision));
+        $("#home_lon").val(location.lng.toFixed(precision));
+
+        deleted_lat = null;
+        deleted_lon = null;
+        respondToHomeUpdate();
+      }).on("moveend", function () {
+        var lat = $("#home_lat").val().trim(),
+            lon = $("#home_lon").val().trim(),
+            location;
+
+        try {
+          if (lat && lon) {
+            location = L.latLng(lat, lon);
+          }
+        } catch (error) {
+          // keep location undefined
+        }
 
-          $("#home_message").hide();
-          $("#home_lat").val(location.lat.toFixed(precision));
-          $("#home_lon").val(location.lng.toFixed(precision));
+        $("#home_show").prop("disabled", !location || isCloseEnoughToMapCenter(location));
+      });
 
-          marker.setLatLng(e.latlng);
-          marker.addTo(map);
-        }
+      $("#home_lat, #home_lon").on("input", function () {
+        deleted_lat = null;
+        deleted_lon = null;
+        respondToHomeUpdate();
+      });
+
+      $("#home_show").click(function () {
+        var lat = $("#home_lat").val(),
+            lon = $("#home_lon").val();
+
+        map.setView([lat, lon], defaultHomeZoom);
+      });
+
+      $("#home_delete").click(function () {
+        var lat = $("#home_lat").val(),
+            lon = $("#home_lon").val();
+
+        $("#home_lat, #home_lon").val("");
+        deleted_lat = lat;
+        deleted_lon = lon;
+        respondToHomeUpdate();
+        $("#home_undelete").trigger("focus");
+      });
+
+      $("#home_undelete").click(function () {
+        $("#home_lat").val(deleted_lat);
+        $("#home_lon").val(deleted_lon);
+        deleted_lat = null;
+        deleted_lon = null;
+        respondToHomeUpdate();
+        $("#home_delete").trigger("focus");
       });
     } else {
       $("[data-user]").each(function () {
@@ -73,6 +127,41 @@ $(document).ready(function () {
     }
   }
 
+  function respondToHomeUpdate() {
+    var lat = $("#home_lat").val().trim(),
+        lon = $("#home_lon").val().trim(),
+        location;
+
+    try {
+      if (lat && lon) {
+        location = L.latLng(lat, lon);
+      }
+      $("#home_lat, #home_lon").removeClass("is-invalid");
+    } catch (error) {
+      if (lat && isNaN(lat)) $("#home_lat").addClass("is-invalid");
+      if (lon && isNaN(lon)) $("#home_lon").addClass("is-invalid");
+    }
+
+    $("#home_message").toggleClass("invisible", Boolean(location));
+    $("#home_show").prop("hidden", !location);
+    $("#home_delete").prop("hidden", !location);
+    $("#home_undelete").prop("hidden", !(!location && deleted_lat && deleted_lon));
+    if (location) {
+      marker.setLatLng([lat, lon]);
+      marker.addTo(map);
+      map.panTo([lat, lon]);
+    } else {
+      marker.removeFrom(map);
+    }
+  }
+
+  function isCloseEnoughToMapCenter(location) {
+    var inputPt = map.latLngToContainerPoint(location),
+        centerPt = map.latLngToContainerPoint(map.getCenter());
+
+    return centerPt.distanceTo(inputPt) < 10;
+  }
+
   function updateAuthUID() {
     var provider = $("select#user_auth_provider").val();
 
index cb5e55977fa5f12c5001e980104d0304ff62290a..3eedfdbae3d21fed1dcc65986a86e9f6e03ae28b 100644 (file)
@@ -460,6 +460,11 @@ body.small-nav {
       display: block;
       width: $sidebarWidth;
     }
+
+    button.btn-close {
+      background-color: rgba(255, 255, 255, 0.5);
+      opacity: 1.0;
+    }
   }
 
   #map {
@@ -1047,49 +1052,24 @@ tr.turn:hover {
   width: 100%;
 }
 
-/* Rules for the diary list page */
-
-.diary_post {
-  position: relative;
-  padding-top: $lineheight;
-  padding-bottom: $lineheight/2;
-  border-top: 1px solid $grey;
-
-  &.deleted {
-    background-color: #fee;
-  }
-}
-
 /* Rules for the diary entry page */
 
 .diary_entries {
   #map {
     height: 400px;
     display: none;
-    margin-bottom: $lineheight;
   }
   .comments {
     max-width: 740px;
   }
   .diary-comment {
     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 $grey;
     }
-    &.deleted {
-      background-color: #fee;
-    }
     p {
       margin-bottom: $lineheight/2;
     }
-    .comment-heading {
-      margin-bottom: 0;
-      margin-top: 0;
-    }
   }
 }
 
@@ -1132,11 +1112,6 @@ tr.turn:hover {
 /* Rules for messages pages */
 
 .messages {
-  button[type="submit"] {
-    margin: auto;
-    white-space: nowrap;
-  }
-
   .inbox-row {
     background: $offwhite;
   }
@@ -1144,42 +1119,6 @@ tr.turn:hover {
   .inbox-row-unread {
     background: #CBEEA7;
   }
-
-  .right {
-    float: right;
-  }
-}
-
-.inbox-row .inbox-mark-read {
-  display: none;
-}
-
-.info-line {
-  margin-bottom: $lineheight;
-  padding: $lineheight/4 0px 4px 0px;
-  border-bottom: 1px solid $grey;
-
-  form, form div {
-    display: inline;
-  }
-}
-
-.info-line .user_thumbnail_tiny {
-  vertical-align: middle;
-}
-
-.inbox-sent {
-  white-space: nowrap;
-}
-
-.inbox-mark-unread,
-.inbox-mark-read,
-.inbox-delete {
-  width: 1%;
-}
-
-.inbox-row-unread .inbox-mark-unread {
-  display: none;
 }
 
 .search_form {
@@ -1251,6 +1190,8 @@ div.secondary-actions {
   code {
     background: $lightgrey;
     padding: 2px 3px;
+    direction: inherit; /* fix for Bootstrap < 5.2 */
+    unicode-bidi: unset; /* fix for Bootstrap < 5.2 */
   }
 
   pre {
index 7f91557f85849b74bf749daf590dbe77aa3f582d..80222c40bd93fb622753a5d672841cbe1fa2d12d 100644 (file)
@@ -2,6 +2,7 @@ module Api
   class CapabilitiesController < ApiController
     authorize_resource :class => false
 
+    before_action :set_request_formats
     around_action :api_call_handle_error, :api_call_timeout
 
     # External apps that use the api are able to query the api to find out some
index 0dffd4de224a37e21cffb1780038a259492a89b3..0a49a95f4e01e98a99c07566f6da92282448e09b 100644 (file)
@@ -170,8 +170,15 @@ module Api
       changesets = conditions_closed(changesets, params["closed"])
       changesets = conditions_ids(changesets, params["changesets"])
 
-      # sort and limit the changesets
-      changesets = changesets.order("created_at DESC").limit(result_limit)
+      # sort the changesets
+      changesets = if params[:order] == "oldest"
+                     changesets.order(:closed_at => :asc)
+                   else
+                     changesets.order(:closed_at => :desc)
+                   end
+
+      # limit the result
+      changesets = changesets.limit(result_limit)
 
       # preload users, tags and comments, and render result
       @changesets = changesets.preload(:user, :changeset_tags, :comments)
index ea9aacb21d97f5e72b18e95fc3e28635cf89d903..6981ed797f92112956e2097bf7a11a1e54d9465b 100644 (file)
@@ -280,7 +280,7 @@ class DiaryEntriesController < ApplicationController
       @lon = @diary_entry.longitude
       @lat = @diary_entry.latitude
       @zoom = 12
-    elsif current_user.home_lat.nil? || current_user.home_lon.nil?
+    elsif !current_user.home_location?
       @lon = params[:lon] || -0.1
       @lat = params[:lat] || 51.5
       @zoom = params[:zoom] || 4
index 7edef184e782cf560a5c31d5a68b9c1550f1b88c..5bf4d023784a587613645f03891f5e2f22ae2cae 100644 (file)
@@ -19,7 +19,7 @@ class IssueCommentsController < ApplicationController
       reassign_issue(@issue)
       flash[:notice] = t ".issue_reassigned"
 
-      if current_user.has_role? @issue.assigned_role
+      if current_user.role? @issue.assigned_role
         redirect_to @issue
       else
         redirect_to issues_path(:status => "open")
index fe4c855e3d827e9696e4233b2f86c57ccd4c7b16..cf5b4de9e35e2c8771673e4bd09ac7d011aeeb73 100644 (file)
@@ -41,7 +41,7 @@ class UserRolesController < ApplicationController
   ##
   # checks that the user doesn't already have this role
   def not_in_role
-    if @user.has_role? @role
+    if @user.role? @role
       flash[:error] = t("user_role.filter.already_has_role", :role => @role)
       redirect_to user_path(@user)
     end
@@ -50,7 +50,7 @@ class UserRolesController < ApplicationController
   ##
   # checks that the user already has this role
   def in_role
-    unless @user.has_role? @role
+    unless @user.role? @role
       flash[:error] = t("user_role.filter.doesnt_have_role", :role => @role)
       redirect_to user_path(@user)
     end
index abd998030eda898c28d439f82d6156c219c701c9..fc9a6afc09a17926d49db044df1333008277b3c4 100644 (file)
@@ -357,7 +357,7 @@ class UsersController < ApplicationController
   # get list of MX servers for a domains
   def domain_mx_servers(domain)
     Resolv::DNS.open do |dns|
-      dns.getresources(domain, Resolv::DNS::Resource::IN::MX).collect(&:exchange).collect(&:to_s)
+      dns.getresources(domain, Resolv::DNS::Resource::IN::MX).collect { |mx| mx.exchange.to_s }
     end
   end
 end
index bb09f3a49953bd66ec26fcb8734befb800c767e1..28c97e485f372242369c444f12057aa405c64926 100644 (file)
@@ -54,7 +54,7 @@ module ApplicationHelper
     if current_user
       data[:user] = current_user.id.to_json
 
-      data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } unless current_user.home_lon.nil? || current_user.home_lat.nil?
+      data[:user_home] = { :lat => current_user.home_lat, :lon => current_user.home_lon } if current_user.home_location?
     end
 
     data[:location] = session[:location] if session[:location]
index a8bc06b6e699c286eed1ae5a29ddd6953e296403..c9f8e2e6549e06429b23b024fd45717c927cac10 100644 (file)
@@ -5,7 +5,7 @@ module UserRolesHelper
 
   def role_icon(user, role)
     if current_user&.administrator?
-      if user.has_role?(role)
+      if user.role?(role)
         image = "roles/#{role}"
         alt = t("users.show.role.revoke.#{role}")
         title = t("users.show.role.revoke.#{role}")
@@ -18,7 +18,7 @@ module UserRolesHelper
         url = grant_role_path(:display_name => user.display_name, :role => role)
         confirm = t("user_role.grant.are_you_sure", :name => user.display_name, :role => role)
       end
-    elsif user.has_role?(role)
+    elsif user.role?(role)
       image = "roles/#{role}"
       alt = t("users.show.role.#{role}")
       title = t("users.show.role.#{role}")
index c5c0118e6f8b395da0569c7f12b040bd341f5ffc..a9c6b70f91eeb29d8538aa1c18859e199a38b8ad 100644 (file)
@@ -187,7 +187,25 @@ class UserMailer < ApplicationMailer
   end
 
   def attach_user_avatar(user)
-    attachments.inline["avatar.png"] = user_avatar_file(user)
+    @avatar = user_avatar_filename(user)
+    attachments.inline[@avatar] = user_avatar_file(user)
+  end
+
+  def user_avatar_filename(user)
+    avatar = user&.avatar
+    if avatar&.attached?
+      case avatar.content_type
+      when "image/png" then "avatar.png"
+      when "image/jpeg" then "avatar.jpg"
+      when "image/gif" then "avatar.gif"
+      when "image/bmp" then "avatar.bmp"
+      when "image/tiff" then "avatar.tif"
+      when "image/svg+xml" then "avatar.svg"
+      else "avatar"
+      end
+    else
+      "avatar.png"
+    end
   end
 
   def user_avatar_file(user)
index c809b619294732038c97558423b349fe2050212c..5c21736b0f6a9cbe031056cf4ef3ebaeae297cc1 100644 (file)
@@ -238,8 +238,12 @@ class User < ApplicationRecord
     @preferred_languages ||= Locale.list(languages)
   end
 
+  def home_location?
+    home_lat && home_lon
+  end
+
   def nearby(radius = Settings.nearby_radius, num = Settings.nearby_users)
-    if home_lon && home_lat
+    if home_location?
       gc = OSM::GreatCircle.new(home_lat, home_lon)
       sql_for_area = QuadTile.sql_for_area(gc.bounds(radius), "home_")
       sql_for_distance = gc.sql_for_distance("home_lat", "home_lon")
@@ -278,18 +282,18 @@ class User < ApplicationRecord
   ##
   # returns true if the user has the moderator role, false otherwise
   def moderator?
-    has_role? "moderator"
+    role? "moderator"
   end
 
   ##
   # returns true if the user has the administrator role, false otherwise
   def administrator?
-    has_role? "administrator"
+    role? "administrator"
   end
 
   ##
   # returns true if the user has the requested role
-  def has_role?(role)
+  def role?(role)
     roles.any? { |r| r.role == role }
   end
 
@@ -401,6 +405,6 @@ class User < ApplicationRecord
   end
 
   def update_tile
-    self.home_tile = QuadTile.tile_for_point(home_lat, home_lon) if home_lat && home_lon
+    self.home_tile = QuadTile.tile_for_point(home_lat, home_lon) if home_location?
   end
 end
diff --git a/app/views/api/capabilities/show.json.jbuilder b/app/views/api/capabilities/show.json.jbuilder
new file mode 100644 (file)
index 0000000..ceffa8b
--- /dev/null
@@ -0,0 +1,44 @@
+json.partial! "api/root_attributes"
+
+json.api do
+  json.version do
+    json.minimum Settings.api_version
+    json.maximum Settings.api_version
+  end
+  json.area do
+    json.maximum Settings.max_request_area
+  end
+  json.note_area do
+    json.maximum Settings.max_note_request_area
+  end
+  json.tracepoints do
+    json.per_page Settings.tracepoints_per_page
+  end
+  json.waynodes do
+    json.maximum Settings.max_number_of_way_nodes
+  end
+  json.relationmembers do
+    json.maximum Settings.max_number_of_relation_members
+  end
+  json.changesets do
+    json.maximum_elements Changeset::MAX_ELEMENTS
+    json.default_query_limit Settings.default_changeset_query_limit
+    json.maximum_query_limit Settings.max_changeset_query_limit
+  end
+  json.timeout do
+    json.seconds Settings.api_timeout
+  end
+  json.status do
+    json.database @database_status
+    json.api @api_status
+    json.gpx @gpx_status
+  end
+end
+
+json.policy do
+  json.imagery do
+    json.blacklist(Settings.imagery_blacklist) do |url_regex|
+      json.regex url_regex.to_s
+    end
+  end
+end
index 15f0685ac9e24b9131b75ab2389a73c04157e008..1a339f62805137307cdadc8a1db45a8bba0a6e80 100644 (file)
@@ -46,7 +46,7 @@ json.user do
   end
 
   if current_user && current_user == user && can?(:details, User)
-    if user.home_lat && user.home_lon
+    if user.home_location?
       json.home do
         json.lat user.home_lat
         json.lon user.home_lon
index 1791c60ef96fb0cf78d876106ed07c2b836b7135..9fb74826a017b87170ca3f0f0ac771bb433e0d97 100644 (file)
@@ -25,7 +25,7 @@ xml.tag! "user", :id => user.id,
     end
   end
   if current_user && current_user == user && can?(:details, User)
-    if user.home_lat && user.home_lon
+    if user.home_location?
       xml.tag! "home", :lat => user.home_lat,
                        :lon => user.home_lon,
                        :zoom => user.home_zoom
index 7785c05523fb287cc3a239b430b65392b3c15953..0c012cec90040c9921abb64cb9805ea990c12dae 100644 (file)
@@ -11,7 +11,7 @@
   <div class="col">
     <p class='text-muted mb-0'>
       <%= link_to contact.display_name, user_path(contact) %>
-      <% if @user.home_lon and @user.home_lat and contact.home_lon and contact.home_lat %>
+      <% if @user.home_location? and contact.home_location? %>
         <% distance = @user.distance(contact) %>
         <% if distance < 1 %>
           (<%= t ".m away", :count => (distance * 1000).round %>)
index d0344ce79bd61a7c773994328dcc915bf3cc8656..744661dfdbeb7bbd53a5ff812bfcf2a81b209030 100644 (file)
@@ -5,7 +5,7 @@
 <div class="row">
   <% if current_user and @user.id == current_user.id %>
     <div class="col-md order-md-last">
-      <% if @user.home_lat.nil? or @user.home_lon.nil? %>
+      <% if !@user.home_location? %>
         <div id="map" class="content_map border border-grey">
           <p class="m-3"><%= t(".no_home_location_html", :edit_profile_link => link_to(t(".edit_your_profile"), edit_profile_path)) %></p>
         </div>
index 403d30742d982a45d1b08ba237621f2a1fa30581..238f4d43c8549a02e4e7a8f2fcbbe4d08f66e733 100644 (file)
@@ -1,9 +1,9 @@
-<div class="row diary-comment<%= " text-muted deleted" unless diary_comment.visible? %>">
+<div class="row diary-comment py-3<%= " text-muted bg-danger bg-opacity-10" unless diary_comment.visible? %>">
   <div class="col-auto">
     <%= user_thumbnail diary_comment.user %>
   </div>
   <div class="col">
-    <p class="text-muted comment-heading" id="comment<%= diary_comment.id %>"><%= t(".comment_from_html", :link_user => (link_to diary_comment.user.display_name, user_path(diary_comment.user)), :comment_created_at => link_to(l(diary_comment.created_at, :format => :friendly), :anchor => "comment#{diary_comment.id}")) %>
+    <p class="text-muted m-0" id="comment<%= diary_comment.id %>"><%= t(".comment_from_html", :link_user => (link_to diary_comment.user.display_name, user_path(diary_comment.user)), :comment_created_at => link_to(l(diary_comment.created_at, :format => :friendly), :anchor => "comment#{diary_comment.id}")) %>
       <% if current_user and diary_comment.user.id != current_user.id %>
         | <%= report_link(t(".report"), diary_comment) %>
       <% end %>
index 37420cdf1dfa41bc58abbb37fdca786057d1c1a8..f69c7e552c3bf80f0adff79febae210093eb2a47 100644 (file)
@@ -1,4 +1,4 @@
-<div class='diary_post<%= " text-muted px-3 deleted" unless diary_entry.visible %> user_<%= diary_entry.user.id %>'>
+<article class='diary_post border-top border-grey py-3<%= " text-muted px-3 bg-danger bg-opacity-10" unless diary_entry.visible %> user_<%= diary_entry.user.id %>'>
   <div class='mb-3'>
     <% if @user %>
       <h2><%= link_to diary_entry.title, diary_entry_path(diary_entry.user, diary_entry) %></h2>
@@ -65,4 +65,4 @@
       <% end %>
     </ul>
   </nav>
-</div>
+</article>
index e07971089f620101ea75fc40e7d4d7f5c1d7f849..bfb1c1823dfa2c8a2cc567dfb975db7a413e2731 100644 (file)
@@ -5,13 +5,13 @@
 <fieldset>
   <legend><%= t ".location" -%></legend>
 
-  <%= tag.div "", :id => "map", :class => "border border-grey rounded", :data => { :lat => @lat, :lon => @lon, :zoom => @zoom } %>
+  <%= tag.div "", :id => "map", :class => "border border-grey rounded mb-3", :data => { :lat => @lat, :lon => @lon, :zoom => @zoom } %>
 
   <div class="row mb-3">
     <%= f.text_field :latitude, :wrapper_class => "col-sm-4", :id => "latitude" %>
     <%= f.text_field :longitude, :wrapper_class => "col-sm-4", :id => "longitude" %>
-    <div class="col-sm-4">
-      <label><a href="#" id="usemap"><%= t ".use_map_link" -%></a></label>
+    <div class="col-sm-4 align-self-end pt-2">
+      <button type="button" id="usemap" class="btn btn-outline-primary"><%= t ".use_map_link" -%></button>
     </div>
   </div>
 </fieldset>
index 8792074951ce6efd1d9ca64bec76ede8137162fe..5bfdfa17b3205dfd49648ace8b04d78ab388b81b 100644 (file)
@@ -12,8 +12,7 @@
 
 <%= render @entry %>
 
-<a id="comments"></a>
-<div class='comments'>
+<div id="comments" class="comments">
 <%= render :partial => "diary_comment", :collection => @comments %>
 </div>
 
index f806201eb8ff929eedc11585370ff904c42c3ecf..4f24f538d6889eb0ad6729713234c3175e743479 100644 (file)
@@ -1,4 +1,4 @@
 <% unless (banner = next_banner()).nil? %>
-<%= link_to (image_tag banner[:img], :alt => banner[:alt], :title => banner[:alt]), banner[:link] %>
-<button type="button" class="btn-close position-absolute top-0 end-0 p-4" id="<%= banner_cookie(banner[:id]) %>" aria-label="<%= t("javascripts.close") %>"></button>
+<%= link_to (image_tag banner[:img], :srcset => banner[:srcset], :alt => banner[:alt], :title => banner[:alt]), banner[:link] %>
+<button type="button" class="btn-close <%= "btn-close-white" if banner[:dark] %> position-absolute top-0 end-0 m-4" id="<%= banner_cookie(banner[:id]) %>" aria-label="<%= t("javascripts.close") %>"></button>
 <% end %>
index 6d983d30ea153454ed225068d3baa97f79cd5c66..377f961499cb7154f07a712701330ad867268cf3 100644 (file)
@@ -4,7 +4,7 @@
 
 <% content_for(:body_class) { "map-layout" } %>
 
-<% if current_user and !current_user.home_lon.nil? and !current_user.home_lat.nil? %>
+<% if current_user&.home_location? %>
   <% content_for :greeting do %>
     <%= link_to t("layouts.home"),
                 "#",
index 1a4445eae9edad0b4d6aedb110f3c7e9b84ee663..b2a1bc26868e82de84ee3cac44a0357c313a36b2 100644 (file)
@@ -1,8 +1,10 @@
 <tr id="inbox-<%= message_summary.id %>" class="inbox-row<%= "-unread" unless message_summary.message_read? %>">
-  <td class="inbox-sender"><%= link_to message_summary.sender.display_name, user_path(message_summary.sender) %></td>
-  <td class="inbox-subject"><%= link_to message_summary.title, message_path(message_summary) %></td>
-  <td class="inbox-sent"><%= l message_summary.sent_on, :format => :friendly %></td>
-  <td class="inbox-mark-unread"><%= button_to t(".unread_button"), message_mark_path(message_summary, :mark => "unread"), :remote => true, :class => "btn btn-sm btn-primary" %></td>
-  <td class="inbox-mark-read"><%= button_to t(".read_button"), message_mark_path(message_summary, :mark => "read"), :remote => true, :class => "btn btn-sm btn-primary" %></td>
-  <td class="inbox-destroy"><%= button_to t(".destroy_button"), message_path(message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger" %></td>
+  <td><%= link_to message_summary.sender.display_name, user_path(message_summary.sender) %></td>
+  <td><%= link_to message_summary.title, message_path(message_summary) %></td>
+  <td class="text-nowrap"><%= l message_summary.sent_on, :format => :friendly %></td>
+  <td class="text-nowrap d-flex justify-content-end gap-1">
+    <%= button_to t(".unread_button"), message_mark_path(message_summary, :mark => "unread"), :remote => true, :class => "btn btn-sm btn-primary", :form => { :class => "inbox-mark-unread", :hidden => !message_summary.message_read? } %>
+    <%= button_to t(".read_button"), message_mark_path(message_summary, :mark => "read"), :remote => true, :class => "btn btn-sm btn-primary", :form => { :class => "inbox-mark-read", :hidden => message_summary.message_read? } %>
+    <%= button_to t(".destroy_button"), message_path(message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger", :form_class => "inbox-destroy" %>
+  </td>
 </tr>
index 4d1b361b1822dd8f2cf3d8ad0171a1ddca522c21..24caba5ab0a495d1b74d6255b5983602cb9ed3e8 100644 (file)
@@ -1,6 +1,8 @@
 <tr class="inbox-row">
-  <td class="inbox-sender"><%= link_to sent_message_summary.recipient.display_name, user_path(sent_message_summary.recipient) %></td>
-  <td class="inbox-subject"><%= link_to sent_message_summary.title, message_path(sent_message_summary) %></td>
-  <td class="inbox-sent"><%= l sent_message_summary.sent_on, :format => :friendly %></td>
-  <td class="inbox-destroy"><%= button_to t(".destroy_button"), message_path(sent_message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger" %></td>
+  <td><%= link_to sent_message_summary.recipient.display_name, user_path(sent_message_summary.recipient) %></td>
+  <td><%= link_to sent_message_summary.title, message_path(sent_message_summary) %></td>
+  <td class="text-nowrap"><%= l sent_message_summary.sent_on, :format => :friendly %></td>
+  <td class="text-nowrap d-flex justify-content-end gap-1">
+    <%= button_to t(".destroy_button"), message_path(sent_message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger", :form_class => "inbox-destroy" %>
+  </td>
 </tr>
index 4f2925b149e386f86fa4e07c372c8ec5152797fd..54089c34a65ba6cea80c625b0ed7b362b0e7cdcd 100644 (file)
   <h4><%= render :partial => "message_count" %></h4>
 
 <% if current_user.messages.size > 0 %>
-  <table class="table table-sm">
+  <table class="table table-sm align-middle">
     <thead>
       <tr>
         <th><%= t ".from" %></th>
         <th><%= t ".subject" %></th>
         <th><%= t ".date" %></th>
-        <th></th>
-        <th></th>
       </tr>
     </thead>
     <tbody>
index 0099b573d816a0d289ca4e65cf17ee52bc400ad5..e246f9292ebb8afaf0161e306b55fb812176f379 100644 (file)
 <h4><%= t ".messages", :count => current_user.sent_messages.size %></h4>
 
 <% if current_user.sent_messages.size > 0 %>
-  <table class="table table-sm">
+  <table class="table table-sm align-middle">
     <thead>
       <tr>
         <th><%= t ".to" %></th>
         <th><%= t ".subject" %></th>
         <th><%= t ".date" %></th>
-        <th></th>
       </tr>
     </thead>
     <tbody>
index 9ade68121aab29d9e7bac8f9bdcde705c87ac81c..4761aac60d95d4cd5de4dfa4f1481f85248e5a7f 100644 (file)
@@ -2,36 +2,29 @@
   <h1><%= @message.title %></h1>
 <% end %>
 
-<% if current_user == @message.recipient %>
-  <div class='info-line clearfix'>
+<div class='mb-3 border-bottom border-grey py-1 d-flex gap-1 flex-wrap'>
+  <% if current_user == @message.recipient %>
     <%= user_thumbnail_tiny @message.sender %>
-    <%= link_to @message.sender.display_name, user_path(@message.sender) %></td>
-    <div class='right'>
-      <%= l @message.sent_on, :format => :friendly %>
-    </div>
-  </div>
+    <%= link_to @message.sender.display_name, user_path(@message.sender) %>
+  <% else %>
+    <%= user_thumbnail_tiny @message.recipient %>
+    <%= link_to @message.recipient.display_name, user_path(@message.recipient) %>
+  <% end %>
+  <span class="ms-auto">
+    <%= l @message.sent_on, :format => :friendly %>
+  </span>
+</div>
 
-  <div class="richtext text-break"><%= @message.body.to_html %></div>
+<div class="richtext text-break"><%= @message.body.to_html %></div>
 
-  <div>
+<div>
+  <% if current_user == @message.recipient %>
     <%= link_to t(".reply_button"), message_reply_path(@message), :class => "btn btn-primary" %>
     <%= link_to t(".unread_button"), message_mark_path(@message, :mark => "unread"), :method => "post", :class => "btn btn-primary" %>
     <%= link_to t(".destroy_button"), message_path(@message), :method => "delete", :class => "btn btn-danger" %>
     <%= link_to t(".back"), inbox_messages_path, :class => "btn btn-link" %>
-  </div>
-<% else %>
-  <div class='info-line clearfix'>
-    <%= user_thumbnail_tiny @message.recipient %>
-    <%= link_to @message.recipient.display_name, user_path(@message.recipient) %></td>
-    <div class='right'>
-      <%= l @message.sent_on, :format => :friendly %>
-    </div>
-  </div>
-
-  <div class="richtext text-break"><%= @message.body.to_html %></div>
-
-  <div>
+  <% else %>
     <%= link_to t(".destroy_button"), message_path(@message), :method => "delete", :class => "btn btn-danger" %>
     <%= link_to t(".back"), outbox_messages_path, :class => "btn btn-link" %>
-  </div>
-<% end %>
+  <% end %>
+</div>
index 5bf7426f2946c74a1ecc3a770b5a4363954eb13f..bf53832c8802b6709bd15348ce0ec30d3b0685f7 100644 (file)
 
   <fieldset>
     <legend><%= t ".home location" -%></legend>
-    <p id="home_message" class="text-muted"<% if current_user.home_lat and current_user.home_lon %> hidden<% end %>><%= t ".no home location" %></p>
+    <p id="home_message" class="text-muted m-0<% if current_user.home_location? %> invisible<% end %>"><%= t ".no home location" %></p>
     <div class="row">
       <%= f.text_field :home_lat, :wrapper_class => "col-sm-4", :id => "home_lat" %>
       <%= f.text_field :home_lon, :wrapper_class => "col-sm-4", :id => "home_lon" %>
+      <div class="col-sm-4 pt-2 align-self-end">
+        <button type="button" id="home_show" class="btn btn-outline-primary"<% unless current_user.home_location? %> hidden<% end %> disabled><%= t ".show" %></button>
+        <button type="button" id="home_delete" class="btn btn-outline-primary"<% unless current_user.home_location? %> hidden<% end %>><%= t ".delete" %></button>
+        <button type="button" id="home_undelete" class="btn btn-outline-primary" hidden><%= t ".undelete" %></button>
+      </div>
     </div>
     <div class="form-check">
-      <input class="form-check-input" type="checkbox" name="updatehome" value="1" <% unless current_user.home_lat and current_user.home_lon %> checked="checked" <% end %> id="updatehome" />
+      <input class="form-check-input" type="checkbox" name="updatehome" value="1" <% unless current_user.home_location? %> checked <% end %> id="updatehome" />
       <label class="form-check-label" for="updatehome"><%= t ".update home location on click" %></label>
     </div>
     <%= tag.div "", :id => "map", :class => "content_map set_location border border-grey rounded" %>
index d572fb9d0a79e92e7486b56218d63792295b0116..851f153a2a9a2a1938d0130b97098d5b42a687b6 100644 (file)
@@ -3,7 +3,7 @@
     <td style="width: 50px; min-width: 50px; vertical-align: top; padding: 15px">
       <%= link_to(
             image_tag(
-              attachments["avatar.png"].url,
+              attachments[@avatar].url,
               :alt => @author,
               :title => @author,
               :width => 50,
index affe6b144a124f0d64c030ec9e7ed0dff8f55bc0..c2a4df07b2ae4440186053193d6acb59c20a6cef 100644 (file)
@@ -1,6 +1,10 @@
-sotm_2022:
-  id: sotm_2022
-  alt: State of the Map 2022
-  link: https://2022.stateofthemap.org/
-  img: banners/sotm_2022.png
-  enddate: 2022-aug-21
+donate_2023:
+  id: donate_2023
+  alt: OpenStreetMap Funding Drive 2023
+  link: https://supporting.openstreetmap.org/
+  img: banners/donate_2023_1.jpg
+  srcset:
+    - [banners/donate_2023_1.jpg, 1x]
+    - [banners/donate_2023_1@2x.jpg, 2x]
+  dark: true
+  enddate: 2023-dec-31
index 73eebb406c381245534a70db74fe3bced43ec0cf..1db4fa18da2bf218191616412ab5eeefa983c8b4 100644 (file)
@@ -6,20 +6,23 @@
 # Author: Danieldegroot2
 # Author: Firefishy
 # Author: Fwolff
+# Author: Hentie
 # Author: Joris Darlington Quarshie
 # Author: Naudefj
 # Author: Nroets
 ---
 af:
+  html:
+    dir: ltr
   time:
     formats:
       friendly: '%e %B %Y om %H:%M'
   helpers:
     file:
-      prompt: Lêer kies
+      prompt: Kies leer
     submit:
       diary_comment:
-        create: Stoor
+        create: Voeg opmerking by
       diary_entry:
         create: Publiseer
         update: Opdateer
@@ -105,6 +108,7 @@ af:
         language_code: Taal
       doorkeeper/application:
         name: Naam
+        confidential: Vertroulike aansoek
         scopes: Regte
       friend:
         user: Gebruiker
@@ -148,6 +152,11 @@ af:
         pass_crypt: Wagwoord
         pass_crypt_confirmation: Bevestig wagwoord
     help:
+      doorkeeper/application:
+        confidential: Die toepassing sal gebruik word as die klient se geheime vertroulik
+          gehou kan word (inheemse mobiele toepassings en enkelbladsy-toepassings
+          is nie vertroilik nie.
+        redirect_uri: Gebruik een reel per URI
       trace:
         tagstring: komma afgebaken
       user_block:
@@ -236,11 +245,25 @@ af:
       entry:
         comment: Kommentaar
         full: Volle nota
+  account:
+    deletions:
+      show:
+        title: Skrap my rekening
+        delete_account: Skrap my rekening
+        delete_introduction: 'U kan jou OpenStreetMap-rekening skrap deur die knoppie
+          hieronder te druk. Let sseblief op na die volgende besonderhede:'
+        delete_profile: Jou profielinligting sowel as jou avatar en tuisligging sal
+          geskrap word.
+        retain_caveats: Sommige inligting oor jou sal egter behou word op OpenStreetMap
+          behou word, selfs nadat jou rekening geskrap is.
+        retain_diary_entries: Jou dagboekinskrywings en dagboekopmerkings, indien
+          enige, sl behou word, maar versteek word,
   accounts:
     edit:
       title: Redigeer rekening
       my settings: My instellings
       current email address: Huidige e-posadres
+      external auth: Ekserne veriviering.
       public editing:
         heading: Openbare redigerings
         enabled: Geaktiveer. Nie anoniem nie en kan data redigeer.
index dd3b76db1c9c8b56af3d7e481b79a0e8c4923a8d..25fdb18d6c182be6b4af34327d26ba63157a824d 100644 (file)
@@ -2069,7 +2069,7 @@ bg:
       tooltip_disabled: Легендата не е достъпна за този слой
     map:
       zoom:
-        in: Ð£Ð²ÐµÐ»Ð¸Ñ\87аване
+        in: Ð\9fÑ\80иближаване
         out: Отдалечаване
       locate:
         title: Моето местоположение
index 732aaec3f2d81f94c3233fbb9de12a2dafd09afb..19dc32de18450c4cb136d592e83f921161c44504 100644 (file)
@@ -43,6 +43,7 @@ cy:
     errors:
       messages:
         invalid_email_address: nid yw'n ymddangos ei fod yn gyfeiriad ebost dilys
+        email_address_not_routable: nid yw'n cyrchadwy
     models:
       acl: Rhestr Rheoli Mynediad
       changeset: Grŵp newid
@@ -122,6 +123,7 @@ cy:
         category: Dewiswch reswm dros eich adroddiad
       user:
         email: E-bost
+        email_confirmation: Cadarnhau E-bost
         new_email: Cyfeiriad e-bost newydd
         active: Gweithredol
         display_name: Enw defnyddiwr
@@ -452,6 +454,7 @@ cy:
       nearby mapper: Mapiwr gerllaw
       friend: Ffrind
     show:
+      title: Fy Nashfwrdd
       edit_your_profile: Golygu eich proffil
       my friends: Fy ffrindiau
       no friends: Nid ydych wedi ychwanegu unrhyw ffrindiau eto.
@@ -714,6 +717,7 @@ cy:
           hospital: Adeilad Ysbyty
           hotel: Adeilad Gwesty
           house: Tŷ
+          houseboat: Cwch preswyl
           hut: Cwt
           industrial: Adeilad Diwydiannol
           kindergarten: Adeilad Meithrinfa
@@ -724,11 +728,13 @@ cy:
           roof: To
           school: Adeilad Ysgol
           shed: Sied
+          stable: Stabl
           static_caravan: Carafan
           temple: Adeilad Teml
           terrace: Adeilad Teras
           train_station: Adeilad Gorsaf Drenau
           university: Adeilad Prifysgol
+          warehouse: Warws
           "yes": Adeilad
         club:
           sport: Clwb Chwaraeon
@@ -738,22 +744,30 @@ cy:
           blacksmith: Gof
           brewery: Bragdy
           carpenter: Saer
+          caterer: Arlwywr
+          confectionery: Melysion
+          dressmaker: Gwneuthurwr Ffrog
           electrician: Trydanydd
+          electronics_repair: Atgyweirio Electroneg
           gardener: Garddwr
           glaziery: Glysiwr
           handicraft: Gwaith Llaw
           hvac: Crefft HVAC
+          metal_construction: Adeiladwr Metel
           painter: Peintiwr
           photographer: Ffotograffydd
           plumber: Plymar
           roofer: Towr
           shoemaker: Crydd
           tailor: Teiliwr
+          winery: Gwindy
           "yes": Siop Grefft
         emergency:
+          access_point: Pwynt Mynediad
           ambulance_station: Gorsaf Ambiwlans
           assembly_point: Man Ymgynull
           defibrillator: Diffibriliwr
+          fire_extinguisher: Diffoddwr Tân
           landing_site: Man Glanio Argyfwng
           phone: Ffôn Argyfwng
           water_tank: Tanc Dŵr Argyfwng
@@ -798,18 +812,24 @@ cy:
           tertiary: Ffordd Trydyddol
           tertiary_link: Ffordd Trydyddol
           track: Trac
+          traffic_mirror: Drych Traffig
           traffic_signals: Goleuadau Traffig
+          trailhead: Pen Llwybr
           trunk: Cefnffordd
           trunk_link: Cefnffordd
+          turning_circle: Cylch Troi
           turning_loop: Lle Troi
           unclassified: Ffordd Diddosbarth
           "yes": Ffordd
         historic:
+          aircraft: Awyrennau Hanesyddol
           archaeological_site: Safle Archaeolegol
+          bomb_crater: Crater Bom Hanesyddol
           battlefield: Maes Brwydr
           boundary_stone: Maen Terfyn
           building: Adeilad Hanesyddol
           bunker: Byncar
+          cannon: Cannon Hanesyddol
           castle: Castell
           church: Eglwys
           city_gate: Gat y Ddinas
@@ -992,6 +1012,7 @@ cy:
           educational_institution: Sefydliad Addysgol
           employment_agency: Asiantaeth Cyflogi
           estate_agent: Gwerthwr Tai
+          financial: Swyddfa Gyllid
           government: Swyddfa Llywodraeth
           insurance: Swyddfa Yswiriant
           it: Swyddfa TG
@@ -1020,6 +1041,7 @@ cy:
           locality: Ardal
           municipality: Bwrdeistref
           neighbourhood: Cymdogaeth
+          plot: Plot
           postcode: Cod Post
           quarter: Maestref
           region: Rhanbarth
@@ -1236,6 +1258,9 @@ cy:
       resolve: Datrys
       ignore: Anwybyddu
       reopen: Ailagor
+    helper:
+      reportable_title:
+        note: 'Nodyn #%{note_id}'
   reports:
     new:
       title_html: Adrodd %{link}
@@ -1272,6 +1297,8 @@ cy:
     intro_text: Mae OpenStreetMap yn fap o'r byd, wedi'i greu gan bobl fel chi ac
       sydd ar gael i'w ddefnyddio am ddim a dan drwydded rydd.
     intro_2_create_account: Creu cyfrif defnyddiwr
+    partners_ucl: UCL
+    partners_fastly: Fastly
     partners_bytemark: Bytemark Hosting
     partners_partners: partneriaid
     tou: Telerau Gwasanaeth
@@ -1372,6 +1399,7 @@ cy:
       to: I
       subject: Pwnc
       date: Dyddiad
+      people_mapping_nearby: pobl yn mapio gerllaw
     show:
       title: Darllen neges
       reply_button: Ateb
@@ -1400,6 +1428,8 @@ cy:
   preferences:
     show:
       title: Dewisiadau
+      preferred_editor: Hoff Olygydd
+      preferred_languages: Ieithoedd
       edit_preferences: Dewisiadau Golygu
     edit:
       title: Dewisiadau Golygu
@@ -1509,7 +1539,9 @@ cy:
       legal_babble:
         title_html: Hawlfraint a Thrwydded
         introduction_1_open_data: data agored
+        introduction_2_legal_code: cod cyfreithiol
         credit_title_html: Sut i gydnabod OpenStreetMap
+        credit_4_1_this_copyright_page: y dudalen hawlfraint hon
         attribution_example:
           title: Enghraifft o gydnabyddiaeth
         more_title_html: Darganfod rhagor
@@ -1584,6 +1616,7 @@ cy:
           title: Ymunwch â'r gymuned
       other_concerns:
         title: Gofidion eraill
+        copyright: tudalen hawlfraint
     help:
       title: Cael Cymorth
       welcome:
@@ -1705,6 +1738,7 @@ cy:
       start_mapping: Dechrau Mapio
       add_a_note:
         title: Dim amser i olygu? Ychwanegwch nodyn!
+        the_map: map
     communities:
       title: Cymunedau
       other_groups:
@@ -1802,6 +1836,10 @@ cy:
       delete: Dileu
       client_id: ID Cleient
       client_secret: Cyfrinach Cleient
+  oauth2_authorizations:
+    new:
+      authorize: Awdurdodi
+      deny: Gwrthod
   users:
     new:
       title: Cofrestru
@@ -1902,6 +1940,7 @@ cy:
   notes:
     index:
       id: Id
+      description: Disgrifiad
       created_at: Crëwyd am
       last_changed: Newidiwyd ddiwethaf
     show:
@@ -1973,15 +2012,34 @@ cy:
         unhide_comment: datguddio
     directions:
       engines:
+        fossgis_osrm_bike: Beic (OSRM)
+        fossgis_osrm_car: Car (OSRM)
+        fossgis_osrm_foot: Troed (OSRM)
+        graphhopper_bicycle: Beic (GraphHopper)
+        graphhopper_car: Car (GraphHopper)
+        graphhopper_foot: Troed (GraphHopper)
         fossgis_valhalla_bicycle: Beic (Valhalla)
         fossgis_valhalla_car: Car (Valhalla)
+        fossgis_valhalla_foot: Troed (Valhalla)
+      distance_m: '%{distance}m'
+      distance_km: '%{distance}km'
       instructions:
         exit_counts:
           first: 1af
           second: 2il
           third: 3ydd
+          fourth: 4ydd
+          fifth: 5ed
+          sixth: 6fed
+          seventh: 7fed
+          eighth: 8fed
+          ninth: 9fed
+          tenth: 10fed
+      time: Amser
     query:
+      node: Nod
       way: Llwybr
+      relation: Perthynas
       nothing_found: Ni ddarganfuwyd nodweddion
       error: 'Gwall cysyltlu gyda %{server}: %{error}'
   redactions:
index c05b92d44e23df1de3861f522f9c64a7b6e98ffd..e14c5806ccfb3df5955041d517a2ec10244d5fe9 100644 (file)
@@ -1754,6 +1754,9 @@ en:
       home location: "Home Location"
       no home location: "You have not entered your home location."
       update home location on click: "Update home location when I click on the map?"
+      show: "Show"
+      delete: "Delete"
+      undelete: "Undo delete"
     update:
       success: Profile updated.
       failure: Couldn't update profile.
index f0cfacb0d69437612eaed86d618330221e8841f4..48167044fa94d1f7dfeef00344f29b1abe434936 100644 (file)
@@ -118,7 +118,7 @@ es:
         update: Actualizar
       redaction:
         create: Crear censura
-        update: Guardar redacción
+        update: Guardar censura
       trace:
         create: Subir
         update: Guardar cambios
@@ -161,7 +161,7 @@ es:
       tracetag: Etiqueta de la traza
       user: Usuario
       user_preference: Preferencia de usuario
-      user_token: Ficha de usuario
+      user_token: Token de usuario
       way: Vía
       way_node: Nodo de la vía
       way_tag: Etiqueta de la vía
@@ -171,11 +171,11 @@ es:
         url: URL de la aplicación principal (obligatorio)
         callback_url: URL de devolución de llamada
         support_url: URL de asistencia
-        allow_read_prefs: leer sus preferencias de usuario
-        allow_write_prefs: modificar sus preferencias de usuario
+        allow_read_prefs: leer tus preferencias de usuario
+        allow_write_prefs: modificar tus preferencias de usuario
         allow_write_diary: crear entradas de diario, comentarios y hacer amigos
         allow_write_api: modificar el mapa
-        allow_read_gpx: leer sus trazas de GPS privadas
+        allow_read_gpx: leer tus trazas de GPS privadas
         allow_write_gpx: cargar trazas de GPS
         allow_write_notes: modificar notas
       diary_comment:
@@ -189,7 +189,7 @@ es:
         language_code: Idioma
       doorkeeper/application:
         name: Nombre
-        redirect_uri: Redirigir URI
+        redirect_uri: Redirigir URIs
         confidential: ¿Solicitud confidencial?
         scopes: Permisos
       friend:
@@ -216,14 +216,14 @@ es:
         title: Título
         description: Descripción
       report:
-        category: Seleccione el motivo de su informe
-        details: Es necesario proporcionar más detalles sobre el problema.
+        category: Seleccione el motivo de tu denuncia
+        details: Es necesario proporcionar más detalles sobre el problema (requerido).
       user:
         auth_provider: Proveedor de autentificación
         auth_uid: UID de autentificación
         email: Correo electrónico
         email_confirmation: Confirmación de correo electrónico
-        new_email: Nuevo correo electrónico
+        new_email: Nueva dirección de correo electrónico
         active: Activo
         display_name: Nombre para mostrar
         description: Descripción del perfil
@@ -242,11 +242,11 @@ es:
       trace:
         tagstring: delimitado por comas
       user_block:
-        reason: El motivo por el que el usuario está siendo bloqueado. Manténgase
-          lo más tranquilo y razonable posible, dando tantos detalles como pueda sobre
-          la situación, recordando que el mensaje será visible públicamente. Tenga
-          en cuenta que no todos los usuarios comprenden la jerga de la comunidad,
-          así que intente utilizar términos simples.
+        reason: El motivo por el que el usuario está siendo bloqueado. Manténte lo
+          más tranquilo y razonable posible, dando tantos detalles como puedas sobre
+          la situación, recordando que el mensaje será visible públicamente. Ten en
+          cuenta que no todos los usuarios comprenden la jerga de la comunidad, así
+          que intenta utilizar términos simples.
         needs_view: ¿Tiene que iniciar sesión el usuario antes de que este bloqueo
           sea eliminado?
       user:
@@ -296,7 +296,7 @@ es:
       name: iD
       description: iD (editor en el navegador)
     remote:
-      name: Control Remoto
+      name: Control remoto
       description: Control remoto (JOSM, Potlatch o Merkaartor)
   auth:
     providers:
@@ -304,6 +304,7 @@ es:
       openid: OpenID
       google: Google
       facebook: Facebook
+      windowslive: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -320,8 +321,8 @@ es:
       rss:
         title: Notas de OpenStreetMap
         description_area: Una lista de notas, informadas, comentadas o cerradas en
-          su área [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]
-        description_item: Un suministro RSS para la nota %{id}
+          tu área [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]
+        description_item: Un suministro RSS para notas %{id}
         opened: nueva nota (cerca de %{place})
         commented: nuevo comentario (cerca de %{place})
         closed: nota cerrada (cerca de %{place})
@@ -336,49 +337,51 @@ es:
         warning: ¡Advertencia! El proceso de eliminación de la cuenta es definitivo
           y no puede ser revertido.
         delete_account: Eliminar cuenta
-        delete_introduction: 'Puede eliminar su cuenta de OpenStreetMap utilizando
-          el botón que aparece a continuación. Tenga en cuenta los siguientes detalles:'
-        delete_profile: Se eliminará la información de su perfil, incluido su avatar,
+        delete_introduction: 'Puedes eliminar tu cuenta de OpenStreetMap utilizando
+          el botón que aparece a continuación. Ten en cuenta los siguientes detalles:'
+        delete_profile: Se eliminará la información de tu perfil, incluido tu avatar,
           descripción y ubicación de inicio.
-        delete_display_name: Su nombre para mostrar será eliminado, y puede ser reutilizado
+        delete_display_name: Tu nombre para mostrar será eliminado, y podrá ser reutilizado
           por otras cuentas.
-        retain_caveats: 'Sin embargo, algunos datos sobre usted se conservarán en
-          OpenStreetMap, incluso después de que se elimine su cuenta:'
-        retain_edits: Sus ediciones en la base de datos de mapas, si las hay, se conservarán.
-        retain_traces: Sus trazas subidas, si las hay, se conservarán.
+        retain_caveats: 'Sin embargo, algunos datos sobre ti se conservarán en OpenStreetMap,
+          incluso después de que se elimine tu cuenta:'
+        retain_edits: Tus ediciones en la base de datos de mapas, si las hay, se conservarán.
+        retain_traces: Tus trazas subidas, si las hay, se conservarán.
         retain_diary_entries: Las entradas y los comentarios de tu diario, si los
           hay, se conservarán pero estarán ocultos.
         retain_notes: Las notas del mapa y los comentarios de las notas, si los hay,
           se conservarán pero estarán ocultos.
-        retain_changeset_discussions: Sus discusiones sobre el conjunto de cambios,
+        retain_changeset_discussions: Tus discusiones sobre conjuntos de cambios,
           si las hay, se conservarán.
-        retain_email: Su dirección de correo electrónico se conservará.
+        retain_email: Tu dirección de correo electrónico se conservará.
         confirm_delete: ¿Lo confirma?
         cancel: Cancelar
   accounts:
     edit:
       title: Editar cuenta
-      my settings: Mi configuración
-      current email address: Correo electrónico actual
-      external auth: Autenticación externa
+      my settings: Mis configuraciones
+      current email address: Dirección de correo electrónico actual
+      external auth: Autentificación externa
       openid:
+        link: https://wiki.openstreetmap.org/wiki/ES:OpenID
         link text: ¿Qué es esto?
       public editing:
         heading: Edición pública
-        enabled: Activadas. No es anónimo y puede editar datos.
+        enabled: Activadas. No es anónimo y puedes editar datos.
         enabled link: https://wiki.openstreetmap.org/wiki/ES:Ediciones_an%C3%B3nimas
         enabled link text: ¿Qué es esto?
-        disabled: Desactivadas y no puede editar datos; todas las ediciones anteriores
+        disabled: Desactivadas y no puedes editar datos; todas las ediciones anteriores
           son anónimas.
         disabled link text: ¿Por qué no puedo editar?
       contributor terms:
-        heading: Términos de colaborador
-        agreed: Ha aceptado los nuevos Términos de colaborador.
-        not yet agreed: Aún no ha aceptado los nuevos Términos de Colaborador.
-        review link text: Siga este enlace cuando le resulte conveniente para revisar
-          y aceptar los nuevos Términos de colaborador.
-        agreed_with_pd: También ha declarado que considera que sus ediciones son de
-          Dominio Público.
+        heading: Términos de Colaborador
+        agreed: Has aceptado los nuevos Términos de Colaborador.
+        not yet agreed: Aún no has aceptado los nuevos Términos de Colaborador.
+        review link text: Sigue este enlace cuando te resulte conveniente para revisar
+          y aceptar los nuevos Términos de Colaborador.
+        agreed_with_pd: También has declarado que consideras que tus ediciones son
+          de Dominio Público.
+        link: https://wiki.openstreetmap.org/wiki/ES:Licencia_Abierta_de_Base_de_Datos/T%C3%A9rminos_del_colaborador
         link text: ¿Qué es esto?
       save changes button: Guardar cambios
       delete_account: Eliminar cuenta...
@@ -391,6 +394,7 @@ es:
       only_public_can_edit: Desde el cambio de API 0.6, solo los usuarios públicos
         pueden editar los datos de los mapas.
       find_out_why: averiguar por qué
+      find_out_why_url: https://wiki.openstreetmap.org/wiki/ES:Ediciones_an%C3%B3nimas
       email_not_revealed: Tu dirección de correo electrónico no será revelada al hacerse
         pública.
       not_reversible: Esta acción no se puede revertir y todos los nuevos usuarios
@@ -398,7 +402,7 @@ es:
       make_edits_public_button: Hacer todas mis ediciones públicas
     update:
       success_confirm_needed: La información del usuario se ha actualizado correctamente.
-        Compruebe su correo electrónico para ver una nota sobre cómo confirmar su
+        Comprueba tu correo electrónico para ver un mensaje sobre cómo confirmar tu
         nueva dirección de correo electrónico.
       success: La información del usuario se ha actualizado correctamente.
     destroy:
@@ -444,7 +448,7 @@ es:
       feed:
         title: Conjunto de cambios %{id}
         title_comment: Conjunto de cambios %{id} - %{comment}
-      join_discussion: Inicie sesión para unirse a la discusión
+      join_discussion: Inicia sesión para unirte a la discusión
       discussion: Discusión
       still_open: El conjunto de cambios sigue abierto; la discusión se abrirá cuando
         se cierre el conjunto de cambios.
@@ -506,7 +510,7 @@ es:
         relation: relación
     start_rjs:
       feature_warning: Cargando %{num_features} elementos, lo que puede hacer que
-        su navegador se ralentice o que no responda. ¿Está seguro de que desea mostrar
+        tu navegador se ralentice o no responda. ¿Estás seguro de que deseas mostrar
         estos datos?
       load_data: Cargar datos
       loading: Cargando…
@@ -523,7 +527,7 @@ es:
       email_link: Correo electrónico %{email}
     query:
       title: Consultar elementos
-      introduction: Pulse en el mapa para encontrar elementos cercanos.
+      introduction: Haz clic en el mapa para encontrar elementos cercanos.
       nearby: Elementos cercanos
       enclosing: Elementos delimitantes
   changesets:
@@ -556,7 +560,7 @@ es:
       load_more: Cargar más
     timeout:
       sorry: Lo sentimos, la lista de conjuntos de cambios que solicitó tardó demasiado
-        en recuperarse.
+        en obtenerse.
   changeset_comments:
     comment:
       comment: 'Comentario nuevo sobre el conjunto de cambios #%{changeset_id} de
@@ -570,13 +574,13 @@ es:
       title_particular: 'Discusión del conjunto de cambios #%{changeset_id} de OpenStreetMap'
     timeout:
       sorry: Lo sentimos, la lista de comentarios del conjunto de cambios que solicitó
-        tardó demasiado en recuperarse.
+        tardó demasiado en obtenerse.
   dashboards:
     contact:
-      km away: '%{count} km de distancia'
-      m away: '%{count} m de distancia'
+      km away: '%{count} km. de distancia'
+      m away: '%{count} m. de distancia'
     popup:
-      your location: Su ubicación
+      your location: Tu ubicación
       nearby mapper: Mapeadores cercanos
       friend: Amigo
     show:
@@ -585,9 +589,9 @@ es:
         para ver los usuarios cercanos.'
       edit_your_profile: Edita tu perfil
       my friends: Mis amigos
-      no friends: No has añadido ningún amigo aún.
+      no friends: No has añadido amigos aún.
       nearby users: Otros usuarios cercanos
-      no nearby users: Todavía no hay usuarios que se hayan ubicado en su proximidad.
+      no nearby users: Todavía no hay usuarios que admitan mapear cerca.
       friends_changesets: conjuntos de cambios realizados por amigos
       friends_diaries: entradas de diarios de amigos
       nearby_changesets: conjuntos de cambios de los usuarios cercanos
@@ -613,7 +617,7 @@ es:
       newer_entries: Entradas más recientes
     edit:
       title: Editar entrada del diario
-      marker_text: Lugar de la entrada del diario
+      marker_text: Ubicación de la entrada del diario
     show:
       title: Diario de %{user} | %{title}
       user_title: Diario de %{user}
@@ -621,10 +625,10 @@ es:
       login_to_leave_a_comment_html: '%{login_link} para dejar un comentario'
       login: Iniciar sesión
     no_such_entry:
-      title: No existe esa entrada de diario
+      title: No existe esta entrada de diario
       heading: No hay ninguna entrada con el identificador %{id}
-      body: No hay ninguna entrada de diario o comentario con el identificador %{id}.
-        Revise su ortografía, o tal vez el enlace en el que hizo clic es incorrecto.
+      body: No hay alguna entrada de diario o comentario con el identificador %{id}.
+        Revisa la ortografía, o tal vez el enlace en el que hiciste clic es incorrecto.
     diary_entry:
       posted_by_html: Publicado por %{link_user} el %{created} en %{language_link}.
       updated_at_html: Última actualización en %{updated}.
@@ -674,15 +678,15 @@ es:
     flash:
       applications:
         create:
-          notice: Solicitud registrada.
+          notice: Aplicación registrada.
   errors:
     contact:
       contact_url: https://wiki.openstreetmap.org/wiki/ES:Canales_de_contacto
       contact_url_title: Varios canales de contacto explicados
       contact: contacto
       contact_the_community_html: Siéntete libre de %{contact_link} a la comunidad
-        de OpenStreetMap si ha encontrado un enlace roto o un error. Toma nota de
-        la URL exacta de su solicitud.
+        de OpenStreetMap si has encontrado un enlace roto o un error. Toma nota de
+        la URL exacta de tu solicitud.
     forbidden:
       title: Prohibido
       description: La operación que se solicitó al servidor de OpenStreetMap solo
@@ -699,21 +703,21 @@ es:
     make_friend:
       heading: ¿Añadir a %{user} como un amigo?
       button: Añadir como amigo
-      success: ¡%{name} ahora es su amigo!
+      success: ¡%{name} ahora es tu amigo!
       failed: Lo sentimos, no se ha podido añadir a %{name} como un amigo.
       already_a_friend: Ya eres amigo de %{name}.
-      limit_exceeded: Ha agregado a muchos amigos recientemente. Por favor espere
+      limit_exceeded: Has agregado a muchos amigos recientemente. Por favor espera
         un poco antes de intentar agregar más amigos.
     remove_friend:
-      heading: ¿Quitar a %{user} de los amigos?
-      button: Quitar amistad
-      success: Ha quitado a %{name} de sus amigos.
-      not_a_friend: '%{name} no es uno de sus amigos.'
+      heading: ¿Quitar a %{user} de tus amigos?
+      button: Quitar como amigo
+      success: Has quitado a %{name} de tus amigos.
+      not_a_friend: '%{name} no es uno de tus amigos.'
   geocoder:
     search:
       title:
         results_from_html: Resultados de %{results_link}
-        latlon: Fuentes internas
+        latlon: Interno
         osm_nominatim: Nominatim de OpenStreetMap
         osm_nominatim_reverse: Nominatim de OpenStreetMap
     search_osm_nominatim:
@@ -724,15 +728,15 @@ es:
           drag_lift: Telearrastre
           gondola: Telecabina
           magic_carpet: Ascensor de alfombra mágica
-          platter: Telesquí
-          pylon: Pilón
+          platter: Cable de remolque con platillo
+          pylon: Torre de tendido
           station: Estación de remonte
-          t-bar: Telesquí
+          t-bar: Ascensor de barra en T
           "yes": Vía aérea
         aeroway:
           aerodrome: Aeródromo
-          airstrip: Aeródromo
-          apron: Pista
+          airstrip: Pista de aterrizaje
+          apron: Plataforma
           gate: Puerta de aeropuerto
           hangar: Hangar
           helipad: Helipuerto
@@ -752,11 +756,11 @@ es:
           bank: Banco
           bar: Bar
           bbq: Parrilla
-          bench: Banco
+          bench: Banca
           bicycle_parking: Aparcamiento de bibicletas
           bicycle_rental: Alquiler de bicicletas
           bicycle_repair_station: Estación de reparación de bicicletas
-          biergarten: Terraza
+          biergarten: Patio cervecero
           blood_bank: Banco de sangre
           boat_rental: Alquiler de botes
           brothel: Burdel
@@ -768,7 +772,7 @@ es:
           car_wash: Autolavado
           casino: Casino
           charging_station: Estación de carga
-          childcare: Guardería
+          childcare: Puricultura
           cinema: Cine
           clinic: Clínica
           clock: Reloj
@@ -780,12 +784,12 @@ es:
           dentist: Dentista
           doctors: Consultorio médico
           drinking_water: Agua potable
-          driving_school: Autoescuela
+          driving_school: Escuela de automovilismo
           embassy: Embajada
           events_venue: Lugar de eventos
           fast_food: Comida rápida
-          ferry_terminal: Terminal de ferrys
-          fire_station: Parque de bomberos
+          ferry_terminal: Terminal de transbordador
+          fire_station: Estación de bomberos
           food_court: Zona de restaurantes
           fountain: Fuente
           fuel: Estación de servicio
@@ -796,7 +800,7 @@ es:
           hunting_stand: Apostadero de caza
           ice_cream: Heladería
           internet_cafe: Cibercafé
-          kindergarten: Escuela infantil/guardería
+          kindergarten: Guardería
           language_school: Escuela de idiomas
           library: Biblioteca
           loading_dock: Muelle de carga
@@ -809,17 +813,17 @@ es:
           music_school: Escuela de música
           nightclub: Club nocturno
           nursing_home: Residencia para la tercera edad
-          parking: Aparcamiento
+          parking: Estacionamiento
           parking_entrance: Entrada de estacionamiento
-          parking_space: Estacionamiento
+          parking_space: Plaza de estacionamiento
           payment_terminal: Terminal de pago
           pharmacy: Farmacia
-          place_of_worship: Templo
+          place_of_worship: Lugar de culto
           police: Policía
           post_box: Buzón
           post_office: Oficina de correos
           prison: Prisión
-          pub: Pub
+          pub: Taberna
           public_bath: Baño público
           public_bookcase: Biblioteca libre
           public_building: Edificio público
@@ -856,7 +860,7 @@ es:
           aboriginal_lands: Tierras aborígenes
           administrative: Frontera administrativa
           census: Límite de censo
-          national_park: Parque Nacional
+          national_park: Parque nacional
           political: Límite electoral
           protected_area: Área protegida
           "yes": Límite
@@ -874,10 +878,10 @@ es:
           bungalow: Bungaló
           cabin: Cabaña
           chapel: Capilla
-          church: Edificio de la iglesia
+          church: Edificio de iglesia
           civic: Edificio cívico
-          college: Edificio educativo superior no universitario
-          commercial: Edificio de oficinas
+          college: Edificio de institución educativa
+          commercial: Edificio de comercios
           construction: Edificio en construcción
           detached: Casa independiente
           dormitory: Residencia de estudiantes
@@ -889,12 +893,12 @@ es:
           greenhouse: Invernadero
           hangar: Hangar
           hospital: Edificio hospitalario
-          hotel: Edificio del hotel
+          hotel: Edificio de hotel
           house: Casa
           houseboat: Casa flotante
           hut: Choza
           industrial: Edificio industrial
-          kindergarten: Edificio de jardín de infantes
+          kindergarten: Edificio de guardería
           manufacture: Edificio de manufactura
           office: Edificio de oficinas
           public: Edificio público
@@ -906,13 +910,13 @@ es:
           semidetached_house: Casa adosada
           service: Edificio de servicios
           shed: Cobertizo
-          stable: Establo para caballos
+          stable: Establo
           static_caravan: Caravana
-          temple: Edificio del templo
+          temple: Edificio de templo
           terrace: Edificio terraza
-          train_station: Edificio de la estación de tren
-          university: Edificio universitario
-          warehouse: Almacén
+          train_station: Edificio de estación de tren
+          university: Edificio de universidad
+          warehouse: Depósito
           "yes": Edificio
         club:
           scout: Base del grupo de exploradores
@@ -936,7 +940,7 @@ es:
           painter: Pintor
           photographer: Fotógrafo
           plumber: Plomero/fontanero
-          roofer: Techador/Techista
+          roofer: Techador
           sawmill: Aserradero
           shoemaker: Zapatero
           stonemason: Albañil
@@ -958,21 +962,21 @@ es:
           suction_point: Punto de succión de emergencia
           water_tank: Tanque de agua de emergencia
         highway:
-          abandoned: Calle o carretera abandonada
-          bridleway: Camino prioritario para peatones y caballos
+          abandoned: Carretera abandonada
+          bridleway: Vía ecuestre
           bus_guideway: Canal guiado de autobuses
           bus_stop: Parada de autobuses
-          construction: Calle o carretera en construcción
+          construction: Carretera en construcción
           corridor: Corredor
           crossing: Cruce
-          cycleway: Bicisenda
+          cycleway: Ciclovía
           elevator: Ascensor
           emergency_access_point: Acceso de emergencia
-          emergency_bay: Apartadero de emergencia
+          emergency_bay: Bahía de emergencia
           footway: Sendero
           ford: Vado
           give_way: Señal de ceda el paso
-          living_street: Calle residencial
+          living_street: Calle viva
           milestone: Hito
           motorway: Autovía
           motorway_junction: Cruce de autovías
@@ -980,34 +984,34 @@ es:
           passing_place: Lugar de paso
           path: Camino
           pedestrian: Vía peatonal
-          platform: Plataforma
-          primary: Carretera primaria
-          primary_link: Carretera primaria
+          platform: Apeadero
+          primary: a primaria
+          primary_link: Enlace a vía primaria
           proposed: Vía en proyecto
           raceway: Circuito de carreras
-          residential: Calle
+          residential: Calle residencial
           rest_area: Área de descanso
-          road: Carretera
-          secondary: Carretera secundaria
-          secondary_link: Carretera secundaria
+          road: Vía (genérico)
+          secondary: a secundaria
+          secondary_link: Enlace a vía secundaria
           service: Vía de servicio
           services: Servicios carreteros
-          speed_camera: Radar
+          speed_camera: Cámara de tráfico
           steps: Escaleras
           stop: Señal de alto
           street_lamp: Farola
-          tertiary: Carretera terciaria
-          tertiary_link: Carretera terciaria
+          tertiary: a terciaria
+          tertiary_link: Enlace a vía terciaria
           track: Pista
           traffic_mirror: Espejo de tráfico
           traffic_signals: Señales de tráfico
           trailhead: Inicio del sendero
           trunk: Vía troncal
-          trunk_link: Enlace de vía rápida
-          turning_circle: Radio de giro
+          trunk_link: Enlace a vía troncal
+          turning_circle: Rotonda
           turning_loop: Bucle de giro
-          unclassified: Carretera sin clasificar
-          "yes": Camino
+          unclassified: Vía de menor nivel
+          "yes": Vía (genérico)
         historic:
           aircraft: Avión histórico
           archaeological_site: Yacimiento arqueológico
@@ -1033,27 +1037,27 @@ es:
           mine_shaft: Pozo minero
           monument: Monumento
           railway: Ferrocarril histórico
-          roman_road: Calzada romana
+          roman_road: Calle romana
           ruins: Ruinas
           rune_stone: Piedra rúnica
           stone: Piedra
           tomb: Tumba
           tower: Torre
           wayside_chapel: Capilla al borde del camino
-          wayside_cross: Crucero
-          wayside_shrine: Sepulcro
+          wayside_cross: Cruz al borde del camino
+          wayside_shrine: Santuario al borde de camino
           wreck: Pecio
           "yes": Sitio histórico
         junction:
           "yes": Intersección
         landuse:
-          allotments: Huertos
+          allotments: Parcelas
           aquaculture: Acuicultura
           basin: Cuenca
-          brownfield: Solar vacante
+          brownfield: Terreno baldío
           cemetery: Cementerio
           commercial: Área comercial
-          conservation: Espacio natural protegido
+          conservation: Área de conservación
           construction: Área de construcción
           farmland: Tierra de labranza
           farmyard: Corral
@@ -1067,7 +1071,7 @@ es:
           military: Zona militar
           mine: Mina
           orchard: Huerto
-          plant_nursery: Vivero de plantas
+          plant_nursery: Vivero
           quarry: Cantera
           railway: Ferrocarril
           recreation_ground: Área recreacional
@@ -1083,7 +1087,7 @@ es:
           adult_gaming_centre: Centro de juegos para adultos
           amusement_arcade: Sala recreativa de videojuegos
           bandstand: Quiosco de música
-          beach_resort: Complejo en la playa
+          beach_resort: Complejo turístico en playa
           bird_hide: Observatorio de aves
           bleachers: Gradas
           bowling_alley: Pista de bolos
@@ -1093,7 +1097,7 @@ es:
           firepit: Foso de fuego
           fishing: Área de pesca
           fitness_centre: Gimnasio (fitness)
-          fitness_station: Gimnasio
+          fitness_station: Estación de fitness
           garden: Jardín
           golf_course: Campo de golf
           horse_riding: Centro ecuestre
@@ -1104,10 +1108,10 @@ es:
           outdoor_seating: Asientos al aire libre
           park: Parque
           picnic_table: Mesa de picnic
-          pitch: Cancha deportiva
+          pitch: Cancha de deportes
           playground: Área de juegos
-          recreation_ground: Área recreativa
-          resort: Centro turístico
+          recreation_ground: Terreno recreativo
+          resort: Complejo turístico
           sauna: Sauna
           slipway: Grada
           sports_centre: Centro deportivo
@@ -1117,7 +1121,7 @@ es:
           water_park: Parque acuático
           "yes": Ocio
         man_made:
-          adit: Entrada a galería
+          adit: Entrada a mina
           advertising: Publicidad
           antenna: Antena
           avalanche_protection: Protección contra avalanchas
@@ -1136,7 +1140,7 @@ es:
           dolphin: Poste de amarre
           dyke: Dique
           embankment: Terraplén
-          flagpole: Asta de bandera
+          flagpole: Asta
           gasometer: Depósito de gas
           groyne: Espigón
           kiln: Horno
@@ -1145,12 +1149,12 @@ es:
           mast: Mástil
           mine: Mina
           mineshaft: Pozo minero
-          monitoring_station: Estación de monitorización
+          monitoring_station: Estación de monitoreo
           petroleum_well: Pozo petrolífero
           pier: Muelle
           pipeline: Tubería
           pumping_station: Estación de bombeo
-          reservoir_covered: Depósito cubierto
+          reservoir_covered: Embalse cubierto
           silo: Silo
           snow_cannon: Cañón de nieve
           snow_fence: Barrera anti avalanchas de nieve
@@ -1189,7 +1193,7 @@ es:
           coastline: Costa
           crater: Cráter
           dune: Duna
-          fell: Monte
+          fell: Braña
           fjord: Fiordo
           forest: Bosque
           geyser: Géiser
@@ -1202,7 +1206,7 @@ es:
           isthmus: Istmo
           land: Tierra
           marsh: Marisma
-          moor: Páramo
+          moor: Landa
           mud: Lodo
           peak: Pico
           peninsula: Península
@@ -1290,7 +1294,7 @@ es:
           disused: Ferrocarril en desuso
           funicular: Vía de funicular
           halt: Apeadero
-          junction: Encrucijada de vías ferroviarias
+          junction: Cruce de vías ferroviarias
           level_crossing: Paso a nivel
           light_rail: Metro ligero
           miniature: Ferrocarril en miniatura
@@ -1304,7 +1308,7 @@ es:
           station: Estación de trenes
           stop: Parada de tren
           subway: Metro
-          subway_entrance: Boca de metro
+          subway_entrance: Entrada de metro
           switch: Aguja de ferrocarril
           tram: Ruta de tranvía
           tram_stop: Parada de tranvía
@@ -1330,7 +1334,7 @@ es:
           butcher: Carnicería
           car: Concesionario
           car_parts: Repuestos de automóvil
-          car_repair: Taller mecánico
+          car_repair: Taller automotriz
           carpet: Tienda de alfombras
           charity: Tienda benéfica
           cheese: Tienda de quesos
@@ -1341,13 +1345,13 @@ es:
           computer: Tienda de informática
           confectionery: Confitería
           convenience: Pequeño supermercado
-          copyshop: Copistería
+          copyshop: Centro de copiado
           cosmetics: Tienda de cosméticos
           craft: Tienda de suministros de artesanía
           curtain: Tienda de cortinas
           dairy: Tienda de lácteos
           deli: Delicatessen
-          department_store: Grandes almacenes
+          department_store: Tienda por departamentos
           discount: Tienda de descuento
           doityourself: Tienda de bricolaje
           dry_cleaning: Tintorería
@@ -1412,13 +1416,13 @@ es:
           shoes: Zapatería
           sports: Tienda de deportes
           stationery: Papelería
-          storage_rental: Trasteros de alquiler
+          storage_rental: Alquiler de almacenamiento
           supermarket: Supermercado
           tailor: Sastre
           tattoo: Estudio de tatuajes
           tea: Tienda de té
           ticket: Tienda de Tickets
-          tobacco: Tabaquería. Estanco
+          tobacco: Tabaquería
           toys: Juguetería
           travel_agency: Agencia de viajes
           tyres: Tienda de neumáticos
@@ -1437,8 +1441,8 @@ es:
           bed_and_breakfast: Alojamiento y desayuno (B&B)
           cabin: Cabaña Turística
           camp_pitch: Lugar para acampar
-          camp_site: Campamento/camping
-          caravan_site: Camping para caravanas
+          camp_site: Área de acampada, camping
+          caravan_site: Sitio para caravanas
           chalet: Chalet
           gallery: Galería
           guest_house: Pensión
@@ -1454,7 +1458,7 @@ es:
           zoo: Zoológico
         tunnel:
           building_passage: Pasaje de edificio
-          culvert: Alcantarilla
+          culvert: Drenaje
           "yes": Túnel
         waterway:
           artificial: Vía fluvial artificial
@@ -1462,7 +1466,7 @@ es:
           canal: Canal
           dam: Presa
           derelict_canal: Canal abandonado
-          ditch: Acequia
+          ditch: Zanja
           dock: Muelle
           drain: Desagüe
           lock: Esclusa
@@ -1480,7 +1484,7 @@ es:
         level3: Límite regional
         level4: Límite de estado o provincia
         level5: Límite de región
-        level6: Límite de provincia
+        level6: Límite de condado
         level7: Límite municipal
         level8: Límite de ciudad
         level9: Límite de pueblo
@@ -1488,7 +1492,7 @@ es:
         level11: Límite vecinal
       types:
         cities: Ciudades
-        towns: Municipios
+        towns: Pueblos
         places: Lugares
     results:
       no_results: No se han encontrado resultados
@@ -1506,10 +1510,10 @@ es:
       user_not_found: El usuario no existe
       issues_not_found: No se encontraron incidencias de este tipo
       status: Estado
-      reports: Reportes
+      reports: Denuncias
       last_updated: Última actualización
       last_updated_time_ago_user_html: '%{time_ago} por %{user}'
-      link_to_reports: Ver informes
+      link_to_reports: Ver denuncias
       reports_count:
         one: '%{count} reporte'
         other: '%{count} reportes'
@@ -1519,64 +1523,64 @@ es:
         open: Abierto
         resolved: Resuelto
     show:
-      title: '%{status} Informe n.º %{issue_id}'
+      title: '%{status} Incidencia n.º %{issue_id}'
       reports:
         one: '%{count} reporte'
         other: '%{count} reportes'
       no_reports: Sin reportes
-      report_created_at: Reportado por primera vez el %{datetime}
+      report_created_at: Denunciado por primera vez el %{datetime}
       last_resolved_at: Resuelto por última vez el %{datetime}
       last_updated_at: Actualizado por última vez el %{datetime} por %{displayname}
       resolve: Resolver
       ignore: Ignorar
       reopen: Reabrir
-      reports_of_this_issue: Informes de este problema
-      read_reports: Leer informes
-      new_reports: Informes nuevos
+      reports_of_this_issue: Denuncias de esta incidencia
+      read_reports: Leer denuncias
+      new_reports: Denuncias nuevas
       other_issues_against_this_user: Otras incidencias en contra de este usuario
       no_other_issues: No hay otras incidencias en contra de este usuario.
-      comments_on_this_issue: Comentarios sobre este informe
+      comments_on_this_issue: Comentarios sobre esta incidencia
     resolve:
-      resolved: El estado de la incidencia se ha establecido en 'Resuelto'
+      resolved: El estado de la incidencia se ha establecido a 'Resuelto'
     ignore:
-      ignored: El estado de la incidencia se ha establecido en 'Ignorado'
+      ignored: El estado de la incidencia se ha establecido a 'Ignorado'
     reopen:
-      reopened: El estado de la incidencia se ha establecido en 'Abierto'.
+      reopened: El estado de la incidencia se ha establecido a 'Abierto'.
     comments:
       comment_from_html: Comentario de %{user_link} en %{comment_created_at}
-      reassign_param: ¿Quiere reasignar el informe?
+      reassign_param: ¿Quiere reasignar la incidencia?
     reports:
-      reported_by_html: Reportado como %{category} por %{user} en %{updated_at}
+      reported_by_html: Denunciado como %{category} por %{user} en %{updated_at}
     helper:
       reportable_title:
         diary_comment: '%{entry_title}, comentario #%{comment_id}'
         note: Nota n.º %{note_id}
   issue_comments:
     create:
-      comment_created: Su comentario ha sido creado con éxito
-      issue_reassigned: Su comentario fue creado y el tema fue reasignado
+      comment_created: Tu comentario ha sido creado con éxito
+      issue_reassigned: Tu comentario fue creado y la incidencia fue reasignada
   reports:
     new:
-      title_html: Reportar %{link}
-      missing_params: No se puede crear un informe nuevo
+      title_html: Denunciar %{link}
+      missing_params: No se puede crear una denuncia nueva
       disclaimer:
-        intro: 'Antes de enviar su denuncia a los moderadores del sitio, asegúrese
+        intro: 'Antes de enviar tu denuncia a los moderadores del sitio, asegúrate
           de que:'
         not_just_mistake: Está seguro de que el problema no es sólo un error
-        unable_to_fix: No puede solucionar el problema usted mismo o con la ayuda
-          de otros miembros de la comunidad.
-        resolve_with_user: Ya ha intentado resolver el problema con el usuario en
+        unable_to_fix: No puedes corregir el problema tu mismo o con la ayuda de otros
+          miembros de la comunidad.
+        resolve_with_user: Ya has intentado resolver el problema con el usuario en
           cuestión.
       categories:
         diary_entry:
-          spam_label: Esta entrada del diario es/contiene spam
-          offensive_label: Esta entrada del diario es obscena/ofensiva
-          threat_label: Esta entrada del diario contiene una amenaza
+          spam_label: Esta entrada de diario es/contiene spam
+          offensive_label: Esta entrada de diario es obscena/ofensiva
+          threat_label: Esta entrada de diario contiene una amenaza
           other_label: Otro
         diary_comment:
-          spam_label: Este comentario del diario es/contiene spam
-          offensive_label: Este comentario del diario es obsceno/ofensivo
-          threat_label: Este comentario del diario contiene una amenaza
+          spam_label: Este comentario de diario es/contiene spam
+          offensive_label: Este comentario de diario es obsceno/ofensivo
+          threat_label: Este comentario de diario contiene una amenaza
           other_label: Otro
         user:
           spam_label: Este perfil de usuario es/contiene spam
@@ -1590,16 +1594,19 @@ es:
           abusive_label: Esta nota es abusiva
           other_label: Otro
     create:
-      successful_report: Su denuncia ha sido registrada con éxito
+      successful_report: Tu denuncia ha sido registrada con éxito
       provide_details: Proporcione los detalles requeridos
   layouts:
+    project_name:
+      title: OpenStreetMap
+      h1: OpenStreetMap
     logo:
       alt_text: Logo de OpenStreetMap
     home: Inicio
     logout: Cerrar sesión
     log_in: Iniciar sesión
     sign_up: Registrarse
-    start_mapping: Comenzar a cartografiar
+    start_mapping: Comenzar a mapear
     edit: Editar
     history: Historial
     export: Exportar
@@ -1622,7 +1629,7 @@ es:
     partners_fastly: Fastly
     partners_bytemark: Bytemark Hosting
     partners_partners: socios
-    tou: Términos de uso
+    tou: Términos de Uso
     osm_offline: La base de datos de OpenStreetMap no está disponible en estos momentos
       debido a trabajos de mantenimiento.
     osm_read_only: La base de datos de OpenStreetMap se encuentra en modo de sólo
@@ -1636,7 +1643,7 @@ es:
     community_blogs: Blogs de la comunidad
     community_blogs_title: Blogs de miembros de la comunidad de OpenStreetMap
     make_a_donation:
-      title: Apoye a OpenStreetMap con una donación monetaria
+      title: Apoya a OpenStreetMap con una donación monetaria
       text: Hacer una donación
     learn_more: Más información
     more: Más
@@ -1644,36 +1651,35 @@ es:
     diary_comment_notification:
       subject: '[OpenStreetMap] %{user} ha comentado en una entrada de diario'
       hi: 'Hola, %{to_user}:'
-      header: '%{from_user} ha comentado sobre en la entrada de diario con el asunto
-        %{subject}:'
-      header_html: '%{from_user} ha comentado la entrada de diario con el asunto %{subject}:'
-      footer: También puede leer el comentario en %{readurl} y puede comentar en %{commenturl}
-        o responder en %{replyurl}
-      footer_html: También puede leer el comentario en %{readurl} y puede comentar
+      header: '%{from_user} ha comentado en la entrada de diario con asunto %{subject}:'
+      header_html: '%{from_user} ha comentado la entrada de diario con asunto %{subject}:'
+      footer: También puedes leer el comentario en %{readurl} y puedes comentar en
+        %{commenturl} o responder en %{replyurl}
+      footer_html: También puedes leer el comentario en %{readurl} y puedes comentar
         en %{commenturl} o responder en %{replyurl}
     message_notification:
       subject: '[OpenStreetMap] %{message_title}'
       hi: Hola %{to_user},
-      header: '%{from_user} le ha enviado un mensaje a través de OpenStreetMap con
+      header: '%{from_user} te ha enviado un mensaje a través de OpenStreetMap con
         el asunto %{subject}:'
       header_html: '%{from_user} te ha enviado un mensaje a través de OpenStreetMap
-        con el asunto %{subject}:'
-      footer: También puede leer el mensaje en %{readurl} y enviar un mensaje al autor
+        con asunto %{subject}:'
+      footer: También puedes leer el mensaje en %{readurl} y enviar un mensaje al
+        autor en %{replyurl}
+      footer_html: También puedes leer el mensaje en %{readurl} y puede responder
         en %{replyurl}
-      footer_html: También puede leer el mensaje en %{readurl} y puede responder en
-        %{replyurl}
     friendship_notification:
       hi: Hola %{to_user},
-      subject: '[OpenStreetMap] %{user} le ha añadido como amigo'
-      had_added_you: '%{user} le ha añadido como amigo en OpenStreetMap'
-      see_their_profile: Puede ver su perfil en %{userurl}.
-      see_their_profile_html: Puede ver su perfil en %{userurl}.
-      befriend_them: También puede añadirle como amigo en %{befriendurl}.
-      befriend_them_html: También puede añadirle como amigo en %{befriendurl}.
+      subject: '[OpenStreetMap] %{user} te ha añadido como amigo'
+      had_added_you: '%{user} te ha añadido como amigo en OpenStreetMap'
+      see_their_profile: Puedes ver tu perfil en %{userurl}.
+      see_their_profile_html: Puedes ver su perfil en %{userurl}.
+      befriend_them: También puedes añadirlo como amigo en %{befriendurl}.
+      befriend_them_html: También puedes añadirlo como amigo en %{befriendurl}.
     gpx_description:
-      description_with_tags_html: 'Parece que el archivo GPX %{trace_name} con la
+      description_with_tags_html: 'Parece que tu archivo GPX %{trace_name} con la
         descripción %{trace_description} y las etiquetas siguientes: %{tags}'
-      description_with_no_tags_html: Parece que el archivo GPX %{trace_name} con la
+      description_with_no_tags_html: Parece que tu archivo GPX %{trace_name} con la
         descripción %{trace_description} sin etiquetas
     gpx_failure:
       hi: Hola %{to_user},
@@ -1688,102 +1694,102 @@ es:
         other: se cargaron correctamente, con %{trace_points} de %{count} puntos posibles.
       subject: '[OpenStreetMap] Éxito al importar GPX'
     signup_confirm:
-      subject: '[OpenStreetMap] OpenStreetMap le da la bienvenida'
+      subject: '[OpenStreetMap] OpenStreetMap te da la bienvenida'
       greeting: ¡Hola!
       created: Alguien (probablemente tú) acaba de crear una cuenta en %{site_url}.
       confirm: 'Antes de hacer cualquier otra cosa, debemos confirmar que esta solicitud
-        proviene de usted, por lo que si así fue, haga clic en el enlace a continuación
-        para confirmar su cuenta:'
-      welcome: Después de confirmar su cuenta, nosotros le proporcionaremos alguna
-        información adicional para ayudarle a empezar.
+        proviene de ti, por lo que si así fue, haz clic en el enlace a continuación
+        para confirmar tu cuenta:'
+      welcome: Después de confirmar tu cuenta, nosotros te proporcionaremos alguna
+        información adicional para ayudarte a empezar.
     email_confirm:
-      subject: '[OpenStreetMap] Confirme su dirección de correo electrónico'
+      subject: '[OpenStreetMap] Confirma tu dirección de correo electrónico'
       greeting: Hola,
-      hopefully_you: Alguien (esperemos que usted) desea cambiar su dirección de correo
-        electrónico a través de %{server_url} a %{new_address}.
-      click_the_link: Si es usted, haga clic en el enlace de abajo para confirmar
-        el cambio.
+      hopefully_you: Alguien (esperemos que seas tu) desea cambiar tu dirección de
+        correo electrónico a través de %{server_url} a %{new_address}.
+      click_the_link: Si eres tú, haz clic en el enlace de abajo para confirmar el
+        cambio.
     lost_password:
       subject: '[OpenStreetMap] Petición para restablecer la contraseña'
       greeting: Hola,
-      hopefully_you: Alguien (posiblemente usted) ha solicitado que se restablezca
-        la contraseña en la cuenta de openstreetmap.org de esta dirección de correo
-        electrónico.
-      click_the_link: Si es usted, haga clic en el enlace a continuación para restablecer
-        su contraseña.
+      hopefully_you: Alguien (posiblemente tu) ha solicitado que se restablezca la
+        contraseña de la cuenta en openstreetmap.org de esta dirección de correo electrónico.
+      click_the_link: Si eres tú, haga clic en el enlace a continuación para restablecer
+        tu contraseña.
     note_comment_notification:
       anonymous: Un usuario anónimo
       greeting: Hola,
       commented:
-        subject_own: '[OpenStreetMap] %{commenter} ha comentado en una de sus notas'
+        subject_own: '[OpenStreetMap] %{commenter} ha comentado en una de tus notas'
         subject_other: '[OpenStreetMap] %{commenter} ha comentado en una nota que
-          le interesa'
-        your_note: '%{commenter} ha dejado un comentario en una de sus notas del mapa
+          te interesa'
+        your_note: '%{commenter} ha dejado un comentario en una de tus notas del mapa
           cerca de %{place}.'
-        your_note_html: '%{commenter} ha dejado un comentario en una de sus notas
+        your_note_html: '%{commenter} ha dejado un comentario en una de tus notas
           de mapa cerca de %{place}'
         commented_note: '%{commenter} ha dejado un comentario en una nota del mapa
-          que ha comentado. La nota está cerca de %{place}.'
+          que has comentado. La nota está cerca de %{place}.'
         commented_note_html: '%{commenter} ha dejado un comentario en una nota del
-          mapa que usted ha comentado. La nota está cerca de %{place}.'
+          mapa que has comentado. La nota está cerca de %{place}.'
       closed:
-        subject_own: '[OpenStreetMap] %{commenter} ha resuelto una de sus notas'
-        subject_other: '[OpenStreetMap] %{commenter} ha resuelto una nota que le interesa'
-        your_note: '%{commenter} ha resuelto una de sus notas del mapa cerca de %{place}.'
-        your_note_html: '%{commenter} ha resuelto una de sus notas del mapa cerca
+        subject_own: '[OpenStreetMap] %{commenter} ha resuelto una de tus notas'
+        subject_other: '[OpenStreetMap] %{commenter} ha resuelto una nota que te interesa'
+        your_note: '%{commenter} ha resuelto una de tus notas del mapa cerca de %{place}.'
+        your_note_html: '%{commenter} ha resuelto una de tus notas del mapa cerca
           de %{place}.'
-        commented_note: '%{commenter} ha resuelto una nota de mapa que ha comentado.
+        commented_note: '%{commenter} ha resuelto una nota de mapa que has comentado.
           La nota está cerca de %{place}.'
         commented_note_html: '%{commenter} ha resuelto una nota del mapa en la que
-          usted ha comentado. La nota está cerca de %{place}.'
+          tu ha comentado. La nota está cerca de %{place}.'
       reopened:
-        subject_own: '[OpenStreetMap] %{commenter} ha reactivado una de sus notas'
+        subject_own: '[OpenStreetMap] %{commenter} ha reactivado una de tus notas'
         subject_other: '[OpenStreetMap] %{commenter} ha reactivado una nota que te
           interesa'
-        your_note: '%{commenter} ha reactivado una de sus notas del mapa cerca de
+        your_note: '%{commenter} ha reactivado una de tus notas del mapa cerca de
           %{place}.'
-        your_note_html: '%{commenter} ha reactivado una de sus notas del mapa cerca
+        your_note_html: '%{commenter} ha reactivado una de tus notas del mapa cerca
           de %{place}.'
-        commented_note: '%{commenter} ha reactivado una nota de mapa que ha comentado.
+        commented_note: '%{commenter} ha reactivado una nota de mapa que has comentado.
           La nota está cerca de %{place}.'
         commented_note_html: '%{commenter} ha reactivado un nota del mapa en la que
-          usted ha comentado. La nota está cerca de %{place}.'
+          has comentado. La nota está cerca de %{place}.'
       details: Más detalles acerca de la nota pueden encontrarse en %{url}.
-      details_html: Puede encontrar más detalles acerca de la nota en %{url}.
+      details_html: Puedes encontrar más detalles acerca de la nota en %{url}.
     changeset_comment_notification:
       hi: Hola %{to_user},
       greeting: Hola,
       commented:
-        subject_own: '[OpenStreetMap] %{commenter} ha comentado uno de sus conjuntos
+        subject_own: '[OpenStreetMap] %{commenter} ha comentado uno de tus conjuntos
           de cambios'
         subject_other: '[OpenStreetMap] %{commenter} ha comentado un conjunto de cambios
-          que le interesa'
-        your_changeset: '%{commenter} dejó un comentario el %{time} en uno de sus
+          que te interesa'
+        your_changeset: '%{commenter} dejó un comentario el %{time} en uno de tus
           conjuntos de cambios'
         your_changeset_html: '%{commenter} dejó un comentario el %{time} en uno de
-          sus conjuntos de cambios'
+          tus conjuntos de cambios'
         commented_changeset: '%{commenter} dejó un comentario el %{time} en un conjunto
-          de cambios que está siguiendo, creado por %{changeset_author}'
+          de cambios que estás siguiendo, creado por %{changeset_author}'
         commented_changeset_html: '%{commenter} dejó un comentario el %{time} en un
-          conjunto de cambios que está siguiendo, creado por %{changeset_author}'
+          conjunto de cambios que estás siguiendo, creado por %{changeset_author}'
         partial_changeset_with_comment: con el comentario '%{changeset_comment}'
         partial_changeset_with_comment_html: con el comentario '%{changeset_comment}'
         partial_changeset_without_comment: sin comentarios
-      details: Puede encontrar más detalles sobre el conjunto de cambios en %{url}.
-      details_html: Puede encontrar más detalles sobre el conjunto de cambios en %{url}.
+      details: Puedes encontrar más detalles sobre el conjunto de cambios en %{url}.
+      details_html: Puedes encontrar más detalles sobre el conjunto de cambios en
+        %{url}.
       unsubscribe: Para cancelar la suscripción a las actualizaciones de este conjunto
-        de cambios, visite %{url} y haga clic en "Cancelar suscripción".
+        de cambios, visita %{url} y haz clic en "Cancelar suscripción".
       unsubscribe_html: Para darte de baja de las actualizaciones de este conjunto
-        de cambios, visita %{url} y haz clic en "darse de baja".
+        de cambios, visita %{url} y haz clic en "Cancelas subscripción".
   confirmations:
     confirm:
-      heading: Revise su correo electrónico!
-      introduction_1: Le hemos enviado un correo electrónico de confirmación.
-      introduction_2: Confirme su cuenta haciendo clic en el enlace del correo electrónico
-        y podrá comenzar a mapear.
-      press confirm button: Pulse botón de confirmación de abajo para activar su cuenta.
+      heading: ¡Revisa tu correo electrónico!
+      introduction_1: Te hemos enviado un correo electrónico de confirmación.
+      introduction_2: Confirma tu cuenta haciendo clic en el enlace del correo electrónico
+        y podrás comenzar a mapear.
+      press confirm button: Pulsa botón de confirmación de abajo para activar tu cuenta.
       button: Confirmar
-      success: ¡Cuenta confirmada, gracias por registrarse!
+      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}.
@@ -1792,25 +1798,24 @@ es:
       failure: No se ha encontrado el usuario %{name}
     confirm_email:
       heading: Confirmar el cambio de dirección de correo electrónico
-      press confirm button: Pulse el botón de confirmación de debajo para confirmar
-        su nueva dirección de correo electrónico.
+      press confirm button: Pulsa el botón de confirmación de debajo para confirmar
+        tu nueva dirección de correo electrónico.
       button: Confirmar
-      success: Se confirmó el cambio de dirección de correo electrónico.
-      failure: Ya se ha confirmado una dirección de correo electrónico con esta credencial
-        de autenticación.
+      success: ¡Se confirmó el cambio de dirección de correo electrónico!
+      failure: Ya se ha confirmado una dirección de correo electrónico con este token.
       unknown_token: Ese código de confirmación ha caducado o no existe.
     resend_success_flash:
-      confirmation_sent: Hemos enviado una nueva nota a %{email} y tan pronto como
-        confirmes tu cuenta podrás obtener mapeo.
+      confirmation_sent: Hemos enviado un nuevo mensaje a %{email} y tan pronto como
+        confirmes tu cuenta podrás comenzar a mapear.
       whitelist: Si usas un sistema antispam que envía solicitudes de confirmación
         entonces por favor asegúrate de incluir en la lista blanca %{sender}, ya que
-        no podemos responder ninguna solicitud de confirmación.
+        no podemos responder solicitud de confirmación alguna.
   messages:
     inbox:
       title: Buzón de entrada
       my_inbox: Mi buzón
       my_outbox: Mi buzón de salida
-      messages: Tiene %{new_messages} y %{old_messages}
+      messages: Tienes %{new_messages} y %{old_messages}
       new_messages:
         one: '%{count} nuevo mensaje'
         other: '%{count} nuevos mensajes'
@@ -1820,8 +1825,8 @@ es:
       from: De
       subject: Asunto
       date: Fecha
-      no_messages_yet_html: Aún no tiene mensajes. ¿Por qué no ponerse en contacto
-        con algunos de los %{people_mapping_nearby_link}?
+      no_messages_yet_html: Aún no tienes mensajes. ¿Por qué no ponerte en contacto
+        con algunas de las %{people_mapping_nearby_link}?
       people_mapping_nearby: gente mapeando cerca
     message_summary:
       unread_button: Marcar como no leído
@@ -1834,12 +1839,12 @@ es:
       back_to_inbox: Regresar a la bandeja de entrada
     create:
       message_sent: Mensaje enviado
-      limit_exceeded: Ha enviado muchos mensajes recientemente. Espere un poco antes
+      limit_exceeded: Has enviado muchos mensajes recientemente. Espera un poco antes
         de intentar enviar más.
     no_such_message:
       title: Este mensaje no existe.
       heading: Este mensaje no existe.
-      body: Lo sentimos, no hay ningún mensaje con este identificador.
+      body: Lo sentimos, no hay mensaje alguno con este identificador.
     outbox:
       title: Bandeja de salida
       my_inbox: Mi Bandeja de entrada
@@ -1847,53 +1852,51 @@ es:
       messages:
         one: Tiene %{count} mensaje enviado
         other: Tiene %{count} mensajes enviados
-      to: A
+      to: Para
       subject: Asunto
       date: Fecha
-      no_sent_messages_html: Aún no tiene mensajes enviados. ¿Por qué no ponerse en
-        contacto con algunos de los %{people_mapping_nearby_link}?
-      people_mapping_nearby: gente mapeando cerca
+      no_sent_messages_html: Aún no tienes mensajes enviados. ¿Por qué no ponerte
+        en contacto con algunas de las %{people_mapping_nearby_link}?
+      people_mapping_nearby: personas mapeando cerca
     reply:
-      wrong_user: |-
-        Está conectado como `%{user}' pero el mensaje que quiere responder no se ha enviado a dicho usuario. Por favor, ingrese con el usuario correcto para responder.
-
-        Ha iniciado sesión como `%{user}' pero el mensaje que quiere responder no se envió a ese usuario. Inicie sesión con el usuario correcto para responder.
+      wrong_user: Estás conectado como `%{user}' pero el mensaje que quieres responder
+        no se ha enviado a dicho usuario. Por favor, inicia sesión con el usuario
+        correcto para responder.
     show:
       title: Leer mensaje
       reply_button: Responder
       unread_button: Marcar como no leído
       destroy_button: Eliminar
       back: Volver
-      wrong_user: |-
-        Está conectado como `%{user}' pero el mensaje que quiere leer no se ha enviado por o a dicho usuario. Por favor, ingrese con el usuario correcto para ver el mensaje.
-
-        Ha iniciado sesión como `%{user}' pero el mensaje que quiere leer no fue enviado por o a ese usuario. Inicie sesión con el usuario correcto para poder leerlo.
+      wrong_user: Estás conectado como `%{user}' pero el mensaje que quieres leer
+        no se ha enviado por o a dicho usuario. Por favor, inicia sesión con el usuario
+        correcto para leer el mensaje.
     sent_message_summary:
       destroy_button: Eliminar
     mark:
       as_read: Mensaje marcado como leído
       as_unread: Mensaje marcado como no leído
     destroy:
-      destroyed: Mensaje borrado
+      destroyed: Mensaje eliminado
   passwords:
     lost_password:
       title: Contraseña perdida
       heading: ¿Contraseña olvidada?
       email address: 'Dirección de correo electrónico:'
       new password button: Restablecer contraseña
-      help_text: Escriba el correo electrónico con el que se registró. Le enviaremos
-        un vínculo a esa dirección, que podrá utilizar para restablecer su contraseña.
-      notice email on way: Sentimos que la haya perdido :-( pero ya va de camino un
-        correo electrónico que le servirá para restablecer su contraseña enseguida.
+      help_text: Escribe el correo electrónico con el que se registró. Te enviaremos
+        un enlace a esa dirección, que podrás utilizar para restablecer su contraseña.
+      notice email on way: Sentimos que la hayas perdido :-( pero ya va de camino
+        un correo electrónico que te servirá para restablecer su contraseña enseguida.
       notice email cannot find: Lo sentimos, no se pudo encontrar esa dirección de
         correo electrónico.
     reset_password:
       title: Restablecer contraseña
       heading: Restablecer contraseña para %{user}
       reset: Restablecer contraseña
-      flash changed: Su contraseña ha sido cambiada.
-      flash token bad: No se ha encontrado este elemento, ¿Quizá debería comprobar
-        la URL?
+      flash changed: Tu contraseña ha sido cambiada.
+      flash token bad: No se ha encontrado este token, ¿Quizá deberías comprobar la
+        URL?
   preferences:
     show:
       title: Mis preferencias
@@ -1916,17 +1919,18 @@ es:
       image: Imagen
       gravatar:
         gravatar: Usa Gravatar
+        link: https://wiki.openstreetmap.org/wiki/ES:Gravatar
         what_is_gravatar: ¿Qué es Gravatar?
         disabled: Gravatar se ha deshabilitado.
-        enabled: Se ha habilitado la visualización de su Gravatar.
+        enabled: Se ha habilitado la visualización de tu Gravatar.
       new image: Añadir una imagen
       keep image: Mantener la imagen actual
       delete image: Eliminar la imagen actual
       replace image: Reemplazar la imagen actual
       image size hint: (las imágenes cuadradas de al menos 100x100 funcionan mejor)
-      home location: Lugar de origen
-      no home location: No ha introducido su lugar de origen.
-      update home location on click: ¿Actualizar su lugar de origen cuando pulses
+      home location: Ubicación de casa
+      no home location: No has introducido tu ubicación de casa.
+      update home location on click: ¿Actualizar tu lugar de origen cuando hagas clic
         sobre el mapa?
     update:
       success: Perfil actualizado.
@@ -1939,12 +1943,12 @@ es:
       password: 'Contraseña:'
       openid_html: '%{logo} OpenID:'
       remember: Recordarme
-      lost password link: ¿Ha perdido su contraseña?
+      lost password link: ¿Has perdido su contraseña?
       login_button: Iniciar sesión
-      register now: Regístrese ahora
-      with external: 'O bien, utilice un servicio de terceros para acceder:'
-      no account: ¿No está registrado?
-      auth failure: Lo sentimos. No pude iniciar sesión con esos datos.
+      register now: Registrarse ahora
+      with external: 'O bien, utiliza un servicio de terceros para acceder:'
+      no account: ¿No estás registrado?
+      auth failure: Lo sentimos. No puede iniciar sesión con esos datos.
       openid_logo_alt: Inicia sesión con una OpenID
       auth_providers:
         openid:
@@ -1954,10 +1958,10 @@ es:
           title: Iniciar sesión con Google
           alt: Iniciar sesión con una OpenID de Google
         facebook:
-          title: Inicia sesión con Facebook
-          alt: Inicia sesión con una cuenta de Facebook
+          title: Iniciar sesión con Facebook
+          alt: Iniciar sesión con una cuenta de Facebook
         windowslive:
-          title: Inicia sesión con Microsoft
+          title: Iniciar sesión con Microsoft
           alt: Iniciar sesión con una cuenta Microsoft
         github:
           title: Iniciar sesión con GitHub
@@ -1976,13 +1980,14 @@ es:
       heading: Cerrar sesión de OpenStreetMap
       logout_button: Cerrar sesión
     suspended_flash:
-      suspended: Lo sentimos, su cuenta ha sido suspendida debido a actividad sospechosa.
-      contact_support_html: Póngase en contacto con %{support_link} si desea discutir
+      suspended: Lo sentimos, tu cuenta ha sido suspendida debido a actividad sospechosa.
+      contact_support_html: Ponte en contacto con %{support_link} si deseas discutir
         sobre esto.
       support: el servicio técnico
   shared:
     markdown_help:
       heading_html: Procesado con %{kramdown_link}
+      kramdown: kramdown
       headings: Títulos
       heading: Título
       subheading: Subtítulo
@@ -2004,17 +2009,16 @@ es:
       heading_html: Contribuidores %{copyright}OpenStreetMap %{br}
       used_by_html: '%{name} proporciona datos de mapas para miles de sitios web,
         aplicaciones móviles y dispositivos de hardware'
-      lede_text: OpenStreetMap lo crea una gran comunidad de colaboradores que aportan
+      lede_text: OpenStreetMap lo crea una gran comunidad de mapeadores que aportan
         y mantienen datos sobre caminos, senderos, cafeterías, estaciones de ferrocarril
         y muchas cosas más a lo largo de todo el mundo.
       local_knowledge_title: Conocimiento local
       local_knowledge_html: OpenStreetMap valora mucho el conocimiento local. Los
-        colaboradores utilizan imágenes aéreas, dispositivos GPS, mapas y otras fuentes
-        de datos libres para verificar que los datos de OSM sean precisos y estén
-        actualizados.
+        colaboradores utilizan imágenes aéreas, dispositivos GPS y otras fuentes de
+        datos libres para verificar que los datos de OSM sean precisos y estén actualizados.
       community_driven_title: Impulsado por la comunidad
       community_driven_1_html: "La comunidad de OpenStreetMap es diversa, apasionada
-        y crece cada día. \nNuestros colaboradores incluyen aficionados a los mapas,
+        y crece cada día. \nNuestros colaboradores incluyen mapeadores entusiastas,
         profesionales de los SIG, ingenieros asegurando \nel funcionamiento de los
         servidores de OSM, personal humanitario que mapean las zonas afectadas por
         desastres, \ny muchos más. \nPara obtener más información sobre la comunidad,
@@ -2025,10 +2029,10 @@ es:
       community_driven_community_blogs: blogs comunitarios
       community_driven_osm_foundation: OSM Foundation
       open_data_title: Datos abiertos
-      open_data_1_html: 'OpenStreetMap es %{open_data}: puede usarlo libremente para
-        cualquier propósito siempre que dé crédito a OpenStreetMap y a sus colaboradores.
-        Si lo altera o se basa en sus datos de alguna manera, solo puede distribuir
-        el resultado con la misma licencia. Consulte la %{copyright_license_link}
+      open_data_1_html: 'OpenStreetMap es %{open_data}: puedes usarlo libremente para
+        cualquier propósito siempre que des crédito a OpenStreetMap y a sus colaboradores.
+        Si lo alteras o te basa en sus datos de alguna manera, solo puedes distribuir
+        el resultado con la misma licencia. Consulta la %{copyright_license_link}
         para obtener más detalles.'
       open_data_open_data: datos abiertos
       open_data_copyright_license: Página de derechos de autor y licencia
@@ -2038,7 +2042,7 @@ es:
         de la comunidad. El uso de todos los servicios operados por el OSMF está sujeto
         a nuestors %{terms_of_use_link}, %{aup_link} y nuestra %{privacy_policy_link}."
       legal_1_1_openstreetmap_foundation: Fundación OpenStreetMap
-      legal_1_1_terms_of_use: Términos de uso
+      legal_1_1_terms_of_use: Términos de Uso
       legal_1_1_aup: Normativas de uso aceptable
       legal_1_1_privacy_policy: Normativa de privacidad
       legal_2_1_html: Sí tienes alguna pregunta sobre licencias, derechos de autor
@@ -2056,11 +2060,11 @@ es:
         english_link: el original en Inglés
       native:
         title: Acerca de esta página
-        html: Está viendo la versión en inglés de la página de derechos de autor.
-          Puede ir a la %{native_link} de esta página o puede dejar de leer acerca
+        html: Estás viendo la versión en inglés de la página de derechos de autor.
+          Puedes ir a la %{native_link} de esta página o puedes dejar de leer acerca
           de derechos de autor y %{mapping_link}.
         native_link: versión en español
-        mapping_link: comenzar a cartografiar
+        mapping_link: comenzar a mapear
       legal_babble:
         title_html: Derechos de autor y licencia
         introduction_1_html: "OpenStreetMap%{registered_trademark_link} es %{open_data},
@@ -2075,23 +2079,24 @@ es:
           distribuir el resultado bajo la misma licencia. El %{legal_code_link} completo
           explica tus derechos y responsabilidades.
         introduction_2_legal_code: código legal
-        introduction_3_html: Nuestra documentación tiene la licencia %{creative_commons_link}
-          (CC BY-SA 2.0).
-        introduction_3_creative_commons: Creative Commons - Atribución - Compartir
-          Igual 2.0
+        introduction_3_html: Nuestra documentación está licenciada bajo los términos
+          de %{creative_commons_link} (CC BY-SA 2.0).
+        introduction_3_creative_commons: Creative Commons Atribución-CompartirIgual
+          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
+        credit_1_html: 'Cuando utilice datos de OpenStreetMap, deberás hacer las dos
           cosas siguientes:'
-        credit_2_1: Proporcione crédito a OpenStreetMap mostrando nuestro aviso de
+        credit_2_1: Proporciona crédito a OpenStreetMap mostrando nuestro aviso de
           derechos de autor.
-        credit_2_2: Especifique que los datos están disponibles bajo la Licencia de
+        credit_2_2: Especifica que los datos están disponibles bajo la Licencia de
           base de datos abierta.
         credit_3_html: Para el aviso de derechos de autor, tenemos diferentes requisitos
-          sobre cómo debe mostrarse en función del uso que se haga de nuestros datos.
+          sobre cómo se debe mostrar en función del uso que se haga de nuestros datos.
           Por ejemplo, se aplican diferentes normas sobre cómo mostrar el aviso de
-          copyright dependiendo de si ha creado un mapa navegable, un mapa impreso
-          o una imagen estática. Encontrarás todos los detalles sobre los requisitos
-          en la %{attribution_guidelines_link}.
+          derechos de autor (copyright) dependiendo de si ha creado un mapa navegable,
+          un mapa impreso o una imagen estática. Encontrarás todos los detalles sobre
+          los requisitos en la %{attribution_guidelines_link}.
         credit_3_attribution_guidelines: Directrices de atribución
         credit_4_1_html: |-
           Para dejar claro que los datos están disponibles bajo la licencia Open
@@ -2100,9 +2105,9 @@ es:
           En este ejemplo, el crédito aparece en la esquina del mapa.
         credit_4_1_this_copyright_page: esta página de derechos de autor
         attribution_example:
-          alt: Ejemplo de como dar reconocimiento a OpenStreetMap en una página web
+          alt: Ejemplo de cómo dar reconocimiento a OpenStreetMap en una página web
           title: Ejemplo de atribución
-        more_title_html: Para saber más...
+        more_title_html: Para saber más
         more_1_1_html: Lee más sobre el uso de nuestros datos y cómo acreditarnos
           en el %{osmf_licence_page_link}.
         more_1_1_osmf_licence_page: página de licencia de la OSMF
@@ -2131,6 +2136,7 @@ es:
         contributors_au_geoscape_australia: Geoscape Australia
         contributors_au_cc_licence: Licencia internacional Creative Commons Attribution
           4.0 (CC BY 4.0)
+        contributors_au_cc_licence_url: https://creativecommons.org/licenses/by/4.0/deed.es
         contributors_ca_credit_html: '%{canada}: Contiene datos de GeoBase&reg;, GeoGratis
           (&copy; Departmento de recursos naturales de Canadá), CanVec (&copy; Departmento
           de recursos naturales de Canadá) y StatCan (División Geográfica, Estadísticas
@@ -2153,63 +2159,97 @@ es:
         contributors_nz_new_zealand: Nueva Zelanda
         contributors_nz_linz_data_service: Servicio de datos de LINZ
         contributors_nz_cc_by: CC BY 4.0
+        contributors_nz_cc_by_url: https://creativecommons.org/licenses/by/4.0/deed.es
         contributors_rs_credit_html: "%{serbia}: Contiene datos del %{rgz_link} y
           %{open_data_portal} \n (información pública de Serbia), 2018."
         contributors_rs_serbia: Serbia
         contributors_rs_rgz: Autoridad geodética serbia
         contributors_rs_open_data_portal: Portal Nacional de Datos Abiertos
+        contributors_si_credit_html: |-
+          %{slovenia}: Contiene datos de %{gu_link} y %{mkgp_link}
+          (información pública de Eslovenia).
         contributors_si_slovenia: Eslovenia
+        contributors_si_gu: Autoridad de Topografía y Cartografía
         contributors_si_mkgp: Ministerio de Agricultura, Silvicultura y Alimentación
+        contributors_es_credit_html: |-
+          %{spain}: Contiene datos del
+          Instituto Geográfico Nacional de España (%{ign_link}) y
+          Sistema Cartográfico Nacional (%{scne_link})
+          con licencia para su reutilización bajo %{cc_by_link}.
         contributors_es_spain: España
         contributors_es_ign: IGN
+        contributors_es_scne: SCNE
+        contributors_es_cc_by: CC BY 4.0
+        contributors_es_cc_by_url: https://creativecommons.org/licenses/by/4.0/deed.es
+        contributors_za_credit_html: '%{south_africa}: Contiene datos de %{ngi_link},
+          derechos de autor reservados por del Estado.'
         contributors_za_south_africa: Sudáfrica
+        contributors_za_ngi: 'Dirección General: Información Geoespacial Nacional'
+        contributors_gb_credit_html: |-
+          %{united_kingdom}: contiene datos de Ordnance Survey &copy; Crown copyright and database right
+          2010-2023.
         contributors_gb_united_kingdom: Reino Unido
+        contributors_2_html: Para obtener más detalles de estas y otras fuentes que
+          se han utilizado para ayudar a mejorar OpenStreetMap, consultq el %{contributors_page_link}
+          en el Wiki de OpenStreemMap.
+        contributors_2_contributors_page: Página de colaboradores
+        contributors_2_contributors_page_url: https://wiki.openstreetmap.org/wiki/ES:Colaboradores
         contributors_footer_2_html: La inclusión de datos en OpenStreetMap no implica
           que el proveedor de la información original apoya a OpenStreetMap, proporciona
           alguna garantía, o acepta cualquier responsabilidad.
         infringement_title_html: Violación de derechos de autor
-        infringement_1_html: Se le recuerda a los colaboradores de OSM que no deben
-          añadir información procedente de ninguna fuente con derechos de autor reservados
+        infringement_1_html: Se le recuerda a los colaboradores de OSM que no deben
+          añadir información procedente de alguna fuente con derechos de autor reservados
           (p. ej. Google Maps o mapas impresos) sin el consentimiento explícito de
           los poseedores de los derechos de autor.
+        infringement_2_1_html: |-
+          Si crees que material protegido por derechos de autor se ha agregado de manera inapropiada a la base de datos de OpenStreetMap o a este sitio, consulta nuestro %{takedown_procedure_link} o presenta tu queja directamente en nuestro
+          %{online_filing_page_link}.
+        infringement_2_1_takedown_procedure: procedimiento de eliminación
+        infringement_2_1_online_filing_page: página de presentación en línea
         trademarks_title: Marcas
+        trademarks_1_1_html: |-
+          OpenStreetMap, el logotipo de la lupa y State of the Map son marcas registradas de la Fundación
+          OpenStreetMap. Si tienes preguntas sobre el uso de las marcas, consulta nuestra
+          %{trademark_policy_link}.
         trademarks_1_1_trademark_policy: Normativa de marcas
     index:
-      js_1: Está usando un navegador que no soporta o tiene desactivado JavaScript
-      js_2: OpenStreetMap utiliza JavaScript para mostrar su mapa
+      js_1: Estás usando un navegador que no soporta o tiene desactivado JavaScript
+      js_2: OpenStreetMap utiliza JavaScript para mostrar su mapa deslizable.
       permalink: Enlace permanente
-      shortlink: Atajo
+      shortlink: Enlace corto
       createnote: Añadir una nota
       license:
-        copyright: Copyright OpenStreetMap y colaboradores, bajo una licencia abierta
-      remote_failed: 'Error de edición: Asegúrese de que JOSM o Merkaartor están cargados
-        y con la opción de control remoto activada'
+        copyright: Derechos de autor de OpenStreetMap y colaboradores, bajo una licencia
+          abierta
+      remote_failed: Error de edición - Asegúrate de que JOSM o Merkaartor están cargados
+        y con la opción de control remoto activada
     edit:
-      not_public: No ha configurado sus ediciones para que sean públicas.
-      not_public_description_html: No puede seguir editando el mapa a menos que lo
-        haga. Puede marcar sus ediciones como públicas desde su %{user_page}.
+      not_public: No has configurado tus ediciones para que sean públicas.
+      not_public_description_html: No puedes seguir editando el mapa a menos que lo
+        hagas. Puedes marcar tus ediciones como públicas desde tu %{user_page}.
       user_page_link: página de usuario
-      anon_edits_link_text: Descubra a que se debe
+      anon_edits_link_text: Descubre a qué se debe.
       id_not_configured: iD no ha sido configurado
-      no_iframe_support: Su navegador no soporta iframes HTML, que son necesarios
+      no_iframe_support: Tu navegador no soporta iframes HTML, que son necesarios
         para esta funcionalidad.
     export:
       title: Exportar
       area_to_export: Área a exportar
       manually_select: Seleccionar manualmente un área diferente
       format_to_export: Formato de exportación
-      osm_xml_data: Datos OpenStreetMap en formato XML
+      osm_xml_data: Datos de OpenStreetMap en formato XML
       map_image: Imagen de mapa (muestra la capa estándar)
       embeddable_html: HTML integrable
       licence: Licencia
-      licence_details_html: Los datos de OpenStreetMap está registrada por %{odbl_link}
+      licence_details_html: Los datos de OpenStreetMap están registrados bajo %{odbl_link}
         (ODbL).
-      odbl: Licencia de base de datos abierta de Open Data Commons
+      odbl: Licencia de Base de datos Abierta de Open Data Commons
       too_large:
-        advice: 'Si la exportación anterior falla, considere utilizar una de las fuentes
+        advice: 'Si la exportación anterior falla, considera utilizar una de las fuentes
           que se enumeran a continuación:'
         body: Esta área es demasiado grande para exportarla como datos XML de OpenStreetMap.
-          Acerque o seleccione un área más pequeña, o use una de las fuentes que se
+          Acerca o selecciona un área más pequeña, o usa una de las fuentes que se
           enumeran a continuación para descargas de datos masivas.
         planet:
           title: Planeta OSM
@@ -2229,9 +2269,9 @@ es:
       options: Opciones
       format: Formato
       scale: Escala
-      max: máx.
+      max: máximo
       image_size: Tamaño de la imagen
-      zoom: Zum
+      zoom: Acercar
       add_marker: Añadir un marcador al mapa
       latitude: 'Lat:'
       longitude: 'Lon:'
@@ -2243,34 +2283,42 @@ es:
       how_to_help:
         title: Cómo ayudar
         join_the_community:
-          title: Unirse a la comunidad
-          explanation_html: Si ha notado un problema con nuestros datos del mapa,
+          title: Unete a la comunidad
+          explanation_html: Si has notado un problema con nuestros datos del mapa,
             por ejemplo, falta un camino o su dirección, la mejor manera de proceder
             es unirse a la comunidad OpenStreetMap y agregar o corregir los datos
-            usted mismo.
+            tu mismo.
+        add_a_note:
+          instructions_1_html: |-
+            Simplemente haz clic en %{note_icon} o en el mismo icono en la visualización del mapa.
+            Esto agregará un marcador al mapa que puedes mover arrastrándolo. Agrega tu mensaje, luego haz clic en guardar, y otros mapeadores lo investigarán.
       other_concerns:
         title: Otras preocupaciones
-        copyright: página de derechos de copia
+        concerns_html: |-
+          Si tienes inquietudes sobre cómo se utilizan nuestros datos o sobre el contenido, consulta nuestro
+          %{copyright_link} para obtener más información legal, o comunícate con el %{working_group_link} correspondiente.
+        copyright: página de derechos de autor
+        working_group: grupo de trabajo OSMF
     help:
       title: Cómo obtener ayuda
       introduction: OpenStreetMap tiene varios recursos para aprender sobre el proyecto,
         preguntando y contestando preguntas, y colaborativamente discutir y documentar
-        temas de cartografía.
+        temas de mapeo.
       welcome:
         url: /welcome
-        title: Bienvenida a OpenStreetMap
-        description: Comience con esta guía rápida que cubre lo básico de OpenStreetMap.
+        title: Bienvenido a OpenStreetMap
+        description: Comienza 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
+        url: https://wiki.openstreetmap.org/wiki/ES:Gu%C3%ADa_de_principiantes
         title: Guía para principiantes
         description: Guía para principiantes, mantenida por la comunidad.
       help:
         title: Foro de ayuda
-        description: Haga una pregunta o busque respuestas en el sitio de preguntas
+        description: Haz una pregunta o busca respuestas en el sitio de preguntas
           y respuestas de OpenStreetMap.
       mailing_lists:
         title: Listas de correo
-        description: Haga una pregunta o discuta asuntos interesantes en una amplia
+        description: Haz una pregunta o discute asuntos interesantes en una amplia
           gama de listas de correo regionales o temáticas.
       community:
         title: Foro de la Comunidad
@@ -2288,13 +2336,18 @@ es:
         description: ¿Con una organización que hace planes para OpenStreetMap? Encuentra
           lo que debes saber en nuestra Estera de Bienvenida.
       wiki:
-        url: https://wiki.openstreetmap.org/wiki/ES:Main_Page
+        url: https://wiki.openstreetmap.org/wiki/ES:Página_principal
         title: Wiki de OpenStreetMap
         description: Explora la wiki para obtener documentación detallada de OpenStreetMap.
     potlatch:
-      removed: El editor de OpenStreetMap predeterminado se establece como Potlatch.
+      removed: El editor de OpenStreetMap predeterminado está establecido como Potlatch.
         Dado que Adobe Flash Player se ha retirado, Potlatch ya no está disponible
         para su uso en un navegador web.
+      desktop_application_html: Todavía puedes usar Potlatch en %{download_link}.
+      download: descargando la aplicación de escritorio para Mac y Windows
+      id_editor_html: Alternativamente, puedes establecer tu editor predeterminado
+        a iD, el cual se ejecuta en tu navegador como hacía Potlatch anteriormente.
+        %{change_preferences_link}.
       change_preferences: Cambia tus preferencias aquí
     any_questions:
       title: ¿Alguna pregunta?
@@ -2303,7 +2356,7 @@ es:
         preguntas sobre él, así como debatir y documentar de forma conjunta sobre temas de mapeo.
         %{help_link}. ¿Con una organización que hace planes para OpenStreetMap? %{welcome_mat_link}.
       get_help_here: Obtén ayuda aquí
-      welcome_mat: Echa un vistazo a Welcome Mat
+      welcome_mat: Echa un vistazo a la estera de bienvenida
     sidebar:
       search_results: Resultados de la búsqueda
       close: Cerrar
@@ -2321,14 +2374,14 @@ es:
       table:
         entry:
           motorway: Autopista
-          main_road: Carretera principal
-          trunk: Carretera troncal
-          primary: Carretera primaria
-          secondary: Carretera secundaria
-          unclassified: Carretera sin clasificar
+          main_road: a principal
+          trunk: a troncal
+          primary: a primaria
+          secondary: a secundaria
+          unclassified: Vía de menos nivel
           track: Pista
           bridleway: Vía ecuestre
-          cycleway: Bicisenda
+          cycleway: Ciclovía
           cycleway_national: Ciclovía nacional
           cycleway_regional: Ciclovía regional
           cycleway_local: Ciclovía local
@@ -2337,7 +2390,7 @@ es:
           subway: Metro
           tram:
           - Metro ligero
-          - Tranvía
+          - tranvía
           cable:
           - Telecabina
           - Telesilla
@@ -2347,27 +2400,27 @@ es:
           apron:
           - Rampa aeroportuaria
           - terminal
-          admin: Límites administrativos
+          admin: Límite administrativos
           forest: Bosque
-          wood: Madera
+          wood: Bosque
           golf: Campo de golf
           park: Parque
           resident: Zona residencial
           common:
           - Común
           - pradera
-          - Jardín
+          - jardín
           retail: Zona de comercios
           industrial: Zona industrial
-          commercial: Zona de oficinas
-          heathland: Landa, brezal
+          commercial: Zona comercial
+          heathland: Brezal
           lake:
           - Lago
           - embalse
-          farm: Campiña
-          brownfield: Baldío
+          farm: Granja
+          brownfield: Sitio baldío
           cemetery: Cementerio
-          allotments: Huertos de ocio
+          allotments: Parcelas
           pitch: Campo de juego
           centre: Centro deportivo
           reserve: Reserva natural
@@ -2390,16 +2443,20 @@ es:
           toilets: Baños
     welcome:
       title: ¡Bienvenido!
-      introduction: Le damos la bienvenida a OpenStreetMap, el mapa libre y editable
-        del mundo. Ahora que se ha registrado, ha hecho lo necesario para empezar
-        a cartografiar. He aquí una guía rápida con las cosas más importantes que
-        necesita saber.
+      introduction: Te damos la bienvenida a OpenStreetMap, el mapa libre y editable
+        del mundo. Ahora que te has registrado, has hecho lo necesario para empezar
+        a mapear. He aquí una guía rápida con las cosas más importantes que necesita
+        saber.
       whats_on_the_map:
         title: Qué hay en el mapa
         on_the_map_html: |-
-          OpenStreetMap es un sitio para cartografiar objetos %{real_and_current}:
-          esto incluye millones de edificios, carreteras y otros datos de destinos. Es posible cartografiar cualquier rasgo del mundo real que le interese.
+          OpenStreetMap es un sitio para mapear objetos %{real_and_current}:
+          esto incluye millones de edificios, carreteras y otros datos de destinos. Es posible mapear cualquier rasgo del mundo real que le interese.
         real_and_current: reales y actuales
+        off_the_map_html: Lo que %{doesnt} incluye son datos de opinión como calificaciones,
+          elementos históricos o hipotéticas, ni datos provenientes de fuentes protegidas
+          por derechos de autor. A menos que tengas un permiso especial, no copies
+          mapas en línea o en papel.
         doesnt: "no"
       basic_terms:
         title: Términos básicos para mapear
@@ -2417,17 +2474,19 @@ es:
         way: vía
         tag: etiqueta
       rules:
-        title: Reglas
+        title: ¡Reglas!
         para_1_html: OpenStreetMap tiene pocas reglas, pero esperamos que todos los
           participantes colaboren y se comuniquen entre ellos. Si estás pensando en
           realizar otras actividades diferentes a la edición a mano, por favor, lee
           y sigue las instrucciones en %{imports_link} y %{automated_edits_link}.
         imports: Importaciones
+        imports_url: https://wiki.openstreetmap.org/wiki/ES:Importaci%C3%B3n/Directrices
         automated_edits: Ediciones automatizadas
-      start_mapping: Comenzar a cartografiar
+        automated_edits_url: https://wiki.openstreetmap.org/wiki/ES:C%C3%B3digo_de_conducta_de_ediciones_automatizadas
+      start_mapping: Comenzar a mapear
       add_a_note:
-        title: ¿No tiene tiempo para editar? ¡Añada una nota!
-        para_1: Si sólo desea corregir algo pequeño y no tiene tiempo para registrarse
+        title: ¿No tienes tiempo para editar? ¡Añade una nota!
+        para_1: Si sólo deseas corregir algo pequeño y no tienes tiempo para registrarse
           y aprender a editar, es fácil añadir una nota.
         para_2_html: |-
           Basta con ir a %{map_link} y pulsar en el icono de nota: %{note_icon}.
@@ -2442,17 +2501,23 @@ es:
         Estos grupos son de distintos tamaños y representan geografías que van desde pequeñas ciudades a grandes regiones multinacionales.
         También pueden ser formales o informales.
       local_chapters:
-        title: Delegaciones locales
+        title: Capítulos locales
         about_text: Las delegaciones locales son grupos nacionales o regionales que
           han dado el paso formal de constituirse como entidades jurídicas sin ánimo
           de lucro. Representan al mapa y a los cartógrafos de la zona ante la administración
           local, las empresas y los medios de comunicación. También se han afiliado
           a la OpenStreetMap Foundation (OSMF), lo que les proporciona un vínculo
           con el órgano de gobierno legal y de derechos de autor.
-        list_text: 'Estas comunidades se han constituido formalmente como delegaciones
-          locales:'
+        list_text: 'Estas comunidades se han constituido formalmente como Capítulos
+          Locales:'
       other_groups:
         title: Otros grupos
+        other_groups_html: |-
+          No hay necesidad de establecer formalmente un grupo en la misma medida que los Capítulos Locales.
+          De hecho, muchos grupos existen con mucho éxito como una reunión informal de personas o como un grupo
+          comunitario. Cualquiera puede crearlos o unirse a estos. Obten más información en %{communities_wiki_link}.
+        communities_wiki: Página wiki de comunidades
+        communities_wiki_url: https://wiki.openstreetmap.org/wiki/ES:Grupo_de_usuarios
   traces:
     visibility:
       private: Privado (solo compartido como anónimo, puntos no ordenados)
@@ -2469,21 +2534,22 @@ es:
       help_url: https://wiki.openstreetmap.org/wiki/ES:Subir
     create:
       upload_trace: Subir traza GPS
-      trace_uploaded: Su archivo GPX se ha cargado y está esperando su inserción en
-        la base de datos. Por lo general, esto sucederá en media hora y se le enviará
+      trace_uploaded: Tu archivo GPX se ha cargado y está esperando su inserción en
+        la base de datos. Por lo general, esto sucederá en media hora y se te enviará
         un correo electrónico al finalizar.
       upload_failed: Lo sentimos, no se ha podido subir el GPX. Un administrador ha
-        sido alertado del error. Inténtelo de nuevo.
+        sido alertado del error. Inténtalo de nuevo.
       traces_waiting:
-        one: Tiene %{count} traza esperando por subir. Considere esperar a que termine
+        one: Tienes %{count} traza esperando por subir. Considera esperar a que termine
           antes de cargar más, para no bloquear la cola para otros usuarios.
-        other: Tiene %{count} trazas esperando por subir. Considere esperar a que
+        other: Tienes %{count} trazas esperando por subir. Considera esperar a que
           terminen antes de cargar más, para no bloquear la cola para otros usuarios.
     edit:
       cancel: Cancelar
       title: Editando traza %{name}
       heading: Editando traza %{name}
       visibility_help: ¿Qué significa esto?
+      visibility_help_url: https://wiki.openstreetmap.org/wiki/ES:Visibilidad_de_trazas_GPS
     update:
       updated: Traza actualizada
     trace_optionals:
@@ -2508,7 +2574,7 @@ es:
       delete_trace: Eliminar esta traza
       trace_not_found: ¡No se ha encontrado la traza!
       visibility: 'Visibilidad:'
-      confirm_delete: ¿Quiere eliminar esta traza?
+      confirm_delete: ¿Quieres eliminar esta traza?
     trace_paging_nav:
       older: Trazas más antiguas
       newer: Trazas más recientes
@@ -2534,10 +2600,11 @@ es:
       description: Explorar las trazas GPS recién subidas
       tagged_with: etiquetado con %{tags}
       empty_title: Todavía no hay nada
-      empty_upload_html: '%{upload_link} o conozca más sobre el trazado GPS en la
-        %{wiki_link} correspondiente.'
-      upload_new: Cargue una traza nueva
+      empty_upload_html: '%{upload_link} o conoce más sobre el trazado GPS en la %{wiki_link}
+        correspondiente.'
+      upload_new: Carga una traza nueva
       wiki_page: página del wiki
+      wiki_page_url: https://wiki.openstreetmap.org/wiki/ES:Gu%C3%ADa_del_principiante_1.2
       upload_trace: Subir una traza
       all_traces: Todas las trazas
       my_traces: Mis trazas
@@ -2562,20 +2629,20 @@ es:
         other: Archivo GPX con %{count} puntos de %{user}
       description_without_count: Archivo GPX de %{user}
   application:
-    permission_denied: No tiene permisos para realizar esa acción
+    permission_denied: No tienes permisos para realizar esa acción
     require_cookies:
-      cookies_needed: Parece que tiene las cookies deshabilitadas. Habilite las cookies
-        en su navegador antes de continuar.
+      cookies_needed: Parece que tienes las cookies deshabilitadas. Habilita las cookies
+        en tu navegador antes de continuar.
     require_admin:
       not_an_admin: Necesitas ser un administrador para realizar esa acción.
     setup_user_auth:
-      blocked_zero_hour: Tiene un mensaje urgente en el sitio web de OpenStreetMap.
-        Debe leer el mensaje para poder guardar sus ediciones.
-      blocked: Su acceso a la API ha sido bloqueado. Inicie sesión en la interfaz
+      blocked_zero_hour: Tienes un mensaje urgente en el sitio web de OpenStreetMap.
+        Debes leer el mensaje para poder guardar tus ediciones.
+      blocked: Tu acceso a la API ha sido bloqueado. Inicia sesión en la interfaz
         web para obtener más información.
-      need_to_see_terms: Su acceso a la API está temporalmente suspendido. Inicie
-        sesión en la web para ver los Términos de colaborador. No es necesario aceptarlos,
-        pero debe conocerlos.
+      need_to_see_terms: Tu acceso a la API está temporalmente suspendido. Inicia
+        sesión en la web para ver los Términos de Colaborador. No es necesario aceptarlos,
+        pero debes conocerlos.
     settings_menu:
       account_settings: Configuración de la cuenta
       oauth1_settings: Otras configuraciones
@@ -2583,37 +2650,37 @@ es:
       oauth2_authorizations: Autorizaciones de OAuth 2
   oauth:
     authorize:
-      title: Autorizar el acceso a su cuenta
-      request_access_html: La aplicación %{app_name} solicita acceso a su cuenta,
-        %{user}. Compruebe si desea que la aplicación tenga las siguientes capacidades.
-        Puede elegir tantas o tan pocas como quiera.
+      title: Autorizar el acceso a tu cuenta
+      request_access_html: La aplicación %{app_name} solicita acceso a tu cuenta,
+        %{user}. Comprueba si deseas que la aplicación tenga las siguientes capacidades.
+        Puedes elegir tantas o tan pocas como quieras.
       allow_to: 'Permitir a la aplicación cliente:'
-      allow_read_prefs: leer sus preferencias de usuario.
-      allow_write_prefs: modificar sus preferencias de usuario.
+      allow_read_prefs: leer tus preferencias de usuario.
+      allow_write_prefs: modificar tus preferencias de usuario.
       allow_write_diary: crear entradas en el diario, comentarios y hacer amigos.
       allow_write_api: modificar el mapa.
-      allow_read_gpx: leer sus trazas GPS privadas.
+      allow_read_gpx: leer tus trazas GPS privadas.
       allow_write_gpx: subir trazas GPS.
       allow_write_notes: cambiar notas.
       grant_access: Otorgar acceso
     authorize_success:
       title: Solicitud de autorización permitida
-      allowed_html: Ha concedido acceso a su cuenta a la aplicación %{app_name}.
+      allowed_html: Has concedido 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
-      denied: Ha denegado a la aplicación %{app_name} el acceso a su cuenta.
+      denied: Has denegado a la aplicación %{app_name} el acceso a tu cuenta.
       invalid: El token de autorización no es válido.
     revoke:
-      flash: Revocó el token para %{application}
+      flash: Revocaste el token para %{application}
     permissions:
-      missing: No ha permitido que la aplicación acceda a esta instalación.
+      missing: No has permitido que la aplicación acceda a esta instalación.
     scopes:
       read_prefs: Leer preferiencias de usuario
-      write_prefs: modificar sus preferencias de usuario.
+      write_prefs: modificar tus preferencias de usuario.
       write_diary: Crea entradas diarias, comentarios y haz amigos
       write_api: modificar el mapa.
-      read_gpx: Leer sus trazas de GPS privadas
+      read_gpx: Leer tus trazas de GPS privadas
       write_gpx: Subir trazas de GPS
       write_notes: Modifica notas
       read_email: Leer dirección de correo electrónico del usuario
@@ -2622,56 +2689,57 @@ es:
     new:
       title: Registrar una nueva aplicación
     edit:
-      title: Editar su aplicación
+      title: Editar tu aplicación
     show:
       title: Detalles de OAuth de %{app_name}
       key: 'Clave de Consumidor:'
-      secret: 'Secreto de Consumidor:'
-      url: 'URL de Token de Solicitud:'
-      access_url: 'URL de Token de Acceso:'
+      secret: 'Secreto de consumidor:'
+      url: 'URL de token de solicitud:'
+      access_url: 'URL de token de acceso:'
       authorize_url: 'URL de autorización:'
       support_notice: Soportamos HMAC-SHA1 (recomendado) y firmas RSA-SHA1.
       edit: Editar detalles
       delete: Eliminar cliente
-      confirm: ¿Está seguro?
+      confirm: ¿Estás seguro?
       requests: 'Solicitando los siguientes permisos del usuario:'
     index:
       title: Mis datos OAuth
       my_tokens: Mis aplicaciones autorizadas
-      list_tokens: 'Se han emitido los siguientes tokens para aplicaciones en su nombre:'
+      list_tokens: 'Se han emitido los siguientes tokens para aplicaciones en tu nombre:'
       application: Nombre de la aplicación
       issued_at: Emitido el
       revoke: ¡Revocar!
       my_apps: Mis aplicaciones cliente
-      no_apps_html: ¿Tiene una aplicación que le gustaría registrar para usar con
-        nosotros utilizando el estándar %{oauth}? Debe registrar su aplicación web
-        antes de que pueda hacer solicitudes OAuth a este servicio.
+      no_apps_html: ¿Tienes una aplicación que te gustaría registrar para usar con
+        nosotros utilizando el estándar %{oauth}? Debes registrar tu aplicación web
+        antes de que puedas hacer solicitudes OAuth a este servicio.
       oauth: OAuth
-      registered_apps: 'Tiene las siguientes aplicaciones cliente registradas:'
-      register_new: Registre su aplicación
+      registered_apps: 'Tienes las siguientes aplicaciones cliente registradas:'
+      register_new: Registra tu aplicación
     form:
       requests: 'Solicita los siguientes permisos del usuario:'
     not_found:
       sorry: Lo sentimos, ese %{type} no puede ser encontrado.
     create:
-      flash: Registrada la información exitosamente
+      flash: Información registrada exitosamente
     update:
       flash: Actualizada la información del cliente exitosamente
     destroy:
       flash: Destruido el registro de aplicación del cliente
   oauth2_applications:
     index:
-      title: Mis Aplicaciones de Cliente
-      no_applications_html: ¿Tiene una aplicación que le gustaría registrar para usar
-        con nosotros utilizando el estándar %{oauth2}? Debe registrar su aplicación
+      title: Mis aplicaciones de cliente
+      no_applications_html: ¿Tienes una aplicación que te gustaría registrar para
+        usar con nosotros utilizando el estándar %{oauth2}? Debes registrar tu aplicación
         antes de que pueda hacer solicitudes OAuth a este servicio.
-      new: Registre su aplicación
+      oauth_2: OAuth 2
+      new: Registra tu aplicación
       name: Nombre
       permissions: Permisos
     application:
       edit: Ediciones
       delete: Eliminar
-      confirm_delete: Ver esta aplicación
+      confirm_delete: ¿Eliminar esta aplicación?
     new:
       title: Registrar una nueva aplicación
     edit:
@@ -2682,7 +2750,7 @@ es:
       confirm_delete: ¿Eliminar esta aplicación?
       client_id: Identificador de cliente
       client_secret: Secreto del cliente
-      client_secret_warning: Asegúrese de guardar este secreto - no será accesible
+      client_secret_warning: Asegúrese de guardar este secreto - no estará disponible
         de nuevo
       permissions: 'Permisos:'
       redirect_uris: Redirigir URI
@@ -2691,69 +2759,76 @@ es:
   oauth2_authorizations:
     new:
       title: Se necesita autorización
-      introduction: ¿Autorizar a %{application} a acceder a su cuenta con los siguientes
+      introduction: ¿Autorizar a %{application} a acceder a tu cuenta con los siguientes
         permisos?
-      authorize: Autorizar →
+      authorize: Autorizar
       deny: Denegar
     error:
-      title: Se produjo un error.
+      title: Se produjo un error
     show:
       title: Sin código de autorización
   oauth2_authorized_applications:
     index:
       title: Mis aplicaciones autorizadas
       application: Solicitudes
-      permissions: 'Permisos:'
-      no_applications_html: Aún no ha autorizado ninguna aplicación %{oauth2}.
+      permissions: Permisos
+      no_applications_html: Aún no has autorizado aplicaciones a %{oauth2}.
     application:
       revoke: Revocar el acceso
       confirm_revoke: ¿Revocar el acceso a esta aplicación?
   users:
     new:
       title: Registrarse
-      no_auto_account_create: Lamentablemente, ahora no podemos crear su cuenta automáticamente.
-      please_contact_support_html: 'Póngase en contacto con %{support_link} para organizar
+      no_auto_account_create: Lamentablemente, ahora no podemos crear tu cuenta automáticamente.
+      please_contact_support_html: 'Pónte en contacto con %{support_link} para organizar
         la creación de una cuenta: intentaremos atender la solicitud lo antes posible.'
       support: asistencia
       about:
         header: Libre y editable
         paragraph_1: A diferencia de otros mapas, OpenStreetMap está completamente
-          creado por personas como tú, y cualquiera puede repararlo, actualizarlo,
+          creado por personas como tú, y cualquiera puede corregirlo, actualizarlo,
           descargarlo y usarlo de forma gratuita.
         paragraph_2: Regístrate para comenzar a contribuir. Te enviaremos un email
           para confirmar tu cuenta.
-      display name description: Su nombre de usuario público. Puede cambiarlo más
+      display name description: Tu nombre de usuario público. Puedes cambiarlo más
         tarde en las preferencias.
-      external auth: 'Autenticación de terceros:'
-      use external auth: O bien, utilice un servicio de terceros para acceder
+      external auth: 'Autentificación de terceros:'
+      use external auth: O bien, utiliza un servicio de terceros para acceder
       auth no password: Con la autenticación de terceros no se necesita una contraseña,
-        aunque hay algunas herramientas y servidores que aún la solicitan.
+        aunque habrá algunas herramientas y servidores que aún la soliciten.
       continue: Registrarse
-      terms accepted: ¡Gracias por aceptar los nuevos términos de colaborador!
+      terms accepted: ¡Gracias por aceptar los nuevos Términos de Colaborador!
+      email_confirmation_help_html: Tu dirección no se muestra públicamente, consulta
+        nuestra %{privacy_policy_link} para obtener más información.
       privacy_policy: normativa de privacidad
+      privacy_policy_title: Política de privacidad de la OSMF, incluida la sección
+        sobre direcciones de correo electrónico
     terms:
       title: Términos
       heading: Términos
-      heading_ct: Términos de colaborador
-      read and accept with tou: Lea el acuerdo de colaborador y los términos de uso,
+      heading_ct: Términos de Colaborador
+      read and accept with tou: Lea el acuerdo de colaborador y los Términos de Uso,
         marque ambas casillas de verificación cuando haya terminado y luego presione
         el botón Continuar.
-      contributor_terms_explain: Este acuerdo gobierna los términos de sus contribuciones
+      contributor_terms_explain: Este acuerdo gobierna los términos de tus contribuciones
         actuales y futuras.
-      read_ct: He leído y estoy de acuerdo con los términos de colaborador arriba
+      read_ct: He leído y estoy de acuerdo con los Términos de Colaborador arriba
         descritos
       tou_explain_html: Estos %{tou_link} rigen el uso del sitio web y de la infraestructura
-        provista por OSMF. Haga clic en el enlace, lea y acepte el texto.
+        provista por OSMF. Haz clic en el enlace, lee y acepta el texto.
       read_tou: He leído y estoy de acuerdo con los Términos de Uso
       consider_pd: Además del acuerdo anterior, considero que mis contribuciones se
         encuentran en Dominio Público.
       consider_pd_why: ¿Qué es esto?
+      guidance_info_html: 'Información para ayudar a comprender estos términos: un
+        %{readable_summary_link} y algunas %{informal_translations_link}'
+      readable_summary: resumen legible por humanos
       informal_translations: traducciones informales
       continue: Continuar
-      declined: https://wiki.openstreetmap.org/wiki/ES:Contributor_Terms_Declined
+      declined: https://wiki.openstreetmap.org/wiki/ES:Términos_de_contribuidor_rechazados
       decline: Declinar
-      you need to accept or decline: Lea y luego acepte o rechace los nuevos Términos
-        de colaborador para continuar.
+      you need to accept or decline: Lee y luego acepta o rechaza los nuevos Términos
+        de Colaborador para continuar.
       legale_select: 'País de residencia:'
       legale_names:
         france: Francia
@@ -2761,14 +2836,14 @@ es:
         rest_of_world: Resto del mundo
     terms_declined_flash:
       terms_declined_html: Lamentamos que haya decidido no aceptar los nuevos Términos
-        de colaborador. Para obtener más información, consulte %{terms_declined_link}.
+        de Colaborador. Para obtener más información, consulte %{terms_declined_link}.
       terms_declined_link: esta página wiki
-      terms_declined_url: https://wiki.openstreetmap.org/wiki/ES:Contributor_Terms_Declined
+      terms_declined_url: https://wiki.openstreetmap.org/wiki/ES:Términos_de_contribuidor_rechazados
     no_such_user:
       title: Este usuario no existe
       heading: El usuario %{user} no existe
-      body: Lo sentimos, no existe ningún usuario con el nombre %{user}. Revise  las
-        letras, o tal vez el enlace en el que hizo clic sea incorrecto.
+      body: Lo sentimos, no existe algún usuario con el nombre %{user}. Revisa las
+        letras, o tal vez el enlace en el que hiciste clic sea incorrecto.
       deleted: eliminado
     show:
       my diary: Mi diario
@@ -2777,7 +2852,7 @@ es:
       my notes: Mis notas
       my messages: Mis mensajes
       my profile: Mi perfil
-      my settings: Mi configuración
+      my settings: Mis configuraciones
       my comments: Mis comentarios
       my_preferences: Mis preferencias
       my_dashboard: Mi tablero
@@ -2792,7 +2867,7 @@ es:
       remove as friend: Eliminar como amigo
       add as friend: Añadir como amigo
       mapper since: 'Mapeando desde:'
-      ct status: 'Términos de colaborador:'
+      ct status: 'Términos de Colaborador:'
       ct undecided: Indeciso
       ct declined: Rechazado
       latest edit: 'Última edición (%{ago}):'
@@ -2823,8 +2898,8 @@ es:
       confirm: Confirmar
       report: Denunciar a este usuario
     go_public:
-      flash success: Todas sus ediciones ahora son públicas y ya está autorizado para
-        editar.
+      flash success: Todas tus ediciones ahora son públicas y ya estás autorizado
+        para editar.
     index:
       title: Usuarios
       heading: Usuarios
@@ -2839,26 +2914,27 @@ es:
     suspended:
       title: Cuenta suspendida
       heading: Cuenta suspendida
-      support: A favor
-      automatically_suspended: Lo sentimos, su cuenta ha sido suspendida automáticamente
+      support: a favor
+      automatically_suspended: Lo sentimos, tu cuenta ha sido suspendida automáticamente
         debido a actividad sospechosa.
       contact_support_html: Esta decisión será revisada por un administrador en breve,
-        o puede ponerse en contacto con %{support_link} si desea discutir sobre esto.
+        o puedes ponerte en contacto con %{support_link} si deseas discutir sobre
+        esto.
     auth_failure:
-      connection_failed: Falló la conexión con el proveedor de autenticación
-      invalid_credentials: Datos de autenticación no válidos
+      connection_failed: Falló la conexión con el proveedor de autentificación
+      invalid_credentials: Datos de autentificación no válidos
       no_authorization_code: Sin código de autorización
       unknown_signature_algorithm: Algoritmo de firma desconocido
       invalid_scope: Ámbito no válido
       unknown_error: Autentificación fallida
     auth_association:
-      heading: Su identificador aún no está asociado con una cuenta de OpenStreetMap.
-      option_1: Si eres nuevo en OpenStreetMap, crea  cuenta nueva usando el formulario
+      heading: Tu identificador aún no está asociado con una cuenta de OpenStreetMap.
+      option_1: Si eres nuevo en OpenStreetMap, crea una cuenta nueva usando el formulario
         a continuación.
       option_2: |-
-        Si ya tiene una cuenta, puede iniciar sesión en su cuenta
-        usando su nombre de usuario y contraseña y luego asociar la cuenta
-        con su identificador en sus preferencias de usuario.
+        Si ya tienes una cuenta, puedes iniciar sesión a tu cuenta
+        usando tu nombre de usuario y contraseña y luego asociar la cuenta
+        con tu identificador en tus configuraciones de usuario.
   user_role:
     filter:
       not_a_role: La cadena `%{role}' no es un rol válido.
@@ -2869,7 +2945,7 @@ es:
     grant:
       title: Confirmar adjudicación de rol
       heading: Confirmar adjudicación de rol
-      are_you_sure: ¿Está seguro de que desea otorgar el rol `%{role}' al usuario
+      are_you_sure: ¿Estás seguro de que deseas otorgar el rol `%{role}' al usuario
         `%{name}'?
       confirm: Confirmar
       fail: No pudo otorgarse el rol `%{role}' al usuario `%{name}'. Comprueba que
@@ -2877,7 +2953,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á 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
@@ -2893,14 +2969,14 @@ es:
     new:
       title: Creando un bloqueo para %{name}
       heading_html: Creando un bloqueo para %{name}
-      period: ¿Por cuánto tiempo, empezando ahora, el usuario tendrá bloqueado el
-        uso de la API?
+      period: ¿Por cuánto tiempo, empezando desde ahora, el usuario tendrá bloqueado
+        el uso de la API?
       back: Ver todos los bloqueos
     edit:
       title: Editando el bloqueo sobre %{name}
       heading_html: Editando el bloqueo sobre %{name}
-      period: ¿Por cuánto tiempo, empezando ahora, el usuario tendrá bloqueado el
-        uso de la API?
+      period: ¿Por cuánto tiempo, empezando desde ahora, el usuario tendrá bloqueado
+        el uso de la API?
       show: Ver este bloqueo
       back: Ver todos los bloqueos
     filter:
@@ -2908,21 +2984,21 @@ es:
       block_period: El periodo de bloqueo debe de ser uno de los valores seleccionables
         de la lista desplegable.
     create:
-      flash: Ha creado un bloqueo en el usuario %{name}.
+      flash: Has creado un bloqueo en el usuario %{name}.
     update:
       only_creator_can_edit: Sólo el moderador que ha creado este bloqueo puede editarlo.
       success: Bloqueo actualizado.
     index:
       title: Bloqueos de usuario
       heading: Listado de bloqueos de usuario
-      empty: Todavía no se ha hecho ningún bloqueo.
+      empty: Todavía no se ha hecho algún bloqueo.
     revoke:
       title: Revocando el bloqueo sobre %{block_on}
       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?
-      revoke: Revocar
+      confirm: ¿Estás seguro de que desea revocar este bloqueo?
+      revoke: ¡Revocar!
       flash: Este bloqueo ha sido revocado.
     helper:
       time_future_html: Termina en %{time}.
@@ -2953,7 +3029,7 @@ es:
     blocks_by:
       title: Bloqueos por %{name}
       heading_html: Listado de bloqueos por %{name}
-      empty: '%{name} todavía no ha creado ningún bloqueo.'
+      empty: '%{name} todavía no ha creado algún bloqueo.'
     show:
       title: '%{block_on} bloqueado por %{block_by}'
       heading_html: '%{block_on} bloqueado por %{block_by}'
@@ -2962,8 +3038,8 @@ es:
       status: 'Estado:'
       show: Mostrar
       edit: Editar
-      revoke: Revocar
-      confirm: ¿Está seguro?
+      revoke: ¡Revocar!
+      confirm: ¿Estás seguro?
       reason: 'Razón del bloqueo:'
       back: Ver todos los bloqueos
       revoker: 'Revocador:'
@@ -2973,7 +3049,7 @@ es:
       not_revoked: (no revocado)
       show: Mostrar
       edit: Editar
-      revoke: Revocar
+      revoke: ¡Revocar!
     blocks:
       display_name: Usuario bloqueado
       creator_name: Creador
@@ -3000,6 +3076,15 @@ es:
       open_title: 'Nota sin resolver #%{note_name}'
       closed_title: 'Nota resuelta #%{note_name}'
       hidden_title: 'Nota oculta #%{note_name}'
+      event_opened_by_html: Creado por %{user} %{time_ago}
+      event_opened_by_anonymous_html: Creado por anónimo %{time_ago}
+      event_commented_by_html: Comentario de %{user} %{time_ago}
+      event_commented_by_anonymous_html: Comentario de un anónimo %{time_ago}
+      event_closed_by_html: Resuelta por %{user} %{time_ago}
+      event_closed_by_anonymous_html: Resuelto por anónimo %{time_ago}
+      event_reopened_by_html: Reactivada por %{user} %{time_ago}
+      event_reopened_by_anonymous_html: Reactivado por anónimo %{time_ago}
+      event_hidden_by_html: Ocultado por %{user} %{time_ago}
       report: denunciar esta nota
       anonymous_warning: Esta nota incluye comentarios de usuarios anónimos que deben
         ser verificados de forma independiente.
@@ -3008,18 +3093,18 @@ es:
       reactivate: Reactivar
       comment_and_resolve: Comentar y resolver
       comment: Comentar
-      report_link_html: Si esta nota contiene información delicada que debe eliminarse,
-        puede %{link}.
-      other_problems_resolve: Para todos los demás problemas con la nota, resuélvalo
+      report_link_html: Si esta nota contiene información sensible que debe eliminarse,
+        puedes %{link}.
+      other_problems_resolve: Para todos los demás problemas con la nota, resuélvelo
         con un comentario.
       other_problems_resolved: Para todos los demás problemas, la resolución es suficiente.
       disappear_date_html: Esta nota resuelta desaparecerá del mapa en %{disappear_in}.
     new:
       title: Nota nueva
-      intro: ¿Detectó un error o falta algo? Informe a otros mapeadores para que podamos
-        solucionarlo. Mueva el marcador a la posición correcta y escriba una nota
-        para explicar el problema.
-      advice: La nota será pública y podría utilizarse para actualizar el mapa, así
+      intro: ¿Detectaste un error o falta algo? Informa a otros mapeadores para que
+        podamos corregirlo. Mueve el marcador a la posición correcta y escribe una
+        nota para explicar el problema.
+      advice: Tu nota será pública y podría utilizarse para actualizar el mapa, así
         que no des información personal ni datos provenientes de mapas o catálogos
         protegidos por derechos de autor.
       add: Añadir nota
@@ -3043,10 +3128,10 @@ es:
       include_marker: Incluir marcador
       center_marker: Centrar mapa en el marcador
       paste_html: Pegar código HTML para incrustar en el sitio web
-      view_larger_map: Ver mapa más grande
+      view_larger_map: Ver el mapa más grande
       only_standard_layer: Sólo la capa estándar se puede exportar como una imagen
     embed:
-      report_problem: Reportar problemas
+      report_problem: Reportar un problema
     key:
       title: Leyenda del mapa
       tooltip: Leyenda del mapa
@@ -3058,11 +3143,11 @@ es:
       locate:
         title: Mostrar mi ubicación
         metersPopup:
-          one: Estás a un metro de este punto
+          one: Estás a %{count} metro de este punto
           other: Estás a %{count} metros de este punto
         feetPopup:
-          one: Estás dentro de una distancia de un pie desde este punto
-          other: Estás dentro de una distancia de %{count} pies desde este punto
+          one: Estás a %{count} pie desde este punto
+          other: Estás a %{count} pies desde este punto
       base:
         standard: Estándar
         cyclosm: CyclOSM
@@ -3077,10 +3162,17 @@ es:
         gps: Trazas GPS públicas
         overlays: Activar superposiciones para solucionar problemas en el mapa
         title: Capas
-      make_a_donation: Hacer un donativo
+      openstreetmap_contributors: Colaboradores de OpenStreetMap
+      make_a_donation: Hacer una donación
       website_and_api_terms: Términos del sitio web y de la API
+      cyclosm_credit: Estilo de teselas por %{cyclosm_link} alojados por %{osm_france_link}
+      cyclosm_name: CyclOSM
       osm_france: OpenStreetMap Francia
+      thunderforest_credit: Teselas cortesía de %{thunderforest_link}
       andy_allan: Andy Allan
+      opnvkarte_credit: Teselas cortesía de %{memomaps_link}
+      memomaps: MeMoMaps
+      hotosm_credit: Estilo de teselas por %{hotosm_link} alojados por %{osm_france_link}
       hotosm_name: Equipo humanitario de OpenStreetMap
     site:
       edit_tooltip: Editar el mapa
@@ -3098,8 +3190,8 @@ es:
         unsubscribe: Cancelar suscripción
         hide_comment: ocultar
         unhide_comment: mostrar
-    edit_help: Mueva el mapa el mapa y acerca a una ubicación que desees editar, luego
-      haga clic aquí.
+    edit_help: Mueve el mapa el mapa y acerca a una ubicación que desees editar, luego
+      haz clic aquí.
     directions:
       ascend: Ascender
       engines:
@@ -3122,81 +3214,81 @@ es:
         no_place: No se pudo localizar «%{place}».
       instructions:
         continue_without_exit: Continuar en %{name}
-        slight_right_without_exit: Gire un poco a la derecha hacia %{name}
-        offramp_right: Tome la rampa de la derecha
-        offramp_right_with_exit: Tome la salida %{exit} a la derecha
-        offramp_right_with_exit_name: Tome la salida %{exit} a la derecha hacia %{name}
-        offramp_right_with_exit_directions: Tome la salida %{exit} a la derecha hacia
+        slight_right_without_exit: Gira un poco a la derecha hacia %{name}
+        offramp_right: Toma la rampa de la derecha
+        offramp_right_with_exit: Toma la salida %{exit} a la derecha
+        offramp_right_with_exit_name: Toma la salida %{exit} a la derecha hacia %{name}
+        offramp_right_with_exit_directions: Toma la salida %{exit} a la derecha hacia
           %{directions}
-        offramp_right_with_exit_name_directions: Tome la salida %{exit} a la derecha
+        offramp_right_with_exit_name_directions: Toma la salida %{exit} a la derecha
           hacia %{name}, en dirección %{directions}
-        offramp_right_with_name: Tome la rampa a la derecha hacia %{name}
-        offramp_right_with_directions: Tome la salida a la derecha hacia %{directions}
-        offramp_right_with_name_directions: Tome la rampa a la derecha hacia %{name},
+        offramp_right_with_name: Toma la rampa a la derecha hacia %{name}
+        offramp_right_with_directions: Toma la salida a la derecha hacia %{directions}
+        offramp_right_with_name_directions: Toma la rampa a la derecha hacia %{name},
           en dirección %{directions}
-        onramp_right_without_exit: Gire a la derecha en la rampa hacia %{name}
-        onramp_right_with_directions: Gire a la derecha en la rampa hacia %{directions}
-        onramp_right_with_name_directions: Gire a la derecha en la rampa hacia %{name},
+        onramp_right_without_exit: Gira a la derecha en la rampa hacia %{name}
+        onramp_right_with_directions: Gira a la derecha en la rampa hacia %{directions}
+        onramp_right_with_name_directions: Gira a la derecha en la rampa hacia %{name},
           en dirección %{directions}
-        onramp_right_without_directions: Gire a la derecha en la rampa
-        onramp_right: Gire a la derecha en la rampa
-        endofroad_right_without_exit: Al final de la calle gire a la derecha hacia
+        onramp_right_without_directions: Gira a la derecha en la rampa
+        onramp_right: Gira a la derecha en la rampa
+        endofroad_right_without_exit: Al final de la calle gira a la derecha hacia
           %{name}
-        merge_right_without_exit: Incorpórese a la derecha hacia %{name}
-        fork_right_without_exit: En la bifurcación, gire a la derecha hacia %{name}
-        turn_right_without_exit: Gire a la derecha hacia %{name}
-        sharp_right_without_exit: Gire cerrado a la derecha hacia %{name}
-        uturn_without_exit: Gire en U a lo largo de %{name}
-        sharp_left_without_exit: Gire cerrado a la izquierda hacia %{name}
-        turn_left_without_exit: Gire a la izquierda hacia %{name}
-        offramp_left: Tome la rampa de la izquierda
-        offramp_left_with_exit: Tome la salida %{exit} de la izquierda
-        offramp_left_with_exit_name: Tome la salida %{exit} a la izquierda hacia %{name}
-        offramp_left_with_exit_directions: Tome la salida %{exit} a la izquierda hacia
+        merge_right_without_exit: Incorpórate a la derecha hacia %{name}
+        fork_right_without_exit: En la bifurcación, gira a la derecha hacia %{name}
+        turn_right_without_exit: Gira a la derecha hacia %{name}
+        sharp_right_without_exit: Gira cerrado a la derecha hacia %{name}
+        uturn_without_exit: Gira en U a lo largo de %{name}
+        sharp_left_without_exit: Gira cerrado a la izquierda hacia %{name}
+        turn_left_without_exit: Gira a la izquierda hacia %{name}
+        offramp_left: Toma la rampa de la izquierda
+        offramp_left_with_exit: Toma la salida %{exit} de la izquierda
+        offramp_left_with_exit_name: Toma la salida %{exit} a la izquierda hacia %{name}
+        offramp_left_with_exit_directions: Toma la salida %{exit} a la izquierda hacia
           %{directions}
-        offramp_left_with_exit_name_directions: Tome la salida %{exit} a la izquierda
+        offramp_left_with_exit_name_directions: Toma la salida %{exit} a la izquierda
           hacia %{name}, en dirección %{directions}
-        offramp_left_with_name: Tome la salida a la izquierda hacia %{name}
-        offramp_left_with_directions: Tome la rampa a la izquierda hacia %{directions}
-        offramp_left_with_name_directions: Tome la rampa a la izquierda hacia %{name},
+        offramp_left_with_name: Toma la salida a la izquierda hacia %{name}
+        offramp_left_with_directions: Toma la rampa a la izquierda hacia %{directions}
+        offramp_left_with_name_directions: Toma la rampa a la izquierda hacia %{name},
           en dirección %{directions}
-        onramp_left_without_exit: Gire a la izquierda en la rampa hacia %{name}
-        onramp_left_with_directions: Gire a la izquierda en la rampa hacia %{directions}
-        onramp_left_with_name_directions: Gire a la izquierda en la rampa hacia %{name},
+        onramp_left_without_exit: Gira a la izquierda en la rampa hacia %{name}
+        onramp_left_with_directions: Gira a la izquierda en la rampa hacia %{directions}
+        onramp_left_with_name_directions: Gira a la izquierda en la rampa hacia %{name},
           en dirección %{directions}
-        onramp_left_without_directions: Gire a la izquierda en la rampa
-        onramp_left: Gire a la izquierda en la rampa
-        endofroad_left_without_exit: Al final de la calle gire a la izquierda hacia
+        onramp_left_without_directions: Gira a la izquierda en la rampa
+        onramp_left: Gira a la izquierda en la rampa
+        endofroad_left_without_exit: Al final de la calle gira a la izquierda hacia
           %{name}
-        merge_left_without_exit: Incorpórese a la izquierda hacia %{name}
-        fork_left_without_exit: En la bifurcación, gire a la izquierda hacia %{name}
-        slight_left_without_exit: Gire un poco a la izquierda hacia %{name}
+        merge_left_without_exit: Incorpórate a la izquierda hacia %{name}
+        fork_left_without_exit: En la bifurcación, gira a la izquierda hacia %{name}
+        slight_left_without_exit: Gira un poco a la izquierda hacia %{name}
         via_point_without_exit: (punto intermedio)
-        follow_without_exit: Siga a %{name}
-        roundabout_without_exit: En la rotonda, tome la salida hacia %{name}
-        leave_roundabout_without_exit: Salga de la rotonda - %{name}
-        stay_roundabout_without_exit: Permanezca en la rotonda - %{name}
+        follow_without_exit: Sigue a %{name}
+        roundabout_without_exit: En la rotonda, toma la salida hacia %{name}
+        leave_roundabout_without_exit: Sal de la rotonda - %{name}
+        stay_roundabout_without_exit: Permanece en la rotonda - %{name}
         start_without_exit: Comenzar en %{name}
-        destination_without_exit: Llegue a su destino
+        destination_without_exit: Llegaste a tu destino
         against_oneway_without_exit: Ir en contra del sentido único en %{name}
         end_oneway_without_exit: Final de sentido único en %{name}
-        roundabout_with_exit: En la rotonda, tome la salida %{exit} hacia %{name}
-        roundabout_with_exit_ordinal: En la rotonda, tome la salida %{exit} hacia
+        roundabout_with_exit: En la rotonda, toma la salida %{exit} hacia %{name}
+        roundabout_with_exit_ordinal: En la rotonda, toma la salida %{exit} hacia
           %{name}
-        exit_roundabout: Salga de la rotonda hacia %{name}
-        unnamed: sin nombre
+        exit_roundabout: Sal de la rotonda hacia %{name}
+        unnamed: vía genérica sin nombre
         courtesy: Indicaciones cortesía de %{link}
         exit_counts:
-          first: 1
-          second: 2
-          third: 3
-          fourth: 4
-          fifth: 5
-          sixth: 6
-          seventh: 7
-          eighth: 8
-          ninth: 9
-          tenth: 10
+          first: 1ª.
+          second: 2ª.
+          third: 3ª.
+          fourth: 4ª.
+          fifth: 5ª.
+          sixth: 6ª.
+          seventh: 7ª.
+          eighth: 8ª.
+          ninth: 9ª.
+          tenth: 10ª.
       time: Hora
     query:
       node: Nodo
@@ -3215,29 +3307,29 @@ es:
   redactions:
     edit:
       heading: Editar censura
-      title: Editar redacción
+      title: Editar censura
     index:
-      empty: No hay ninguna censura que mostrar.
-      heading: Lista de redacciones
+      empty: No hay ninguna censura para mostrar.
+      heading: Lista de censuras
       title: Lista de censuras
     new:
-      heading: Introduzca la información de la censura nueva
-      title: Creando nueva redacción
+      heading: Introduzca la información de la nueva censura
+      title: Creando nueva censura
     show:
       description: 'Descripción:'
-      heading: Mostrando redacción "%{title}"
-      title: Mostrando redacción
+      heading: Mostrando censura "%{title}"
+      title: Mostrando censura
       user: 'Creador:'
       edit: Editar esta censura
-      destroy: Eliminar esta redacción
+      destroy: Eliminar esta censura
       confirm: ¿Está seguro?
     create:
       flash: Se creó la censura.
     update:
       flash: Cambios guardados.
     destroy:
-      not_empty: La redacción no está vacía. Elimine todas las versiones previas pertenecientes
-        a esta redacción antes de destruirla.
+      not_empty: La censura no está vacía. Elimina todas las versiones previas pertenecientes
+        a esta censura antes de destruirla.
       flash: Redacción destruida.
       error: Se produjo un error al destruir esta censura.
   validations:
index 4022ba8773bfe44913bee43c151f37c39c0d857d..0aa7d67d63e6d9e6b2bbf9bee0e6262e3696c27f 100644 (file)
@@ -1954,6 +1954,9 @@ fr:
       no home location: Vous n’avez pas indiqué votre lieu de domicile.
       update home location on click: Mettre à jour mon lieu de domicile quand je clique
         sur la carte ?
+      show: Afficher
+      delete: Supprimer
+      undelete: Annuler la suppression
     update:
       success: Profil mis à jour.
       failure: Impossible de mettre à jour le profil.
index e931f9877fa2109b9d20eabd2f3d7648ed04d10e..5df67b97683e2fbf412bdb853abac493f8194f31 100644 (file)
@@ -1852,6 +1852,8 @@ hu:
       no home location: Nem adtad meg az otthonod helyét.
       update home location on click: Frissüljön-e az otthonom helye, amikor a térképre
         kattintok?
+      delete: Törlés
+      undelete: Törlés visszavonása
     update:
       success: Profil frissítve.
       failure: Nem sikerült frissíteni a profilt.
@@ -1962,6 +1964,8 @@ hu:
       legal_2_1_html: Kérjük, %{contact_the_osmf_link}, ha licencekkel kapcsolatos,
         szerzői jogi vagy egyéb jogi kérdései vannak.
       legal_2_1_contact_the_osmf: lépj kapcsolatba az OSM Alapítvánnyal
+      legal_2_2_html: Az OpenStreetMap, a nagyító logó és a State of the Map %{registered_trademarks_link}.
+      legal_2_2_registered_trademarks: az OSMF bejegyzett védjegye
       partners_title: Partnerek
     copyright:
       foreign:
index 3ac1f4a335a6cf4f78d5c59f83ed93f6b89f84f0..7a4063e4b5105769974c4b7493e1cb951ebef58c 100644 (file)
@@ -1839,6 +1839,9 @@ ia:
       no home location: Tu non ha entrate tu position de origine.
       update home location on click: Actualisar le position de origine quando io clicca
         sur le carta?
+      show: Monstrar
+      delete: Deler
+      undelete: Disfacer deletion
     update:
       success: Profilo actualisate.
       failure: Non poteva actualisar le profilo.
index f19773d34bdfaca1fc0852781d79a74afd670895..e000c57818703ff1e3764576fb9d6637fa0c9324 100644 (file)
@@ -1896,6 +1896,8 @@ it:
       home location: Posizione
       no home location: Non si è inserita la propria posizione.
       update home location on click: Aggiorna la posizione quando clicco sulla mappa?
+      show: Mostra
+      delete: Cancella
     update:
       success: Il profilo è stato aggiornato.
       failure: Impossibile aggiornare il profilo.
index 9c945b80611f8dd1cafc0a8a7a62119ab910cb47..9869ab108cd800af603d1e21a1598e756c999c3f 100644 (file)
@@ -1766,6 +1766,7 @@ ja:
       home location: ホーム地点
       no home location: あなたはまだホーム地点を登録していません。
       update home location on click: ホーム地点を、地図上のクリックした地点に変更
+      delete: 削除
     update:
       success: プロフィール更新済み。
       failure: プロファイルを更新できませんでした。
index 18f7b6bc3697098c6b9c1f37d0fa878408fa7cdc..7d92e3a5ac69ca722c0e2c0615dbabfb3f2ceeeb 100644 (file)
@@ -1809,6 +1809,9 @@ lb:
       home location: Heemecht
       no home location: Du hues nach keng Heemecht aginn.
       update home location on click: Heemecht beim Klick op d'Kaart aktualiséieren
+      show: Weisen
+      delete: Läschen
+      undelete: Läsche réckgängeg maachen
     update:
       success: Profil aktualiséiert.
       failure: De Profil konnt net aktualiséiert ginn.
index 84c971af52a35f32a75e91ee4c05b67279da7640..720b34c6bcea61ebbaa033481395aeb25a4494a4 100644 (file)
@@ -1828,6 +1828,9 @@ mk:
       no home location: Немате внесено матична местоположба.
       update home location on click: Подновувај ја матичната местоположба кога ќе
         стиснам на картата
+      show: Прикажи
+      delete: Избриши
+      undelete: Откажи бришење
     update:
       success: Профилот е подновен.
       failure: Не можев да го подновам профилот.
index 9a5fb3a94aab6f9c1476ed37b634b9a04618afb0..34e08cea6eef47f80e9c17397b291ac64ef11337 100644 (file)
@@ -1588,6 +1588,9 @@ nb:
       home location: Hjemmeposisjon
       no home location: Du har ikke angitt din hjemmeposisjon.
       update home location on click: Oppdater hjemmeposisjon når jeg klikker på kartet?
+      show: Vis
+      delete: Slett
+      undelete: Angre sletting
   sessions:
     new:
       title: Logg inn
index 058ada96cc9ec8aa15eb0d45d07ba845eb9eb1a0..95794336a795d482c951f3622cc58f09fbc78195 100644 (file)
@@ -1900,6 +1900,9 @@ nl:
       home location: Thuislocatie
       no home location: Er is geen thuislocatie ingevoerd.
       update home location on click: Thuislocatie aanpassen bij klikken op de kaart
+      show: Weergeven
+      delete: Verwijderen
+      undelete: Verwijderen ongedaan maken
     update:
       success: Profiel bijgewerkt.
       failure: Kon het profiel niet bijwerken.
index 72474027fdea5203c8f5df6c5c0d69c06aa8274e..b33dcc7b700a8542d58bcddb177ae2acba219c25 100644 (file)
@@ -1089,6 +1089,9 @@ skr-arab:
       save: پروفائل اپ ڈیٹ کرو
       cancel: منسوخ
       image: تصویر
+      show: ݙِکھاؤ
+      delete: مٹاؤ
+      undelete: بحال
   sessions:
     new:
       title: لاگ ان
index bc4c08c21beacb5f67ca02b51a53dd51c023a265..3bbe874dd46e962cb39778282813bd82cf592ab4 100644 (file)
@@ -59,7 +59,7 @@ sl:
         email_address_not_routable: ni preusmerljiv
     models:
       acl: Seznam nadzora dostopa
-      changeset: Sklop sprememb
+      changeset: Nabor sprememb
       changeset_tag: Oznaka množice sprememb
       country: Država
       diary_comment: Dnevniški komentar
@@ -301,7 +301,7 @@ sl:
           obstajajo, vendar si jih ne bo mogoče ogledati.
         retain_notes: Ohranjeni bodo morebitne opombe na zemljevidu in komentarji
           k opombam, vendar si jih ne bo mogoče ogledati.
-        retain_changeset_discussions: Ohranjeni bodo vaši pogovori o sklopih sprememb,
+        retain_changeset_discussions: Ohranjeni bodo vaši pogovori o naborih sprememb,
           če obstajajo.
         retain_email: Ohranjen bo vaš e-poštni naslov.
         confirm_delete: Ali ste prepričani?
@@ -361,7 +361,7 @@ sl:
     deleted_ago_by_html: Izbrisal %{user} %{time_ago}
     edited_ago_by_html: Uredil_a %{user} %{time_ago}
     version: Različica
-    in_changeset: Sklop sprememb
+    in_changeset: Nabor sprememb
     anonymous: anonimni
     no_comment: (brez komentarja)
     part_of: Del
@@ -380,7 +380,7 @@ sl:
     view_details: Prikaz podrobnosti
     location: 'Lokacija:'
     changeset:
-      title: 'Sklop sprememb: %{id}'
+      title: 'Nabor sprememb: %{id}'
       belongs_to: Avtor
       node: Vozlišč (%{count})
       node_paginated: Vozlišča (%{x}-%{y} od %{count})
@@ -391,15 +391,15 @@ sl:
       comment: Komentarji (%{count})
       hidden_comment_by_html: Skrit komentar %{user} %{time_ago}
       comment_by_html: Komentar %{user} %{time_ago}
-      changesetxml: Sklop sprememb XML
+      changesetxml: Nabor sprememb XML
       osmchangexml: osmChange XML
       feed:
-        title: Sklop sprememb %{id}
-        title_comment: Sklop sprememb %{id} – %{comment}
+        title: Nabor sprememb %{id}
+        title_comment: Nabor sprememb %{id} – %{comment}
       join_discussion: Prijavite se za pridružitev pogovoru
       discussion: Pogovor
-      still_open: Sklop sprememb je še vedno odprt – pogovor se bo začel, ko bo sklop
-        sprememb zaključen.
+      still_open: Nabor sprememb je še vedno odprt – pogovor se bo začel, ko bo nabor
+        sprememb zaprt.
     node:
       title_html: 'Vozlišče: %{name}'
       history_title_html: 'Zgodovina vozlišča: %{name}'
@@ -440,7 +440,7 @@ sl:
         node: vozlišče
         way: pot
         relation: relacija
-        changeset: sklop sprememb
+        changeset: nabor sprememb
         note: opomba
     timeout:
       title: Napaka časovne omejitve
@@ -449,7 +449,7 @@ sl:
         node: vozlišče
         way: pot
         relation: relacija
-        changeset: sklop sprememb
+        changeset: nabor sprememb
         note: opomba
     redacted:
       redaction: Redakcija %{id}
@@ -488,7 +488,7 @@ sl:
     changeset:
       anonymous: Anonimen
       no_edits: (brez urejanj)
-      view_changeset_details: Ogled podrobnosti sklopa sprememb
+      view_changeset_details: Ogled podrobnosti nabora sprememb
     changesets:
       id: ID
       saved_at: Shranjeno ob
@@ -502,26 +502,26 @@ sl:
       title_friend: Množice sprememb mojih prijateljev
       title_nearby: Sklopi sprememb bližnjih uporabnikov
       empty: Ni najdenih množic sprememb.
-      empty_area: Na tem območju ni sklopov sprememb.
+      empty_area: Na tem območju ni naborov sprememb.
       empty_user: Ni množic sprememb tega uporabnika.
-      no_more: Ni drugih najdenih sklopov sprememb.
+      no_more: Ni drugih najdenih naborov sprememb.
       no_more_area: Na tem območju ni drugih množic sprememb.
-      no_more_user: Ni drugih sklopov sprememb tega uporabnika.
+      no_more_user: Ni drugih naborov sprememb tega uporabnika.
       load_more: Naloži več
     timeout:
-      sorry: Žal je trajalo pridobivanje zahtevanega sklopa sprememb predolgo.
+      sorry: Žal je trajalo pridobivanje zahtevanega nabora sprememb predolgo.
   changeset_comments:
     comment:
-      comment: 'Nov komentar o sklopu sprememb #%{changeset_id} uporabnika %{author}'
+      comment: 'Nov komentar o naboru sprememb #%{changeset_id} uporabnika %{author}'
       commented_at_by_html: Posodobil_a %{user} %{when}
     comments:
-      comment: 'Nov komentar o sklopu sprememb #%{changeset_id} uporabnika %{author}'
+      comment: 'Nov komentar o naboru sprememb #%{changeset_id} uporabnika %{author}'
     index:
-      title_all: Razprava o sklopu sprememb OpenStreetMap
-      title_particular: 'Razprava o sklopu sprememb OpenStreetMap #%{changeset_id}'
+      title_all: Razprava o naboru sprememb OpenStreetMap
+      title_particular: 'Razprava o naboru sprememb OpenStreetMap #%{changeset_id}'
     timeout:
-      sorry: Žal je trajalo pridobivanje seznama zahtevanih komentarjev sklopov sprememb
-        predolgo.
+      sorry: Žal je trajalo pridobivanje seznama komentarjev nabora sprememb, ki ste
+        ga zahtevali, predolgo.
   dashboards:
     contact:
       km away: oddaljen %{count} km
@@ -1720,26 +1720,26 @@ sl:
       hi: Pozdravljeni, %{to_user},
       greeting: Pozdravljeni,
       commented:
-        subject_own: '[OpenStreetMap] %{commenter} je komentiral enega od vaših sklopov
+        subject_own: '[OpenStreetMap] %{commenter} je komentiral enega od vaših naborov
           sprememb'
         subject_other: '[OpenStreetMap] %{commenter} je komentiral množico sprememb,
           ki vas zanima'
-        your_changeset: '%{commenter} je %{time} komentiral enega od vaših sklopov
+        your_changeset: '%{commenter} je %{time} komentiral enega od vaših naborov
           sprememb'
         your_changeset_html: '%{commenter} je %{time} podal komentar na enega od vaših
-          sklopov sprememb'
-        commented_changeset: '%{commenter} je %{time} komentiral sklop sprememb, ki
+          naborov sprememb'
+        commented_changeset: '%{commenter} je %{time} komentiral nabor sprememb, ki
           ga spremljate in ga je ustvaril %{changeset_author}'
-        commented_changeset_html: '%{commenter} je podal komentar na sklop sprememb,
+        commented_changeset_html: '%{commenter} je podal komentar na nabor sprememb,
           ki ga opazujete in ki ga je %{time} ustvaril %{changeset_author}'
         partial_changeset_with_comment: s komentarjem »%{changeset_comment}«
         partial_changeset_with_comment_html: s komentarjem »%{changeset_comment}«
         partial_changeset_without_comment: brez komentarja
-      details: Več podrobnosti o tem sklopu sprememb lahko najdete na %{url}.
-      details_html: Več podrobnosti o tem sklopu sprememb lahko najdete na %{url}.
-      unsubscribe: Če se želite odnaročiti od obveščanja o tem sklopu sprememb, obiščite
+      details: Več podrobnosti o tem naboru sprememb lahko najdete na %{url}.
+      details_html: Več podrobnosti o tem naboru sprememb lahko najdete na %{url}.
+      unsubscribe: Če se želite odnaročiti od obveščanja o tem naboru sprememb, obiščite
         %{url} in kliknite »Odnaroči«.
-      unsubscribe_html: Če se želite odnaročiti od obveščanja o tem sklopu sprememb,
+      unsubscribe_html: Če se želite odnaročiti od obveščanja o tem naboru sprememb,
         obiščite %{url} in kliknite »Odnaroči«.
   confirmations:
     confirm:
@@ -1895,6 +1895,9 @@ sl:
       home location: Domača lokacija
       no home location: Niste nastavili vaše domače lokacije.
       update home location on click: Posodobim domačo lokacijo ob kliku zemljevida?
+      show: Prikaži
+      delete: Izbriši
+      undelete: Razvljavi izbris
     update:
       success: Profil posodobljen.
       failure: Profila ni bilo mogoče posodobiti.
index 4d74ecd4176952ce5c98de18938e0ada872d2f5e..085c06003f11b4f25125c722e40d19132c6e17ca 100644 (file)
@@ -1778,6 +1778,9 @@ zh-TW:
       home location: 家的位置
       no home location: 您尚未輸入家的位置。
       update home location on click: 當我點選地圖時更新家的位置?
+      show: 顯示
+      delete: 刪除
+      undelete: 還原刪除
     update:
       success: 已更新基本資料。
       failure: 無法更新個人資料。
index 9d6de4a6fafbc7ec6eb35a1adbd0700ecabf2b34..aa8e21938b149ffe13ca0f0a7e03fb107c3786d1 100644 (file)
@@ -9,10 +9,18 @@ module Api
         { :path => "/api/capabilities", :method => :get },
         { :controller => "api/capabilities", :action => "show" }
       )
+      assert_routing(
+        { :path => "/api/capabilities.json", :method => :get },
+        { :controller => "api/capabilities", :action => "show", :format => "json" }
+      )
       assert_recognizes(
         { :controller => "api/capabilities", :action => "show" },
         { :path => "/api/0.6/capabilities", :method => :get }
       )
+      assert_recognizes(
+        { :controller => "api/capabilities", :action => "show", :format => "json" },
+        { :path => "/api/0.6/capabilities.json", :method => :get }
+      )
     end
 
     def test_capabilities
@@ -32,5 +40,28 @@ module Api
         end
       end
     end
+
+    def test_capabilities_json
+      get api_capabilities_path, :params => { :format => "json" }
+      assert_response :success
+      js = ActiveSupport::JSON.decode(@response.body)
+      assert_not_nil js
+
+      assert_equal Settings.api_version, js["version"]
+      assert_equal Settings.generator, js["generator"]
+      assert_equal Settings.api_version, js["api"]["version"]["minimum"]
+      assert_equal Settings.api_version, js["api"]["version"]["maximum"]
+      assert_equal Settings.max_request_area, js["api"]["area"]["maximum"]
+      assert_equal Settings.max_note_request_area, js["api"]["note_area"]["maximum"]
+      assert_equal Settings.tracepoints_per_page, js["api"]["tracepoints"]["per_page"]
+      assert_equal Changeset::MAX_ELEMENTS, js["api"]["changesets"]["maximum_elements"]
+      assert_equal Settings.default_changeset_query_limit, js["api"]["changesets"]["default_query_limit"]
+      assert_equal Settings.max_changeset_query_limit, js["api"]["changesets"]["maximum_query_limit"]
+      assert_equal Settings.max_number_of_relation_members, js["api"]["relationmembers"]["maximum"]
+      assert_equal "online", js["api"]["status"]["database"]
+      assert_equal "online", js["api"]["status"]["api"]
+      assert_equal "online", js["api"]["status"]["gpx"]
+      assert_equal Settings.imagery_blacklist.length, js["policy"]["imagery"]["blacklist"].length
+    end
   end
 end
index 7f2cd0abb35c908d957835d12833c7648a470d57..4f96e3ecb0d713b78f70988adb8f2f301d9c35e9 100644 (file)
@@ -151,7 +151,7 @@ module Api
       get changeset_show_path(changeset)
       assert_response :success, "cannot get first changeset"
 
-      assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1
+      assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
       assert_select "osm>changeset[id='#{changeset.id}']", 1
       assert_select "osm>changeset>@open", "true"
       assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
@@ -161,7 +161,7 @@ module Api
       get changeset_show_path(changeset), :params => { :include_discussion => true }
       assert_response :success, "cannot get first changeset with comments"
 
-      assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1
+      assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
       assert_select "osm>changeset[id='#{changeset.id}']", 1
       assert_select "osm>changeset>@open", "true"
       assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
@@ -175,7 +175,7 @@ module Api
       get changeset_show_path(changeset), :params => { :include_discussion => true }
       assert_response :success, "cannot get closed changeset with comments"
 
-      assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1
+      assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
       assert_select "osm>changeset[id='#{changeset.id}']", 1
       assert_select "osm>changeset>@open", "false"
       assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
@@ -194,7 +194,7 @@ module Api
       assert_not_nil js
 
       assert_equal Settings.api_version, js["version"]
-      assert_equal "OpenStreetMap server", js["generator"]
+      assert_equal Settings.generator, js["generator"]
       assert_equal changeset.id, js["changeset"]["id"]
       assert js["changeset"]["open"]
       assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
@@ -210,7 +210,7 @@ module Api
       js = ActiveSupport::JSON.decode(@response.body)
       assert_not_nil js
       assert_equal Settings.api_version, js["version"]
-      assert_equal "OpenStreetMap server", js["generator"]
+      assert_equal Settings.generator, js["generator"]
       assert_equal changeset.id, js["changeset"]["id"]
       assert js["changeset"]["open"]
       assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
@@ -247,7 +247,7 @@ module Api
 
       assert_not_nil js
       assert_equal Settings.api_version, js["version"]
-      assert_equal "OpenStreetMap server", js["generator"]
+      assert_equal Settings.generator, js["generator"]
       assert_equal changeset.id, js["changeset"]["id"]
       assert_not js["changeset"]["open"]
       assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
@@ -521,7 +521,7 @@ module Api
                       "can't upload a simple valid creation to changeset: #{@response.body}"
 
       # check the returned payload
-      assert_select "diffResult[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1
+      assert_select "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
       assert_select "diffResult>node", 1
       assert_select "diffResult>way", 1
       assert_select "diffResult>relation", 1
@@ -759,7 +759,7 @@ module Api
                       "can't do a conditional delete of in use objects: #{@response.body}"
 
       # check the returned payload
-      assert_select "diffResult[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1
+      assert_select "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
       assert_select "diffResult>node", 1
       assert_select "diffResult>way", 1
       assert_select "diffResult>relation", 1
@@ -1430,7 +1430,7 @@ module Api
                       "failed to return error in XML format"
 
       # check the returned payload
-      assert_select "osmError[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1
+      assert_select "osmError[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
       assert_select "osmError>status", 1
       assert_select "osmError>message", 1
     end
@@ -1890,7 +1890,7 @@ module Api
       assert_not_nil js
 
       assert_equal Settings.api_version, js["version"]
-      assert_equal "OpenStreetMap server", js["generator"]
+      assert_equal Settings.generator, js["generator"]
       assert_equal 2, js["changesets"].count
 
       # check that the correct error is given when we provide both UID and name
@@ -1950,23 +1950,58 @@ module Api
 
       get changesets_path
       assert_response :success
-      assert_changesets [changeset5, changeset4, changeset3, changeset2, changeset1]
+      assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1]
 
       get changesets_path(:limit => "3")
       assert_response :success
-      assert_changesets [changeset5, changeset4, changeset3]
+      assert_changesets_in_order [changeset5, changeset4, changeset3]
 
       get changesets_path(:limit => "0")
       assert_response :bad_request
 
       get changesets_path(:limit => Settings.max_changeset_query_limit)
       assert_response :success
-      assert_changesets [changeset5, changeset4, changeset3, changeset2, changeset1]
+      assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1]
 
       get changesets_path(:limit => Settings.max_changeset_query_limit + 1)
       assert_response :bad_request
     end
 
+    ##
+    # test the query functionality of changesets with the order parameter
+    def test_query_order
+      user = create(:user)
+      changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0))
+      changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 2, 1, 0, 0, 0), :closed_at => Time.utc(2008, 2, 2, 0, 0, 0))
+      changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 3, 1, 0, 0, 0), :closed_at => Time.utc(2008, 3, 2, 0, 0, 0))
+      changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 4, 1, 0, 0, 0), :closed_at => Time.utc(2008, 4, 2, 0, 0, 0))
+      changeset5 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 5, 1, 0, 0, 0), :closed_at => Time.utc(2008, 5, 2, 0, 0, 0))
+
+      get changesets_path(:order => "oldest")
+      assert_response :success
+      assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5]
+
+      get changesets_path(:order => "oldest", :time => "2008-01-01T00:00Z,2018-01-01T00:00Z")
+      assert_response :success
+      assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5]
+
+      get changesets_path(:order => "oldest", :time => "2008-01-02T00:00Z,2018-01-01T00:00Z")
+      assert_response :success
+      assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5]
+
+      get changesets_path(:order => "oldest", :time => "2008-01-02T00:01Z,2018-01-01T00:00Z")
+      assert_response :success
+      assert_changesets_in_order [changeset2, changeset3, changeset4, changeset5]
+
+      get changesets_path(:order => "oldest", :time => "2008-04-01T00:00Z,2018-01-01T00:00Z")
+      assert_response :success
+      assert_changesets_in_order [changeset4, changeset5]
+
+      get changesets_path(:order => "oldest", :time => "2008-06-01T00:00Z,2018-01-01T00:00Z")
+      assert_response :success
+      assert_changesets_in_order []
+    end
+
     ##
     # check that errors are returned if garbage is inserted
     # into query strings
@@ -2247,8 +2282,7 @@ module Api
     private
 
     ##
-    # boilerplate for checking that certain changesets exist in the
-    # output.
+    # check that certain changesets exist in the output
     def assert_changesets(changesets)
       assert_select "osm>changeset", changesets.size
       changesets.each do |changeset|
@@ -2256,6 +2290,15 @@ module Api
       end
     end
 
+    ##
+    # check that certain changesets exist in the output in the specified order
+    def assert_changesets_in_order(changesets)
+      assert_select "osm>changeset", changesets.size
+      changesets.each_with_index do |changeset, index|
+        assert_select "osm>changeset:nth-child(#{index + 1})[id='#{changeset.id}']", 1
+      end
+    end
+
     ##
     # update the changeset_id of a way element
     def update_changeset(xml, changeset_id)
index eb8f8e02256eb5c3d8e97341a2f2758316199ba6..7f2c196654476c6499f058728952e0e2a17348aa 100644 (file)
@@ -915,7 +915,7 @@ module Api
       assert_response :success
 
       # count one osm element
-      assert_select "osm[version='#{Settings.api_version}'][generator='OpenStreetMap server']", 1
+      assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
 
       # we should have only the expected number of relations
       assert_select "osm>relation", expected_relations.size
index c9464ffeddd0bc36eec82d4480b696aac71ddef2..6365d46e5de0aba5210c181131194d15dde78ca7 100644 (file)
@@ -563,35 +563,35 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     # Try and get the index
     get diary_entries_path
     assert_response :success
-    assert_select "div.diary_post", :count => 20
+    assert_select "article.diary_post", :count => 20
     assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
     assert_select "li.page-item.disabled span.page-link", :text => "Newer Entries", :count => 1
 
     # Try and get the second page
     get css_select("li.page-item a.page-link").first["href"]
     assert_response :success
-    assert_select "div.diary_post", :count => 20
+    assert_select "article.diary_post", :count => 20
     assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
     assert_select "li.page-item a.page-link", :text => "Newer Entries", :count => 1
 
     # Try and get the third page
     get css_select("li.page-item a.page-link").first["href"]
     assert_response :success
-    assert_select "div.diary_post", :count => 10
+    assert_select "article.diary_post", :count => 10
     assert_select "li.page-item.disabled span.page-link", :text => "Older Entries", :count => 1
     assert_select "li.page-item a.page-link", :text => "Newer Entries", :count => 1
 
     # Go back to the second page
     get css_select("li.page-item a.page-link").last["href"]
     assert_response :success
-    assert_select "div.diary_post", :count => 20
+    assert_select "article.diary_post", :count => 20
     assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
     assert_select "li.page-item a.page-link", :text => "Newer Entries", :count => 1
 
     # Go back to the first page
     get css_select("li.page-item a.page-link").last["href"]
     assert_response :success
-    assert_select "div.diary_post", :count => 20
+    assert_select "article.diary_post", :count => 20
     assert_select "li.page-item a.page-link", :text => "Older Entries", :count => 1
     assert_select "li.page-item.disabled span.page-link", :text => "Newer Entries", :count => 1
   end
@@ -997,7 +997,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     assert_response :success
     assert_template "index"
     assert_no_missing_translations
-    assert_select "div.diary_post", entries.count
+    assert_select "article.diary_post", entries.count
 
     entries.each do |entry|
       assert_select "a[href=?]", "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}"
index 8329b19627942a57e2e251c3ba13c584062ae957..a4ed07e09eac0079a610f8e03762b0b89aeda105 100644 (file)
@@ -239,11 +239,11 @@ class UserTest < ActiveSupport::TestCase
     assert_predicate create(:administrator_user), :administrator?
   end
 
-  def test_has_role?
-    assert_not create(:user).has_role?("administrator")
-    assert_not create(:user).has_role?("moderator")
-    assert create(:administrator_user).has_role?("administrator")
-    assert create(:moderator_user).has_role?("moderator")
+  def test_role?
+    assert_not create(:user).role?("administrator")
+    assert_not create(:user).role?("moderator")
+    assert create(:administrator_user).role?("administrator")
+    assert create(:moderator_user).role?("moderator")
   end
 
   def test_soft_destroy
index 2be69e654412d3d4eaef79bf29672638e387fa71..5ff60cd309f263db36b99d2d5011f7e4814e684a 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
   resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8"
   integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==
 
-"@eslint/eslintrc@^2.1.1":
-  version "2.1.1"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.1.tgz#18d635e24ad35f7276e8a49d135c7d3ca6a46f93"
-  integrity sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==
+"@eslint/eslintrc@^2.1.2":
+  version "2.1.2"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396"
+  integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@^8.46.0":
-  version "8.46.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.46.0.tgz#3f7802972e8b6fe3f88ed1aabc74ec596c456db6"
-  integrity sha512-a8TLtmPi8xzPkCbp/OGFUo5yhRkHM2Ko9kOWP4znJr0WAhWyThaw3PnwX4vOTWOAMsV2uRt32PPDcEz63esSaA==
+"@eslint/js@^8.47.0":
+  version "8.47.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d"
+  integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==
 
 "@humanwhocodes/config-array@^0.11.10":
   version "0.11.10"
@@ -218,20 +218,20 @@ eslint-scope@^7.2.2:
     esrecurse "^4.3.0"
     estraverse "^5.2.0"
 
-eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.2:
-  version "3.4.2"
-  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.2.tgz#8c2095440eca8c933bedcadf16fefa44dbe9ba5f"
-  integrity sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==
+eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3:
+  version "3.4.3"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800"
+  integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
 
 eslint@^8.0.0:
-  version "8.46.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.46.0.tgz#a06a0ff6974e53e643acc42d1dcf2e7f797b3552"
-  integrity sha512-cIO74PvbW0qU8e0mIvk5IV3ToWdCq5FYG6gWPHHkx6gNdjlbAYvtfHmlCMXxjcoVaIdwy/IAt3+mDkZkfvb2Dg==
+  version "8.47.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806"
+  integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.6.1"
-    "@eslint/eslintrc" "^2.1.1"
-    "@eslint/js" "^8.46.0"
+    "@eslint/eslintrc" "^2.1.2"
+    "@eslint/js" "^8.47.0"
     "@humanwhocodes/config-array" "^0.11.10"
     "@humanwhocodes/module-importer" "^1.0.1"
     "@nodelib/fs.walk" "^1.2.8"
@@ -242,7 +242,7 @@ eslint@^8.0.0:
     doctrine "^3.0.0"
     escape-string-regexp "^4.0.0"
     eslint-scope "^7.2.2"
-    eslint-visitor-keys "^3.4.2"
+    eslint-visitor-keys "^3.4.3"
     espree "^9.6.1"
     esquery "^1.4.2"
     esutils "^2.0.2"