]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/3780'
authorTom Hughes <tom@compton.nu>
Tue, 8 Nov 2022 18:32:18 +0000 (18:32 +0000)
committerTom Hughes <tom@compton.nu>
Tue, 8 Nov 2022 18:32:18 +0000 (18:32 +0000)
35 files changed:
.rubocop_todo.yml
Gemfile
Gemfile.lock
app/assets/javascripts/index/browse.js
app/assets/javascripts/index/directions.js
app/controllers/api/changesets_controller.rb
app/controllers/api/nodes_controller.rb
app/controllers/api/notes_controller.rb
app/controllers/api/relations_controller.rb
app/controllers/api/traces_controller.rb
app/controllers/api/users_controller.rb
app/controllers/api/ways_controller.rb
app/controllers/confirmations_controller.rb
app/controllers/diary_entries_controller.rb
app/controllers/messages_controller.rb
app/controllers/oauth_clients_controller.rb
app/controllers/redactions_controller.rb
app/controllers/traces_controller.rb
app/controllers/users_controller.rb
app/views/application/_sidebar_header.html.erb
app/views/layouts/_banner.html.erb
app/views/layouts/_search.html.erb
config/locales/arz.yml
config/locales/br.yml
config/locales/ku-Latn.yml
config/locales/mk.yml
config/locales/ne.yml
config/locales/oc.yml
config/locales/pnb.yml
config/locales/sc.yml
config/locales/sl.yml
config/locales/zh-TW.yml
package.json
test/controllers/confirmations_controller_test.rb
yarn.lock

index 5303fb05112f1a7b89389b2d69d8f6f8b6d07562..c03cf665c5089dd8af0530f42e1fc47665b6a822 100644 (file)
@@ -1,6 +1,6 @@
 # This configuration was generated by
 # `rubocop --auto-gen-config`
-# on 2022-10-25 17:25:58 UTC using RuboCop version 1.37.1.
+# on 2022-11-01 18:20:38 UTC using RuboCop version 1.38.0.
 # The point is for the user to remove these configuration records
 # one by one as the offenses are removed from the code base.
 # Note that changes in the inspected code, or installation of new
@@ -46,7 +46,7 @@ Lint/AssignmentInCondition:
 Metrics/AbcSize:
   Max: 189
 
-# Offense count: 72
+# Offense count: 73
 # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, AllowedMethods, AllowedPatterns, IgnoredMethods.
 # AllowedMethods: refine
 Metrics/BlockLength:
@@ -82,7 +82,12 @@ Metrics/ParameterLists:
 Metrics/PerceivedComplexity:
   Max: 26
 
-# Offense count: 559
+# Offense count: 2495
+# This cop supports safe autocorrection (--autocorrect).
+Minitest/EmptyLineBeforeAssertionMethods:
+  Enabled: false
+
+# Offense count: 560
 Minitest/MultipleAssertions:
   Max: 52
 
@@ -96,6 +101,17 @@ Naming/PredicateName:
   Exclude:
     - 'app/models/user.rb'
 
+# Offense count: 8
+# This cop supports unsafe autocorrection (--autocorrect-all).
+Rails/ActionControllerFlashBeforeRender:
+  Exclude:
+    - 'app/controllers/confirmations_controller.rb'
+    - 'app/controllers/friendships_controller.rb'
+    - 'app/controllers/oauth_controller.rb'
+    - 'app/controllers/traces_controller.rb'
+    - 'app/controllers/user_blocks_controller.rb'
+    - 'app/controllers/users_controller.rb'
+
 # Offense count: 5
 # Configuration parameters: Database, Include.
 # SupportedDatabases: mysql, postgresql
diff --git a/Gemfile b/Gemfile
index cdbd48d04f8da616525af7c2ec2f2fc343ee1b0a..020cc9166e7ab3d1ea0f6607fb6bb77f0677cf1e 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -152,7 +152,7 @@ group :test do
   gem "rubocop"
   gem "rubocop-minitest"
   gem "rubocop-performance"
-  gem "rubocop-rails", "= 2.16.1"
+  gem "rubocop-rails"
   gem "rubocop-rake"
   gem "selenium-webdriver"
   gem "simplecov", :require => false
index fabead7cdb2dc23927a01445fc99dfb5617eeadc..b3beb4e4c1e51e8d3b9696504d88ba49220bcfd7 100644 (file)
@@ -86,17 +86,17 @@ GEM
     autoprefixer-rails (10.4.7.0)
       execjs (~> 2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.650.0)
-    aws-sdk-core (3.164.0)
+    aws-partitions (1.657.0)
+    aws-sdk-core (3.166.0)
       aws-eventstream (~> 1, >= 1.0.2)
-      aws-partitions (~> 1, >= 1.525.0)
-      aws-sigv4 (~> 1.1)
+      aws-partitions (~> 1, >= 1.651.0)
+      aws-sigv4 (~> 1.5)
       jmespath (~> 1, >= 1.6.1)
-    aws-sdk-kms (1.58.0)
-      aws-sdk-core (~> 3, >= 3.127.0)
+    aws-sdk-kms (1.59.0)
+      aws-sdk-core (~> 3, >= 3.165.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.116.0)
-      aws-sdk-core (~> 3, >= 3.127.0)
+    aws-sdk-s3 (1.117.1)
+      aws-sdk-core (~> 3, >= 3.165.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.4)
     aws-sigv4 (1.5.2)
@@ -132,7 +132,7 @@ GEM
     cancancan (3.4.0)
     canonical-rails (0.2.14)
       rails (>= 4.1, <= 7.1)
-    capybara (3.37.1)
+    capybara (3.38.0)
       addressable
       matrix
       mini_mime (>= 0.1.3)
@@ -153,7 +153,7 @@ GEM
     crack (0.4.5)
       rexml
     crass (1.0.6)
-    dalli (3.2.2)
+    dalli (3.2.3)
     debug_inspector (1.1.0)
     deep_merge (1.2.2)
     delayed_job (4.1.11)
@@ -166,43 +166,39 @@ GEM
       railties (>= 5)
     doorkeeper-i18n (5.2.5)
       doorkeeper (>= 5.2)
-    dry-configurable (0.16.1)
-      dry-core (~> 0.6)
+    dry-configurable (1.0.0)
+      dry-core (~> 1.0, < 2)
       zeitwerk (~> 2.6)
-    dry-container (0.11.0)
-      concurrent-ruby (~> 1.0)
-    dry-core (0.9.1)
+    dry-core (1.0.0)
       concurrent-ruby (~> 1.0)
       zeitwerk (~> 2.6)
-    dry-inflector (0.3.0)
+    dry-inflector (1.0.0)
     dry-initializer (3.1.1)
-    dry-logic (1.3.0)
+    dry-logic (1.4.0)
       concurrent-ruby (~> 1.0)
-      dry-core (~> 0.9, >= 0.9)
+      dry-core (~> 1.0, < 2)
       zeitwerk (~> 2.6)
-    dry-schema (1.11.3)
+    dry-schema (1.12.0)
       concurrent-ruby (~> 1.0)
-      dry-configurable (~> 0.16, >= 0.16)
-      dry-core (~> 0.9, >= 0.9)
+      dry-configurable (~> 1.0, < 2)
+      dry-core (~> 1.0, < 2)
       dry-initializer (~> 3.0)
-      dry-logic (~> 1.3)
-      dry-types (~> 1.6)
+      dry-logic (>= 1.4, < 2)
+      dry-types (>= 1.7, < 2)
       zeitwerk (~> 2.6)
-    dry-types (1.6.1)
+    dry-types (1.7.0)
       concurrent-ruby (~> 1.0)
-      dry-container (~> 0.3)
-      dry-core (~> 0.9, >= 0.9)
-      dry-inflector (~> 0.1, >= 0.1.2)
-      dry-logic (~> 1.3, >= 1.3)
+      dry-core (~> 1.0, < 2)
+      dry-inflector (~> 1.0, < 2)
+      dry-logic (>= 1.4, < 2)
       zeitwerk (~> 2.6)
-    dry-validation (1.9.0)
+    dry-validation (1.10.0)
       concurrent-ruby (~> 1.0)
-      dry-container (~> 0.7, >= 0.7.1)
-      dry-core (~> 0.9, >= 0.9)
+      dry-core (~> 1.0, < 2)
       dry-initializer (~> 3.0)
-      dry-schema (~> 1.11, >= 1.11.0)
+      dry-schema (>= 1.12, < 2)
       zeitwerk (~> 2.6)
-    erb_lint (0.2.0)
+    erb_lint (0.3.0)
       activesupport
       better_html (>= 2.0.1)
       parser (>= 2.7.1.4)
@@ -253,7 +249,7 @@ GEM
     image_processing (1.12.2)
       mini_magick (>= 4.9.5, < 5)
       ruby-vips (>= 2.0.17, < 3)
-    image_size (3.1.0)
+    image_size (3.2.0)
     in_threads (1.6.0)
     jbuilder (2.11.5)
       actionview (>= 5.0.0)
@@ -268,7 +264,7 @@ GEM
     kgio (2.11.4)
     kramdown (2.4.0)
       rexml
-    libxml-ruby (3.2.3)
+    libxml-ruby (3.2.4)
     listen (3.7.1)
       rb-fsevent (~> 0.10, >= 0.10.3)
       rb-inotify (~> 0.9, >= 0.9.10)
@@ -297,7 +293,7 @@ GEM
       net-protocol
     net-protocol (0.1.3)
       timeout
-    net-smtp (0.3.2)
+    net-smtp (0.3.3)
       net-protocol
     nio4r (2.5.8)
     nokogiri (1.13.9)
@@ -395,7 +391,7 @@ GEM
       nokogiri (>= 1.6)
     rails-html-sanitizer (1.4.3)
       loofah (~> 2.3)
-    rails-i18n (7.0.5)
+    rails-i18n (7.0.6)
       i18n (>= 0.7, < 2)
       railties (>= 6.0.0, < 8)
     railties (7.0.4)
@@ -416,7 +412,7 @@ GEM
     rexml (3.2.5)
     rinku (2.0.6)
     rotp (6.2.0)
-    rubocop (1.37.1)
+    rubocop (1.38.0)
       json (~> 2.3)
       parallel (~> 1.10)
       parser (>= 3.1.2.1)
@@ -428,12 +424,12 @@ GEM
       unicode-display_width (>= 1.4.0, < 3.0)
     rubocop-ast (1.23.0)
       parser (>= 3.1.1.0)
-    rubocop-minitest (0.22.2)
+    rubocop-minitest (0.23.1)
       rubocop (>= 0.90, < 2.0)
     rubocop-performance (1.15.0)
       rubocop (>= 1.7.0, < 2.0)
       rubocop-ast (>= 0.4.0)
-    rubocop-rails (2.16.1)
+    rubocop-rails (2.17.2)
       activesupport (>= 4.2.0)
       rack (>= 1.1)
       rubocop (>= 1.33.0, < 2.0)
@@ -457,7 +453,7 @@ GEM
       sprockets-rails
       tilt
     secure_headers (6.5.0)
-    selenium-webdriver (4.5.0)
+    selenium-webdriver (4.6.1)
       childprocess (>= 0.5, < 5.0)
       rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2, < 3.0)
@@ -483,7 +479,7 @@ GEM
       actionpack (>= 5.2)
       activesupport (>= 5.2)
       sprockets (>= 3.0.0)
-    strong_migrations (1.3.2)
+    strong_migrations (1.4.0)
       activerecord (>= 5.2)
     terser (1.1.12)
       execjs (>= 0.3.0, < 3)
@@ -507,7 +503,7 @@ GEM
     websocket-extensions (0.1.5)
     xpath (3.2.0)
       nokogiri (~> 1.8)
-    zeitwerk (2.6.1)
+    zeitwerk (2.6.6)
 
 PLATFORMS
   ruby
@@ -585,7 +581,7 @@ DEPENDENCIES
   rubocop
   rubocop-minitest
   rubocop-performance
-  rubocop-rails (= 2.16.1)
+  rubocop-rails
   rubocop-rake
   sanitize
   sassc-rails
index 9d3f9a470afcac161e55faaa894fa26faad37d98..a65934d0227c3f53eee00c23e2e97d63d6628ce4 100644 (file)
@@ -54,6 +54,7 @@ OSM.initializeBrowse = function (map) {
             .text(I18n.t("browse.start_rjs.load_data")),
           $("<div>").append(
             $("<button type='button' class='btn-close'>")
+              .attr("aria-label", I18n.t("javascripts.close"))
               .click(cancel))),
         $("<p class='alert alert-warning'>")
           .text(I18n.t("browse.start_rjs.feature_warning", { num_features: count, max_features: limit })),
index 500610e26dfc9c4f3ed3529614f60c54a05a0757..75c647802b7a4ff42f3143a0e93f3ae3f535fdb3 100644 (file)
@@ -265,7 +265,8 @@ OSM.Directions = function (map) {
       }
 
       var turnByTurnTable = $("<table class='mb-3'>");
-      var directionsCloseButton = $("<button type='button' class='btn-close'>");
+      var directionsCloseButton = $("<button type='button' class='btn-close'>")
+        .attr("aria-label", I18n.t("javascripts.close"));
 
       $("#sidebar_content")
         .empty()
index 24e7fb9252ca12e161bdae5ac444bb1824b16e49..56070951a8264292416ac8a57dbc00d58fa117bd 100644 (file)
@@ -19,6 +19,20 @@ module Api
     # Helper methods for checking consistency
     include ConsistencyValidations
 
+    ##
+    # Return XML giving the basic info about the changeset. Does not
+    # return anything about the nodes, ways and relations in the changeset.
+    def show
+      @changeset = Changeset.find(params[:id])
+      @include_discussion = params[:include_discussion].presence
+      render "changeset"
+
+      respond_to do |format|
+        format.xml
+        format.json
+      end
+    end
+
     # Create a changeset from XML.
     def create
       assert_method :put
@@ -35,20 +49,6 @@ module Api
       render :plain => cs.id.to_s
     end
 
-    ##
-    # Return XML giving the basic info about the changeset. Does not
-    # return anything about the nodes, ways and relations in the changeset.
-    def show
-      @changeset = Changeset.find(params[:id])
-      @include_discussion = params[:include_discussion].presence
-      render "changeset"
-
-      respond_to do |format|
-        format.xml
-        format.json
-      end
-    end
-
     ##
     # marks a changeset as closed. this may be called multiple times
     # on the same changeset, so is idempotent.
index 92779dd67f18ca160a83772bc311b5dde29b875a..6934a13c04b9d6e8373a0b68bfde994a9f71177d 100644 (file)
@@ -15,15 +15,21 @@ module Api
 
     before_action :set_request_formats, :except => [:create, :update, :delete]
 
-    # Create a node from XML.
-    def create
-      assert_method :put
+    # Dump the details on many nodes whose ids are given in the "nodes" parameter.
+    def index
+      raise OSM::APIBadUserInput, "The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]" unless params["nodes"]
 
-      node = Node.from_xml(request.raw_post, :create => true)
+      ids = params["nodes"].split(",").collect(&:to_i)
 
-      # Assume that Node.from_xml has thrown an exception if there is an error parsing the xml
-      node.create_with_history current_user
-      render :plain => node.id.to_s
+      raise OSM::APIBadUserInput, "No nodes were given to search for" if ids.empty?
+
+      @nodes = Node.find(ids)
+
+      # Render the result
+      respond_to do |format|
+        format.xml
+        format.json
+      end
     end
 
     # Dump the details on a node given in params[:id]
@@ -43,6 +49,17 @@ module Api
       end
     end
 
+    # Create a node from XML.
+    def create
+      assert_method :put
+
+      node = Node.from_xml(request.raw_post, :create => true)
+
+      # Assume that Node.from_xml has thrown an exception if there is an error parsing the xml
+      node.create_with_history current_user
+      render :plain => node.id.to_s
+    end
+
     # Update a node from given XML
     def update
       node = Node.find(params[:id])
@@ -66,22 +83,5 @@ module Api
       node.delete_with_history!(new_node, current_user)
       render :plain => node.version.to_s
     end
-
-    # Dump the details on many nodes whose ids are given in the "nodes" parameter.
-    def index
-      raise OSM::APIBadUserInput, "The parameter nodes is required, and must be of the form nodes=id[,id[,id...]]" unless params["nodes"]
-
-      ids = params["nodes"].split(",").collect(&:to_i)
-
-      raise OSM::APIBadUserInput, "No nodes were given to search for" if ids.empty?
-
-      @nodes = Node.find(ids)
-
-      # Render the result
-      respond_to do |format|
-        format.xml
-        format.json
-      end
-    end
   end
 end
index d915d8126e42c268357a10b0f1a88ff4d6ba0de4..5e24aa7858ddf1c70b6106baee616a7ce385b1eb 100644 (file)
@@ -52,6 +52,26 @@ module Api
       end
     end
 
+    ##
+    # Read a note
+    def show
+      # Check the arguments are sane
+      raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+
+      # Find the note and check it is valid
+      @note = Note.find(params[:id])
+      raise OSM::APINotFoundError unless @note
+      raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || current_user&.moderator?
+
+      # Render the result
+      respond_to do |format|
+        format.xml
+        format.rss
+        format.json
+        format.gpx
+      end
+    end
+
     ##
     # Create a new note
     def create
@@ -88,6 +108,36 @@ module Api
       end
     end
 
+    ##
+    # Delete (hide) a note
+    def destroy
+      # Check the arguments are sane
+      raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+
+      # Extract the arguments
+      id = params[:id].to_i
+      comment = params[:text]
+
+      # Find the note and check it is valid
+      @note = Note.find(id)
+      raise OSM::APINotFoundError unless @note
+      raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
+
+      # Mark the note as hidden
+      Note.transaction do
+        @note.status = "hidden"
+        @note.save
+
+        add_comment(@note, comment, "hidden", :notify => false)
+      end
+
+      # Return a copy of the updated note
+      respond_to do |format|
+        format.xml { render :action => :show }
+        format.json { render :action => :show }
+      end
+    end
+
     ##
     # Add a comment to an existing note
     def comment
@@ -209,56 +259,6 @@ module Api
       end
     end
 
-    ##
-    # Read a note
-    def show
-      # Check the arguments are sane
-      raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
-      # Find the note and check it is valid
-      @note = Note.find(params[:id])
-      raise OSM::APINotFoundError unless @note
-      raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible? || current_user&.moderator?
-
-      # Render the result
-      respond_to do |format|
-        format.xml
-        format.rss
-        format.json
-        format.gpx
-      end
-    end
-
-    ##
-    # Delete (hide) a note
-    def destroy
-      # Check the arguments are sane
-      raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
-      # Extract the arguments
-      id = params[:id].to_i
-      comment = params[:text]
-
-      # Find the note and check it is valid
-      @note = Note.find(id)
-      raise OSM::APINotFoundError unless @note
-      raise OSM::APIAlreadyDeletedError.new("note", @note.id) unless @note.visible?
-
-      # Mark the note as hidden
-      Note.transaction do
-        @note.status = "hidden"
-        @note.save
-
-        add_comment(@note, comment, "hidden", :notify => false)
-      end
-
-      # Return a copy of the updated note
-      respond_to do |format|
-        format.xml { render :action => :show }
-        format.json { render :action => :show }
-      end
-    end
-
     ##
     # Return a list of notes matching a given string
     def search
index 69b145268323deac475e1d46efb85d0d7d97206b..19aed6a85db00dd715c7fe05ee9662eca08db20d 100644 (file)
@@ -13,14 +13,20 @@ module Api
 
     before_action :set_request_formats, :except => [:create, :update, :delete]
 
-    def create
-      assert_method :put
+    def index
+      raise OSM::APIBadUserInput, "The parameter relations is required, and must be of the form relations=id[,id[,id...]]" unless params["relations"]
 
-      relation = Relation.from_xml(request.raw_post, :create => true)
+      ids = params["relations"].split(",").collect(&:to_i)
 
-      # Assume that Relation.from_xml has thrown an exception if there is an error parsing the xml
-      relation.create_with_history current_user
-      render :plain => relation.id.to_s
+      raise OSM::APIBadUserInput, "No relations were given to search for" if ids.empty?
+
+      @relations = Relation.find(ids)
+
+      # Render the result
+      respond_to do |format|
+        format.xml
+        format.json
+      end
     end
 
     def show
@@ -37,6 +43,16 @@ module Api
       end
     end
 
+    def create
+      assert_method :put
+
+      relation = Relation.from_xml(request.raw_post, :create => true)
+
+      # Assume that Relation.from_xml has thrown an exception if there is an error parsing the xml
+      relation.create_with_history current_user
+      render :plain => relation.id.to_s
+    end
+
     def update
       logger.debug request.raw_post
 
@@ -131,22 +147,6 @@ module Api
       end
     end
 
-    def index
-      raise OSM::APIBadUserInput, "The parameter relations is required, and must be of the form relations=id[,id[,id...]]" unless params["relations"]
-
-      ids = params["relations"].split(",").collect(&:to_i)
-
-      raise OSM::APIBadUserInput, "No relations were given to search for" if ids.empty?
-
-      @relations = Relation.find(ids)
-
-      # Render the result
-      respond_to do |format|
-        format.xml
-        format.json
-      end
-    end
-
     def relations_for_way
       relations_for_object("Way")
     end
index 8121764a1b4f7f8fb76ace6db6865613f0c500e5..07b6208af40deef2018a8beb14d33a558b5de2ef 100644 (file)
@@ -19,6 +19,35 @@ module Api
       head :forbidden unless @trace.public? || @trace.user == current_user
     end
 
+    def create
+      tags = params[:tags] || ""
+      description = params[:description] || ""
+      visibility = params[:visibility]
+
+      if visibility.nil?
+        visibility = if params[:public]&.to_i&.nonzero?
+                       "public"
+                     else
+                       "private"
+                     end
+      end
+
+      if params[:file].respond_to?(:read)
+        trace = do_create(params[:file], tags, description, visibility)
+
+        if trace.id
+          TraceImporterJob.perform_later(trace)
+          render :plain => trace.id.to_s
+        elsif trace.valid?
+          head :internal_server_error
+        else
+          head :bad_request
+        end
+      else
+        head :bad_request
+      end
+    end
+
     def update
       trace = Trace.visible.find(params[:id])
 
@@ -64,35 +93,6 @@ module Api
       end
     end
 
-    def create
-      tags = params[:tags] || ""
-      description = params[:description] || ""
-      visibility = params[:visibility]
-
-      if visibility.nil?
-        visibility = if params[:public]&.to_i&.nonzero?
-                       "public"
-                     else
-                       "private"
-                     end
-      end
-
-      if params[:file].respond_to?(:read)
-        trace = do_create(params[:file], tags, description, visibility)
-
-        if trace.id
-          TraceImporterJob.perform_later(trace)
-          render :plain => trace.id.to_s
-        elsif trace.valid?
-          head :internal_server_error
-        else
-          head :bad_request
-        end
-      else
-        head :bad_request
-      end
-    end
-
     private
 
     def do_create(file, tags, description, visibility)
index d4baf4a820a0c1dada9c5a4f13342d440f536a0f..9da9d32266fd9860f0577626ffdd4c73d1ecf66f 100644 (file)
@@ -12,6 +12,22 @@ module Api
 
     before_action :set_request_formats, :except => [:gpx_files]
 
+    def index
+      raise OSM::APIBadUserInput, "The parameter users is required, and must be of the form users=id[,id[,id...]]" unless params["users"]
+
+      ids = params["users"].split(",").collect(&:to_i)
+
+      raise OSM::APIBadUserInput, "No users were given to search for" if ids.empty?
+
+      @users = User.visible.find(ids)
+
+      # Render the result
+      respond_to do |format|
+        format.xml
+        format.json
+      end
+    end
+
     def show
       if @user.visible?
         # Render the result
@@ -33,22 +49,6 @@ module Api
       end
     end
 
-    def index
-      raise OSM::APIBadUserInput, "The parameter users is required, and must be of the form users=id[,id[,id...]]" unless params["users"]
-
-      ids = params["users"].split(",").collect(&:to_i)
-
-      raise OSM::APIBadUserInput, "No users were given to search for" if ids.empty?
-
-      @users = User.visible.find(ids)
-
-      # Render the result
-      respond_to do |format|
-        format.xml
-        format.json
-      end
-    end
-
     def gpx_files
       @traces = current_user.traces.reload
       render :content_type => "application/xml"
index ca4acd6113797ff373dc7eb503e1fd453154e561..c4fce48d07d7badcfa86f797336ee05ed3099416 100644 (file)
@@ -13,14 +13,20 @@ module Api
 
     before_action :set_request_formats, :except => [:create, :update, :delete]
 
-    def create
-      assert_method :put
+    def index
+      raise OSM::APIBadUserInput, "The parameter ways is required, and must be of the form ways=id[,id[,id...]]" unless params["ways"]
 
-      way = Way.from_xml(request.raw_post, :create => true)
+      ids = params["ways"].split(",").collect(&:to_i)
 
-      # Assume that Way.from_xml has thrown an exception if there is an error parsing the xml
-      way.create_with_history current_user
-      render :plain => way.id.to_s
+      raise OSM::APIBadUserInput, "No ways were given to search for" if ids.empty?
+
+      @ways = Way.find(ids)
+
+      # Render the result
+      respond_to do |format|
+        format.xml
+        format.json
+      end
     end
 
     def show
@@ -39,6 +45,16 @@ module Api
       end
     end
 
+    def create
+      assert_method :put
+
+      way = Way.from_xml(request.raw_post, :create => true)
+
+      # Assume that Way.from_xml has thrown an exception if there is an error parsing the xml
+      way.create_with_history current_user
+      render :plain => way.id.to_s
+    end
+
     def update
       way = Way.find(params[:id])
       new_way = Way.from_xml(request.raw_post)
@@ -87,22 +103,6 @@ module Api
       end
     end
 
-    def index
-      raise OSM::APIBadUserInput, "The parameter ways is required, and must be of the form ways=id[,id[,id...]]" unless params["ways"]
-
-      ids = params["ways"].split(",").collect(&:to_i)
-
-      raise OSM::APIBadUserInput, "No ways were given to search for" if ids.empty?
-
-      @ways = Way.find(ids)
-
-      # Render the result
-      respond_to do |format|
-        format.xml
-        format.json
-      end
-    end
-
     ##
     # returns all the ways which are currently using the node given in the
     # :id parameter. note that this used to return deleted ways as well, but
index e54fa4a5db8de2bded6ae8d3de9d39255a748581..06e7c8e7d33f4d3519ff6921c3d88ea0c3a0a8af 100644 (file)
@@ -93,13 +93,13 @@ class ConfirmationsController < ApplicationController
         current_user.tokens.delete_all
         session[:user] = current_user.id
         session[:fingerprint] = current_user.fingerprint
-        redirect_to edit_account_path
       elsif token
         flash[:error] = t "confirmations.confirm_email.failure"
-        redirect_to edit_account_path
       else
         flash[:error] = t "confirmations.confirm_email.unknown_token"
       end
+
+      redirect_to edit_account_path
     end
   end
 
index 467c4a38f280db468be0b611d6c336eee83eedd8..8e6215dbd2726a8a8356cd71eaa9c90be91011c1 100644 (file)
@@ -11,6 +11,67 @@ class DiaryEntriesController < ApplicationController
   before_action :check_database_writable, :only => [:new, :create, :edit, :update, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
   before_action :allow_thirdparty_images, :only => [:new, :create, :edit, :update, :index, :show, :comments]
 
+  def index
+    if params[:display_name]
+      @user = User.active.find_by(:display_name => params[:display_name])
+
+      if @user
+        @title = t "diary_entries.index.user_title", :user => @user.display_name
+        @entries = @user.diary_entries
+      else
+        render_unknown_user params[:display_name]
+        return
+      end
+    elsif params[:friends]
+      if current_user
+        @title = t "diary_entries.index.title_friends"
+        @entries = DiaryEntry.where(:user_id => current_user.friends)
+      else
+        require_user
+        return
+      end
+    elsif params[:nearby]
+      if current_user
+        @title = t "diary_entries.index.title_nearby"
+        @entries = DiaryEntry.where(:user_id => current_user.nearby)
+      else
+        require_user
+        return
+      end
+    else
+      @entries = DiaryEntry.joins(:user).where(:users => { :status => %w[active confirmed] })
+
+      if params[:language]
+        @title = t "diary_entries.index.in_language_title", :language => Language.find(params[:language]).english_name
+        @entries = @entries.where(:language_code => params[:language])
+      else
+        @title = t "diary_entries.index.title"
+      end
+    end
+
+    @params = params.permit(:display_name, :friends, :nearby, :language)
+
+    @page = (params[:page] || 1).to_i
+    @page_size = 20
+
+    @entries = @entries.visible unless can? :unhide, DiaryEntry
+    @entries = @entries.order("created_at DESC")
+    @entries = @entries.offset((@page - 1) * @page_size)
+    @entries = @entries.limit(@page_size)
+    @entries = @entries.includes(:user, :language)
+  end
+
+  def show
+    @entry = @user.diary_entries.visible.where(:id => params[:id]).first
+    if @entry
+      @title = t "diary_entries.show.title", :user => params[:display_name], :title => @entry.title
+      @comments = can?(:unhidecomment, DiaryEntry) ? @entry.comments : @entry.visible_comments
+    else
+      @title = t "diary_entries.no_such_entry.title", :id => params[:id]
+      render :action => "no_such_entry", :status => :not_found
+    end
+  end
+
   def new
     @title = t "diary_entries.new.title"
 
@@ -21,6 +82,17 @@ class DiaryEntriesController < ApplicationController
     render :action => "new"
   end
 
+  def edit
+    @title = t "diary_entries.edit.title"
+    @diary_entry = DiaryEntry.find(params[:id])
+
+    redirect_to diary_entry_path(@diary_entry.user, @diary_entry) if current_user != @diary_entry.user
+
+    set_map_location
+  rescue ActiveRecord::RecordNotFound
+    render :action => "no_such_entry", :status => :not_found
+  end
+
   def create
     @title = t "diary_entries.new.title"
 
@@ -45,17 +117,6 @@ class DiaryEntriesController < ApplicationController
     end
   end
 
-  def edit
-    @title = t "diary_entries.edit.title"
-    @diary_entry = DiaryEntry.find(params[:id])
-
-    redirect_to diary_entry_path(@diary_entry.user, @diary_entry) if current_user != @diary_entry.user
-
-    set_map_location
-  rescue ActiveRecord::RecordNotFound
-    render :action => "no_such_entry", :status => :not_found
-  end
-
   def update
     @title = t "diary_entries.edit.title"
     @diary_entry = DiaryEntry.find(params[:id])
@@ -114,56 +175,6 @@ class DiaryEntriesController < ApplicationController
     render :action => "no_such_entry", :status => :not_found
   end
 
-  def index
-    if params[:display_name]
-      @user = User.active.find_by(:display_name => params[:display_name])
-
-      if @user
-        @title = t "diary_entries.index.user_title", :user => @user.display_name
-        @entries = @user.diary_entries
-      else
-        render_unknown_user params[:display_name]
-        return
-      end
-    elsif params[:friends]
-      if current_user
-        @title = t "diary_entries.index.title_friends"
-        @entries = DiaryEntry.where(:user_id => current_user.friends)
-      else
-        require_user
-        return
-      end
-    elsif params[:nearby]
-      if current_user
-        @title = t "diary_entries.index.title_nearby"
-        @entries = DiaryEntry.where(:user_id => current_user.nearby)
-      else
-        require_user
-        return
-      end
-    else
-      @entries = DiaryEntry.joins(:user).where(:users => { :status => %w[active confirmed] })
-
-      if params[:language]
-        @title = t "diary_entries.index.in_language_title", :language => Language.find(params[:language]).english_name
-        @entries = @entries.where(:language_code => params[:language])
-      else
-        @title = t "diary_entries.index.title"
-      end
-    end
-
-    @params = params.permit(:display_name, :friends, :nearby, :language)
-
-    @page = (params[:page] || 1).to_i
-    @page_size = 20
-
-    @entries = @entries.visible unless can? :unhide, DiaryEntry
-    @entries = @entries.order("created_at DESC")
-    @entries = @entries.offset((@page - 1) * @page_size)
-    @entries = @entries.limit(@page_size)
-    @entries = @entries.includes(:user, :language)
-  end
-
   def rss
     if params[:display_name]
       user = User.active.find_by(:display_name => params[:display_name])
@@ -198,17 +209,6 @@ class DiaryEntriesController < ApplicationController
     @entries = @entries.visible.includes(:user).order("created_at DESC").limit(20)
   end
 
-  def show
-    @entry = @user.diary_entries.visible.where(:id => params[:id]).first
-    if @entry
-      @title = t "diary_entries.show.title", :user => params[:display_name], :title => @entry.title
-      @comments = can?(:unhidecomment, DiaryEntry) ? @entry.comments : @entry.visible_comments
-    else
-      @title = t "diary_entries.no_such_entry.title", :id => params[:id]
-      render :action => "no_such_entry", :status => :not_found
-    end
-  end
-
   def hide
     entry = DiaryEntry.find(params[:id])
     entry.update(:visible => false)
index cc311f93f9a67650d3e6577f77b29dfc77533dff..22d0c88ba5e868e374f6c5f553c21245975e5d7e 100644 (file)
@@ -11,10 +11,24 @@ class MessagesController < ApplicationController
   before_action :check_database_writable, :only => [:new, :create, :reply, :mark, :destroy]
   before_action :allow_thirdparty_images, :only => [:new, :create, :show]
 
-  # Allow the user to write a new message to another user. This action also
-  # deals with the sending of that message to the other user when the user
-  # clicks send.
-  # The display_name param is the display name of the user that the message is being sent to.
+  # Show a message
+  def show
+    @title = t ".title"
+    @message = Message.find(params[:id])
+
+    if @message.recipient == current_user || @message.sender == current_user
+      @message.message_read = true if @message.recipient == current_user
+      @message.save
+    else
+      flash[:notice] = t ".wrong_user", :user => current_user.display_name
+      redirect_to login_path(:referer => request.fullpath)
+    end
+  rescue ActiveRecord::RecordNotFound
+    @title = t "messages.no_such_message.title"
+    render :action => "no_such_message", :status => :not_found
+  end
+
+  # Allow the user to write a new message to another user.
   def new
     @message = Message.new(message_params.merge(:recipient => @user))
     @title = t ".title"
@@ -39,6 +53,23 @@ class MessagesController < ApplicationController
     end
   end
 
+  # Destroy the message.
+  def destroy
+    @message = Message.where("to_user_id = ? OR from_user_id = ?", current_user.id, current_user.id).find(params[:id])
+    @message.from_user_visible = false if @message.sender == current_user
+    @message.to_user_visible = false if @message.recipient == current_user
+    if @message.save && !request.xhr?
+      flash[:notice] = t ".destroyed"
+
+      referer = safe_referer(params[:referer]) if params[:referer]
+
+      redirect_to referer || { :action => :inbox }
+    end
+  rescue ActiveRecord::RecordNotFound
+    @title = t "messages.no_such_message.title"
+    render :action => "no_such_message", :status => :not_found
+  end
+
   # Allow the user to reply to another message.
   def reply
     message = Message.find(params[:message_id])
@@ -64,23 +95,6 @@ class MessagesController < ApplicationController
     render :action => "no_such_message", :status => :not_found
   end
 
-  # Show a message
-  def show
-    @title = t ".title"
-    @message = Message.find(params[:id])
-
-    if @message.recipient == current_user || @message.sender == current_user
-      @message.message_read = true if @message.recipient == current_user
-      @message.save
-    else
-      flash[:notice] = t ".wrong_user", :user => current_user.display_name
-      redirect_to login_path(:referer => request.fullpath)
-    end
-  rescue ActiveRecord::RecordNotFound
-    @title = t "messages.no_such_message.title"
-    render :action => "no_such_message", :status => :not_found
-  end
-
   # Display the list of messages that have been sent to the user.
   def inbox
     @title = t ".title"
@@ -111,23 +125,6 @@ class MessagesController < ApplicationController
     render :action => "no_such_message", :status => :not_found
   end
 
-  # Destroy the message.
-  def destroy
-    @message = Message.where("to_user_id = ? OR from_user_id = ?", current_user.id, current_user.id).find(params[:id])
-    @message.from_user_visible = false if @message.sender == current_user
-    @message.to_user_visible = false if @message.recipient == current_user
-    if @message.save && !request.xhr?
-      flash[:notice] = t ".destroyed"
-
-      referer = safe_referer(params[:referer]) if params[:referer]
-
-      redirect_to referer || { :action => :inbox }
-    end
-  rescue ActiveRecord::RecordNotFound
-    @title = t "messages.no_such_message.title"
-    render :action => "no_such_message", :status => :not_found
-  end
-
   private
 
   ##
index b925002ec7bed7278e19055c719c52092fec30d8..c17d3856d60492847f620a721bfccc8b3389ee39 100644 (file)
@@ -11,20 +11,6 @@ class OauthClientsController < ApplicationController
     @tokens = current_user.oauth_tokens.authorized
   end
 
-  def new
-    @client_application = ClientApplication.new
-  end
-
-  def create
-    @client_application = current_user.client_applications.build(application_params)
-    if @client_application.save
-      flash[:notice] = t "oauth_clients.create.flash"
-      redirect_to :action => "show", :id => @client_application.id
-    else
-      render :action => "new"
-    end
-  end
-
   def show
     @client_application = current_user.client_applications.find(params[:id])
   rescue ActiveRecord::RecordNotFound
@@ -32,6 +18,10 @@ class OauthClientsController < ApplicationController
     render :action => "not_found", :status => :not_found
   end
 
+  def new
+    @client_application = ClientApplication.new
+  end
+
   def edit
     @client_application = current_user.client_applications.find(params[:id])
   rescue ActiveRecord::RecordNotFound
@@ -39,6 +29,16 @@ class OauthClientsController < ApplicationController
     render :action => "not_found", :status => :not_found
   end
 
+  def create
+    @client_application = current_user.client_applications.build(application_params)
+    if @client_application.save
+      flash[:notice] = t "oauth_clients.create.flash"
+      redirect_to :action => "show", :id => @client_application.id
+    else
+      render :action => "new"
+    end
+  end
+
   def update
     @client_application = current_user.client_applications.find(params[:id])
     if @client_application.update(application_params)
index 30425bd429babe42827509eb30c331e00a4cc3d1..6e28f36253f0dd0e80e3cae51ddae793e6bbcbd8 100644 (file)
@@ -14,10 +14,14 @@ class RedactionsController < ApplicationController
     @redactions = Redaction.order(:id)
   end
 
+  def show; end
+
   def new
     @redaction = Redaction.new
   end
 
+  def edit; end
+
   def create
     @redaction = Redaction.new
     @redaction.user = current_user
@@ -33,10 +37,6 @@ class RedactionsController < ApplicationController
     end
   end
 
-  def show; end
-
-  def edit; end
-
   def update
     # NOTE: don't update the user ID
     @redaction.title = params[:redaction][:title]
index 23f8ce7ec51c138f903349d7780ab62bf236a276..86b09215ef94eba30405089e4918cc37020459fe 100644 (file)
@@ -69,10 +69,6 @@ class TracesController < ApplicationController
     @target_user = target_user
   end
 
-  def mine
-    redirect_to :action => :index, :display_name => current_user.display_name
-  end
-
   def show
     @trace = Trace.find(params[:id])
 
@@ -93,6 +89,20 @@ class TracesController < ApplicationController
     @trace = Trace.new(:visibility => default_visibility)
   end
 
+  def edit
+    @trace = Trace.find(params[:id])
+
+    if !@trace.visible?
+      head :not_found
+    elsif current_user.nil? || @trace.user != current_user
+      head :forbidden
+    else
+      @title = t ".title", :name => @trace.name
+    end
+  rescue ActiveRecord::RecordNotFound
+    head :not_found
+  end
+
   def create
     @title = t ".upload_trace"
 
@@ -127,42 +137,6 @@ class TracesController < ApplicationController
     end
   end
 
-  def data
-    trace = Trace.find(params[:id])
-
-    if trace.visible? && (trace.public? || (current_user && current_user == trace.user))
-      if Acl.no_trace_download(request.remote_ip)
-        head :forbidden
-      elsif request.format == Mime[:xml]
-        send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
-      elsif request.format == Mime[:gpx]
-        send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
-      elsif trace.file.attached?
-        redirect_to rails_blob_path(trace.file, :disposition => "attachment")
-      else
-        send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
-      end
-    else
-      head :not_found
-    end
-  rescue ActiveRecord::RecordNotFound
-    head :not_found
-  end
-
-  def edit
-    @trace = Trace.find(params[:id])
-
-    if !@trace.visible?
-      head :not_found
-    elsif current_user.nil? || @trace.user != current_user
-      head :forbidden
-    else
-      @title = t ".title", :name => @trace.name
-    end
-  rescue ActiveRecord::RecordNotFound
-    head :not_found
-  end
-
   def update
     @trace = Trace.find(params[:id])
 
@@ -199,6 +173,32 @@ class TracesController < ApplicationController
     head :not_found
   end
 
+  def mine
+    redirect_to :action => :index, :display_name => current_user.display_name
+  end
+
+  def data
+    trace = Trace.find(params[:id])
+
+    if trace.visible? && (trace.public? || (current_user && current_user == trace.user))
+      if Acl.no_trace_download(request.remote_ip)
+        head :forbidden
+      elsif request.format == Mime[:xml]
+        send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
+      elsif request.format == Mime[:gpx]
+        send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
+      elsif trace.file.attached?
+        redirect_to rails_blob_path(trace.file, :disposition => "attachment")
+      else
+        send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
+      end
+    else
+      head :not_found
+    end
+  rescue ActiveRecord::RecordNotFound
+    head :not_found
+  end
+
   def georss
     @traces = Trace.visible_to_all.visible
 
index 933cec53de9f2a78344363bf40b3f98870d1e30d..603feb4dbe9e7c0cddaad1193dc16331af2659fe 100644 (file)
@@ -17,6 +17,109 @@ class UsersController < ApplicationController
   before_action :lookup_user_by_name, :only => [:set_status, :destroy]
   before_action :allow_thirdparty_images, :only => [:show]
 
+  ##
+  # display a list of users matching specified criteria
+  def index
+    if request.post?
+      ids = params[:user].keys.collect(&:to_i)
+
+      User.where(:id => ids).update_all(:status => "confirmed") if params[:confirm]
+      User.where(:id => ids).update_all(:status => "deleted") if params[:hide]
+
+      redirect_to url_for(:status => params[:status], :ip => params[:ip], :page => params[:page])
+    else
+      @params = params.permit(:status, :ip)
+
+      conditions = {}
+      conditions[:status] = @params[:status] if @params[:status]
+      conditions[:creation_ip] = @params[:ip] if @params[:ip]
+
+      @user_pages, @users = paginate(:users,
+                                     :conditions => conditions,
+                                     :order => :id,
+                                     :per_page => 50)
+    end
+  end
+
+  def show
+    @user = User.find_by(:display_name => params[:display_name])
+
+    if @user &&
+       (@user.visible? || current_user&.administrator?)
+      @title = @user.display_name
+    else
+      render_unknown_user params[:display_name]
+    end
+  end
+
+  def new
+    @title = t "users.new.title"
+    @referer = if params[:referer]
+                 safe_referer(params[:referer])
+               else
+                 session[:referer]
+               end
+
+    append_content_security_policy_directives(
+      :form_action => %w[accounts.google.com *.facebook.com login.live.com github.com meta.wikimedia.org]
+    )
+
+    if current_user
+      # The user is logged in already, so don't show them the signup
+      # page, instead send them to the home page
+      redirect_to @referer || { :controller => "site", :action => "index" }
+    elsif params.key?(:auth_provider) && params.key?(:auth_uid)
+      self.current_user = User.new(:email => params[:email],
+                                   :email_confirmation => params[:email],
+                                   :display_name => params[:nickname],
+                                   :auth_provider => params[:auth_provider],
+                                   :auth_uid => params[:auth_uid])
+
+      flash.now[:notice] = render_to_string :partial => "auth_association"
+    else
+      check_signup_allowed
+
+      self.current_user = User.new
+    end
+  end
+
+  def create
+    self.current_user = User.new(user_params)
+
+    if check_signup_allowed(current_user.email)
+      session[:referer] = safe_referer(params[:referer]) if params[:referer]
+
+      Rails.logger.info "create: #{session[:referer]}"
+
+      if current_user.auth_provider.present? && current_user.pass_crypt.empty?
+        # We are creating an account with external authentication and
+        # no password was specified so create a random one
+        current_user.pass_crypt = SecureRandom.base64(16)
+        current_user.pass_crypt_confirmation = current_user.pass_crypt
+      end
+
+      if current_user.invalid?
+        # Something is wrong with a new user, so rerender the form
+        render :action => "new"
+      elsif current_user.auth_provider.present?
+        # Verify external authenticator before moving on
+        session[:new_user] = current_user
+        redirect_to auth_url(current_user.auth_provider, current_user.auth_uid), :status => :temporary_redirect
+      else
+        # Save the user record
+        session[:new_user] = current_user
+        redirect_to :action => :terms
+      end
+    end
+  end
+
+  ##
+  # destroy a user, marking them as deleted and removing personal data
+  def destroy
+    @user.soft_destroy!
+    redirect_to user_path(:display_name => params[:display_name])
+  end
+
   def terms
     @legale = params[:legale] || OSM.ip_to_country(request.remote_ip) || Settings.default_legale
     @text = OSM.legal_text_for_country(@legale)
@@ -121,78 +224,6 @@ class UsersController < ApplicationController
     redirect_to edit_account_path
   end
 
-  def new
-    @title = t "users.new.title"
-    @referer = if params[:referer]
-                 safe_referer(params[:referer])
-               else
-                 session[:referer]
-               end
-
-    append_content_security_policy_directives(
-      :form_action => %w[accounts.google.com *.facebook.com login.live.com github.com meta.wikimedia.org]
-    )
-
-    if current_user
-      # The user is logged in already, so don't show them the signup
-      # page, instead send them to the home page
-      redirect_to @referer || { :controller => "site", :action => "index" }
-    elsif params.key?(:auth_provider) && params.key?(:auth_uid)
-      self.current_user = User.new(:email => params[:email],
-                                   :email_confirmation => params[:email],
-                                   :display_name => params[:nickname],
-                                   :auth_provider => params[:auth_provider],
-                                   :auth_uid => params[:auth_uid])
-
-      flash.now[:notice] = render_to_string :partial => "auth_association"
-    else
-      check_signup_allowed
-
-      self.current_user = User.new
-    end
-  end
-
-  def create
-    self.current_user = User.new(user_params)
-
-    if check_signup_allowed(current_user.email)
-      session[:referer] = safe_referer(params[:referer]) if params[:referer]
-
-      Rails.logger.info "create: #{session[:referer]}"
-
-      if current_user.auth_provider.present? && current_user.pass_crypt.empty?
-        # We are creating an account with external authentication and
-        # no password was specified so create a random one
-        current_user.pass_crypt = SecureRandom.base64(16)
-        current_user.pass_crypt_confirmation = current_user.pass_crypt
-      end
-
-      if current_user.invalid?
-        # Something is wrong with a new user, so rerender the form
-        render :action => "new"
-      elsif current_user.auth_provider.present?
-        # Verify external authenticator before moving on
-        session[:new_user] = current_user
-        redirect_to auth_url(current_user.auth_provider, current_user.auth_uid), :status => :temporary_redirect
-      else
-        # Save the user record
-        session[:new_user] = current_user
-        redirect_to :action => :terms
-      end
-    end
-  end
-
-  def show
-    @user = User.find_by(:display_name => params[:display_name])
-
-    if @user &&
-       (@user.visible? || current_user&.administrator?)
-      @title = @user.display_name
-    else
-      render_unknown_user params[:display_name]
-    end
-  end
-
   ##
   # sets a user's status
   def set_status
@@ -205,37 +236,6 @@ class UsersController < ApplicationController
     redirect_to user_path(:display_name => params[:display_name])
   end
 
-  ##
-  # destroy a user, marking them as deleted and removing personal data
-  def destroy
-    @user.soft_destroy!
-    redirect_to user_path(:display_name => params[:display_name])
-  end
-
-  ##
-  # display a list of users matching specified criteria
-  def index
-    if request.post?
-      ids = params[:user].keys.collect(&:to_i)
-
-      User.where(:id => ids).update_all(:status => "confirmed") if params[:confirm]
-      User.where(:id => ids).update_all(:status => "deleted") if params[:hide]
-
-      redirect_to url_for(:status => params[:status], :ip => params[:ip], :page => params[:page])
-    else
-      @params = params.permit(:status, :ip)
-
-      conditions = {}
-      conditions[:status] = @params[:status] if @params[:status]
-      conditions[:creation_ip] = @params[:ip] if @params[:ip]
-
-      @user_pages, @users = paginate(:users,
-                                     :conditions => conditions,
-                                     :order => :id,
-                                     :per_page => 50)
-    end
-  end
-
   ##
   # omniauth success callback
   def auth_success
index 868442c3ed8cbaf9fa209341c03269c71ba775f1..88a1fff4ab631fb5d915185fb4a3b51e6ca3ac4e 100644 (file)
@@ -1,6 +1,6 @@
 <div class="d-flex w-100">
   <h2 class="flex-grow-1 text-break"><%= title %></h2>
   <div>
-    <button type="button" class="btn-close"></button>
+    <button type="button" class="btn-close" aria-label="<%= t("javascripts.close") %>"></button>
   </div>
 </div>
index 2751a545816f58a81cff1864b34497b33c04296c..f806201eb8ff929eedc11585370ff904c42c3ecf 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]) %>"></button>
+<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>
 <% end %>
index 9ce1265b412828f45040be2f7d8ad9b6c988d3bf..e7cae0471c9d58c8ebc566e5aecba16765eb405b 100644 (file)
@@ -19,7 +19,7 @@
   </form>
 
   <form method="GET" action="<%= directions_path %>" class="directions_form pb-3">
-    <div class="d-flex flex-row-reverse px-3 py-3"><button type="button" class="btn-close"></button></div>
+    <div class="d-flex flex-row-reverse px-3 py-3"><button type="button" class="btn-close" aria-label="<%= t("javascripts.close") %>"></button></div>
 
     <div class="row gx-2 m-1">
       <div class="col-1">
index b2744a0b69f027fdf8fbcb2f801228d45eebcf5e..fd43c2e7067af84cee50f9fee9f78ff3a2ebfa7a 100644 (file)
@@ -969,9 +969,8 @@ arz:
       title: اعمل حساب
       no_auto_account_create: للأسف نحن غير قادرين فى الوقت الحالى على إنشاء حساب
         لك تلقائيًا.
-      contact_support_html: يرجى الاتصال <a href="mailto:webmaster@openstreetmap.org">بمسؤول
-        الموقع</a> لترتيب الحساب المراد إنشاؤه - وسنحاول التعامل مع هذا الطلب بأسرع
-        وقت ممكن.
+      contact_support_html: يُرجَى الاتصال <a href="%{support}">بمدير الموقع</a> لترتيب
+        إنشاء حساب، سنحاول التعامل مع الطلب بأسرع وقت ممكن.
       email address: 'عنوان البريد الإلكتروني:'
       confirm email address: 'تأكيد عنوان البريد الإلكتروني:'
       display name: 'اسم المستخدم:'
index 0d7468622f17d9e62a9ccfa0d0b8ededf378ec30..5850a59d1eeb67883cb856eb1ed3acb88ea76f18 100644 (file)
@@ -296,6 +296,7 @@ br:
       public editing:
         heading: Kemm foran
         enabled: Gweredekaet. N'eo ket dizanv ha gallout a ra aozañ roadennoù.
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: Petra eo se ?
         disabled: Diweredekaet ha ne c'hall ket aozañ roadennoù ; diznav eo an holl
           aozadennoù kent.
@@ -318,6 +319,7 @@ br:
         review link text: Heuilhit al liamm-mañ evel ma karot evit sellet ouzh diferadennoù
           nevez ar c'henlabourer hag asantiñ dezho.
         agreed_with_pd: Disklêriet hoc'h eus ivez emañ ho tegasadennoù en domani foran.
+        link: https://wiki.osmfoundation.org/wiki/Licence/Contributor_Terms
         link text: Petra eo se ?
       save changes button: Enrollañ ar c'hemmoù
       make edits public button: Lakaat ma holl aozadennoù da vezañ foran
@@ -576,6 +578,7 @@ br:
         fall.
     diary_entry:
       posted_by_html: Postet gant %{link_user} da %{created} e %{language_link}.
+      updated_at_html: Hizivadur diwezhañ d'ar %{updated}.
       comment_link: Skrivañ un evezhiadenn d'an enmont-mañ
       reply_link: Kas ur gemennadenn d'an aozer
       comment_count:
@@ -612,12 +615,20 @@ br:
         title: Enmontoù en deizlevr OpenStreetMap
         description: Enmontoù nevez en deizlevr gant implijerien OpenStreetMap
     comments:
+      title: Kemennadennoù skrivet en deizlevr gant %{user}
+      heading: Kemennadennoù-deizlevr %{user}
+      subheading_html: Kemennadennoù skrivet en deizlevr gant %{user}
       no_comments: Kemennadenn deizlevr ebet
       post: Embann
       when: Pegoulz
       comment: Evezhiadenn
       newer_comments: Evezhiadennoù nevesañ
       older_comments: Evezhiadennoù koshañ
+  doorkeeper:
+    flash:
+      applications:
+        create:
+          notice: Arload marilhet.
   friendships:
     make_friend:
       heading: ↓Ouzhpennañ %{user} evel mignon ?
@@ -815,6 +826,7 @@ br:
           shed: Lochenn
           stable: Marchosi
           static_caravan: Karavanenn
+          temple: Templ
           terrace: Renkad savadurioù
           train_station: Porzh-houarn
           university: Savadur Skol-Veur
@@ -903,16 +915,19 @@ br:
           trailhead: Lec'h loc'hañ
           trunk: Hent-tizh
           trunk_link: Hent-tizh
+          turning_circle: Kroashent-tro diabarzh
           turning_loop: Kammdro dizehan
           unclassified: Hent dirumm
           "yes": Hent
         historic:
           aircraft: Karr-nij istorel
           archaeological_site: Lec'hienn henoniel
+          bomb_crater: Krater-bombezenn istorel
           battlefield: Tachenn emgann
           boundary_stone: Bonn harzoù
           building: Savadur istorel
           bunker: Bunker
+          cannon: Kanol istorel
           castle: Kastell
           church: Iliz
           city_gate: Porzh kêr
@@ -1015,6 +1030,7 @@ br:
           advertising: Bruderezh
           antenna: Stign
           beacon: Tour-tan
+          beam: Treust
           beehive: Ruskenn
           breakwater: Diwagenner
           bridge: Pont
@@ -1042,12 +1058,16 @@ br:
           pier: Sav-mein
           pipeline: Eoulsan
           pumping_station: Savlec'h-pompañ
+          reservoir_covered: Mirlec'h toet
           silo: Silo
           snow_cannon: Kanol-erc'h
+          snow_fence: Kloued erc'h
           storage_tank: Beol stokañ
+          street_cabinet: Armel deknikel
           surveillance: Evezh
           telescope: Teleskop
           tower: Tour
+          utility_pole: Post tredan
           wastewater_plant: Purlec'h tretañ an dourioù lous
           watermill: Milin-dour
           water_tap: Kog dour
@@ -1195,6 +1215,7 @@ br:
           switch: Hentoù-houarn heñchañ
           tram: Tramgarr
           tram_stop: Arsav tramgarr
+          turntable: Savenn-dro
           yard: Gar-dibab
         shop:
           agrarian: Stal labour-douar
@@ -1633,9 +1654,14 @@ br:
         commented_changeset: '%{commenter} en deus skrivet un evezhiadenn d''an/ar
           %{time} war un hollad cheñchamantoù emaoc''h o sellet outañ hag a zo bet
           krouet gant %{changeset_author}'
+        commented_changeset_html: '%{commenter} en deus skrivet un evezhiadenn d''an/ar
+          %{time} war un hollad cheñchamantoù emaoc''h o sellet outañ hag a zo bet
+          krouet gant %{changeset_author}'
         partial_changeset_with_comment: gant an addispleg '%{changeset_comment}'
+        partial_changeset_with_comment_html: gant an evezhiadenn '%{changeset_comment}'
         partial_changeset_without_comment: Hep evezhiadenn
       details: Muioc'h a ditouroù war an holl cheñchamantoù e %{url}.
+      details_html: Muioc'h a ditouroù war an holl cheñchamantoù e %{url}.
       unsubscribe: Evit digoumanantiñ diouzh hizivadurioù an holl gemmoù, gweladennit
         %{url} ha klikit war « Digoumanantiñ ».
   confirmations:
@@ -2121,9 +2147,11 @@ br:
         description: Sevel ur goulenn pe divizout diwar-benn goulennoù dedennus war
           un niver bras a demoù pe diwar-benn rolloù skignañ rannvroel.
       forums:
-        title: Foromoù
+        title: Foromoù (dispredet)
         description: Goulennoù ha divizoù evit ar re a gav gwelloc'h un etrefas e
           stil un daolenn skritellañ
+      community:
+        title: Forom ar gumuniezh
       irc:
         title: IRC
         description: Flap etreoberiat e meur a yezh disheñvel ha diwar-benn danvezioù
@@ -2363,6 +2391,7 @@ br:
       all_traces: An holl roudoù
       my_traces: Ma roudoù
       traces_from: Roudoù GPS foran gant %{user}
+      remove_tag_filter: Lemel ar sil tikedennoù
     destroy:
       scheduled_for_deletion: Roudenn da vezañ dilamet
     make_public:
@@ -2388,7 +2417,7 @@ br:
       not_an_admin: Ret eo deoc'h bezañ merour evit kas an ober-mañ da benn.
     setup_user_auth:
       blocked_zero_hour: Ur gemennadenn vallus zo war lec'hienn OpenStreetMap evidoc'h.
-        Ret eo deoc'h lenn ar gemennadenn-se a-raok gallout enrollañ ho kemmoù.
+        Ret eo deoc'h he lenn a-raok gallout enrollañ ho kemmoù.
       blocked: Stanket eo bet ho moned d'an API. Kevreit ouzh an etrefas web evit
         gouzout hiroc'h.
       need_to_see_terms: Evit ar mare n'oc'h ket aotreet da vont war an API ken. Kevreit
@@ -2397,6 +2426,7 @@ br:
     settings_menu:
       account_settings: Arventennoù ar gont
       oauth1_settings: Arventennoù OAuth 1
+      oauth2_applications: Arloadoù OAuth 2
       oauth2_authorizations: Aotreoù OAuth 2
   oauth:
     authorize:
@@ -2426,10 +2456,14 @@ br:
     permissions:
       missing: N'eo ket bet aotreet an arload ganeoc'h d'ober gan an arc'hwel-mañ
     scopes:
+      read_prefs: Lenn penndibaboù an implijer
+      write_prefs: Kemmañ ho penndibaboù implijer
+      write_diary: Krouiñ enmonedoù en deizlevr, kemennadennoù ha kavout mignoned
       write_api: Kemmañ ar gartenn
       read_gpx: Lenn ar roudoù GPS prevez.
       write_gpx: Enporzhiañ ar roudoù GPS
       write_notes: Kemmañ an notennoù
+      read_email: Lenn chomlec'h postel an implijer
   oauth_clients:
     new:
       title: Marilhañ un arload nevez
@@ -2473,6 +2507,7 @@ br:
       flash: Distrujet eo bet marilhadur an arload arval
   oauth2_applications:
     index:
+      new: Marilhañ un arload nevez
       name: Anv
       permissions: Aotreoù
     application:
@@ -2509,6 +2544,8 @@ br:
       title: Ma sevenidigezhioù aotreet
       application: Sevenidigezh
       permissions: Aotreoù
+    application:
+      revoke: Nullañ ar moned
   users:
     new:
       title: Kevreañ
@@ -2613,6 +2650,7 @@ br:
       deactivate_user: Diweredekaat an implijer-mañ
       confirm_user: Kadarnaat an implijer-mañ
       unconfirm_user: Digadarnaat an implijer-mañ
+      unsuspend_user: Distankañ an implijer-mañ
       hide_user: Kuzhat an implijer-mañ
       unhide_user: Diguzhat an implijer-mañ
       delete_user: Dilemel an implijer-mañ
index 99dfdadfded0c9525e14207fc5d1416de18cfb1c..52c6f8453275ecb94daa4f51035f0059111e2ca9 100644 (file)
@@ -288,6 +288,7 @@ ku-Latn:
       public editing:
         heading: Guherandina ji her kesê re vekirî
         enabled: Çalak e. Ne anonîm e û dikare daneyan biguherîne.
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: Ev çiye?
         disabled: Neçalak e û nikare daneyan biguherîne, hemû guherandinên berê anonîm
           in.
@@ -311,6 +312,7 @@ ku-Latn:
           bikî û qebûl bikî xêra xwe vê lînkê taqîb bike.
         agreed_with_pd: Herwiha te beyan kir ku tu dixwazî guherandinên te wek Malê
           Giştî were qebûlkirin.
+        link: https://wiki.osmfoundation.org/wiki/Licence/Contributor_Terms
         link text: Ev çi ye?
       save changes button: Guherandinan qeyd bike
       make edits public button: Hemû guherandinên min bila ji her kesê re vekirî be
index f14ba726951f509a21c7a7f846687cb22fa88c12..e17c903d4a79b7a375ec76a1d1f1230edfa24bb6 100644 (file)
@@ -223,7 +223,7 @@ mk:
       none: Нема
       openid: OpenID
       google: Google
-      facebook: Facebook
+      facebook: Фејсбук
       windowslive: Windows Live
       github: GitHub
       wikipedia: Википедија
@@ -284,6 +284,7 @@ mk:
       public editing:
         heading: Јавно уредување
         enabled: Овозможено. Сега не е анонимно и може да се уредуваат податоци.
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: што е ова?
         disabled: Оневозможено и не може да се уредуваат податоци, сите претходни
           уредувања се анонимни.
@@ -1882,8 +1883,8 @@ mk:
           title: Најава со Google
           alt: Најава со OpenID од Google
         facebook:
-          title: Најава со Facebook
-          alt: Најава со профил на Facebook
+          title: Најава со Фејсбук
+          alt: Најава со профил на Фејсбук
         windowslive:
           title: Најава со Windows Live
           alt: Најава со сметка на Windows Live
index 48ccf32f6e5746d9868afae84d217adc1cfe7bcf..2f0b74524db2b33f9e459af6b24569e95b31e65b 100644 (file)
@@ -1133,6 +1133,9 @@ ne:
   oauth_clients:
     show:
       confirm: निश्चित हुनुहुन्छ ?
+  oauth2_applications:
+    show:
+      delete: मेट्ने
   users:
     new:
       title: खाता खाेल्नुहाेस्
index ab77663c5364057478819b6055711272bb857e30..b965fa32e0e1ce2edd4bf8d7038355de086fbf94 100644 (file)
@@ -249,6 +249,32 @@ oc:
       entry:
         comment: Comentari
         full: Nòta completa
+  account:
+    deletions:
+      show:
+        title: Suprimir lo còmpte
+        warning: Avís! Lo procès de supression dau còmpte es definitiu e pòt pas anullar.
+        delete_account: Suprimir lo còmpte
+        delete_introduction: 'Podètz suprimir vòstre còmpte OpenStreetMap en emplegant
+          lo boton dessota. Prenetz en compte lei detalhs seguents:'
+        delete_profile: S'eliminarà l'informacion de perfiu, comprés vòstre avatar,
+          la descripcion e la localizacion de vòstra demòra.
+        delete_display_name: S'eliminarà lo nom mostrat e se podrà utilizar per d'autrei
+          còmptes.
+        retain_caveats: 'Quauqueis informacions, pasmens, demoraràn a OpenStreetMap,
+          emai lo còmpte suprimit :'
+        retain_edits: Lei modificacions fachas a la mapa, se n'avètz agut fachas,
+          seràn mantengudas.
+        retain_traces: Lei traças GPS se n'avètz agut telecargadas, seràn mantengudas.
+        retain_diary_entries: Leis intradas e comentaris de jornau, se n'i a, seràn
+          mantengudas mai escondudas.
+        retain_notes: Lei nòtas e comentaris sus lei nòtas, se n'i a, seràn mantengudas
+          mai escondudas.
+        retain_changeset_discussions: Lei discussions sus lei cambiaments, se n'i
+          a, se conservaràn.
+        retain_email: L'adreiça e-mail sarà conservada.
+        confirm_delete: Siatz segur ?
+        cancel: Anullar
   accounts:
     edit:
       title: Modificar lo compte
@@ -260,6 +286,7 @@ oc:
       public editing:
         heading: Modificacion publica
         enabled: Activat. Pas anonim e pòt modificar las donadas.
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: qu’es aquò ?
         disabled: Desactivadas e sensa permés per editar; lei modificacions anterioras
           son anonimas.
@@ -277,11 +304,14 @@ oc:
         link text: qu’es aquò ?
       save changes button: Enregistrar las modificacions
       make edits public button: Rendre totas mas modificacions publicas
+      delete_account: Suprimir lo còmpte
     update:
       success_confirm_needed: Informacions sus l'utilizaire mesas a jorn amb succès.
         Verificatz vòstra bóstia mail per tal de validar la verificacion de vòstre
         novèla adreça e-mail.
       success: Informacions sus l'utilizaire mesas a jorn amb succès.
+    destroy:
+      success: Còmpte suprimit...
   browse:
     created: Creat
     closed: Plegat
@@ -419,7 +449,7 @@ oc:
       reopened_by_html: Reactivat per %{user}  fa <abbr title='%{exact_time}'>%{when}</abbr>
       reopened_by_anonymous_html: Reactivat per un utilizaire anonim fa <abbr title='%{exact_time}'>%{when}</abbr>
       hidden_by_html: Amagat per %{user} <abbr title='%{exact_time}'>fa %{when}</abbr>
-      report: Avisar d’aquesta noticia
+      report: Avisar d’aquesta nòta
     query:
       title: Requèsta suls objèctes
       introduction: Clicar sus la mapa per trobar los objèctes a proximitat.
@@ -607,6 +637,7 @@ oc:
           chair_lift: Telesèti
           drag_lift: Telesquí
           gondola: Telecabina
+          magic_carpet: Cinta Transportadoira
           platter: Montaplat
           pylon: Pilòn
           station: Gara de telecabina
@@ -625,7 +656,7 @@ oc:
           runway: Pista
           taxilane: Via de taxi
           taxiway: Via de manòbra
-          terminal: Terminal
+          terminal: Terminau
           windsock: Manega de vent
         amenity:
           animal_boarding: Pension per animaus
@@ -786,6 +817,7 @@ oc:
           roof: Torre
           ruins: Bastissa en roïnas
           school: Bastissa escolara
+          semidetached_house: Ostau mejancier
           service: Bastissa de servici
           shed: Cabanon
           stable: Estable
@@ -797,6 +829,7 @@ oc:
           warehouse: Entrepaus
           "yes": Bastissa
         club:
+          scout: Basa de Scouts
           sport: Club esportiu
           "yes": Cèrcle
         craft:
@@ -885,6 +918,7 @@ oc:
           trailhead: Ponch de partença
           trunk: Via exprèssa
           trunk_link: Via exprèssa
+          turning_circle: Rotonda de càncel
           turning_loop: Virada en bocla
           unclassified: Rota menora
           "yes": Rota
@@ -955,7 +989,7 @@ oc:
           reservoir: Sèrva
           reservoir_watershed: Bacin versant de sèrva
           residential: Zòna residenciala
-          retail: Zòna comerciala
+          retail: Pargue comerciau
           village_green: Zòna publica erborada
           vineyard: Vinha
           "yes": Usatge del terren
@@ -1002,6 +1036,7 @@ oc:
           antenna: Antena
           avalanche_protection: Proteccion còntra avalancas
           beacon: Far
+          beam: Equipa
           beehive: Bornhon
           breakwater: Mòle
           bridge: Pont
@@ -1032,6 +1067,7 @@ oc:
           reservoir_covered: Depaus cobèrt
           silo: Silò
           snow_cannon: Canon de nèu
+          snow_fence: Barriera còntra lei avalancadas
           storage_tank: Cistèrna d'emmagazinatge
           street_cabinet: Armari tecnic
           surveillance: Susvelhança
@@ -1163,6 +1199,7 @@ oc:
           "yes": Luòc
         railway:
           abandoned: Via ferrada abandonada
+          buffer_stop: Butador
           construction: Via ferrada en construccion
           disused: Via ferrada desafectada
           funicular: Via de funicular
@@ -1176,6 +1213,7 @@ oc:
           platform: Plataforma ferroviària
           preserved: Via ferrada conservada
           proposed: Projècte de camin de fèrre
+          rail: Ralh
           spur: Via de connexion
           station: Gara ferroviària
           stop: Arrèst de camin de fèrre
@@ -1184,6 +1222,7 @@ oc:
           switch: Agulhas
           tram: Tramvia
           tram_stop: Arrèst de tram
+          turntable: Rotonda ferroviària
           yard: Via de triatge
         shop:
           agrarian: Botiga agricòla
@@ -1192,6 +1231,7 @@ oc:
           appliance: Botiga d'aparelhs electrodomestics
           art: Botiga d'art
           baby_goods: Botiga d'articles per la mainada
+          bag: Maroquinariá
           bakery: Fornariá
           bathroom_furnishing: Mòbles de banh
           beauty: Botiga de produchs de beutat
@@ -1223,7 +1263,7 @@ oc:
           deli: Tractaire
           department_store: Grand magazin
           discount: Magazin discount
-          doityourself: Botiga de bricolatge
+          doityourself: Botiga de bricolejatge
           dry_cleaning: Netejatge a sec
           e-cigarette: Botiga de cigaretas electronicas
           electronics: Magazin d'electronica
@@ -1235,6 +1275,7 @@ oc:
           fishing: Botiga d'accessòris de pesca
           florist: Florista
           food: Botiga d'alimentacion
+          frame: Botiga d'enquadrament
           funeral_directors: Pompas funèbras
           furniture: Amòblament
           garden_centre: Jardinariá
@@ -1248,7 +1289,7 @@ oc:
           health_food: Botiga d'alimentacion naturala
           hearing_aids: Aparelhs auditius
           herbalist: Erboristeria
-          hifi: Magazin Hi-Fi
+          hifi: Botiga Hi-Fi
           houseware: Venda d’articles per l'ostau
           ice_cream: Glacier
           interior_decoration: Decoracion d'interior
@@ -1525,6 +1566,8 @@ oc:
       hi: Bonjorn %{to_user},
       header: '%{from_user} a publicat un comentari sus un article recent del jornal
         OpenStreetMap amb lo subjècte %{subject} :'
+      header_html: '%{from_user} a publicat un comentari sus un article recent dau
+        jornau OpenStreetMap amb lo subjècte %{subject} :'
       footer: Tanben podètz legir lo comentari sus %{readurl}, lo comentar sus %{commenturl}
         o respondre sus %{replyurl}
     message_notification:
@@ -1532,6 +1575,10 @@ oc:
       hi: Bonjorn %{to_user},
       header: '%{from_user} vos a mandat un messatge dempuèi OpenStreetMap amb lo
         subjècte %{subject} :'
+      header_html: '%{from_user} vos a mandat un messatge d''OpenStreetMap amb lo
+        subjècte %{subject} :'
+      footer: Podètz tanben legir lo messatge a %{readurl} e podètz enviar un messatge
+        a l'autor a %{replyurl}
       footer_html: Tanben podètz legir lo messatge a %{readurl} e i podètz respondre
         a %{replyurl}
     friendship_notification:
@@ -1606,15 +1653,20 @@ oc:
           de %{place}.'
         commented_note: '%{commenter} a resolgut una nòta de mapa qu''avètz comentada.
           La nòta es pròcha de %{place}.'
+        commented_note_html: '%{commenter} a laissat un comentari sus una de vòstras
+          nòtas de mapa qu''aviatz comentada. La nòta es pròcha de %{place}.'
       reopened:
         subject_own: '[OpenStreetMap] %{commenter} a reactivat una de vòstras nòtas'
         subject_other: '[OpenStreetMap] %{commenter} a reactivat una nòta a que vos
           i interessàvetz'
         your_note: '%{commenter} a reactivat una de vòstras nòtas de mapa prèp de
           %{place}.'
+        your_note_html: '%{commenter} a laissat un comentari sus una de vòstrei nòtas
+          de mapa pròche de %{place}.'
         commented_note: '%{commenter} a reactivat una nòta de mapa qu''avètz comentada.
           La nòta se tròba prèp de %{place}.'
       details: Mai de detalh sus la nòta pòt èsser obtengut a %{url}.
+      details_html: Podètz trobar mai de detalhs de la nòta a %{url}.
     changeset_comment_notification:
       hi: Bonjorn %{to_user},
       greeting: Bonjorn,
@@ -1625,32 +1677,48 @@ oc:
           al qual vos interessatz'
         your_changeset: '%{commenter} daissèt un comentari lo %{time} sus un de vòstres
           ensembles de cambiaments'
+        your_changeset_html: '%{commenter} laissèt un comentari lo %{time} sus un
+          de vòstrei ensems de cambiaments'
         commented_changeset: '%{commenter} a fach un comentari per un ensems de cambiaments
           de %{changeset_author} a %{time} e que seguissètz'
         partial_changeset_with_comment: amb lo comentari  «&nbsp;%{changeset_comment}'&nbsp;»
+        partial_changeset_with_comment_html: amb lo comentari  «&nbsp;%{changeset_comment}'&nbsp;»
         partial_changeset_without_comment: sens comentari
       details: Mai de detalhs sus l’ensemble de modificacions a %{url}.
+      details_html: Mai de detalhs sus l’ensems de modificacions a %{url}.
       unsubscribe: Per vos desabonar de las mesas a jorn d'aqueste ensemble de modificacions,
         visitatz %{url} e clicatz sus « Desabonar ».
+      unsubscribe_html: Per vos desabonar deis actualizacions d'aqueste ensems de
+        modificacions, visitatz %{url} e clicatz sus « Desabonar ».
   confirmations:
     confirm:
       heading: Verificatz vòstre corrièr electronic !
       introduction_1: Vos avèm mandat un corrièl de confirmacion.
+      introduction_2: Confirmatz lo compte en clicant lo ligame que se tròba au corrièr
+        que t'avèm enviat e poiràs començar a editar la mapa.
       press confirm button: Quichar lo boton confirmar çaijós per activar vòstre compte.
       button: Confirmar
       success: Compte confirmat, mercé de vos èsser enregistrat !
       already active: Aqueste compte es ja estat confirmat.
       unknown token: Lo còdi de confirmacion a expirat o existís pas.
+      reconfirm_html: S'as de besonh que te tornem mandar lo corrier de confirmacion,
+        <a href="%{reconfirm}">clica aicí</a>.
     confirm_resend:
       failure: L’utilizaire %{name} es introbable.
     confirm_email:
       heading: Confirmar lo cambiament de vòstra adreça e-mail
+      press confirm button: Quichatz lo boton de confirmar dessota per confirmar l'adreça
+        nòva de corrier electronic.
       button: Confirmar
       success: Modificacion de vòstra adreça de corrièr electronic confirmada !
+      failure: L'adreça de corrier electronic es ja estada confirmada amb aquesta
+        ficha.
+      unknown_token: Lo còde de confirmacion a expirat o existís pas.
   messages:
     inbox:
       title: Bóstia de recepcion
       my_inbox: Ma bóstia de recepcion
+      my_outbox: Mon mandador
       messages: Avètz %{new_messages} e %{old_messages}
       new_messages:
         one: '%{count} messatge novèl'
@@ -1685,6 +1753,8 @@ oc:
       body: O planhèm, i a pas cap de messatge amb aqueste identificant.
     outbox:
       title: Bóstia de mandadís
+      my_inbox: Mon recebedor
+      my_outbox: Mon mandador
       messages:
         one: Avètz %{count} messatge mandat
         other: Avètz %{count} messatges mandats
@@ -1733,11 +1803,30 @@ oc:
       reset: Reïnicializar lo senhal
       flash changed: Vòstre senhal es estat modificat.
       flash token bad: Avètz pas trobat aqueste geton, avètz verificat l'URL ?
+  preferences:
+    show:
+      title: Preferéncias
+      preferred_editor: 'Editor preferit :'
+      preferred_languages: Lengas preferidas
+      edit_preferences: Preferéncias de corrier electronic
+    edit:
+      title: Preferéncias de l'aparéncia
+      save: Actualizar lei preferéncias
+      cancel: Anullar
+    update:
+      failure: Se son pas pogudas actualizar lei preferéncias.
+    update_success_flash:
+      message: Preferéncias actualizadas
   profiles:
     edit:
+      title: Modificar lo perfiu
+      save: Actualizar lo perfiu
+      cancel: Anullar
       image: 'Imatge :'
       gravatar:
         gravatar: Utilizar Gravatar
+        link: https://wiki.openstreetmap.org/wiki/OC:Cargar
+        what_is_gravatar: Qu'es aquò Grava(ta)r?
         disabled: Gravatar es estat desactivat.
         enabled: L'afichatge de vòstre Gravatar es estat activat.
       new image: Ajustar un imatge
@@ -1745,10 +1834,13 @@ oc:
       delete image: Suprimir l'imatge actual
       replace image: Remplaçar l'imatge actuala
       image size hint: (los imatges carrats d'al mens 100×100 pixèls foncionan melhor)
-      home location: 'Emplaçament del domicili :'
+      home location: 'Emplaçament dau domicili :'
       no home location: Avètz pas indicat l'emplaçament de vòstre domicili.
       update home location on click: Metre a jorn l'emplaçament de vòstre domicili
         quand clicatz sus la mapa ?
+    update:
+      success: S'es actualizat lo perfiu.
+      failure: S'es pas pogut actualizar lo perfiu.
   sessions:
     new:
       title: Se connectar
@@ -1760,6 +1852,8 @@ oc:
       lost password link: Avètz perdut vòstre senhal ?
       login_button: Se connectar
       register now: S'inscriure ara
+      with username: 'Avètz ja un còmpte OpenStreetMap ? Iniciatz session amb lo nom
+        d''usancier e lo senhau:'
       with external: 'A la plaça, utilizatz un tèrç per vos connectar :'
       new to osm: Novèl sus OpenStreetMap ?
       to make changes: Per aportar de modificacions a las donadas OpenStreetMap, vos
@@ -1798,12 +1892,29 @@ oc:
       title: Desconnexion
       heading: Desconnexion d'OpenStreetMap
       logout_button: Desconnexion
+  shared:
+    markdown_help:
+      title_html: Analisat amb <a href="https://kramdown.gettalong.org/quickref.html">kramdown</a>
+      headings: Títols
+      subheading: Sostítol
+      unordered: Lista sens ordenar
+      ordered: Lista ordenada
+      first: Premier element
+      second: Element segond
+      link: Li(g)ame
+      text: Tèxte
+      image: Imatge
+      alt: Ajustar de tèxte
+      url: URL
+    richtext_field:
+      edit: Modificar
+      preview: Previsualizacion
   site:
     about:
       next: Seguent
       copyright_html: <span>&copy;</span>Contributors<br /> d’OpenStreetMap
-      used_by_html: '%{name} provesís de donadas cartograficas sus de milierats de
-        sites web, aplicacions mobilas e aparelhs'
+      used_by_html: '%{name} fornís de donadas cartograficas sus de milierats de sites
+        web, aplicacions mobilas e aparelhs'
       lede_text: OpenStreetMap es bastit per una comunautat de cartografes benevòls
         que contribuisson e mantenon las donadas de las rotas, caminòls, cafès, estacions
         ferroviàrias e plan mai encara, pertot dins lo mond.
@@ -1859,11 +1970,11 @@ oc:
             las podètz distribuir sonque jos la meteissa licéncia. Lo
             <a href="https://opendatacommons.org/licenses/odbl/1.0/">tèxte
             legal</a> complet detalha vòstres dreits e responsabilitats.
-        intro_3_1_html: Nòstres carrèus de rendut cartografics, e tanben de nòstra
-          documentacion, son disponibles jos la licéncia <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+        intro_3_1_html: Nòstrei carrèus de rendut cartografics, e tanben la documentacion,
+          son disponibles sota la licéncia <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
           Commons paternitat – partiment a l’identic 2.0</a> (CC-BY-SA).
         credit_title_html: Cossí creditar OpenStreetMap
-        credit_1_html: Demandam que vòstre crèdit compòrta la mencion « © los contributors
+        credit_1_html: Demandam que vòstre crèdit compòrte la mencion « © lei contribueires
           d’OpenStreetMap ».
         credit_2_1_html: Vos fau tanben botar en evidéncia que lei donadas son disponiblas
           sota licéncia de basa de donadas dubèrtas e, s'utilizatz nòstrei mapas,
@@ -1930,6 +2041,8 @@ oc:
       createnote: Apondre una nòta
       license:
         copyright: Copyright OpenStreetMap e sos contributors, jos una licéncia dobèrta
+      remote_failed: L'edicion a mancat. Asseguratz-vos que lo JOSM o lo Merkaartor
+        s'executa e que l'opcion de comandament a distància es abilitada
     edit:
       not_public: Avètz pas reglat vòstras modificacions per que sián publicas.
       user_page_link: pagina d'utilizaire
@@ -2019,6 +2132,8 @@ oc:
         title: Forums
         description: De questions e de discussions per los que preferisson una interfàcia
           jos la forma de tablèu d’afichatge.
+      community:
+        title: Comunautat
       irc:
         title: IRC
         description: Discussion interactiva dins de fòrça lengas diferentas e sus
@@ -2085,6 +2200,7 @@ oc:
           common:
           - Espaci comun
           - prada
+          - Jardin
           retail: Zòna de comèrci
           industrial: Zòna industriala
           commercial: Zòna terciària
@@ -2176,6 +2292,7 @@ oc:
       upload_failed: O planhèm, s'es pas cargar lo GPX. Un administraire es estat
         alertat de l'error. Se vos plai, ensaja-o de nòu.
     edit:
+      cancel: Anullar
       title: Modificar la traça %{name}
       heading: Modificar la traça %{name}
       visibility_help: qué significa aquò ?
@@ -2192,6 +2309,7 @@ oc:
       uploaded: 'Mandat lo :'
       points: 'Punts :'
       start_coordinates: 'Coordenadas de despart :'
+      coordinates_html: '%{latitude}; %{longitude}'
       map: mapa
       edit: modificar
       owner: 'Proprietari :'
@@ -2209,7 +2327,7 @@ oc:
       newer: Traças novèlas
     trace:
       pending: EN ESPÈRA
-      count_points: '%{count} punts'
+      count_points: '%{count} ponchs'
       more: mai
       trace_details: Veire los detalhs de la traça
       view_map: Veire la mapa
@@ -2222,6 +2340,7 @@ oc:
       in: dins
     index:
       public_traces: Traças GPS publicas
+      my_gps_traces: Traças GPS
       public_traces_from: Traças GPS publicas de %{user}
       description: Percórrer las traças GPS telecargadas recentament
       tagged_with: '  balisat amb %{tags}'
@@ -2229,7 +2348,10 @@ oc:
         traça novèla</a> o per ne saber mai sul traçatge GPS, consultatz la <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pagina
         wiki</a>.
       upload_trace: Mandar una traça
-      my_traces: las mias traças GPS
+      all_traces: Totei lei traças
+      my_traces: Mei traças GPS
+      traces_from: Traças GPS publicas de %{user}
+      remove_tag_filter: Elimina lo filtre d'etiquetas
     destroy:
       scheduled_for_deletion: Pista prevista per la supression
     make_public:
@@ -2255,9 +2377,11 @@ oc:
       not_an_admin: Avètz besonh d’èsser un administrador per realizar aquesta accion.
     setup_user_auth:
       blocked_zero_hour: Avètz un messatge urgent sus lo site web de OpenStreetMap.
-        Avètz de legir lo messatge abans que poscatz sauvar vòstrei modificacions.
+        Avètz de legir lo messatge abans que posquetz sauvar lei modificacions.
       blocked: Vòstre accès a l'API es estat blocat. Se vos plai, connectatz-vos au
         site web per trobar mai d’informacions.
+    settings_menu:
+      account_settings: Configuracion
   oauth:
     authorize:
       title: Autorizar l’accès a vòstre compte
index d55426ba1c2eb298ce3edf23aaf34114d6304f81..792e4f74bb0f58a2edde85d353cff8ccfa06e0bc 100644 (file)
@@ -244,7 +244,7 @@ pnb:
     deletions:
       show:
         title: میرا کھاتہ مٹاؤ
-        delete_account: کھاتا مٹاؤ
+        delete_account: کھاتہ مٹاؤ
         delete_introduction: 'ایہہ بٹن نال ٹہاڈے کھاتا مٹا سکاں‌گے اے۔ پر ویروے ویکھیو:'
         retain_diary_entries: تہاڈے روزنامچے دے لیکھ تے ٹپݨیاں لُکاؤگیاں سی۔
         retain_email: تہاڈے ای‌میل دا پتہ رکھݨ‌گے اے۔
@@ -275,9 +275,9 @@ pnb:
       make edits public button: میریاں ساریاں سودھاں عوام کرو
       delete_account: کھاتہ مٹاؤ…
     update:
-      success_confirm_needed: ٹھیکھ اے، تہاڈے ورتنوالے دے ویروے نواں کیتے سی۔ ایہہ
+      success_confirm_needed: ٹھیک اے، تہاڈے ورتنوالے دے ویروے نواں کیتے سی۔ ایہہ
         نواں پتہ لئی ای‌میل وچ پکے دی کڑی۔
-      success: ٹھیکھ اے، ویروے نواں کیتے سی۔
+      success: ٹھیک اے، ویروے نواں کیتے سی۔
     destroy:
       success: کھاتہ مٹایا۔
   browse:
@@ -673,6 +673,7 @@ pnb:
           nursing_home: نرسنگ ہوم
           parking: پارکنگ
           parking_entrance: پارکنگ پروش
+          parking_space: پارکنگ دا تھاں
           pharmacy: فارمیسی
           place_of_worship: عبادتگاہ
           police: پلیس
@@ -1015,6 +1016,7 @@ pnb:
           beauty: سندرتا والا
           beverages: پیݨ پدارتھاں دی دُکان
           bicycle: سائیکل دی دکان
+          bookmaker: کتاب بݨاؤݨ والا
           books: کتاب دی دُکان
           boutique: بُٹیک
           butcher: کمسئی
@@ -1166,7 +1168,7 @@ pnb:
       search_guidance: 'مسئلے لئی کھوجیو:'
       user_not_found: ورتنوالا نہیں ہوگیا سی
       issues_not_found: کجھ مسئلے نہیں لبھیئے
-      status: Ø³Ù¹Û\8cٹس
+      status: Ø­Ø§Ù\84ت
       reports: رپورٹاں
       last_updated: حالیہ سودھ دی تریخ
       last_updated_time_html: <abbr title='%{title}'>%{time}</abbr>
@@ -1376,7 +1378,7 @@ pnb:
       press confirm button: پکا کرن لئی ایہہ بٹن چݨیو
       button: پکا کرو
       success: پکا کیتا، مہربانی!
-      already active: ایہہ کھاتا پہلوں ہی تسدیک ہو چکا اے۔
+      already active: ایہہ کھاتہ پہلوں ہی تسدیک ہو چکا اے۔
       unknown token: اُس تسدیکی کوڈ. دی میاد جاں ہوند ختم ہو چکی اے۔
     confirm_resend:
       failure: '%{name} ورتنوالا نہیں لبھیا۔'
@@ -1515,7 +1517,7 @@ pnb:
       register now: ہُݨے رجِستر کرو
       with external: 'لوگ‌این کرن لئی ہور چݨ سکیو:'
       new to osm: ایہہ نقشے تے نویں او؟
-      to make changes: نقشے تے سودھان پاؤݨ لئی، تسیں کھاتا بݨا سکیو۔
+      to make changes: نقشے تے سودھاں پاوݨ لئی، تسیں کھاتہ بݨایو۔
       create account minute: کھاتا بݨاؤ، صرف اِکّ منٹ لگدا اے۔
       no account: کھاتہ نہیں اے؟
       account not active: افسوس، حالیہ تہاڈے کھاتا نہیں پکا۔<br/> پکا کرن لئی تہاڈے
@@ -1691,7 +1693,8 @@ pnb:
           title: ایہدا اوورپیس دی فائل
           description: ہور نقشے دے ڈیٹا نال ویب سائیٹ توں ڈاؤن‌لوڈ کریو
         geofabrik:
-          title: جیوفیںرِک فائلان
+          title: جیوفیںرِک فائلاں
+          description: برعظماں، دیشاں تے کجھ چݨے شہراں نال نقشے توں پرچالت ڈیٹا
         metro:
           title: میٹرو ایکسٹراکٹ
           description: وڈا شہر بارے وچ برامد
@@ -1851,6 +1854,10 @@ pnb:
       add_a_note:
         title: سودھ کرن دی وہل نہیں اے؟ کجھ نوٹ پا سکیو!
   traces:
+    visibility:
+      private: نجی (صرف انام جاݨکاری ویکھدے، پوئینٹاں لئی کوئی لڑی نہیں اے)
+      public: عاوم (کھرے دی لسٹ وچ ایہہ ویکھدے، پر جاݨکاری انام اے تے پوئینٹاں لئی
+        کوئی لڑی نہیں اے)
     new:
       upload_trace: کھرے کھوجاں چڑھاؤ
       visibility_help: ایہدا کیہ مطلب اے؟
@@ -1935,6 +1942,7 @@ pnb:
       allow_write_api: نقشہ سودھ سکدا
       allow_write_gpx: کھرے چڑھاؤݨے
       allow_write_notes: نوٹ سودھ سکدا
+      grant_access: اِجازت دیو
     authorize_success:
       verification: 'پکا کرن دا کوڈ: %{code}'
     authorize_failure:
@@ -1954,6 +1962,7 @@ pnb:
       title: اَیپ سودھو
     show:
       key: 'ورتوں دی کنجی:'
+      access_url: 'پہنچ ٹوکن دی کڑی دا پتہ:'
       authorize_url: 'اِجازت دی کڑی:'
       edit: وروے سودھو
       delete: اَیپ مٹاؤ
@@ -1962,6 +1971,7 @@ pnb:
       title: او اوتھ ویروے
       my_tokens: میریاں اِجازت نال ایپلیکیشناں
       application: ایپلیکیشن دا ناں
+      revoke: پرتاؤ!
       my_apps: میرے اَیپ
       no_apps_html: تہاڈے %{oauth} نال کجھ اَیپ جوڑنے چاہیدے؟ اِتھے ایہہ پاؤن‌گے سی۔
       oauth: او آوتھ
@@ -1992,6 +2002,8 @@ pnb:
     new:
       authorize: اِجازت دیو
       deny: اِجازت نہیں دیو
+    error:
+      title: غلطی آئی گئی اے
     show:
       title: اِجازت دا کوڈ
   oauth2_authorized_applications:
@@ -1999,6 +2011,9 @@ pnb:
       title: میریاں اِجازتاں
       application: ایپلیکیشن
       permissions: اِجازتاں
+    application:
+      revoke: اِجازت ہٹاؤ
+      confirm_revoke: ایس ایپلکیشن لئی اِجازت ہٹاؤ؟
   users:
     new:
       title: بھرتی ہووو
@@ -2040,6 +2055,8 @@ pnb:
       my comments: ٹپݨیاں
       my_preferences: ترجیحاں
       my_dashboard: ڈیش بورڈ
+      blocks on me: میرے تے روکاں
+      blocks by me: میرے ولوں رکاں
       edit_profile: تہاڈے صفحہ سودھو
       send message: سنہا بھیجو
       diary: روزنامچہ
@@ -2055,7 +2072,8 @@ pnb:
       latest edit: پچھلی سودھ (%{ago})
       email address: 'ای‌میل پتہ:'
       created from: 'کتھوں اُساریا:'
-      status: 'سٹیٹس:'
+      status: حالت
+      spam score: 'سپیم سکور:'
       description: تفصیل
       user location: ورتنوالے دی ستھتی
       role:
@@ -2119,6 +2137,7 @@ pnb:
     update:
       success: روک نویائی گئی۔
     index:
+      title: ورتنوالے دے روکاں
       heading: ورتنوالیاں لئی روکاں دی لسٹ
       empty: حالاں کوئی روکاں نہیں بݨائیاں گیاں۔
     revoke:
@@ -2144,11 +2163,12 @@ pnb:
           other: '%{count} سال'
     show:
       created: 'بݨایا:'
-      status: Ø³Ù¹Û\8cٹس
+      status: Ø­Ø§Ù\84ت
       show: وکھاؤ
       edit: سودھو
       revoke: پرتاؤ!
       confirm: پکے؟
+      back: ساریاں روکاں ویکھو
       revoker: 'پرتاؤݨ والا:'
     block:
       not_revoked: (نہیں پرتائی دتی گئی)
@@ -2156,7 +2176,9 @@ pnb:
       edit: سودھو
       revoke: پرتاؤ
     blocks:
+      display_name: روکیا ورتنوالا
       creator_name: لیکھک
+      reason: روک دا کارن
       status: درجہ
       showing_page: صفحہ نمبر %{page}
       next: اگلا »
@@ -2227,7 +2249,11 @@ pnb:
       edit_tooltip: نقشہ سودھو
       edit_disabled_tooltip: نقشہ سودھݨ واسطے اندر نوں جاؤ
       createnote_tooltip: نقشے تے نوٹ پایو
+      createnote_disabled_tooltip: نقشے تے نوٹ پاوݨ لئی وڈا کریو
+      map_notes_zoom_in_tooltip: نوٹ دکھݨ لئی وڈا کریو
+      map_data_zoom_in_tooltip: ڈیٹے دکھݨ لئی وڈا کریو
       queryfeature_tooltip: نقشاں لئی پرشن
+      queryfeature_disabled_tooltip: نقش دے پرشن لئی وڈا کریو
     changesets:
       show:
         comment: ٹپݨی کرو
@@ -2250,6 +2276,7 @@ pnb:
         graphhopper_bicycle: سائیکل (گریف‌ہپر)
         graphhopper_car: کار(گریف ہپر)
         graphhopper_foot: پیر (گریف‌ہوپر)
+      directions: دشاواں
       instructions:
         via_point_without_exit: (پوئینٹ دوارا)
         follow_without_exit: '%{name} تے چلدے رہو'
index f8c0e00da1abd8490d1e53bb721ba11ab84c9b38..c7a52362cf1c529ab57e197a0d0b2eaaa7314d14 100644 (file)
@@ -290,6 +290,7 @@ sc:
       public editing:
         heading: Modificatzione pùblica
         enabled: Abilitada. No anònimu e podet modificare datos.
+        enabled link: https://wiki.openstreetmap.org/wiki/Sc:Anonymous_edits
         enabled link text: ite est custu?
         disabled: Inabilitadu e chene permissu de mudare sos datos; totu sas modìficas
           antepostas sunt anònimas.
@@ -313,6 +314,7 @@ sc:
           e atzetare sas cunditziones noas pro sa contributzione.
         agreed_with_pd: As fintzas decraradu chi cunsìderas sas modìficas tuas de
           domìniu pùblicu.
+        link: https://wiki.osmfoundation.org/wiki/Licence/Contributor_Terms&uselang=sc
         link text: ite est custu?
       save changes button: Sarva sas modìficas
       make edits public button: Faghe totu sas modìficas meas pùblicas
index c5ba7015b66300af2c74c348174bbe27f9863459..97cf49d61eaeab5f586e4b42ca6e4fc45954301b 100644 (file)
@@ -56,8 +56,8 @@ sl:
         invalid_email_address: se ne prikaže kot veljaven elektronski naslov
     models:
       acl: Seznam nadzora dostopa
-      changeset: Paket sprememb
-      changeset_tag: Oznaka paketa sprememb
+      changeset: Množica sprememb
+      changeset_tag: Oznaka množice sprememb
       country: Država
       diary_comment: Komentar v dnevniku
       diary_entry: Vpis v dnevnik
@@ -340,7 +340,7 @@ sl:
     edited_by_html: Uredil(a) %{user} <abbr title='%{title}'>%{time}</abbr>
     closed_by_html: Zaprl(a) %{user} <abbr title='%{title}'>%{time}</abbr>
     version: Različica
-    in_changeset: Paket sprememb
+    in_changeset: Množica sprememb
     anonymous: anonimni
     no_comment: (brez komentarja)
     part_of: Del
@@ -349,7 +349,7 @@ sl:
     view_details: Prikaz podrobnosti
     location: 'Lokacija:'
     changeset:
-      title: 'Paket sprememb: %{id}'
+      title: 'Množica sprememb: %{id}'
       belongs_to: Avtor
       node: Vozlišč (%{count})
       node_paginated: Vozlišča (%{x}-%{y} od %{count})
@@ -364,8 +364,8 @@ sl:
       changesetxml: Paket sprememb XML
       osmchangexml: osmChange XML
       feed:
-        title: Paket sprememb %{id}
-        title_comment: Paket sprememb %{id} - %{comment}
+        title: Množica sprememb %{id}
+        title_comment: Množica sprememb %{id} – %{comment}
       join_discussion: Prijavite se za pridružitev pogovoru
       discussion: Pogovor
       still_open: Paket sprememb je še vedno odprt – pogovor se bo začel, ko bo paket
@@ -405,7 +405,7 @@ sl:
         node: vozlišče
         way: pot
         relation: zveza
-        changeset: Paket sprememb
+        changeset: množica sprememb
         note: opomba
     timeout:
       sorry: Pridobivanje podatkov za %{type} z ID-jem %{id} žal traja predolgo.
@@ -413,7 +413,7 @@ sl:
         node: vozlišče
         way: pot
         relation: zveza
-        changeset: Paket sprememb
+        changeset: množica sprememb
         note: opomba
     redacted:
       redaction: Redakcija %{id}
@@ -470,7 +470,7 @@ sl:
     changeset:
       anonymous: Anonimen
       no_edits: (brez urejanj)
-      view_changeset_details: Ogled podrobnosti paketa sprememb
+      view_changeset_details: Ogled podrobnosti množice sprememb
     changesets:
       id: ID
       saved_at: Shranjeno ob
@@ -478,7 +478,7 @@ sl:
       comment: Komentar
       area: Območje
     index:
-      title: Paketi sprememb
+      title: Množice sprememb
       title_user: Paketi sprememb uporabnika %{user}
       title_friend: Paketi sprememb mojih prijateljev
       title_nearby: Paketi sprememb bližnjih uporabnikov
@@ -1327,7 +1327,7 @@ sl:
     user_diaries_tooltip: Pregled dnevnikov uporabnikov
     edit_with: Za urejanje uporabi %{editor}
     tag_line: Prost wiki zemljevid sveta
-    intro_header: Dobrodošli na OpenStreetMap!
+    intro_header: Pozdravljeni v OpenStreetMap!
     intro_text: OpenStreetMap je zemljevid sveta, ki ga ustvarjajo ljudje kot ste
       vi, brezplačen za uporabo z odprto licenco.
     intro_2_create_account: Ustvarite uporabniški račun
@@ -1386,7 +1386,7 @@ sl:
         %{possible_points} točk.
       subject: '[OpenStreetMap] Uspeh uvoza datoteke GPX'
     signup_confirm:
-      subject: '[OpenStreetMap] Dobrodošli na OpenStreetMap'
+      subject: '[OpenStreetMap] Pozdravljeni v OpenStreetMap'
       greeting: Pozdravljeni!
       created: Nekdo (upamo, da ste to vi) je pravkar ustvaril račun na %{site_url}.
       confirm: 'Pred karkoli drugim, morate potrditi, da je ta zahteva prišla od vas.
@@ -1733,8 +1733,8 @@ sl:
         infringement_title_html: Kršitev avtorskih pravic
         trademarks_title_html: <span id="trademarks"></span>Blagovne znamke
     index:
-      js_1: Bodisi uporabljate brskalnik, ki ne podpira Javascript-a, ali pa je izvajanje
-        Javascript-a onemogočeno.
+      js_1: Bodisi uporabljate brskalnik, ki ne podpira Javascripta, ali pa je izvajanje
+        Javascripta onemogočeno.
       js_2: OpenStreetMap za prikaz zemljevida uporablja Javascript.
       permalink: Trajna povezava
       shortlink: Kratka povezava
@@ -1810,6 +1810,7 @@ sl:
         vprašanj in odgovarjanje nanja, sodelovanje v pogovorih in dokumentiranje
         kartografskih tem.
       welcome:
+        url: /pozdravljeni
         title: Pozdravljeni v OpenStreetMap (OSM)
         description: Začnite s tem hitrim vodičem, ki zajema osnove OpenStreetMap.
       beginners_guide:
@@ -1837,7 +1838,7 @@ sl:
         title: Wiki OpenStreetMap
         description: Prebrskajte wiki za poglobljeno dokumentacijo OSM.
     sidebar:
-      search_results: Iskalni zadetki
+      search_results: Zadetki iskanja
       close: Zapri
     search:
       search: Iskanje
@@ -1920,11 +1921,10 @@ sl:
           bicycle_parking: Parkirišče za kolesa
           toilets: Stranišče
     welcome:
-      title: Dobrodošli!
-      introduction_html: Dobrodošli na OpenStreetMap, brezplačni zemljevid sveta,
+      title: Pozdravljeni!
+      introduction_html: Pozdravljeni v OpenStreetMap, brezplačnem zemljevidu sveta,
         ki ga je mogoče tudi urejati. Zdaj, ko ste vpisani, ste pripravljeni za začetek
-        kartiranja. Tu dobite hitri vodnik z najbolj pomembnimi stvarmi, ki jih morate
-        vedeti.
+        kartiranja. Tu je hitri vodnik z najpomembnejšim, kar morate vedeti.
       whats_on_the_map:
         title: Kaj je na zemljevidu
         on_html: |-
@@ -2183,8 +2183,8 @@ sl:
   users:
     new:
       title: Ustvarjanje računa
-      no_auto_account_create: Na žalost vam trenutno ne moremo samodejno ustvariti
-        uporabniškega računa.
+      no_auto_account_create: Žal vam trenutno ne moremo samodejno ustvariti uporabniškega
+        računa.
       contact_support_html: Prosimo, pišite <a href="%{support}">podpori</a> (v angleščini)
         in se dogovorite za ustvaritev uporabniškega računa – potrudili se bomo za
         čimprejšnjo obravnavo vašega zahtevka.
index 1128bce8d0c57a484b7731fb1ac6b135dcaf9b15..619209644beb841a83f39fe981ded0753ec0db44 100644 (file)
@@ -308,6 +308,7 @@ zh-TW:
       public editing:
         heading: 公開編輯
         enabled: 已開啟。非匿名且可以編輯資料。
+        enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: 這是什麼?
         disabled: 已停用且不能編輯資料,所有先前的編輯都會成為匿名的。
         disabled link text: 為什麼我不能編輯?
@@ -322,6 +323,7 @@ zh-TW:
         not yet agreed: 您未同意新的貢獻者條款。
         review link text: 請跟隨此連結,方便你檢視並接受新的貢獻者條款。
         agreed_with_pd: 您亦同意將您的編輯放到公共領域
+        link: https://wiki.osmfoundation.org/wiki/Licence/Contributor_Terms
         link text: 這是什麼?
       save changes button: 儲存變更
       make edits public button: 將我所有的編輯設為公開
@@ -1896,7 +1898,7 @@ zh-TW:
       partners_title: 合作夥伴
     copyright:
       foreign:
-        title: 關於這個翻譯
+        title: 關於翻譯
         html: 這個翻譯頁面和 %{english_original_link} 若有衝突,會以英文頁面為準
         english_link: 英文原文
       native:
index 3eee2496180e784a85fa2c0c599c202a7f81c9bc..7f78ab6ccaae0ddd67a604032d4411aa040c2e3e 100644 (file)
@@ -6,7 +6,7 @@
     "jquery-simulate": "^1.0.2",
     "js-cookie": "^3.0.0",
     "leaflet": "^1.8.0",
-    "leaflet.locatecontrol": "^0.76.0",
+    "leaflet.locatecontrol": "^0.78.0",
     "qs": "^6.9.4"
   },
   "devDependencies": {
index 1ab4d253e5461d6a33bcdfb3f7014e71893eb5ed..083619962febddfaffc971af3285adb9daf39e0b 100644 (file)
@@ -299,8 +299,8 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
 
   def test_confirm_email_bad_token
     post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
-    assert_response :success
-    assert_template :confirm_email
+    assert_response :redirect
+    assert_redirected_to edit_account_path
     assert_match(/confirmation code has expired or does not exist/, flash[:error])
   end
 
index 84e64f14efd933d4ac3ac44130af0bfc95dbe23b..de686b9d72beaa17df448cc01a269076d4a7009a 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
@@ -215,9 +215,9 @@ eslint-visitor-keys@^3.3.0:
   integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
 
 eslint@^8.0.0:
-  version "8.26.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.26.0.tgz#2bcc8836e6c424c4ac26a5674a70d44d84f2181d"
-  integrity sha512-kzJkpaw1Bfwheq4VXUezFriD1GxszX6dUekM7Z3aC2o4hju+tsR/XyTC3RcoSD7jmy9VkPU3+N6YjVU2e96Oyg==
+  version "8.27.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.27.0.tgz#d547e2f7239994ad1faa4bb5d84e5d809db7cf64"
+  integrity sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==
   dependencies:
     "@eslint/eslintrc" "^1.3.3"
     "@humanwhocodes/config-array" "^0.11.6"
@@ -499,10 +499,10 @@ json-stable-stringify-without-jsonify@^1.0.1:
   resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
   integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
 
-leaflet.locatecontrol@^0.76.0:
-  version "0.76.1"
-  resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.76.1.tgz#03eb8e98e0c54fee457f930a63624479a6177de0"
-  integrity sha512-qA92Mxs2N1jgVx+EdmxtDrdzFD+f2llPJbqaKvmW1epZMSIvD6KNsBjpQYUIxz4XtJkOleqRSwWQcrm5P5NnYw==
+leaflet.locatecontrol@^0.78.0:
+  version "0.78.0"
+  resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.78.0.tgz#fa87ac57fa79d2797f8f3e673d9eb3f104688310"
+  integrity sha512-3cElL7dBPOMkzHTOWUA/SLogrWrmfqYkbIXAikbRD0QcEef4jJRYYVhkcUUTprS2cOQzg2UiR475v8jemJiXRg==
 
 leaflet@^1.8.0:
   version "1.9.2"