From: Tom Hughes
Date: Sun, 4 Nov 2018 14:49:27 +0000 (+0000)
Subject: Merge remote-tracking branch 'upstream/pull/2042'
X-Git-Tag: live~3805
X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/acfbc091982fbf74baeef7d16ff7d84f63c84951?hp=d9a48d66f977afbe9d5e196e9e22d882b16b3566
Merge remote-tracking branch 'upstream/pull/2042'
---
diff --git a/.mailmap b/.mailmap
index 29f21fde6..761478b56 100644
--- a/.mailmap
+++ b/.mailmap
@@ -7,4 +7,4 @@ Kai Krueger
Michael Glanznig
Petr Kadlec
Richard Fairhurst
-Simon Poole
+Simon Poole
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 8fc701cb3..7d2c583eb 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -19,7 +19,7 @@ Lint/AssignmentInCondition:
- 'app/helpers/application_helper.rb'
- 'app/helpers/browse_helper.rb'
- 'app/models/client_application.rb'
- - 'app/models/notifier.rb'
+ - 'app/mailers/notifier.rb'
- 'lib/nominatim.rb'
- 'lib/osm.rb'
- 'script/deliver-message'
@@ -32,7 +32,7 @@ Lint/HandleExceptions:
# Offense count: 692
Metrics/AbcSize:
- Max: 280
+ Max: 283
# Offense count: 40
# Configuration parameters: CountComments, ExcludedMethods.
@@ -48,7 +48,7 @@ Metrics/BlockNesting:
# Offense count: 63
# Configuration parameters: CountComments.
Metrics/ClassLength:
- Max: 1795
+ Max: 1801
# Offense count: 72
Metrics/CyclomaticComplexity:
diff --git a/.travis.yml b/.travis.yml
index 8ce7f5f30..3b56d2b4b 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,7 +1,7 @@
sudo: false
language: ruby
rvm:
- - 2.3.1
+ - 2.3.3
cache: bundler
addons:
postgresql: 9.5
diff --git a/Gemfile b/Gemfile
index 9ba270313..05bfc6cbd 100644
--- a/Gemfile
+++ b/Gemfile
@@ -45,7 +45,9 @@ gem "image_optim_rails"
# Load rails plugins
gem "actionpack-page_caching"
+gem "cancancan"
gem "composite_primary_keys", "~> 11.0.0"
+gem "delayed_job_active_record"
gem "dynamic_form"
gem "http_accept_language", "~> 2.0.0"
gem "i18n-js", ">= 3.0.0"
diff --git a/Gemfile.lock b/Gemfile.lock
index 76a31e169..72f769929 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -21,7 +21,7 @@ GEM
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
- actionpack-page_caching (1.1.0)
+ actionpack-page_caching (1.1.1)
actionpack (>= 4.0.0, < 6)
actionview (5.2.0)
activesupport (= 5.2.0)
@@ -66,6 +66,7 @@ GEM
bootsnap (1.3.2)
msgpack (~> 1.0)
builder (3.2.3)
+ cancancan (2.1.3)
canonical-rails (0.2.4)
rails (>= 4.1, < 5.3)
capybara (2.18.0)
@@ -97,8 +98,13 @@ GEM
crack (0.4.3)
safe_yaml (~> 1.0.0)
crass (1.0.4)
- dalli (2.7.8)
+ dalli (2.7.9)
debug_inspector (0.0.3)
+ delayed_job (4.1.5)
+ activesupport (>= 3.0, < 5.3)
+ delayed_job_active_record (4.1.3)
+ activerecord (>= 3.0, < 5.3)
+ delayed_job (>= 3.0, < 5)
docile (1.3.1)
dynamic_form (1.1.4)
erubi (1.7.1)
@@ -109,7 +115,7 @@ GEM
factory_bot_rails (4.11.1)
factory_bot (~> 4.11.1)
railties (>= 3.0.0)
- faraday (0.12.2)
+ faraday (0.15.3)
multipart-post (>= 1.2, < 3)
ffi (1.9.25)
fspath (3.1.0)
@@ -122,9 +128,9 @@ GEM
http_accept_language (2.0.5)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
- i18n-js (3.0.11)
+ i18n-js (3.1.0)
i18n (>= 0.6.6, < 2)
- image_optim (0.26.2)
+ image_optim (0.26.3)
exifr (~> 1.2, >= 1.2.2)
fspath (~> 3.0)
image_size (>= 1.5, < 3)
@@ -160,14 +166,14 @@ GEM
rb-inotify (~> 0.9, >= 0.9.7)
ruby_dep (~> 1.2)
logstash-event (1.2.02)
- logstasher (1.2.2)
+ logstasher (1.3.0)
activesupport (>= 4.0)
logstash-event (~> 1.2.0)
request_store
- loofah (2.2.2)
+ loofah (2.2.3)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
- mail (2.7.0)
+ mail (2.7.1)
mini_mime (>= 0.1.1)
marcel (0.3.3)
mimemagic (~> 0.3.2)
@@ -184,19 +190,19 @@ GEM
multi_xml (0.6.0)
multipart-post (2.0.0)
nio4r (2.3.1)
- nokogiri (1.8.4)
+ nokogiri (1.8.5)
mini_portile2 (~> 2.3.0)
- nokogumbo (1.5.0)
- nokogiri
+ nokogumbo (2.0.0)
+ nokogiri (~> 1.8, >= 1.8.4)
oauth (0.4.7)
oauth-plugin (0.5.1)
multi_json
oauth (~> 0.4.4)
oauth2 (>= 0.5.0)
rack
- oauth2 (1.4.0)
- faraday (>= 0.8, < 0.13)
- jwt (~> 1.0)
+ oauth2 (1.4.1)
+ faraday (>= 0.8, < 0.16.0)
+ jwt (>= 1.0, < 3.0)
multi_json (~> 1.3)
multi_xml (~> 0.5)
rack (>= 1.2, < 3)
@@ -235,7 +241,7 @@ GEM
mimemagic (~> 0.3.0)
terrapin (~> 0.6.0)
parallel (1.12.1)
- parser (2.5.1.2)
+ parser (2.5.3.0)
ast (~> 2.4.0)
pg (0.21.0)
poltergeist (1.18.1)
@@ -243,8 +249,8 @@ GEM
cliver (~> 0.3.1)
websocket-driver (>= 0.2.0)
powerpack (0.1.2)
- progress (3.4.0)
- psych (3.0.2)
+ progress (3.5.0)
+ psych (3.0.3)
public_suffix (3.0.3)
puma (3.12.0)
quad_tile (1.0.1)
@@ -300,36 +306,31 @@ GEM
request_store (1.4.1)
rack (>= 1.4)
rinku (2.0.4)
- rotp (3.3.1)
- rubocop (0.59.1)
+ rotp (4.0.2)
+ addressable (~> 2.5)
+ rubocop (0.60.0)
jaro_winkler (~> 1.5.1)
parallel (~> 1.10)
parser (>= 2.5, != 2.5.1.1)
powerpack (~> 0.1)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
- unicode-display_width (~> 1.0, >= 1.0.1)
+ unicode-display_width (~> 1.4.0)
ruby-openid (2.7.0)
ruby-progressbar (1.10.0)
ruby_dep (1.5.0)
safe_yaml (1.0.4)
- sanitize (4.6.6)
+ sanitize (5.0.0)
crass (~> 1.0.2)
- nokogiri (>= 1.4.4)
- nokogumbo (~> 1.4)
- sass (3.6.0)
- sass-listen (~> 4.0.0)
- sass-listen (4.0.0)
- rb-fsevent (~> 0.9, >= 0.9.4)
- rb-inotify (~> 0.9, >= 0.9.7)
- sassc (1.12.1)
+ nokogiri (>= 1.8.0)
+ nokogumbo (~> 2.0)
+ sassc (2.0.0)
ffi (~> 1.9.6)
- sass (>= 3.3.0)
- sassc-rails (1.3.0)
+ rake
+ sassc-rails (2.0.0)
railties (>= 4.0.0)
- sass
- sassc (~> 1.9)
- sprockets (> 2.11)
+ sassc (>= 2.0)
+ sprockets (> 3.0)
sprockets-rails
tilt
secure_headers (6.0.0)
@@ -355,7 +356,7 @@ GEM
thor (0.19.4)
thread_safe (0.3.6)
tilt (2.0.8)
- tins (1.16.3)
+ tins (1.17.0)
tzinfo (1.2.5)
thread_safe (~> 0.1)
uglifier (4.1.19)
@@ -363,7 +364,7 @@ GEM
unicode-display_width (1.4.0)
validates_email_format_of (1.6.3)
i18n
- vendorer (0.1.16)
+ vendorer (0.2.0)
webmock (3.4.2)
addressable (>= 2.3.6)
crack (>= 0.3.2)
@@ -371,7 +372,7 @@ GEM
websocket-driver (0.7.0)
websocket-extensions (>= 0.1.0)
websocket-extensions (0.1.3)
- xpath (3.1.0)
+ xpath (3.2.0)
nokogiri (~> 1.8)
PLATFORMS
@@ -387,12 +388,14 @@ DEPENDENCIES
bigdecimal (~> 1.1.0)
binding_of_caller
bootsnap (>= 1.1.0)
+ cancancan
canonical-rails
capybara (~> 2.13)
coffee-rails (~> 4.2)
composite_primary_keys (~> 11.0.0)
coveralls
dalli
+ delayed_job_active_record
dynamic_form
factory_bot_rails
faraday
diff --git a/app/abilities/ability.rb b/app/abilities/ability.rb
new file mode 100644
index 000000000..f55f19e4e
--- /dev/null
+++ b/app/abilities/ability.rb
@@ -0,0 +1,57 @@
+# frozen_string_literal: true
+
+class Ability
+ include CanCan::Ability
+
+ def initialize(user)
+ can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :preview, :copyright, :key, :id], :site
+ can [:index, :rss, :show, :comments], DiaryEntry
+ can [:search, :search_latlon, :search_ca_postcode, :search_osm_nominatim,
+ :search_geonames, :search_osm_nominatim_reverse, :search_geonames_reverse], :geocoder
+
+ if user
+ can :welcome, :site
+ can [:create, :edit, :comment, :subscribe, :unsubscribe], DiaryEntry
+ can [:new, :create], Report
+ can [:read, :read_one, :update, :update_one, :delete_one], UserPreference
+
+ if user.moderator?
+ can [:index, :show, :resolve, :ignore, :reopen], Issue
+ can :create, IssueComment
+ end
+
+ if user.administrator?
+ can [:hide, :hidecomment], [DiaryEntry, DiaryComment]
+ can [:index, :show, :resolve, :ignore, :reopen], Issue
+ can :create, IssueComment
+ end
+ end
+
+ # Define abilities for the passed in user here. For example:
+ #
+ # user ||= User.new # guest user (not logged in)
+ # if user.admin?
+ # can :manage, :all
+ # else
+ # can :read, :all
+ # end
+ #
+ # The first argument to `can` is the action you are giving the user
+ # permission to do.
+ # If you pass :manage it will apply to every action. Other common actions
+ # here are :read, :create, :update and :destroy.
+ #
+ # The second argument is the resource the user can perform the action on.
+ # If you pass :all it will apply to every resource. Otherwise pass a Ruby
+ # class of the resource.
+ #
+ # The third argument is an optional hash of conditions to further filter the
+ # objects.
+ # For example, here the user can only update published articles.
+ #
+ # can :update, Article, :published => true
+ #
+ # See the wiki for details:
+ # https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities
+ end
+end
diff --git a/app/abilities/capability.rb b/app/abilities/capability.rb
new file mode 100644
index 000000000..2a5c92774
--- /dev/null
+++ b/app/abilities/capability.rb
@@ -0,0 +1,16 @@
+# frozen_string_literal: true
+
+class Capability
+ include CanCan::Ability
+
+ def initialize(token)
+ can [:read, :read_one], UserPreference if capability?(token, :allow_read_prefs)
+ can [:update, :update_one, :delete_one], UserPreference if capability?(token, :allow_write_prefs)
+ end
+
+ private
+
+ def capability?(token, cap)
+ token&.read_attribute(cap)
+ end
+end
diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss
index 56c4515d0..a16f7d85a 100644
--- a/app/assets/stylesheets/common.scss
+++ b/app/assets/stylesheets/common.scss
@@ -1324,11 +1324,11 @@ tr.turn:hover {
#maxlat { margin-top: -1px; }
#minlon {
float: left;
- margin-left: -1px;
+ /* no-r2 */ margin-left: -1px;
}
#maxlon {
float: right;
- margin-right: -1px;
+ /* no-r2 */ margin-right: -1px;
}
#minlat { margin-bottom: 0; }
}
@@ -2314,6 +2314,7 @@ a.button {
font-size: 13px;
background: #e8e8e8;
padding: 2px 3px;
+ white-space: pre-wrap;
code {
padding: 0;
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index bd1995014..1df6dd7d1 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -3,6 +3,8 @@ class ApplicationController < ActionController::Base
protect_from_forgery :with => :exception
+ rescue_from CanCan::AccessDenied, :with => :deny_access
+
before_action :fetch_body
around_action :better_errors_allow_inline, :if => proc { Rails.env.development? }
@@ -22,7 +24,7 @@ class ApplicationController < ActionController::Base
# don't allow access to any auth-requiring part of the site unless
# the new CTs have been seen (and accept/decline chosen).
elsif !current_user.terms_seen && flash[:skip_terms].nil?
- flash[:notice] = t "user.terms.you need to accept or decline"
+ flash[:notice] = t "users.terms.you need to accept or decline"
if params[:referer]
redirect_to :controller => "users", :action => "terms", :referer => params[:referer]
else
@@ -466,6 +468,29 @@ class ApplicationController < ActionController::Base
raise
end
+ def current_ability
+ # Add in capabilities from the oauth token if it exists and is a valid access token
+ if Authenticator.new(self, [:token]).allow?
+ Ability.new(current_user).merge(Capability.new(current_token))
+ else
+ Ability.new(current_user)
+ end
+ end
+
+ def deny_access(_exception)
+ if current_token
+ set_locale
+ report_error t("oauth.permissions.missing"), :forbidden
+ elsif current_user
+ set_locale
+ report_error t("application.permission_denied"), :forbidden
+ elsif request.get?
+ redirect_to :controller => "users", :action => "login", :referer => request.fullpath
+ else
+ head :forbidden
+ end
+ end
+
private
# extract authorisation credentials from headers, returns user = nil if none
diff --git a/app/controllers/changeset_controller.rb b/app/controllers/changeset_controller.rb
index c03ed9056..4ce205fd1 100644
--- a/app/controllers/changeset_controller.rb
+++ b/app/controllers/changeset_controller.rb
@@ -332,7 +332,7 @@ class ChangesetController < ApplicationController
# Notify current subscribers of the new comment
changeset.subscribers.visible.each do |user|
- Notifier.changeset_comment_notification(comment, user).deliver_now if current_user != user
+ Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user
end
# Add the commenter to the subscribers if necessary
diff --git a/app/controllers/diary_entry_controller.rb b/app/controllers/diary_entry_controller.rb
index 723fff17e..70cb1654d 100644
--- a/app/controllers/diary_entry_controller.rb
+++ b/app/controllers/diary_entry_controller.rb
@@ -3,11 +3,12 @@ class DiaryEntryController < ApplicationController
before_action :authorize_web
before_action :set_locale
- before_action :require_user, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
+
+ authorize_resource
+
before_action :lookup_user, :only => [:show, :comments]
before_action :check_database_readable
before_action :check_database_writable, :only => [:new, :edit, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
- before_action :require_administrator, :only => [:hide, :hidecomment]
before_action :allow_thirdparty_images, :only => [:new, :edit, :index, :show, :comments]
def new
@@ -65,7 +66,7 @@ class DiaryEntryController < ApplicationController
# Notify current subscribers of the new comment
@entry.subscribers.visible.each do |user|
- Notifier.diary_comment_notification(@diary_comment, user).deliver_now if current_user != user
+ Notifier.diary_comment_notification(@diary_comment, user).deliver_later if current_user != user
end
# Add the commenter to the subscribers if necessary
@@ -215,6 +216,22 @@ class DiaryEntryController < ApplicationController
private
+ # This is required because, being a default-deny system, cancancan
+ # _cannot_ tell you the reason you were denied access; and so
+ # the "nice" feedback presenting next steps can't be gleaned from
+ # the exception
+ ##
+ # for the hide actions, require that the user is a administrator, or fill out
+ # a helpful error message and return them to the user page.
+ def deny_access(exception)
+ if current_user && exception.action.in?([:hide, :hidecomment])
+ flash[:error] = t("users.filter.not_an_administrator")
+ redirect_to :action => "show"
+ else
+ super
+ end
+ end
+
##
# return permitted diary entry parameters
def entry_params
@@ -229,16 +246,6 @@ class DiaryEntryController < ApplicationController
params.require(:diary_comment).permit(:body)
end
- ##
- # require that the user is a administrator, or fill out a helpful error message
- # and return them to the user page.
- def require_administrator
- unless current_user.administrator?
- flash[:error] = t("user.filter.not_an_administrator")
- redirect_to :action => "show"
- end
- end
-
##
# decide on a location for the diary entry map
def set_map_location
diff --git a/app/controllers/issue_comments_controller.rb b/app/controllers/issue_comments_controller.rb
index 8d1acec75..0e4a7079e 100644
--- a/app/controllers/issue_comments_controller.rb
+++ b/app/controllers/issue_comments_controller.rb
@@ -3,8 +3,8 @@ class IssueCommentsController < ApplicationController
before_action :authorize_web
before_action :set_locale
- before_action :require_user
- before_action :check_permission
+
+ authorize_resource
def create
@issue = Issue.find(params[:issue_id])
@@ -22,10 +22,12 @@ class IssueCommentsController < ApplicationController
params.require(:issue_comment).permit(:body)
end
- def check_permission
- unless current_user.administrator? || current_user.moderator?
+ def deny_access(_exception)
+ if current_user
flash[:error] = t("application.require_moderator_or_admin.not_a_moderator_or_admin")
redirect_to root_path
+ else
+ super
end
end
diff --git a/app/controllers/issues_controller.rb b/app/controllers/issues_controller.rb
index ad38454f0..8943f2d4a 100644
--- a/app/controllers/issues_controller.rb
+++ b/app/controllers/issues_controller.rb
@@ -3,8 +3,9 @@ class IssuesController < ApplicationController
before_action :authorize_web
before_action :set_locale
- before_action :require_user
- before_action :check_permission
+
+ authorize_resource
+
before_action :find_issue, :only => [:show, :resolve, :reopen, :ignore]
def index
@@ -82,10 +83,12 @@ class IssuesController < ApplicationController
@issue = Issue.find(params[:id])
end
- def check_permission
- unless current_user.administrator? || current_user.moderator?
+ def deny_access(_exception)
+ if current_user
flash[:error] = t("application.require_moderator_or_admin.not_a_moderator_or_admin")
redirect_to root_path
+ else
+ super
end
end
end
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 13a395da8..c93c998f0 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -29,7 +29,7 @@ class MessagesController < ApplicationController
render :action => "new"
elsif @message.save
flash[:notice] = t ".message_sent"
- Notifier.message_notification(@message).deliver_now
+ Notifier.message_notification(@message).deliver_later
redirect_to :action => :inbox
else
render :action => "new"
diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb
index 95566a1a1..9cdc38446 100644
--- a/app/controllers/notes_controller.rb
+++ b/app/controllers/notes_controller.rb
@@ -387,7 +387,7 @@ class NotesController < ApplicationController
comment = note.comments.create!(attributes)
note.comments.map(&:author).uniq.each do |user|
- Notifier.note_comment_notification(comment, user).deliver_now if notify && user && user != current_user && user.visible?
+ Notifier.note_comment_notification(comment, user).deliver_later if notify && user && user != current_user && user.visible?
end
end
end
diff --git a/app/controllers/reports_controller.rb b/app/controllers/reports_controller.rb
index ef87a8699..808726819 100644
--- a/app/controllers/reports_controller.rb
+++ b/app/controllers/reports_controller.rb
@@ -3,7 +3,8 @@ class ReportsController < ApplicationController
before_action :authorize_web
before_action :set_locale
- before_action :require_user
+
+ authorize_resource
def new
if required_new_report_params_present?
diff --git a/app/controllers/site_controller.rb b/app/controllers/site_controller.rb
index efb77e2f5..4b960e4e2 100644
--- a/app/controllers/site_controller.rb
+++ b/app/controllers/site_controller.rb
@@ -6,10 +6,11 @@ class SiteController < ApplicationController
before_action :set_locale
before_action :redirect_browse_params, :only => :index
before_action :redirect_map_params, :only => [:index, :edit, :export]
- before_action :require_user, :only => [:welcome]
before_action :require_oauth, :only => [:index]
before_action :update_totp, :only => [:index]
+ authorize_resource :class => false
+
def index
session[:location] ||= OSM.ip_location(request.env["REMOTE_ADDR"]) unless STATUS == :database_readonly || STATUS == :database_offline
end
diff --git a/app/controllers/user_preferences_controller.rb b/app/controllers/user_preferences_controller.rb
index 0aa2e8d52..915c847de 100644
--- a/app/controllers/user_preferences_controller.rb
+++ b/app/controllers/user_preferences_controller.rb
@@ -2,8 +2,9 @@
class UserPreferencesController < ApplicationController
skip_before_action :verify_authenticity_token
before_action :authorize
- before_action :require_allow_read_prefs, :only => [:read_one, :read]
- before_action :require_allow_write_prefs, :except => [:read_one, :read]
+
+ authorize_resource
+
around_action :api_call_handle_error
##
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index d18cf188c..016d7c87d 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -107,7 +107,7 @@ class UsersController < ApplicationController
successful_login(current_user)
else
session[:token] = current_user.tokens.create.token
- Notifier.signup_confirm(current_user, current_user.tokens.create(:referer => referer)).deliver_now
+ Notifier.signup_confirm(current_user, current_user.tokens.create(:referer => referer)).deliver_later
redirect_to :action => "confirm", :display_name => current_user.display_name
end
else
@@ -158,7 +158,7 @@ class UsersController < ApplicationController
if user
token = user.tokens.create
- Notifier.lost_password(user, token).deliver_now
+ Notifier.lost_password(user, token).deliver_later
flash[:notice] = t "users.lost_password.notice email on way"
redirect_to :action => "login"
else
@@ -339,7 +339,7 @@ class UsersController < ApplicationController
if user.nil? || token.nil? || token.user != user
flash[:error] = t "users.confirm_resend.failure", :name => params[:display_name]
else
- Notifier.signup_confirm(user, user.tokens.create).deliver_now
+ Notifier.signup_confirm(user, user.tokens.create).deliver_later
flash[:notice] = t("users.confirm_resend.success", :email => user.email, :sender => SUPPORT_EMAIL).html_safe
end
@@ -432,7 +432,7 @@ class UsersController < ApplicationController
flash[:warning] = t "users.make_friend.already_a_friend", :name => @new_friend.display_name
elsif friend.save
flash[:notice] = t "users.make_friend.success", :name => @new_friend.display_name
- Notifier.friend_notification(friend).deliver_now
+ Notifier.friend_notification(friend).deliver_later
else
friend.add_error(t("users.make_friend.failed", :name => @new_friend.display_name))
end
@@ -735,7 +735,7 @@ class UsersController < ApplicationController
flash.now[:notice] = t "users.account.flash update success confirm needed"
begin
- Notifier.email_confirm(user, user.tokens.create).deliver_now
+ Notifier.email_confirm(user, user.tokens.create).deliver_later
rescue StandardError
# Ignore errors sending email
end
diff --git a/app/models/notifier.rb b/app/mailers/notifier.rb
similarity index 100%
rename from app/models/notifier.rb
rename to app/mailers/notifier.rb
diff --git a/lib/geo_record.rb b/app/models/concerns/geo_record.rb
similarity index 89%
rename from lib/geo_record.rb
rename to app/models/concerns/geo_record.rb
index e02734ec9..06049c295 100644
--- a/lib/geo_record.rb
+++ b/app/models/concerns/geo_record.rb
@@ -1,6 +1,8 @@
require "delegate"
module GeoRecord
+ extend ActiveSupport::Concern
+
# Ensure that when coordinates are printed that they are always in decimal degrees,
# and not e.g. 4.0e-05
# Unfortunately you can't extend Numeric classes directly (e.g. `Coord < Float`).
@@ -19,9 +21,9 @@ module GeoRecord
# the database.
SCALE = 10000000
- def self.included(base)
- base.scope :bbox, ->(bbox) { base.where(OSM.sql_for_area(bbox)) }
- base.before_save :update_tile
+ included do
+ scope :bbox, ->(bbox) { where(OSM.sql_for_area(bbox)) }
+ before_save :update_tile
end
# Is this node within -90 >= latitude >= 90 and -180 >= longitude >= 180
diff --git a/lib/not_redactable.rb b/app/models/concerns/not_redactable.rb
similarity index 78%
rename from lib/not_redactable.rb
rename to app/models/concerns/not_redactable.rb
index 6a5773296..2d721530f 100644
--- a/lib/not_redactable.rb
+++ b/app/models/concerns/not_redactable.rb
@@ -1,6 +1,6 @@
-require "osm"
-
module NotRedactable
+ extend ActiveSupport::Concern
+
def redacted?
false
end
diff --git a/lib/object_metadata.rb b/app/models/concerns/object_metadata.rb
similarity index 97%
rename from lib/object_metadata.rb
rename to app/models/concerns/object_metadata.rb
index c765df526..dcfde889c 100644
--- a/lib/object_metadata.rb
+++ b/app/models/concerns/object_metadata.rb
@@ -1,4 +1,6 @@
module ObjectMetadata
+ extend ActiveSupport::Concern
+
def add_metadata_to_xml_node(el, osm, changeset_cache, user_display_name_cache)
el["changeset"] = osm.changeset_id.to_s
el["redacted"] = osm.redaction.id.to_s if osm.redacted?
diff --git a/app/models/relation.rb b/app/models/relation.rb
index 202db12da..f55711a69 100644
--- a/app/models/relation.rb
+++ b/app/models/relation.rb
@@ -384,7 +384,9 @@ class Relation < ActiveRecord::Base
changed_members.collect { |type, _id, _role| type == "Relation" }
.inject(false) { |acc, elem| acc || elem }
- update_members = if tags_changed || any_relations
+ # if the relation is being deleted tags_changed will be true and members empty
+ # so we need to use changed_members to create a correct bounding box
+ update_members = if visible && (tags_changed || any_relations)
# add all non-relation bounding boxes to the changeset
# FIXME: check for tag changes along with element deletions and
# make sure that the deleted element's bounding box is hit.
diff --git a/app/views/layouts/_header.html.erb b/app/views/layouts/_header.html.erb
index e17c6a77b..946f95feb 100644
--- a/app/views/layouts/_header.html.erb
+++ b/app/views/layouts/_header.html.erb
@@ -54,7 +54,7 @@
<%= t 'layouts.more' %>
-
+
<%= t '.description' %>
<%= @redaction.description.to_html %>
-
+
<% if current_user and current_user.moderator? %>
diff --git a/app/views/users/_contact.html.erb b/app/views/users/_contact.html.erb
index bcc2faf35..ab56ce3e8 100644
--- a/app/views/users/_contact.html.erb
+++ b/app/views/users/_contact.html.erb
@@ -14,16 +14,16 @@
<% if @user.home_lon and @user.home_lat and contact.home_lon and contact.home_lat %>
<% distance = @user.distance(contact) %>
<% if distance < 1 %>
- (<%= t 'user.show.m away', :count => (distance * 1000).round %>)
+ (<%= t 'users.show.m away', :count => (distance * 1000).round %>)
<% else %>
- (<%= t 'user.show.km away', :count => distance.round %>)
+ (<%= t 'users.show.km away', :count => distance.round %>)
<% end %>
<% end %>
<% changeset = contact.changesets.first %>
<% if changeset %>
- <%= t('user.show.latest edit', :ago => t('user.show.ago', :time_in_words_ago => time_ago_in_words(changeset.created_at))) %>
+ <%= t('users.show.latest edit', :ago => t('users.show.ago', :time_in_words_ago => time_ago_in_words(changeset.created_at))) %>
<% comment = changeset.tags['comment'].to_s != '' ? changeset.tags['comment'] : t('browse.no_comment') %>
"<%= link_to(comment,
{:controller => 'browse', :action => 'changeset', :id => changeset.id},
diff --git a/app/views/users/blocked.html.erb b/app/views/users/blocked.html.erb
index 93b4972d5..d5be31ef6 100644
--- a/app/views/users/blocked.html.erb
+++ b/app/views/users/blocked.html.erb
@@ -1,10 +1,10 @@
<% content_for :heading do %>
-
<%= t 'user.new.title' %>
+
<%= t 'users.new.title' %>
<% end %>
-
<%= t 'user.new.no_auto_account_create' %>
- <%= raw t 'user.new.contact_webmaster', :webmaster => "mailto:#{SUPPORT_EMAIL}" %>
+ <%= t 'users.new.no_auto_account_create' %>
+ <%= raw t 'users.new.contact_webmaster', :webmaster => "mailto:#{SUPPORT_EMAIL}" %>
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 430032143..9e15487ae 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -99,4 +99,7 @@ Rails.application.configure do
# Enable autoloading of dependencies.
config.enable_dependency_loading = true
+
+ # Use delayed job to queue jobs in production.
+ config.active_job.queue_adapter = :delayed_job
end
diff --git a/config/environments/test.rb b/config/environments/test.rb
index e4652b7ec..38975deef 100644
--- a/config/environments/test.rb
+++ b/config/environments/test.rb
@@ -46,4 +46,7 @@ Rails.application.configure do
# Raises error for missing translations
config.action_view.raise_on_missing_translations = true
+
+ # Use the test adapter for ActiveJob during testing
+ config.active_job.queue_adapter = :test
end
diff --git a/config/initializers/r2.rb b/config/initializers/r2.rb
index 7fbb5c115..4f951b30c 100644
--- a/config/initializers/r2.rb
+++ b/config/initializers/r2.rb
@@ -1,6 +1,6 @@
require "r2"
-class R2ScssProcessor < Sprockets::ScssProcessor
+class R2ScssProcessor < SassC::Rails::ScssTemplate
def self.call(input)
output = super(input)
data = R2.r2(output[:data])
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 9d579e991..c01499106 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -833,7 +833,7 @@ ar:
cosmetics: بائع Ù
ستØضرات تجÙ
ÙÙ
deli: دÙا٠أطعÙ
Ø© Ø´ÙÙØ©
department_store: Ù
تجر Ù
تعدد اÙØ£ÙساÙ
- discount: Ù
Ø٠رخصة
+ discount: Ù
Ø٠عÙاصر خصÙ
doityourself: براعة Ù
ÙزÙÙØ©
dry_cleaning: تÙظÙ٠جاÙ
electronics: Ù
تجر Ø¥ÙÙترÙÙÙات
@@ -1167,14 +1167,14 @@ ar:
subject: '[خرÙطة اÙشارع اÙÙ
ÙتÙØØ©] Ø·Ùب إعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر'
lost_password_plain:
greeting: تØÙاتÙØ
- hopefully_you: شخص Ù
ا (ربÙ
ا Ø£Ùت) Ø·Ùب إعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر ÙØساب openstreetmap.org
- عÙ٠عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ Ùذا.
+ hopefully_you: طاÙب شخص Ù
ا (ربÙ
ا Ø£Ùت) بإعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر عÙÙ Øساب openstreetmap.org
+ ÙعÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ Ùذا.
click_the_link: إذا Ùا٠Ùذا Ø£ÙØªØ ÙÙرجÙ٠اÙضغط عÙ٠اÙرابط أدÙا٠Ùإعادة تعÙÙÙ
ÙÙÙ
Ø© اÙÙ
رÙر.
lost_password_html:
greeting: تØÙاتÙØ
- hopefully_you: شخص Ù
ا (ربÙ
ا Ø£Ùت) Ø·Ùب إعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر ÙØساب openstreetmap.org عÙÙ
- عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ Ùذا.
+ hopefully_you: طاÙب شخص Ù
ا (ربÙ
ا Ø£Ùت) بإعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر عÙÙ Øساب openstreetmap.org
+ ÙعÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ Ùذا.
click_the_link: إذا Ùا٠Ùذا Ø£ÙØªØ ÙÙرجÙ٠اÙضغط عÙ٠اÙرابط أدÙا٠Ùإعادة تعÙÙÙ
ÙÙÙ
Ø© اÙÙ
رÙر.
note_comment_notification:
@@ -1300,16 +1300,14 @@ ar:
اÙصÙر اÙجÙÙØ© ÙأجÙزة GPS ÙاÙخرائط اÙÙ
ÙداÙÙØ© ذات اÙتÙÙÙØ© اÙÙ
ÙØ®Ùضة ÙÙتØÙÙ Ù
Ù Ø°Ù٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ©
دÙÙÙØ© ÙØدÙثة.
community_driven_title: Ùابعة Ù
٠اÙÙ
جتÙ
ع اÙÙ
ØÙÙ
- community_driven_html: |-
- Ù
جتÙ
ع OpenStreetMap Ù
تÙÙع, عاطÙÙ, ÙÙزÙد ÙÙ ÙÙÙ
.
- ÙØ´Ù
٠اÙÙ
ساÙÙ
ÙÙ ÙدÙÙا رساÙ
٠خرائط Ù
تØÙ
سÙÙ, ÙÙ
ØترÙÙ GIS, ÙÙ
ÙÙدسÙÙ
- تشغÙÙ Ø®ÙادÙ
OSM Ø ÙاÙÙ
ساعدات اÙØ¥ÙساÙÙØ© ÙÙÙ
Ùاط٠اÙÙ
تضررة Ù
٠اÙÙÙارث Ø
- ٠أÙثر Ù
Ù Ø°Ù٠بÙØ«Ùر.
- ÙÙ
عرÙØ© اÙÙ
زÙد ع٠اÙÙ
جتÙ
ع Ø Ø§Ùظر
-
-
-
- Ù Ù
ÙÙع
+ community_driven_html: "Ù
جتÙ
ع خرÙطة اÙشارع اÙÙ
ÙتÙØØ© Ù
تÙÙع ÙÙ
تØÙ
س ÙÙÙÙ
Ù ÙÙ ÙÙÙ
Ø
+ \nÙØ´Ù
٠اÙÙ
ساÙÙ
ÙÙ ÙدÙÙا Ù
صÙ
Ù
٠خرائط Ù
تØÙ
سÙÙØ ÙÙ
ÙÙÙÙ ÙظÙ
اÙÙ
عÙÙÙ
ات اÙجغراÙÙØ©Ø
+ ÙاÙÙ
ÙÙدسÙÙ \nاÙØ°ÙÙ ÙدÙرÙÙ Ø®ÙادÙ
خرÙطة اÙشارع اÙÙ
ÙتÙØØ©Ø ÙاÙÙ
ساعدات اÙØ¥ÙساÙÙØ©
+ ÙÙÙ
Ùاط٠اÙÙ
تضررة Ù
٠اÙÙÙارثØ\nÙغÙرÙا اÙÙØ«ÙرØ\nÙÙ
عرÙØ© اÙÙ
زÙد ØÙ٠اÙÙ
جتÙ
ع; راجع
+ \n
Ù
دÙÙØ© خرÙطة اÙشارع اÙÙ
ÙتÙØØ©Ø\nÙ
ÙÙÙ
Ùات اÙÙ
ستخدÙ
Ø\nÙ
Ù
دÙÙات
+ اÙÙ
جتÙ
عØ\nÙÙ
ÙÙع the
Ù
ؤسسة خرÙطة
+ اÙشارع اÙÙ
ÙتÙØØ©."
open_data_title: اÙبÙاÙات اÙÙ
ÙتÙØØ©
open_data_html: "خرÙطة اÙشارع اÙÙ
ÙتÙØØ©
بÙاÙات Ù
ÙتÙØØ©: Ø£Ùت Øر Ù٠استخداÙ
Ùا
Ùأ٠غرض\nطاÙÙ
ا Ø£Ù٠تÙÙÙ
بإØاÙØ© خرÙطة اÙشارع اÙÙ
ÙتÙØØ© ÙاÙÙ
ساÙÙ
ÙÙ ÙÙÙØ§Ø Ø¥Ø°Ø§
@@ -1331,61 +1329,55 @@ ar:
english_link: اÙÙص اÙØ¥ÙجÙÙز٠اÙأصÙÙ
native:
title: ØÙÙ Ùذ٠اÙصÙØØ©
- text: Ø£Ùت تشاÙد اÙÙسخة اÙØ¥ÙجÙÙزÙØ© ÙصÙØØ© ØÙÙ٠اÙÙشر. ÙÙ
ÙÙ٠اÙرجÙع Ø¥ÙÙ %{native_link}Ùª
+ text: Ø£Ùت تشاÙد اÙÙسخة اÙØ¥ÙجÙÙزÙØ© ÙصÙØØ© ØÙÙ٠اÙÙØ´Ø±Ø ÙÙ
ÙÙ٠اÙرجÙع Ø¥ÙÙ %{native_link}Ùª
{native_link} Ù
Ù Ùذ٠اÙصÙØØ© Ø£Ù ÙÙ
ÙÙ٠اÙتÙÙ٠ع٠اÙÙراءة ØÙÙ ØÙÙ٠اÙطبع ÙاÙÙشر
- Ù %{mapping_link}
+ Ù%{mapping_link}
native_link: اÙÙسخة اÙعربÙØ©
mapping_link: ابدأ اÙتخطÙØ·
legal_babble:
title_html: ØÙÙ٠اÙÙشر ÙاÙترخÙص
intro_1_html: |-
- OpenStreetMap
& regØ sup> Ù٠بÙاÙات Ù
ÙتÙØØ© i> Ø Ù
رخص بÙ
Ùجب ÙØªØ Ø§ÙبÙاÙات
- ترخÙص Open Database License (ODbL) بÙاسطة Ù
ؤسسة OpenStreetMap (OSMF).
- intro_2_html: Ø£Ùت Øر ÙÙ Ùسخ ÙتÙزÙع ÙÙÙÙ ÙتÙÙÙ٠بÙاÙاتÙØ§Ø Ø·Ø§ÙÙ
ا ÙÙت تأئتÙ
Ù
- خرÙطة اÙشارع اÙÙ
ÙتÙØØ© ÙاÙÙ
ساÙÙ
ÙÙ ÙÙÙا. إذا عدÙت أ٠بÙÙت عÙ٠اÙبÙاÙات اÙÙ
تÙÙرة
- ÙدÙÙØ§Ø ÙÙا ÙØÙ Ù٠تÙزÙع اÙÙتÙجة Ø¥Ùا تØت ÙÙس اÙترخÙص.
- اÙÙÙد اÙÙاÙÙÙ٠اÙÙاÙ
Ù ÙØ´Ø±Ø ØÙÙÙÙ ÙÙ
سؤÙÙÙاتÙ.
+ OpenStreetMap® عبارة ع٠بÙاÙات Ù
ÙتÙØØ©Ø ÙÙ
رخصة تØت رخصة Ùاعدة بÙاÙات Øرة (ODbL)
+ بÙاسطة Ù
ؤسسة خرÙطة اÙشارع اÙÙ
ÙتÙØØ© (OSMF).
+ intro_2_html: "Ø£Ùت Øر ÙÙ ÙØ³Ø®Ø ÙتÙزÙØ¹Ø ÙÙÙÙ ÙتطÙÙع بÙاÙاتÙØ§Ø \nطاÙÙ
ا Ø£Ù٠تÙÙد
+ خرÙطة اÙشارع اÙÙ
ÙتÙØØ©\nÙاÙÙ
ساÙÙ
ÙÙ ÙÙÙØ§Ø Ø¥Ø°Ø§ عدÙت أ٠بÙÙت عÙ٠بÙاÙاتÙØ§Ø \nÙÙا
+ ÙØÙ Ù٠تÙزÙع اÙÙتÙجة Ø¥Ùا تØت ÙÙس اÙترخÙØµØ Ù\nاÙÙÙد
+ اÙÙاÙÙÙ٠اÙÙاÙ
Ù ÙØ´Ø±Ø ØÙÙÙÙ ÙÙ
سؤÙÙÙاتÙ."
intro_3_html: |-
- رسÙ
اÙخرائط عÙ٠اÙخرÙطة اÙخاص بÙا Ø ÙÙثائÙÙا Ø
- Ù
رخصة بÙ
Ùجب Creative
- اÙترخÙص Attribution-ShareAlike 2.0 (CC BY-SA).
- credit_title_html: ÙÙÙÙØ© ائتÙ
ا٠OpenStreetMap
+ ÙتÙ
ترخÙص رسÙ
اÙخرائط Ù٠بÙاط خرائطÙØ§Ø ÙÙثائÙÙا
+ بÙ
Ùجب ترخÙص رخصة اÙÙ
شاع اÙإبداعÙ: اÙÙسبة-اÙترخÙص باÙÙ
Ø«Ù 2.0 (CC BY-SA).
+ credit_title_html: ÙÙÙÙØ© اÙÙسبة ÙخرÙطة اÙشارع اÙÙ
ÙتÙØØ©
credit_1_html: |-
ÙØ·Ùب Ù
Ù٠استخداÙ
اÙائتÙ
ا٠“© OpenStreetMap
contributors”.
- credit_2_html: |-
- Ùجب Ø£ÙضÙا أ٠تÙØ¶Ø Ø£Ù Ø§ÙبÙاÙات Ù
تÙÙرة تØت Open
- ترخÙص Ùاعدة اÙبÙاÙات Ø Ùإذا Ùا٠استخداÙ
خرÙطتÙا اÙخرÙطة Ø Ùإ٠رسÙ
اÙخرائط ÙÙ
- Ù
رخص ÙÙ CC BY-SA. ÙÙ
ÙÙ٠اÙÙÙاÙ
بذÙ٠ع٠طرÙ٠ربط Ù
- صÙØØ© ØÙÙ٠اÙطبع ÙاÙÙشر ÙØ°Ù .
- بدÙا Ù
Ù Ø°ÙÙ Ø ÙÙشرط إذا ÙÙت تÙÙÙ
بتÙزÙع OSM ÙÙ
- ÙÙ
Ùذج اÙبÙاÙات Ø ÙÙ
ÙÙ٠تسÙ
ÙØ© ÙاÙارتباط Ù
باشرة Ø¥Ù٠اÙترخÙص (اÙتراخÙص). ÙÙ Ùسائ٠اÙإعÙاÙ
- ØÙØ« اÙرÙابط غÙر Ù
Ù
ÙÙØ© (Ù
ث٠اÙأعÙ
ا٠اÙÙ
طبÙعة) Ø ÙØ¥ÙÙا ÙÙØªØ±Ø Ø¹ÙÙÙ
- تÙجÙ٠اÙÙراء Ø¥ÙÙ openstreetmap.org (ربÙ
ا ع٠طرÙ٠اÙتÙسع
- "OpenStreetMap" Ø¥ÙÙ Ùذا اÙعÙÙا٠اÙÙاÙ
Ù) Ø Ø¥ÙÙ opendatacommons.org Ø Ù
- إذا Ùا٠Ù
ÙاسبÙا Ø Ø¥ÙÙ creativecommons.org.
- credit_3_html: 'ÙÙØصÙ٠عÙ٠اÙخرÙطة اÙØ¥ÙÙترÙÙÙØ© ÙÙتصÙØØ Ùجب Ø£Ù ÙظÙر اÙائتÙ
اÙ
+ credit_2_html: "Ùجب Ø£Ùضا أ٠تÙØ¶Ø Ø£Ù Ø§ÙبÙاÙات Ù
تÙÙرة بÙ
Ùجب ترخÙص\nÙاعدة اÙبÙاÙات
+ اÙÙ
ÙتÙØØ©Ø ÙÙÙ ØاÙØ© استخداÙ
بÙاط خرائطÙØ§Ø ÙتÙ
\nترخÙص رسÙ
اÙخرائط ÙÙCC BY-SAØ
+ ÙÙ
ÙÙ٠اÙÙÙاÙ
بذÙ٠ع٠طرÙ٠اÙربط بÙ\nصÙØØ©
+ ØÙÙ٠اÙطبع ÙاÙÙشر ÙØ°Ù.\nبدÙا Ù
Ù Ø°ÙÙØ ÙÙشرط إذا ÙÙت تÙÙÙ
بتÙزÙع خرÙطة
+ اÙشارع اÙÙ
ÙتÙØØ© ÙÙ \nÙÙ
Ùذج بÙاÙØ§ØªØ ÙÙÙ
ÙÙ٠اÙتسÙ
ÙØ© ÙاÙربط Ù
باشرة٠إÙ٠اÙترخÙص(اÙتراخÙص).
+ ÙÙ Ùسائ٠اÙإعÙاÙ
\nØÙØ« اÙرÙابط غÙر Ù
Ù
ÙÙØ© (Ù
ث٠اÙأعÙ
ا٠اÙÙ
طبÙعة)Ø ÙÙØªØ±Ø Ø¹ÙÙÙ
+ \nتÙجÙ٠اÙÙراء Ø¥ÙÙ openstreetmap.org (ربÙ
ا ع٠طرÙ٠تÙسÙع \n'OpenStreetMap'
+ Ø¥ÙÙ Ùذا اÙعÙÙا٠اÙÙاÙ
Ù)Ø ÙØ¥ÙÙ opendatacommons.orgØ \nÙإذا Ùا٠ذÙÙ Ù
ÙاسباØ
+ Ø¥ÙÙ creativecommons.org."
+ credit_3_html: 'ÙÙØصÙ٠عÙ٠اÙخرÙطة اÙØ¥ÙÙترÙÙÙØ© ÙÙتصÙØ; Ùجب Ø£Ù ÙظÙر اÙائتÙ
اÙ
Ù٠زاÙÙØ© Ù
٠اÙخرÙØ·Ø©Ø Ù
Ø«Ùا:'
attribution_example:
- alt: Ù
ثا٠عÙÙ ÙÙÙÙØ© إسÙاد OpenStreetMap عÙ٠صÙØØ© ÙÙب
+ alt: Ù
ثا٠عÙÙ ÙÙÙÙØ© إسÙاد خرÙطة اÙشارع اÙÙ
ÙتÙØØ© عÙ٠صÙØØ© ÙÙب
title: Ù
ثا٠اÙإسÙاد
more_title_html: Ù
عرÙØ© اÙÙ
زÙد
more_1_html: |-
اÙرأ اÙÙ
زÙد ØÙ٠استخداÙ
بÙاÙاتÙا Ø ÙÙÙÙÙØ© اعتÙ
ادÙا Ø Ø¹Ù٠صÙØØ© ترخÙص OSMF
- more_2_html: |-
- عÙ٠اÙرغÙ
Ù
٠أ٠OpenStreetMap عبارة ع٠بÙاÙات Ù
ÙتÙØØ© Ø Ø¥Ùا Ø£ÙÙا Ùا ÙستطÙع تÙÙÙر
- خرÙطة API Ù
جاÙÙØ© ÙÙجÙات اÙخارجÙØ©.
- راجع سÙاسة استخداÙ
ÙاجÙØ© برÙ
جة اÙتطبÙÙات Ø
- سÙاسة استخداÙ
اÙخرÙطة
- ٠سÙاسة استخداÙ
Nominatim .
+ more_2_html: "عÙ٠اÙرغÙ
Ù
٠أ٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ© عبارة ع٠بÙاÙات Ù
ÙتÙØØ©Ø
+ Ø¥Ùا Ø£ÙÙ Ùا ÙÙ
ÙÙÙا تÙÙÙر \nÙاجÙØ© برÙ
جة تطبÙÙات خرÙطة Øرة ÙÙأطرا٠اÙثاÙثةØ
+ \nراجع سÙاسة
+ استخداÙ
ÙاجÙØ© برÙ
جة اÙتطبÙÙاتØ\nÙسÙاسة
+ استخداÙ
اÙبÙاطØ\nÙسÙاسة
+ اÙاستخداÙ
Øسب اÙاسÙ
ÙدÙÙا."
contributors_title_html: اÙÙ
ساÙÙ
ÙÙ
- contributors_intro_html: |-
- Ù
ساÙÙ
ÙÙا ÙÙ
اÙØ¢Ùا٠Ù
٠اÙØ£Ùراد. ÙØ٠تشÙ
٠أÙضا
- بÙاÙات Ù
رخصة بشÙ٠عÙÙÙ Ù
Ù ÙÙاÙات اÙخرائط اÙÙØ·ÙÙØ©
- ÙÙ
صادر Ø£Ø®Ø±Ù Ø Ù
٠بÙÙÙا:
+ contributors_intro_html: "Ù
ساÙÙ
ÙÙا ÙÙ
Ø¢Ùا٠اÙØ£ÙØ±Ø§Ø¯Ø ÙÙÙر Ø£Ùضا \nبÙاÙات Ù
رخصة
+ بشÙÙÙ Ù
ÙتÙØ Ù
Ù ÙÙاÙات اÙخرائط اÙÙØ·ÙÙØ© \nÙغÙرÙا Ù
٠اÙÙ
ØµØ§Ø¯Ø±Ø Ù
٠بÙÙÙا:"
contributors_at_html: |-
اÙÙÙ
سا strong>: ÙØتÙ٠عÙ٠بÙاÙات Ù
Ù
Stadt Wien (under
@@ -1547,15 +1539,15 @@ ar:
ع٠طرÙ٠اÙسØØ¨Ø Ø£Ø¶Ù Ø±Ø³Ø§ÙتÙØ Ø«Ù
اÙÙر عÙÙ "ØÙظ"Ø ÙسÙتØر٠Ù
صÙ
Ù
٠اÙخرائط اÙآخرÙÙ.
other_concerns:
title: اÙتÙ
اÙ
ات أخرÙ
- explanation_html: |-
- إذا ÙاÙت ÙدÙÙ Ù
خاÙ٠بشأ٠ÙÙÙÙØ© استخداÙ
اÙبÙاÙات اÙخاصة بÙا Ø£Ù ØÙ٠اÙÙ
ØتÙÙات Ø ÙÙرج٠اÙرجÙع Ø¥ÙÙ Ù
ÙÙعÙا
- صÙØØ© ØÙÙ٠اÙطبع ÙاÙÙشر ÙÙ
زÙد Ù
٠اÙÙ
عÙÙÙ
ات اÙÙاÙÙÙÙØ© Ø Ø£Ù Ø§ØªØµÙ Ø¨Ø§ÙØ´Ù٠اÙÙ
Ùاسب
- Ù
جÙ
Ùعة عÙ
Ù OSMF .
+ explanation_html: "إذا ÙاÙت ÙدÙÙ Ù
خاÙ٠بشأ٠ÙÙÙÙØ© استخداÙ
بÙاÙاتÙا Ø£Ù ØÙÙ
+ Ù
ØتÙÙاتÙØ§Ø ÙاÙرجاء اÙرجÙع Ø¥ÙÙ \nصÙØØ© ØÙÙ٠اÙطبع ÙاÙÙشر
+ ÙدÙÙا ÙÙ
زÙد Ù
٠اÙÙ
عÙÙÙ
ات اÙÙاÙÙÙÙØ©Ø Ø£Ù Ø§ÙاتصاÙ\nبÙ
جÙ
Ùعة
+ عÙ
Ù Ù
ؤسسة خرÙطة اÙشارع اÙÙ
ÙتÙØØ©."
help:
title: اÙØصÙ٠عÙÙ Ù
ساعدة
- introduction: |-
- ÙØتÙÙ OpenStreetMap عÙ٠اÙعدÙد Ù
٠اÙÙ
Ùارد ÙÙتعÙÙ
ØÙ٠اÙÙ
شرÙع Ø ÙØ·Ø±Ø Ø§ÙأسئÙØ© ÙاÙإجابة عÙÙÙا Ø
- ÙاÙÙ
شارÙØ© ÙÙ Ù
ÙاÙشة ÙتÙØ«ÙÙ Ù
ÙاضÙع اÙخرائط.
+ introduction: "ÙØتÙ٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ© عÙ٠اÙعدÙد Ù
٠اÙÙ
Ùارد ÙÙتعÙÙ
ØÙÙ
+ اÙÙ
شرÙØ¹Ø ÙØ·Ø±Ø Ø§ÙأسئÙØ© ÙاÙإجابة عÙÙÙØ§Ø \nÙÙ
ÙاÙشة Ù
ÙاضÙع اÙتخطÙØ· ÙتÙØ«ÙÙÙا بشÙÙ
+ تعاÙÙÙ."
welcome:
url: Ø£ÙÙا بÙ.
title: Ù
رØبا ب٠Ù٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ©
@@ -1733,9 +1725,9 @@ ar:
paragraph_1_html: إذا ÙÙت ترÙد إصÙØ§Ø Ù
جرد Ø´ÙØ¡ صغÙر ÙÙÙس ÙدÙ٠اÙÙÙت ÙÙتسجÙÙ
ÙÙ
عرÙØ© ÙÙÙÙØ© اÙتØرÙØ±Ø ÙØ¥ÙÙ Ù
٠اÙسÙ٠أ٠تضÙÙ Ù
ÙاØظة.
paragraph_2_html: |-
- Ù
ا عÙÙ٠سÙ٠اÙاÙتÙا٠إÙ٠اÙخرÙطة ÙاÙÙÙر عÙ٠رÙ
ز اÙÙ
ÙاØظة:
- span>. سÙضÙÙ Ùذا عÙاÙ
Ø© Ø¥Ù٠اÙخرÙطة Ø ÙاÙت٠ÙÙ
ÙÙÙ ÙÙÙÙا
- ع٠طرÙ٠اÙسØب. أض٠رساÙØªÙ Ø Ø«Ù
اÙÙر عÙÙ "ØÙظ" Ø ÙسÙتØر٠Ù
صÙ
Ù
٠اÙخرائط اÙآخرÙÙ.
+ Ù
ا عÙÙ٠سÙ٠اÙاÙتÙا٠إÙ٠اÙخرÙطة ÙاÙÙÙر عÙ٠أÙÙÙÙØ© اÙÙ
ÙاØظة:
+ Ø Ø³ÙضÙÙ Ùذا عÙاÙ
Ø© Ø¥Ù٠اÙخرÙØ·Ø©Ø ÙاÙت٠ÙÙ
ÙÙÙ ÙÙÙÙا
+ باÙسØØ¨Ø Ø£Ø¶Ù Ø±Ø³Ø§ÙتÙØ Ø«Ù
اÙÙر عÙÙ "ØÙظ"Ø ÙسÙتØر٠Ù
صÙ
Ù
٠اÙخرائط اÙآخرÙÙ.
traces:
visibility:
private: خصÙص٠(ÙظÙر ÙÙ
جÙÙ٠اÙÙÙÙØ© ÙÙÙاط غÙر Ù
رتبة)
@@ -1874,7 +1866,7 @@ ar:
allow_read_prefs: ÙÙرأ تÙضÙÙات اÙÙ
ستخدÙ
.
allow_write_prefs: عدÙ٠تÙضÙÙات اÙÙ
ستخدÙ
.
allow_write_diary: Ø¥Ùشاء Ù
دخÙات ÙÙÙ
ÙØ©Ø ØªØ¹ÙÙÙات ÙإضاÙØ© أصدÙاء.
- allow_write_api: ÙعدÙ٠اÙخرÙطة.
+ allow_write_api: تعدÙ٠اÙخرÙطة.
allow_read_gpx: Ùراءة آثار ج٠ب٠أس اÙخاصة بÙ.
allow_write_gpx: ارÙع آثار ج٠ب٠أس.
allow_write_notes: تعدÙ٠اÙÙ
ÙاØظات.
@@ -1893,13 +1885,13 @@ ar:
missing: ÙÙ
تسÙ
Ø Ø¨Ø§ÙÙصÙ٠إÙ٠اÙتطبÙÙ ÙÙذا اÙÙ
رÙÙ
oauth_clients:
new:
- title: سجÙÙ٠تطبÙ٠جدÙد
+ title: سجÙÙÙ Ø·Ùبا جدÙد
submit: سجÙÙÙ
edit:
- title: عدÙ٠تطبÙÙÙ
+ title: عد٠طÙبÙ
submit: تعدÙÙ
show:
- title: تÙاصÙÙ OAuth ÙÙتطبÙÙ %{app_name}
+ title: تÙاصÙÙ OAuth ÙÙ%{app_name}
key: 'Ù
ÙØªØ§Ø Ø§ÙÙ
ستÙÙÙ:'
secret: 'سر اÙÙ
ستÙÙÙ:'
url: 'رابط Ø·Ùب اÙÙÙ
Ùذج:'
@@ -1951,7 +1943,7 @@ ar:
update:
flash: تÙ
تØدÙØ« Ù
عÙÙÙ
ات اÙعÙ
Ù٠بÙجاØ
destroy:
- flash: دÙ
Ùر تسجÙ٠اÙتطبÙÙ
+ flash: دÙÙ
ÙÙر تسجÙ٠تطبÙ٠اÙعÙ
ÙÙ
users:
login:
title: تسجÙ٠اÙدخÙÙ
@@ -1965,15 +1957,15 @@ ar:
register now: سج٠ØسابÙا اÙØ¢Ù
with username: 'ÙÙ ÙدÙ٠باÙÙع٠Øساب خرÙطة اÙشارع اÙÙ
ÙتÙØØ©Ø Ø§Ùرجاء اÙدخÙ٠باسÙ
اÙÙ
ستخدÙ
ÙÙÙÙ
Ø© اÙÙ
رÙر اÙخاصÙ٠بÙ:'
- with external: 'بدÙا Ù
Ù Ø°ÙÙØ Ø§Ø³ØªØ®Ø¯Ù
طرÙا آخر ÙÙدخÙÙ:'
- new to osm: جدÙد ÙخرÙطة اÙشارع اÙÙ
ÙتÙØØ© Ø
+ with external: 'بدÙا Ù
Ù Ø°ÙÙØ Ø§Ø³ØªØ®Ø¯Ù
طرÙا ثاÙثا ÙتسجÙ٠اÙدخÙÙ:'
+ new to osm: جدÙد Ù٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ©Ø
to make changes: Ùإجراء تغÙÙرات عÙ٠بÙاÙات خرÙطة اÙشارع اÙÙ
ÙتÙØØ©; Ùجب Ø£Ù ÙÙÙÙ
ÙدÙÙ Øساب.
- create account minute: Ø£Ùشئ ØساباÙ. تØتاج ÙÙØ· Ø¥Ù٠دÙÙÙØ©.
- no account: ÙÙس ÙدÙÙ Øسابا Ø
- account not active: عذراÙØ Øساب٠غÙر Ùشط Øت٠اÙØ¢Ù.
ÙÙرج٠إستخداÙ
اÙرابط
- اÙذ٠اÙرسÙÙ٠إÙÙÙ Ù٠رساÙØ© تأÙÙد اÙبرÙد اÙØ¥ÙÙترÙÙÙØ ÙÙ
ا ÙÙÙ
ÙÙÙ
- Ø·Ùب رساÙØ© تأÙÙد جدÙدة ÙÙ ØاÙØ© عدÙ
إستÙاÙ
اÙاÙÙÙ.
+ create account minute: اÙشئ ØØ³Ø§Ø¨Ø§Ø Ø¥ÙÙا تستغر٠دÙÙÙØ© ÙاØدة ÙÙØ·.
+ no account: ÙÙس ÙدÙÙ ØساباØ
+ account not active: عذراÙØ Øساب٠غÙر Ùشط Øت٠اÙØ¢Ù.
ÙÙرجÙ٠إستخداÙ
اÙرابط
+ اÙذ٠اÙرسÙÙ٠إÙÙÙ Ù٠رساÙØ© تأÙÙد اÙبرÙد اÙØ¥ÙÙترÙÙÙØ ÙÙ
ا ÙÙ
ÙÙÙ
+ Ø·Ùب رساÙØ© تأÙÙد جدÙدة ÙÙ ØاÙØ© عدÙ
استÙاÙ
اÙاÙÙÙ.
account is suspended: Ø¹Ø°Ø±Ø§Ø ØªÙ
تعÙÙÙ Øساب٠بسبب Ùشاط Ù
شبÙÙ.
ÙÙرجÙ٠اÙاتصاÙ
بwebmaster إذا ÙÙت ترغب ÙÙ Ù
ÙاÙشة Ùذا.
auth failure: آسÙØ Ùا ÙÙ
Ù٠اÙدخÙ٠بتÙ٠اÙتÙاصÙÙ.
@@ -1981,12 +1973,12 @@ ar:
auth_providers:
openid:
title: تسجÙ٠اÙدخÙ٠بOpenID
- alt: تسجÙ٠اÙدخÙ٠باستخداÙ
OpenID URL
+ alt: تسجÙ٠اÙدخÙ٠باستخداÙ
Ù
سار OpenID
google:
- title: ÙÙ
بتسجÙ٠اÙدخÙ٠ع٠طرÙ٠جÙجÙ
+ title: تسجÙ٠اÙدخÙ٠باستخداÙ
جÙجÙ
alt: تسجÙ٠اÙدخÙ٠ب Google OpenID
facebook:
- title: ÙÙ
بتسجÙ٠اÙدخÙ٠باستخداÙ
اÙÙÙس بÙÙ
+ title: تسجÙ٠اÙدخÙ٠باستخداÙ
ÙÙس بÙÙ
alt: تسجÙ٠اÙدخÙ٠بØساب ÙÙسبÙÙ
windowslive:
title: تسجÙ٠اÙدخÙ٠عبر ÙÙÙدÙز ÙاÙÙ
@@ -1999,13 +1991,13 @@ ar:
alt: سج٠اÙدخÙ٠باستخداÙ
Øساب ÙÙÙÙبÙدÙا
yahoo:
title: تسجÙ٠اÙدخÙ٠بÙاÙÙ
- alt: تسجÙ٠اÙدخÙ٠ب Yahoo OpenID
+ alt: تسجÙ٠اÙدخÙ٠بÙYahoo OpenID
wordpress:
title: تسجÙ٠اÙدخÙ٠بÙÙردبرÙس
- alt: تسجÙ٠اÙدخÙ٠ب Wordpress OpenID
+ alt: تسجÙ٠اÙدخÙ٠بÙWordpress OpenID
aol:
title: تسجÙ٠اÙدخÙ٠بإÙ٠أ٠إÙ
- alt: تسجÙ٠اÙدخÙ٠ب AOL OpenID
+ alt: تسجÙ٠اÙدخÙ٠بÙAOL OpenID
logout:
title: تسجÙ٠اÙخرÙج
heading: اÙخرÙج Ù
٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ©
@@ -2015,19 +2007,19 @@ ar:
heading: Ø£ÙسÙت ÙÙÙ
Ø© اÙÙ
رÙرØ
email address: 'عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ:'
new password button: أعد ضبط ÙÙÙ
Ø© اÙسر
- help_text: أدخ٠عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙ٠اÙذ٠استخدÙ
ت٠ÙÙتسجÙÙ Ø ÙسÙÙ Ùرس٠عÙÙÙ
- رابط ÙÙ
ÙÙ٠استخداÙ
Ù Ùإعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر.
+ help_text: أدخ٠عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙ٠اÙذ٠استخدÙ
ت٠ÙÙتسجÙÙØ ÙسÙÙ Ùرس٠عÙÙÙ
+ رابطا ÙÙ
ÙÙ٠استخداÙ
Ù Ùإعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر.
notice email on way: Ùأس٠ÙØ£Ù٠أضعتÙا :-( ÙÙÙÙ ÙÙا٠رساÙØ© Ø¥ÙÙترÙÙÙØ© Ù٠طرÙÙÙا
Ø¥ÙÙ٠ستÙ
ÙÙÙ Ù
٠إعادة تعÙÙÙÙا ÙرÙبÙا.
- notice email cannot find: تعذÙر Ø¥Ùجاد عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙØ ÙØ٠آسÙÙÙ.
+ notice email cannot find: Ù
عذرةÙØ ØªØ¹Ø°Ø± Ø¥Ùجاد عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ.
reset_password:
title: إعادة ضبط ÙÙÙ
Ø© اÙسر
heading: إعادة تعÙÙÙ ÙÙÙ
Ø© اÙÙ
رÙر %{user}
password: 'ÙÙÙ
Ø© اÙسر:'
- confirm password: 'Ø£ÙÙد ÙÙÙ
Ø© اÙÙ
رÙر:'
+ confirm password: 'تأÙÙد ÙÙÙ
Ø© اÙسر:'
reset: أعد ضبط ÙÙÙ
Ø© اÙسر
- flash changed: ÙÙÙ
Ø© اÙÙ
رÙر اÙخاصة ب٠Ùد تغÙرت.
- flash token bad: ÙÙ
Ùجد Ùذا اÙÙÙ
ÙØ°Ø¬Ø ØªØÙÙ Ù
٠اÙرابط ربÙ
اØ
+ flash changed: ÙÙÙ
Ø© Ù
رÙر٠Ùد تغÙرت.
+ flash token bad: ÙÙ
Ùجد Ùذا اÙÙÙ
ÙØ°Ø¬Ø ØªØÙÙ Ù
٠اÙÙ
سار ربÙ
اØ
new:
title: Ø£Ùشئ Øسابا
no_auto_account_create: ÙÙأس٠ÙØ٠غÙر ÙادرÙÙ Ù٠اÙÙÙت اÙØاÙ٠عÙ٠إÙشاء Øساب
@@ -2038,68 +2030,68 @@ ar:
header: ØÙرÙÙØ© ÙÙابÙØ© ÙÙتØرÙر
html: |-
عÙ٠عÙس اÙخرائط اÙأخر٠تÙ
اÙ
Ø§Ø ÙتÙ
Ø¥Ùشاء خرÙطة اÙشارع اÙÙ
ÙتÙØØ© Ù
Ù Ùب٠اÙÙاس Ù
Ø«ÙÙØ ÙÙÙ Øرة ÙÙÙ
ÙÙ Ùأ٠أØد اÙإصÙØ§Ø ÙاÙتØدÙØ« ÙاÙتÙزÙÙ ÙاÙاستخداÙ
.
- Ø£ÙØ´ÙØ¡ Øسابا Ùبدء اÙÙ
ساÙÙ
Ø©.سÙÙÙÙ
بإرسا٠برÙد Ø¥ÙÙترÙÙÙ ÙتأÙÙد ØسابÙ.
+ Ø£ÙØ´ÙØ¡ Øسابا Ùبدء اÙÙ
ساÙÙ
Ø©.سÙÙÙÙ
بإرسا٠برÙد Ø¥ÙÙترÙÙÙ ÙتأÙÙد ØسابÙ.
license_agreement: عÙد تأÙÙد Øساب٠ستØتاج Ø¥Ù٠اÙÙ
ÙاÙÙØ© عÙ٠شرÙØ·
اÙÙ
ساÙÙ
.
email address: 'عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ:'
confirm email address: 'تأÙÙد عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ:'
- not displayed publicly: Ùا Ùعرض عÙÙÙا (اÙظر سÙاسة
- اÙخصÙصÙØ©)
- display name: 'اسÙ
اÙÙ
ستخدÙ
:'
- display name description: اسÙ
اÙÙ
ستخدÙ
اÙخاص ب٠اÙظاÙر عÙÙÙا. ÙÙ
ÙÙ٠تغÙÙر ÙØ°Ù
- اÙتÙضÙÙات ÙÙ ÙÙت ÙاØÙ.
+ not displayed publicly: Ùا ÙتÙ
عرض عÙÙاÙ٠بشÙ٠عاÙ
Ø Ø±Ø§Ø¬Ø¹ سÙاسة
+ اÙخصÙصÙØ© ÙÙ
زÙد Ù
٠اÙÙ
عÙÙÙ
ات
+ display name: 'اسÙ
اÙعرض:'
+ display name description: اسÙ
اÙÙ
ستخدÙ
اÙخاص ب٠اÙظاÙر عÙÙÙØ§Ø ÙÙ
ÙÙ٠تغÙÙر Ùذا
+ Ù٠اÙتÙضÙÙات ÙÙ ÙÙت ÙاØÙ.
external auth: 'Ù
صادÙØ© طر٠ثاÙØ«:'
password: 'ÙÙÙ
Ø© اÙسر:'
confirm password: 'تأÙÙد ÙÙÙ
Ø© اÙÙ
رÙر:'
- use external auth: 'بدÙا Ù
Ù Ø°ÙÙØ Ø§Ø³ØªØ®Ø¯Ù
طرÙا آخر ÙÙدخÙÙ:'
+ use external auth: 'بدÙا Ù
Ù Ø°ÙÙØ Ø§Ø³ØªØ®Ø¯Ù
طرÙا ثاÙثا ÙتسجÙ٠اÙدخÙÙ:'
auth no password: Ù
ع Ù
صادÙØ© طر٠ثاÙØ« ÙÙÙ
Ø© اÙسر غÙر Ù
Ø·ÙÙØ¨Ø©Ø ÙÙÙ٠بعض اÙأدÙات
إضاÙÙØ© أ٠اÙخادÙ
Ùد Ùا تزا٠تØتاج Ø¥ÙÙ ÙاØدة.
continue: Ø£Ùشئ Øسابا
terms accepted: ÙØ´Ùر٠عÙÙ ÙبÙ٠شرÙØ· اÙÙ
ساÙÙ
اÙجدÙدة!
- terms declined: ÙØÙ Ùأس٠أ٠ÙÙت Ùد Ùررت عدÙ
ÙبÙ٠شرÙØ· اÙÙ
ساÙÙ
Ø© اÙجدÙدة. ÙÙ
زÙد
- Ù
٠اÙÙ
عÙÙÙ
Ø§ØªØ Ùرج٠اÙاطÙاع عÙ٠صÙØØ© اÙÙÙÙÙ ÙØ°Ù.
+ terms declined: ÙØÙ Ùأس٠أ٠ÙÙت Ùد Ùررت عدÙ
ÙبÙ٠شرÙØ· اÙÙ
ساÙÙ
Ø© اÙجدÙØ¯Ø©Ø ÙÙ
زÙد
+ Ù
٠اÙÙ
عÙÙÙ
ات; ÙÙرجÙ٠اÙاطÙاع عÙ٠صÙØØ© اÙÙÙÙÙ ÙØ°Ù.
terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
terms:
title: 'شرÙØ· اÙÙ
ساÙÙ
:'
heading: 'شرÙØ· اÙÙ
ساÙÙ
:'
- read and accept: Ùرج٠Ùراءة اÙاتÙاÙÙØ© أدÙا٠ÙاÙضغط عÙ٠زر اÙÙ
ÙاÙÙØ© ÙتأÙÙد ÙبÙÙ
- شرÙØ· Ùذا اÙاتÙا٠عÙÙ Ù
شارÙات٠اÙÙ
ÙجÙدة ØاÙÙÙا ÙاÙÙ
ستÙبÙÙØ©.
+ read and accept: تÙرجÙÙ Ùراءة اÙاتÙاÙÙØ© أدÙا٠ÙاÙضغط عÙ٠زر اÙÙ
ÙاÙÙØ© ÙتأÙÙد
+ ÙبÙ٠شرÙØ· Ùذا اÙاتÙا٠عÙÙ Ù
شارÙات٠اÙÙ
ÙجÙدة ÙاÙÙ
ستÙبÙÙØ©.
consider_pd: ÙباÙإضاÙØ© Ø¥Ù٠اÙاتÙاÙÙØ© أعÙاÙØ Ø£Ø±Ùد أ٠تÙÙÙ Ù
ساÙÙ
ات٠Ù
ÙÙÙØ© عاÙ
Ø©.
consider_pd_why: Ù
ا ÙذاØ
consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
- guidance: 'Ù
عÙÙÙ
ات ÙÙÙ
ساعدة ÙÙ ÙÙÙ
Ùذ٠اÙÙ
صطÙØات: Ù
Ùخص
- Ùاب٠ÙÙÙراءة باÙØ¥Ùسا٠Ùبعض ترجÙ
Ø© غÙر رسÙ
ÙØ©
- '
+ guidance: 'Ù
عÙÙÙ
ات ÙÙÙ
ساعدة ÙÙ ÙÙÙ
Ùذ٠اÙÙ
صطÙØات: Ù
Ùخص
+ Ùاب٠ÙÙÙراءة بÙاسطة اÙØ¥Ùسا٠Ùبعض ترجÙ
ات غÙر
+ رسÙ
ÙØ©'
agree: Ø£ÙاÙÙ
declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
- decline: اÙØ®Ùاض
+ decline: أرÙض
you need to accept or decline: اÙرجاء اÙÙراءة ÙÙ
Ù Ø«Ù
ÙبÙ٠أ٠رÙض شرÙØ· اÙÙ
ساÙÙ
Ø©
اÙجدÙدة ÙÙÙ
تابعة.
- legale_select: 'اÙرجاء اختÙار بÙد اÙØ¥ÙاÙ
Ø©:'
+ legale_select: 'بÙد اÙØ¥ÙاÙ
Ø©:'
legale_names:
france: ÙرÙسا
italy: Ø¥ÙطاÙÙا
rest_of_world: بÙÙØ© اÙعاÙÙ
no_such_user:
- title: Ù
ستخدÙ
غÙر Ù
ÙجÙد
+ title: Ùا ÙÙجد Ù
ستخدÙ
ÙÙذا
heading: اÙÙ
ستخدÙ
%{user} غÙر Ù
ÙجÙد
- body: عذرÙØ§Ø Ùا ÙÙجد Ù
ستخدÙ
باÙاسÙ
%{user}. Ùرج٠تدÙÙ٠اÙاسÙ
Ø Ø£Ù Ø±Ø¨Ù
ا ÙÙÙ٠اÙرابط
- اÙذ٠تÙ
اÙÙÙر عÙÙ٠خاطئ.
+ body: عذرÙØ§Ø Ùا ÙÙجد Ù
ستخدÙ
باÙاسÙ
%{user}; ÙÙرجÙ٠تدÙÙ٠اÙاسÙ
Ø Ø£Ù Ø±Ø¨Ù
ا ÙÙÙÙ
+ اÙرابط اÙذ٠تÙ
اÙÙÙر عÙÙ٠خاطئ.
deleted: تÙ
ØØ°ÙÙ
show:
my diary: اÙÙÙÙ
Ùات
new diary entry: Ù
دخÙØ© ÙÙÙ
ÙØ© جدÙدة
- my edits: اÙÙ
ÙساÙÙ
ات
+ my edits: تعدÙÙاتÙ
my traces: آثارÙ
my notes: Ù
ÙاØظاتÙ
my messages: رسائÙÙ
my profile: Ù
ÙÙ٠اÙشخصÙ
- my settings: اÙإعدادات
+ my settings: إعداداتÙ
my comments: تعÙÙÙاتÙ
oauth settings: "\uFEFFإعدادات oauth"
- blocks on me: اÙعرÙÙات عÙÙ
- blocks by me: اÙعرÙÙات بÙاسطتÙ
+ blocks on me: عÙ
ÙÙات Ù
ÙعÙ
+ blocks by me: عÙ
ÙÙات اÙÙ
Ùع بÙاسطتÙ
send message: إرس٠رساÙØ©
diary: ÙÙÙ
ÙØ©
edits: Ù
ساÙÙ
ات
@@ -2108,57 +2100,58 @@ ar:
remove as friend: Ø¥Ùغاء اÙصداÙØ©
add as friend: أض٠ÙصدÙÙ
mapper since: 'Ù
Ùخطط Ù
ÙØ°:'
- ago: (%{time_in_words_ago})
+ ago: Ù
ÙØ° %{time_in_words_ago}
ct status: 'شرÙØ· اÙÙ
ساÙÙ
:'
ct undecided: Ù
تردد
ct declined: Ù
رÙÙض
- ct accepted: Ù
ÙبÙÙ %{ago} سابÙاÙ
+ ct accepted: Ù
ÙبÙÙ Ù
ÙØ° %{ago}
latest edit: 'آخر تغÙÙر %{ago}:'
email address: 'عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ:'
- created from: 'Ø£ÙÙØ´ÙØ¡ Ù
Ù:'
+ created from: 'Ø£ÙÙØ´Ùئ Ù
Ù:'
status: 'اÙØاÙØ©:'
spam score: 'ÙتÙجة اÙسخاÙ
:'
description: اÙÙصÙ
- user location: اÙÙ
ÙÙع
- if set location: عÙÙ Ù
ÙÙع٠عÙ٠صÙØØ© %{settings_link} ÙرؤÙØ© اÙÙ
ستخدÙ
Ù٠اÙÙرÙبÙÙ
+ user location: Ù
ÙÙع اÙÙ
ستخدÙ
+ if set location: ÙÙ
بتعÙÙÙ Ù
ÙÙع٠عÙ٠صÙØØ© %{settings_link} ÙرؤÙØ© اÙÙ
ستخدÙ
ÙÙ
+ اÙÙرÙبÙÙ
settings_link_text: إعدادات
my friends: أصدÙائÙ
no friends: ÙÙ
تÙÙ
بإضاÙØ© أ٠أصدÙاء بعد.
km away: عÙ٠بعد %{count}ÙÙ
m away: عÙ٠بعد %{count}Ù
تر
- nearby users: 'Ù
ستخدÙ
Ù٠أÙضÙا باÙجÙار:'
+ nearby users: Ù
ستخدÙ
Ù٠آخرÙÙ ÙرÙبÙÙ
no nearby users: Ùا ÙÙجد بعد اÙÙ
زÙد Ù
٠اÙÙ
ستخدÙ
Ù٠أÙصØÙا ع٠تخطÙØ·ÙÙ
باÙجÙار.
role:
administrator: Ùذا اÙÙ
ستخدÙ
إدارÙ
- moderator: Ùذا اÙÙ
ستخدÙ
ÙسÙØ·
+ moderator: Ùذا اÙÙ
ستخدÙ
Ù
شرÙ
grant:
administrator: Ù
ÙØ ÙصÙ٠إدارÙ
- moderator: Ù
ÙØ ÙصÙÙ ÙسÙØ·
+ moderator: Ù
ÙØ ÙصÙÙ Ù
شرÙ
revoke:
- administrator: ابط٠ÙصÙ٠إدارÙ
- moderator: ابط٠ÙصÙÙ ÙسÙØ·
- block_history: اÙعرÙÙات اÙÙ
ÙعÙØ©
- moderator_history: ' اÙعرÙÙات اÙÙ
عطاة'
+ administrator: إبطا٠ÙصÙ٠إدارÙ
+ moderator: إبطا٠ÙصÙÙ Ù
شرÙ
+ block_history: عÙ
ÙÙات اÙÙ
Ùع اÙÙ
ÙعÙØ©
+ moderator_history: عÙ
ÙÙات اÙÙ
Ùع اÙÙ
عطاة
comments: اÙتعÙÙÙات
create_block: اÙ
Ùع Ùذا اÙÙ
ستخدÙ
- activate_user: ÙØ´ÙØ· Ùذا اÙÙ
ستخدÙ
- deactivate_user: اØØ°Ù Ùذا اÙÙ
ستخدÙ
+ activate_user: ÙØ´ÙÙØ· Ùذا اÙÙ
ستخدÙ
+ deactivate_user: تعطÙÙ Ùذا اÙÙ
ستخدÙ
confirm_user: تأÙÙد Ùذا اÙÙ
ستخدÙ
hide_user: اخÙÙ Ùذا اÙÙ
ستخدÙ
unhide_user: أظÙر Ùذا اÙÙ
ستخدÙ
delete_user: اØØ°Ù Ùذا اÙÙ
ستخدÙ
- confirm: Ø£ÙÙد
- friends_changesets: تصÙØ ÙÙ ØزÙ
اÙتغÙÙرات Ù
Ù Ùب٠اÙأصدÙاء
- friends_diaries: تصÙØ Ø¬Ù
Ùع Ù
دخÙات Ù
دÙÙات اÙأصدÙاء
- nearby_changesets: تصÙØ ÙÙ ØزÙ
اÙتغÙÙرات Ù
Ù Ùب٠اÙÙ
ستخدÙ
Ù٠اÙÙرÙبÙÙ
- nearby_diaries: تصÙØ Ø¬Ù
Ùع Ù
دخÙات Ù
دÙÙات اÙÙ
ستخدÙ
ÙÙ Ù٠اÙÙرÙبÙÙ
- report: أبÙغ ع٠Ùذ٠اÙÙ
ستخدÙ
+ confirm: تأÙÙد
+ friends_changesets: Ù
جÙ
Ùعات تغÙÙرات اÙأصدÙاء
+ friends_diaries: Ù
دخÙات Ù
دÙÙات اÙأصدÙاء
+ nearby_changesets: ØزÙ
تغÙÙرات اÙÙ
ستخدÙ
Ù٠اÙÙرÙبÙÙ
+ nearby_diaries: إدخاÙات ÙÙÙ
Ùات اÙÙ
ستخدÙ
Ù٠اÙÙرÙبÙÙ
+ report: أبÙغ ع٠Ùذا اÙÙ
ستخدÙ
popup:
your location: Ù
ÙاÙÙ
nearby mapper: Ù
خطط باÙجÙار
friend: صدÙÙ
account:
- title: عدÙ٠اÙØساب
+ title: عد٠اÙØساب
my settings: إعداداتÙ
current email address: 'عÙÙا٠اÙبرÙد اÙØ¥ÙÙرترÙÙ٠اÙØاÙÙ:'
new email address: 'عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙ٠اÙجدÙد:'
@@ -2166,33 +2159,33 @@ ar:
external auth: 'Ù
صادÙØ© خارجÙØ©:'
openid:
link: http://wiki.openstreetmap.org/wiki/OpenID
- link text: Ù
ا Ùذا Ø
+ link text: Ù
ا ÙذاØ
public editing:
heading: 'تعدÙ٠عاÙ
:'
- enabled: Ù
ÙعÙÙ. غÙر Ù
جÙÙÙ ÙÙÙ
ÙÙ٠تعدÙ٠اÙبÙاÙات.
+ enabled: Ù
ÙعÙÙÙØ ØºÙر Ù
جÙÙÙ ÙÙÙ
ÙÙ٠تعدÙ٠اÙبÙاÙات.
enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
enabled link text: Ù
ا ÙذاØ
disabled: Ù
Ùعط٠ÙÙا ÙÙ
Ù٠تعدÙ٠اÙبÙاÙØ§ØªØ Ø¬Ù
Ùع اÙتعدÙÙات اÙسابÙØ© Ù
جÙÙÙØ© اÙÙÙÙØ©.
disabled link text: ÙÙ
اذا Ùا أستطÙع اÙتعدÙÙØ
public editing note:
heading: تعدÙ٠عاÙ
- text: ØاÙÙÙا تعدÙÙات٠تظÙر بشÙÙ Ù
جÙÙÙ ÙÙا ÙÙ
ÙÙ ÙÙÙاس إرسا٠رسائ٠Ù٠أ٠رؤÙØ©
- Ù
ÙÙعÙ. ÙإظÙار Ù
ا ÙÙ
ت بتعدÙÙÙ ÙÙÙسÙ
Ø§Ø ÙÙÙاس باÙاتصا٠ب٠Ù
Ù Ø®Ùا٠اÙÙ
ÙÙØ¹Ø Ø§ÙÙر
- عÙ٠اÙزر أدÙاÙ. Ù
ÙØ° اÙتغÙÙر Ø¥Ù٠اÙأ٠ب٠أ٠0.6Ø ÙÙØ· اÙÙ
ستخدÙ
Ù٠اÙعÙÙÙÙÙ
- ÙÙ
ÙÙ٠تØرÙر بÙاÙات اÙخرÙطة. (ÙÙ
عرÙØ©
- اÙسبب). - عÙÙاÙ٠اÙبرÙد٠ÙÙ ÙÙش٠ب٠عÙÙÙا.
- Ùذا اÙإجراء
- Ùا ÙÙ
Ù٠عÙس٠ÙجÙ
Ùع اÙÙ
ستخدÙ
Ù٠اÙجدÙد عÙÙÙÙ٠بشÙ٠اÙتراضÙ.
+ text: Ù٠اÙÙÙت اÙØاÙÙØ ØªØ¹Ø¯ÙÙات٠Ù
جÙÙÙØ© اÙÙÙÙØ© ÙÙا ÙÙ
ÙÙ ÙÙأشخاص إرسا٠رسائÙ
+ Ø¥ÙÙ٠أ٠اÙاطÙاع عÙÙ Ù
ÙÙعÙØ ÙإظÙار Ù
ا ÙÙ
ت بتØرÙر٠ÙاÙسÙ
Ø§Ø ÙÙأشخاص باÙاتصاÙ
+ ب٠عبر Ù
ÙÙع اÙÙÙب; اÙÙر ÙÙ٠اÙزر أدÙاÙÙ
ÙØ° تغÙÙر ÙاجÙØ© برÙ
جة اÙتطبÙÙات
+ 0.6Ø Ùا ÙÙ
Ù٠سÙÙ ÙÙÙ
ستخدÙ
Ù٠اÙعÙ
ÙÙ
ÙÙ٠تعدÙ٠بÙاÙات اÙخرÙطة. (اÙتشÙ
+ اÙسبب).- ÙÙ ÙتÙ
اÙÙش٠ع٠عÙÙا٠برÙد٠اÙØ¥ÙÙترÙÙÙ Ù
Ù Ø®Ùا٠جعÙ٠عاÙ
ا.
- Ùا
+ ÙÙ
Ù٠عÙس Ùذا اÙإجراء ÙØ£ØµØ¨Ø Ø¬Ù
Ùع اÙÙ
ستخدÙ
Ù٠اÙجدد عاÙ
Ù٠اÙتراضÙا.
contributor terms:
heading: 'شرÙØ· اÙÙ
ساÙÙ
:'
- agreed: ÙÙد ÙاÙÙت٠عÙ٠شرÙØ· اÙÙ
ساÙÙ
اÙجدÙدة.
+ agreed: ÙÙد ÙاÙÙت عÙ٠شرÙØ· اÙÙ
ساÙÙ
اÙجدÙدة.
not yet agreed: ÙÙ
تÙاÙ٠بعد عÙ٠شرÙØ· اÙÙ
ساÙÙ
اÙجدÙدة.
- review link text: Ùرج٠اتباع Ùذا اÙرابط Ù٠اÙÙÙت اÙØ°Ù ÙÙاسب٠ÙÙ
راجعة ÙÙبÙÙ
+ review link text: ÙÙرجÙ٠اتباع Ùذا اÙرابط Ù٠اÙÙÙت اÙØ°Ù ÙÙاسب٠ÙÙ
راجعة ÙÙبÙÙ
شرÙØ· اÙÙ
ساÙÙ
Ø© اÙجدÙدة.
- agreed_with_pd: ÙÙد أعÙÙت٠أÙضÙا Ø£Ù٠تعتبر تعدÙÙات٠Ù
ÙÙÙØ© عاÙ
Ø©.
+ agreed_with_pd: ÙÙد أعÙÙت Ø£ÙضÙا Ø£Ù٠تعتبر تعدÙÙات٠Ù
ÙÙÙØ© عاÙ
Ø©.
link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
link text: Ù
ا ÙذاØ
profile description: 'Ùص٠اÙÙ
Ù٠اÙشخصÙ:'
- preferred languages: 'اÙÙغات اÙÙ
ÙضÙÙØ©:'
+ preferred languages: 'اÙÙغات اÙÙ
ÙضÙØ©:'
preferred editor: 'اÙÙ
Øرر اÙÙ
ÙضÙ:'
image: "\uFEFFاÙصÙرة:"
gravatar:
@@ -2210,12 +2203,12 @@ ar:
no home location: ÙÙ
تدخ٠Ù
ÙÙع Ù
ÙزÙÙ.
latitude: 'خط اÙعرض:'
longitude: 'خط اÙØ·ÙÙ:'
- update home location on click: ØدÙØ« Ù
ÙÙع اÙÙ
Ùز٠عÙدÙ
ا Ø£ÙÙر عÙ٠اÙخرÙطةØ
+ update home location on click: تØدÙØ« Ù
ÙÙع اÙÙ
Ùز٠عÙدÙ
ا Ø£ÙÙر عÙ٠اÙخرÙطةØ
save changes button: اØÙظ اÙتغÙÙرات
make edits public button: اجع٠جÙ
Ùع تعدÙÙات٠عاÙ
Ø©
return to profile: اÙعÙدة Ø¥Ù٠اÙÙ
Ù٠اÙشخصÙ
- flash update success confirm needed: تÙ
تØدÙØ« Ù
عÙÙÙ
ات اÙÙ
ستخدÙ
بÙجاØ. تØÙÙ Ù
Ù
- برÙد٠اÙØ¥ÙÙترÙÙÙ ÙÙ
Ø°Ùرة تأÙÙد اÙعÙÙا٠اÙØ¥ÙÙترÙÙ٠اÙجدÙد.
+ flash update success confirm needed: تÙ
تØدÙØ« Ù
عÙÙÙ
ات اÙÙ
ستخدÙ
بÙجاØØ ØªØÙÙ Ù
Ù
+ برÙد٠اÙØ¥ÙÙترÙÙÙ ÙÙ
ÙاØظة تأÙÙد اÙعÙÙا٠اÙØ¥ÙÙترÙÙ٠اÙجدÙد.
flash update success: تÙ
تØدÙØ« Ù
عÙÙÙ
ات اÙÙ
ستخدÙ
بÙجاØ.
confirm:
heading: تØÙÙ Ù
٠برÙد٠اÙØ¥ÙÙترÙÙÙ
@@ -2223,54 +2216,54 @@ ar:
introduction_2: Ø£Ùد Øساب٠ع٠طرÙ٠اÙÙÙر عÙ٠اÙرابط Ù٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ ÙستÙÙÙ
Ùادرا عÙ٠اÙبدء Ù٠رسÙ
اÙخرائط.
press confirm button: اضغط عÙ٠زر اÙتأÙÙد أدÙا٠ÙتÙØ´ÙØ· ØسابÙ.
- button: Ø£ÙÙد
+ button: تأÙÙد
success: تÙ
تأÙÙد ØسابÙØ Ø´ÙرÙا ÙÙاشتراÙ!
already active: Ùذا اÙØساب سب٠أ٠تÙ
تأÙÙدÙ.
unknown token: رÙ
ز اÙتأÙÙد اÙتÙت صÙاØÙت٠أ٠غÙر Ù
ÙجÙد.
- reconfirm_html: إذا ÙÙت ÙÙ Øاجة Ùإعادة إرسا٠تأÙÙد اÙبرÙد اÙØ¥ÙÙترÙÙÙØ email
- اÙÙر ÙÙا.
+ reconfirm_html: إذا ÙÙت ÙÙ Øاجة Ùإعادة إرسا٠تأÙÙد اÙبرÙد اÙØ¥ÙÙترÙÙÙØ Ø§ÙÙر
+ ÙÙا.
confirm_resend:
success: ÙÙد أرسÙÙا رساÙØ© تأÙÙد جدÙدة Ø¥ÙÙ %{email} ÙبÙ
جرد تأÙÙد Øساب٠ستتÙ
ÙÙ
- Ù
٠رسÙ
اÙخرائط.
إذا ÙÙت تستخدÙ
ÙظاÙ
Ùا Ù
ضادÙا ÙÙبرÙد اÙعشÙائÙ
- Ùرس٠طÙبات تأÙÙد Ø ÙÙرج٠تأÙد Ù
٠أÙ٠اÙÙائÙ
Ø© اÙبÙضاء %{sender} ÙØ£ÙÙا غÙر ÙادرÙÙ
- عÙ٠اÙرد عÙ٠أ٠طÙبات تأÙÙد.
+ Ù
٠رسÙ
اÙخرائط.
إذا ÙÙت تستخدÙ
ÙظاÙ
ا Ù
ضادا ÙÙبرÙد اÙعشÙائ٠ÙرسÙ
+ Ø·Ùبات تأÙÙØ¯Ø ÙÙÙرجÙ٠اÙتأÙد Ù
٠أÙÙ Ùضعت Ù٠اÙÙائÙ
Ø© اÙبÙضاء %{sender} ÙØ£ÙÙا
+ غÙر ÙادرÙ٠عÙ٠اÙرد عÙ٠أ٠طÙبات تأÙÙد.
failure: اÙÙ
ستخدÙ
%{name} غÙر Ù
ÙجÙد.
confirm_email:
- heading: Ø£ÙÙد تغÙÙر عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ
+ heading: Ø£Ùد تغÙÙر عÙÙا٠اÙبرÙد اÙØ¥ÙÙترÙÙÙ
press confirm button: اضغط عÙ٠زر تأÙÙد أدÙا٠ÙتأÙÙد عÙÙا٠برÙد٠اÙØ¥ÙÙترÙÙÙ
اÙجدÙد.
- button: Ø£ÙÙد
- success: تÙ
تأÙÙد عÙÙا٠برÙد٠اÙØ¥ÙÙترÙÙÙØ Ø´ÙرÙا ÙÙاشتراÙ!
- failure: عÙÙا٠برÙد Ø¥ÙÙترÙÙ٠تÙ
تÙعÙÙÙ Ù
سبÙÙا بÙذا اÙÙÙ
Ùذج.
+ button: تأÙÙد
+ success: تÙ
تأÙÙد عÙÙا٠برÙد٠اÙØ¥ÙÙترÙÙÙ!
+ failure: عÙÙا٠برÙد Ø¥ÙÙترÙÙ٠تÙ
تÙعÙÙÙ Ù
سبÙÙا بÙذا اÙرÙ
ز.
unknown_token: رÙ
ز اÙتأÙÙد اÙتÙت صÙاØÙت٠أ٠غÙر Ù
ÙجÙد.
set_home:
- flash success: Ù
ÙÙع اÙÙ
Ùز٠ØÙÙظ بÙجاØ
+ flash success: Ù
ÙÙع اÙÙ
Ùز٠ØÙÙÙظ بÙجاØ
go_public:
flash success: جÙ
Ùع تعدÙÙات٠اÙآ٠عاÙ
Ø©Ø ÙÙ
سÙ
ÙØ Ù٠باÙتعدÙ٠اÙØ¢Ù.
make_friend:
heading: إضاÙØ© %{user} ÙصدÙÙØ
button: أض٠ÙصدÙÙ
success: '%{name} اÙآ٠صدÙÙÙ.'
- failed: عÙÙÙØ§Ø ØªØ¹Ø°Ø± إضاÙØ© %{name} ÙصدÙÙ.
- already_a_friend: ØاÙÙÙا Ø£Ùت Ù %{name} أصدÙاء.
+ failed: عÙÙÙØ§Ø ØªØ¹Ø°Ø±Øª إضاÙØ© %{name} ÙصدÙÙ.
+ already_a_friend: ØاÙÙÙا Ø£Ùت Ù%{name} أصدÙاء.
remove_friend:
- heading: غÙر صدÙÙ %{user}Ø
- button: اÙغاء اÙصداÙØ©
- success: تÙ
إزاÙØ© %{name} Ù
Ù ÙائÙ
Ø© أصدÙائÙ.
- not_a_friend: '%{name} ÙÙس Ù
٠أØد أصدÙائÙ.'
+ heading: Ø¥Ùغاء صداÙØ© %{user}Ø
+ button: Ø¥Ùغاء اÙصداÙØ©
+ success: تÙ
ت إزاÙØ© %{name} Ù
Ù ÙائÙ
Ø© أصدÙائÙ.
+ not_a_friend: '%{name} ÙÙس Ø£Øد أصدÙائÙ.'
filter:
- not_an_administrator: عÙÙ٠أ٠تÙÙ٠إدار٠ÙتÙÙÙØ° Ùذا اÙإجراء.
+ not_an_administrator: عÙÙ٠أ٠تÙÙ٠إدارÙا ÙتÙÙÙØ° Ùذا اÙإجراء.
index:
title: اÙÙ
ستخدÙ
ÙÙ
heading: اÙÙ
ستخدÙ
ÙÙ
showing:
- one: صÙØØ©%{page} (%{first_item} %{items})
- other: صÙØØ© %{page} (%{first_item}-%{last_item} %{items})
+ one: صÙØØ© %{page} (%{first_item} Ù
Ù %{items})
+ other: صÙØØ© %{page} (%{first_item}-%{last_item} Ù
Ù %{items})
summary: '%{name} تÙ
Ø¥ÙشاؤÙا Ù
Ù %{ip_address} ÙÙ %{date}'
- summary_no_ip: '%{name} تÙ
Ø¥ÙشاؤÙا ÙÙ %{date}'
+ summary_no_ip: '%{name} تÙ
Ø¥Ùشاؤ٠ÙÙ %{date}'
confirm: تأÙÙد اÙÙ
ستخدÙ
Ù٠اÙÙ
ØددÙÙ
hide: إخÙاء اÙÙ
ستخدÙ
Ù٠اÙÙ
ØددÙÙ
- empty: Ùا سجÙات Ù
طابÙØ© تÙ
اÙعثÙر عÙÙÙا!
+ empty: ÙÙ
ÙتÙ
اÙعثÙر عÙÙ Ù
ستخدÙ
ÙÙ Ù
تطابÙÙÙ
suspended:
title: Øساب Ù
عÙÙ
heading: Øساب Ù
عÙÙ
@@ -2286,12 +2279,13 @@ ar:
unknown_signature_algorithm: Ø®ÙارزÙ
ÙØ© تÙÙÙع غÙر Ù
عرÙÙØ©
invalid_scope: Ùطا٠غÙر صاÙØ
auth_association:
- heading: ÙÙ
Ùرتبط اسÙ
اÙÙ
ستخدÙ
اÙخاص ب٠بØساب خرÙطة اÙشارع اÙÙ
ÙتÙØØ© Øت٠اÙØ¢Ù.
- option_1: إذا ÙÙت جدÙدا Ù٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ Ø§Ùرجاء Ø¥Ùشاء Øساب جدÙد باستخداÙ
- اÙÙÙ
Ùذج أدÙاÙ.
- option_2: إذا Ùا٠ÙدÙ٠باÙÙع٠ØØ³Ø§Ø¨Ø ÙÙ
ÙÙ٠اÙدخÙ٠إÙÙ Øساب٠باستخداÙ
اسÙ
اÙÙ
ستخدÙ
- ÙÙÙÙ
Ø© اÙÙ
رÙر اÙخاصة ب٠ÙÙ
Ù Ø«Ù
ربط اÙØساب باسÙ
اÙÙ
ستخدÙ
اÙخاص ب٠Ù٠إعدادات
- اÙÙ
ستخدÙ
.
+ heading: ÙÙ
Ùرتبط Ù
عرÙ٠بØساب خرÙطة اÙشارع اÙÙ
ÙتÙØØ© Øت٠اÙØ¢Ù.
+ option_1: |-
+ إذا ÙÙت جدÙدا Ù٠خرÙطة اÙشارع اÙÙ
ÙتÙØØ Ø§Ùرجاء Ø¥Ùشاء Øساب جدÙد
+ باستخداÙ
اÙÙÙ
Ùذج أدÙاÙ.
+ option_2: "إذا Ùا٠ÙدÙÙ Øساب باÙÙعÙØ ÙÙÙ
ÙÙ٠تسجÙ٠اÙدخÙ٠إÙÙ Øساب٠\nباستخداÙ
+ اسÙ
اÙÙ
ستخدÙ
ÙÙÙÙ
Ø© اÙÙ
رÙر اÙخاصة بÙØ Ø«Ù
ربط اÙØساب \nبÙ
عرÙÙ Ù٠إعدادات اÙÙ
ستخدÙ
+ اÙخاصة بÙ."
user_role:
filter:
not_an_administrator: ÙØÙ ÙÙØ· ÙÙإدارÙÙ٠اÙÙÙاÙ
بتغÙÙر دÙر اÙÙ
ستخدÙ
Ø ÙØ£Ùت Ùست
diff --git a/config/locales/be-Tarask.yml b/config/locales/be-Tarask.yml
index 4bc8748a0..b9b90f23a 100644
--- a/config/locales/be-Tarask.yml
+++ b/config/locales/be-Tarask.yml
@@ -1,4 +1,4 @@
-# Messages for Belarusian (TaraÅ¡kievica orthography) (белаÑÑÑÐºÐ°Ñ (ÑаÑаÑкевÑÑа)â)
+# Messages for be-tarask (be-tarask)
# Exported from translatewiki.net
# Export driver: phpyaml
# Author: EugeneZelenko
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index bc2637a9e..f35ece33a 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -2069,6 +2069,7 @@ cs:
i budoucà pÅÃspÄvky.
consider_pd: NavÃc k výše uvedené dohodÄ považuji své pÅÃspÄvky za volné dÃlo.
consider_pd_why: co to znamená?
+ consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
guidance: 'Informace, které pomohou tyto podmÃnky pochopit: lidsky
Äitelné shrnutà a nÄjaké neoficiálnà pÅeklady'
agree: SouhlasÃm
diff --git a/config/locales/da.yml b/config/locales/da.yml
index ade8ddcbb..8f662f344 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -963,6 +963,8 @@ da:
title: Problemer
select_status: Vælg status
select_type: Vælg type
+ select_last_updated_by: Vælg sidst opdateret af
+ reported_user: Rapporteret bruger
not_updated: Ikke opdateret
search: Søg
user_not_found: Brugeren findes ikke
@@ -980,6 +982,7 @@ da:
reopen: Genåbn
read_reports: Læs rapporter
new_reports: Nye rapporter
+ comments_on_this_issue: Kommentarer på denne sag
comments:
created_at: Den %{datetime}
reports:
@@ -1697,8 +1700,10 @@ da:
tags_help: kommasepareret
visibility: 'Synlighed:'
visibility_help: hvad betyder det her?
+ visibility_help_url: https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces
upload_button: Upload
help: Hjælp
+ help_url: https://wiki.openstreetmap.org/wiki/Upload
create:
upload_trace: Upload GPS-spor
trace_uploaded: Din GPX-fil er uploadet og afventer lagring i databasen. Det
@@ -2013,6 +2018,7 @@ da:
terms declined: Vi er kede af at du har besluttet at du ikke kan acceptere de
nye vilkår for bidragsydere. For yderligere oplysninger, se venligst denne
wikiside.
+ terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
terms:
title: Vilkår for bidragsydere
heading: Vilkår for bidragsydere
diff --git a/config/locales/diq.yml b/config/locales/diq.yml
index fd1e77325..2d29a4cb4 100644
--- a/config/locales/diq.yml
+++ b/config/locales/diq.yml
@@ -752,7 +752,7 @@ diq:
output: Vıcyaen
export_button: TeberdayıÅ
sidebar:
- search_results: Neticeyê geyrayıÅi
+ search_results: Peyniya cıgeyrayıÅi
close: Racnê
search:
search: Cı geyre
diff --git a/config/locales/en.yml b/config/locales/en.yml
index f6d396f76..7b13a894b 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1798,6 +1798,7 @@ en:
other: "GPX file with %{count} points from %{user}"
description_without_count: "GPX file from %{user}"
application:
+ permission_denied: You do not have permission to access that action
require_cookies:
cookies_needed: "You appear to have cookies disabled - please enable cookies in your browser before continuing."
require_admin:
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 18266d4ef..9bc8589bb 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -1369,6 +1369,10 @@ eo:
AÅstrujo: enhavas datumojn el Stadt Wien (laÅ CC BY),
Land Vorarlberg kaj
Land Tirol (laÅ CC BY AT kun postaj ÅanÄoj).
+ contributors_au_html: 'AÅstralio: enhavas datumojn el PSMA Australia
+ Limited kunhavigataj de Komunejo de AÅstralio laÅ la permesilo CC
+ BY 4.0.'
contributors_ca_html: |-
Kanado: enhavas datumojn el
GeoBase®, GeoGratis (© Department of Natural
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 5645cb5a9..047d22ef5 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -428,7 +428,7 @@ fa:
ferry_terminal: پاÛاÙ٠کشتÛ
fire_station: آتشâÙشاÙÛ
food_court: پذÙراÙÙ
- fountain: ÚØ´Ù
Ù
+ fountain: ÙÙارÙ
fuel: Ù¾Ù
Ù¾ بÙزÛÙ
gambling: ÙÙ
ار
grave_yard: Ù
ØÙØ·ÙÙ Ú¯ÙرستاÙ
@@ -1048,7 +1048,7 @@ fa:
befriend_them: ÙÙ
ÚÙÛÙ Ù
ÛتÙاÙÛد در %{befriendurl} ا٠را بعÙÙا٠دÙست اضاÙÙ Ú©ÙÛد.
gpx_notification:
greeting: سÙاÙ
Ø
- your_gpx_file: پرÙÙØ¯Ù Û GPX Ø´Ù
ا اÛÙÚ¯ÙÙ٠است
+ your_gpx_file: ÙاÛÙ GPX Ø´Ù
ا اÛÙÚ¯ÙÙ٠است
with_description: با تÙضÛØات
and_the_tags: '٠برÚسب ÙØ§Û Ø²Ûر:'
and_no_tags: ٠بدÙ٠برÚسب.
@@ -1636,8 +1636,8 @@ fa:
identifiable: Ùاب٠شÙاساÛÛ (ÙÙ
اÛØ´ در ÙÛست ردÙØ§Ø Ùاب٠شÙاساÛÛØ ÙÙاط Ù
رتب بر اساس
زÙ
اÙ)
new:
- upload_trace: Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø±Ø¯ GPS
- upload_gpx: 'Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ù¾Ø±ÙÙدÙÙ GPX:'
+ upload_trace: Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø±Ø¯ جÛâÙ¾Ûâاس
+ upload_gpx: 'Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û ÙاÛÙ GPX:'
description: 'تÙضÛØات:'
tags: 'برÚسبâÙا:'
tags_help: جداشد٠با کاÙ
ا (,)
@@ -1646,10 +1646,10 @@ fa:
upload_button: بارگذارÛ
help: Ú©Ù
Ú©
create:
- upload_trace: Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø±Ø¯ GPS
- trace_uploaded: پرÙÙدÙÙ GPX Ø´Ù
ا Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù Ù Ø¯Ø± اÙتظار درج در پاÛگاÙâدادÙ
- است. اÛ٠کار Ù
عÙ
ÙÙا٠کÙ
تر از ÙÛÙ
ساعت Ø·ÙÙ Ù
Ûâکشد. ÙÙگاÙ
Û Ú©Ù Ø§ÙجاÙ
شد اÛÙ
ÛÙÛ
- Ø¨Ø±Ø§Û Ø´Ù
ا Ùرستاد٠Ù
ÛâØ´Ùد.
+ upload_trace: Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø±Ø¯ جÛâÙ¾Ûâاس
+ trace_uploaded: ÙاÛÙ GPX Ø´Ù
ا Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø´Ø¯Ù Ù Ø¯Ø± اÙتظار درج در پاÛگاÙâداد٠است.
+ اÛ٠کار Ù
عÙ
ÙÙا٠کÙ
تر از ÙÛÙ
ساعت Ø·ÙÙ Ù
Ûâکشد. ÙÙگاÙ
Û Ú©Ù Ø§ÙجاÙ
شد اÛÙ
ÛÙÛ Ø¨Ø±Ø§Û
+ Ø´Ù
ا Ùرستاد٠Ù
ÛâØ´Ùد.
traces_waiting:
one: Ø´Ù
ا %{count} رد Ù
Ùتظر Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø¯Ø§Ø±Ûد. ÙØ·Ùا٠Ùب٠از Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ù
Ùارد بÛشتر
Ù
Ùتظر بÙ
اÙÛد تا اÛÙÙا Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø¨Ø´ÙÙد Ú©Ù ØµÙ Ø¨Ø±Ø§Û Ø³Ø§Ûر کاربرا٠بست٠ÙØ´Ùد.
@@ -1658,7 +1658,7 @@ fa:
edit:
title: ÙÛراÛØ´ رد %{name}
heading: ÙÛراÛØ´ رد %{name}
- filename: 'ÙاÙ
پرÙÙدÙ:'
+ filename: 'ÙاÙ
ÙاÛÙ:'
download: درÛاÙت
uploaded_at: 'تارÛØ® بارگذارÛ:'
points: 'ÙÙاط:'
@@ -1680,7 +1680,7 @@ fa:
title: دÛد٠رد %{name}
heading: دÛد٠رد %{name}
pending: در اÙتظار
- filename: 'ÙاÙ
پرÙÙدÙ:'
+ filename: 'ÙاÙ
ÙاÛÙ:'
download: درÛاÙت
uploaded: 'تارÛØ® بارگذارÛ:'
points: 'ÙÙاط:'
@@ -1736,15 +1736,14 @@ fa:
message: ساÙ
اÙÙÙ Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø¬ÛâÙ¾Ûâاکس در Øا٠Øاضر در دسترس ÙÛست
offline:
heading: ذخÛØ±Ù Ø³Ø§Ø²Û Ø¢ÙÙاÛÙ GPX
- message: ذخÛرÙâØ³Ø§Ø²Û Ù¾Ø±ÙÙدÙ٠جÛâÙ¾Ûâاکس ٠ساÙ
اÙÙÙ Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø¯Ø± Øا٠Øاضر در دسترس
- ÙÛست.
+ message: ذخÛرÙâگا٠ÙاÛ٠جÛâÙ¾Ûâاکس ٠ساÙ
اÙÙÙ Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û ÙÙ
âاکÙÙ٠در دسترس ÙÛستÙد.
georss:
- title: ردÙØ§Û Ø¬ÛâÙ¾Ûâاس OpenStreetMap
+ title: â«Ø±Ø¯ÙØ§Û Ø¬ÛâÙ¾Ûâاس OpenStreetMapâ¬
description:
description_with_count:
- one: پرÙÙد٠GPX با %{count} ÙÙط٠از %{user}
- other: ' پرÙÙد٠GPX با %{count} ÙÙط٠از %{user}'
- description_without_count: پرÙÙد٠GPX از %{user}
+ one: â«ÙاÛÙ GPX با %{count} ÙÙط٠از %{user}â¬
+ other: ' â«ÙاÛÙ GPX با %{count} ÙÙط٠از %{user}â¬'
+ description_without_count: ÙاÛÙ GPX از %{user}
application:
require_cookies:
cookies_needed: بÙظر Ù
Ûâرسد Ú©Ù Ú©ÙÚ©ÛâÙا را غÛرÙعا٠کردÙâاÛد - ÙØ·Ùا٠Ùب٠از اداÙ
Ù
@@ -1772,7 +1771,7 @@ fa:
allow_write_diary: ساخت رÙزÙÙشتâÙØ§Ø Ùظرداد٠٠اÙزÙد٠دÙست.
allow_write_api: ÙÛراÛØ´ ÙÙØ´Ù.
allow_read_gpx: Ø®ÙاÙد٠ردÙØ§Û GPS Ø´Ø®ØµÛ Ø´Ù
ا.
- allow_write_gpx: Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø±Ø¯ÙØ§Û GPS
+ allow_write_gpx: Ø¨Ø§Ø±Ú¯Ø°Ø§Ø±Û Ø±Ø¯ÙØ§Û GPS.
allow_write_notes: اصÙØ§Ø ÛادداشتâÙا.
grant_access: Ø¯Ø³ØªØ±Ø³Û Ù
ÛâدÙÙ
authorize_success:
@@ -2418,9 +2417,11 @@ fa:
unhide_comment: ÙÙ
اÛØ´
notes:
new:
- intro: ÚÛØ²Û Ù
Ø´Ú©Ù Ø¯Ø§Ø±Ø¯Ø Ø¨Ù ÙÙØ´ÙâÚ©Ø´âÙØ§Û Ø¯Ûگر اصÙاع دÙÛد تا آ٠را اصÙØ§Ø Ú©ÙÙد.
- عÙاÙ
ت Ù
ÙØ´Ùار٠را بر رÙÛ Ù
ØÙÛ Ú©Ù Ù
شک٠دارد Ùرار دÙÛد Ù Ù
شک٠را Ø´Ø±Ø Ø¯ÙÛد (ÙØ·ÙاÙ
- اطÙاعات Ø´Ø®ØµÛ Ø¯Ø± بخش ÙÙÙÛسÛد Ûا اطÙØ§Ø¹Ø§ØªÛ Ø§Ø² Ø٠تکثÛر ÙÙØ´Ù Ûا ÙÙرست داÛرکتÙرÛâÙا)
+ intro: Ù
Ø´Ú©ÙÛ Ø¨Ø± رÙÛ ÙÙØ´Ù Ù¾Ûدا کردÙâاÛد Ûا ÚÛØ²Û Ø§Ø² ÙÙÙ
اÙتادÙØ Ø¨Ù ÙÙØ´ÙâÚ©Ø´âÙاÛ
+ دÛگر اطÙاع دÙÛد تا آ٠را اصÙØ§Ø Ú©ÙÙد. ÙشاÙ٠را بر رÙÛ Ù
ØÙÛ Ú©Ù Ù
شک٠دارد Ùرار
+ دÙÛد ٠با ÙÙشت٠ÛØ§Ø¯Ø¯Ø§Ø´ØªØ Ù
شک٠را بÙâØ·Ùر کاÙ
Ù Ø´Ø±Ø Ø¯ÙÛد.
+ advice: ÙÙ
Ù٠اÙراد اÛÙ Ûادداشت Ø´Ù
ا را Ù
ÛâبÛÙÙد. بÙابراÛ٠اطÙاعات خصÙØµÛ Ûا
+ اطÙاعات برداشتâشد٠از Ù
Ùابع Ø¯Ø§Ø±Ø§Û Ø٠تکثÛر را اÛÙجا ÙÙÙÛسÛد.
add: اÙزÙد٠Ûادداشت
show:
anonymous_warning: اÛÙ Ûادداشت شاÙ
Ù Ùظرات کاربرا٠ÙاشÙاس است ک٠باÛد بÙâØ·Ùر
@@ -2428,7 +2429,7 @@ fa:
hide: ÙÙÙتÙ
resolve: Ø٠شد
reactivate: ÙØ¹Ø§Ù Ø³Ø§Ø²Û Ù
جدد
- comment_and_resolve: Ùظر ٠را٠ØÙ
+ comment_and_resolve: Ùظر + Ø٠شد
comment: Ùظر
edit_help: ÙÙش٠را جابجا Ú©ÙÛد ٠رÙÛ Ù
کاÙÛ Ú©Ù Ù
ÛâØ®ÙاÙÛد ÙÛراÛØ´ Ú©ÙÛد بزرگÙÙ
اÛÛ Ú©ÙÛدØ
سپس اÛÙجا Ú©ÙÛÚ© Ú©ÙÛد.
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index ec9a904ca..26cc5443c 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -23,8 +23,8 @@ gl:
activerecord:
models:
acl: Listaxe do control de acceso
- changeset: Conxunto de cambios
- changeset_tag: Etiqueta do conxunto de cambios
+ changeset: Conxunto de mudanzas
+ changeset_tag: Etiqueta do conxunto de mudanzas
country: PaÃs
diary_comment: Comentario do diario
diary_entry: Entrada do diario
@@ -115,7 +115,7 @@ gl:
edited_by_html: Editado hai %{time} por %{user}
closed_by_html: Pechado hai %{time} por %{user}
version: Versión
- in_changeset: Conxunto de cambios
+ in_changeset: Conxunto de mudanzas
anonymous: anónimo
no_comment: (sen comentarios)
part_of: Parte de
@@ -124,7 +124,7 @@ gl:
view_details: Ve-los detalles
location: 'Localización:'
changeset:
- title: 'Conxunto de cambios: %{id}'
+ title: 'Conxunto de mudanzas: %{id}'
belongs_to: Autor
node: Nós (%{count})
node_paginated: Nós (%{x}-%{y} de %{count})
@@ -136,15 +136,15 @@ gl:
hidden_commented_by: Comentario agochado de %{user}
hai %{when}
commented_by: Comentario de %{user} hai %{when}
- changesetxml: Conxunto de cambios do XML
+ changesetxml: Conxunto de mudanzas do XML
osmchangexml: osmChange XML
feed:
- title: Conxunto de cambios %{id}
- title_comment: Conxunto de cambios %{id} - %{comment}
+ title: Conxunto de mudanzas %{id}
+ title_comment: Conxunto de mudanzas %{id} - %{comment}
join_discussion: Inicia-la sesión pra unirse á parola
discussion: Parola
- still_open: O conxunto de cambios segue aberto - Abrirase a parola cando o conxunto
- de cambios estea pechado.
+ still_open: O conxunto de mudanzas segue aberto - Abrirase a parola cando o
+ conxunto de mudanzas estea pechado.
node:
title: 'Nó: %{name}'
history_title: 'Historial do nó: %{name}'
@@ -175,7 +175,7 @@ gl:
node: nó
way: camiño
relation: relación
- changeset: conxunto de cambios
+ changeset: conxunto de mudanzas
note: nota
timeout:
sorry: Tardouse demasiado en obter os datos para o %{type} co id %{id}.
@@ -183,7 +183,7 @@ gl:
node: nó
way: camiño
relation: relación
- changeset: conxunto de cambios
+ changeset: conxunto de mudanzas
note: nota
redacted:
redaction: Redacción %{id}
@@ -229,8 +229,8 @@ gl:
report: Informar desta nota
query:
title: Consulta-las caracterÃsticas
- introduction: Prema no mapa para atopar caracterÃsticas preto de aquÃ.
- nearby: CaracterÃsticas preto de aquÃ
+ introduction: Prema no mapa para atopar caracterÃsticas preto daquÃ.
+ nearby: CaracterÃsticas preto daquÃ
enclosing: CaracterÃsticas envolventes
changeset:
changeset_paging_nav:
@@ -240,7 +240,7 @@ gl:
changeset:
anonymous: Anónimo
no_edits: (sen edicións)
- view_changeset_details: Ve-los detalles do conxunto de cambios
+ view_changeset_details: Ve-los detalles do conxunto de mudanzas
changesets:
id: ID
saved_at: Gardado o
@@ -248,24 +248,24 @@ gl:
comment: Comentario
area: Zona
index:
- title: Conxuntos de cambios
- title_user: Conxuntos de cambios por %{user}
- title_friend: Conxuntos de cambios das amizades
- title_nearby: Conxuntos de cambios dos usuarios de lugares preto de ti
- empty: Non se atoparon conxuntos de cambios.
- empty_area: Non hai conxuntos de cambios nesta zona.
- empty_user: Non hai conxuntos de cambios deste usuario.
- no_more: Non se atoparon máis conxuntos de cambios.
- no_more_area: Non hai máis conxuntos de cambios nesta zona.
- no_more_user: Non hai máis conxuntos de cambios deste usuario.
+ title: Conxuntos de mudanzas
+ title_user: Conxuntos de mudanzas por %{user}
+ title_friend: Conxuntos de mudanzas das amizades
+ title_nearby: Conxuntos de mudanzas dos usuarios de lugares preto de ti
+ empty: Non se atoparon conxuntos de mudanzas.
+ empty_area: Non hai conxuntos de mudanzas nesta zona.
+ empty_user: Non hai conxuntos de mudanzas deste usuario.
+ no_more: Non se atoparon máis conxuntos de mudanzas.
+ no_more_area: Non hai máis conxuntos de mudanzas nesta zona.
+ no_more_user: Non hai máis conxuntos de mudanzas deste usuario.
load_more: Cargar máis
timeout:
- sorry: Desculpe que levase moito tempo obter a listaxe do conxunto de cambios
+ sorry: Desculpe que levase moito tempo obte-la listaxe do conxunto de mudanzas
que solicitou.
rss:
title_all: Parola da edición no OpenStreetMap
title_particular: 'Parola da edición #%{changeset_id} no OpenStreetMap'
- comment: 'Novo comentario sobre os cambios #%{changeset_id} de %{author}'
+ comment: 'Novo comentario sobre as mudanzas #%{changeset_id} de %{author}'
commented_at_html: Actualizado hai %{when}
commented_at_by_html: Actualizado hai %{when} por %{user}
full: Parola completa
@@ -794,7 +794,7 @@ gl:
stop: Parada de ferrocarril
subway: Metro
subway_entrance: Boca de metro
- switch: Puntos de cambio de vÃa
+ switch: Puntos de mudanza de vÃa
tram: VÃa de tranvÃas
tram_stop: Parada de tranvÃas
shop:
@@ -1151,13 +1151,13 @@ gl:
subject: '[OpenStreetMap] Confirme o seu enderezo de correo electrónico'
email_confirm_plain:
greeting: 'Ola:'
- hopefully_you: Alguén (probablemente vostede) quere cambiar o seu enderezo de
+ hopefully_you: Alguén (probábelmente vostede) quere muda-lo seu enderezo do
correo electrónico en %{server_url} a %{new_address}.
click_the_link: Se este é vostede, prema na seguinte ligazón para confirma-la
modificación.
email_confirm_html:
greeting: 'Ola:'
- hopefully_you: Alguén (probablemente vostede) quere cambiar o seu enderezo de
+ hopefully_you: Alguén (probábelmente vostede) quere muda-lo seu enderezo do
correo electrónico en %{server_url} a %{new_address}.
click_the_link: Se este é vostede, prema na seguinte ligazón para confirma-la
modificación.
@@ -1206,17 +1206,17 @@ gl:
greeting: Ola,
commented:
subject_own: O %{commenter} de [OpenStreetMap] fixo un comentario nun dos
- seus conxuntos de cambios
- subject_other: '[OpenStreetMap] %{commenter} comentou nun conxunto de cambios
+ seus conxuntos de mudanzas
+ subject_other: '[OpenStreetMap] %{commenter} comentou nun conxunto de mudanzas
no que estás atinxido'
your_changeset: '%{commenter} deixou un comentario nun dos seus conxuntos
- de cambios xerado o %{time}'
- commented_changeset: '%{commenter} deixou un comentario nun conxunto de cambios
- do mapa que está seguindo, xerado por %{changeset_author} o %{time}'
+ de mudanzas xerado o %{time}'
+ commented_changeset: '%{commenter} deixou un comentario nun conxunto de mudanzas
+ do mapa que está a seguer, xerado por %{changeset_author} o %{time}'
partial_changeset_with_comment: co comentario '%{changeset_comment}'
partial_changeset_without_comment: sen comentarios
- details: Pódense atopar máis detalles acerca do conxunto de cambios en %{url}.
- unsubscribe: Para darse de baixa das actualizacións deste conxunto de cambios,
+ details: Pódense atopar máis detalles acerca do conxunto de mudanzas en %{url}.
+ unsubscribe: Para darse de baixa das actualizacións deste conxunto de mudanzas,
olle %{url} e prema en "darse de baixa".
messages:
inbox:
@@ -1489,12 +1489,12 @@ gl:
Flash de OpenStreetMap. Pode descargar
Flash do sitio Adobe.com. Tamén
están dispoñÃbeis outras opcións para editar OpenStreetMap.
- potlatch_unsaved_changes: Ten cambios sen gardar. (Para gardalos no Potlatch
- ten que desmarcar o camiño actual ou o punto se está a editar no modo en vivo
+ potlatch_unsaved_changes: Ten mudanzas sen gardar. (Para gardalas no Potlatch
+ ten que desmarca-la vÃa actual ou o punto se está a editar no modo ao vivo
ou premer sobre o botón "Gardar".)
potlatch2_not_configured: O Potlatch 2 non está configurado; consulte https://wiki.openstreetmap.org/wiki/The_Rails_Port
para obter máis información
- potlatch2_unsaved_changes: Ten cambios sen gardar. (Para gardar no Potlatch
+ potlatch2_unsaved_changes: Ten mudanzas sen gardar. (Para gardar no Potlatch
2, prema en "Gardar".)
id_not_configured: O iD non está configurado
no_iframe_support: O seu navegador non soporta os iframes HTML, necesarios para
@@ -1801,7 +1801,7 @@ gl:
description: 'Descrición:'
tags: 'Etiquetas:'
tags_help: separadas por comas
- save_button: Garda-los cambios
+ save_button: Garda-las mudanzas
visibility: 'Visibilidade:'
visibility_help: que significa isto?
visibility_help_url: https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces
@@ -2186,9 +2186,9 @@ gl:
unhide_user: Descobrir este usuario
delete_user: Borrar este usuario
confirm: Confirmar
- friends_changesets: conxuntos de cambios das amizades
+ friends_changesets: conxuntos de mudanzas das amizades
friends_diaries: entradas de diario das amizades
- nearby_changesets: conxuntos de cambios dos usuarios de lugares preto de ti
+ nearby_changesets: conxuntos de mudanzas dos usuarios de lugares preto de ti
nearby_diaries: entradas de diario dos usuarios de lugares preto de ti
report: Denunciar este usuario
popup:
@@ -2254,7 +2254,7 @@ gl:
longitude: 'Lonxitude:'
update home location on click: Quere actualiza-lo lugar do enderezo ó premer
sobre o mapa?
- save changes button: Garda-los cambios
+ save changes button: Garda-las mudanzas
make edits public button: Facer públicas todas as miñas edicións
return to profile: Voltar ó perfil
flash update success confirm needed: Información de usuario actualizada correctamente.
@@ -2280,11 +2280,11 @@ gl:
proceso sen problemas.
failure: Non se atopou o usuario "%{name}".
confirm_email:
- heading: Confirma-lo cambio do enderezo de correo electrónico
+ heading: Confirma-la mudanza do enderezo de correo electrónico
press confirm button: Prema sobre o botón de confirmación que aparece deseguido
para confirmar o seu novo enderezo de correo electrónico.
button: Confirmar
- success: Confirmámoslle o cambio enderezo de enderezo electrónico!
+ success: Confirmámoslle a mudanza do enderezo de correo electrónico!
failure: Xa se confirmou un enderezo de correo electrónico con este pase.
unknown_token: Ese código de confirmación caducou ou non existe.
set_home:
@@ -2725,7 +2725,7 @@ gl:
create:
flash: Redacción creada.
update:
- flash: Gardáronse os cambios.
+ flash: Gardáronse as mudanzas.
destroy:
not_empty: A redacción non está baleira. Elimine todas as versións previas pertencentes
a esta redacción antes de destruÃla.
diff --git a/config/locales/lv.yml b/config/locales/lv.yml
index 786bf965f..be3e04583 100644
--- a/config/locales/lv.yml
+++ b/config/locales/lv.yml
@@ -222,6 +222,7 @@ lv:
reopened_by_anonymous: Atkal aktivizÄja anonÄ«ms %{when}
atpakaļ
hidden_by: PaslÄpa %{user} %{when} atpakaļ
+ report: ZiÅot par Å¡o piezÄ«mi
query:
title: VaicÄjuma funkcijas
introduction: NoklikÅ¡Ä·iniet uz kartes, lai atrastu tuvumÄ esoÅ¡os objektus.
@@ -623,6 +624,7 @@ lv:
bridge: Tilts
bunker_silo: Bunkurs
chimney: Skurstenis
+ flagpole: Karoga masts
lighthouse: BÄka
pipeline: Cauruļvads
tower: Tornis
@@ -801,6 +803,7 @@ lv:
pet: Zooveikals
pharmacy: Aptieka
photo: Fotoveikals
+ seafood: JÅ«ras veltes
second_hand: Lietoto preÄu veikals
shoes: Apavu veikals
sports: Sporta veikals
@@ -879,6 +882,7 @@ lv:
index:
search: MeklÄt
status: Statuss
+ reports: ZiÅojumi
states:
ignored: IgnorÄts
open: AtvÄrt
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index f14976f12..28b3d7f59 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -10,6 +10,7 @@
# Author: Greencaps
# Author: HanV
# Author: Hansmuller
+# Author: Henke
# Author: JaapDeKleine
# Author: Jochempluim
# Author: Joost schouppe
@@ -24,6 +25,7 @@
# Author: MrLeopold
# Author: Optilete
# Author: Pje335
+# Author: Robin van der Linde
# Author: Robin van der Vliet
# Author: Robin0van0der0vliet
# Author: Romaine
@@ -252,6 +254,7 @@ nl:
reopened_by_anonymous: %{when} geleden opnieuw
geactiveerd door anoniem
hidden_by: %{when} ago verborgen door %{user}
+ report: Notitie rapporteren
query:
title: Nabije objecten opvragen
introduction: Klik op de kaart om nabije eigenschappen te ontdekken.
@@ -348,6 +351,7 @@ nl:
comment_from: Reactie van %{link_user} op %{comment_created_at}
hide_link: Reactie verbergen
confirm: Bevestigen
+ report: Rapporteer deze opmerking
location:
location: 'Locatie:'
view: Bekijken
@@ -499,6 +503,7 @@ nl:
protected_area: Beschermd gebied
bridge:
aqueduct: Aquaduct
+ boardwalk: Plankenweg
suspension: Hangbrug
swing: Draaibrug
viaduct: Viaduct
@@ -524,11 +529,11 @@ nl:
water_tank: Watertank voor noodgevallen
"yes": Noodgeval
highway:
- abandoned: Verlaten snelweg
+ abandoned: Verlaten weg
bridleway: Ruiterpad
bus_guideway: Vrijliggende busbaan
bus_stop: Bushalte
- construction: Snelweg in aanbouw
+ construction: Weg in aanbouw
corridor: Corridor
cycleway: Fietspad
elevator: Lift
@@ -565,7 +570,7 @@ nl:
track: Veld- of bosweg
traffic_signals: Verkeerslichten
trail: Pad
- trunk: Autosnelweg
+ trunk: Autoweg
trunk_link: Autoweg
turning_loop: Keerlus
unclassified: Ongeclassificeerde weg
@@ -691,6 +696,7 @@ nl:
wastewater_plant: Afvalwaterzuivering
watermill: Watermolen
water_tower: Watertoren
+ water_well: Put
water_works: Waterwerken
windmill: Windmolen
works: Fabriek
@@ -780,7 +786,7 @@ nl:
square: Plein
state: Staat
subdivision: Deelgebied
- suburb: Buitenwijk
+ suburb: Stadsdeel
town: Stad
unincorporated_area: Gemeentevrij gebied
village: Dorp
@@ -870,9 +876,11 @@ nl:
organic: Organische winkel
outdoor: Buitensportwinkel
paint: Verfwinkel
+ pawnbroker: Pandmakelaar
pet: Dierenwinkel
pharmacy: Apotheek
photo: Fotowinkel
+ seafood: Zeevruchten
second_hand: Kringloopwinkel
shoes: Schoenenzaak
sports: Sportwinkel
@@ -882,6 +890,7 @@ nl:
tobacco: Tabakswinkel
toys: Speelgoedwinkel
travel_agency: Reisbureau
+ tyres: Bandenwinkel
video: Videotheek
wine: Wijnwinkel
"yes": Winkel
@@ -935,7 +944,7 @@ nl:
level6: Countygrens
level8: Stadsgrens
level9: Dorpsgrens
- level10: Wijkgrens
+ level10: Stadsdeelgrens
description:
title:
osm_nominatim: Locatie van OpenStreetMap
@@ -948,6 +957,74 @@ nl:
results:
no_results: Geen resultaten gevonden
more_results: Meer resultaten
+ issues:
+ index:
+ title: Problemen
+ select_status: Selecteer Status
+ select_type: Selecteer Type
+ select_last_updated_by: Selecteer Laats Bijgewerkt Door
+ reported_user: Gerapporteerde Gebruiker
+ not_updated: Niet Bijgewerkt
+ search: Zoeken
+ search_guidance: 'Zoek Problemen:'
+ user_not_found: Gebruiker bestaat niet
+ status: Status
+ reports: Rapportages
+ last_updated: Laatst Bijgewerkt
+ reported_item: Gerapporteerd Item
+ states:
+ ignored: Genegeerd
+ open: Open
+ resolved: Opgelost
+ update:
+ new_report: Uw rapport is succesvol geregistreerd
+ successful_update: Uw rapport is succesvol bijgewerkt
+ provide_details: Geef a.u.b. de vereiste gegevens in
+ show:
+ title: '%{status} Probleem #%{issue_id}'
+ report_created_at: Voor het eerst vermeld op %{datetime}
+ last_resolved_at: Laatst opgelost op %{datetime}
+ last_updated_at: Laatst bijgewerkt op %{datetime} door %{displayname}
+ resolve: Oplossen
+ ignore: Negeren
+ reopen: Heropenen
+ reports_of_this_issue: Meldingen van deze kwestie
+ read_reports: Lees Meldingen
+ new_reports: Nieuwe Meldingen
+ other_issues_against_this_user: Andere problemen met deze gebruiker
+ no_other_issues: Geen andere problemen tegen deze gebruiker.
+ comments_on_this_issue: Commentaar op deze kwestie
+ resolve:
+ resolved: De status van het probleem is ingesteld op 'Opgelost'
+ ignore:
+ ignored: De status van het probleem is ingesteld op 'Genegeerd'
+ reopen:
+ reopened: De status van het probleem is ingesteld op 'Open'
+ comments:
+ created_at: Op %{datetime}
+ reassign_param: Probleem opnieuw toewijzen?
+ reports:
+ updated_at: Op %{datetime}
+ reported_by_html: Gerapporteerd als %{category} door %{user}
+ helper:
+ reportable_title:
+ diary_comment: '%{entry_title}, commentaar #%{comment_id}'
+ note: 'Nota #%{note_id}'
+ issue_comments:
+ create:
+ comment_created: Je reactie is succesvol gemaakt
+ reports:
+ new:
+ categories:
+ diary_entry:
+ other_label: Anders
+ diary_comment:
+ other_label: Anders
+ user:
+ other_label: Anders
+ note:
+ spam_label: Deze notitie is spam
+ other_label: Anders
layouts:
logo:
alt_text: Logo OpenStreetMap
@@ -973,6 +1050,8 @@ nl:
intro_text: OpenStreetMap is een kaart van de wereld, gemaakt door mensen zoals
u en vrij te gebruiken onder een open licentie.
intro_2_create_account: Maak een gebruiker aan
+ hosting_partners_html: Hosting wordt ondersteund door %{ucl}, %{bytemark}, en
+ andere %{partners}.
partners_ucl: het UCL VR Centre
partners_bytemark: Bytemark Hosting
partners_partners: partners
@@ -2061,6 +2140,7 @@ nl:
friends_diaries: dagboekberichten van vrienden
nearby_changesets: wijzigingensets van gebruikers in de buurt
nearby_diaries: dagboekberichten van gebruikers in de buurt
+ report: Rapporteer deze Gebruiker
popup:
your location: Uw locatie
nearby mapper: Dichtbijzijnde mapper
@@ -2500,6 +2580,14 @@ nl:
roundabout_with_exit: Neem op de rotonde afslag %{exit} naar %{name}
unnamed: naamloos
courtesy: Routebeschrijving met dank aan %{link}
+ exit_counts:
+ first: 1e
+ second: 2e
+ third: 3e
+ fourth: 4e
+ fifth: 5e
+ sixth: 6e
+ seventh: 7e
time: Tijd
query:
node: Node
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index bf63c2946..b96c5c694 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -2091,6 +2091,7 @@ pt-PT:
terms accepted: Obrigado por aceitar os novos termos de colaborador!
terms declined: Lamentamos não ter aceitado os novos Termos de Colaborador.
Para obter mais informações consulte esta página wiki.
+ terms declined url: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
terms:
title: Termos de colaborador
heading: Termos de colaborador
@@ -2100,9 +2101,11 @@ pt-PT:
consider_pd: para além do acordo exposto acima, considero que as minhas contribuições
se encontram em DomÃnio Público.
consider_pd_why: O que é isto?
+ consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
guidance: 'Informação para ajudar a compreender os termos: um resumo
inteligÃvel e algumas traduções informais'
agree: Aceitar
+ declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
decline: Rejeitar
you need to accept or decline: Por favor leia e depois aceite ou recuse os novos
Termos de Colaborador para continuar.
@@ -2225,6 +2228,7 @@ pt-PT:
os Termos de Colaborador.
agreed_with_pd: Também declarou que as suas edições são disponibilizadas em
DomÃnio Público.
+ link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
link text: o que é isto?
profile description: 'Descrição do perfil:'
preferred languages: 'LÃnguas preferidas:'
@@ -2232,6 +2236,7 @@ pt-PT:
image: 'Imagem:'
gravatar:
gravatar: Usar imagem do site Gravatar
+ link: https://wiki.openstreetmap.org/wiki/Gravatar
link text: o que é isto?
disabled: O Gravatar foi desativado.
enabled: A visualização do seu avatar de Gravatar foi ativada.
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index b670383ad..cb80616a4 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -1272,7 +1272,7 @@ sr:
attribution_example:
alt: ÐÑÐ¸Ð¼ÐµÑ ÐºÐ°ÐºÐ¾ да наведеÑе ÐпенÑÑÑиÑмап на Ð½ÐµÐºÐ¾Ñ ÑÑÑаниÑи
title: ÐÑÐ¸Ð¼ÐµÑ Ð·Ð° навоÑеÑе
- more_title_html: Ð¡Ð°Ð·Ð½Ð°Ñ Ð²Ð¸Ñе
+ more_title_html: ÐиÑе о
more_1_html: |-
ÐиÑе о ÑпоÑÑеби подаÑака и како да Ð½Ð°Ñ Ð½Ð°Ð²Ð¾Ð´Ð¸Ñе можеÑе наÑи на ÑÑÑаниÑи лиÑенÑе OSMF и Ñ à¸à¸±à¹à¸à¸à¸à¸à¸à¸²à¸£à¸¥à¸à¸à¹à¸à¸¡à¸¹à¸¥à¸¥à¸°à¹à¸¡à¸´à¸à¸¥à¸´à¸à¸ªà¸´à¸à¸à¸´à¹ หรืà¸à¹à¸à¹à¸à¹à¸à¹à¸à¸µà¹
หà¸à¹à¸²à¸£à¸±à¸à¹à¸à¹à¸à¸à¸²à¸£à¸¥à¸°à¹à¸¡à¸´à¸à¸à¹à¸à¸¡à¸¹à¸¥à¸¥à¸´à¸à¸ªà¸´à¸à¸à¸´à¹
- trademarks_title_html: à¹à¸à¸£à¸·à¸à¸à¸«à¸¡à¸²à¸¢à¸à¸²à¸£à¸à¹à¸²
+ trademarks_title_html: à¹à¸à¸£à¸·à¹à¸à¸à¸«à¸¡à¸²à¸¢à¸à¸²à¸£à¸à¹à¸²
+ trademarks_1_html: OpenStreetMap, State of the Map, à¹à¸¥à¸°à¸à¸£à¸²à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸à¹à¹à¸§à¹à¸à¸à¸¢à¸²à¸¢
+ à¹à¸à¹à¸à¹à¸à¸£à¸·à¹à¸à¸à¸«à¸¡à¸²à¸¢à¸à¸²à¸£à¸à¹à¸²à¸à¸à¸à¸°à¹à¸à¸µà¸¢à¸à¸à¸à¸à¸¡à¸¹à¸¥à¸à¸´à¸à¸´ OpenStreetMap, หาà¸à¸à¸¸à¸à¸¡à¸µà¸à¹à¸à¸ªà¸à¸ªà¸±à¸¢à¹à¸à¸µà¹à¸¢à¸§à¸à¸±à¸à¸à¸²à¸£à¹à¸à¹à¸à¸·à¹à¸à¹à¸¥à¸°à¸à¸£à¸²à¸ªà¸±à¸à¸¥à¸±à¸à¸©à¸à¹à¸à¸à¸à¹à¸£à¸²
+ สามารà¸à¸à¸£à¸§à¸à¸ªà¸à¸à¸£à¸²à¸¢à¸¥à¸°à¹à¸à¸µà¸¢à¸à¹à¸à¹à¸à¸µà¹à¸«à¸à¹à¸²à¸à¹à¸¢à¸à¸²à¸¢à¹à¸à¸£à¸·à¹à¸à¸à¸«à¸¡à¸²à¸¢à¸à¸²à¸£à¸à¹à¸²
index:
js_1: à¸à¹à¸²à¸à¸à¸³à¸¥à¸±à¸à¹à¸à¹à¹à¸à¸£à¸²à¸§à¹à¹à¸à¸à¸£à¹à¸à¸µà¹à¹à¸¡à¹à¸£à¸à¸à¸£à¸±à¸à¸à¸²à¸§à¸²à¸ªà¸à¸£à¸´à¸à¸à¹ หรืà¸à¸à¹à¸²à¸à¸à¸´à¸à¹à¸à¹à¸à¸²à¸à¸à¸²à¸§à¸²à¸ªà¸à¸£à¸´à¸à¸à¹
js_2: OpenStreetMap à¹à¸à¹à¸à¸²à¸§à¸²à¸ªà¸à¸£à¸´à¸à¸à¹à¹à¸à¸à¸²à¸£à¹à¸ªà¸à¸à¹à¸à¸à¸à¸µà¹
@@ -1535,6 +1546,8 @@ th:
upload_trace: à¸à¸±à¸à¹à¸«à¸¥à¸à¸£à¸à¸¢à¸à¸²à¸ GPS
trace_uploaded: à¹à¸à¹à¸¡à¸à¹à¸à¸¡à¸¹à¸¥ GPX à¸à¸à¸à¸à¹à¸²à¸à¸à¸±à¸à¹à¸«à¸¥à¸à¹à¸à¹à¸²à¸£à¸°à¸à¸à¹à¸¥à¹à¸§ à¸à¸³à¸¥à¸±à¸à¸£à¸à¸à¸£à¸£à¸à¸¸à¹à¸à¹à¸²à¸à¸²à¸à¸à¹à¸à¸¡à¸¹à¸¥
à¸à¸¶à¹à¸à¸à¸°à¹à¸à¹à¹à¸§à¸¥à¸²à¸à¸£à¸°à¸¡à¸²à¸à¸à¸£à¸¶à¹à¸à¸à¸±à¹à¸§à¹à¸¡à¸ à¹à¸¡à¸·à¹à¸à¸à¸£à¸°à¸à¸§à¸à¸à¸²à¸£à¹à¸£à¸µà¸¢à¸à¸£à¹à¸à¸¢à¹à¸¥à¹à¸§à¸à¸°à¸¡à¸µà¸à¸µà¹à¸¡à¸¥à¹à¸à¹à¸à¸à¹à¸²à¸à¹à¸«à¹à¸à¸£à¸²à¸
+ traces_waiting: à¸à¸¸à¸à¸¡à¸µà¸£à¸à¸¢à¸à¸²à¸ %{count} à¸à¸¸à¸ à¸à¸µà¹à¸à¸³à¸¥à¸±à¸à¸£à¸à¸à¸±à¸à¹à¸«à¸¥à¸ à¸à¸£à¸¸à¸à¸²à¸£à¸à¹à¸«à¹à¸à¸²à¸£à¸à¸±à¸à¹à¸«à¸¥à¸à¹à¸«à¸¥à¹à¸²à¸à¸µà¹à¹à¸ªà¸£à¹à¸à¸ªà¸´à¹à¸
+ à¸à¹à¸à¸à¸à¸µà¹à¸à¸°à¹à¸à¸´à¹à¸¡à¸£à¸à¸¢à¸à¸²à¸à¸à¸¸à¸à¸à¹à¸à¹à¸, à¹à¸à¸·à¹à¸à¹à¸¡à¹à¹à¸«à¹à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸·à¹à¸à¹ à¸à¸°à¸à¹à¸à¸à¸£à¸à¸à¸´à¸§à¸à¸²à¸
edit:
filename: 'à¸à¸·à¹à¸à¹à¸à¹à¸¡:'
download: à¸à¸²à¸§à¸à¹à¹à¸«à¸¥à¸
@@ -1607,6 +1620,8 @@ th:
application:
require_cookies:
cookies_needed: à¸à¸¹à¹à¸«à¸¡à¸·à¸à¸à¸§à¹à¸²à¸à¸¸à¸à¸à¸´à¸à¹à¸à¹à¸à¸²à¸à¸à¸¸à¸à¸à¸µà¹à¸à¸¢à¸¹à¹, à¸à¸£à¸¸à¸à¸²à¹à¸à¸´à¸à¹à¸à¹à¸à¸²à¸à¸à¸¸à¸à¸à¸µà¹à¹à¸à¸à¸£à¸²à¸§à¹à¸à¸à¸£à¹à¸à¸à¸à¸à¸¸à¸à¸à¹à¸à¸à¸à¸°à¸à¸³à¹à¸à¸´à¸à¸à¸²à¸£à¸à¹à¸
+ setup_user_auth:
+ blocked: à¸à¸¸à¸à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¸à¸²à¸£à¹à¸à¹à¸²à¸à¸¶à¸ API, à¸à¸£à¸¸à¸à¸²à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¸²à¸à¸«à¸à¹à¸²à¹à¸§à¹à¸à¸«à¸¥à¸±à¸à¸«à¸²à¸à¸à¹à¸à¸à¸à¸²à¸£à¸à¸£à¸²à¸à¸ªà¸²à¹à¸«à¸à¸¸à¸à¸µà¹à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¸à¸£à¸±à¹à¸à¸à¸µà¹
oauth:
authorize:
title: à¸à¸à¸¸à¸à¸²à¸à¸à¸²à¸£à¹à¸à¹à¸²à¸à¸¶à¸à¸à¸±à¸à¸à¸µà¸à¸à¸à¸à¸¸à¸
@@ -1711,6 +1726,9 @@ th:
no account: ยัà¸à¹à¸¡à¹à¹à¸à¹à¹à¸à¹à¸à¸ªà¸¡à¸²à¸à¸´à¸?
account not active: à¸à¸à¸à¸ ัย à¸à¸±à¸à¸à¸µà¸à¸à¸à¸à¹à¸²à¸à¸¢à¸±à¸à¹à¸¡à¹à¹à¸à¸´à¸à¹à¸à¹à¸à¸²à¸
à¹à¸à¸£à¸à¹à¸à¹à¸¥à¸´à¸à¸à¹à¸à¸µà¹à¹à¸«à¹à¹à¸§à¹à¹à¸à¸à¸µà¹à¸¡à¸¥à¸à¸à¸à¸£à¸±à¸à¹à¸à¸·à¹à¸à¹à¸à¸´à¸à¹à¸à¹à¸à¸²à¸à¸à¸±à¸à¸à¸µ
หรืà¸à¸à¸à¸à¸µà¹à¸¡à¸¥à¸à¸à¸à¸£à¸±à¸à¹à¸«à¸¡à¹ หาà¸à¸ªà¸¹à¸à¸«à¸²à¸¢
+ account is suspended: à¸à¸à¸à¸ ัย à¸à¸±à¸à¸à¸µà¸à¸à¸à¸à¸¸à¸à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¸à¸²à¸£à¹à¸à¹à¸à¸²à¸à¹à¸à¸·à¹à¸à¸à¸à¸²à¸à¸à¸´à¸à¸à¸£à¸£à¸¡à¸à¸µà¹à¸à¹à¸²à¸ªà¸à¸ªà¸±à¸¢
หาà¸à¸à¹à¸à¸à¸à¸²à¸£à¸à¸¹à¸à¸à¸¸à¸¢à¹à¸à¸£à¸²à¸¢à¸¥à¸°à¹à¸à¸µà¸¢à¸
+ à¸à¸£à¸¸à¸à¸²à¸à¸´à¸à¸à¹à¸à¸à¸¹à¹à¸à¸¹à¹à¸¥à¸£à¸°à¸à¸
+ auth failure: à¸à¸à¸à¸ ัย à¹à¸¡à¹à¸ªà¸²à¸¡à¸²à¸£à¸à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¹à¸§à¸¢à¸à¸·à¹à¸à¸à¸¹à¹à¹à¸à¹à¹à¸¥à¸°à¸£à¸«à¸±à¸ªà¸à¹à¸²à¸à¸à¸±à¸à¸à¸¥à¹à¸²à¸§à¹à¸à¹
openid_logo_alt: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢ OpenID
auth_providers:
openid:
@@ -1730,11 +1748,13 @@ th:
alt: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢à¸à¸±à¸à¸à¸µ GitHub
wikipedia:
title: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢à¸§à¸´à¸à¸´à¸à¸µà¹à¸à¸µà¸¢
+ alt: à¹à¸à¹à¸²à¸ªà¸¹à¹à¸£à¸°à¸à¸à¸à¹à¸§à¸¢à¸à¸±à¸à¸à¸µà¸§à¸´à¸à¸´à¸à¸µà¹à¸à¸µà¸¢
yahoo:
title: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢ Yahoo
alt: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢ Yahoo OpenID
wordpress:
title: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢ Wordpress
+ alt: à¹à¸à¹à¸²à¸ªà¸¹à¹à¸£à¸°à¸à¸à¸à¹à¸§à¸¢ Wordpress OpenID
aol:
title: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢ AOL
alt: à¹à¸à¹à¸²à¹à¸à¹à¸à¸²à¸à¸à¹à¸§à¸¢ AOL OpenID
@@ -1804,7 +1824,7 @@ th:
my settings: à¸à¸²à¸£à¸à¸±à¹à¸à¸à¹à¸²à¸à¸à¸à¸à¸±à¸
my comments: à¸à¸§à¸²à¸¡à¸à¸´à¸à¹à¸«à¹à¸à¸à¸à¸à¸à¸±à¸
oauth settings: à¸à¸±à¹à¸à¸à¹à¸²à¸à¸²à¸£à¸à¸à¸¸à¸à¸²à¸ OAuth
- blocks on me: à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹à¸à¸µà¸à¸à¸±à¸à¸à¹à¸²à¸à¹à¸à¹à¸²
+ blocks on me: à¸à¸²à¸£à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¸à¸à¸à¸à¸±à¸
blocks by me: à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹à¸à¹à¸²à¸à¹à¸à¹à¸²à¸à¸µà¸à¸à¸±à¸
send message: สà¹à¸à¸à¹à¸à¸à¸§à¸²à¸¡
diary: à¸à¸±à¸à¸à¸¶à¸
@@ -1836,8 +1856,10 @@ th:
no nearby users: à¹à¸¡à¹à¹à¸à¹à¸¡à¸µà¸à¸¹à¹à¹à¸à¹à¸ªà¸à¸à¸à¸±à¸§à¸§à¹à¸²à¸à¸³à¹à¸à¸à¸à¸µà¹à¸à¸¢à¸¹à¹à¹à¸à¸¥à¹à¹à¸à¸µà¸¢à¸
role:
administrator: à¸à¸à¸à¸µà¹à¹à¸à¹à¸à¸à¸¹à¹à¸à¸¹à¹à¸¥à¸£à¸°à¸à¸
+ moderator: à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹à¹à¸à¹à¸à¸à¸¹à¹à¸à¸¹à¹à¸¥
+ block_history: à¸à¸²à¸£à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸à¹à¸à¸à¸±à¸à¸à¸¸à¸à¸±à¸
comments: à¸à¸§à¸²à¸¡à¹à¸«à¹à¸à¸à¸µà¹à¹à¸à¸µà¸¢à¸
- create_block: à¸à¸µà¸à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹
+ create_block: ระà¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹
activate_user: à¹à¸à¸´à¸à¹à¸à¹à¸à¸²à¸à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹
deactivate_user: à¸à¸´à¸à¹à¸à¹à¸à¸²à¸à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹
confirm: ยืà¸à¸¢à¸±à¸
@@ -1985,66 +2007,83 @@ th:
fail: à¹à¸¡à¹à¸ªà¸²à¸¡à¸²à¸£à¸à¸à¸à¸à¸à¸à¸à¸ªà¸à¸²à¸à¸° `%{role}' à¹à¸à¹à¸à¸¹à¹à¹à¸à¹ `%{name}' à¹à¸à¸£à¸à¸à¸£à¸§à¸à¸ªà¸à¸à¸§à¹à¸²à¸à¸±à¹à¸à¸à¸¹à¹à¹à¸à¹à¹à¸¥à¸°à¸ªà¸à¸²à¸à¸°à¹à¸à¹à¸à¸à¸µà¹à¸à¸¹à¸à¸à¹à¸à¸à¸à¸µà¹à¸¥à¹à¸§
user_blocks:
model:
- non_moderator_update: à¸à¹à¸à¸à¹à¸à¹à¸à¸à¸¹à¹à¸à¸¹à¹à¸¥à¸£à¸°à¸à¸à¸à¸¶à¸à¸à¸°à¸ªà¸²à¸¡à¸²à¸£à¸à¸ªà¸£à¹à¸²à¸à¸«à¸£à¸·à¸à¸à¸£à¸±à¸à¸à¸£à¸¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¹à¸à¹
+ non_moderator_update: à¸à¸°à¸à¹à¸à¸à¹à¸à¹à¸à¸à¸¹à¹à¸à¸¹à¹à¸¥à¸£à¸°à¸à¸à¸à¸¶à¸à¸à¸°à¸ªà¸²à¸¡à¸²à¸£à¸à¸£à¸°à¸à¸±à¸ หรืà¸à¹à¸à¹à¹à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¹à¸à¹
non_moderator_revoke: à¸à¹à¸à¸à¹à¸à¹à¸à¸à¸¹à¹à¸à¸¹à¹à¸¥à¸£à¸°à¸à¸à¸à¸¶à¸à¸à¸°à¸ªà¸²à¸¡à¸²à¸£à¸à¹à¸à¸´à¸à¸à¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¹à¸à¹
not_found:
- sorry: à¸à¸à¸à¸ ัย à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸£à¸«à¸±à¸ª %{id} à¹à¸¡à¹à¸à¸
+ sorry: à¸à¸à¸à¸ ัย à¹à¸¡à¹à¸à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸²à¸¡à¸«à¸¡à¸²à¸¢à¹à¸¥à¸à¸à¹à¸²à¸à¸à¸´à¸ %{id} à¸à¸µà¹à¸£à¸°à¸à¸¸à¸¡à¸²
back: à¸à¸¥à¸±à¸à¹à¸à¸à¸µà¹à¸à¸±à¸à¸à¸µ
new:
- title: สรà¹à¸²à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸ %{name}
+ title: ระà¸à¸±à¸à¸à¸¹à¹à¹à¸à¹ %{name}
heading: สรà¹à¸²à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸ %{name}
- reason: à¹à¸«à¸à¸¸à¸à¸¥à¸à¸µà¹à¸à¸¹à¹à¹à¸à¹ %{name} à¸à¸¹à¸à¸à¸µà¸à¸à¸±à¸ à¹à¸à¸£à¸à¸à¸¢à¹à¸²à¹à¸à¹à¸à¸²à¸£à¸¡à¸à¹à¸£à¸¸à¸à¹à¸£à¸à¹à¸à¸£à¸°à¸«à¸§à¹à¸²à¸à¸£à¸°à¸à¸¸
- à¹à¸¥à¸°à¸à¸à¹à¸«à¹à¸£à¸°à¸à¸¸à¸£à¸²à¸¢à¸¥à¸°à¹à¸à¸µà¸¢à¸à¹à¸à¸µà¹à¸¢à¸§à¸à¸±à¸à¸ªà¸à¸²à¸à¸à¸²à¸£à¸à¹à¸à¸µà¹à¸à¸à¹à¸«à¹à¸¥à¸°à¹à¸à¸µà¸¢à¸à¸à¸±à¸à¹à¸à¸ à¸à¸³à¹à¸§à¹à¸§à¹à¸²à¸à¹à¸à¸à¸§à¸²à¸¡à¸à¸µà¹à¸à¹à¸²à¸à¸à¸´à¸¡à¸à¹à¸à¸°à¸à¸£à¸²à¸à¸à¸à¹à¸à¸ªà¸²à¸à¸²à¸£à¸à¸°
- à¸à¸¹à¹à¹à¸à¹à¸à¸¸à¸à¸à¹à¸²à¸à¹à¸¡à¹à¸à¸³à¸à¹à¸à¸à¹à¸à¹à¸²à¹à¸à¸à¸¶à¸à¸¨à¸±à¸à¸à¹à¹à¸à¸à¸²à¸° à¸à¸¶à¸à¸à¸à¹à¸à¸°à¸à¸³à¹à¸«à¹à¹à¸à¹à¸¨à¸±à¸à¸à¹à¸à¸¢à¹à¸²à¸à¸à¹à¸²à¸¢
- period: à¸à¹à¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¸à¸²à¸ API à¸à¸±à¸à¹à¸à¹à¸à¸±à¸à¸à¸µà¹ à¸à¸²à¸à¹à¸à¹à¸²à¹à¸
+ reason: à¹à¸«à¸à¸¸à¸à¸¥à¸à¸µà¹à¸à¸¹à¹à¹à¸à¹ %{name} à¸à¸¹à¸à¸£à¸°à¸à¸±à¸, à¹à¸à¸£à¸à¸à¸¢à¹à¸²à¹à¸à¸µà¸¢à¸à¸à¹à¸§à¸¢à¸à¸²à¸£à¸¡à¸à¹à¸£à¸¸à¸à¹à¸£à¸ à¹à¸à¸¢à¸à¸à¹à¸«à¹à¸£à¸°à¸à¸¸à¸£à¸²à¸¢à¸¥à¸°à¹à¸à¸µà¸¢à¸à¹à¸à¸µà¹à¸¢à¸§à¸à¸±à¸à¸ªà¸à¸²à¸à¸à¸²à¸£à¸à¹à¸à¸µà¹à¸à¸à¹à¸«à¹à¸¥à¸°à¹à¸à¸µà¸¢à¸à¸à¸±à¸à¹à¸à¸,
+ à¸à¸§à¸£à¹à¸à¹à¸à¸³à¸à¸à¸´à¸à¸²à¸¢à¸à¸µà¹à¹à¸à¹à¸²à¹à¸à¸à¹à¸²à¸¢à¹à¸à¹à¸à¸«à¸¥à¸±à¸ à¹à¸à¸£à¸²à¸°à¹à¸¡à¹à¹à¸à¹à¸§à¹à¸²à¸à¸¹à¹à¹à¸à¹à¸à¸¸à¸à¸à¸à¸à¸°à¹à¸à¹à¸²à¹à¸à¸¨à¸±à¸à¸à¹à¹à¸à¸à¸²à¸°,
+ à¹à¸¥à¸°à¸à¹à¸à¸à¸à¸¢à¹à¸²à¸¥à¸·à¸¡ วà¹à¸²à¸ªà¸´à¹à¸à¸à¸µà¹à¸à¸¸à¸à¹à¸à¸µà¸¢à¸à¸à¸µà¹à¸à¸°à¹à¸ªà¸à¸à¸à¹à¸à¸ªà¸²à¸à¸²à¸£à¸à¸°à¸à¹à¸§à¸¢
+ period: ระà¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¸à¸²à¸à¸à¸²à¸£à¹à¸à¹à¸²à¸à¸¶à¸ API, à¸à¸²à¸à¹à¸à¹à¸²à¹à¸ à¹à¸à¸¢à¹à¸£à¸´à¹à¸¡à¸à¸±à¸à¸à¸²à¸à¸à¸±à¸à¸à¸¸à¸à¸±à¸
submit: สรà¹à¸²à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸
tried_contacting: à¸à¹à¸²à¸à¹à¸à¹à¸²à¸à¸´à¸à¸à¹à¸à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¹à¸¥à¸°à¸à¸à¸£à¹à¸à¸à¹à¸«à¹à¹à¸à¸²à¸«à¸¢à¸¸à¸à¸à¸²à¸£à¸à¸£à¸°à¸à¸³
tried_waiting: à¸à¹à¸²à¸à¹à¸à¹à¸²à¹à¸à¹à¹à¸«à¹à¹à¸§à¸¥à¸²à¸à¸²à¸à¸ªà¸¡à¸à¸§à¸£à¹à¸à¹à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¹à¸à¸à¸²à¸£à¸à¸à¸à¸à¸³à¸à¸²à¸¡à¸à¸¥à¸±à¸
- needs_view: à¸à¸¹à¹à¹à¸à¹à¸à¹à¸à¸à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¹à¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸µà¹à¸à¸°à¸à¸¹à¸à¹à¸à¸´à¸à¸à¸à¸
+ needs_view: à¸à¸¹à¹à¹à¸à¹à¸à¹à¸à¸à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¹à¸à¸ à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸µà¹à¸à¸¶à¸à¸à¸°à¸à¸¹à¸à¹à¸à¸´à¸à¸à¸à¸
back: à¹à¸ªà¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸±à¹à¸à¸«à¸¡à¸
edit:
- title: à¹à¸à¹à¹à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸ %{name}
+ title: à¹à¸à¹à¹à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹ %{name}
heading: à¹à¸à¹à¹à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸ %{name}
- reason: à¹à¸«à¸à¸¸à¸à¸¥à¸à¸µà¹à¸à¸¹à¹à¹à¸à¹ %{name} à¸à¸¹à¸à¸à¸µà¸à¸à¸±à¸ à¹à¸à¸£à¸à¸à¸¢à¹à¸²à¹à¸à¹à¸à¸²à¸£à¸¡à¸à¹à¸£à¸¸à¸à¹à¸£à¸à¹à¸à¸£à¸°à¸«à¸§à¹à¸²à¸à¸£à¸°à¸à¸¸
- à¹à¸¥à¸°à¸à¸à¹à¸«à¹à¸£à¸°à¸à¸¸à¸£à¸²à¸¢à¸¥à¸°à¹à¸à¸µà¸¢à¸à¹à¸à¸µà¹à¸¢à¸§à¸à¸±à¸à¸ªà¸à¸²à¸à¸à¸²à¸£à¸à¹à¸à¸µà¹à¸à¸à¹à¸«à¹à¸¥à¸°à¹à¸à¸µà¸¢à¸à¸à¸±à¸à¹à¸à¸ à¸à¸³à¹à¸§à¹à¸§à¹à¸²à¸à¹à¸à¸à¸§à¸²à¸¡à¸à¸µà¹à¸à¹à¸²à¸à¸à¸´à¸¡à¸à¹à¸à¸°à¸à¸£à¸²à¸à¸à¸à¹à¸à¸ªà¸²à¸à¸²à¸£à¸à¸°
- à¸à¸¹à¹à¹à¸à¹à¸à¸¸à¸à¸à¹à¸²à¸à¹à¸¡à¹à¸à¸³à¸à¹à¸à¸à¹à¸à¹à¸²à¹à¸à¸à¸¶à¸à¸¨à¸±à¸à¸à¹à¹à¸à¸à¸²à¸° à¸à¸¶à¸à¸à¸à¹à¸à¸°à¸à¸³à¹à¸«à¹à¹à¸à¹à¸¨à¸±à¸à¸à¹à¸à¸¢à¹à¸²à¸à¸à¹à¸²à¸¢
- period: à¸à¹à¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¸à¸²à¸ API à¸à¸±à¸à¹à¸à¹à¸à¸±à¸à¸à¸µà¹ à¸à¸²à¸à¹à¸à¹à¸²à¹à¸
+ reason: à¹à¸«à¸à¸¸à¸à¸¥à¸à¸µà¹à¸à¸¹à¹à¹à¸à¹ %{name} à¸à¸¹à¸à¸£à¸°à¸à¸±à¸, à¹à¸à¸£à¸à¸à¸¢à¹à¸²à¹à¸à¸µà¸¢à¸à¸à¹à¸§à¸¢à¸à¸²à¸£à¸¡à¸à¹à¸£à¸¸à¸à¹à¸£à¸ à¹à¸à¸¢à¸à¸à¹à¸«à¹à¸£à¸°à¸à¸¸à¸£à¸²à¸¢à¸¥à¸°à¹à¸à¸µà¸¢à¸à¹à¸à¸µà¹à¸¢à¸§à¸à¸±à¸à¸ªà¸à¸²à¸à¸à¸²à¸£à¸à¹à¸à¸µà¹à¸à¸à¹à¸«à¹à¸¥à¸°à¹à¸à¸µà¸¢à¸à¸à¸±à¸à¹à¸à¸
+ à¹à¸¥à¸°à¸à¸§à¸£à¹à¸à¹à¸à¸³à¸à¸à¸´à¸à¸²à¸¢à¸à¸µà¹à¹à¸à¹à¸²à¹à¸à¸à¹à¸²à¸¢à¹à¸à¹à¸à¸«à¸¥à¸±à¸ à¹à¸à¸£à¸²à¸°à¹à¸¡à¹à¹à¸à¹à¸§à¹à¸²à¸à¸¹à¹à¹à¸à¹à¸à¸¸à¸à¸à¸à¸à¸°à¹à¸à¹à¸²à¹à¸à¸¨à¸±à¸à¸à¹à¹à¸à¸à¸²à¸°
+ period: ระà¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¸à¸²à¸à¸à¸²à¸£à¹à¸à¹à¸²à¸à¸¶à¸ API, à¸à¸²à¸à¹à¸à¹à¸²à¹à¸ à¹à¸à¸¢à¹à¸£à¸´à¹à¸¡à¸à¸±à¸à¸à¸²à¸à¸à¸±à¸à¸à¸¸à¸à¸±à¸
submit: à¸à¸£à¸±à¸à¸à¸£à¸¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸
- show: à¸à¸¹à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸µà¹
+ show: à¸à¸¹à¸£à¸²à¸¢à¸¥à¸°à¹à¸à¸µà¸¢à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸µà¹
back: à¹à¸ªà¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸±à¹à¸à¸«à¸¡à¸
- needs_view: à¸à¹à¸à¸à¸à¸²à¸£à¹à¸«à¹à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¹à¸à¸à¹à¸à¸´à¸à¸à¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸«à¸£à¸·à¸à¹à¸¡à¹?
+ needs_view: à¸à¹à¸à¸à¸à¸²à¸£à¹à¸«à¹à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸µà¹à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¹à¸à¸à¹à¸à¸´à¸à¸à¸à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸«à¸£à¸·à¸à¹à¸¡à¹?
filter:
block_expired: à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸µà¹à¸ªà¸´à¹à¸à¸à¸¥à¹à¸¥à¹à¸§à¹à¸à¹à¹à¸à¹à¸¡à¹à¹à¸à¹
- block_period: ระยะà¹à¸§à¸¥à¸²à¸à¸µà¹à¸à¸µà¸à¸à¸±à¸à¸à¹à¸à¸à¹à¸à¹à¸à¹à¸à¸à¸²à¸¡à¸£à¸²à¸¢à¸à¸²à¸£à¹à¸¥à¸·à¸à¸à¹à¸à¸à¸¥à¹à¸à¸à¸à¸±à¸§à¹à¸¥à¸·à¸à¸à¹à¸à¹à¸²à¸à¸±à¹à¸
+ block_period: à¸à¸¹à¸£à¸°à¸¢à¸°à¹à¸§à¸¥à¸²à¸à¸µà¹à¸£à¸°à¸à¸±à¸ à¹à¸«à¹à¹à¸à¹à¸à¸«à¸à¸¶à¹à¸à¹à¸à¸à¹à¸²à¸à¸µà¹à¹à¸¥à¸·à¸à¸à¹à¸§à¹à¸à¸²à¸à¸£à¸²à¸¢à¸à¸²à¸£à¸à¸µà¹
create:
- try_contacting: à¸à¸£à¸¸à¸à¸²à¸à¸´à¸à¸à¹à¸à¸à¸¹à¹à¹à¸à¹à¸à¹à¸à¸à¸à¸µà¹à¸à¸°à¸à¸µà¸à¸à¸±à¸à¹à¸à¸²à¸à¸à¸à¸à¸²à¸à¸£à¸°à¸à¸ à¹à¸¥à¸°à¹à¸à¸·à¹à¸à¹à¸§à¸¥à¸²à¸£à¸°à¸¢à¸°à¸«à¸à¸¶à¹à¸à¹à¸«à¹à¸à¸à¸à¸à¸¥à¸±à¸
+ try_contacting: à¸à¸£à¸¸à¸à¸²à¸à¸´à¸à¸à¹à¸à¸à¸¹à¹à¹à¸à¹à¸à¸à¸à¸±à¹à¸à¸à¹à¸à¸à¸à¸µà¹à¸à¸°à¸à¸±à¸à¸ªà¸´à¸à¹à¸à¸ªà¸±à¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸ à¹à¸¥à¸°à¸à¸¢à¹à¸²à¸¥à¸·à¸¡à¹à¸à¸·à¹à¸à¹à¸§à¸¥à¸²à¸£à¸°à¸¢à¸°à¸«à¸à¸¶à¹à¸à¹à¸«à¹à¸à¸à¸à¸à¸¥à¸±à¸
+ try_waiting: à¸à¸£à¸¸à¸à¸²à¹à¸«à¹à¹à¸§à¸¥à¸²à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¹à¸à¸à¸²à¸£à¸à¸à¸à¸à¸³à¸à¸²à¸¡ à¸à¹à¸à¸à¸à¸µà¹à¸à¸±à¸à¸ªà¸´à¸à¹à¸£à¸·à¹à¸à¸à¸à¸²à¸£à¸ªà¸±à¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸
update:
+ only_creator_can_edit: à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸µà¹à¸ªà¸²à¸¡à¸²à¸£à¸à¹à¸à¹à¹à¸à¹à¸à¹ à¹à¸à¸¢à¸à¸¹à¹à¸à¸¹à¹à¸¥à¸à¸µà¹à¹à¸à¹à¸à¸à¸¹à¹à¸ªà¸±à¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¸à¹à¸à¹à¸²à¸à¸±à¹à¸
success: à¸à¸£à¸±à¸à¸à¸£à¸¸à¸à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¹à¸¥à¹à¸§
index:
- title: à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹
- heading: รายà¸à¸²à¸£à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹
+ title: à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹
+ heading: รายà¸à¸²à¸£à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹
empty: ยัà¸à¹à¸¡à¹à¸¡à¸µà¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¹à¸ à¹
revoke:
- past: à¸à¸²à¸£à¸à¸¥à¹à¸à¸à¸à¸µà¹à¹à¸à¹à¸ªà¸´à¹à¸à¸ªà¸¸à¸à¹à¸à¹à¸¡à¸·à¹à¸ %{time}à¸à¹à¸à¸à¹à¸¥à¹à¸§ à¸à¸²à¸£à¸¢à¸à¹à¸¥à¸´à¸à¸à¸¶à¸à¹à¸¡à¹à¸¡à¸µà¸à¸¥
- flash: à¹à¸à¹à¸¢à¸à¹à¸¥à¸´à¸à¸à¸²à¸£à¸à¸¥à¹à¸à¸à¸à¸µà¹à¹à¸¥à¹à¸§
+ title: ยà¸à¹à¸¥à¸´à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸à¸à¸à¸ %{block_on}
+ heading: à¹à¸à¸´à¸à¸à¸à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹ %{block_on} à¸à¸¶à¹à¸à¸ªà¸±à¹à¸à¹à¸à¸¢à¸à¸¹à¹à¹à¸à¹ %{block_by}
+ past: à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸µà¹à¹à¸à¹à¸ªà¸´à¹à¸à¸ªà¸¸à¸à¹à¸à¹à¸¡à¸·à¹à¸ %{time}à¸à¹à¸à¸à¹à¸¥à¹à¸§ à¸à¸²à¸£à¸¢à¸à¹à¸¥à¸´à¸à¸à¸¶à¸à¹à¸¡à¹à¸¡à¸µà¸à¸¥
+ confirm: à¹à¸à¹à¹à¸à¸«à¸£à¸·à¸à¸§à¹à¸²à¸à¹à¸à¸à¸à¸²à¸£à¸à¸°à¸¢à¸à¹à¸´à¸¥à¸´à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸µà¹?
+ flash: à¹à¸à¹à¸¢à¸à¹à¸¥à¸´à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸µà¹à¹à¸¥à¹à¸§
helper:
time_future: à¸à¸°à¸ªà¸´à¹à¸à¸ªà¸¸à¸à¹à¸ %{time}
+ until_login: มีà¸à¸¥à¸à¸à¸à¸¶à¸à¸à¸²à¸£à¹à¸£à¸´à¹à¸¡à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¸£à¸±à¹à¸à¸à¸±à¸à¹à¸
time_past: สิà¹à¸à¸ªà¸¸à¸à¹à¸à¹à¸¡à¸·à¹à¸ %{time}à¸à¹à¸à¸
blocks_on:
- title: à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸ %{name}
- heading: รายà¸à¸²à¸£à¸à¸²à¸£à¸à¸µà¸à¸à¸±à¸à¸à¸ %{name}
- empty: '%{name} ยัà¸à¹à¸¡à¹à¹à¸à¹à¸à¸¹à¸à¸à¸µà¸à¸à¸±à¸'
+ title: à¸à¸²à¸£à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸à¸à¸à¸ %{name}
+ heading: รายà¸à¸²à¸£à¸à¸²à¸£à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¸à¸à¸à¸à¸¹à¹à¹à¸à¹ %{name}
+ empty: '%{name} ยัà¸à¹à¸¡à¹à¹à¸à¸¢à¸à¸¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸'
+ blocks_by:
+ heading: à¹à¸ªà¸à¸à¸à¸²à¸£à¸ªà¸±à¹à¸à¸£à¸°à¸à¸±à¸à¹à¸à¹à¹à¸à¸¢ %{name}
+ empty: '%{name} à¹à¸¡à¹à¹à¸à¸¢à¹à¸à¹à¸ªà¸±à¹à¸à¸£à¸°à¸à¸±à¸à¸à¸¹à¹à¹à¸à¹à¸à¸à¹à¸à¹à¸¥à¸¢'
show:
+ heading: '%{block_on} à¹à¸à¸à¸£à¸°à¸à¸±à¸à¹à¸à¸¢ %{block_by}'
time_past: สิà¹à¸à¸ªà¸¸à¸à¹à¸à¹à¸¡à¸·à¹à¸ %{time}à¸à¹à¸à¸
+ created: ระà¸à¸±à¸à¹à¸¡à¸·à¹à¸
ago: '%{time}à¸à¹à¸à¸'
status: สà¸à¸²à¸à¸°
show: à¹à¸ªà¸à¸
edit: à¹à¸à¹à¹à¸
+ reason: 'à¹à¸«à¸à¸¸à¸à¸¥à¸ªà¸³à¸«à¸£à¸±à¸à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸:'
+ needs_view: à¸à¸¹à¹à¹à¸à¹à¸à¹à¸à¸à¹à¸à¹à¸²à¸£à¸°à¸à¸à¸à¹à¸à¸ à¸à¸²à¸£à¸£à¸°à¸à¸±à¸à¸à¸µà¹à¸à¸¶à¸à¸à¸°à¸à¸¹à¸à¹à¸à¸´à¸à¸à¸à¸
block:
+ not_revoked: (à¹à¸¡à¹à¹à¸à¹à¸¡à¸µà¸à¸²à¸£à¸¢à¸à¹à¸¥à¸´à¸)
show: à¹à¸ªà¸à¸
edit: à¹à¸à¹à¹à¸
blocks:
+ display_name: à¸à¸¹à¹à¹à¸à¹à¸à¸µà¹à¸à¸¹à¸à¸£à¸°à¸à¸±à¸
+ creator_name: à¸à¸¹à¹à¸ªà¸±à¹à¸à¹à¸«à¹à¸£à¸°à¸à¸±à¸
+ reason: à¹à¸«à¸à¸¸à¸à¸¥à¸à¸µà¹à¸à¹à¸à¸à¸£à¸°à¸à¸±à¸à¹à¸à¹à¸à¸²à¸
status: สà¸à¸²à¸à¸°
+ revoker_name: ยà¸à¹à¸¥à¸´à¸à¹à¸à¸¢
showing_page: หà¸à¹à¸² %{page}
next: à¸à¸±à¸à¹à¸ »
previous: « à¸à¹à¸à¸à¸«à¸à¹à¸²
@@ -2061,6 +2100,7 @@ th:
full: à¹à¸à¸·à¹à¸à¸à¸§à¸²à¸¡à¹à¸à¹à¸¡à¹à¸à¸«à¸¡à¸²à¸¢à¹à¸«à¸à¸¸
mine:
heading: หมายà¹à¸«à¸à¸¸à¸à¸à¸ %{user}
+ creator: à¸à¸¹à¹à¸ªà¸£à¹à¸²à¸
ago_html: '%{when}à¸à¹à¸à¸'
javascripts:
close: à¸à¸´à¸
@@ -2120,6 +2160,8 @@ th:
new:
add: à¹à¸à¸´à¹à¸¡à¸«à¸¡à¸²à¸¢à¹à¸«à¸à¸¸
show:
+ anonymous_warning: หมายà¹à¸«à¸à¸¸à¸à¸µà¹à¸¡à¸µà¸à¹à¸à¸à¸§à¸²à¸¡à¸à¸²à¸à¸à¸¹à¹à¸à¸µà¹à¹à¸¡à¹à¸à¸£à¸°à¸ªà¸à¸à¹à¸à¸°à¸à¸à¸à¸à¸²à¸¡ à¸à¸¶à¹à¸à¸à¸§à¸£à¸à¸³à¸à¸²à¸£à¸à¸£à¸§à¸à¸ªà¸à¸à¸à¸²à¸¡à¸à¹à¸à¸¡à¸¹à¸¥à¸à¸µà¹à¹à¸à¹à¸à¸¡à¸²à¸à¸µà¹à¸à¹à¸§à¸¢à¸à¸±à¸§à¸à¸¸à¸à¹à¸à¸à¸à¸µà¸à¸à¸£à¸±à¹à¸
+ à¸à¹à¸à¸à¸à¸°à¸à¸³à¹à¸à¸´à¸à¸à¸²à¸£à¹à¸à¹ à¸à¹à¸
hide: à¸à¹à¸à¸
resolve: à¸à¸´à¸à¹à¸£à¸·à¹à¸à¸
reactivate: รืà¹à¸à¸à¸·à¹à¸à¸«à¸¡à¸²à¸¢à¹à¸«à¸à¸¸
@@ -2139,27 +2181,35 @@ th:
directions: à¹à¸ªà¹à¸à¸à¸²à¸
distance: ระยะà¸à¸²à¸
errors:
+ no_route: à¹à¸¡à¹à¸à¸à¹à¸ªà¹à¸à¸à¸²à¸à¸£à¸°à¸«à¸§à¹à¸²à¸à¸ªà¸à¸à¸à¸¸à¸à¸à¸µà¹à¸à¸¸à¸à¸à¹à¸à¸à¸à¸²à¸£
no_place: à¸à¸à¸à¸ ัย - à¹à¸¡à¹à¸à¸à¸ªà¸à¸²à¸à¸à¸µà¹ "%{place}"
instructions:
continue_without_exit: à¹à¸à¸¥à¸·à¹à¸à¸à¸à¹à¸à¹à¸à¸à¸²à¸à¸à¸à¸ %{name}
+ slight_right_without_exit: à¹à¸à¸à¸à¸§à¸²à¹à¸à¸à¸µà¹ %{name}
offramp_right_with_name: à¹à¸à¹à¸à¸²à¸à¸¥à¸²à¸à¸à¹à¸²à¸à¸à¸§à¸²à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
onramp_right_without_exit: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¸§à¸²à¸à¸µà¹à¸à¸²à¸à¸¥à¸²à¸à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
- endofroad_right_without_exit: à¹à¸¡à¸·à¹à¸à¸à¸¶à¸à¸ªà¸¸à¸à¸à¸à¸à¹à¸¥à¸µà¹à¸¢à¸§à¸à¸§à¸²à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
+ endofroad_right_without_exit: à¹à¸¡à¸·à¹à¸à¸à¸¶à¸à¸ªà¸¸à¸à¸à¸à¸à¹à¸¥à¹à¸§ à¹à¸«à¹à¹à¸¥à¸µà¹à¸¢à¸§à¸à¸§à¸²à¹à¸à¹à¸² %{name}
merge_right_without_exit: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¸§à¸²à¹à¸à¹à¸²à¸ªà¸¹à¹à¸à¸à¸ %{name} à¸à¸¶à¹à¸à¹à¸à¹à¸à¸à¸²à¸à¹à¸à¸
fork_right_without_exit: à¸à¸µà¹à¸à¸²à¸à¹à¸¢à¸à¹à¸¥à¸µà¹à¸¢à¸§à¸à¸§à¸²à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
+ turn_right_without_exit: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¸§à¸²à¹à¸à¹à¸² %{name}
sharp_right_without_exit: หัà¸à¸à¸§à¸²à¹à¸à¹à¸² %{name}
uturn_without_exit: วà¸à¸à¸¥à¸±à¸à¹à¸à¸à¸²à¸¡à¸à¸à¸ %{name}
sharp_left_without_exit: หัà¸à¸à¹à¸²à¸¢à¹à¸à¹à¸² %{name}
turn_left_without_exit: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¹à¸²à¸¢à¹à¸à¸à¸µà¹ %{name}
offramp_left_with_name: à¹à¸à¹à¸à¸²à¸à¸¥à¸²à¸à¸à¹à¸²à¸à¸à¹à¸²à¸¢à¹à¸à¸à¸µà¹ %{name}
onramp_left_without_exit: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¹à¸²à¸¢à¸à¸à¸à¸²à¸à¸¥à¸²à¸à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
+ onramp_left_without_directions: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¹à¸²à¸¢à¸à¸¶à¹à¸à¸à¸²à¸à¸¥à¸²à¸
+ onramp_left: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¹à¸²à¸¢à¸à¸¶à¹à¸à¸à¸²à¸à¸¥à¸²à¸
endofroad_left_without_exit: à¹à¸¡à¸·à¹à¸à¸à¸¶à¸à¸ªà¸¸à¸à¸à¸à¸à¹à¸¥à¸µà¹à¸¢à¸§à¸à¹à¸²à¸¢à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
merge_left_without_exit: à¹à¸¥à¸µà¹à¸¢à¸§à¸à¹à¸²à¸¢à¹à¸à¹à¸²à¸ªà¸¹à¹à¸à¸à¸ %{name} à¸à¸¶à¹à¸à¹à¸à¹à¸à¸à¸²à¸à¹à¸à¸
fork_left_without_exit: à¸à¸µà¹à¸à¸²à¸à¹à¸¢à¸à¹à¸¥à¸µà¹à¸¢à¸§à¸à¹à¸²à¸¢à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
slight_left_without_exit: à¸à¸¢à¸±à¸à¸à¹à¸²à¸¢à¹à¸¥à¹à¸à¸à¹à¸à¸¢à¹à¸à¸à¸µà¹ %{name}
follow_without_exit: à¹à¸à¸à¸²à¸¡ %{name}
+ leave_roundabout_without_exit: à¸à¸à¸à¸à¸²à¸à¸§à¸à¹à¸§à¸µà¸¢à¸ - %{name}
start_without_exit: à¹à¸£à¸´à¹à¸¡à¸à¸µà¹ %{name}
destination_without_exit: à¸à¸£à¸à¹à¸à¸¢à¸±à¸à¸à¸¸à¸à¸«à¸¡à¸²à¸¢
+ against_oneway_without_exit: à¹à¸«à¹à¸§à¸´à¹à¸à¸ªà¸§à¸à¹à¸¥à¸à¹à¸à¸à¸ %{name}
+ end_oneway_without_exit: สิà¹à¸à¸ªà¸¸à¸à¸à¹à¸§à¸à¹à¸à¸´à¸à¸£à¸à¸à¸²à¸à¹à¸à¸µà¸¢à¸§à¸à¸ %{name}
roundabout_with_exit: ภวà¸à¹à¸§à¸µà¸¢à¸ à¹à¸à¹à¸à¸²à¸à¸à¸à¸ %{exit} à¹à¸à¸à¸µà¹à¸à¸à¸ %{name}
exit_roundabout: à¸à¸à¸à¸à¸²à¸à¸§à¸à¹à¸§à¸µà¸¢à¸à¹à¸à¸à¸²à¸ %{name}
unnamed: à¸à¸à¸à¹à¸¡à¹à¸¡à¸µà¸à¸·à¹à¸
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index 30ee46e5b..88b920c5d 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -1429,6 +1429,10 @@ tr:
Avusturya: Stadt Wien (CC BY lisansı altında),
Land Vorarlberg ve
Land Tirol'dan (deÄiÅiklikleriyle CC BY AT lisansı altında) veriler içermektedir.
+ contributors_au_html: 'Avustralya: CC
+ BY 4.0 kapsamında Commonwealth of Australia tarafından lisanslanan PSMA Australia Limited''ten
+ alınan verileri içerir.'
contributors_ca_html: "Kanada: GeoBase®, GeoGratis \n(©
Department of Natural\nResources Canada), CanVec (© Department of Natural\nResources
Canada) ve StatCan'den (Geography Division,\nStatistics Canada) veriler
@@ -2637,6 +2641,8 @@ tr:
%{name} yoluna doÄru alın.
onramp_right_without_exit: Rampadan saÄa dönerek %{name} girin
onramp_right_with_directions: '%{directions} doÄru rampadan saÄ dönün'
+ onramp_right_with_name_directions: '%{name} üzerindeki rampaya doÄru %{directions}
+ yönünde saÄa dönün'
onramp_right_without_directions: Rampaya doÄru saÄa dönün
onramp_right: Rampaya doÄru saÄa dönün
endofroad_right_without_exit: Yolun sonunda saÄa %{name} yönünde dönün
@@ -2656,8 +2662,12 @@ tr:
%{directions} yönüne doÄru'
offramp_left_with_name: Soldaki rampayı kullanarak %{name} girin
offramp_left_with_directions: '%{directions} yönünde soldaki rampadan'
+ offramp_left_with_name_directions: '%{name} üzerindeki rampaya doÄru %{directions}
+ yönünde sola ilerleyin'
onramp_left_without_exit: Rampadan sola dönerek %{name} girin
onramp_left_with_directions: '%{directions} doÄru rampadan sola dönün'
+ onramp_left_with_name_directions: '%{name} üzerindeki rampaya doÄru %{directions}
+ yönünde sola dönün'
onramp_left_without_directions: Rampaya doÄru sola dönün
onramp_left: Rampaya doÄru sola dönün
endofroad_left_without_exit: Yolun sonunda sola %{name} yönünde dönün
diff --git a/db/migrate/20181031113522_create_delayed_jobs.rb b/db/migrate/20181031113522_create_delayed_jobs.rb
new file mode 100644
index 000000000..69c6f1b04
--- /dev/null
+++ b/db/migrate/20181031113522_create_delayed_jobs.rb
@@ -0,0 +1,22 @@
+class CreateDelayedJobs < ActiveRecord::Migration[5.2]
+ def self.up
+ create_table :delayed_jobs, :force => true do |table|
+ table.integer :priority, :default => 0, :null => false # Allows some jobs to jump to the front of the queue
+ table.integer :attempts, :default => 0, :null => false # Provides for retries, but still fail eventually.
+ table.text :handler, :null => false # YAML-encoded string of the object that will do work
+ table.text :last_error # reason for last failure (See Note below)
+ table.datetime :run_at # When to run. Could be Time.zone.now for immediately, or sometime in the future.
+ table.datetime :locked_at # Set when a client is working on this object
+ table.datetime :failed_at # Set when all retries have failed (actually, by default, the record is deleted instead)
+ table.string :locked_by # Who is working on this object (if locked)
+ table.string :queue # The name of the queue this job is in
+ table.timestamps :null => true
+ end
+
+ add_index :delayed_jobs, [:priority, :run_at], :name => "delayed_jobs_priority"
+ end
+
+ def self.down
+ drop_table :delayed_jobs
+ end
+end
diff --git a/db/structure.sql b/db/structure.sql
index 48fedeba5..dcab302bb 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -494,6 +494,45 @@ CREATE SEQUENCE current_ways_id_seq
ALTER SEQUENCE current_ways_id_seq OWNED BY current_ways.id;
+--
+-- Name: delayed_jobs; Type: TABLE; Schema: public; Owner: -
+--
+
+CREATE TABLE delayed_jobs (
+ id bigint NOT NULL,
+ priority integer DEFAULT 0 NOT NULL,
+ attempts integer DEFAULT 0 NOT NULL,
+ handler text NOT NULL,
+ last_error text,
+ run_at timestamp without time zone,
+ locked_at timestamp without time zone,
+ failed_at timestamp without time zone,
+ locked_by character varying,
+ queue character varying,
+ created_at timestamp without time zone,
+ updated_at timestamp without time zone
+);
+
+
+--
+-- Name: delayed_jobs_id_seq; Type: SEQUENCE; Schema: public; Owner: -
+--
+
+CREATE SEQUENCE delayed_jobs_id_seq
+ START WITH 1
+ INCREMENT BY 1
+ NO MINVALUE
+ NO MAXVALUE
+ CACHE 1;
+
+
+--
+-- Name: delayed_jobs_id_seq; Type: SEQUENCE OWNED BY; Schema: public; Owner: -
+--
+
+ALTER SEQUENCE delayed_jobs_id_seq OWNED BY delayed_jobs.id;
+
+
--
-- Name: diary_comments; Type: TABLE; Schema: public; Owner: -
--
@@ -1365,6 +1404,13 @@ ALTER TABLE ONLY current_relations ALTER COLUMN id SET DEFAULT nextval('current_
ALTER TABLE ONLY current_ways ALTER COLUMN id SET DEFAULT nextval('current_ways_id_seq'::regclass);
+--
+-- Name: delayed_jobs id; Type: DEFAULT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY delayed_jobs ALTER COLUMN id SET DEFAULT nextval('delayed_jobs_id_seq'::regclass);
+
+
--
-- Name: diary_comments id; Type: DEFAULT; Schema: public; Owner: -
--
@@ -1595,6 +1641,14 @@ ALTER TABLE ONLY current_ways
ADD CONSTRAINT current_ways_pkey PRIMARY KEY (id);
+--
+-- Name: delayed_jobs delayed_jobs_pkey; Type: CONSTRAINT; Schema: public; Owner: -
+--
+
+ALTER TABLE ONLY delayed_jobs
+ ADD CONSTRAINT delayed_jobs_pkey PRIMARY KEY (id);
+
+
--
-- Name: diary_comments diary_comments_pkey; Type: CONSTRAINT; Schema: public; Owner: -
--
@@ -1918,6 +1972,13 @@ CREATE INDEX current_way_nodes_node_idx ON current_way_nodes USING btree (node_i
CREATE INDEX current_ways_timestamp_idx ON current_ways USING btree ("timestamp");
+--
+-- Name: delayed_jobs_priority; Type: INDEX; Schema: public; Owner: -
+--
+
+CREATE INDEX delayed_jobs_priority ON delayed_jobs USING btree (priority, run_at);
+
+
--
-- Name: diary_comment_user_id_created_at_index; Type: INDEX; Schema: public; Owner: -
--
@@ -2870,6 +2931,7 @@ INSERT INTO "schema_migrations" (version) VALUES
('20161011010929'),
('20170222134109'),
('20180204153242'),
+('20181031113522'),
('21'),
('22'),
('23'),
diff --git a/lib/classic_pagination/pagination.rb b/lib/classic_pagination/pagination.rb
index 811d09239..dbeaf5a40 100644
--- a/lib/classic_pagination/pagination.rb
+++ b/lib/classic_pagination/pagination.rb
@@ -67,17 +67,17 @@ module ActionController
DEFAULT_OPTIONS = {
:class_name => nil,
:singular_name => nil,
- :per_page => 10,
+ :per_page => 10,
:conditions => nil,
- :order_by => nil,
- :order => nil,
- :join => nil,
- :joins => nil,
- :count => nil,
- :include => nil,
- :select => nil,
- :group => nil,
- :parameter => "page"
+ :order_by => nil,
+ :order => nil,
+ :join => nil,
+ :joins => nil,
+ :count => nil,
+ :include => nil,
+ :select => nil,
+ :group => nil,
+ :parameter => "page"
}.freeze
end
diff --git a/lib/diff_reader.rb b/lib/diff_reader.rb
index cb553bfbc..e3c533b7a 100644
--- a/lib/diff_reader.rb
+++ b/lib/diff_reader.rb
@@ -8,8 +8,8 @@ class DiffReader
# maps each element type to the model class which handles it
MODELS = {
- "node" => Node,
- "way" => Way,
+ "node" => Node,
+ "way" => Way,
"relation" => Relation
}.freeze
diff --git a/lib/tasks/auto_annotate_models.rake b/lib/tasks/auto_annotate_models.rake
index 53252b769..954acbf22 100644
--- a/lib/tasks/auto_annotate_models.rake
+++ b/lib/tasks/auto_annotate_models.rake
@@ -6,41 +6,41 @@ if Rails.env.development?
# You can override any of these by setting an environment variable of the
# same name.
Annotate.set_defaults(
- "routes" => "false",
- "position_in_routes" => "before",
- "position_in_class" => "before",
- "position_in_test" => "before",
- "position_in_fixture" => "before",
- "position_in_factory" => "before",
- "position_in_serializer" => "before",
- "show_foreign_keys" => "true",
- "show_indexes" => "true",
- "simple_indexes" => "false",
- "model_dir" => "app/models",
- "root_dir" => "",
- "include_version" => "false",
- "require" => "",
- "exclude_tests" => "true",
- "exclude_fixtures" => "true",
- "exclude_factories" => "true",
- "exclude_serializers" => "true",
- "exclude_scaffolds" => "true",
- "exclude_controllers" => "true",
- "exclude_helpers" => "true",
- "ignore_model_sub_dir" => "false",
- "ignore_columns" => nil,
- "ignore_routes" => nil,
- "ignore_unknown_models" => "false",
+ "routes" => "false",
+ "position_in_routes" => "before",
+ "position_in_class" => "before",
+ "position_in_test" => "before",
+ "position_in_fixture" => "before",
+ "position_in_factory" => "before",
+ "position_in_serializer" => "before",
+ "show_foreign_keys" => "true",
+ "show_indexes" => "true",
+ "simple_indexes" => "false",
+ "model_dir" => "app/models",
+ "root_dir" => "",
+ "include_version" => "false",
+ "require" => "",
+ "exclude_tests" => "true",
+ "exclude_fixtures" => "true",
+ "exclude_factories" => "true",
+ "exclude_serializers" => "true",
+ "exclude_scaffolds" => "true",
+ "exclude_controllers" => "true",
+ "exclude_helpers" => "true",
+ "ignore_model_sub_dir" => "false",
+ "ignore_columns" => nil,
+ "ignore_routes" => nil,
+ "ignore_unknown_models" => "false",
"hide_limit_column_types" => "integer,boolean",
- "skip_on_db_migrate" => "false",
- "format_bare" => "true",
- "format_rdoc" => "false",
- "format_markdown" => "false",
- "sort" => "false",
- "force" => "false",
- "trace" => "false",
- "wrapper_open" => nil,
- "wrapper_close" => nil
+ "skip_on_db_migrate" => "false",
+ "format_bare" => "true",
+ "format_rdoc" => "false",
+ "format_markdown" => "false",
+ "sort" => "false",
+ "force" => "false",
+ "trace" => "false",
+ "wrapper_open" => nil,
+ "wrapper_close" => nil
)
end
diff --git a/test/abilities/abilities_test.rb b/test/abilities/abilities_test.rb
new file mode 100644
index 000000000..fc37b0e7d
--- /dev/null
+++ b/test/abilities/abilities_test.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require "test_helper"
+
+class AbilityTest < ActiveSupport::TestCase
+end
+
+class GuestAbilityTest < AbilityTest
+ test "geocoder permission for a guest" do
+ ability = Ability.new nil
+
+ [:search, :search_latlon, :search_ca_postcode, :search_osm_nominatim,
+ :search_geonames, :search_osm_nominatim_reverse, :search_geonames_reverse].each do |action|
+ assert ability.can?(action, :geocoder), "should be able to #{action} geocoder"
+ end
+ end
+
+ test "diary permissions for a guest" do
+ ability = Ability.new nil
+ [:index, :rss, :show, :comments].each do |action|
+ assert ability.can?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
+ end
+
+ [:create, :edit, :comment, :subscribe, :unsubscribe, :hide, :hidecomment].each do |action|
+ assert ability.cannot?(action, DiaryEntry), "should not be able to #{action} DiaryEntries"
+ assert ability.cannot?(action, DiaryComment), "should not be able to #{action} DiaryEntries"
+ end
+ end
+end
+
+class UserAbilityTest < AbilityTest
+ test "Diary permissions" do
+ ability = Ability.new create(:user)
+
+ [:index, :rss, :show, :comments, :create, :edit, :comment, :subscribe, :unsubscribe].each do |action|
+ assert ability.can?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
+ end
+
+ [:hide, :hidecomment].each do |action|
+ assert ability.cannot?(action, DiaryEntry), "should not be able to #{action} DiaryEntries"
+ assert ability.cannot?(action, DiaryComment), "should not be able to #{action} DiaryEntries"
+ end
+
+ [:index, :show, :resolve, :ignore, :reopen].each do |action|
+ assert ability.cannot?(action, Issue), "should not be able to #{action} Issues"
+ end
+ end
+end
+
+class ModeratorAbilityTest < AbilityTest
+ test "Issue permissions" do
+ ability = Ability.new create(:moderator_user)
+
+ [:index, :show, :resolve, :ignore, :reopen].each do |action|
+ assert ability.can?(action, Issue), "should be able to #{action} Issues"
+ end
+ end
+end
+
+class AdministratorAbilityTest < AbilityTest
+ test "Diary for an administrator" do
+ ability = Ability.new create(:administrator_user)
+ [:index, :rss, :show, :comments, :create, :edit, :comment, :subscribe, :unsubscribe, :hide, :hidecomment].each do |action|
+ assert ability.can?(action, DiaryEntry), "should be able to #{action} DiaryEntries"
+ end
+
+ [:hide, :hidecomment].each do |action|
+ assert ability.can?(action, DiaryComment), "should be able to #{action} DiaryComment"
+ end
+ end
+end
diff --git a/test/abilities/capability_test.rb b/test/abilities/capability_test.rb
new file mode 100644
index 000000000..a25c67043
--- /dev/null
+++ b/test/abilities/capability_test.rb
@@ -0,0 +1,49 @@
+# frozen_string_literal: true
+
+require "test_helper"
+
+class CapabilityTest < ActiveSupport::TestCase
+ def tokens(*toks)
+ AccessToken.new do |token|
+ toks.each do |t|
+ token.public_send("#{t}=", true)
+ end
+ end
+ end
+end
+
+class UserCapabilityTest < CapabilityTest
+ test "user preferences" do
+ # a user with no tokens
+ capability = Capability.new nil
+ [:read, :read_one, :update, :update_one, :delete_one].each do |act|
+ assert capability.cannot? act, UserPreference
+ end
+
+ # A user with empty tokens
+ capability = Capability.new tokens
+
+ [:read, :read_one, :update, :update_one, :delete_one].each do |act|
+ assert capability.cannot? act, UserPreference
+ end
+
+ capability = Capability.new tokens(:allow_read_prefs)
+
+ [:update, :update_one, :delete_one].each do |act|
+ assert capability.cannot? act, UserPreference
+ end
+
+ [:read, :read_one].each do |act|
+ assert capability.can? act, UserPreference
+ end
+
+ capability = Capability.new tokens(:allow_write_prefs)
+ [:read, :read_one].each do |act|
+ assert capability.cannot? act, UserPreference
+ end
+
+ [:update, :update_one, :delete_one].each do |act|
+ assert capability.can? act, UserPreference
+ end
+ end
+end
diff --git a/test/controllers/amf_controller_test.rb b/test/controllers/amf_controller_test.rb
index 0bdd01bd2..650bf1f8e 100644
--- a/test/controllers/amf_controller_test.rb
+++ b/test/controllers/amf_controller_test.rb
@@ -360,11 +360,11 @@ class AmfControllerTest < ActionController::TestCase
# into the method args.
def test_getway_old_invalid
way_id = create(:way, :with_history, :version => 2).id
- { "foo" => "bar",
+ { "foo" => "bar",
way_id => "not a date",
way_id => "2009-03-25 00:00:00", # <- wrong format
way_id => "0 Jan 2009 00:00:00", # <- invalid date
- -1 => "1 Jan 2009 00:00:00" }.each do |id, t| # <- invalid
+ -1 => "1 Jan 2009 00:00:00" }.each do |id, t| # <- invalid
amf_content "getway_old", "/1", [id, t]
post :amf_read
assert_response :success
diff --git a/test/controllers/changeset_controller_test.rb b/test/controllers/changeset_controller_test.rb
index 2cda68b12..fdb689978 100644
--- a/test/controllers/changeset_controller_test.rb
+++ b/test/controllers/changeset_controller_test.rb
@@ -2153,7 +2153,9 @@ CHANGESET
assert_difference "ChangesetComment.count", 1 do
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :comment, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" }
+ perform_enqueued_jobs do
+ post :comment, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" }
+ end
end
end
assert_response :success
@@ -2166,7 +2168,9 @@ CHANGESET
assert_difference "ChangesetComment.count", 1 do
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
+ perform_enqueued_jobs do
+ post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
+ end
end
end
assert_response :success
@@ -2182,7 +2186,9 @@ CHANGESET
assert_difference "ChangesetComment.count", 1 do
assert_difference "ActionMailer::Base.deliveries.size", 2 do
- post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
+ perform_enqueued_jobs do
+ post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
+ end
end
end
assert_response :success
diff --git a/test/controllers/diary_entry_controller_test.rb b/test/controllers/diary_entry_controller_test.rb
index f28bef6fe..cec225047 100644
--- a/test/controllers/diary_entry_controller_test.rb
+++ b/test/controllers/diary_entry_controller_test.rb
@@ -390,9 +390,11 @@ class DiaryEntryControllerTest < ActionController::TestCase
assert_no_difference "ActionMailer::Base.deliveries.size" do
assert_no_difference "DiaryComment.count" do
assert_no_difference "entry.subscribers.count" do
- post :comment,
- :params => { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "" } },
- :session => { :user => other_user }
+ perform_enqueued_jobs do
+ post :comment,
+ :params => { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "" } },
+ :session => { :user => other_user }
+ end
end
end
end
@@ -403,9 +405,11 @@ class DiaryEntryControllerTest < ActionController::TestCase
assert_difference "ActionMailer::Base.deliveries.size", entry.subscribers.count do
assert_difference "DiaryComment.count", 1 do
assert_difference "entry.subscribers.count", 1 do
- post :comment,
- :params => { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "New comment" } },
- :session => { :user => other_user }
+ perform_enqueued_jobs do
+ post :comment,
+ :params => { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "New comment" } },
+ :session => { :user => other_user }
+ end
end
end
end
@@ -450,9 +454,11 @@ class DiaryEntryControllerTest < ActionController::TestCase
# Try creating a spammy comment
assert_difference "ActionMailer::Base.deliveries.size", 1 do
assert_difference "DiaryComment.count", 1 do
- post :comment,
- :params => { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => spammy_text } },
- :session => { :user => other_user }
+ perform_enqueued_jobs do
+ post :comment,
+ :params => { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => spammy_text } },
+ :session => { :user => other_user }
+ end
end
end
assert_response :redirect
diff --git a/test/controllers/messages_controller_test.rb b/test/controllers/messages_controller_test.rb
index 0b3a59b39..8e4d5eeb2 100644
--- a/test/controllers/messages_controller_test.rb
+++ b/test/controllers/messages_controller_test.rb
@@ -83,9 +83,11 @@ class MessagesControllerTest < ActionController::TestCase
# Check that we can't send a message from a GET request
assert_difference "ActionMailer::Base.deliveries.size", 0 do
assert_difference "Message.count", 0 do
- get :new,
- :params => { :display_name => recipient_user.display_name,
- :message => { :title => "Test Message", :body => "Test message body" } }
+ perform_enqueued_jobs do
+ get :new,
+ :params => { :display_name => recipient_user.display_name,
+ :message => { :title => "Test Message", :body => "Test message body" } }
+ end
end
end
assert_response :success
@@ -112,9 +114,11 @@ class MessagesControllerTest < ActionController::TestCase
# Check that the subject is preserved over errors
assert_difference "ActionMailer::Base.deliveries.size", 0 do
assert_difference "Message.count", 0 do
- post :new,
- :params => { :display_name => recipient_user.display_name,
- :message => { :title => "Test Message", :body => "" } }
+ perform_enqueued_jobs do
+ post :new,
+ :params => { :display_name => recipient_user.display_name,
+ :message => { :title => "Test Message", :body => "" } }
+ end
end
end
assert_response :success
@@ -141,9 +145,11 @@ class MessagesControllerTest < ActionController::TestCase
# Check that the body text is preserved over errors
assert_difference "ActionMailer::Base.deliveries.size", 0 do
assert_difference "Message.count", 0 do
- post :new,
- :params => { :display_name => recipient_user.display_name,
- :message => { :title => "", :body => "Test message body" } }
+ perform_enqueued_jobs do
+ post :new,
+ :params => { :display_name => recipient_user.display_name,
+ :message => { :title => "", :body => "Test message body" } }
+ end
end
end
assert_response :success
@@ -170,9 +176,11 @@ class MessagesControllerTest < ActionController::TestCase
# Check that sending a message works
assert_difference "ActionMailer::Base.deliveries.size", 1 do
assert_difference "Message.count", 1 do
- post :create,
- :params => { :display_name => recipient_user.display_name,
- :message => { :title => "Test Message", :body => "Test message body" } }
+ perform_enqueued_jobs do
+ post :create,
+ :params => { :display_name => recipient_user.display_name,
+ :message => { :title => "Test Message", :body => "Test message body" } }
+ end
end
end
assert_redirected_to inbox_messages_path
@@ -211,12 +219,14 @@ class MessagesControllerTest < ActionController::TestCase
assert_no_difference "ActionMailer::Base.deliveries.size" do
assert_no_difference "Message.count" do
with_message_limit(0) do
- post :create,
- :params => { :display_name => recipient_user.display_name,
- :message => { :title => "Test Message", :body => "Test message body" } }
- assert_response :success
- assert_template "new"
- assert_select ".error", /wait a while/
+ perform_enqueued_jobs do
+ post :create,
+ :params => { :display_name => recipient_user.display_name,
+ :message => { :title => "Test Message", :body => "Test message body" } }
+ assert_response :success
+ assert_template "new"
+ assert_select ".error", /wait a while/
+ end
end
end
end
diff --git a/test/controllers/notes_controller_test.rb b/test/controllers/notes_controller_test.rb
index 33261c412..a1c323332 100644
--- a/test/controllers/notes_controller_test.rb
+++ b/test/controllers/notes_controller_test.rb
@@ -228,7 +228,9 @@ class NotesControllerTest < ActionController::TestCase
open_note_with_comment = create(:note_with_comments)
assert_difference "NoteComment.count", 1 do
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :comment, :params => { :id => open_note_with_comment.id, :text => "This is an additional comment", :format => "json" }
+ perform_enqueued_jobs do
+ post :comment, :params => { :id => open_note_with_comment.id, :text => "This is an additional comment", :format => "json" }
+ end
end
end
assert_response :success
@@ -265,7 +267,9 @@ class NotesControllerTest < ActionController::TestCase
end
assert_difference "NoteComment.count", 1 do
assert_difference "ActionMailer::Base.deliveries.size", 2 do
- post :comment, :params => { :id => note_with_comments_by_users.id, :text => "This is an additional comment", :format => "json" }
+ perform_enqueued_jobs do
+ post :comment, :params => { :id => note_with_comments_by_users.id, :text => "This is an additional comment", :format => "json" }
+ end
end
end
assert_response :success
@@ -307,7 +311,9 @@ class NotesControllerTest < ActionController::TestCase
assert_difference "NoteComment.count", 1 do
assert_difference "ActionMailer::Base.deliveries.size", 2 do
- post :comment, :params => { :id => note_with_comments_by_users.id, :text => "This is an additional comment", :format => "json" }
+ perform_enqueued_jobs do
+ post :comment, :params => { :id => note_with_comments_by_users.id, :text => "This is an additional comment", :format => "json" }
+ end
end
end
assert_response :success
diff --git a/test/controllers/users_controller_test.rb b/test/controllers/users_controller_test.rb
index ce64310cb..20a04e90b 100644
--- a/test/controllers/users_controller_test.rb
+++ b/test/controllers/users_controller_test.rb
@@ -237,7 +237,9 @@ class UsersControllerTest < ActionController::TestCase
assert_difference "User.count", 1 do
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :save, :session => { :new_user => user }
+ perform_enqueued_jobs do
+ post :save, :session => { :new_user => user }
+ end
end
end
@@ -259,7 +261,9 @@ class UsersControllerTest < ActionController::TestCase
assert_no_difference "User.count" do
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :save, :session => { :new_user => user }
+ perform_enqueued_jobs do
+ post :save, :session => { :new_user => user }
+ end
end
end
@@ -274,7 +278,9 @@ class UsersControllerTest < ActionController::TestCase
assert_no_difference "User.count" do
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :save, :session => { :new_user => user }
+ perform_enqueued_jobs do
+ post :save, :session => { :new_user => user }
+ end
end
end
@@ -289,7 +295,9 @@ class UsersControllerTest < ActionController::TestCase
assert_no_difference "User.count" do
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :save, :session => { :new_user => user }
+ perform_enqueued_jobs do
+ post :save, :session => { :new_user => user }
+ end
end
end
@@ -304,7 +312,9 @@ class UsersControllerTest < ActionController::TestCase
assert_no_difference "User.count" do
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :save, :session => { :new_user => user }
+ perform_enqueued_jobs do
+ post :save, :session => { :new_user => user }
+ end
end
end
@@ -318,8 +328,10 @@ class UsersControllerTest < ActionController::TestCase
assert_difference "User.count", 1 do
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :save, :session => { :new_user => user,
- :referer => "/edit?editor=id#map=1/2/3" }
+ perform_enqueued_jobs do
+ post :save, :session => { :new_user => user,
+ :referer => "/edit?editor=id#map=1/2/3" }
+ end
end
end
@@ -489,7 +501,9 @@ class UsersControllerTest < ActionController::TestCase
session[:token] = user.tokens.create.token
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- get :confirm_resend, :params => { :display_name => user.display_name }
+ perform_enqueued_jobs do
+ get :confirm_resend, :params => { :display_name => user.display_name }
+ end
end
assert_response :redirect
@@ -506,7 +520,9 @@ class UsersControllerTest < ActionController::TestCase
def test_confirm_resend_no_token
user = create(:user, :pending)
assert_no_difference "ActionMailer::Base.deliveries.size" do
- get :confirm_resend, :params => { :display_name => user.display_name }
+ perform_enqueued_jobs do
+ get :confirm_resend, :params => { :display_name => user.display_name }
+ end
end
assert_response :redirect
@@ -516,7 +532,9 @@ class UsersControllerTest < ActionController::TestCase
def test_confirm_resend_unknown_user
assert_no_difference "ActionMailer::Base.deliveries.size" do
- get :confirm_resend, :params => { :display_name => "No Such User" }
+ perform_enqueued_jobs do
+ get :confirm_resend, :params => { :display_name => "No Such User" }
+ end
end
assert_response :redirect
@@ -674,7 +692,9 @@ class UsersControllerTest < ActionController::TestCase
uppercase_user = build(:user, :email => user.email.upcase).tap { |u| u.save(:validate => false) }
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :lost_password, :params => { :user => { :email => user.email } }
+ perform_enqueued_jobs do
+ post :lost_password, :params => { :user => { :email => user.email } }
+ end
end
assert_response :redirect
assert_redirected_to :action => :login
@@ -687,7 +707,9 @@ class UsersControllerTest < ActionController::TestCase
# Test resetting using an address that matches a different user
# that has the same address in a different case
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :lost_password, :params => { :user => { :email => user.email.upcase } }
+ perform_enqueued_jobs do
+ post :lost_password, :params => { :user => { :email => user.email.upcase } }
+ end
end
assert_response :redirect
assert_redirected_to :action => :login
@@ -700,7 +722,9 @@ class UsersControllerTest < ActionController::TestCase
# Test resetting using an address that is a case insensitive match
# for more than one user but not an exact match for either
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :lost_password, :params => { :user => { :email => user.email.titlecase } }
+ perform_enqueued_jobs do
+ post :lost_password, :params => { :user => { :email => user.email.titlecase } }
+ end
end
assert_response :success
assert_template :lost_password
@@ -710,7 +734,9 @@ class UsersControllerTest < ActionController::TestCase
# address which is case insensitively unique
third_user = create(:user)
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :lost_password, :params => { :user => { :email => third_user.email } }
+ perform_enqueued_jobs do
+ post :lost_password, :params => { :user => { :email => third_user.email } }
+ end
end
assert_response :redirect
assert_redirected_to :action => :login
@@ -723,7 +749,9 @@ class UsersControllerTest < ActionController::TestCase
# Test resetting using an address that matches a user that has the
# same (case insensitively unique) address in a different case
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :lost_password, :params => { :user => { :email => third_user.email.upcase } }
+ perform_enqueued_jobs do
+ post :lost_password, :params => { :user => { :email => third_user.email.upcase } }
+ end
end
assert_response :redirect
assert_redirected_to :action => :login
@@ -898,7 +926,9 @@ class UsersControllerTest < ActionController::TestCase
# Changing email to one that exists should fail
user.new_email = create(:user).email
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+ perform_enqueued_jobs do
+ post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+ end
end
assert_response :success
assert_template :account
@@ -909,7 +939,9 @@ class UsersControllerTest < ActionController::TestCase
# Changing email to one that exists should fail, regardless of case
user.new_email = create(:user).email.upcase
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+ perform_enqueued_jobs do
+ post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+ end
end
assert_response :success
assert_template :account
@@ -920,7 +952,9 @@ class UsersControllerTest < ActionController::TestCase
# Changing email to one that doesn't exist should work
user.new_email = "new_tester@example.com"
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+ perform_enqueued_jobs do
+ post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
+ end
end
assert_response :success
assert_template :account
@@ -941,8 +975,9 @@ class UsersControllerTest < ActionController::TestCase
assert_response :not_found
# Test a normal user
- user = create(:user)
- create(:friend, :befriender => user)
+ user = create(:user, :home_lon => 1.1, :home_lat => 1.1)
+ friend_user = create(:user, :home_lon => 1.2, :home_lat => 1.2)
+ create(:friend, :befriender => user, :befriendee => friend_user)
get :show, :params => { :display_name => user.display_name }
assert_response :success
assert_select "div#userinformation" do
@@ -1257,7 +1292,9 @@ class UsersControllerTest < ActionController::TestCase
# When logged in a POST should add the friendship
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+ perform_enqueued_jobs do
+ post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+ end
end
assert_redirected_to user_path(friend)
assert_match(/is now your friend/, flash[:notice])
@@ -1269,7 +1306,9 @@ class UsersControllerTest < ActionController::TestCase
# A second POST should report that the friendship already exists
assert_no_difference "ActionMailer::Base.deliveries.size" do
- post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+ perform_enqueued_jobs do
+ post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
+ end
end
assert_redirected_to user_path(friend)
assert_match(/You are already friends with/, flash[:warning])
@@ -1296,7 +1335,9 @@ class UsersControllerTest < ActionController::TestCase
# When logged in a POST should add the friendship and refer us
assert_difference "ActionMailer::Base.deliveries.size", 1 do
- post :make_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
+ perform_enqueued_jobs do
+ post :make_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
+ end
end
assert_redirected_to "/test"
assert_match(/is now your friend/, flash[:notice])
diff --git a/test/integration/user_creation_test.rb b/test/integration/user_creation_test.rb
index 555e579f4..144a45a45 100644
--- a/test/integration/user_creation_test.rb
+++ b/test/integration/user_creation_test.rb
@@ -37,9 +37,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
display_name = "#{locale}_new_tester"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
- :headers => { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
+ :headers => { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
+ end
end
end
assert_response :success
@@ -56,9 +58,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
email = "#{locale}_new_tester"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => email, :email_confirmation => email, :display_name => dup_display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
- :headers => { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => email, :email_confirmation => email, :display_name => dup_display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
+ :headers => { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
+ end
end
end
assert_response :success
@@ -75,8 +79,10 @@ class UserCreationTest < ActionDispatch::IntegrationTest
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ end
end
end
@@ -84,9 +90,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/save",
- :headers => { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/save",
+ :headers => { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
+ follow_redirect!
+ end
end
end
@@ -122,12 +130,14 @@ class UserCreationTest < ActionDispatch::IntegrationTest
referer = "/traces/mine"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }, :referer => referer }
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password } }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }, :referer => referer }
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password } }
+ follow_redirect!
+ end
end
end
@@ -168,20 +178,22 @@ class UserCreationTest < ActionDispatch::IntegrationTest
password = "testtest"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => password, :pass_crypt_confirmation => password } }
- assert_response :redirect
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => password, :pass_crypt_confirmation => password } }
+ assert_response :redirect
+ follow_redirect!
+ end
end
end
@@ -199,21 +211,23 @@ class UserCreationTest < ActionDispatch::IntegrationTest
display_name = "new_tester-openid2"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- follow_redirect!
- assert_response :success
- assert_template "users/new"
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template "users/new"
+ end
end
end
@@ -229,19 +243,21 @@ class UserCreationTest < ActionDispatch::IntegrationTest
referer = "/traces/mine"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ follow_redirect!
+ end
end
end
@@ -284,20 +300,22 @@ class UserCreationTest < ActionDispatch::IntegrationTest
password = "testtest"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "google")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
- assert_response :redirect
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "google")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
+ assert_response :redirect
+ follow_redirect!
+ end
end
end
@@ -315,21 +333,23 @@ class UserCreationTest < ActionDispatch::IntegrationTest
display_name = "new_tester-google2"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "google")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- follow_redirect!
- assert_response :success
- assert_template "users/new"
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "google")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template "users/new"
+ end
end
end
@@ -347,19 +367,21 @@ class UserCreationTest < ActionDispatch::IntegrationTest
referer = "/traces/mine"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "google")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "google")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ follow_redirect!
+ end
end
end
@@ -400,20 +422,22 @@ class UserCreationTest < ActionDispatch::IntegrationTest
password = "testtest"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "facebook")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
- assert_response :redirect
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "facebook")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
+ assert_response :redirect
+ follow_redirect!
+ end
end
end
@@ -431,21 +455,23 @@ class UserCreationTest < ActionDispatch::IntegrationTest
display_name = "new_tester-facebook2"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "facebook")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- follow_redirect!
- assert_response :success
- assert_template "users/new"
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "facebook")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template "users/new"
+ end
end
end
@@ -461,19 +487,21 @@ class UserCreationTest < ActionDispatch::IntegrationTest
referer = "/traces/mine"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "facebook")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "facebook")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ follow_redirect!
+ end
end
end
@@ -514,20 +542,22 @@ class UserCreationTest < ActionDispatch::IntegrationTest
password = "testtest"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "windowslive")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
- assert_response :redirect
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "windowslive")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
+ assert_response :redirect
+ follow_redirect!
+ end
end
end
@@ -545,21 +575,23 @@ class UserCreationTest < ActionDispatch::IntegrationTest
display_name = "new_tester-windowslive2"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "windowslive")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- follow_redirect!
- assert_response :success
- assert_template "users/new"
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "windowslive")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template "users/new"
+ end
end
end
@@ -575,19 +607,21 @@ class UserCreationTest < ActionDispatch::IntegrationTest
referer = "/traces/mine"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "windowslive")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "windowslive")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ follow_redirect!
+ end
end
end
@@ -628,20 +662,22 @@ class UserCreationTest < ActionDispatch::IntegrationTest
password = "testtest"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "github")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
- assert_response :redirect
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "github")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
+ assert_response :redirect
+ follow_redirect!
+ end
end
end
@@ -659,21 +695,23 @@ class UserCreationTest < ActionDispatch::IntegrationTest
display_name = "new_tester-github2"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "github")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- follow_redirect!
- assert_response :success
- assert_template "users/new"
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "github")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template "users/new"
+ end
end
end
@@ -689,19 +727,21 @@ class UserCreationTest < ActionDispatch::IntegrationTest
referer = "/traces/mine"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "github")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "github")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ follow_redirect!
+ end
end
end
@@ -742,20 +782,22 @@ class UserCreationTest < ActionDispatch::IntegrationTest
password = "testtest"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
- assert_response :redirect
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password } }
+ assert_response :redirect
+ follow_redirect!
+ end
end
end
@@ -773,21 +815,23 @@ class UserCreationTest < ActionDispatch::IntegrationTest
display_name = "new_tester-wikipedia2"
assert_difference("User.count", 0) do
assert_difference("ActionMailer::Base.deliveries.size", 0) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" } }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- follow_redirect!
- assert_response :success
- assert_template "users/new"
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" } }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ follow_redirect!
+ assert_response :success
+ assert_template "users/new"
+ end
end
end
@@ -803,19 +847,21 @@ class UserCreationTest < ActionDispatch::IntegrationTest
referer = "/traces/mine"
assert_difference("User.count") do
assert_difference("ActionMailer::Base.deliveries.size", 1) do
- post "/user/new",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
- assert_response :redirect
- assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
- follow_redirect!
- assert_response :redirect
- assert_redirected_to "/user/terms"
- post "/user/save",
- :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
- follow_redirect!
+ perform_enqueued_jobs do
+ post "/user/new",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer }
+ assert_response :redirect
+ assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
+ follow_redirect!
+ assert_response :redirect
+ assert_redirected_to "/user/terms"
+ post "/user/save",
+ :params => { :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "wikipedia", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } }
+ follow_redirect!
+ end
end
end
diff --git a/test/models/relation_test.rb b/test/models/relation_test.rb
index e6d0c0abd..6b76d82a4 100644
--- a/test/models/relation_test.rb
+++ b/test/models/relation_test.rb
@@ -207,4 +207,29 @@ class RelationTest < ActiveSupport::TestCase
assert_equal 39, changeset.min_lat
assert_equal 39, changeset.max_lat
end
+
+ def test_changeset_bbox_delete_relation
+ orig_relation = create(:relation)
+ node1 = create(:node, :longitude => 116, :latitude => 39)
+ node2 = create(:node, :longitude => 39, :latitude => 116)
+ create(:relation_member, :relation => orig_relation, :member_type => "Node", :member_id => node1.id)
+ create(:relation_member, :relation => orig_relation, :member_type => "Node", :member_id => node2.id)
+ user = create(:user)
+ changeset = create(:changeset, :user => user)
+ assert_nil changeset.min_lon
+ assert_nil changeset.max_lon
+ assert_nil changeset.max_lat
+ assert_nil changeset.min_lat
+
+ new_relation = Relation.new
+ new_relation.id = orig_relation.id
+ new_relation.version = orig_relation.version
+ new_relation.changeset_id = changeset.id
+ orig_relation.delete_with_history!(new_relation, user)
+ changeset.reload
+ assert_equal 39, changeset.min_lon
+ assert_equal 116, changeset.max_lon
+ assert_equal 39, changeset.min_lat
+ assert_equal 116, changeset.max_lat
+ end
end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index 83cf909dd..fca1f64c9 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -11,6 +11,7 @@ WebMock.disable_net_connect!(:allow_localhost => true)
module ActiveSupport
class TestCase
include FactoryBot::Syntax::Methods
+ include ActiveJob::TestHelper
##
# takes a block which is executed in the context of a different