]> git.openstreetmap.org Git - rails.git/commitdiff
Merge pull request #4193 from AntonKhorev/lookup-friend
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 30 Aug 2023 14:17:11 +0000 (15:17 +0100)
committerGitHub <noreply@github.com>
Wed, 30 Aug 2023 14:17:11 +0000 (15:17 +0100)
Lookup friend user before make/remove friend action

108 files changed:
Gemfile.lock
app/assets/javascripts/index/changeset.js
app/controllers/api/changeset_comments_controller.rb
app/controllers/api/users_controller.rb
app/controllers/application_controller.rb
app/controllers/changesets_controller.rb
app/controllers/concerns/user_methods.rb
app/controllers/confirmations_controller.rb
app/controllers/diary_entries_controller.rb
app/controllers/friendships_controller.rb
app/controllers/messages_controller.rb
app/controllers/notes_controller.rb
app/controllers/traces_controller.rb
app/controllers/user_blocks_controller.rb
app/controllers/user_roles_controller.rb
app/controllers/users_controller.rb
app/models/user.rb
app/views/api/users/index.xml.builder
app/views/browse/changeset.html.erb
config/initializers/rate_limits.rb [new file with mode: 0644]
config/initializers/secure_headers.rb
config/locales/af.yml
config/locales/ar.yml
config/locales/ast.yml
config/locales/ba.yml
config/locales/be.yml
config/locales/bg.yml
config/locales/bn.yml
config/locales/br.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/cy.yml
config/locales/da.yml
config/locales/de.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/fur.yml
config/locales/fy.yml
config/locales/ga.yml
config/locales/gd.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hi.yml
config/locales/hr.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/id.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/kab.yml
config/locales/km.yml
config/locales/kn.yml
config/locales/ko.yml
config/locales/ksh.yml
config/locales/ku-Latn.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/mo.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nl.yml
config/locales/nn.yml
config/locales/nqo.yml
config/locales/oc.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/pnb.yml
config/locales/pt-PT.yml
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sc.yml
config/locales/scn.yml
config/locales/sco.yml
config/locales/sk.yml
config/locales/skr-arab.yml
config/locales/sl.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/te.yml
config/locales/th.yml
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/settings.yml
db/migrate/20230825162137_restore_author_index_to_changeset_comments.rb [new file with mode: 0644]
db/structure.sql
lib/osm.rb
lib/rate_limiter.rb [new file with mode: 0644]
test/controllers/api/changeset_comments_controller_test.rb
test/controllers/api/users_controller_test.rb
test/integration/oauth2_test.rb
test/integration/oauth_test.rb
yarn.lock

index 774803788ecb712f5620c167d143482a1fc9d667..e58f26e1a2e09683d4526d521feb79ce8b887744 100644 (file)
@@ -3,73 +3,73 @@ GEM
   specs:
     aasm (5.5.0)
       concurrent-ruby (~> 1.0)
-    actioncable (7.0.7)
-      actionpack (= 7.0.7)
-      activesupport (= 7.0.7)
+    actioncable (7.0.7.2)
+      actionpack (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailbox (7.0.7)
-      actionpack (= 7.0.7)
-      activejob (= 7.0.7)
-      activerecord (= 7.0.7)
-      activestorage (= 7.0.7)
-      activesupport (= 7.0.7)
+    actionmailbox (7.0.7.2)
+      actionpack (= 7.0.7.2)
+      activejob (= 7.0.7.2)
+      activerecord (= 7.0.7.2)
+      activestorage (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       mail (>= 2.7.1)
       net-imap
       net-pop
       net-smtp
-    actionmailer (7.0.7)
-      actionpack (= 7.0.7)
-      actionview (= 7.0.7)
-      activejob (= 7.0.7)
-      activesupport (= 7.0.7)
+    actionmailer (7.0.7.2)
+      actionpack (= 7.0.7.2)
+      actionview (= 7.0.7.2)
+      activejob (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       mail (~> 2.5, >= 2.5.4)
       net-imap
       net-pop
       net-smtp
       rails-dom-testing (~> 2.0)
-    actionpack (7.0.7)
-      actionview (= 7.0.7)
-      activesupport (= 7.0.7)
+    actionpack (7.0.7.2)
+      actionview (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       rack (~> 2.0, >= 2.2.4)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.2.0)
     actionpack-page_caching (1.2.4)
       actionpack (>= 4.0.0)
-    actiontext (7.0.7)
-      actionpack (= 7.0.7)
-      activerecord (= 7.0.7)
-      activestorage (= 7.0.7)
-      activesupport (= 7.0.7)
+    actiontext (7.0.7.2)
+      actionpack (= 7.0.7.2)
+      activerecord (= 7.0.7.2)
+      activestorage (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.0.7)
-      activesupport (= 7.0.7)
+    actionview (7.0.7.2)
+      activesupport (= 7.0.7.2)
       builder (~> 3.1)
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.1, >= 1.2.0)
     active_record_union (1.3.0)
       activerecord (>= 4.0)
-    activejob (7.0.7)
-      activesupport (= 7.0.7)
+    activejob (7.0.7.2)
+      activesupport (= 7.0.7.2)
       globalid (>= 0.3.6)
-    activemodel (7.0.7)
-      activesupport (= 7.0.7)
-    activerecord (7.0.7)
-      activemodel (= 7.0.7)
-      activesupport (= 7.0.7)
-    activerecord-import (1.4.1)
+    activemodel (7.0.7.2)
+      activesupport (= 7.0.7.2)
+    activerecord (7.0.7.2)
+      activemodel (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
+    activerecord-import (1.5.0)
       activerecord (>= 4.2)
-    activestorage (7.0.7)
-      actionpack (= 7.0.7)
-      activejob (= 7.0.7)
-      activerecord (= 7.0.7)
-      activesupport (= 7.0.7)
+    activestorage (7.0.7.2)
+      actionpack (= 7.0.7.2)
+      activejob (= 7.0.7.2)
+      activerecord (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       marcel (~> 1.0)
       mini_mime (>= 1.1.0)
-    activesupport (7.0.7)
+    activesupport (7.0.7.2)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
@@ -86,8 +86,8 @@ GEM
     autoprefixer-rails (10.4.13.0)
       execjs (~> 2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.804.0)
-    aws-sdk-core (3.180.3)
+    aws-partitions (1.813.0)
+    aws-sdk-core (3.181.0)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.5)
@@ -95,8 +95,8 @@ GEM
     aws-sdk-kms (1.71.0)
       aws-sdk-core (~> 3, >= 3.177.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.132.1)
-      aws-sdk-core (~> 3, >= 3.179.0)
+    aws-sdk-s3 (1.134.0)
+      aws-sdk-core (~> 3, >= 3.181.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.6)
     aws-sigv4 (1.6.0)
@@ -178,7 +178,7 @@ GEM
       concurrent-ruby (~> 1.0)
       dry-core (~> 1.0, < 2)
       zeitwerk (~> 2.6)
-    dry-schema (1.13.2)
+    dry-schema (1.13.3)
       concurrent-ruby (~> 1.0)
       dry-configurable (~> 1.0, >= 1.0.1)
       dry-core (~> 1.0, < 2)
@@ -198,7 +198,7 @@ GEM
       dry-initializer (~> 3.0)
       dry-schema (>= 1.12, < 2)
       zeitwerk (~> 2.6)
-    erb_lint (0.4.0)
+    erb_lint (0.5.0)
       activesupport
       better_html (>= 2.0.1)
       parser (>= 2.7.1.4)
@@ -388,20 +388,20 @@ GEM
     rack-test (2.1.0)
       rack (>= 1.3)
     rack-uri_sanitizer (0.0.2)
-    rails (7.0.7)
-      actioncable (= 7.0.7)
-      actionmailbox (= 7.0.7)
-      actionmailer (= 7.0.7)
-      actionpack (= 7.0.7)
-      actiontext (= 7.0.7)
-      actionview (= 7.0.7)
-      activejob (= 7.0.7)
-      activemodel (= 7.0.7)
-      activerecord (= 7.0.7)
-      activestorage (= 7.0.7)
-      activesupport (= 7.0.7)
+    rails (7.0.7.2)
+      actioncable (= 7.0.7.2)
+      actionmailbox (= 7.0.7.2)
+      actionmailer (= 7.0.7.2)
+      actionpack (= 7.0.7.2)
+      actiontext (= 7.0.7.2)
+      actionview (= 7.0.7.2)
+      activejob (= 7.0.7.2)
+      activemodel (= 7.0.7.2)
+      activerecord (= 7.0.7.2)
+      activestorage (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       bundler (>= 1.15.0)
-      railties (= 7.0.7)
+      railties (= 7.0.7.2)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -416,9 +416,9 @@ GEM
     rails-i18n (7.0.8)
       i18n (>= 0.7, < 2)
       railties (>= 6.0.0, < 8)
-    railties (7.0.7)
-      actionpack (= 7.0.7)
-      activesupport (= 7.0.7)
+    railties (7.0.7.2)
+      actionpack (= 7.0.7.2)
+      activesupport (= 7.0.7.2)
       method_source
       rake (>= 12.2)
       thor (~> 1.0)
@@ -435,7 +435,7 @@ GEM
     rinku (2.0.6)
     rotp (6.2.2)
     rouge (4.1.3)
-    rubocop (1.56.0)
+    rubocop (1.56.2)
       base64 (~> 0.1.1)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
@@ -523,7 +523,7 @@ GEM
       i18n
     vendorer (0.2.0)
     version_gem (1.1.3)
-    webmock (3.18.1)
+    webmock (3.19.0)
       addressable (>= 2.8.0)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
index 9e38917afeda29892b0ebcfa4df68c172234ceeb..a6213b9c434367a9141062be608e1a2b53d49bf0 100644 (file)
@@ -29,6 +29,7 @@ OSM.Changeset = function (map) {
   function updateChangeset(form, method, url, include_data) {
     var data;
 
+    $(form).find("#comment-error").prop("hidden", true);
     $(form).find("input[type=submit]").prop("disabled", true);
 
     if (include_data) {
@@ -44,6 +45,11 @@ OSM.Changeset = function (map) {
       data: data,
       success: function () {
         OSM.loadSidebarContent(window.location.pathname, page.load);
+      },
+      error: function (xhr, xhr_status, http_status) {
+        $(form).find("#comment-error").text(http_status);
+        $(form).find("#comment-error").prop("hidden", false);
+        $(form).find("input[type=submit]").prop("disabled", false);
       }
     });
   }
index 8b971834d76432d2728a2d7c0bd059691a9328e4..a9e80630e22226447bc9797f363ac2b854801987 100644 (file)
@@ -17,6 +17,7 @@ module Api
       # Check the arguments are sane
       raise OSM::APIBadUserInput, "No id was given" unless params[:id]
       raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
+      raise OSM::APIRateLimitExceeded if current_user.changeset_comments.where("created_at >= ?", Time.now.utc - 1.hour).count >= current_user.max_changeset_comments_per_hour
 
       # Extract the arguments
       id = params[:id].to_i
index 9da9d32266fd9860f0577626ffdd4c73d1ecf66f..ab48a518979427aba4e676b08238c025c838fda7 100644 (file)
@@ -19,7 +19,7 @@ module Api
 
       raise OSM::APIBadUserInput, "No users were given to search for" if ids.empty?
 
-      @users = User.visible.find(ids)
+      @users = User.visible.where(:id => ids).in_order_of(:id, ids)
 
       # Render the result
       respond_to do |format|
index 5dcfee07ca03cc9aaeb84549513305af4c658133..a30816a8ede740eaf3adf8f8be7165db0d23a193 100644 (file)
@@ -215,24 +215,6 @@ class ApplicationController < ActionController::Base
     render :action => "timeout"
   end
 
-  ##
-  # ensure that there is a "user" instance variable
-  def lookup_user
-    render_unknown_user params[:display_name] unless @user = User.active.find_by(:display_name => params[:display_name])
-  end
-
-  ##
-  # render a "no such user" page
-  def render_unknown_user(name)
-    @title = t "users.no_such_user.title"
-    @not_found_user = name
-
-    respond_to do |format|
-      format.html { render :template => "users/no_such_user", :status => :not_found }
-      format.all { head :not_found }
-    end
-  end
-
   ##
   # Unfortunately if a PUT or POST request that has a body fails to
   # read it then Apache will sometimes fail to return the response it
index 7796dfeb27fe04d9e2875f451a73a13e25711c78..22d3356b79fee7425865fcff5de6098b2cc0b153 100644 (file)
@@ -1,6 +1,8 @@
 # The ChangesetController is the RESTful interface to Changeset objects
 
 class ChangesetsController < ApplicationController
+  include UserMethods
+
   layout "site"
   require "xml/libxml"
 
index 81e9f0064c4e7b331b8fc8cc4fdddcb5dbf9073d..eb7d389881eba94f5f8fad65dd197f94eaa9c92d 100644 (file)
@@ -3,6 +3,26 @@ module UserMethods
 
   private
 
+  ##
+  # ensure that there is a "user" instance variable
+  def lookup_user
+    @user = User.active.find_by!(:display_name => params[:display_name])
+  rescue ActiveRecord::RecordNotFound
+    render_unknown_user params[:display_name]
+  end
+
+  ##
+  # render a "no such user" page
+  def render_unknown_user(name)
+    @title = t "users.no_such_user.title"
+    @not_found_user = name
+
+    respond_to do |format|
+      format.html { render :template => "users/no_such_user", :status => :not_found, :layout => "site" }
+      format.all { head :not_found }
+    end
+  end
+
   ##
   # update a user's details
   def update_user(user, params)
index a482bc96de0da11b52335a7790879fc0155f9ad9..65f5605710a5726e9de02355368c5a976ea19e37 100644 (file)
@@ -1,5 +1,6 @@
 class ConfirmationsController < ApplicationController
   include SessionMethods
+  include UserMethods
 
   layout "site"
 
index 6981ed797f92112956e2097bf7a11a1e54d9465b..ea6d1d27601db89980fa6366308b90a5ad996f45 100644 (file)
@@ -1,4 +1,6 @@
 class DiaryEntriesController < ApplicationController
+  include UserMethods
+
   layout "site", :except => :rss
 
   before_action :authorize_web
index 3ca24d34b4a2fa2c739c51bc7ab51079a3ea8a80..7b14f2e820799d3c9f47a2092cbdcbe646d552cc 100644 (file)
@@ -1,4 +1,6 @@
 class FriendshipsController < ApplicationController
+  include UserMethods
+
   layout "site"
 
   before_action :authorize_web
index 22d0c88ba5e868e374f6c5f553c21245975e5d7e..e0b5b05d31900dca9032e070df3ea127fa45cd18 100644 (file)
@@ -1,4 +1,6 @@
 class MessagesController < ApplicationController
+  include UserMethods
+
   layout "site"
 
   before_action :authorize_web
index 440a620e8116806be582b4b996a88088cb53a1a7..97efc3eda8128f79bbd0a870b347cebc0c384501 100644 (file)
@@ -1,4 +1,6 @@
 class NotesController < ApplicationController
+  include UserMethods
+
   layout :map_layout
 
   before_action :check_api_readable
@@ -7,30 +9,22 @@ class NotesController < ApplicationController
 
   authorize_resource
 
+  before_action :lookup_user, :only => [:index]
   before_action :set_locale
   around_action :web_timeout
 
   ##
   # Display a list of notes by a specified user
   def index
-    if params[:display_name]
-      if @user = User.active.find_by(:display_name => params[:display_name])
-        @params = params.permit(:display_name)
-        @title = t ".title", :user => @user.display_name
-        @page = (params[:page] || 1).to_i
-        @page_size = 10
-        @notes = @user.notes
-        @notes = @notes.visible unless current_user&.moderator?
-        @notes = @notes.order("updated_at DESC, id").distinct.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author)
-
-        render :layout => "site"
-      else
-        @title = t "users.no_such_user.title"
-        @not_found_user = params[:display_name]
-
-        render :template => "users/no_such_user", :status => :not_found, :layout => "site"
-      end
-    end
+    @params = params.permit(:display_name)
+    @title = t ".title", :user => @user.display_name
+    @page = (params[:page] || 1).to_i
+    @page_size = 10
+    @notes = @user.notes
+    @notes = @notes.visible unless current_user&.moderator?
+    @notes = @notes.order("updated_at DESC, id").distinct.offset((@page - 1) * @page_size).limit(@page_size).preload(:comments => :author)
+
+    render :layout => "site"
   end
 
   def show
index 0b7dbc94a60228f0e63656333a689b5abef24ec4..90ab34a48c406d27ecc31b3418c6ad48d94bb4c1 100644 (file)
@@ -1,4 +1,6 @@
 class TracesController < ApplicationController
+  include UserMethods
+
   layout "site", :except => :georss
 
   before_action :authorize_web
index 63ebdad713b85f5b54785c5d8169a611f89d57dc..546c8233c65a4d5f4eeb42d97cc76dc0558c1d28 100644 (file)
@@ -1,4 +1,6 @@
 class UserBlocksController < ApplicationController
+  include UserMethods
+
   layout "site"
 
   before_action :authorize_web
index cf5b4de9e35e2c8771673e4bd09ac7d011aeeb73..b54cd0bd7a3eee82ccfecb01ce14882ba1d7c3cc 100644 (file)
@@ -1,4 +1,6 @@
 class UserRolesController < ApplicationController
+  include UserMethods
+
   layout "site"
 
   before_action :authorize_web
index 0f9e1676764d11d5efb165254b798bc228bb0b2a..9d4b3d258cce6c098d288a39c7ae13d2743eaab0 100644 (file)
@@ -186,6 +186,9 @@ class UsersController < ApplicationController
         end
 
         if current_user.save
+          SIGNUP_IP_LIMITER&.update(request.remote_ip)
+          SIGNUP_EMAIL_LIMITER&.update(canonical_email(current_user.email))
+
           flash[:matomo_goal] = Settings.matomo["goals"]["signup"] if defined?(Settings.matomo)
 
           referer = welcome_path
@@ -344,7 +347,13 @@ class UsersController < ApplicationController
                    domain_mx_servers(domain)
                  end
 
-    if blocked = Acl.no_account_creation(request.remote_ip, :domain => domain, :mx => mx_servers)
+    blocked = Acl.no_account_creation(request.remote_ip, :domain => domain, :mx => mx_servers)
+
+    blocked ||= SIGNUP_IP_LIMITER && !SIGNUP_IP_LIMITER.allow?(request.remote_ip)
+
+    blocked ||= email && SIGNUP_EMAIL_LIMITER && !SIGNUP_EMAIL_LIMITER.allow?(canonical_email(email))
+
+    if blocked
       logger.info "Blocked signup from #{request.remote_ip} for #{email}"
 
       render :action => "blocked"
@@ -353,6 +362,20 @@ class UsersController < ApplicationController
     !blocked
   end
 
+  def canonical_email(email)
+    local_part, domain = if email.nil?
+                           nil
+                         else
+                           email.split("@")
+                         end
+
+    local_part.sub!(/\+.*$/, "")
+
+    local_part.delete!(".") if %w[gmail.com googlemail.com].include?(domain)
+
+    "#{local_part}@#{domain}"
+  end
+
   ##
   # get list of MX servers for a domains
   def domain_mx_servers(domain)
index 5c21736b0f6a9cbe031056cf4ef3ebaeae297cc1..fe2a98d61e31f6af42e6a085bdcf19e93a21d546 100644 (file)
@@ -395,6 +395,19 @@ class User < ApplicationRecord
     max_friends.clamp(0, Settings.max_friends_per_hour)
   end
 
+  def max_changeset_comments_per_hour
+    if moderator?
+      36000
+    else
+      previous_comments = changeset_comments.limit(200).count
+      active_reports = issues.with_status(:open).sum(:reports_count)
+      max_comments = previous_comments / 200.0 * Settings.max_changeset_comments_per_hour
+      max_comments = max_comments.floor.clamp(Settings.min_changeset_comments_per_hour, Settings.max_changeset_comments_per_hour)
+      max_comments /= 2**active_reports
+      max_comments.floor.clamp(1, Settings.max_changeset_comments_per_hour)
+    end
+  end
+
   private
 
   def encrypt_password
index 60fcfa898efbe8aa2068d9b0dbef2f9d52cae4c5..1b284ef5e049eff412284799700433e1fb671ebf 100644 (file)
@@ -1,4 +1,4 @@
 xml.instruct! :xml, :version => "1.0"
 xml.osm(OSM::API.new.xml_root_attributes) do |osm|
-  osm << render(@users)
+  osm << (render(@users) || "")
 end
index 3c5ba7de0dd33868d28e5e3ba616f4d595dd5a68..b5c360a03db4c15fa80cc1db03fd176a40d856c7 100644 (file)
@@ -78,6 +78,8 @@
         <div class="mb-3">
           <textarea class="form-control" name="text" cols="40" rows="5"></textarea>
         </div>
+        <div id="comment-error" class="alert-danger p-2 mb-3" hidden>
+        </div>
         <div>
           <input type="submit" name="comment" value="<%= t("javascripts.changesets.show.comment") %>" data-changeset-id="<%= @changeset.id %>" data-method="POST" data-url="<%= changeset_comment_url(@changeset) %>" disabled="1" class="btn btn-sm btn-primary" />
         </div>
diff --git a/config/initializers/rate_limits.rb b/config/initializers/rate_limits.rb
new file mode 100644 (file)
index 0000000..5caa300
--- /dev/null
@@ -0,0 +1,15 @@
+require "rate_limiter"
+
+SIGNUP_IP_LIMITER = if Settings.memcache_servers && Settings.signup_ip_per_day && Settings.signup_ip_max_burst
+                      RateLimiter.new(
+                        Dalli::Client.new(Settings.memcache_servers, :namespace => "rails:signup:ip"),
+                        86400, Settings.signup_ip_per_day, Settings.signup_ip_max_burst
+                      )
+                    end
+
+SIGNUP_EMAIL_LIMITER = if Settings.memcache_servers && Settings.signup_email_per_day && Settings.signup_email_max_burst
+                         RateLimiter.new(
+                           Dalli::Client.new(Settings.memcache_servers, :namespace => "rails:signup:email"),
+                           86400, Settings.signup_email_per_day, Settings.signup_email_max_burst
+                         )
+                       end
index 53ab768088a5b18db05ba9bde6dd690f289d3e57..e710019da30b70fcc7e8b98e870b63573ccfb3cd 100644 (file)
@@ -28,7 +28,7 @@ csp_policy[:img_src] << Settings.trace_image_storage_url if Settings.key?(:trace
 csp_policy[:report_uri] << Settings.csp_report_url if Settings.key?(:csp_report_url)
 
 cookie_policy = {
-  :httponly => { :only => ["_osm_session"] }
+  :httponly => { :only => %w[_osm_session _osm_totp_token] }
 }
 
 SecureHeaders::Configuration.default do |config|
index 1db4fa18da2bf218191616412ab5eeefa983c8b4..4a18cd9f2406931812559ea55eafd98d9319a5ee 100644 (file)
@@ -1579,7 +1579,7 @@ af:
         facebook:
           title: Meld aan met Facebook
           alt: Meld aan met ’n Facebook-rekening
-        windowslive:
+        microsoft:
           title: Meld aan met Windows Live
           alt: Meld aan met ’n Windows Live-rekening
         github:
index 508a21f7d6bf36a93702f6cb12fd669f8d3cc265..7ba39bd48af77be5c59b5de9b57387396208731f 100644 (file)
@@ -308,7 +308,7 @@ ar:
       openid: هوية مفتوحة
       google: جوجل
       facebook: فيسبوك
-      windowslive: مايكروسوفت
+      microsoft: مايكروسوفت
       github: جيت هب
       wikipedia: ويكيبيديا
   api:
@@ -1887,7 +1887,7 @@ ar:
         facebook:
           title: تسجيل الدخول باستخدام فيس بوك
           alt: تسجيل الدخول بحساب فيسبوك
-        windowslive:
+        microsoft:
           title: تسجيل الدخول مع مايكروسوفت
           alt: تسجيل الدخول بحساب مايكروسوفت
         github:
index bb821a0407deceb3b847834a8633ae8e61e3a397..bafcf785c3fb5103d77f94bc780512796a8bd944 100644 (file)
@@ -1491,7 +1491,7 @@ ast:
         facebook:
           title: Anicia sesión con Facebook
           alt: Anicia sesión con una cuenta de Facebook
-        windowslive:
+        microsoft:
           title: Anicia sesión con Windows Live
           alt: Anicia sesión con una cuenta de Windows Live
         github:
index a943ecac5a7f3fdd9bae21587dda7fe06a84d1be..81475529a0cc72a7bc0922935921e3999e519f6b 100644 (file)
@@ -224,7 +224,7 @@ ba:
       openid: OpenID
       google: Google
       facebook: Facebook
-      windowslive: Майкрософт
+      microsoft: Майкрософт
       github: GitHub
       wikipedia: Википедия
   api:
index 5112e3988107a30a6e10b90b92dcf62307279dda..fdf9d6f5a9ae4b73ce97c5b958cba6251abc8f4b 100644 (file)
@@ -1498,7 +1498,7 @@ be:
         facebook:
           title: Увайсці праз Facebook
           alt: Увайсці праз уліковы запіс Facebook
-        windowslive:
+        microsoft:
           title: Увайсці праз Windows live
           alt: Увайсці праз уліковы запіс Windows Live
         github:
index e40ff79ff00eb74ce59b07c3ee3255d1b9a76129..384fb420225dba57839238efbf9e700747477f36 100644 (file)
@@ -212,7 +212,7 @@ bg:
       openid: OpenID
       google: Google
       facebook: Facebook
-      windowslive: Майкрософт
+      microsoft: Майкрософт
       github: GitHub
       wikipedia: Уикипедия
   api:
@@ -1440,7 +1440,7 @@ bg:
         facebook:
           title: Влизане с Facebook
           alt: Влизане със сметка на Facebook
-        windowslive:
+        microsoft:
           title: Влизане с Майкрософт
           alt: Влизане със сметка на Майкрософт
         github:
index ecc870fef505f80997a8759d8c7b657471727d93..fdf69b13e82edf27faeb1b1982531ff8257155e9 100644 (file)
@@ -238,7 +238,7 @@ bn:
       openid: ওপেনআইডি
       google: গুগল
       facebook: ফেসবুক
-      windowslive: মাইক্রোসফট
+      microsoft: মাইক্রোসফট
       github: গিটহাব
       wikipedia: উইকিপিডিয়া
   api:
@@ -1554,7 +1554,7 @@ bn:
         facebook:
           title: ফেসবুক দিয়ে প্রবেশ
           alt: ফেসবুক অ্যাকাউন্ট দিয়ে প্রবেশ করুন
-        windowslive:
+        microsoft:
           title: মাইক্রোসফট দিয়ে লগইন করুন
           alt: একটি মাইক্রোসফট অ্যাকাউন্ট দিয়ে লগইন করুন
         github:
index 7ef4346e3ca00823ed820f824ba7ce8a40fdec95..02e0240fac393465346f348bddaa4fd213aa52c3 100644 (file)
@@ -1871,7 +1871,7 @@ br:
         facebook:
           title: Kevreañ ouzh Facebook
           alt: Kevreañ ouzh ur gont facebook
-        windowslive:
+        microsoft:
           title: Kevreañ ouzh Microsoft
           alt: Kevreañ ouzh ur gont Microsoft
         github:
index fa2a7676d53fa666f3b58915f9a78b7ad42fa7bf..4f61e799e40760d5e361846dca30dfbb5de9a572 100644 (file)
@@ -257,6 +257,7 @@ ca:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Viquipèdia
   api:
@@ -1903,7 +1904,7 @@ ca:
         facebook:
           title: Inicieu la sessió amb Facebook
           alt: Inicieu la sessió amb un compte de Facebook
-        windowslive:
+        microsoft:
           title: Inicieu la sessió amb Windows
           alt: Inicieu de sessió amb un compte de Windows
         github:
@@ -2924,7 +2925,9 @@ ca:
     index:
       title: Notes enviades o comentades per %{user}
       heading: notes de %{user}
-      subheading_html: Notes enviades o comentades per %{user}
+      subheading_html: Notes %{submitted} o %{commented} per %{user}
+      subheading_submitted: enviades
+      subheading_commented: comentades
       no_notes: Sense notes
       id: Id
       creator: Creador
index f1abd90c371cba7ce3ec7d6981d9b341d242687e..010f23ec95bcc11bf7025163ed77732fef225b7f 100644 (file)
@@ -1943,7 +1943,7 @@ cs:
         facebook:
           title: Přihlásit se přes Facebook
           alt: Přihlášení pomocí účtu na Facebooku
-        windowslive:
+        microsoft:
           title: Přihlásit se přes Microsoft
           alt: Přihlášení pomocí účtu Microsoft
         github:
index 19dc32de18450c4cb136d592e83f921161c44504..58351acf1ba31ede504d86f7582a5811de4966c6 100644 (file)
@@ -1476,7 +1476,7 @@ cy:
         facebook:
           title: Mewngofnodi â Facebook
           alt: Mewngofnodi â Chyfrif Facebook
-        windowslive:
+        microsoft:
           title: Mewngofnodi gyda Microsoft
           alt: Mewngofnodi gyda Chyfrif Microsoft
         github:
index 502577aff03d5e24968495bd71fe894ac0b412fd..426d6a7e6fd127b2a59d4c18f77a4856afe9080f 100644 (file)
@@ -1884,7 +1884,7 @@ da:
         facebook:
           title: Log på med Facebook
           alt: Log på med en Facebook-konto
-        windowslive:
+        microsoft:
           title: Log på med Windows Live
           alt: Log på med en Windows Live-konto
         github:
index 0990c3d6d67e24959ee0dee5f721fa0f1107655e..b4b1b24aa99a663ac359b4cc255a240a281d4f98 100644 (file)
@@ -1974,7 +1974,7 @@ de:
         facebook:
           title: Mit Facebook anmelden
           alt: Mit einem Facebook-Konto anmelden
-        windowslive:
+        microsoft:
           title: Mit Microsoft anmelden
           alt: Mit einem Microsoft-Konto anmelden
         github:
index 4d9b62c5941ee5e98a771bb896ab210f44469d93..fea612abb2e792e45d9f69fd2423e87d53f4d9ec 100644 (file)
@@ -172,7 +172,7 @@ el:
       user:
         auth_provider: Πάροχος αυθεντικοποίησης
         auth_uid: UID αυθεντικοποίησης
-        email: Î\97λεκÏ\84Ï\81ονικÏ\8c Ï\84αÏ\87Ï\85δÏ\81ομείο
+        email: Î\94ιεÏ\8dθÏ\85νÏ\83η Î·Î»ÎµÎºÏ\84Ï\81ονικοÏ\8d Ï\84αÏ\87Ï\85δÏ\81ομείοÏ\85
         email_confirmation: Επιβεβαίωση διεύθυνσης email
         new_email: Νέα διεύθυνση email
         active: Ενεργό
@@ -254,6 +254,7 @@ el:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Βικιπαίδεια
   api:
@@ -580,6 +581,7 @@ el:
         zero: Χωρίς σχόλια
         one: '%{count} σχόλιο'
         other: '%{count} σχόλια'
+      no_comments: Κανένα σχόλιο
       edit_link: Επεξεργασία καταχώρησης
       hide_link: Απόκρυψη καταχώρησης
       unhide_link: Επανεμφάνιση καταχώρησης
@@ -941,7 +943,7 @@ el:
           street_lamp: Λάμπα δρόμου
           tertiary: Τριτεύων δρόμος
           tertiary_link: Τριτεύων δρόμος
-          track: Î§Ï\89μαÏ\84Ï\8cδÏ\81ομος
+          track: Î\91γÏ\81οÏ\84ικÏ\8cÏ\82 / Î\94αÏ\83ικÏ\8cÏ\82 Î´Ï\81Ï\8cμος
           traffic_mirror: Καθρέφτης κυκλοφορίας
           traffic_signals: Σήματα κυκλοφορίας
           trailhead: Άκρη μονοπατιού
@@ -1466,6 +1468,7 @@ el:
         zero: Καμία αναφορά
         one: 1 αναφορά
         other: '%{count} αναφορές'
+      no_reports: Καμία αναφορά
       report_created_at: Αναφέρθηκε για πρώτη φορά στις %{datetime}
       last_resolved_at: Επιλύθηκε για τελευταία φορά στις %{datetime}
       last_updated_at: Ενημερώθηκε για τελευταία φορά στις %{datetime} από τον %{displayname}
@@ -1877,6 +1880,9 @@ el:
       no home location: Δεν έχετε εισάγει την τοποθεσία του σπιτιού σας.
       update home location on click: Ενημέρωση τοποθεσίας σπιτιού όταν κάνω κλικ στον
         χάρτη;
+      show: Εμφάνιση
+      delete: Διαγραφή
+      undelete: Αναίρεση διαγραφής
     update:
       success: Το προφίλ ενημερώθηκε.
       failure: Δεν μπόρεσε να ενημερωθεί το προφίλ.
@@ -1905,7 +1911,7 @@ el:
         facebook:
           title: Σύνδεση με το Facebook
           alt: Σύνδεση με έναν Λογαριασμό Facebook
-        windowslive:
+        microsoft:
           title: Σύνδεση μέσω της Microsoft
           alt: Σύνδεση με ένα Λογαριασμό Microsoft
         github:
@@ -1968,12 +1974,14 @@ el:
       community_driven_osm_foundation: Ίδρυμα OSM
       open_data_title: Ανοικτά Δεδομένα
       open_data_open_data: ανοιχτά δεδομένα
+      open_data_copyright_license: Σελίδα Πνευματικών Δικαιωμάτων και Άδειας Χρήσης
       legal_title: Νομικό
       legal_1_1_openstreetmap_foundation: Ίδρυμα OpenStreetMap
       legal_1_1_terms_of_use: Όροι Χρήσης
       legal_1_1_aup: Αποδεκτές Πολιτικές Χρήσης
       legal_1_1_privacy_policy: Πολιτική Απορρήτου
       legal_2_1_contact_the_osmf: επικοινωνήστε με το OSMF
+      legal_2_2_registered_trademarks: εγγεγραμμένα εμπορικά σήματα του OSMF
       partners_title: Συνεργάτες
     copyright:
       foreign:
@@ -1993,13 +2001,18 @@ el:
         introduction_1_open_data: ανοιχτά δεδομένα
         introduction_1_osm_foundation: Ίδρυμα OpenStreetMap
         introduction_2_legal_code: νομικός κώδικας
+        introduction_3_creative_commons: Creative Commons Αναφορά Δημιουργού-Παρόμοια
+          Διανομή 2.0
         credit_title_html: Πως να κάνετε αναφορά στο OpenStreetMap
         credit_1_html: 'Όπου χρησιμοποιήσετε δεδομένα του OpenStreetMap, χρειάζεται
           από σας να κάνετε τα παρακάτω πράγματα:'
+        credit_3_attribution_guidelines: Οδηγίες Αναφοράς
+        credit_4_1_this_copyright_page: αυτή τη σελίδα πνευματικών δικαιωμάτων
         attribution_example:
           alt: Παράδειγμα του πως αναφέρεται το OpenStreetMap σε μια ιστοσελίδα
           title: Παράδειγμα αναφοράς δημιουργού
         more_title_html: Μαθαίνοντας περισσότερα
+        more_1_1_osmf_licence_page: Σελίδα Άδειας Χρήσης OSMF
         more_2_1_api_usage_policy: Πολιτική Χρήσης API
         more_2_1_tile_usage_policy: Πολιτική Χρήσης Πλακιδίων
         more_2_1_nominatim_usage_policy: Πολιτική Χρήσης Nominatim
@@ -2008,8 +2021,12 @@ el:
           έχουμε περιλάβει δεδομένα ανοικτής άδειας από εθνικές υπηρεσίες χαρτογράφησης
           και άλλες πηγές, μεταξύ αυτών:'
         contributors_at_austria: Αυστρία
+        contributors_at_stadt_wien: Stadt Wien
         contributors_at_cc_by: CC BY
+        contributors_at_land_vorarlberg: Land Vorarlberg
+        contributors_at_cc_by_at_with_amendments: CC BY AT με τροποποιήσεις
         contributors_au_australia: Αυστραλία
+        contributors_au_geoscape_australia: Geoscape Australia
         contributors_ca_canada: Καναδάς
         contributors_fi_finland: Φινλανδία
         contributors_fi_nlsfi_license: Άδεια NLSFI
@@ -2024,7 +2041,11 @@ el:
         contributors_rs_serbia: Σερβία
         contributors_rs_rgz: Σερβική Γεωδαιτική Αρχή
         contributors_rs_open_data_portal: Εθνική Πύλη Ανοικτών Δεδομένων
+        contributors_si_credit_html: |-
+          %{slovenia}: Περιέχει δεδομένα από την %{gu_link} και το %{mkgp_link}
+          (δημόσιες πληροφορίες της Σλοβενίας).
         contributors_si_slovenia: Σλοβενία
+        contributors_si_gu: Αρχή Χωρομέτρησης και Χαρτογράφησης
         contributors_si_mkgp: Υπουργείο Γεωργίας, Δασών και Τροφίμων
         contributors_es_spain: Ισπανία
         contributors_es_ign: IGN
@@ -2039,6 +2060,8 @@ el:
         infringement_1_html: Υπενθυμίζουμε στους συνεισφέροντες του OSM να μην προσθέτουν
           δεδομένα από πηγές με πνευματικά δικαιώματα (π.χ. Google Maps η έντυπους
           χάρτες) χωρίς την προηγούμενη άδεια από τους ιδιοκτήτες των δικαιωμάτων.
+        trademarks_title: Εμπορικά σήματα
+        trademarks_1_1_trademark_policy: Πολιτική Εμπορικών Σημάτων
     index:
       js_1: Είτε χρησιμοποιείτε πρόγραμμα περιήγησης που δεν υποστηρίζει JavaScript
         ή έχετε απενεργοποιήσει την JavaScript.
@@ -2122,6 +2145,8 @@ el:
             στην αποθήκευση και άλλοι χαρτογράφοι θα το ερευνήσουν.
       other_concerns:
         title: Άλλες ανησυχίες
+        copyright: σελίδα πνευματικών δικαιωμάτων
+        working_group: Ομάδα εργασίας OSMF
     help:
       title: Βοήθεια
       introduction: Το OpenStreetMap έχει πολλαπλούς πόρους για να μάθετε για το εγχείρημα,
@@ -2202,7 +2227,7 @@ el:
           primary: Κύρια Οδός
           secondary: Δευτερεύουσα Οδός
           unclassified: Αταξινόμητη Οδός
-          track: Î§Ï\89μαÏ\84Ï\8cδÏ\81ομος
+          track: Î\91γÏ\81οÏ\84ικÏ\8cÏ\82 / Î\94αÏ\83ικÏ\8cÏ\82 Î´Ï\81Ï\8cμος
           bridleway: Μονοπάτι για Άλογα
           cycleway: Ποδηλατόδρομος
           cycleway_national: Εθνικός ποδηλατόδρομος
@@ -2842,12 +2867,12 @@ el:
       heading_html: Κατάλογος φραγών στον %{name}
       empty: Ο %{name} δεν έχει φραχτεί ακόμα.
     blocks_by:
-      title: Φραγές από τον %{name}
-      heading_html: Κατάλογος φραγών από τον %{name}
-      empty: Ο %{name} δεν έχει κάνει φραγή ακόμα.
+      title: Φραγές από %{name}
+      heading_html: Κατάλογος φραγών από %{name}
+      empty: Ο %{name} δεν έχει κάνει φραγή ακόμα.
     show:
-      title: Ο %{block_on} έχει φραχτεί από τον %{block_by}
-      heading_html: Ο %{block_on} έχει φραχτεί από τον %{block_by}
+      title: Ο/Η %{block_on} έχει φραχτεί από τον/την %{block_by}
+      heading_html: Ο/Η %{block_on} έχει φραχτεί από τον/την %{block_by}
       created: 'Δημιουργήθηκε:'
       duration: 'Διάρκεια:'
       status: 'Κατάσταση:'
index b192b0528a1d67333d5bcec79e545b1b3e992df2..3fbb69c26d3ddad7a9b6f5a95d2efe1c60210345 100644 (file)
@@ -1383,7 +1383,7 @@ en-GB:
         facebook:
           title: Login with Facebook
           alt: Login with a Facebook Account
-        windowslive:
+        microsoft:
           title: Login with Windows Live
           alt: Login with a Windows Live Account
         github:
index 88bf0a112a7acdf7ca3a807608be9729dfd99bfd..4d112cdf4ae8e892ac3ffd46b7b9bf44b95f8e4e 100644 (file)
@@ -235,6 +235,7 @@ eo:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Vikipedio
   api:
@@ -1830,6 +1831,9 @@ eo:
       no home location: Vi ne enigis vian hejmlokon.
       update home location on click: Ĉu freŝigi la hejmlokon kiam mi alklakas sur
         la mapo?
+      show: Montri
+      delete: Forigi
+      undelete: Malforigi
     update:
       success: Aktualigis profilon.
       failure: Ne povis aktualigi la profilon.
@@ -1858,7 +1862,7 @@ eo:
         facebook:
           title: Ensaluti per Fejsbuko
           alt: Ensaluti per konto je Fejsbuko
-        windowslive:
+        microsoft:
           title: Ensaluti per Microsoft
           alt: Ensaluti per konto Microsoft
         github:
@@ -2915,7 +2919,9 @@ eo:
     index:
       title: Rimarkoj kreitaj aŭ komentitaj de %{user}
       heading: Rimarkoj de %{user}
-      subheading_html: Rimarkoj kreitaj aŭ komentitaj de %{user}
+      subheading_html: Rimarkoj %{submitted} aŭ %{commented} de %{user}
+      subheading_submitted: kreitaj
+      subheading_commented: komentitaj
       no_notes: Neniu rimarko
       id: Identigilo
       creator: Aŭtoro
index 966991f1186c8384cb5daf91bb80ba96ab357806..1e08e1fbfe8017147b270bfd64ad7bcd2ea930c3 100644 (file)
@@ -68,6 +68,7 @@
 # Author: Nancystodd
 # Author: Nelthal
 # Author: Nemo bis
+# Author: No se
 # Author: Nunte
 # Author: Ovruni
 # Author: Pantareje
@@ -304,7 +305,7 @@ es:
       openid: OpenID
       google: Google
       facebook: Facebook
-      windowslive: Microsoft
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -626,7 +627,7 @@ es:
       login: Iniciar sesión
     no_such_entry:
       title: No existe esta entrada de diario
-      heading: No hay ninguna entrada con el identificador %{id}
+      heading: No hay ninguna entrada con el identificador "%{id}"
       body: No hay alguna entrada de diario o comentario con el identificador %{id}.
         Revisa la ortografía, o tal vez el enlace en el que hiciste clic es incorrecto.
     diary_entry:
@@ -1960,7 +1961,7 @@ es:
         facebook:
           title: Iniciar sesión con Facebook
           alt: Iniciar sesión con una cuenta de Facebook
-        windowslive:
+        microsoft:
           title: Iniciar sesión con Microsoft
           alt: Iniciar sesión con una cuenta Microsoft
         github:
index 263d70c8be397faabb577048737bf1c40a88f343..7bb68167c1f0a631c759e91ef8d436c78304ca36 100644 (file)
@@ -1399,7 +1399,7 @@ et:
         facebook:
           title: Logi sisse Facebooki kaudu
           alt: Logi sisse Facebooki kontoga
-        windowslive:
+        microsoft:
           title: Logi sisse Windows Live'i kaudu
           alt: Logi sisse Windows Live'i kontoga
         github:
index d17c5ca15c3282653a048711b3f0390b0ad922e1..058e8464d98692536f8fcdebe5dabd82c679bced 100644 (file)
@@ -1854,7 +1854,7 @@ eu:
         facebook:
           title: Saioa hasi Facebookekin
           alt: Saioa hasi Facebookekin
-        windowslive:
+        microsoft:
           title: Saioa hasi Windows Livekin
           alt: Windows Live kontu batekin saioa hasi
         github:
index 6f51531b7fbb6f39b806d66f7a28b26c75bac1d6..efa485f43402b10b6fdbc2c1e77915b44cfd437f 100644 (file)
@@ -256,7 +256,7 @@ fa:
       openid: OpenID
       google: گوگل
       facebook: فیس‌بوک
-      windowslive: مایکروسافت
+      microsoft: مایکروسافت
       github: گیت‌هاب
       wikipedia: ویکی‌پدیا
   api:
@@ -1837,7 +1837,7 @@ fa:
         facebook:
           title: ورود با فیسبوک
           alt: ورود با حساب فیسبوک
-        windowslive:
+        microsoft:
           title: ورود با مایکروسافت
           alt: ورود با حساب مایکروسافت
         github:
index a358fcd065a2228d5157ecb144a0292bf757d7ff..eb11333a9f86073bf43646cb2c4ee91ad69c3053 100644 (file)
@@ -1166,7 +1166,7 @@ fi:
           financial: Rahoitusalan toimisto
           government: Virasto
           insurance: Vakuutusyhtiö
-          it: IT toimisto
+          it: IT-toimisto
           lawyer: Asianajotoimisto
           logistics: Logistiikkatoimisto
           newspaper: Sanomalehtitoimisto
@@ -1821,6 +1821,9 @@ fi:
       home location: Kotipaikka
       no home location: Kotipaikkaa ei ole vielä määritetty.
       update home location on click: Päivitä kotipaikka karttaa napsauttaessa
+      show: Näytä
+      delete: Poista
+      undelete: Peruuta poistaminen
     update:
       success: Profiili päivitetty.
       failure: Profiilia ei voitu päivittää.
@@ -1849,7 +1852,7 @@ fi:
         facebook:
           title: Kirjaudu Facebookin avulla
           alt: Kirjaudu käyttämällä Facebook-tunnustasi
-        windowslive:
+        microsoft:
           title: Kirjaudu Microsoft-tilin avulla
           alt: Kirjaudu sisään Microsoft-tililläsi
         github:
@@ -2802,7 +2805,9 @@ fi:
     index:
       title: Käyttäjän %{user} kommentoimat ja luomat huomautukset
       heading: Käyttäjän %{user} karttailmoitukset
-      subheading_html: Käyttäjän %{user} kommentoimat ja luomat karttailmoitukset
+      subheading_html: Käyttäjän %{user} %{commented} ja %{submitted} karttailmoitukset
+      subheading_submitted: luomat
+      subheading_commented: kommentoimat
       no_notes: Ei muistiinpanoja
       id: Tunniste
       creator: Tekijä
index 0aa7d67d63e6d9e6b2bbf9bee0e6262e3696c27f..ce8569c48a0e70fa129ea5b941e09d8f11645cda 100644 (file)
 # Author: JenyxGym
 # Author: Jiremek
 # Author: Jlrb+
+# Author: Koreller
 # Author: Linedwell
 # Author: Litlok
 # Author: Ljubinka
 # Author: Ltrlg
 # Author: Lucky
+# Author: Lulucmy
 # Author: Macofe
 # Author: Manaviko
 # Author: Mathieu
@@ -309,12 +311,13 @@ fr:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipédia
   api:
     notes:
       comment:
-        opened_at_html: Créé le %{when}
+        opened_at_html: Créé %{when}
         opened_at_by_html: Créée %{when} par %{user}
         commented_at_html: Mis à jour le %{when}
         commented_at_by_html: Mis à jour le %{when} par %{user}
@@ -339,12 +342,12 @@ fr:
       show:
         title: Supprimer mon compte
         warning: Avertissement ! Le processus de suppression de compte est définitif
-          et ne pourra pas être annulé.
+          et ne peut pas être annulé.
         delete_account: Supprimer un compte
         delete_introduction: 'Vous pouvez supprimer votre compte OpenStreetMap en
           utilisant le bouton ci-dessous. Veuillez prendre note des détails suivants :'
-        delete_profile: Vos informations de profil, y compris votre avatar, votre
-          description et votre emplacement de domicile seront retirés.
+        delete_profile: Les informations de votre profil, y compris votre avatar,
+          votre description et votre lieu de résidence seront supprimées.
         delete_display_name: Votre nom affiché sera supprimé et pourra être réutilisé
           pour d’autres comptes.
         retain_caveats: 'Cependant, quelques informations vous concernant seront conservées
@@ -369,7 +372,7 @@ fr:
       external auth: Authentification externe
       openid:
         link: https://wiki.openstreetmap.org/wiki/FR:OpenID
-        link text: qu’est-ce que ceci ?
+        link text: qu’est-ce que cela ?
       public editing:
         heading: Modification publique
         enabled: Activée. Non anonyme et peut modifier les données.
@@ -390,7 +393,7 @@ fr:
         link: https://wiki.osmfoundation.org/wiki/Licence/Contributor_Terms/FR
         link text: qu’est-ce que ceci ?
       save changes button: Enregistrer les modifications
-      delete_account: Suppression du compte...
+      delete_account: Supprimer le compte...
     go_public:
       heading: Modification publique
       currently_not_public: Actuellement, vos modifications sont anonymes et les utilisateurs
@@ -1986,7 +1989,7 @@ fr:
         facebook:
           title: Connexion avec Facebook
           alt: Se connecter avec un compte de Facebook
-        windowslive:
+        microsoft:
           title: Connexion avec Microsoft
           alt: Se connecter avec un compte Microsoft
         github:
@@ -3117,7 +3120,9 @@ fr:
     index:
       title: Notes soumises ou commentées par « %{user} »
       heading: Notes de « %{user} »
-      subheading_html: Notes soumises ou commentées par « %{user} »
+      subheading_html: Notes %{submitted} ou %{commented} par %{user}
+      subheading_submitted: soumis
+      subheading_commented: commenté
       no_notes: Aucune note
       id: Identifiant
       creator: Créateur
index 219c282f715972c872fe57c7392508b8ec4932f2..fddcd757a080b67d40a89efe31afdf164eb3a623 100644 (file)
@@ -1123,7 +1123,7 @@ fur:
         facebook:
           title: Jentre cun Facebook
           alt: Jentre cuntun un cont Facebook
-        windowslive:
+        microsoft:
           title: Jentre cun Windows Live
           alt: Jentre cuntun cont di Windows Live
         github:
index fc81f938d4531dfad38ca1dfe1375d0cf61668bd..60d2efa81a8158250642544e2c5264708339185f 100644 (file)
@@ -1800,7 +1800,7 @@ fy:
         facebook:
           title: Oanmelde mei Facebook
           alt: Meld jo oan mei in Facebook-akkount
-        windowslive:
+        microsoft:
           title: Oanmelde mei Windows Live
           alt: Meld jo oan mei in Windows Live-akkount
         github:
index 34d7bd4d6eab44f8519cda7419c83532b12b127d..81775a67094b2117057211a61c0c2cc71080b9bf 100644 (file)
@@ -1348,7 +1348,7 @@ ga:
         facebook:
           title: Logáil isteach le Facebook
           alt: Logáil isteach le Cuntas Facebook
-        windowslive:
+        microsoft:
           title: Logáil isteach le Windows Live
           alt: Logáil isteach le Cuntas Windows Live
         github:
index a2457bd6c9fe2b7a2d79b6c67a1e7d29fa0bb098..6a4f75c0cad095cd80c01b2cf3d4e79b57fcd96f 100644 (file)
@@ -1189,7 +1189,7 @@ gd:
         facebook:
           title: Clàraich a-steach le Facebook
           alt: Clàraich a-steach le cunntas Facebook
-        windowslive:
+        microsoft:
           title: Clàraich a-steach le Windows Live
           alt: Clàraich a-steach le cunntas Windows Live
         github:
index 460003de8d2c112431ce86a572c3c1e63f6b65d8..e241bf3878c4a1ccb78bd5d55b6edef16d274b52 100644 (file)
@@ -229,6 +229,7 @@ gl:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -1848,6 +1849,9 @@ gl:
       no home location: Non inseriches o teu lugar de orixe.
       update home location on click: Desexas actualizar a túa localización ó premer
         sobre o mapa?
+      show: Amosar
+      delete: Borrar
+      undelete: Desfacer o borrado
     update:
       success: Perfil actualizado.
       failure: Non foi posíbel actualizar o perfil.
@@ -1876,7 +1880,7 @@ gl:
         facebook:
           title: Iniciar a sesión co Facebook
           alt: Iniciar a sesión cunha conta do Facebook
-        windowslive:
+        microsoft:
           title: Iniciar a sesión con Microsoft
           alt: Iniciar a sesión cunha conta de Microsoft
         github:
@@ -2970,7 +2974,9 @@ gl:
     index:
       title: Notas enviadas ou comentadas por %{user}
       heading: Notas de %{user}
-      subheading_html: Notas enviadas ou comentadas por %{user}
+      subheading_html: Notas %{submitted} ou %{commented} por %{user}
+      subheading_submitted: enviadas
+      subheading_commented: comentadas
       no_notes: Sen notas
       id: ID
       creator: Creador
index 36f7fab271d787e71d0bb619005f079b5d0ae00a..d059fcec69b29f69efc9309df28356407aa4b768 100644 (file)
@@ -51,7 +51,7 @@ he:
       prompt: בחירת קובץ
     submit:
       diary_comment:
-        create: הערה
+        create: ×¤×¨×¡×\95×\9d ×\94ער×\94
       diary_entry:
         create: פרסום
         update: עדכון
@@ -91,8 +91,8 @@ he:
       language: שפה
       message: הודעה
       node: נקודה
-      node_tag: ×ª×\92 ×¦×\95×\9eת
-      old_node: ×¦×\95×\9eת ×\99ש×\9f
+      node_tag: ×ª×\92 × ×§×\95×\93×\94
+      old_node: × ×§×\95×\93×\94 ×\99שנ×\94
       old_node_tag: תג צומת ישן
       old_relation: יחס ישן
       old_relation_member: איבר יחס ישן
@@ -117,7 +117,7 @@ he:
     attributes:
       client_application:
         name: שם (נדרש)
-        url: כתובת יישום ראשית (נדרש)
+        url: כתובת יישום ראשית (נדרשת)
         callback_url: כתובת קריאה חוזרת (callback)
         support_url: כתובת לתמיכה
         allow_read_prefs: לקרוא את העדפות המשתמש שלהם
@@ -273,7 +273,7 @@ he:
       openid: OpenID
       google: גוגל
       facebook: פייסבוק
-      windowslive: מיקרוסופט
+      microsoft: מיקרוסופט
       github: גיטהאב
       wikipedia: ויקיפדיה
   api:
@@ -1898,7 +1898,7 @@ he:
         facebook:
           title: כניסה עם פייסבוק
           alt: כניסה עם חשבון פייסבוק
-        windowslive:
+        microsoft:
           title: כניסה עם מיקרוסופט
           alt: כניסה עם חשבון מיקרוסופט
         github:
@@ -2956,7 +2956,9 @@ he:
     index:
       title: הערות ותגובות של %{user}
       heading: הערות של %{user}
-      subheading_html: הערות ותגובות של %{user}
+      subheading_html: הערות ש%{submitted} על־ידי %{user} או %{commented} מאת %{user}
+      subheading_submitted: שנשלחו
+      subheading_commented: קיבלו תגובות
       no_notes: אין הערות
       id: מזהה
       creator: יוצר
index 692428839c6d1c23aed6866e50487d9f6a8cb814..36d0cfcb4c2aef06162df32512e8d429a4d50510 100644 (file)
@@ -231,7 +231,7 @@ hi:
       openid: OpenID
       google: गूगल
       facebook: फेसबुक
-      windowslive: विन्डोज़ लाइव
+      microsoft: विन्डोज़ लाइव
       github: गिट्हब
       wikipedia: विकिपीडिया
   api:
@@ -942,6 +942,8 @@ hi:
       delete image: इस तस्वीर को हटाएं
       replace image: इस तस्वीर की जगह दूसरी लगाएं
       home location: घर का स्थान
+      show: दिखाएँ
+      delete: हटाएँ
   site:
     about:
       legal_1_1_terms_of_use: उपयोग की शर्तें
index 17ef797bc01923855638b7ba6f2f465adcf41186..4a9d1ba6bb1c24f34d57b90dd7e426cf46b992db 100644 (file)
@@ -1251,7 +1251,7 @@ hr:
         facebook:
           title: Prijavi se sa Facebook-om
           alt: Prijavi se sa računom Facebook-a
-        windowslive:
+        microsoft:
           title: Prijavi se sa Windows Live-om
           alt: Prijavi se sa računom Windows Live-a
         github:
index 79052ed5440f57f28346b41bb28cc8dcff80df6f..9c28c2cada880a5da3af63644fcac64913521b97 100644 (file)
@@ -1782,7 +1782,7 @@ hsb:
         facebook:
           title: Přizjewjenje z Facebook
           alt: Přizjewjenje z facebookowym kontom
-        windowslive:
+        microsoft:
           title: Přizjewjenje z Windows Live
           alt: Přizjewjenje z kontom Windows Live
         github:
index 5df67b97683e2fbf412bdb853abac493f8194f31..9e9d6c018b5f084186598b87d1c962a4a923a319 100644 (file)
@@ -33,6 +33,7 @@
 # Author: Tacsipacsi
 # Author: Uno20001
 # Author: Urbalazs
+# Author: Zalán Hári
 # Author: Zizzerus
 ---
 hu:
@@ -1882,7 +1883,7 @@ hu:
         facebook:
           title: Bejelentkezés Facebook-kal
           alt: Bejelentkezés Facebook fiókkal
-        windowslive:
+        microsoft:
           title: Bejelentkezés Microsofttal.
           alt: Bejelentkezés Microsoft fiókkal
         github:
@@ -1965,7 +1966,7 @@ hu:
         szerzői jogi vagy egyéb jogi kérdései vannak.
       legal_2_1_contact_the_osmf: lépj kapcsolatba az OSM Alapítvánnyal
       legal_2_2_html: Az OpenStreetMap, a nagyító logó és a State of the Map %{registered_trademarks_link}.
-      legal_2_2_registered_trademarks: az OSMF bejegyzett védjegye
+      legal_2_2_registered_trademarks: az OSMF bejegyzett védjegyei
       partners_title: Partnerek
     copyright:
       foreign:
index 7a4063e4b5105769974c4b7493e1cb951ebef58c..8bc1c60869f661c600b1e0206e57727a70314d0e 100644 (file)
@@ -218,6 +218,7 @@ ia:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -1870,7 +1871,7 @@ ia:
         facebook:
           title: Aperir session con Facebook
           alt: Aperir session con un conto de Facebook
-        windowslive:
+        microsoft:
           title: Aperir session con Microsoft
           alt: Aperir session con un conto Microsoft
         github:
@@ -2949,7 +2950,9 @@ ia:
     index:
       title: Notas submittite o commentate per %{user}
       heading: Notas de %{user}
-      subheading_html: Notas submittite o commentate per %{user}
+      subheading_html: Notas %{submitted} o %{commented} per %{user}
+      subheading_submitted: submittite
+      subheading_commented: commentate
       no_notes: Sin notas
       id: ID
       creator: Creator
index 00943412a12f44b73e3be23607e9c002ce67a8e1..69501f68c772d48a00d45083f630f06e41806867 100644 (file)
@@ -1888,7 +1888,7 @@ id:
         facebook:
           title: Masuk dengan Facebook
           alt: Masuk dengan akun Facebook
-        windowslive:
+        microsoft:
           title: Masuk dengan Windows Live
           alt: Masuk dengan akun Windows Live
         github:
index 297191f9d1cb974cabcdc4b38d0e02c812bbf079..efc567067850db4133f09144ca6cfed5718b5ccf 100644 (file)
@@ -1864,6 +1864,9 @@ is:
       home location: Upphafsstaðsetning
       no home location: Þú hefur ekki stillt staðsetningu þína.
       update home location on click: Uppfæra staðsetninguna þegar ég smelli á kortið
+      show: Birta
+      delete: Eyða
+      undelete: Afturkalla eyðingu
     update:
       success: Notandasíða uppfært.
       failure: Gat ekki uppfært kjörstillingar.
@@ -1892,7 +1895,7 @@ is:
         facebook:
           title: Skrá inn með Facebook
           alt: Skrá inn með Facebook-aðgangi
-        windowslive:
+        microsoft:
           title: Skrá inn með Microsoft
           alt: Skrá inn með Microsoft-aðgangi
         github:
index e000c57818703ff1e3764576fb9d6637fa0c9324..449fa5ebcba95f77d16d43a4e9839cf7d5d9de8e 100644 (file)
@@ -272,6 +272,7 @@ it:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -1898,6 +1899,7 @@ it:
       update home location on click: Aggiorna la posizione quando clicco sulla mappa?
       show: Mostra
       delete: Cancella
+      undelete: Annulla eliminazione
     update:
       success: Il profilo è stato aggiornato.
       failure: Impossibile aggiornare il profilo.
@@ -1926,7 +1928,7 @@ it:
         facebook:
           title: Accedi con Facebook
           alt: Accedi con un account Facebook
-        windowslive:
+        microsoft:
           title: Accedi con Microsoft
           alt: Accedi con un account Microsoft
         github:
@@ -3008,7 +3010,9 @@ it:
     index:
       title: Note inserite o commentate da %{user}
       heading: Note dell'utente %{user}
-      subheading_html: Note inserite o commentate da %{user}
+      subheading_html: Note %{submitted} o %{commented} da %{user}
+      subheading_submitted: inviate
+      subheading_commented: commentate
       no_notes: Nessuna nota
       id: Identificativo
       creator: Autore
index 9869ab108cd800af603d1e21a1598e756c999c3f..13ec9bc9fcd3aa18520cb1de94d207292a9b0c95 100644 (file)
@@ -269,7 +269,7 @@ ja:
       openid: OpenID
       google: Google
       facebook: Facebook
-      windowslive: マイクロソフト
+      microsoft: マイクロソフト
       github: GitHub
       wikipedia: ウィキペディア
   api:
@@ -350,12 +350,12 @@ ja:
   browse:
     created: 作成
     closed: クローズ
-    created_ago_html: '%{time_ago} に作成されました'
+    created_ago_html: '%{time_ago} に作成'
     closed_ago_html: '%{time_ago}に閉じられました'
-    created_ago_by_html: '%{user}ã\81«ã\82\88ã\81£ã\81¦%{time_ago}ã\81«ä½\9cæ\88\90ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9f'
-    closed_ago_by_html: '%{time_ago}に%{user}によって閉じられました'
-    deleted_ago_by_html: '%{time_ago}に%{user}によって削除されました'
-    edited_ago_by_html: '%{time_ago}に%{user}によって編集されました'
+    created_ago_by_html: '%{user}ã\81\8c%{time_ago}ã\81«ä½\9cæ\88\90'
+    closed_ago_by_html: '%{user}が%{time_ago}に閉じました'
+    deleted_ago_by_html: '%{user}が%{time_ago}に削除'
+    edited_ago_by_html: '%{user}が%{time_ago}に編集'
     version: バージョン
     in_changeset: 変更セット
     anonymous: 匿名
@@ -1795,7 +1795,7 @@ ja:
         facebook:
           title: Facebookでログイン
           alt: Facebook アカウントを使用してログイン
-        windowslive:
+        microsoft:
           title: Microsoftでログイン
           alt: Microsoftアカウントでログイン
         github:
index d2cb1a0d7d8e2d8d8c975c06d98c06ddf3d9c2c6..a5abc42d71a5ac365c218fdddb45eac3c025508f 100644 (file)
@@ -984,7 +984,7 @@ kab:
         facebook:
           title: Qqen s Facebook
           alt: Qqen s umidan Facebook
-        windowslive:
+        microsoft:
           title: Qqen s Windows Live
           alt: Qqen s umiḍan Windows Live
         github:
index bd64152827dc85b6018af40fec2dbc7b2c5ae881..d32001d7b5675f6a0fd5b3549671c8291e2ad8eb 100644 (file)
@@ -673,7 +673,7 @@ km:
           title: កត់ឈ្មោះចូលដោយប្រើ Google
         facebook:
           title: កត់ឈ្មោះចូលដោយប្រើ Facebook
-        windowslive:
+        microsoft:
           title: កត់ឈ្មោះចូលដោយប្រើ Windows Live
         github:
           title: កត់ឈ្មោះចូលដោយប្រើ GitHub
index 5925bc1a18ea87016719c39de91320ec7c4e2725..1a2964d2073224d735a8dfc44ce12ea0f09a0b6a 100644 (file)
@@ -170,7 +170,7 @@ kn:
       none: ಯಾವುದೂ ಇಲ್ಲ
       google: ಗೂಗಲ್
       facebook: ಫೇಸ್‍ಬುಕ್
-      windowslive: ವಿಂಡೋಸ್ ಲೈವ್
+      microsoft: ವಿಂಡೋಸ್ ಲೈವ್
       github: ಗಿಟ್‌ಹಬ್
       wikipedia: ವಿಕಿಪೀಡಿಯ
   api:
index 9fe8930a379baa515a8adc7079d50948627071a2..8783f551ec8c31366ab5b0c60a6ada2ab8912eb8 100644 (file)
@@ -1686,7 +1686,7 @@ ko:
         facebook:
           title: 페이스북으로 로그인
           alt: 페이스북 계정으로 로그인하기
-        windowslive:
+        microsoft:
           title: 윈도 라이브로 로그인하기
           alt: 윈도 라이브 계정으로 로그인하기
         github:
index 3afc544cf7a2a618b4039b7ef887867ae65cfc00..3cf67f7b5c98e144885fc98c11d752d0b49ce011 100644 (file)
@@ -228,7 +228,7 @@ ksh:
         facebook:
           title: Donn övver ene Zohjang op Facebook ennlogge
           alt: Donn övver ene Zohjang op Facebook ennlogge
-        windowslive:
+        microsoft:
           title: Donn medd enem Zohjang op Windows Live ennlogge
           alt: Donn medd enem Zohjang op Windows Live ennlogge
         github:
index 5f245f4f8cb0f89d282627a7dd07fc2a17b0042b..1d45aad4f840830b9e0824a37666dac3a6ee7f23 100644 (file)
@@ -1852,7 +1852,7 @@ ku-Latn:
         facebook:
           title: Bi Facebookê têkeve
           alt: Bi hesabekî Facebookê têkeve
-        windowslive:
+        microsoft:
           title: Bi Windows Live'ê têkeve
           alt: Bi hesabê xwe yê Windows Liveê têkeve
         github:
index 7d92e3a5ac69ca722c0e2c0615dbabfb3f2ceeeb..7d04b25fb7840b32ad0ab00f3e367040070a8f9d 100644 (file)
@@ -1840,7 +1840,7 @@ lb:
         facebook:
           title: Mat Facebook aloggen
           alt: Mat engem Facebook Benotzerkont aloggen
-        windowslive:
+        microsoft:
           title: Mat Microsoft aloggen
           alt: Mat engem Microsoft-Benotzerkont aloggen
         github:
index b09bc0c78c35b859923db04eec83b0adfcb4dffb..7447cf52140db13012679a28a83e27f5c9344f16 100644 (file)
@@ -1775,6 +1775,9 @@ lt:
       home location: Pradinė lokacija
       no home location: Jūs neįvedėte savo namų pozicijos
       update home location on click: Atnaujinti namų poziciją paspaudus ant žemėlapio?
+      show: Rodyti
+      delete: Trinti
+      undelete: Anuliuoti trynimą
     update:
       success: Profilis atnaujintas.
       failure: Nepavyko atnaujinti profilio.
@@ -1803,7 +1806,7 @@ lt:
         facebook:
           title: Prisijungti su Facebook
           alt: Prisijungti su Facebook paskyra
-        windowslive:
+        microsoft:
           title: Prisijungti su Windows Live
           alt: Prisijungti su Windows Live paskyra
         github:
index 3c78c0c8a58fc011aebfe68d545a11692d311c03..4133eec391f12f7233f178329d0151d87d394c5e 100644 (file)
@@ -1462,7 +1462,7 @@ lv:
         facebook:
           title: Pieslēgties ar Facebook
           alt: Pieslēgties ar Facebook kontu
-        windowslive:
+        microsoft:
           title: Pieslēgties ar Microsoft
           alt: Pieslēgties ar Microsoft kontu
         github:
index 720b34c6bcea61ebbaa033481395aeb25a4494a4..1e4085af741a73db500c0f8d8e91b803118ce5c8 100644 (file)
@@ -1859,7 +1859,7 @@ mk:
         facebook:
           title: Најава со Фејсбук
           alt: Најава со профил на Фејсбук
-        windowslive:
+        microsoft:
           title: Најава со Microsoft
           alt: Најава со сметка на Microsoft
         github:
index 1fe000ae9f1f7566010f050f24e09bf4a4c2102f..b8183b232ddf858878525ed3809b19a262c83b66 100644 (file)
@@ -580,7 +580,7 @@ mo:
         facebook:
           title: Ынтраря ку ажуторул Facebook
           alt: Ынтраря ку ажуторул контулуй де Facebook
-        windowslive:
+        microsoft:
           title: Ынтраря ку ажуторул Windows Live
           alt: Ынтраря ку ажуторул контулуй де Windows Live
         github:
index 129e0d1a10efab85d963f59f6b35c6c9ebac3818..09186db88da59b3602f975210b53533fb3c2f31c 100644 (file)
@@ -1464,7 +1464,7 @@ ms:
         facebook:
           title: Log masuk dengan Facebook
           alt: Log masuk dengan Akuan Facebook
-        windowslive:
+        microsoft:
           title: Log masuk dengan Window Live
           alt: Log masuk dengan Akaun Windows Live
         github:
index 34e08cea6eef47f80e9c17397b291ac64ef11337..6d8323aab45a8da327ce43f4cf0bec5a60a355df 100644 (file)
@@ -1616,7 +1616,7 @@ nb:
         facebook:
           title: Logg inn med Facebook
           alt: Logg inn med en Facebook-konto
-        windowslive:
+        microsoft:
           title: Logg inn med Microsoft
           alt: Logg inn med en Microsoft-konto
         github:
index 95794336a795d482c951f3622cc58f09fbc78195..0be36dcf606da68449c09ed1e8bf7727d74c4761 100644 (file)
@@ -1931,7 +1931,7 @@ nl:
         facebook:
           title: Aanmelden met Facebook
           alt: Aanmelden met een Facebookaccount
-        windowslive:
+        microsoft:
           title: Aanmelden met Microsoft
           alt: Aanmelden met een Microsoft-account
         github:
index e5cda0b9c0babc3c75b33ab897cf31dc5653c617..b6c0ba2c8a199cad84c898beab18c6cd9c1f4a1c 100644 (file)
@@ -1209,7 +1209,7 @@ nn:
         facebook:
           title: Logg inn med Facebook
           alt: Logg inn med ein Facebook-konto
-        windowslive:
+        microsoft:
           title: Logg inn med Windows Live
           alt: Logg inn med ein Windows Live-konto
         github:
index d401202273e86fbf1c748ccf328d7d1bd7eeac83..846b4375e54e2c7b714412c5f8b6ca0c81ddf7ff 100644 (file)
@@ -178,7 +178,7 @@ nqo:
       openid: ߏߔߌ߲ ID
       google: ߜ߭ߎߜ߭ߏߟ
       facebook: ߝߋߛߑߓߎߞ
-      windowslive: ߡߌߞߙߏߛߐߝߕ
+      microsoft: ߡߌߞߙߏߛߐߝߕ
       github: GitHub
       wikipedia: ߥߞߌߔߋߘߌߦߊ
   api:
@@ -1369,7 +1369,7 @@ nqo:
         facebook:
           title: ߌ ߜߊ߲߬ߞߎ߲߫ ߝߋߛߑߓߎߞ ߟߊ߫
           alt: ߌ ߜߊ߲߬ߞߎ߲߫ ߝߋߛߑߓߎߞ ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߟߊ߫
-        windowslive:
+        microsoft:
           title: ߌ ߜ߭ߊ߲߬ߞߎ߲߫ ߥߌ߲ߘߏߥߛ ߟߊߌߝ߭ ߟߊ߫
           alt: ߌ ߜߊ߲߬ߞߎ߲߫ ߥߌ߲ߘߏߥߛ ߟߊߌߝ߭ ߖߊ߬ߕߋ߬ߘߊ ߟߊ߫
         github:
index 2e98de1028a4525c4032ff1170ef8bd766b13e6a..6d2b120acd270f4889bcb08f6d9eb62aab7ac0ad 100644 (file)
@@ -1806,7 +1806,7 @@ oc:
         facebook:
           title: Se connectar amb Facebook
           alt: Se connectar amb un commpte Facebook
-        windowslive:
+        microsoft:
           title: Se connectar amb Windows Live
           alt: Se connectar amb un compte Windows Live
         github:
index 50a2e90cfbaf23f9516ffaa7b93ee2c7f57e1fc4..6d71349c586fb0cf719fbbe52816107847ad0cab 100644 (file)
@@ -129,7 +129,7 @@ pa:
       none: ਕੋਈ ਨਹੀਂ
       google: ਗੂਗਲ
       facebook: ਫੇਸਬੁੱਕ
-      windowslive: ਵਿੰਡੋਜ਼ ਲਾਈਵ
+      microsoft: ਵਿੰਡੋਜ਼ ਲਾਈਵ
       github: ਗਿੱਟਹੱਬ
       wikipedia: ਵਿਕੀਪੀਡੀਆ
   api:
index f248db1c1a7789b532d43f03b3d68e65f58a4cd7..51285dae14400fdcf6bb20fc87db83f68b4ecf24 100644 (file)
@@ -1957,7 +1957,7 @@ pl:
         facebook:
           title: Zaloguj się przez Facebooka
           alt: Zaloguj się przez konto Facebook
-        windowslive:
+        microsoft:
           title: Zaloguj się przez Microsoft
           alt: Zaloguj się kontem Microsoft
         github:
index 1ce103feae657e70b5076af10a38d87b7bdf25da..d085b897b587bcbf5f90ea88a376c04cac57ab74 100644 (file)
@@ -210,7 +210,7 @@ pnb:
       openid: اوپن آئی ڈی
       google: گوگل
       facebook: فیسبوک
-      windowslive: وِنڈوز لائیو
+      microsoft: وِنڈوز لائیو
       github: گِٹ ہب
       wikipedia: وِکیپیدیا
   api:
@@ -1463,7 +1463,7 @@ pnb:
         facebook:
           title: فیس‌بوک نال لوگ‌این کرو
           alt: فیسبوک ورتو
-        windowslive:
+        microsoft:
           title: وینڈوز لائیو نال لوگ‌این کرو
           alt: وینڈوز لائیو ورتو
         github:
index 5b3c3bdd5277a34b21909ed678fa380c4c5aa2c1..ffe0f4ff8cd85e2d07751fe5afbd554bdcdde50e 100644 (file)
@@ -252,6 +252,7 @@ pt-PT:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipédia
   api:
@@ -403,7 +404,7 @@ pt-PT:
       history_title_html: 'Histórico da Linha: %{name}'
       nodes: Nós
       nodes_count:
-        one: 1 nó
+        one: '%{count} nó'
         other: '%{count} nós'
       also_part_of_html:
         one: parte da linha %{related_ways}
@@ -583,8 +584,8 @@ pt-PT:
       reply_link: Enviar mensagem ao autor
       comment_count:
         one: '%{count} comentário'
-        zero: Sem comentários
         other: '%{count} comentários'
+      no_comments: Sem comentários
       edit_link: Editar
       hide_link: Ocultar
       unhide_link: Mostrar
@@ -859,7 +860,7 @@ pt-PT:
           stable: Estábulo
           static_caravan: Caravana
           temple: Edíficio de templo
-          terrace: Edifício terraçado
+          terrace: Edifício geminado
           train_station: Edifício de estação dos comboios
           university: Edifício universitário
           warehouse: Armazém
@@ -1130,13 +1131,13 @@ pt-PT:
           "yes": Desfiladeiro
         natural:
           atoll: Atol
-          bare_rock: Rocha visível
+          bare_rock: Rocha exposta
           bay: Baía
           beach: Praia
           cape: Cabo
           cave_entrance: Entrada de gruta
           cliff: Precipício
-          coastline: Litoral
+          coastline: Linha costeira
           crater: Cratera
           dune: Duna
           fell: Encosta desflorestada
@@ -1471,9 +1472,9 @@ pt-PT:
     show:
       title: '%{status} Denúncia #%{issue_id}'
       reports:
-        zero: Sem denúncias
-        one: 1 denúncia
+        one: '%{count} denúncia'
         other: '%{count} denúncias'
+      no_reports: Sem denúncias
       report_created_at: Denunciado pela primeira vez em %{datetime}
       last_resolved_at: Resolvido pela última vez em %{datetime}
       last_updated_at: Atualizado pela última vez em %{datetime} por %{displayname}
@@ -1875,6 +1876,9 @@ pt-PT:
       home location: Localização principal
       no home location: Não definiste a tua localização principal.
       update home location on click: Atualizar a localização ao clicar no mapa?
+      show: Mostrar
+      delete: Eliminar
+      undelete: Desfazer eliminação
     update:
       success: Perfil atualizado.
       failure: Não foi possível atualizar o perfil.
@@ -1903,7 +1907,7 @@ pt-PT:
         facebook:
           title: Iniciar sessão com o Facebook
           alt: Iniciar sessão com uma conta do Facebook
-        windowslive:
+        microsoft:
           title: Iniciar sessão com Microsoft
           alt: Iniciar sessão com uma conta Microsoft
         github:
@@ -2978,7 +2982,9 @@ pt-PT:
     index:
       title: Notas submetidas ou comentadas por %{user}
       heading: Notas de %{user}
-      subheading_html: Notas submetidas ou comentadas por %{user}
+      subheading_html: Notas %{submitted} ou %{commented} por %{user}
+      subheading_submitted: enviada
+      subheading_commented: comentada em
       no_notes: Sem notas
       id: Id
       creator: Criador
@@ -3004,7 +3010,7 @@ pt-PT:
       anonymous_warning: Esta nota inclui comentários de utilizadores anónimos que
         devem ser confirmados por fonte independente.
       hide: Esconder
-      resolve: Marcar como resolvido
+      resolve: Marcar como resolvida
       reactivate: Reabrir
       comment_and_resolve: Comentar e resolver
       comment: Comentar
index fe8160327f91447f135f711c4d289a4aa34ad725..5247428bbf746e18b87e3c0564b742c3f3154747 100644 (file)
@@ -1913,7 +1913,7 @@ pt:
         facebook:
           title: Entrar com o Facebook
           alt: Entrar com uma conta do Facebook
-        windowslive:
+        microsoft:
           title: Entrar com o Windows Live
           alt: Entrar com uma conta do Windows Live
         github:
index ae2b93da1c8c73b45d24f939c8345322d1de5cb4..f9007390f026dd35fc23b7e5318124acfe86c364 100644 (file)
@@ -185,40 +185,50 @@ ro:
         few: aproximativ %{count} ore în urmă}}
         other: …}}
       about_x_months:
-        one: aproximativ 1 lună în urmă
-        other: aproximativ %{count} luni în urmă
+        one: aproximativ o lună în urmă
+        few: aproximativ %{count} luni în urmă
+        other: aproximativ %{count} de luni în urmă
       about_x_years:
-        one: aproximativ 1 an în urmă
-        other: aproximativ %{count} ani în urmă
+        one: aproximativ un an în urmă
+        few: aproximativ %{count} ani în urmă
+        other: aproximativ %{count} de ani în urmă
       almost_x_years:
-        one: aproape 1 an în urmă
-        few: acum câțiva ani
-        other: aproape %{count} ani în urmă
+        one: aproape un an în urmă
+        few: aproape %{count} ani în urmă
+        other: aproape %{count} de ani în urmă
       half_a_minute: o jumătate de minut în urmă
       less_than_x_seconds:
-        one: mai puțin de 1 secundă în urmă
-        other: aproximativ acum %{count} luni în urmă
+        one: mai puțin de o secundă în urmă
+        few: mai puțin de %{count} secunde în urmă
+        other: mai puțin de %{count} de secunde în urmă
       less_than_x_minutes:
         one: mai puțin de un minut în urmă
-        other: mai puțin de %{count} minute în urmă
+        few: mai puțin de %{count} minute în urmă
+        other: mai puțin de %{count} de minute în urmă
       over_x_years:
-        one: acum peste 1 an
-        other: peste %{count} ani în urmă
+        one: mai mult de un an în urmă
+        few: mai mult de %{count} ani în urmă
+        other: mai mult de %{count} de ani în urmă
       x_seconds:
-        one: acum 1 secundă
-        other: cu %{count} secunde în urmă
+        one: acum o secundă
+        few: cu %{count} secunde în urmă
+        other: cu %{count} de secunde în urmă
       x_minutes:
-        one: acum 1 minut
-        other: cu %{count} minute în urmă
+        one: acum un minut
+        few: cu %{count} minute în urmă
+        other: cu %{count} de minute în urmă
       x_days:
-        one: acum 1 zi
-        other: cu %{count} zile în urmă
+        one: acum o zi
+        few: cu %{count} zile în urmă
+        other: cu %{count} de zile în urmă
       x_months:
-        one: acum 1 lună
-        other: cu %{count} luni în urmă
+        one: acum o lună
+        few: cu %{count} luni în urmă
+        other: cu %{count} de luni în urmă
       x_years:
-        one: acum 1 an
-        other: cu %{count} ani în urmă
+        one: acum un an
+        few: cu %{count} ani în urmă
+        other: cu %{count} de ani în urmă
   editor:
     default: Implicit (în prezent %{name})
     id:
@@ -233,6 +243,7 @@ ro:
       openid: OpenID
       google: OpenID
       facebook: OpenID
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -273,6 +284,15 @@ ro:
           de alte conturi.
         retain_caveats: 'Cu toate acestea, unele informații despre dvs. vor fi păstrate
           pe OpenStreetMap, chiar și după ștergerea contului:'
+        retain_edits: Editările dvs. la baza de date a hărții, dacă există, vor fi
+          păstrate.
+        retain_traces: Înregistrările încărcate, dacă există, vor fi păstrate.
+        retain_diary_entries: Înregistrările și comentariile din jurnal, dacă există,
+          vor fi păstrate, dar ascunse.
+        retain_notes: Notele dvs. de hartă și comentariile notelor, dacă există, vor
+          fi reținute, dar ascunse pentru vedere.
+        retain_changeset_discussions: Discuțiile dvs. privind setul de modificări,
+          dacă există, vor fi păstrate.
         retain_email: Adresa dvs. de e-mail va fi păstrată.
         confirm_delete: Sunteți sigur(ă)?
         cancel: Anulează
@@ -357,6 +377,8 @@ ro:
       relation: Comunicații (%{count})
       relation_paginated: Comunicații (%{x}-%{y} din %{count})
       comment: Comentarii (%{count})
+      hidden_comment_by_html: Comentariu ascuns de la %{user} %{time_ago}
+      comment_by_html: Comentariu de la %{user} %{time_ago}
       changesetxml: Set de modificări XML
       osmchangexml: XML osmChange
       feed:
@@ -374,9 +396,9 @@ ro:
       history_title_html: 'Istoricul căii: %{name}'
       nodes: Noduri
       nodes_count:
-        one: 1 nod
+        one: un nod
         few: '%{count} noduri'
-        other: ""
+        other: '%{count} de noduri'
       also_part_of_html:
         one: parte a liniei de %{related_ways}
         other: parte din liniile de %{related_ways}
@@ -385,9 +407,9 @@ ro:
       history_title_html: 'Istoricul relației: %{name}'
       members: Membri
       members_count:
-        one: 1 membru
+        one: un membru
         few: '%{count} membri'
-        other: ""
+        other: '%{count} de membri'
     relation_member:
       entry_role_html: '%{type} %{name} ca %{role}'
       type:
@@ -499,6 +521,8 @@ ro:
       friend: Prieten
     show:
       title: Dashboardul meu
+      no_home_location_html: '%{edit_profile_link} și setați locația de acasă pentru
+        a vedea utilizatorii din apropiere.'
       edit_your_profile: Editați-vă profilul
       my friends: Prietenii mei
       no friends: Nu ați adăugat încă niciun prieten.
@@ -549,9 +573,9 @@ ro:
       comment_link: Comentează la această înregistrare
       reply_link: Trimite un mesaj autorului
       comment_count:
-        zero: Niciun comentariu
-        one: '%{count} comentariu'
-        other: '%{count} comentarii'
+        one: Un comentariu
+        few: '%{count} comentarii'
+        other: '%{count} de comentarii'
       no_comments: Fără comentarii
       edit_link: Editează această înregistrare
       hide_link: Ascunde această înregistrare
@@ -580,6 +604,9 @@ ro:
         title: Înregistrări în jurnalul OpenStreetMap
         description: Înregistrări recente în jurnale de la utilizatorii OpenStreetMap
     comments:
+      title: Comentarii din jurnal adăugate de %{user}
+      heading: Comentariile la jurnal a lui %{user}
+      subheading_html: Comentarii din jurnal adăugate de %{user}
       no_comments: Fără comentarii din jurnal
       post: Postează
       when: Când
@@ -592,8 +619,16 @@ ro:
         create:
           notice: Aplicație înregistrată.
   errors:
+    contact:
+      contact_url_title: Diferite metode de contact explicate
+      contact: contact
+      contact_the_community_html: Simțiți-vă liber să %{contact_link} comunitatea
+        OpenStreetMap dacă ați găsit un link invalid/o eroare. Notați adresa URL exactă
+        a solicitării dvs.
     forbidden:
       title: Interzis
+      description: Operația pe care ați solicitat-o pe serverul OpenStreetMap este
+        disponibilă numai pentru administratori (HTTP 403)
     internal_server_error:
       title: Eroare aplicație
       description: Serverul OpenStreetMap a întâlnit o condiție neașteptată care l-a
@@ -1829,6 +1864,9 @@ ro:
       no home location: Nu ați introdus locația dvs. de domiciliu.
       update home location on click: Actualizați locația locuinței dvs. când faceți
         click pe hartă?
+      show: Arată
+      delete: Șterge
+      undelete: Anulează ștergerea
     update:
       success: Profil actualizat.
       failure: Nu s-a putut actualiza profilul.
@@ -1857,7 +1895,7 @@ ro:
         facebook:
           title: Autentificare cu Facebook
           alt: Conectați-vă cu un cont Facebook
-        windowslive:
+        microsoft:
           title: Conectare cu Microsoft
           alt: Conectare cu un Cont Microsoft
         github:
@@ -2057,6 +2095,12 @@ ro:
           %{france}: Conține date provenite din
           Direction Générale des Impôts.
         contributors_fr_france: Franța
+        contributors_nl_credit_html: '%{netherlands}: Conține &copy; AND data, 2007
+          (%{and_link})'
+        contributors_nl_netherlands: Țările de Jos
+        contributors_nz_credit_html: |-
+          %{new_zealand}: Conține date provenite din %{linz_data_service_link}
+          și licențiate pentru reutilizare sub %{cc_by_link}.
         contributors_nz_new_zealand: Noua Zeelandă
         contributors_nz_linz_data_service: Serviciul de date LINZ
         contributors_nz_cc_by: CC BY 4.0
@@ -2243,8 +2287,19 @@ ro:
       removed: Editorul dvs. implicit OpenStreetMap este setat ca Potlatch. Deoarece
         Adobe Flash Player a fost retras, Potlatch nu mai este disponibil pentru utilizare
         într-un browser web.
+      desktop_application_html: Puteți utiliza în continuare Potlatch %{download_link}.
+      download: descărcând aplicația desktop pentru Mac și Windows
+      id_editor_html: Alternativ, puteți seta editorul implicit la iD, care rulează
+        în browserul dvs. web așa cum a făcut anterior Potlatch. %{change_preferences_link}.
+      change_preferences: Schimbați-vă preferințele aici
     any_questions:
       title: Întrebări?
+      paragraph_1_html: |-
+        OpenStreetMap vă pune la dispoziție resurse pentru a afla despre proiect, pentru a pune și a răspunde la
+        întrebări și pentru a discuta și a documenta colaborativ despre cartografiere.
+        %{help_link}. Ești o organizație care are planuri pentru OpenStreetMap? %{welcome_mat_link}.
+      get_help_here: Obțineți ajutor aici
+      welcome_mat: Consultați Pagina de Bun Venit
     sidebar:
       search_results: Rezultatele căutării
       close: Închide
@@ -2297,6 +2352,7 @@ ro:
           common:
           - Comun
           - luncă
+          - grădină
           retail: Spațiul de retail
           industrial: Zonă industrială
           commercial: Zonă comercială
@@ -2336,18 +2392,71 @@ ro:
         lucruri pe care trebuie să le cunoașteți.
       whats_on_the_map:
         title: Ce este pe Hartă
+        on_the_map_html: |-
+          OpenStreetMap este un loc pentru cartografierea lucrurilor care sunt %{real_and_current} -
+          include milioane de clădiri, drumuri și alte detalii despre locații. Puteți pune pe hartă orice caracteristici ale limii reale de care sunteți interesați.
+        real_and_current: reale și curente
+        off_the_map_html: Ce %{doesnt} include sunt date subiective cum ar fi recenzii,
+          date istorice sau ipotetice și date provenite din surse protejate prin drepturi
+          de autor. Dacă nu aveți permisiune, nu copiați de pe hărți online sau hărți
+          clasice.
+        doesnt: nu
       basic_terms:
         title: Termeni de bază pentru cartografiere
         paragraph_1: OpenStreetMap are propriul jargon. Iată câteva cuvinte cheie
           care vă vor veni în ajutor.
+        an_editor_html: Un %{editor} este un program sau un website pe care îl puteți
+          utiliza pentru a edita harta.
+        a_node_html: Un %{node} este un punct de pe hartă, de exemplu un singur restaurant
+          sau copac.
+        a_way_html: O %{way} este o linie sau o zonă, cum ar fi un drum, un curs de
+          apă, un lac sau o clădire.
+        a_tag_html: O %{tag} este un atribut al unui nod sau a unei căi, de exemplu
+          numele restaurantului sau limita de viteză a unui drum.
+        editor: editor
+        node: nod
+        way: cale
+        tag: etichetă
       rules:
         title: Reguli!
+        para_1_html: |-
+          OpenStreetMap are puține reguli formale, dar ne așteptăm ca toți participanții să colaboreze și să comunice cu comunitatea. Dacă vă gândiți la
+          orice activități, altele decât editarea manuală, vă rugăm să citiți și să urmați instrucțiunile de pe
+          %{imports_link} și %{automated_edits_link}.
+        imports: Importurile
+        automated_edits: Editări automate
       start_mapping: Începeți să cartografiați
       add_a_note:
         title: Nu aveți timp pentru editare? Adaugați o notă!
         para_1: |-
           Dacă doriți doar ceva îndreptați o eroare minoră și nu aveți timp să vă înscrieți și să învățați cum să editați, este
           ușor să adăugați o notă.
+        para_2_html: |-
+          Accesați %{map_link} și faceți clic pe pictograma notă: %{note_icon}.
+          Acest lucru va adăuga un marcator pe hartă, pe care îl puteți muta prin glisare.
+          Adăugați mesajul dvs., apoi faceți clic pe Salvare și alți cartografi vor investiga.
+        the_map: harta
+    communities:
+      title: Comunitățile
+      lede_text: "Oameni din întreaga lume contribuie sau folosesc OpenStreetMap.\nÎn
+        timp ce mulți participă ca indivizi, alții au format comunități.\nAceste grupuri
+        au o gamă largă de dimensiuni și reprezintă zone geografice de la orașe mici
+        până la regiuni mari cu mai multe țări. \nDe asemenea, pot fi formale sau
+        informale."
+      local_chapters:
+        title: Capitolele locale
+        about_text: |-
+          Capitolele locale sunt grupuri la nivel de țară sau la nivel de regiune care au făcut pasul oficial de
+          înființarea de entități juridice non-profit. Ele reprezintă harta și cartografii zonei atunci când au de-a face cu administrația locală, firme și mass-media. Ei și-au format, de asemenea, o afiliere
+          cu Fundația OpenStreetMap (OSMF), oferindu-le o legăturăa către organismul de conducere legal și de drepturi de autor.
+        list_text: 'Următoarele comunități sunt înființate oficial drept capitole
+          locale:'
+      other_groups:
+        title: Alte Grupuri
+        other_groups_html: |-
+          Nu este nevoie să se înființeze în mod oficial un grup în aceeași măsură ca și Capitolele locale.
+          Într-adevăr, multe grupuri există cu mare succes ca o adunare informală de oameni sau ca un grup comunitar. Oricine le poate configura sau se poate alătura. Citiți mai multe pe %{communities_wiki_link}.
+        communities_wiki: Pagina wiki comunități
   traces:
     visibility:
       private: Privat (partajat ca puncte anonime, neordonate)
@@ -2411,9 +2520,9 @@ ro:
     trace:
       pending: ÎN AȘTEPTARE
       count_points:
-        one: 1 punct
+        one: un punct
         few: '%{count} puncte'
-        other: ""
+        other: '%{count} de puncte'
       more: mai multe
       trace_details: Vezi detaliile urmei
       view_map: Vezi hartă
@@ -2426,11 +2535,20 @@ ro:
       in: în
     index:
       public_traces: Trasee GPS publice
+      my_gps_traces: Track-uri GPS
       public_traces_from: Traseele GPS publice de la %{user}
       description: Căutați încărcări recente din traseul GPS
       tagged_with: etichetat cu %{tags}
+      empty_title: Nimic aici încă
+      empty_upload_html: '%{upload_link} sau aflați mai multe despre înregistrările
+        GPS pe %{wiki_link}.'
+      upload_new: Încărcați un track nou
+      wiki_page: pagina wiki
       upload_trace: Încărcați urma
+      all_traces: Toate track-urile
       my_traces: Înregistrările mele GPS
+      traces_from: Traseele GPS publice de la %{user}
+      remove_tag_filter: Eliminați filtrul de etichete
     destroy:
       scheduled_for_deletion: Traseul este programat pentru ștergere
     make_public:
@@ -2465,6 +2583,9 @@ ro:
         de acord, dar trebuie să le vizualizați.
     settings_menu:
       account_settings: Setările contului
+      oauth1_settings: Setări OAuth 1
+      oauth2_applications: Aplicații OAuth 2
+      oauth2_authorizations: Autorizări OAuth 2
   oauth:
     authorize:
       title: Autorizați accesul la contul dvs.
@@ -2492,6 +2613,16 @@ ro:
       flash: Ați revocat tokenul pentru %{application}
     permissions:
       missing: Nu ați permis accesul aplicației la această facilitate
+    scopes:
+      read_prefs: Citiți preferințele utilizatorului
+      write_prefs: Modificați preferințele utilizatorului
+      write_diary: Creează înregistrări în jurnal, comentarii și fă-ți prieteni
+      write_api: Modificați harta
+      read_gpx: Citiți track-urile GPS private
+      write_gpx: Încărcați track-uri GPS
+      write_notes: Modificați notele
+      read_email: Citiți adresa de e-mail a utilizatorului
+      skip_authorization: Aprobare automată a cererii
   oauth_clients:
     new:
       title: Înregistrare aplicație nouă
@@ -2534,8 +2665,40 @@ ro:
       flash: Actualizarea informațiilor despre client cu succes
     destroy:
       flash: A distrus înregistrarea aplicației clientului
+  oauth2_applications:
+    index:
+      title: Aplicațiile mele client
+      no_applications_html: Aveți o aplicație pe care doriți să o înregistrați pentru
+        a fi utilizată la noi folosind standardul %{oauth2}? Trebuie să vă înregistrați
+        aplicația înainte ca aceasta să poată face solicitări OAuth către acest serviciu.
+      new: Înregistrați o nouă aplicație
+      name: Nume
+      permissions: Permisiuni
+    application:
+      edit: Editați
+      delete: Șterge
+      confirm_delete: Ștergeți această aplicație?
+    new:
+      title: Înregistrați o nouă aplicație
+    edit:
+      title: Editați-vă aplicația
+    show:
+      edit: Editați
+      delete: Șterge
+      confirm_delete: Ștergeți această aplicație?
+      client_id: ID client
+      client_secret: Secretul clientului
+      client_secret_warning: Asigurați-vă că salvați acest secret - nu va fi accesibil
+        din nou
+      permissions: Permisiuni
+      redirect_uris: Redirecționați URI-uri
+    not_found:
+      sorry: Ne pare rău, acea aplicație nu a putut fi găsită.
   oauth2_authorizations:
     new:
+      title: Este necesară autorizarea
+      introduction: Autorizați %{application} să vă acceseze contul cu următoarele
+        permisiuni?
       authorize: Autorizează
       deny: Respinge
     error:
@@ -2544,8 +2707,10 @@ ro:
       title: Code de autorizare
   oauth2_authorized_applications:
     index:
+      title: Aplicațiile mele autorizate
       application: Aplicație
       permissions: Permisiuni
+      no_applications_html: Nu ați autorizat încă nicio aplicație %{oauth2}.
     application:
       revoke: Revocă accesul
       confirm_revoke: Revocați accesul acestei aplicații?
@@ -2554,8 +2719,17 @@ ro:
       title: Înregistrare
       no_auto_account_create: Din păcate, în prezent nu putem crea automat un cont
         pentru dvs.
+      please_contact_support_html: Vă rugăm să contactați %{support_link} pentru a
+        aranja crearea unui cont - vom încerca să rezolvăm solicitarea cât mai repede
+        posibil.
+      support: suport
       about:
         header: Liberă și editabilă
+        paragraph_1: Spre deosebire de alte hărți, OpenStreetMap este creat complet
+          de oameni ca tine și este gratuit pentru oricine să repare, să actualizeze,
+          să descarce și să folosească.
+        paragraph_2: Înscrie-te pentru a începe să contribui. Vă vom trimite un e-mail
+          pentru a vă confirma contul.
       display name description: Numele dvs. de utilizator afișat public. Puteți schimba
         acest lucru mai târziu în preferințe.
       external auth: 'Verificarea terță parte:'
@@ -2564,6 +2738,11 @@ ro:
         dar unele instrumente suplimentare sau serverul pot avea nevoie de una.
       continue: Înregistrare
       terms accepted: Vă mulțumim pentru acceptarea noilor termeni de contribuire!
+      email_confirmation_help_html: Adresa dvs. nu este afișată public, consultați
+        %{privacy_policy_link} pentru mai multe informații.
+      privacy_policy: Politica de confidențialitate
+      privacy_policy_title: Politica de confidențialitate OSMF, inclusiv secțiunea
+        privind adresele de e-mail
     terms:
       title: Termeni
       heading: Termeni
@@ -2582,6 +2761,10 @@ ro:
         în Domeniul Public
       consider_pd_why: Ce este aceasta?
       consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
+      guidance_info_html: 'Informații pentru a ajuta la înțelegerea acestor termeni:
+        un %{readable_summary_link} și câteva %{informal_translations_link}'
+      readable_summary: rezumat care poate fi citit de om
+      informal_translations: traduceri informale
       continue: Continuă
       decline: Declină
       you need to accept or decline: Citiți și apoi acceptați sau refuzați continuarea
@@ -2614,6 +2797,7 @@ ro:
       my_dashboard: Dashboardul meu
       blocks on me: Blochează pe mine
       blocks by me: Blochează de mine
+      edit_profile: Editează profilul
       send message: Trimite mesajul
       diary: Jurnal
       edits: Modificare
@@ -2645,6 +2829,8 @@ ro:
       create_block: Blochează acest utilizator
       activate_user: Activează acest utilizator
       confirm_user: Confirmă acest utilizator
+      unconfirm_user: Deconfirmați acest utilizator
+      unsuspend_user: Anulați suspendarea acestui utilizator
       hide_user: Ascunde acest utilizator
       unhide_user: Descoperă acest utilizator
       delete_user: Șterge acest utilizator
@@ -2667,12 +2853,19 @@ ro:
     suspended:
       title: Cont Suspendat
       heading: Cont Suspendat
+      support: suport
+      automatically_suspended: Ne pare rău, contul dvs. a fost suspendat automat din
+        cauza activității suspecte.
+      contact_support_html: Această decizie va fi examinată de un administrator în
+        curând sau puteți contacta %{support_link} dacă doriți să discutați despre
+        acest lucru.
     auth_failure:
       connection_failed: Conectarea la furnizorul de autentificare a eșuat
       invalid_credentials: Autentificări nevalide de autentificare
       no_authorization_code: Nu există cod de autorizare
       unknown_signature_algorithm: Algoritm de semnătură necunoscut
       invalid_scope: Domeniu nevalid
+      unknown_error: Autentificare eșuată
     auth_association:
       heading: ID-ul dvs. nu este încă asociat cu un cont OpenStreetMap.
       option_1: |-
@@ -2753,20 +2946,25 @@ ro:
       time_past_html: Terminat în urmă cu %{time}.
       block_duration:
         hours:
-          one: 1 oră
-          other: '%{count} ore'
+          one: o oră
+          few: '%{count} ore'
+          other: '%{count} de ore'
         days:
-          one: 1 zi
-          other: '%{count} zile'
+          one: o zi
+          few: '%{count} zile'
+          other: '%{count} de zile'
         weeks:
-          one: 1 săptămână
-          other: '%{count} săptămâni'
+          one: o săptămână
+          few: '%{count} săptămâni'
+          other: '%{count} de săptămâni'
         months:
-          one: 1 lună
-          other: '%{count} luni'
+          one: o lună
+          few: '%{count} luni'
+          other: '%{count} de luni'
         years:
-          one: 1 an
-          other: '%{count} ani'
+          one: un an
+          few: '%{count} ani'
+          other: '%{count} de ani'
     blocks_on:
       title: Blocări pe %{name}
       heading_html: Lista blocărilor pe %{name}
@@ -2808,7 +3006,9 @@ ro:
     index:
       title: Notele trimise sau comentate de %{user}
       heading: Notele %{user}
-      subheading_html: Notele trimise sau comentate de %{user}
+      subheading_html: Note %{submitted} sau %{commented} de %{user}
+      subheading_submitted: trimise
+      subheading_commented: comentate
       no_notes: Nicio notă
       id: Id
       creator: Creator
@@ -2821,6 +3021,15 @@ ro:
       open_title: 'Notă nerezolvată #%{note_name}'
       closed_title: 'Notă rezolvată #%{note_name}'
       hidden_title: 'Notă ascunsă #%{note_name}'
+      event_opened_by_html: Creat de %{user} %{time_ago}
+      event_opened_by_anonymous_html: Creat anonim %{time_ago}
+      event_commented_by_html: Comentariu de la %{user} %{time_ago}
+      event_commented_by_anonymous_html: Comentariu anonim %{time_ago}
+      event_closed_by_html: Rezolvată de %{user} %{time_ago}
+      event_closed_by_anonymous_html: Rezolvată anonim %{time_ago}
+      event_reopened_by_html: Reactivată de %{user} %{time_ago}
+      event_reopened_by_anonymous_html: Reactivată anonim %{time_ago}
+      event_hidden_by_html: Ascunsă de %{user} %{time_ago}
       report: Raportează această notă
       anonymous_warning: Această notă include comentarii de la utilizatori anonimi,
         care ar trebui verificați independent.
@@ -2829,6 +3038,12 @@ ro:
       reactivate: Reactivează
       comment_and_resolve: Comentariu & Rezolvare
       comment: Comentariu
+      report_link_html: Dacă această notă conține informații sensibile care trebuie
+        eliminate, puteți %{link}.
+      other_problems_resolve: Pentru toate celelalte probleme legate de notă, vă rugăm
+        să o rezolvați singur printr-un comentariu.
+      other_problems_resolved: Pentru toate celelalte probleme, rezolvarea este suficientă.
+      disappear_date_html: Această notă rezolvată va dispărea de pe hartă în %{disappear_in}.
     new:
       title: Notă nouă
       intro: A apărut o greșeală sau lipsește ceva? Lăsați alți cartografi să știe
@@ -2875,11 +3090,11 @@ ro:
         metersPopup:
           one: Sunteți la un metru de acest punct
           few: Sunteți la %{count} metri de acest punct
-          other: ""
+          other: Sunteți la %{count} de metri de acest punct
         feetPopup:
-          one: Sunteți la un picior unitate de măsură de acest punct
-          few: Sunteți la %{count} picioare unitate de măsură de acest punct
-          other: ""
+          one: Sunteți la un picior de acest punct
+          few: Sunteți la %{count} picioare de acest punct
+          other: Sunteți la %{count} de picioare de acest punct
       base:
         standard: Standard
         cyclosm: CyclOSM
@@ -2901,6 +3116,9 @@ ro:
       osm_france: OpenStreetMap Franța
       thunderforest_credit: Plăci prin amabilitatea lui %{thunderforest_link}
       andy_allan: Andy Allan
+      opnvkarte_credit: Tile-uri prin amabilitatea lui %{memomaps_link}
+      memomaps: MeMoMaps
+      hotosm_credit: Stilul tile-urilor creat de %{hotosm_link} găzduit de %{osm_france_link}
       hotosm_name: Echipa Umanitară OpenStreetMap
     site:
       edit_tooltip: Modifică harta
index f83b663a52f1b15cd634b2a48df0754e389d2e68..f96ebc04874d4e4cb0c124477477c95eac93d5e0 100644 (file)
@@ -425,6 +425,7 @@ ru:
     closed: Закрыто
     created_ago_html: Создано %{time_ago}
     closed_ago_html: Закрыто %{time_ago}
+    created_ago_by_html: Создал %{time_ago} %{user}
     edited_ago_by_html: Редактировал %{time_ago} %{user}
     version: Версия
     in_changeset: Пакет правок
@@ -455,6 +456,7 @@ ru:
       relation: Отношения (%{count})
       relation_paginated: Отношения (%{x}-%{y} из %{count})
       comment: Комментарии (%{count})
+      comment_by_html: Комментарий от %{user} %{time_ago}
       changesetxml: XML пакета правок
       osmchangexml: osmChange XML
       feed:
@@ -653,6 +655,7 @@ ru:
         one: '%{count} комментарий'
         zero: Нет комментариев
         other: '%{count} комментариев'
+      no_comments: Нет комментариев
       edit_link: Изменить запись
       hide_link: Скрыть эту запись
       unhide_link: Отобразить эту запись
@@ -730,6 +733,7 @@ ru:
     search:
       title:
         results_from_html: Результаты из %{results_link}
+        latlon: Внутренний
     search_osm_nominatim:
       prefix:
         aerialway:
@@ -960,6 +964,7 @@ ru:
           ambulance_station: Станция скорой медицинской помощи
           assembly_point: Место сбора
           defibrillator: Дефибриллятор
+          fire_water_pond: Пожарный водоём
           landing_site: Место аварийной посадки
           phone: Телефон экстренной связи
           water_tank: Пожарный водоём/резервуар
@@ -1009,6 +1014,7 @@ ru:
           trailhead: Тропа
           trunk: Трасса
           trunk_link: Развязка
+          turning_circle: Разворотное кольцо
           turning_loop: Дорога для разворота
           unclassified: Дорога местного значения
           "yes": Дорога
@@ -1146,6 +1152,7 @@ ru:
           pier: Пирс
           pipeline: Трубопровод
           pumping_station: Насосная станция
+          reservoir_covered: Крытый резервуар
           silo: Силос
           snow_cannon: Снежная пушка
           snow_fence: Снегозащитное заграждение
@@ -1154,6 +1161,7 @@ ru:
           surveillance: Камера наблюдения
           telescope: Телескоп
           tower: Башня
+          utility_pole: Электрический столб
           wastewater_plant: Станция очистки сточных вод
           watermill: Водяная мельница
           water_tap: Водопроводный кран
@@ -1220,6 +1228,7 @@ ru:
           water: Водоём
           wetland: Заболоченная территория
           wood: Лес
+          "yes": Природный объект
         office:
           accountant: Бухгалтер
           administrative: Администрация
@@ -1358,6 +1367,7 @@ ru:
           funeral_directors: Похоронное бюро
           furniture: Мебель
           garden_centre: Садовый центр
+          gas: Магазин газового оборудования
           general: Магазин
           gift: Магазин подарков
           greengrocer: Овощной магазин
@@ -1500,6 +1510,7 @@ ru:
       status: Статус
       reports: Сообщения
       last_updated: Последнее изменение
+      last_updated_time_ago_user_html: '%{time_ago} %{user}'
       link_to_reports: Просмотр сообщений
       reports_count:
         one: 1 сообщение
@@ -1924,6 +1935,9 @@ ru:
       no home location: Вы не обозначили свое домашнее местоположение.
       update home location on click: Обновлять моё местоположение, когда я нажимаю
         на карту?
+      show: Показать
+      delete: Удалить
+      undelete: Отменить удаление
     update:
       success: Профиль обновлён.
       failure: Не удалось обновить профиль.
@@ -1952,9 +1966,9 @@ ru:
         facebook:
           title: Войти с помощью Facebook
           alt: Войти с помощью учётной записи в Facebook
-        windowslive:
-          title: Войти с помощью Windows Live
-          alt: Войти с помощью учётной записи Windows Live
+        microsoft:
+          title: Войти с помощью Microsoft
+          alt: Войти с помощью учётной записи Microsoft
         github:
           title: Войти с GitHub
           alt: Войти с учётной записи на GitHub
@@ -2054,10 +2068,29 @@ ru:
       legal_babble:
         title_html: Авторские права и лицензирование
         introduction_1_open_data: открытые данные
+        introduction_2_html: Вы можете свободно копировать, распространять, передавать
+          и дорабатывать наши данные до тех пор, пока вы ссылаетесь на OpenStreetMap
+          и его участников. Если вы изменяете или берёте наши данные за основу, то
+          вы должны распространять результат только по такой же лицензии. Полный %{legal_code_link}
+          юридический текст лицензии разъясняет ваши права и обязанности.
         credit_title_html: Как сослаться на OpenStreetMap
         credit_1_html: 'Если вы используете данные OpenStreetMap, вы должны выполнить
           следующие два условия:'
+        credit_2_1: Отдайте должное OpenStreetMap, поместив наше уведомление об авторских
+          правах.
+        credit_2_2: Дайте понять, что данные доступны по лицензии открытой базы данных.
+        credit_3_html: 'У нас есть различные требования к тому, как должно отображаться
+          наше уведомление об авторских правах: всё зависит от того, как вы используете
+          наши данные. Например, действуют разные правила при отображении уведомления
+          об авторских правах в разных случаях: создали ли вы просматриваемую карту,
+          печатную карту или статичное изображение. Полную информацию о требованиях
+          можно найти в %{attribution_guidelines_link}.'
         credit_3_attribution_guidelines: Руководство по атрибуции
+        credit_4_1_html: |-
+          Чтобы явно указать, что данные доступны по лицензии Open Database License, вы можете сослаться на %{this_copyright_page_link}.
+          В качестве альтернативы, а также в качестве требования, если вы распространяете OSM в виде набора данных, вы можете назвать лицензию(и) и дать на неё(них) прямую ссылку.
+          В СМИ, где ссылки физически невозможны (например, в печатных изданиях), мы предлагаем вам направлять читателей на сайт openstreetmap.org (возможно, расширив написание «OpenStreetMap» до полного веб-адреса) и на opendatacommons.org.
+          В этом примере, упоминание находится в углу карты.
         attribution_example:
           alt: Пример того, как сослаться на OpenStreetMap с веб-страницы
           title: Пример указания авторства
@@ -2085,6 +2118,7 @@ ru:
         contributors_2_html: |-
           Для получения дополнительной информации об этих и других источниках, которые использовались
           для улучшения OpenStreetMap, см. %{contributors_page_link} на OpenStreetMap Wiki.
+        contributors_2_contributors_page: Страница авторов
         contributors_footer_2_html: Включение данных в OpenStreetMap не означает,
           что поставщик первичных данных каким-либо образом поддерживает OpenStreetMap,
           предоставляет гарантии или принимает на себя какую-любую ответственность.
@@ -2333,6 +2367,7 @@ ru:
           с сообществом и общаться с ним. Если вы планируете
           какие-либо действия, кроме редактирования вручную, прочтите и следуйте инструкциям:
           %{imports_link} и %{automated_edits_link}.
+        imports: Импорты
         automated_edits: Автоматические правки
       start_mapping: Начать картографировать
       add_a_note:
index 5660a99aa63398a9b253c9a6ee3785928fb72f06..11a947a05f8b06f372aa89671d548fa9171b8745 100644 (file)
@@ -221,6 +221,7 @@ sc:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Wikipedia
   api:
@@ -375,7 +376,7 @@ sc:
       history_title_html: 'Istòria de sa lìnia: %{name}'
       nodes: Nodos
       nodes_count:
-        one: 1 nodu
+        one: '%{count} nodu'
         other: '%{count} nodos'
       also_part_of_html:
         one: parte de sa lìnia %{related_ways}
@@ -552,6 +553,7 @@ sc:
       comment_count:
         one: '%{count} cummentu'
         other: '%{count} cummentos'
+      no_comments: Perunu cummentu
       edit_link: Modìfica custa intrada
       hide_link: Cua custa intrada
       unhide_link: Ammustra custa intrada
@@ -1443,6 +1445,7 @@ sc:
       reports:
         one: '%{count} sinnalatzione'
         other: '%{count} sinnalatziones'
+      no_reports: Perunu informe
       report_created_at: Sinnaladu pro sa prima borta su %{datetime}
       last_resolved_at: Risoltu pro s'ùrtima borta su %{datetime}
       last_updated_at: Ùrtima atualizatzione de %{displayname} su %{datetime}
@@ -1853,6 +1856,9 @@ sc:
       no home location: No as insertadu sa positzione de incumintzu tua.
       update home location on click: Atualizare sa positzione de incumintzu incarchende
         in sa mapa?
+      show: Ammustra
+      delete: Iscantzella
+      undelete: Annulla s'iscantzellamentu
     update:
       success: Profilu atualizadu.
       failure: Non s'est pòdidu atualizare su profilu.
@@ -1881,7 +1887,7 @@ sc:
         facebook:
           title: Intra cun Facebook
           alt: Intra cun unu contu de Facebook
-        windowslive:
+        microsoft:
           title: Intra cun Microsoft
           alt: Intra cun unu contu de Microsoft
         github:
@@ -2994,7 +3000,9 @@ sc:
     index:
       title: Notas insertadas o cummentadas dae %{user}
       heading: Notas de %{user}
-      subheading_html: Notas imbiadas o cummentadas dae %{user}
+      subheading_html: Notas %{submitted} o %{commented} dae %{user}
+      subheading_submitted: imbiadas
+      subheading_commented: cummentadas
       no_notes: Peruna nota
       id: Id
       creator: Creadore
index cb4aa3f5bd6f8c9fa128fa533b09e82e1f15dbae..bf4cf06d15ac4475705f4501be52b954e3a8b902 100644 (file)
@@ -1297,7 +1297,7 @@ scn:
         facebook:
           title: Trasi cu Facebook
           alt: Trasi cûn cuntu di Facebook
-        windowslive:
+        microsoft:
           title: Trasi cu Windows Live
           alt: Trasi cûn cuntu di Windows Live
         github:
index cc0b3b486342fb86804f3074737368a43809866a..4e3fa8fa7f2f411534f60e6c7bca59402d97571c 100644 (file)
@@ -808,7 +808,7 @@ sco:
         facebook:
           title: Login wi Facebook
           alt: Login wi a Facebook Accoont
-        windowslive:
+        microsoft:
           title: Login wi Windows Live
           alt: Login wi a Windows Live Accoont
         github:
index 7bd8b6e87d3b10fea6a7e5736b55b74f1f042361..69551cb832657cf900a103fd76e1c6ade7333393 100644 (file)
@@ -1781,7 +1781,7 @@ sk:
         facebook:
           title: Prihlásenie sa pomocou Facebooku
           alt: Prihlásenie sa pomocou účtu na Facebooku
-        windowslive:
+        microsoft:
           title: Prihlásenie sa pomocou Windows Live
           alt: Prihlásenie sa pomocou účtu Windows Live
         github:
index b33dcc7b700a8542d58bcddb177ae2acba219c25..ebf024269c63862a0cd3e2dd5bb411721150045b 100644 (file)
@@ -148,7 +148,7 @@ skr-arab:
       openid: کھلی آئی ڈی
       google: گوگل
       facebook: فیسبوک
-      windowslive: مائیکروسافٹ
+      microsoft: مائیکروسافٹ
       github: گِٹ ہب
       wikipedia: وکیپیڈیا
   api:
@@ -1111,7 +1111,7 @@ skr-arab:
           alt: گوگل اوپن آئی ڈی نال لاگ ان تھیوو
         facebook:
           title: فیس بک نال لاگ ان تھیوو
-        windowslive:
+        microsoft:
           title: مائیکروسافٹ نال لاگ ان تھیوو
           alt: مائیکروسافٹ کھاتے نال لاگ ان تھیوو
         github:
@@ -1320,6 +1320,8 @@ skr-arab:
       show: ݙِکھاؤ
       edit: تبدیلی کرو
   notes:
+    index:
+      subheading_submitted: جمع تھی ڳیا
     show:
       title: نوٹ:%{id}
       description: تفصیل
index 3bbe874dd46e962cb39778282813bd82cf592ab4..9d0554c8b5ef6544df8af9baf6aeb916d9209cdc 100644 (file)
@@ -1926,7 +1926,7 @@ sl:
         facebook:
           title: Prijavi se s Facebookom
           alt: Prijavi se z računom Facebook
-        windowslive:
+        microsoft:
           title: Prijava z Microsoftom
           alt: Prijava z računom Microsoft
         github:
@@ -3017,7 +3017,9 @@ sl:
     index:
       title: Opombe, ki jih je posredoval_a ali komentiral_a %{user}
       heading: Opombe uporabnika %{user}
-      subheading_html: Opombe, ki jih je posredoval_a ali komentiral_a %{user}
+      subheading_html: Opombe, ki jih je %{submitted} ali %{commented} %{user}
+      subheading_submitted: posredoval_a
+      subheading_commented: komentiral_a
       no_notes: Ni opomb
       id: Id
       creator: Ustvarjalec
index f980de83b83901a2940b3bcbf736f9f0d7131def..d015c9baf3108f0d23de4a9a873ce907416bb9a7 100644 (file)
@@ -1457,7 +1457,7 @@ sr:
         facebook:
           title: Пријавити се са Facebook-ом
           alt: Пријава преко Facebook налога
-        windowslive:
+        microsoft:
           title: Пријава преко Microsoft-а
           alt: Пријава преко Microsoft налога
         github:
index 847d18f508c0252a685bdcc963bd386a63551d64..08a76ff6bed1c3c2a03f711ed245650992ae7b00 100644 (file)
@@ -1872,7 +1872,7 @@ sv:
         facebook:
           title: Logga in med Facebook
           alt: Logga in med ett Facebook-konto
-        windowslive:
+        microsoft:
           title: Logga in med Microsoft
           alt: Logga in med ett Microsoft-konto
         github:
index 095c11d2f717fb3ea127b721db93fb33b553eb29..fc7874b99b4f6692f1a694525b3f1c68e3df729e 100644 (file)
@@ -1781,7 +1781,7 @@ te:
         facebook:
           title: Facebook తో లాగినవండి
           alt: Facebook ఖాతాతో లాగినవండి
-        windowslive:
+        microsoft:
           title: Windows Live తో లాగినవండి
           alt: Windows Live ఖాతాతో లాగినవండి
         github:
index c11f31ee2c3f801e307786d12f9a570bf817e675..64e1da4e93ae70558252e10c9dbf2ad1e0b6d493 100644 (file)
@@ -1468,7 +1468,7 @@ th:
         facebook:
           title: เข้าใช้งานด้วย Facebook
           alt: เข้าใช้งานด้วยบัญชี Facebook
-        windowslive:
+        microsoft:
           title: เข้าใช้งานด้วย Windows Live
           alt: เข้าใช้งานด้วยบัญชี Windows Live
         github:
index 41a18baf6375506301f239f69a97ecb16a9526f8..78226dcaf98924a841b0bda19bd51691e263af57 100644 (file)
@@ -1494,7 +1494,7 @@ tl:
         facebook:
           title: Lumagda gamit ang Facebook
           alt: Lumagda gamit ang isang akawnt sa Facebook
-        windowslive:
+        microsoft:
           title: Lumagda gamit ang Windows Live
           alt: Lumagda gamit ang isang akawnt sa Windows Live
         github:
index 5c325292f3c6f12ceb9d32f6dd3cf05c0d781aff..ca015f96509a94d627cd446293631acd2db48c8a 100644 (file)
@@ -262,6 +262,7 @@ tr:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Vikipedi
   api:
@@ -410,6 +411,7 @@ tr:
       history_title_html: 'Yol geçmişi: %{name}'
       nodes: Noktalar
       nodes_count:
+        one: '%{count} düğüm'
         other: '%{count} düğüm'
       also_part_of_html:
         one: yol parçası %{related_ways}
@@ -583,7 +585,6 @@ tr:
       comment_link: Bu girdiyi yorumla
       reply_link: Yazara mesaj gönder
       comment_count:
-        zero: Yorum yok
         one: '%{count} yorum'
         other: '%{count} yorum'
       no_comments: Yorum yok
@@ -1474,8 +1475,7 @@ tr:
     show:
       title: '%{status} Sorun #%{issue_id}'
       reports:
-        zero: Rapor yok
-        one: 1 rapor
+        one: '%{count} rapor'
         other: '%{count} rapor'
       no_reports: Rapor yok
       report_created_at: İlk defa %{datetime} tarihinde bildirildi
@@ -1911,7 +1911,7 @@ tr:
         facebook:
           title: Facebook ile giriş
           alt: Facebook Hesabı ile giriş
-        windowslive:
+        microsoft:
           title: Microsoft ile giriş
           alt: Microsoft Hesabı ile giriş
         github:
@@ -2019,6 +2019,8 @@ tr:
         credit_title_html: OpenStreetMap'e nasıl atıfta bulunulur
         credit_1_html: 'OpenStreetMap verilerini kullandığınız yerde aşağıdaki iki
           şeyi yapmanız gerekiyor:'
+        credit_2_1: Telif hakkı bildirimimizi görüntüleyerek OpenStreetMap'e atıfta
+          bulunun.
         credit_2_2: Verilerin Açık Veritabanı Lisansı kapsamında mevcut olduğunu açıkça
           belirtin.
         credit_4_1_this_copyright_page: bu telif hakkı sayfası
@@ -2052,6 +2054,12 @@ tr:
         contributors_nz_new_zealand: Yeni Zelanda
         contributors_nz_linz_data_service: LINZ Veri Hizmeti
         contributors_nz_cc_by: CC BY 4.0
+        contributors_rs_serbia: Sırbistan
+        contributors_rs_rgz: Sırp Jeodezi Kurumu
+        contributors_rs_open_data_portal: Ulusal Açık Veri Portalı
+        contributors_si_credit_html: |-
+          %{slovenia}: %{gu_link} ve %{mkgp_link}
+          (Slovenya'nın kamuya açık bilgileri) verilerini içerir.
         contributors_si_slovenia: Slovenya
         contributors_si_mkgp: Tarım, Orman ve Gıda Bakanlığı
         contributors_es_spain: İspanya
index 0b51488b71a721a2ca4b6eac2d10909e39994ac4..c3e0b9624ceff505430c2c3e4eff811be2a10d63 100644 (file)
@@ -283,6 +283,7 @@ uk:
       openid: OpenID
       google: Google
       facebook: Facebook
+      microsoft: Microsoft
       github: GitHub
       wikipedia: Вікіпедія
   api:
@@ -1921,6 +1922,9 @@ uk:
       no home location: Ви не позначили своє основне місце розташування.
       update home location on click: Оновлювати моє місце розташування, коли я клацаю
         на мапу?
+      show: Показати
+      delete: Вилучити
+      undelete: Скасувати вилучення
     update:
       success: Профіль збережено.
       failure: Неможливо зберегти оновлення профілю.
@@ -1949,7 +1953,7 @@ uk:
         facebook:
           title: Увійти з Facebook
           alt: Увійти з облікового запису Facebook
-        windowslive:
+        microsoft:
           title: Увійти з Microsoft
           alt: Увійти з облікового запису Microsoft
         github:
@@ -3048,7 +3052,9 @@ uk:
     index:
       title: Нотатки створені чи прокоментовані %{user}
       heading: Нотатки %{user}
-      subheading_html: Нотатки, створені чи прокоментовані %{user}
+      subheading_html: Нотатки, %{submitted} чи %{commented} %{user}
+      subheading_submitted: створені
+      subheading_commented: прокоментовані
       no_notes: Нотаток немає
       id: Номер
       creator: Автор
index 530ebb70580912814d1c85da702799cfe6212cd7..4144a3f018e3d549fd23e32a19de58fc521d5400 100644 (file)
@@ -1738,9 +1738,9 @@ vi:
         facebook:
           title: Đăng nhập qua Facebook
           alt: Đăng nhập dùng tài khoản Facebook
-        windowslive:
-          title: Đăng nhập qua Windows Live
-          alt: Đăng nhập dùng tài khoản Windows Live
+        microsoft:
+          title: Đăng nhập qua Microsoft
+          alt: Đăng nhập dùng Tài khoản Microsoft
         github:
           title: Đăng nhập qua GitHub
           alt: Đăng nhập dùng tài khoản GitHub
index d07cacfeb0a2bb28b0db862189c273d8683ce376..a20d5891b5ed8bc804dc723416aa23bebd9d941e 100644 (file)
@@ -1826,7 +1826,7 @@ zh-CN:
         facebook:
           title: 使用脸书登录
           alt: 使用Facebook账户登录
-        windowslive:
+        microsoft:
           title: 使用Microsoft登录
           alt: 使用Microsoft账户登录
         github:
index 085c06003f11b4f25125c722e40d19132c6e17ca..ac484938d1871109e6eb3731d7636c627c59782f 100644 (file)
@@ -255,6 +255,7 @@ zh-TW:
       openid: OpenID
       google: Google
       facebook: 臉書
+      microsoft: 微軟
       github: GitHub
       wikipedia: 維基百科
   api:
@@ -1809,7 +1810,7 @@ zh-TW:
         facebook:
           title: 使用臉書登入
           alt: 使用臉書帳號登入
-        windowslive:
+        microsoft:
           title: 使用 Microsoft 帳號登入
           alt: 使用 Microsoft 帳號登入
         github:
@@ -2735,7 +2736,9 @@ zh-TW:
     index:
       title: 由 %{user} 送出或評論的註記
       heading: '%{user} 的註記'
-      subheading_html: '%{user} 送出或評論的註記'
+      subheading_html: 由%{user}%{submitted}或%{commented}的註記
+      subheading_submitted: 已提交
+      subheading_commented: 已評論
       no_notes: 沒有註記
       id: ID
       creator: 建立者
index d9910ce28afbdd00a7c070bdaada6f1911ca8531..5330ed678c47333acd0e5ca388709da14100227b 100644 (file)
@@ -55,6 +55,9 @@ user_block_periods: [0, 1, 3, 6, 12, 24, 48, 96, 168, 336, 731, 4383, 8766, 8766
 max_messages_per_hour: 60
 # Rate limit for friending
 max_friends_per_hour: 60
+# Rate limit for changeset comments
+min_changeset_comments_per_hour: 6
+max_changeset_comments_per_hour: 60
 # Domain for handling message replies
 #messages_domain: "messages.openstreetmap.org"
 # MaxMind GeoIPv2 database
@@ -140,3 +143,8 @@ smtp_user_name: null
 smtp_password: null
 # Matomo settings for analytics
 #matomo:
+# Signup rate limits
+#signup_ip_per_day:
+#signup_ip_max_burst:
+#signup_email_per_day:
+#signup_email_max_burst:
diff --git a/db/migrate/20230825162137_restore_author_index_to_changeset_comments.rb b/db/migrate/20230825162137_restore_author_index_to_changeset_comments.rb
new file mode 100644 (file)
index 0000000..8174132
--- /dev/null
@@ -0,0 +1,7 @@
+class RestoreAuthorIndexToChangesetComments < ActiveRecord::Migration[7.0]
+  disable_ddl_transaction!
+
+  def change
+    add_index :changeset_comments, [:author_id, :created_at], :algorithm => :concurrently
+  end
+end
index 86537003fc4627ef768adb6b84e8bf88f4936438..1874e64616154aa4e24c41beb9d6403dcb709a70 100644 (file)
@@ -2370,6 +2370,13 @@ CREATE UNIQUE INDEX index_active_storage_blobs_on_key ON public.active_storage_b
 CREATE UNIQUE INDEX index_active_storage_variant_records_uniqueness ON public.active_storage_variant_records USING btree (blob_id, variation_digest);
 
 
+--
+-- Name: index_changeset_comments_on_author_id_and_created_at; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX index_changeset_comments_on_author_id_and_created_at ON public.changeset_comments USING btree (author_id, created_at);
+
+
 --
 -- Name: index_changeset_comments_on_changeset_id_and_created_at; Type: INDEX; Schema: public; Owner: -
 --
@@ -3396,6 +3403,7 @@ INSERT INTO "schema_migrations" (version) VALUES
 ('20220201183346'),
 ('20220223140543'),
 ('20230816135800'),
+('20230825162137'),
 ('21'),
 ('22'),
 ('23'),
index 4241ad700a575c0bc9b6e088b97c1cf5137467fe..6d945c4fe871250f404af3926a1813cfa7858881 100644 (file)
@@ -353,6 +353,13 @@ module OSM
     end
   end
 
+  # Raised when a rate limit is exceeded
+  class APIRateLimitExceeded < APIError
+    def status
+      :too_many_requests
+    end
+  end
+
   # Helper methods for going to/from mercator and lat/lng.
   class Mercator
     include Math
diff --git a/lib/rate_limiter.rb b/lib/rate_limiter.rb
new file mode 100644 (file)
index 0000000..438f5a1
--- /dev/null
@@ -0,0 +1,38 @@
+class RateLimiter
+  def initialize(cache, interval, limit, max_burst)
+    @cache = cache
+    @requests_per_second = limit.to_f / interval
+    @burst_limit = max_burst
+  end
+
+  def allow?(key)
+    last_update, requests = @cache.get(key)
+
+    if last_update
+      elapsed = Time.now.to_i - last_update
+
+      requests -= elapsed * @requests_per_second
+    else
+      requests = 0.0
+    end
+
+    requests < @burst_limit
+  end
+
+  def update(key)
+    now = Time.now.to_i
+
+    last_update, requests = @cache.get(key)
+
+    if last_update
+      elapsed = now - last_update
+
+      requests -= elapsed * @requests_per_second
+      requests += 1.0
+    else
+      requests = 1.0
+    end
+
+    @cache.set(key, [now, [requests, 1.0].max])
+  end
+end
index 26500babdcb24f47b727c3be384ecc084a668db8..624b8a35808645c1964c3b7fd40aa5fa5f46b262 100644 (file)
@@ -132,6 +132,27 @@ module Api
       assert_response :bad_request
     end
 
+    ##
+    # create comment rate limit
+    def test_create_comment_rate_limit
+      changeset = create(:changeset, :closed)
+      user = create(:user)
+
+      auth_header = basic_authorization_header user.email, "test"
+
+      assert_difference "ChangesetComment.count", Settings.min_changeset_comments_per_hour do
+        1.upto(Settings.min_changeset_comments_per_hour) do |count|
+          post changeset_comment_path(:id => changeset, :text => "Comment #{count}"), :headers => auth_header
+          assert_response :success
+        end
+      end
+
+      assert_no_difference "ChangesetComment.count" do
+        post changeset_comment_path(:id => changeset, :text => "One comment too many"), :headers => auth_header
+        assert_response :too_many_requests
+      end
+    end
+
     ##
     # test hide comment fail
     def test_destroy_comment_fail
index cb2c7520504dfa38f0c51cde7434cfafb4a15834..aa4bf1e9de85010ac51ba86793a421c6a2a39b84 100644 (file)
@@ -419,13 +419,19 @@ module Api
       check_json_details(js["users"][1], user3, false, false)
 
       get api_users_path, :params => { :users => create(:user, :suspended).id }
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
 
       get api_users_path, :params => { :users => create(:user, :deleted).id }
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
 
       get api_users_path, :params => { :users => 0 }
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
     end
 
     def test_index_oauth1
@@ -506,13 +512,19 @@ module Api
       check_json_details(js["users"][1], user3, false, false)
 
       signed_get api_users_path, :params => { :users => create(:user, :suspended).id }, :oauth => { :token => good_token }
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
 
       signed_get api_users_path, :params => { :users => create(:user, :deleted).id }, :oauth => { :token => good_token }
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
 
       signed_get api_users_path, :params => { :users => 0 }, :oauth => { :token => good_token }
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
     end
 
     def test_index_oauth2
@@ -593,13 +605,19 @@ module Api
       check_json_details(js["users"][1], user3, false, false)
 
       get api_users_path, :params => { :users => create(:user, :suspended).id }, :headers => bearer_authorization_header(good_token.token)
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
 
       get api_users_path, :params => { :users => create(:user, :deleted).id }, :headers => bearer_authorization_header(good_token.token)
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
 
       get api_users_path, :params => { :users => 0 }, :headers => bearer_authorization_header(good_token.token)
-      assert_response :not_found
+      assert_response :success
+      assert_equal "application/xml", response.media_type
+      assert_select "user", :count => 0
     end
 
     def test_gpx_files
index 5750a30b29adc0fcdaa13cf9671734071f3f5ee4..81f12f7cbef8feb3b635d1085495c4c460ec9bdf 100644 (file)
@@ -2,22 +2,24 @@ require "test_helper"
 
 class OAuth2Test < ActionDispatch::IntegrationTest
   def test_oauth2
+    user = create(:user)
     client = create(:oauth_application, :redirect_uri => "https://some.web.app.example.org/callback", :scopes => "read_prefs write_api read_gpx")
     state = SecureRandom.urlsafe_base64(16)
 
-    authorize_client(client, :state => state)
+    authorize_client(user, client, :state => state)
     assert_response :redirect
     code = validate_redirect(client, state)
 
     token = request_token(client, code)
 
-    test_token(token, client)
+    test_token(token, user, client)
   end
 
   def test_oauth2_oob
+    user = create(:user)
     client = create(:oauth_application, :redirect_uri => "urn:ietf:wg:oauth:2.0:oob", :scopes => "read_prefs write_api read_gpx")
 
-    authorize_client(client)
+    authorize_client(user, client)
     assert_response :redirect
     follow_redirect!
     assert_response :success
@@ -28,42 +30,44 @@ class OAuth2Test < ActionDispatch::IntegrationTest
 
     token = request_token(client, code)
 
-    test_token(token, client)
+    test_token(token, user, client)
   end
 
   def test_oauth2_pkce_plain
+    user = create(:user)
     client = create(:oauth_application, :redirect_uri => "https://some.web.app.example.org/callback", :scopes => "read_prefs write_api read_gpx")
     state = SecureRandom.urlsafe_base64(16)
     verifier = SecureRandom.urlsafe_base64(48)
     challenge = verifier
 
-    authorize_client(client, :state => state, :code_challenge => challenge, :code_challenge_method => "plain")
+    authorize_client(user, client, :state => state, :code_challenge => challenge, :code_challenge_method => "plain")
     assert_response :redirect
     code = validate_redirect(client, state)
 
     token = request_token(client, code, verifier)
 
-    test_token(token, client)
+    test_token(token, user, client)
   end
 
   def test_oauth2_pkce_s256
+    user = create(:user)
     client = create(:oauth_application, :redirect_uri => "https://some.web.app.example.org/callback", :scopes => "read_prefs write_api read_gpx")
     state = SecureRandom.urlsafe_base64(16)
     verifier = SecureRandom.urlsafe_base64(48)
     challenge = Base64.urlsafe_encode64(Digest::SHA256.digest(verifier), :padding => false)
 
-    authorize_client(client, :state => state, :code_challenge => challenge, :code_challenge_method => "S256")
+    authorize_client(user, client, :state => state, :code_challenge => challenge, :code_challenge_method => "S256")
     assert_response :redirect
     code = validate_redirect(client, state)
 
     token = request_token(client, code, verifier)
 
-    test_token(token, client)
+    test_token(token, user, client)
   end
 
   private
 
-  def authorize_client(client, options = {})
+  def authorize_client(user, client, options = {})
     options = options.merge(:client_id => client.uid,
                             :redirect_uri => client.redirect_uri,
                             :response_type => "code",
@@ -73,8 +77,6 @@ class OAuth2Test < ActionDispatch::IntegrationTest
     assert_response :redirect
     assert_redirected_to login_path(:referer => request.fullpath)
 
-    user = create(:user)
-
     post login_path(:username => user.email, :password => "test")
     follow_redirect!
     assert_response :success
@@ -138,7 +140,7 @@ class OAuth2Test < ActionDispatch::IntegrationTest
     token["access_token"]
   end
 
-  def test_token(token, client)
+  def test_token(token, user, client)
     get user_preferences_path
     assert_response :unauthorized
 
@@ -156,6 +158,21 @@ class OAuth2Test < ActionDispatch::IntegrationTest
     get api_trace_path(:id => 2), :headers => auth_header
     assert_response :forbidden
 
+    user.suspend!
+
+    get user_preferences_path, :headers => auth_header
+    assert_response :forbidden
+
+    user.hide!
+
+    get user_preferences_path, :headers => auth_header
+    assert_response :forbidden
+
+    user.unhide!
+
+    get user_preferences_path, :headers => auth_header
+    assert_response :success
+
     post oauth_revoke_path(:token => token)
     assert_response :forbidden
 
index 2c473aac5e799040cff309c6ebf43411bbd9b991..70f161fc9e2a9fb7cacf810ae733789dbcffd36e 100644 (file)
@@ -5,12 +5,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
 
   def test_oauth10_web_app
     client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
+    user = create(:user)
 
-    get "/login"
-    follow_redirect!
-    post "/login", :params => { :username => client.user.email, :password => "test" }
-    follow_redirect!
-    assert_response :success
+    session_for(user)
 
     oauth10_without_callback(client)
     oauth10_with_callback(client, "http://another.web.app.example.org/callback")
@@ -19,12 +16,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
 
   def test_oauth10_desktop_app
     client = create(:client_application, :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
+    user = create(:user)
 
-    get "/login"
-    follow_redirect!
-    post "/login", :params => { :username => client.user.email, :password => "test" }
-    follow_redirect!
-    assert_response :success
+    session_for(user)
 
     oauth10_without_callback(client)
     oauth10_refused(client)
@@ -32,12 +26,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
 
   def test_oauth10a_web_app
     client = create(:client_application, :callback_url => "http://some.web.app.example.org/callback", :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
+    user = create(:user)
 
-    get "/login"
-    follow_redirect!
-    post "/login", :params => { :username => client.user.email, :password => "test" }
-    follow_redirect!
-    assert_response :success
+    session_for(user)
 
     oauth10a_without_callback(client)
     oauth10a_with_callback(client, "http://another.web.app.example.org/callback")
@@ -46,12 +37,9 @@ class OAuthTest < ActionDispatch::IntegrationTest
 
   def test_oauth10a_desktop_app
     client = create(:client_application, :allow_read_prefs => true, :allow_write_api => true, :allow_read_gpx => true)
+    user = create(:user)
 
-    get "/login"
-    follow_redirect!
-    post "/login", :params => { :username => client.user.email, :password => "test" }
-    follow_redirect!
-    assert_response :success
+    session_for(user)
 
     oauth10a_without_callback(client)
     oauth10a_refused(client)
@@ -95,12 +83,28 @@ class OAuthTest < ActionDispatch::IntegrationTest
     assert_nil token.invalidated_at
     assert_allowed token, [:allow_read_prefs]
 
+    post logout_path
+
     signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
     assert_response :success
 
     signed_get "/api/0.6/gpx/2", :oauth => { :token => token }
     assert_response :forbidden
 
+    token.user.suspend!
+    signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.hide!
+    signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.unhide!
+    signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
+    assert_response :success
+
+    session_for(token.user)
+
     post "/oauth/revoke", :params => { :token => token.token }
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by(:token => token.token)
@@ -173,13 +177,29 @@ class OAuthTest < ActionDispatch::IntegrationTest
     assert_nil token.invalidated_at
     assert_allowed token, [:allow_write_api, :allow_read_gpx]
 
-    trace = create(:trace, :user => client.user)
+    post logout_path
+
+    trace = create(:trace, :user => token.user)
     signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
     assert_response :success
 
     signed_get "/api/0.6/user/details", :oauth => { :token => token }
     assert_response :forbidden
 
+    token.user.suspend!
+    signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.hide!
+    signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.unhide!
+    signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
+    assert_response :success
+
+    session_for(token.user)
+
     post "/oauth/revoke", :params => { :token => token.token }
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by(:token => token.token)
@@ -232,13 +252,29 @@ class OAuthTest < ActionDispatch::IntegrationTest
     assert_nil token.invalidated_at
     assert_allowed token, [:allow_read_prefs]
 
+    post logout_path
+
     signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
     assert_response :success
 
-    trace = create(:trace, :user => client.user)
+    trace = create(:trace, :user => token.user)
     signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
     assert_response :forbidden
 
+    token.user.suspend!
+    signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.hide!
+    signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.unhide!
+    signed_get "/api/0.6/user/preferences", :oauth => { :token => token }
+    assert_response :success
+
+    session_for(token.user)
+
     post "/oauth/revoke", :params => { :token => token.token }
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by(:token => token.token)
@@ -283,13 +319,29 @@ class OAuthTest < ActionDispatch::IntegrationTest
     assert_nil token.invalidated_at
     assert_allowed token, [:allow_write_api, :allow_read_gpx]
 
-    trace = create(:trace, :user => client.user)
+    post logout_path
+
+    trace = create(:trace, :user => token.user)
     signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
     assert_response :success
 
     signed_get "/api/0.6/user/details", :oauth => { :token => token }
     assert_response :forbidden
 
+    token.user.suspend!
+    signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.hide!
+    signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
+    assert_response :forbidden
+
+    token.user.unhide!
+    signed_get "/api/0.6/gpx/#{trace.id}", :oauth => { :token => token }
+    assert_response :success
+
+    session_for(token.user)
+
     post "/oauth/revoke", :params => { :token => token.token }
     assert_redirected_to oauth_clients_url(token.user.display_name)
     token = OauthToken.find_by(:token => token.token)
index 6256a8aefce1cd8bc7ae2e9847f7e85d15d77e1c..77abf634ce8a91ebb356e8a93ec7ee32f68a98d9 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@^8.47.0":
-  version "8.47.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d"
-  integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==
+"@eslint/js@8.48.0":
+  version "8.48.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.48.0.tgz#642633964e217905436033a2bd08bf322849b7fb"
+  integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==
 
 "@humanwhocodes/config-array@^0.11.10":
   version "0.11.10"
@@ -224,14 +224,14 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
   integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
 
 eslint@^8.0.0:
-  version "8.47.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806"
-  integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==
+  version "8.48.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.48.0.tgz#bf9998ba520063907ba7bfe4c480dc8be03c2155"
+  integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.6.1"
     "@eslint/eslintrc" "^2.1.2"
-    "@eslint/js" "^8.47.0"
+    "@eslint/js" "8.48.0"
     "@humanwhocodes/config-array" "^0.11.10"
     "@humanwhocodes/module-importer" "^1.0.1"
     "@nodelib/fs.walk" "^1.2.8"
@@ -568,9 +568,9 @@ optionator@^0.9.3:
     type-check "^0.4.0"
 
 osm-community-index@^5.2.0:
-  version "5.5.5"
-  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.5.5.tgz#dd7a4d333d01dc83ac1b5cf83c3f0f99f4339ec4"
-  integrity sha512-bGl9WqkfPhIsAkv62QW2erlTQolSjMODmiH0Dp7ld2k1bTUz1D3ZRKRyjGi7fFuUwlrkE1MrbP0mRFezmPbaww==
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.6.0.tgz#b2361fce7ded723844b0ed68d47bddfc4a8cb240"
+  integrity sha512-C5AqEWidBIgKeaJKQwuPWvDqSzm9CpZgDbHDi+k4+ZCHBazRQjnl7TpWVv2/fQWMqsJL3I5qzh19rXBTWMWL1A==
   dependencies:
     diacritics "^1.3.0"