Merge remote-tracking branch 'upstream/pull/2052'
authorTom Hughes <tom@compton.nu>
Thu, 8 Nov 2018 17:44:57 +0000 (17:44 +0000)
committerTom Hughes <tom@compton.nu>
Thu, 8 Nov 2018 17:44:57 +0000 (17:44 +0000)
38 files changed:
.rubocop_todo.yml
app/controllers/changeset_comments_controller.rb [new file with mode: 0644]
app/controllers/changeset_controller.rb
app/views/changeset_comments/_comment.html.erb [moved from app/views/changeset/_comment.html.erb with 51% similarity]
app/views/changeset_comments/_comments.rss.builder [moved from app/views/changeset/_comments.rss.builder with 82% similarity]
app/views/changeset_comments/index.rss.builder [moved from app/views/changeset/comments_feed.rss.builder with 70% similarity]
app/views/changeset_comments/timeout.atom.builder [new file with mode: 0644]
app/views/changeset_comments/timeout.html.erb [new file with mode: 0644]
config/locales/ar.yml
config/locales/bn.yml
config/locales/br.yml
config/locales/da.yml
config/locales/de.yml
config/locales/el.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/fa.yml
config/locales/fr.yml
config/locales/hu.yml
config/locales/it.yml
config/locales/ko.yml
config/locales/mk.yml
config/locales/mo.yml
config/locales/nl.yml
config/locales/pt-BR.yml
config/locales/pt-PT.yml
config/locales/ru.yml
config/locales/tr.yml
config/locales/zh-TW.yml
config/routes.rb
test/controllers/api_controller_test.rb
test/controllers/browse_controller_test.rb
test/controllers/changeset_comments_controller_test.rb [new file with mode: 0644]
test/controllers/changeset_controller_test.rb
test/controllers/geocoder_controller_test.rb
test/controllers/redactions_controller_test.rb
test/models/redaction_test.rb

index e6ecfdb4aa4304567efbd8fca5bf6e37b66ae793..7232d199b03b52a27137d55691389f75b6413f87 100644 (file)
@@ -48,7 +48,7 @@ Metrics/BlockNesting:
 # Offense count: 63
 # Configuration parameters: CountComments.
 Metrics/ClassLength:
-  Max: 1801
+  Max: 1627
 
 # Offense count: 72
 Metrics/CyclomaticComplexity:
diff --git a/app/controllers/changeset_comments_controller.rb b/app/controllers/changeset_comments_controller.rb
new file mode 100644 (file)
index 0000000..6a563f9
--- /dev/null
@@ -0,0 +1,125 @@
+class ChangesetCommentsController < ApplicationController
+  before_action :authorize_web, :only => [:index]
+  before_action :set_locale, :only => [:index]
+  before_action :authorize, :only => [:create, :destroy, :restore]
+  before_action :require_moderator, :only => [:destroy, :restore]
+  before_action :require_allow_write_api, :only => [:create, :destroy, :restore]
+  before_action :require_public_data, :only => [:create]
+  before_action :check_api_writable, :only => [:create, :destroy, :restore]
+  before_action :check_api_readable, :except => [:create, :index]
+  before_action(:only => [:index]) { |c| c.check_database_readable(true) }
+  around_action :api_call_handle_error, :except => [:index]
+  around_action :api_call_timeout, :except => [:index]
+  around_action :web_timeout, :only => [:index]
+
+  ##
+  # Add a comment to a changeset
+  def create
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+    raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
+
+    # Extract the arguments
+    id = params[:id].to_i
+    body = params[:text]
+
+    # Find the changeset and check it is valid
+    changeset = Changeset.find(id)
+    raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open?
+
+    # Add a comment to the changeset
+    comment = changeset.comments.create(:changeset => changeset,
+                                        :body => body,
+                                        :author => current_user)
+
+    # Notify current subscribers of the new comment
+    changeset.subscribers.visible.each do |user|
+      Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user
+    end
+
+    # Add the commenter to the subscribers if necessary
+    changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
+
+    # Return a copy of the updated changeset
+    render :xml => changeset.to_xml.to_s
+  end
+
+  ##
+  # Sets visible flag on comment to false
+  def destroy
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+
+    # Extract the arguments
+    id = params[:id].to_i
+
+    # Find the changeset
+    comment = ChangesetComment.find(id)
+
+    # Hide the comment
+    comment.update(:visible => false)
+
+    # Return a copy of the updated changeset
+    render :xml => comment.changeset.to_xml.to_s
+  end
+
+  ##
+  # Sets visible flag on comment to true
+  def restore
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput, "No id was given" unless params[:id]
+
+    # Extract the arguments
+    id = params[:id].to_i
+
+    # Find the changeset
+    comment = ChangesetComment.find(id)
+
+    # Unhide the comment
+    comment.update(:visible => true)
+
+    # Return a copy of the updated changeset
+    render :xml => comment.changeset.to_xml.to_s
+  end
+
+  ##
+  # Get a feed of recent changeset comments
+  def index
+    if params[:id]
+      # Extract the arguments
+      id = params[:id].to_i
+
+      # Find the changeset
+      changeset = Changeset.find(id)
+
+      # Return comments for this changeset only
+      @comments = changeset.comments.includes(:author, :changeset).limit(comments_limit)
+    else
+      # Return comments
+      @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset)
+    end
+
+    # Render the result
+    respond_to do |format|
+      format.rss
+    end
+  rescue OSM::APIBadUserInput
+    head :bad_request
+  end
+
+  private
+
+  ##
+  # Get the maximum number of comments to return
+  def comments_limit
+    if params[:limit]
+      if params[:limit].to_i.positive? && params[:limit].to_i <= 10000
+        params[:limit].to_i
+      else
+        raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000"
+      end
+    else
+      100
+    end
+  end
+end
index 4ce205fd1513698dbfc9adeca3d5a48414a99ff0..7c9944f631effda92b800144e1ff74a9bb8039a8 100644 (file)
@@ -5,18 +5,17 @@ class ChangesetController < ApplicationController
   require "xml/libxml"
 
   skip_before_action :verify_authenticity_token, :except => [:index]
-  before_action :authorize_web, :only => [:index, :feed, :comments_feed]
-  before_action :set_locale, :only => [:index, :feed, :comments_feed]
-  before_action :authorize, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
-  before_action :require_moderator, :only => [:hide_comment, :unhide_comment]
-  before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
-  before_action :require_public_data, :only => [:create, :update, :upload, :close, :comment, :subscribe, :unsubscribe]
-  before_action :check_api_writable, :only => [:create, :update, :upload, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
-  before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
-  before_action(:only => [:index, :feed, :comments_feed]) { |c| c.check_database_readable(true) }
-  around_action :api_call_handle_error, :except => [:index, :feed, :comments_feed]
-  around_action :api_call_timeout, :except => [:index, :feed, :comments_feed, :upload]
-  around_action :web_timeout, :only => [:index, :feed, :comments_feed]
+  before_action :authorize_web, :only => [:index, :feed]
+  before_action :set_locale, :only => [:index, :feed]
+  before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+  before_action :require_allow_write_api, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+  before_action :require_public_data, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
+  before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe]
+  before_action :check_api_readable, :except => [:create, :update, :upload, :download, :query, :index, :feed, :subscribe, :unsubscribe]
+  before_action(:only => [:index, :feed]) { |c| c.check_database_readable(true) }
+  around_action :api_call_handle_error, :except => [:index, :feed]
+  around_action :api_call_timeout, :except => [:index, :feed, :upload]
+  around_action :web_timeout, :only => [:index, :feed]
 
   # Helper methods for checking consistency
   include ConsistencyValidations
@@ -310,38 +309,6 @@ class ChangesetController < ApplicationController
     index
   end
 
-  ##
-  # Add a comment to a changeset
-  def comment
-    # Check the arguments are sane
-    raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-    raise OSM::APIBadUserInput, "No text was given" if params[:text].blank?
-
-    # Extract the arguments
-    id = params[:id].to_i
-    body = params[:text]
-
-    # Find the changeset and check it is valid
-    changeset = Changeset.find(id)
-    raise OSM::APIChangesetNotYetClosedError, changeset if changeset.is_open?
-
-    # Add a comment to the changeset
-    comment = changeset.comments.create(:changeset => changeset,
-                                        :body => body,
-                                        :author => current_user)
-
-    # Notify current subscribers of the new comment
-    changeset.subscribers.visible.each do |user|
-      Notifier.changeset_comment_notification(comment, user).deliver_later if current_user != user
-    end
-
-    # Add the commenter to the subscribers if necessary
-    changeset.subscribers << current_user unless changeset.subscribers.exists?(current_user.id)
-
-    # Return a copy of the updated changeset
-    render :xml => changeset.to_xml.to_s
-  end
-
   ##
   # Adds a subscriber to the changeset
   def subscribe
@@ -382,69 +349,6 @@ class ChangesetController < ApplicationController
     render :xml => changeset.to_xml.to_s
   end
 
-  ##
-  # Sets visible flag on comment to false
-  def hide_comment
-    # Check the arguments are sane
-    raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
-    # Extract the arguments
-    id = params[:id].to_i
-
-    # Find the changeset
-    comment = ChangesetComment.find(id)
-
-    # Hide the comment
-    comment.update(:visible => false)
-
-    # Return a copy of the updated changeset
-    render :xml => comment.changeset.to_xml.to_s
-  end
-
-  ##
-  # Sets visible flag on comment to true
-  def unhide_comment
-    # Check the arguments are sane
-    raise OSM::APIBadUserInput, "No id was given" unless params[:id]
-
-    # Extract the arguments
-    id = params[:id].to_i
-
-    # Find the changeset
-    comment = ChangesetComment.find(id)
-
-    # Unhide the comment
-    comment.update(:visible => true)
-
-    # Return a copy of the updated changeset
-    render :xml => comment.changeset.to_xml.to_s
-  end
-
-  ##
-  # Get a feed of recent changeset comments
-  def comments_feed
-    if params[:id]
-      # Extract the arguments
-      id = params[:id].to_i
-
-      # Find the changeset
-      changeset = Changeset.find(id)
-
-      # Return comments for this changeset only
-      @comments = changeset.comments.includes(:author, :changeset).limit(comments_limit)
-    else
-      # Return comments
-      @comments = ChangesetComment.includes(:author, :changeset).where(:visible => true).order("created_at DESC").limit(comments_limit).preload(:changeset)
-    end
-
-    # Render the result
-    respond_to do |format|
-      format.rss
-    end
-  rescue OSM::APIBadUserInput
-    head :bad_request
-  end
-
   private
 
   #------------------------------------------------------------
@@ -577,18 +481,4 @@ class ChangesetController < ApplicationController
   def conditions_nonempty(changesets)
     changesets.where("num_changes > 0")
   end
-
-  ##
-  # Get the maximum number of comments to return
-  def comments_limit
-    if params[:limit]
-      if params[:limit].to_i.positive? && params[:limit].to_i <= 10000
-        params[:limit].to_i
-      else
-        raise OSM::APIBadUserInput, "Comments limit must be between 1 and 10000"
-      end
-    else
-      100
-    end
-  end
 end
similarity index 51%
rename from app/views/changeset/_comment.html.erb
rename to app/views/changeset_comments/_comment.html.erb
index dfd91167b486e02831464253c2cb31c377b0d1ea..32a4b9229de1c4e2e039c36c0f75ead908067c39 100644 (file)
@@ -1,6 +1,6 @@
-<h2><%= t "changeset.rss.comment", :author => comment.author.display_name, 
+<h2><%= t ".comment", :author => comment.author.display_name,
   :changeset_id => comment.changeset.id.to_s %></h2>
 <div class="changeset-comment" style="margin-top: 5px">
-  <div class="changeset-comment-description" style="font-size: smaller; color: #999999"><%= t "changeset.rss.commented_at_by_html", :when => friendly_date(comment.created_at), :user => comment.author.display_name %></div>
+  <div class="changeset-comment-description" style="font-size: smaller; color: #999999"><%= t ".commented_at_by_html", :when => friendly_date(comment.created_at), :user => comment.author.display_name %></div>
   <div class="changeset-comment-text"><%= comment.body %></div>
 </div>
similarity index 82%
rename from app/views/changeset/_comments.rss.builder
rename to app/views/changeset_comments/_comments.rss.builder
index 5c683c86d8ec224fe42ddd6d1bd5d5dc16e019ed..8848b9a80ddc8328de356936fe8bd9936cea441f 100644 (file)
@@ -1,6 +1,6 @@
 comments.each do |comment|
   xml.item do
-    xml.title t("changeset.rss.comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s)
+    xml.title t(".comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s)
 
     xml.link url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
     xml.guid url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
similarity index 70%
rename from app/views/changeset/comments_feed.rss.builder
rename to app/views/changeset_comments/index.rss.builder
index f6d304a4cbd9bf8c6a4da50d1dba7341cbd23650..acaa54727279e21a7a6816c5f8d39fad26b5bce8 100644 (file)
@@ -2,9 +2,9 @@ xml.rss("version" => "2.0",
         "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
   xml.channel do
     if @changeset
-      xml.title t("changeset.rss.title_particular", :changeset_id => @changeset.id)
+      xml.title t(".title_particular", :changeset_id => @changeset.id)
     else
-      xml.title t("changeset.rss.title_all")
+      xml.title t(".title_all")
     end
     xml.link url_for(:controller => "site", :action => "index", :only_path => false)
 
diff --git a/app/views/changeset_comments/timeout.atom.builder b/app/views/changeset_comments/timeout.atom.builder
new file mode 100644 (file)
index 0000000..b5eeeed
--- /dev/null
@@ -0,0 +1,12 @@
+atom_feed(:language => I18n.locale, :schema_date => 2009,
+          :id => url_for(params.merge(:only_path => false)),
+          :root_url => url_for(params.merge(:only_path => false, :format => nil)),
+          "xmlns:georss" => "http://www.georss.org/georss") do |feed|
+  feed.title @title
+
+  feed.subtitle :type => "xhtml" do |xhtml|
+    xhtml.p do |p|
+      p << t(".sorry")
+    end
+  end
+end
diff --git a/app/views/changeset_comments/timeout.html.erb b/app/views/changeset_comments/timeout.html.erb
new file mode 100644 (file)
index 0000000..84432bc
--- /dev/null
@@ -0,0 +1 @@
+<p><%= t '.sorry' %></p>
index 718f301192510d563a31f1fefb75c97e9cceb883..8f39978bba12a192e996df6e340e8a9a85eaba13 100644 (file)
@@ -2662,4 +2662,9 @@ ar:
         هذا التنقيح قبل تدميره.
       flash: التنقيح تم تدميره.
       error: حدث خطأ في تدمير هذا التنقيح.
+  validations:
+    leading_whitespace: لديه مسافة بيضاء أمامية
+    trailing_whitespace: لديه مسافة بيضاء زائدة
+    invalid_characters: يحتوي على أحرف غير صالحة
+    url_characters: يحتوي على أحرف يو آر إل خاصة (%{characters})
 ...
index b248348721fc0fc2c513577adf00b34524b45bd4..ec97318efe720625eb7ee92fd86c00c1b2dfbdc5 100644 (file)
@@ -6,6 +6,7 @@
 # Author: Bodhisattwa
 # Author: Ehsanulhb
 # Author: Elias Ahmmad
+# Author: Gronthokeet
 # Author: Kayser Ahmad
 # Author: Nasir8891
 # Author: R4bb1
@@ -314,10 +315,12 @@ bn:
       edit_link: এই ভুক্তি সম্পাদনা করুন
       hide_link: এই ভুক্তি লুকান
       confirm: নিশ্চিত করুন
+      report: এই ভুক্তির বিরুদ্ধে অভিযোগ করুন
     diary_comment:
       comment_from: '%{comment_created_at}-এ %{link_user} কর্তৃক মন্তব্য'
       hide_link: এই মন্তব্যটি লুকান
       confirm: নিশ্চিত করুন
+      report: এই মন্তব্যের বিরুদ্ধে অভিযোগ করুন
     location:
       location: 'অবস্থান:'
       view: দেখাও
@@ -361,6 +364,7 @@ bn:
           aerodrome: বিমানশালা
           apron: বর্হিবাস
           gate: প্রবেশপথ
+          hangar: বিমান রাখার স্থান
           helipad: হেলিপ্যাড
           parking_position: পার্কিং-এর স্থান
           runway: রানওয়ে
@@ -421,6 +425,7 @@ bn:
           office: দপ্তর
           parking: পার্কিং
           parking_entrance: পার্কিং প্রবেশপথ
+          parking_space: গাড়ি রাখার স্থান
           pharmacy: ঔষধালয়
           place_of_worship: উপাসনালয়
           police: পুলিশ
@@ -456,6 +461,7 @@ bn:
           youth_centre: যুব কেন্দ্র
         boundary:
           administrative: প্রশাসনিক সীমানা
+          census: আদমশুমারি এলাকা
           national_park: জাতীয় উদ্যান
           protected_area: সুরক্ষিত এলাকা
         bridge:
@@ -479,8 +485,10 @@ bn:
           "yes": কারুকাজ দোকান
         emergency:
           ambulance_station: রুগ্নবাহিকা স্টেশন
+          defibrillator: ডিফাইব্রিলেটর
           landing_site: জরুরি অবতরণ ক্ষেত্র
           phone: জরুরি ফোন
+          water_tank: জরুরি পানির ট্যাংক
           "yes": জরুরী
         highway:
           abandoned: পরিত্যক্ত মহাসড়ক
@@ -493,6 +501,7 @@ bn:
           emergency_access_point: জরুরি প্রবেশ স্থল
           footway: ফুটপাথ
           milestone: মাইলফলক
+          motorway: মোটরপথ
           path: পাথ
           pedestrian: পাদচারী পথ
           platform: প্লাটফর্ম
@@ -508,12 +517,13 @@ bn:
           service: পার্শ্ব সড়ক
           speed_camera: গতিমাপক ক্যামেরা
           steps: ধাপ
-          stop: à¦¥à¦¾à¦\95ার চিহ্ন
+          stop: à¦¥à¦¾à¦®ার চিহ্ন
           street_lamp: রাস্তার বাতি
           tertiary: প্রশাখা সড়ক
           tertiary_link: প্রশাখা সড়ক
           track: নির্ধারিত পথ
           traffic_signals: ট্রাফিক সংকেত
+          trail: চলাচলের নিশানা
           trunk: মূল সড়ক
           trunk_link: মূল সড়ক
           unclassified: অশ্রেণীকৃত সড়ক
@@ -523,6 +533,7 @@ bn:
           battlefield: যুদ্ধক্ষেত্র
           boundary_stone: সীমানাজ্ঞাপক পাথর
           building: ঐতিহাসিক ভবন
+          bunker: আপদকালীন ভূগর্ভস্থ আশ্রয়স্থল
           castle: কেল্লা
           church: গির্জা
           city_gate: নগর দ্বার
@@ -540,6 +551,8 @@ bn:
           stone: প্রস্তর
           tomb: সমাধি
           tower: মিনার
+          wreck: ভগ্নাবশেষ
+          "yes": ঐতিহাসিক স্থান
         junction:
           "yes": জংশন
         landuse:
@@ -571,27 +584,49 @@ bn:
           "yes": ব্যবহার্য ভূমি
         leisure:
           beach_resort: সৈকতীয় রিসোর্ট
+          bird_hide: পক্ষীদর্শন স্থান
           common: সাধারণ ভূমি
           dog_park: কুকুর উদ্যান
           fishing: মৎস শিকারের এলাকা
+          fitness_centre: শরীরচর্চা কেন্দ্র
           garden: বাগান
           golf_course: গল্ফ মাঠ
+          horse_riding: অশ্বারোহণ
+          miniature_golf: ক্ষুদ্রাকৃতির গল্ফ
           nature_reserve: সংরক্ষিত প্রাকৃতিক ভূমি
           park: উদ্যান
+          pitch: খেলার পিচ
           playground: খেলার মাঠ
           recreation_ground: চিত্তবিনোদন মাঠ
           resort: রিসোর্ট
+          sauna: বাষ্পস্নান
+          slipway: নৌকা ছাড়ার পথ
           sports_centre: ক্রীড়া কেন্দ্র
           stadium: ক্রিড়াঙ্গন
           swimming_pool: সুইমিং পুল
           water_park: বারি উদ্যান
           "yes": অবসর
         man_made:
+          adit: খনি সুড়ঙ্গ
+          beehive: মৌমাছির কৃত্রিম বাসা
+          breakwater: বেড়িবাঁধ
           bridge: সেতু
+          bunker_silo: গাড়ি ভর্তি ও খালি করার জায়গা
+          chimney: চিম্নী
+          crane: কপিকল
+          dyke: বাঁধ
+          flagpole: সতর্কীকরণ পতাকা
           lighthouse: বাতিঘর
+          mast: টাওয়ার
           mine: খনি
+          monitoring_station: আবহাওয়া পর্যবেক্ষ্ণ কেন্দ্র
+          petroleum_well: তেলের খনি
           pipeline: পাইপলাইন
+          silo: সিলো
+          surveillance: নজরদারী ক্যামেরা
           tower: টাওয়ার
+          water_tower: পানির ট্যাংক
+          water_well: পানির কূপ
           works: কারখানা
           "yes": মনুষ্য-নির্মিত
         military:
@@ -1324,15 +1359,26 @@ bn:
         rest_of_world: অন্যান্য দেশসমূহ
     show:
       my edits: আমার সম্পাদনা
+      my messages: আমার বার্তাসমূহ
       my profile: আমার প্রোফাইল
       my settings: আমার সেটিংস
+      my comments: আমার মন্তব্যস্মূহ
       oauth settings: OAuth সেটিংস
+      send message: বার্তা পাঠান
+      diary: দিনলিপি
       edits: সম্পাদনাসমূহ
+      remove as friend: আনফ্রেন্ড
+      add as friend: বন্ধু যোগ করুন
+      mapper since: থেকে ম্যাপ বানাচ্ছেন
+      ct undecided: সিদ্ধান্তহীন
+      ct declined: বাতিলকৃত
       email address: 'ই-মেইল ঠিকানা:'
       description: বিবরণ
+      user location: ব্যবহারকারীর অবস্থান
       settings_link_text: সেটিংস
       my friends: আমার বন্ধুগণ
       no friends: আপনি বন্ধুতালিকায় কাউকে যুক্ত করেননি।
+      nearby users: কাছাকাছি অন্য ব্যবহারকারী
       block_history: সক্রিয় বাধাসমূহ
       moderator_history: প্রদত্ত বাধাগুলি
       comments: মন্তব্যসমূহ
index faf77a5151b7908f7ecb83adb1e95a54699c682b..2541d0c641ef5c2b72aa3e55c76137b20c0ed190 100644 (file)
@@ -219,6 +219,7 @@ br:
       reopened_by_anonymous: Adweredekaet gant un den dianv <abbr title='%{exact_time}'>%{when}
         zo</abbr>
       hidden_by: Kuzhet gant %{user} <abbr title='%{exact_time}'>%{when} zo</abbr>
+      report: Disklêriañ an notenn-mañ
     query:
       title: Arc'hweladurioù enklask
       introduction: Klikit war ar gartenn evit kavout arc'hweladurioù e-kichen.
@@ -959,6 +960,7 @@ br:
     update:
       new_report: Enrollet mat eo bet ho tanevell
       successful_update: Hizivaet mat eo bet ho tanevell
+      provide_details: Reiñ ar munudoù goulennet
     show:
       title: '%{status} Kudenn #%{issue_id}'
       reports:
@@ -983,6 +985,25 @@ br:
   issue_comments:
     create:
       comment_created: Krouet mat eo bet hoc'h evezhiadenn.
+  reports:
+    new:
+      title_html: Danevell %{link}
+      missing_params: N'haller ket krouiñ un danevell nevez
+      details: Roit muioc'h a vunudoù diwar-benn ar gudenn (dre ret)
+      disclaimer:
+        not_just_mistake: Sur oc'h n'eo ket ar gudenn-se ur fazi hepken.
+      categories:
+        diary_entry:
+          other_label: All
+        diary_comment:
+          other_label: All
+        user:
+          other_label: All
+        note:
+          other_label: All
+    create:
+      successful_report: Enrollet mat eo bet ho tanevell
+      provide_details: Roit ar munudoù goulennet mar plij
   layouts:
     logo:
       alt_text: Logo OpenStreetMap
@@ -996,6 +1017,7 @@ br:
     edit: Aozañ
     history: Istor
     export: Ezporzhiañ
+    issues: Kudennoù
     data: Roadennoù
     export_data: Ezporzhiañ roadennoù
     gps_traces: Roudoù GPS
@@ -1683,8 +1705,10 @@ br:
       tags_help: bevennet gant virgulennoù
       visibility: 'Gwelusted :'
       visibility_help: Petra a dalvez ?
+      visibility_help_url: https://wiki.openstreetmap.org/wiki/FR:Visibilit%C3%A9_des_traces_GPS
       upload_button: Enporzhiañ
       help: Skoazell
+      help_url: https://wiki.openstreetmap.org/wiki/FR:Upload
     create:
       upload_trace: Kas ar roud GPS
       trace_uploaded: Kaset eo bet ho restr GPX hag emañ en gortoz a vezañ ensoc'het
@@ -1731,8 +1755,9 @@ br:
       delete_trace: Dilemel ar roudenn-mañ
       trace_not_found: N'eo ket bet kavet ar roud !
       visibility: 'Gwelusted :'
+      confirm_delete: Diverkañ ar roudenn-mañ
     trace_paging_nav:
-      showing_page: Page %{page}
+      showing_page: Pajenn %{page}
       older: ↓Roudoù kozh
       newer: ↓Roudoù nevez
     trace:
@@ -1753,6 +1778,7 @@ br:
       map: kartenn
     index:
       public_traces: Roudoù GPS foran
+      my_traces: Ma roudennoù GPS
       public_traces_from: Roudoù GPS foran gant %{user}
       description: Furchal ar roud GPS pellgarget nevez zo
       tagged_with: ' balizennet gant %{tags}'
@@ -1761,6 +1787,7 @@ br:
         ar <abajenn wiki>href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2i</a>.
       upload_trace: Kas ur roud
       see_all_traces: Gwelet an holl roudoù
+      see_my_traces: Gwelet ma roudennoù
     delete:
       scheduled_for_deletion: Roudenn da vezañ dilamet
     make_public:
@@ -1781,8 +1808,13 @@ br:
     require_cookies:
       cookies_needed: Diweredekaet eo an toupinoù ganeoc'h war a seblant - gweredekait
         an toupinoù en ho merdeer a-raok mont pelloc'h, mar plij.
+    require_admin:
+      not_an_admin: Ret eo deoc'h bezañ merour evit kas an ober-mañ da benn.
     require_moderator:
       not_a_moderator: Ret eo deoc'h bezañ habaskaer evit kas an ober-mañ da benn.
+    require_moderator_or_admin:
+      not_a_moderator_or_admin: Ret eo deoc'h bezañ habaskaer pe merour evit kas an
+        ober-mañ da benn.
     setup_user_auth:
       blocked_zero_hour: Ur gemennadenn vallus zo war lec'hienn OpenStreetMap evidoc'h.
         Ret eo deoc'h lenn ar gemennadenn-se a-raok gallout enrollañ ho kemmoù.
@@ -2001,10 +2033,12 @@ br:
       consider_pd: Ouzhpenn an asant amañ a-us, ez anavezan emañ ma zegasadennoù en
         domani foran
       consider_pd_why: petra eo se ?
+      consider_pd_why_url: https://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
       guidance: 'Titouroù da skoazellañ kompren an termenoù-mañ : a <a href="%{summary}">diverradenn
         lennus gant mab-den</a> hag un nebeud <a href="%{translations}">troidigezhioù
         anfurmel</a>'
       agree: Mat eo din
+      declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined
       decline: Nac'h
       you need to accept or decline: Lennit da gentañ Termenoù ar berzhidi nevez ha
         goude-se nac'hit pe asantit evit gallout kenderc'hel.
@@ -2055,6 +2089,7 @@ br:
       if set location: Lakait ho lec'h-annez war ar bajenn %{settings_link} da welet
         an implijerien war-dro.
       settings_link_text: arventennoù
+      my friends: Ma mignoned
       no friends: N'hoc'h eus ouzhpennet mignon ebet c'hoazh.
       km away: war-hed %{count} km
       m away: war-hed %{count} m
@@ -2124,6 +2159,7 @@ br:
         review link text: Heuilhit al liamm-mañ evel ma karot evit sellet ouzh diferadennoù
           nevez ar c'henlabourer hag asantiñ dezho.
         agreed_with_pd: Disklêriet hoc'h eus ivez emañ ho tegasadennoù en domani foran.
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: Petra eo se ?
       profile description: 'Deskrivadur ar profil :'
       preferred languages: 'Yezhoù gwellañ karet :'
@@ -2498,12 +2534,20 @@ br:
       distance: Hed
       errors:
         no_route: Ne c'haller ket kavout un hent etre an daou lec'h-mañ.
-        no_place: Ho tigarez, ne c'haller ket kavout al lec'h-mañ.
+        no_place: 'Ho tigarez, ne c''haller ket kavout al lec''h-mañ : %{place}.'
       instructions:
         continue_without_exit: Kenderc'hel war%{name}
         slight_right_without_exit: Troit un tammig a-zehoù war %{name}
         offramp_right_with_name: Kemer ar vretell dehou %{name}
+        offramp_right_with_directions: Kemer ar vretell dehou war-zu %{directions}
+        offramp_right_with_name_directions: Kemer ar vretell dehou war %{name}, war-zu
+          %{directions}
         onramp_right_without_exit: Troit a-zehoù war ar bretell war %{name}
+        onramp_right_with_directions: Troit a-zehoù war ar vretell war-zu %{directions}
+        onramp_right_with_name_directions: Troit a-zehou war ar vretell war %{name},
+          war-zu %{directions}
+        onramp_right_without_directions: Treiñ a-zehou war ar vretell
+        onramp_right: Troit a gleiz war ar vretell
         endofroad_right_without_exit: E penn an hent, troit a-zezhoù war %{name}
         merge_right_without_exit: Mont a-zehoù war %{name}
         fork_right_without_exit: Er forc'h-hent, troit a-zehoù war %{name}
@@ -2512,8 +2556,17 @@ br:
         uturn_without_exit: Grit hanter dro war %{name}
         sharp_left_without_exit: Troit prim a-gleiz war %{name}
         turn_left_without_exit: Treiñ a-gleiz war %{name}
+        offramp_left: Troit a gleiz war ar vretell
         offramp_left_with_name: Kemer ar vretell gleiz betek %{name}
+        offramp_left_with_directions: Troit a-gleiz war ar vretell war-zu %{directions}
+        offramp_left_with_name_directions: Troit a-gleiz war ar vretell war %{name},
+          war-zu %{directions}
         onramp_left_without_exit: Troit a-gleiz war ar vretell war %{name}
+        onramp_left_with_directions: Troit a-gleiz war ar vretell war-zu %{directions}
+        onramp_left_with_name_directions: Troit a-gleiz war ar vretell war %{name},
+          war-zu %{directions}
+        onramp_left_without_directions: Troit a-gleiz war ar vretell
+        onramp_left: Troit a-gleiz war ar vretell
         endofroad_left_without_exit: E penn an hent, troit a-gleiz war %{name}
         merge_left_without_exit: Mont a-gleiz war %{name}
         fork_left_without_exit: Er forc'h-hent, troit a-gleiz war %{name}
@@ -2523,7 +2576,7 @@ br:
         roundabout_without_exit: Er c'hroashent-tro, troit %{name}
         leave_roundabout_without_exit: Kuitaat ar c'roashent-tro - %{name}
         stay_roundabout_without_exit: Chom war ar c'hroashent-tro -%{name}
-        start_without_exit: Loc'hañ e dibenn %{name}
+        start_without_exit: Loc'hañ war %{name}
         destination_without_exit: Tizhout al lec'h
         against_oneway_without_exit: Mont gant ar straed untu war %{name}
         end_oneway_without_exit: Dibenn an tremen untun war %{name}
index 8f662f344737bf404ef3930c0d57c79a902a987c..7966d36f000a39cf10c768249db84cf434e5b98f 100644 (file)
@@ -967,6 +967,7 @@ da:
       reported_user: Rapporteret bruger
       not_updated: Ikke opdateret
       search: Søg
+      search_guidance: 'Søgning blandt sager:'
       user_not_found: Brugeren findes ikke
       status: Status
       reports: Rapporter
@@ -2641,4 +2642,6 @@ da:
         der tilhører denne omarbejdelse, før du sletter den.
       flash: Omarbejdelse slettet.
       error: Der opstod en fejl under sletning af denne omarbejdelse.
+  validations:
+    invalid_characters: indholder ugyldige tegn
 ...
index d0e38546b19ee5a189467138a66bfc7bb28aef24..666592b07f3b052cfcfc4027d09765326ed242c2 100644 (file)
@@ -2793,4 +2793,9 @@ de:
         zugehörigen Versionen zurück, bevor du die Redaction löschst.
       flash: Redaction wurde gelöscht.
       error: Beim Löschen dieser Redaction ist ein Fehler aufgetreten.
+  validations:
+    leading_whitespace: hat anführendes Leerzeichen
+    trailing_whitespace: hat anhängendes Leerzeichen
+    invalid_characters: enthält ungültige Zeichen
+    url_characters: enthält besondere URL-Zeichen (%{characters})
 ...
index 57f0a26cc81a3eae4ee1aaadff4d62c6a926a237..ad4f8ee47d0aa9978dcc398be5ba5b6818c9bf20 100644 (file)
@@ -2764,4 +2764,6 @@ el:
         σε αυτή τη σύνταξη πριν την καταστρέψετε.
       flash: Η παράληψη καταστραφεί.
       error: Εμφανίστηκε ένα σφάλμα που καταστρέφει αυτή τη σύνταξη.
+  validations:
+    invalid_characters: περιέχει μη έγκυρους χαρακτήρες
 ...
index d0b574a0966bb134f1ca4c5f2179a9e55a5dec0f..197c6308ccb3385c0250396a5ad791bd8c2cce00 100644 (file)
@@ -242,13 +242,17 @@ en:
       load_more: "Load more"
     timeout:
       sorry: "Sorry, the list of changesets you requested took too long to retrieve."
-    rss:
-      title_all: OpenStreetMap changeset discussion
-      title_particular: "OpenStreetMap changeset #%{changeset_id} discussion"
+  changeset_comments:
+    comment:
       comment: "New comment on changeset #%{changeset_id} by %{author}"
-      commented_at_html: "Updated %{when} ago"
       commented_at_by_html: "Updated %{when} ago by %{user}"
-      full: Full discussion
+    comments:
+      comment: "New comment on changeset #%{changeset_id} by %{author}"
+    index:
+      title_all: OpenStreetMap changeset discussion
+      title_particular: "OpenStreetMap changeset #%{changeset_id} discussion"
+    timeout:
+      sorry: "Sorry, the list of changeset comments you requested took too long to retrieve."
   diary_entries:
     new:
       title: New Diary Entry
index f10147286550324f6a1e521402c907da3c2c0e63..9c7462781794928faea3e8dc6ac899ad35fda2ed 100644 (file)
@@ -665,7 +665,7 @@ eo:
           monitoring_station: Observada stacio
           petroleum_well: Naftoŝakto
           pier: Marponto
-          pipeline: Tubolinio
+          pipeline: Konduktubo
           silo: Tur-stokejo
           storage_tank: Rezervujo
           surveillance: Supergardo
index e0aa65cef4d78a33dbc18eb9abfbb568d2f9e04d..3b7bee66c7e2798b405a1246d446afd3c98ef30f 100644 (file)
@@ -2757,4 +2757,6 @@ es:
         previas pertenecientes a esta redacción antes de destruirla.
       flash: Redacción destruida.
       error: Se produjo un error al destruir esta redacción
+  validations:
+    invalid_characters: contiene caracteres no válidos
 ...
index 2f4b77dc6cac7a18ca1c5c313a1244b525ec4115..bc47886e68efa327a637e1c6993bc97df92bc394 100644 (file)
@@ -1248,8 +1248,8 @@ fa:
         english_link: اصل انگلیسی
       native:
         title: درباره این صفحه
-        text: شما در حال مشاهده ویرایش انگلیسی قانون کپی‌رایت هستید.  برای دیدن %{native_link}  می
-          توانید به عقب باز گردید یا خواندن متن کپی رایت و %{mapping_link} را متوقف
+        text: شما در حال مشاهدهٔ ویرایش انگلیسی قانون کپی‌رایت هستید. برای دیدن %{native_link}
+          می‌توانید به عقب بازگردید یا مطالعه دربارهٔ کپی‌رایت را رها و %{mapping_link}
           کنید.
         native_link: نسخهٔ فارسی
         mapping_link: شروع به نقشه‌کشی
@@ -1693,7 +1693,7 @@ fa:
       owner: 'مالک:'
       description: 'شرح:'
       tags: 'برچسب‌ها:'
-      none: هیچ کدام
+      none: هیچ
       edit_trace: ویرایش این رد
       delete_trace: حذف این رد
       trace_not_found: رد یافت نشد!
index 193ae8c68c871c0f4b864a6de78e315bfcc90a38..4a17b3af17c6515785d41ef613d1ceb5130947a6 100644 (file)
@@ -2792,4 +2792,9 @@ fr:
         appartenant à ce masquage avant de le supprimer.
       flash: Masquage supprimé.
       error: Une erreur est survenue lors de la suppression de ce masquage.
+  validations:
+    leading_whitespace: a des espaces au début
+    trailing_whitespace: a des espaces à la fin
+    invalid_characters: contient des caractères non valides
+    url_characters: contient des caractères d’URL spéciaux (%{characters})
 ...
index 4dc589c1e642f21ce4f7a9255e7523b182574f68..6497880709d9817eb0c32e0e8c23dd054cb5a171 100644 (file)
@@ -27,6 +27,7 @@
 # Author: Tacsipacsi
 # Author: Uno20001
 # Author: Urbalazs
+# Author: Zizzerus
 ---
 hu:
   time:
@@ -2535,4 +2536,6 @@ hu:
         mielőtt törlöd ezt a módosítást.
       flash: Módosítás törölve.
       error: Hiba történt a művelet végrehajtása során.
+  validations:
+    invalid_characters: érvénytelen karaktereket tartalmaz
 ...
index 2fa9107ea74a6dfe1e01d11522b8dd59a0527e4f..3d5f50e919fc5a88d11bc8e1654995f3d7b626d6 100644 (file)
@@ -1883,6 +1883,7 @@ it:
         other: File GPX con %{count} punti da %{user}
       description_without_count: File GPX da %{user}
   application:
+    permission_denied: Non disponi dei permessi necessari per eseguire questa azione
     require_cookies:
       cookies_needed: Pare che tu abbia i cookie non abilitati - abilita i cookie
         nel tuo browser prima di continuare.
@@ -2731,4 +2732,7 @@ it:
         appartenenti a questa revisione prima di eliminarla.
       flash: Revisione eliminata.
       error: Si è verificato un errore durante l'eliminazione.
+  validations:
+    invalid_characters: contiene caratteri non validi
+    url_characters: contiene caratteri URL speciali (%{characters})
 ...
index 9ed3f177a266baeab8015630c6226d5c2fea9ece..2308a17f40a2bd2b95e01bbe82f712f4704e1308 100644 (file)
@@ -2580,4 +2580,7 @@ ko:
       not_empty: 교정이 비어 있지 않습니다. 파기하기 전에 이 교정에 속하는 모든 판을 교정 취소하세요.
       flash: 교정을 파기했습니다.
       error: 이 교정을 파기하는 중에 오류가 발생했습니다.
+  validations:
+    invalid_characters: 유효하지 않은 문자가 포함됨
+    url_characters: 특정 URL 문자 포함 (%{characters})
 ...
index d459f11f577c9f89eb2ac80c53df6301dcbae6c7..009ad478182782abdc0d8d1c56f6255a13c72be2 100644 (file)
@@ -2692,4 +2692,9 @@ mk:
         на оваа редакција пред да ја поништите.
       flash: Редакцијата е поништена.
       error: Се појави грешка при поништувањето на редакцијата.
+  validations:
+    leading_whitespace: има почетна белина
+    trailing_whitespace: има завршна белина
+    invalid_characters: содржи неважечки знаци
+    url_characters: содржи посебни знаци во URL-то (%{characters})
 ...
index 91282eddeb362c2c720b3598c72f1737d02cb21d..c1f97515992b4730767007b68b58b0f68497b571 100644 (file)
@@ -576,6 +576,9 @@ mo:
   site:
     export:
       title: Експортаре
+  traces:
+    edit:
+      save_button: Апликаря модификэрилор
   users:
     login:
       title: Презентаци-вэ
@@ -650,10 +653,20 @@ mo:
       openid:
         link text: че май есте ши аста?
       public editing:
+        heading: 'Редактаря публикэ:'
         enabled link text: че май есте ши аста?
       contributor terms:
         link text: че май есте ши аста?
+      profile description: 'Дескриеря профилулуй:'
+      preferred languages: 'Лимбиле преферате:'
       preferred editor: 'Редактор преферат:'
+      image: 'Имаӂине:'
       gravatar:
+        gravatar: Фолосиря Граватарулуй
         link text: че май есте ши аста?
+      new image: Адэугаря имаӂиний
+      home location: 'Локул де решединцэ:'
+      latitude: 'Латитудине:'
+      longitude: 'Лонӂитудине:'
+      save changes button: Апликаря модификэрилор
 ...
index 28b3d7f598b9a7710f8a98f9efbaefebdda82b4e..0e997fafb199c0f3060b94ec05e6c7a4f7b69faf 100644 (file)
@@ -523,6 +523,7 @@ nl:
           "yes": Ambachtswinkel
         emergency:
           ambulance_station: Ambulancepost
+          assembly_point: Verzamelplaats
           defibrillator: Defibrillator
           landing_site: Noodlandingsbaan
           phone: Noodtelefoon
@@ -887,6 +888,7 @@ nl:
           stationery: Kantoorartikelenwinkel
           supermarket: Supermarkt
           tailor: Kleermaker
+          ticket: Ticketwinkel
           tobacco: Tabakswinkel
           toys: Speelgoedwinkel
           travel_agency: Reisbureau
@@ -1808,6 +1810,7 @@ nl:
       map: kaart
     index:
       public_traces: Openbare GPS-traces
+      my_traces: Mijn GPS-tracks
       public_traces_from: Openbare GPS-traces van %{user}
       description: Recente GPS-trackuploads bekijken
       tagged_with: ' gelabeld met %{tags}'
@@ -1815,6 +1818,7 @@ nl:
         trace</a> of kom meer te weten over GPS tracen op de <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wikipagina</a>.
       upload_trace: Trace uploaden
       see_all_traces: Alle traces bekijken
+      see_my_traces: Weergeef mijn tracks
     delete:
       scheduled_for_deletion: Trace staat op de lijst voor verwijdering
     make_public:
@@ -2635,4 +2639,7 @@ nl:
         betrokken zijn voordat u die vernietigt.
       flash: De redigering is vernietigd.
       error: Er is een fout opgetreden tijdens het verwijderen van de redigering.
+  validations:
+    invalid_characters: bevat ongeldige karakters
+    url_characters: bevat speciale URL karakters (%{characters})
 ...
index ca3969dfce9598bee05a1dc52e54f23951a832ea..f8d690a64c972031bfe878f611bb01afbf34176c 100644 (file)
@@ -2744,4 +2744,9 @@ pt-BR:
         a esta anulação antes de destruí-la.
       flash: Redação destruída.
       error: Houve um erro ao destruir esta anulação.
+  validations:
+    leading_whitespace: tem espaço em branco líder
+    trailing_whitespace: tem espaço em branco à direita
+    invalid_characters: contém caracteres inválidos
+    url_characters: contém caracteres de URL especiais (%{characters})
 ...
index 96127154586850e348b899996c1ab5dc41ea2dc4..63a7ec070607949667af8c3f172cc30d236095dd 100644 (file)
@@ -2734,4 +2734,9 @@ pt-PT:
         as versões pertencentes a esta supressão antes de a eliminar
       flash: Supressão eliminada.
       error: Ocorreu um erro ao tentar eliminar esta supressão.
+  validations:
+    leading_whitespace: tem espaços no início
+    trailing_whitespace: tem espaços no fim
+    invalid_characters: contém caracteres inválidos
+    url_characters: contém caracteres especiais dos URL (%{characters})
 ...
index 8fe3d372e3d0d859db5120f98a4d04dbdb0e53d9..02e3a6d1056a1b9ec7abfd02a09abcc31e74bd6a 100644 (file)
@@ -37,6 +37,7 @@
 # Author: Irus
 # Author: Kaganer
 # Author: Komzpa
+# Author: Link2xt
 # Author: Lockal
 # Author: Macofe
 # Author: Mavl
@@ -1908,6 +1909,7 @@ ru:
         other: GPX-файл с %{count} точками от %{user}
       description_without_count: GPX-файл от %{user}
   application:
+    permission_denied: У вас нет прав для выполнения этого действия
     require_cookies:
       cookies_needed: Похоже, что у вас выключены куки. Пожалуйста, включите куки
         в вашем браузере, прежде чем продолжить.
@@ -2771,4 +2773,7 @@ ru:
         принадлежащих к этому исправлению перед удалением.
       flash: Исправление уничтожено.
       error: Произошла ошибка при уничтожении этого исправления.
+  validations:
+    invalid_characters: содержит недопустимые символы
+    url_characters: содержит специальные символы в URL (%{characters})
 ...
index 555cc6ff033f9f8ea9251162930ffd6e48bdca62..6d107bd5c12a2107cd86a3f068d4ecfc9080c8ff 100644 (file)
@@ -1900,6 +1900,7 @@ tr:
         other: '%{user} tarafından %{count} noktalı GPX dosyası'
       description_without_count: '%{user} tarafından GPX dosyası'
   application:
+    permission_denied: Bu eyleme erişme izniniz yok
     require_cookies:
       cookies_needed: Çerezleri devre dışı bırakmış görünüyorsunuz - devam etmeden
         önce lütfen tarayıcınızda çerezleri etkinleştirin.
@@ -2684,6 +2685,9 @@ tr:
         against_oneway_without_exit: '%{name}X üzerinde tek yönlü git'
         end_oneway_without_exit: '%{name} için tek yönün sonu'
         roundabout_with_exit: Dönel kavşakta %{exit}. çıkışı kullanarak %{name} üzerine
+        roundabout_with_exit_ordinal: Dönel kavşakta %{exit} çıkışı kullanarak %{name}
+          üzerine
+        exit_roundabout: '%{name} giden kavşaktan çıkın'
         unnamed: adsız yol
         courtesy: Yolculuğun izniyle %{link}x
         exit_counts:
@@ -2744,4 +2748,7 @@ tr:
         sürümlerini tekrar düzenleyin.
       flash: Redaksiyon kaldırıldı.
       error: Bu redaksiyon kaldırılırken bir hata oluştu.
+  validations:
+    invalid_characters: geçersiz karakterler içeriyor
+    url_characters: özel URL karakterleri içerir (%{characters})
 ...
index 6dfe3523cc27a2457c87b595b9ae5776eefd35ca..349817a90ae5f6eeeb14856edd95a19ed045c2f9 100644 (file)
@@ -2488,4 +2488,9 @@ zh-TW:
       not_empty: 修訂尚未清空。請在銷毀前清除所有此修訂的版本。
       flash: 修訂已銷毀。
       error: 銷毀此修訂時發生錯誤。
+  validations:
+    leading_whitespace: 前頭有空白
+    trailing_whitespace: 後端有空白
+    invalid_characters: 包含無效字元
+    url_characters: 包含特定 URL 字元(%{characters})
 ...
index 1f25a62c68fe6bcdd870d7c758fa9ef81d50562b..78146606429787f6ec7fd78c74a628ce7b9f0341 100644 (file)
@@ -16,9 +16,9 @@ OpenStreetMap::Application.routes.draw do
     put "changeset/:id" => "changeset#update", :id => /\d+/
     put "changeset/:id/close" => "changeset#close", :id => /\d+/
     get "changesets" => "changeset#query"
-    post "changeset/:id/comment" => "changeset#comment", :as => :changeset_comment, :id => /\d+/
-    post "changeset/comment/:id/hide" => "changeset#hide_comment", :as => :changeset_comment_hide, :id => /\d+/
-    post "changeset/comment/:id/unhide" => "changeset#unhide_comment", :as => :changeset_comment_unhide, :id => /\d+/
+    post "changeset/:id/comment" => "changeset_comments#create", :as => :changeset_comment, :id => /\d+/
+    post "changeset/comment/:id/hide" => "changeset_comments#destroy", :as => :changeset_comment_hide, :id => /\d+/
+    post "changeset/comment/:id/unhide" => "changeset_comments#restore", :as => :changeset_comment_unhide, :id => /\d+/
 
     put "node/create" => "nodes#create"
     get "node/:id/ways" => "ways#ways_for_node", :id => /\d+/
@@ -116,7 +116,7 @@ OpenStreetMap::Application.routes.draw do
   get "/relation/:id" => "browse#relation", :id => /\d+/, :as => :relation
   get "/relation/:id/history" => "browse#relation_history", :id => /\d+/
   get "/changeset/:id" => "browse#changeset", :as => :changeset, :id => /\d+/
-  get "/changeset/:id/comments/feed" => "changeset#comments_feed", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" }
+  get "/changeset/:id/comments/feed" => "changeset_comments#index", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" }
   get "/note/:id" => "browse#note", :id => /\d+/, :as => "browse_note"
   get "/note/new" => "browse#new_note"
   get "/user/:display_name/history" => "changeset#index"
@@ -152,7 +152,7 @@ OpenStreetMap::Application.routes.draw do
   get "/about" => "site#about"
   get "/history" => "changeset#index"
   get "/history/feed" => "changeset#feed", :defaults => { :format => :atom }
-  get "/history/comments/feed" => "changeset#comments_feed", :as => :changesets_comments_feed, :defaults => { :format => "rss" }
+  get "/history/comments/feed" => "changeset_comments#index", :as => :changesets_comments_feed, :defaults => { :format => "rss" }
   get "/export" => "site#export"
   match "/login" => "users#login", :via => [:get, :post]
   match "/logout" => "users#logout", :via => [:get, :post]
index 11d850ac35f67edfab51a043b96b9970005cccd5..cdc20a1aad0d0de4cfea0796e1b904ca7329550b 100644 (file)
@@ -1,5 +1,4 @@
 require "test_helper"
-require "api_controller"
 
 class ApiControllerTest < ActionController::TestCase
   def setup
index d6bde97d6add65bdcbaa9dc90088875f1a625640..7cb55b0eccd87cd584585b248a743af73d5268e9 100644 (file)
@@ -1,5 +1,4 @@
 require "test_helper"
-require "browse_controller"
 
 class BrowseControllerTest < ActionController::TestCase
   ##
diff --git a/test/controllers/changeset_comments_controller_test.rb b/test/controllers/changeset_comments_controller_test.rb
new file mode 100644 (file)
index 0000000..10dfb1f
--- /dev/null
@@ -0,0 +1,251 @@
+require "test_helper"
+
+class ChangesetCommentsControllerTest < ActionController::TestCase
+  ##
+  # test all routes which lead to this controller
+  def test_routes
+    assert_routing(
+      { :path => "/api/0.6/changeset/1/comment", :method => :post },
+      { :controller => "changeset_comments", :action => "create", :id => "1" }
+    )
+    assert_routing(
+      { :path => "/api/0.6/changeset/comment/1/hide", :method => :post },
+      { :controller => "changeset_comments", :action => "destroy", :id => "1" }
+    )
+    assert_routing(
+      { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post },
+      { :controller => "changeset_comments", :action => "restore", :id => "1" }
+    )
+    assert_routing(
+      { :path => "/changeset/1/comments/feed", :method => :get },
+      { :controller => "changeset_comments", :action => "index", :id => "1", :format => "rss" }
+    )
+    assert_routing(
+      { :path => "/history/comments/feed", :method => :get },
+      { :controller => "changeset_comments", :action => "index", :format => "rss" }
+    )
+  end
+
+  ##
+  # create comment success
+  def test_create_comment_success
+    user = create(:user)
+    user2 = create(:user)
+    private_user = create(:user, :data_public => false)
+    suspended_user = create(:user, :suspended)
+    deleted_user = create(:user, :deleted)
+    private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
+
+    basic_authorization user.email, "test"
+
+    assert_difference "ChangesetComment.count", 1 do
+      assert_no_difference "ActionMailer::Base.deliveries.size" do
+        perform_enqueued_jobs do
+          post :create, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" }
+        end
+      end
+    end
+    assert_response :success
+
+    changeset = create(:changeset, :closed, :user => private_user)
+    changeset.subscribers.push(private_user)
+    changeset.subscribers.push(user)
+    changeset.subscribers.push(suspended_user)
+    changeset.subscribers.push(deleted_user)
+
+    assert_difference "ChangesetComment.count", 1 do
+      assert_difference "ActionMailer::Base.deliveries.size", 1 do
+        perform_enqueued_jobs do
+          post :create, :params => { :id => changeset.id, :text => "This is a comment" }
+        end
+      end
+    end
+    assert_response :success
+
+    email = ActionMailer::Base.deliveries.first
+    assert_equal 1, email.to.length
+    assert_equal "[OpenStreetMap] #{user.display_name} has commented on one of your changesets", email.subject
+    assert_equal private_user.email, email.to.first
+
+    ActionMailer::Base.deliveries.clear
+
+    basic_authorization user2.email, "test"
+
+    assert_difference "ChangesetComment.count", 1 do
+      assert_difference "ActionMailer::Base.deliveries.size", 2 do
+        perform_enqueued_jobs do
+          post :create, :params => { :id => changeset.id, :text => "This is a comment" }
+        end
+      end
+    end
+    assert_response :success
+
+    email = ActionMailer::Base.deliveries.find { |e| e.to.first == private_user.email }
+    assert_not_nil email
+    assert_equal 1, email.to.length
+    assert_equal "[OpenStreetMap] #{user2.display_name} has commented on one of your changesets", email.subject
+
+    email = ActionMailer::Base.deliveries.find { |e| e.to.first == user.email }
+    assert_not_nil email
+    assert_equal 1, email.to.length
+    assert_equal "[OpenStreetMap] #{user2.display_name} has commented on a changeset you are interested in", email.subject
+
+    ActionMailer::Base.deliveries.clear
+  end
+
+  ##
+  # create comment fail
+  def test_create_comment_fail
+    # unauthorized
+    post :create, :params => { :id => create(:changeset, :closed).id, :text => "This is a comment" }
+    assert_response :unauthorized
+
+    basic_authorization create(:user).email, "test"
+
+    # bad changeset id
+    assert_no_difference "ChangesetComment.count" do
+      post :create, :params => { :id => 999111, :text => "This is a comment" }
+    end
+    assert_response :not_found
+
+    # not closed changeset
+    assert_no_difference "ChangesetComment.count" do
+      post :create, :params => { :id => create(:changeset).id, :text => "This is a comment" }
+    end
+    assert_response :conflict
+
+    # no text
+    assert_no_difference "ChangesetComment.count" do
+      post :create, :params => { :id => create(:changeset, :closed).id }
+    end
+    assert_response :bad_request
+
+    # empty text
+    assert_no_difference "ChangesetComment.count" do
+      post :create, :params => { :id => create(:changeset, :closed).id, :text => "" }
+    end
+    assert_response :bad_request
+  end
+
+  ##
+  # test hide comment fail
+  def test_destroy_comment_fail
+    # unauthorized
+    comment = create(:changeset_comment)
+    assert_equal true, comment.visible
+
+    post :destroy, :params => { :id => comment.id }
+    assert_response :unauthorized
+    assert_equal true, comment.reload.visible
+
+    basic_authorization create(:user).email, "test"
+
+    # not a moderator
+    post :destroy, :params => { :id => comment.id }
+    assert_response :forbidden
+    assert_equal true, comment.reload.visible
+
+    basic_authorization create(:moderator_user).email, "test"
+
+    # bad comment id
+    post :destroy, :params => { :id => 999111 }
+    assert_response :not_found
+    assert_equal true, comment.reload.visible
+  end
+
+  ##
+  # test hide comment succes
+  def test_hide_comment_success
+    comment = create(:changeset_comment)
+    assert_equal true, comment.visible
+
+    basic_authorization create(:moderator_user).email, "test"
+
+    post :destroy, :params => { :id => comment.id }
+    assert_response :success
+    assert_equal false, comment.reload.visible
+  end
+
+  ##
+  # test unhide comment fail
+  def test_restore_comment_fail
+    # unauthorized
+    comment = create(:changeset_comment, :visible => false)
+    assert_equal false, comment.visible
+
+    post :restore, :params => { :id => comment.id }
+    assert_response :unauthorized
+    assert_equal false, comment.reload.visible
+
+    basic_authorization create(:user).email, "test"
+
+    # not a moderator
+    post :restore, :params => { :id => comment.id }
+    assert_response :forbidden
+    assert_equal false, comment.reload.visible
+
+    basic_authorization create(:moderator_user).email, "test"
+
+    # bad comment id
+    post :restore, :params => { :id => 999111 }
+    assert_response :not_found
+    assert_equal false, comment.reload.visible
+  end
+
+  ##
+  # test unhide comment succes
+  def test_unhide_comment_success
+    comment = create(:changeset_comment, :visible => false)
+    assert_equal false, comment.visible
+
+    basic_authorization create(:moderator_user).email, "test"
+
+    post :restore, :params => { :id => comment.id }
+    assert_response :success
+    assert_equal true, comment.reload.visible
+  end
+
+  ##
+  # test comments feed
+  def test_feed
+    changeset = create(:changeset, :closed)
+    create_list(:changeset_comment, 3, :changeset => changeset)
+
+    get :index, :params => { :format => "rss" }
+    assert_response :success
+    assert_equal "application/rss+xml", @response.content_type
+    assert_select "rss", :count => 1 do
+      assert_select "channel", :count => 1 do
+        assert_select "item", :count => 3
+      end
+    end
+
+    get :index, :params => { :format => "rss", :limit => 2 }
+    assert_response :success
+    assert_equal "application/rss+xml", @response.content_type
+    assert_select "rss", :count => 1 do
+      assert_select "channel", :count => 1 do
+        assert_select "item", :count => 2
+      end
+    end
+
+    get :index, :params => { :id => changeset.id, :format => "rss" }
+    assert_response :success
+    assert_equal "application/rss+xml", @response.content_type
+    assert_select "rss", :count => 1 do
+      assert_select "channel", :count => 1 do
+        assert_select "item", :count => 3
+      end
+    end
+  end
+
+  ##
+  # test comments feed
+  def test_feed_bad_limit
+    get :index, :params => { :format => "rss", :limit => 0 }
+    assert_response :bad_request
+
+    get :index, :params => { :format => "rss", :limit => 100001 }
+    assert_response :bad_request
+  end
+end
index 472ebb25942c70e689cdc12c99a0bf4588bf42ef..7dc479cad825a96965d1a17ff5b50fc726b03a7e 100644 (file)
@@ -41,26 +41,10 @@ class ChangesetControllerTest < ActionController::TestCase
       { :path => "/api/0.6/changeset/1/close", :method => :put },
       { :controller => "changeset", :action => "close", :id => "1" }
     )
-    assert_routing(
-      { :path => "/api/0.6/changeset/1/comment", :method => :post },
-      { :controller => "changeset", :action => "comment", :id => "1" }
-    )
-    assert_routing(
-      { :path => "/api/0.6/changeset/comment/1/hide", :method => :post },
-      { :controller => "changeset", :action => "hide_comment", :id => "1" }
-    )
-    assert_routing(
-      { :path => "/api/0.6/changeset/comment/1/unhide", :method => :post },
-      { :controller => "changeset", :action => "unhide_comment", :id => "1" }
-    )
     assert_routing(
       { :path => "/api/0.6/changesets", :method => :get },
       { :controller => "changeset", :action => "query" }
     )
-    assert_routing(
-      { :path => "/changeset/1/comments/feed", :method => :get },
-      { :controller => "changeset", :action => "comments_feed", :id => "1", :format => "rss" }
-    )
     assert_routing(
       { :path => "/user/name/history", :method => :get },
       { :controller => "changeset", :action => "index", :display_name => "name" }
@@ -85,10 +69,6 @@ class ChangesetControllerTest < ActionController::TestCase
       { :path => "/history/feed", :method => :get },
       { :controller => "changeset", :action => "feed", :format => :atom }
     )
-    assert_routing(
-      { :path => "/history/comments/feed", :method => :get },
-      { :controller => "changeset", :action => "comments_feed", :format => "rss" }
-    )
   end
 
   # -----------------------
@@ -2139,107 +2119,6 @@ CHANGESET
     assert_select "osmChange node[id='#{node.id}'][version='1']", 0
   end
 
-  ##
-  # create comment success
-  def test_create_comment_success
-    user = create(:user)
-    user2 = create(:user)
-    private_user = create(:user, :data_public => false)
-    suspended_user = create(:user, :suspended)
-    deleted_user = create(:user, :deleted)
-    private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
-
-    basic_authorization user.email, "test"
-
-    assert_difference "ChangesetComment.count", 1 do
-      assert_no_difference "ActionMailer::Base.deliveries.size" do
-        perform_enqueued_jobs do
-          post :comment, :params => { :id => private_user_closed_changeset.id, :text => "This is a comment" }
-        end
-      end
-    end
-    assert_response :success
-
-    changeset = create(:changeset, :closed, :user => private_user)
-    changeset.subscribers.push(private_user)
-    changeset.subscribers.push(user)
-    changeset.subscribers.push(suspended_user)
-    changeset.subscribers.push(deleted_user)
-
-    assert_difference "ChangesetComment.count", 1 do
-      assert_difference "ActionMailer::Base.deliveries.size", 1 do
-        perform_enqueued_jobs do
-          post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
-        end
-      end
-    end
-    assert_response :success
-
-    email = ActionMailer::Base.deliveries.first
-    assert_equal 1, email.to.length
-    assert_equal "[OpenStreetMap] #{user.display_name} has commented on one of your changesets", email.subject
-    assert_equal private_user.email, email.to.first
-
-    ActionMailer::Base.deliveries.clear
-
-    basic_authorization user2.email, "test"
-
-    assert_difference "ChangesetComment.count", 1 do
-      assert_difference "ActionMailer::Base.deliveries.size", 2 do
-        perform_enqueued_jobs do
-          post :comment, :params => { :id => changeset.id, :text => "This is a comment" }
-        end
-      end
-    end
-    assert_response :success
-
-    email = ActionMailer::Base.deliveries.find { |e| e.to.first == private_user.email }
-    assert_not_nil email
-    assert_equal 1, email.to.length
-    assert_equal "[OpenStreetMap] #{user2.display_name} has commented on one of your changesets", email.subject
-
-    email = ActionMailer::Base.deliveries.find { |e| e.to.first == user.email }
-    assert_not_nil email
-    assert_equal 1, email.to.length
-    assert_equal "[OpenStreetMap] #{user2.display_name} has commented on a changeset you are interested in", email.subject
-
-    ActionMailer::Base.deliveries.clear
-  end
-
-  ##
-  # create comment fail
-  def test_create_comment_fail
-    # unauthorized
-    post :comment, :params => { :id => create(:changeset, :closed).id, :text => "This is a comment" }
-    assert_response :unauthorized
-
-    basic_authorization create(:user).email, "test"
-
-    # bad changeset id
-    assert_no_difference "ChangesetComment.count" do
-      post :comment, :params => { :id => 999111, :text => "This is a comment" }
-    end
-    assert_response :not_found
-
-    # not closed changeset
-    assert_no_difference "ChangesetComment.count" do
-      post :comment, :params => { :id => create(:changeset).id, :text => "This is a comment" }
-    end
-    assert_response :conflict
-
-    # no text
-    assert_no_difference "ChangesetComment.count" do
-      post :comment, :params => { :id => create(:changeset, :closed).id }
-    end
-    assert_response :bad_request
-
-    # empty text
-    assert_no_difference "ChangesetComment.count" do
-      post :comment, :params => { :id => create(:changeset, :closed).id, :text => "" }
-    end
-    assert_response :bad_request
-  end
-
   ##
   # test subscribe success
   def test_subscribe_success
@@ -2337,128 +2216,6 @@ CHANGESET
     assert_response :not_found
   end
 
-  ##
-  # test hide comment fail
-  def test_hide_comment_fail
-    # unauthorized
-    comment = create(:changeset_comment)
-    assert_equal true, comment.visible
-
-    post :hide_comment, :params => { :id => comment.id }
-    assert_response :unauthorized
-    assert_equal true, comment.reload.visible
-
-    basic_authorization create(:user).email, "test"
-
-    # not a moderator
-    post :hide_comment, :params => { :id => comment.id }
-    assert_response :forbidden
-    assert_equal true, comment.reload.visible
-
-    basic_authorization create(:moderator_user).email, "test"
-
-    # bad comment id
-    post :hide_comment, :params => { :id => 999111 }
-    assert_response :not_found
-    assert_equal true, comment.reload.visible
-  end
-
-  ##
-  # test hide comment succes
-  def test_hide_comment_success
-    comment = create(:changeset_comment)
-    assert_equal true, comment.visible
-
-    basic_authorization create(:moderator_user).email, "test"
-
-    post :hide_comment, :params => { :id => comment.id }
-    assert_response :success
-    assert_equal false, comment.reload.visible
-  end
-
-  ##
-  # test unhide comment fail
-  def test_unhide_comment_fail
-    # unauthorized
-    comment = create(:changeset_comment, :visible => false)
-    assert_equal false, comment.visible
-
-    post :unhide_comment, :params => { :id => comment.id }
-    assert_response :unauthorized
-    assert_equal false, comment.reload.visible
-
-    basic_authorization create(:user).email, "test"
-
-    # not a moderator
-    post :unhide_comment, :params => { :id => comment.id }
-    assert_response :forbidden
-    assert_equal false, comment.reload.visible
-
-    basic_authorization create(:moderator_user).email, "test"
-
-    # bad comment id
-    post :unhide_comment, :params => { :id => 999111 }
-    assert_response :not_found
-    assert_equal false, comment.reload.visible
-  end
-
-  ##
-  # test unhide comment succes
-  def test_unhide_comment_success
-    comment = create(:changeset_comment, :visible => false)
-    assert_equal false, comment.visible
-
-    basic_authorization create(:moderator_user).email, "test"
-
-    post :unhide_comment, :params => { :id => comment.id }
-    assert_response :success
-    assert_equal true, comment.reload.visible
-  end
-
-  ##
-  # test comments feed
-  def test_comments_feed
-    changeset = create(:changeset, :closed)
-    create_list(:changeset_comment, 3, :changeset => changeset)
-
-    get :comments_feed, :params => { :format => "rss" }
-    assert_response :success
-    assert_equal "application/rss+xml", @response.content_type
-    assert_select "rss", :count => 1 do
-      assert_select "channel", :count => 1 do
-        assert_select "item", :count => 3
-      end
-    end
-
-    get :comments_feed, :params => { :format => "rss", :limit => 2 }
-    assert_response :success
-    assert_equal "application/rss+xml", @response.content_type
-    assert_select "rss", :count => 1 do
-      assert_select "channel", :count => 1 do
-        assert_select "item", :count => 2
-      end
-    end
-
-    get :comments_feed, :params => { :id => changeset.id, :format => "rss" }
-    assert_response :success
-    assert_equal "application/rss+xml", @response.content_type
-    assert_select "rss", :count => 1 do
-      assert_select "channel", :count => 1 do
-        assert_select "item", :count => 3
-      end
-    end
-  end
-
-  ##
-  # test comments feed
-  def test_comments_feed_bad_limit
-    get :comments_feed, :params => { :format => "rss", :limit => 0 }
-    assert_response :bad_request
-
-    get :comments_feed, :params => { :format => "rss", :limit => 100001 }
-    assert_response :bad_request
-  end
-
   private
 
   ##
index 3f6e25ea6ae0c16a9e59d70f4e756b85f6b2f56b..1a14351824129c64d56eee1785927d78eca6e813 100644 (file)
@@ -1,5 +1,4 @@
 require "test_helper"
-require "geocoder_controller"
 
 class GeocoderControllerTest < ActionController::TestCase
   ##
index e2123f7250ee42afc9a0bbbf19dbfa1a47216c9f..0bf57c3102c7b9f982fc1d4dbf3cce4243516416 100644 (file)
@@ -1,5 +1,4 @@
 require "test_helper"
-require "redactions_controller"
 
 class RedactionsControllerTest < ActionController::TestCase
   ##
index 4196dea154d242cd675150748907f0f3c9786c30..fb232b81b4396ef4bc3f6ae0aef27f10980d34f9 100644 (file)
@@ -1,5 +1,4 @@
 require "test_helper"
-require "osm"
 
 class RedactionTest < ActiveSupport::TestCase
   def test_cannot_redact_current