]> git.openstreetmap.org Git - rails.git/commitdiff
Merge pull request #4574 from urbalazs/wiki-prefixes-240313
authorAndy Allan <git@gravitystorm.co.uk>
Wed, 20 Mar 2024 15:45:10 +0000 (15:45 +0000)
committerGitHub <noreply@github.com>
Wed, 20 Mar 2024 15:45:10 +0000 (15:45 +0000)
Add more wiki prefixes

159 files changed:
Gemfile.lock
app/abilities/ability.rb
app/abilities/api_ability.rb
app/abilities/api_capability.rb
app/assets/images/microsoft.svg
app/controllers/browse_controller.rb
app/controllers/nodes_controller.rb [new file with mode: 0644]
app/controllers/old_nodes_controller.rb
app/controllers/old_relations_controller.rb
app/controllers/old_ways_controller.rb
app/controllers/relations_controller.rb [new file with mode: 0644]
app/controllers/ways_controller.rb [new file with mode: 0644]
app/helpers/browse_helper.rb
app/helpers/changesets_helper.rb
app/helpers/geocoder_helper.rb
app/helpers/user_helper.rb
app/mailers/user_mailer.rb
app/views/browse/_containing_relation.html.erb
app/views/browse/_node.html.erb
app/views/browse/_relation.html.erb
app/views/browse/_relation_member.html.erb
app/views/browse/_version_actions.erb
app/views/browse/_way.html.erb
app/views/browse/feature.html.erb
app/views/browse/history.html.erb
app/views/changesets/_heading.html.erb
app/views/changesets/show.html.erb
app/views/dashboards/_contact.html.erb
app/views/dashboards/_popup.html.erb
app/views/issues/_comments.html.erb
app/views/issues/_reports.html.erb
app/views/issues/index.html.erb
app/views/issues/show.html.erb
app/views/messages/_message_summary.html.erb
app/views/messages/_sent_message_summary.html.erb
app/views/messages/inbox.html.erb
app/views/messages/new.html.erb
app/views/messages/outbox.html.erb
app/views/messages/show.html.erb
app/views/sessions/new.html.erb
app/views/traces/_description.html.erb
app/views/traces/_trace.html.erb
app/views/traces/edit.html.erb
app/views/traces/georss.rss.builder
app/views/traces/show.html.erb
app/views/user_blocks/_block.html.erb
app/views/user_blocks/blocks_by.html.erb
app/views/user_blocks/blocks_on.html.erb
app/views/user_blocks/edit.html.erb
app/views/user_blocks/new.html.erb
app/views/user_blocks/revoke.html.erb
app/views/user_blocks/revoke_all.html.erb
app/views/user_blocks/show.html.erb
app/views/users/blocked.html.erb
config/locales/af.yml
config/locales/ar.yml
config/locales/ast.yml
config/locales/az.yml
config/locales/be-Tarask.yml
config/locales/be.yml
config/locales/bg.yml
config/locales/bn.yml
config/locales/br.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/ce.yml
config/locales/cs.yml
config/locales/cy.yml
config/locales/da.yml
config/locales/de.yml
config/locales/dsb.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/fur.yml
config/locales/fy.yml
config/locales/ga.yml
config/locales/gd.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hr.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/id.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/kab.yml
config/locales/kk-cyrl.yml
config/locales/kn.yml
config/locales/ko.yml
config/locales/ku-Latn.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/mo.yml
config/locales/mr.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nl.yml
config/locales/nn.yml
config/locales/nqo.yml
config/locales/oc.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/pnb.yml
config/locales/pt-PT.yml
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sc.yml
config/locales/scn.yml
config/locales/sco.yml
config/locales/sh.yml
config/locales/sk.yml
config/locales/skr-arab.yml
config/locales/sl.yml
config/locales/sr-Latn.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/te.yml
config/locales/th.yml
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/routes.rb
test/application_system_test_case.rb
test/controllers/browse_controller_test.rb
test/controllers/changesets_controller_test.rb
test/controllers/diary_entries_controller_test.rb
test/controllers/friendships_controller_test.rb
test/controllers/messages_controller_test.rb
test/controllers/nodes_controller_test.rb [new file with mode: 0644]
test/controllers/notes_controller_test.rb
test/controllers/oauth_clients_controller_test.rb
test/controllers/old_nodes_controller_test.rb
test/controllers/old_relations_controller_test.rb
test/controllers/old_ways_controller_test.rb
test/controllers/relations_controller_test.rb [new file with mode: 0644]
test/controllers/site_controller_test.rb
test/controllers/traces_controller_test.rb
test/controllers/user_blocks_controller_test.rb
test/controllers/user_roles_controller_test.rb
test/controllers/users_controller_test.rb
test/controllers/ways_controller_test.rb [new file with mode: 0644]
test/helpers/user_helper_test.rb
test/mailers/user_mailer_test.rb

index b8d62ae734e4970654043101c3f24c621dbaf6ec..958f4579b529a8ae1c723987f26ac1c38fcecc39 100644 (file)
@@ -65,7 +65,7 @@ GEM
       activemodel (= 7.1.3.2)
       activesupport (= 7.1.3.2)
       timeout (>= 0.4.0)
-    activerecord-import (1.5.1)
+    activerecord-import (1.6.0)
       activerecord (>= 4.2)
     activestorage (7.1.3.2)
       actionpack (= 7.1.3.2)
@@ -95,16 +95,16 @@ GEM
     autoprefixer-rails (10.4.16.0)
       execjs (~> 2)
     aws-eventstream (1.3.0)
-    aws-partitions (1.896.0)
-    aws-sdk-core (3.191.3)
+    aws-partitions (1.899.0)
+    aws-sdk-core (3.191.4)
       aws-eventstream (~> 1, >= 1.3.0)
       aws-partitions (~> 1, >= 1.651.0)
       aws-sigv4 (~> 1.8)
       jmespath (~> 1, >= 1.6.1)
-    aws-sdk-kms (1.77.0)
+    aws-sdk-kms (1.78.0)
       aws-sdk-core (~> 3, >= 3.191.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.143.0)
+    aws-sdk-s3 (1.146.0)
       aws-sdk-core (~> 3, >= 3.191.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.8)
@@ -115,14 +115,14 @@ GEM
       erubi (>= 1.0.0)
       rack (>= 0.9.0)
       rouge (>= 1.0.0)
-    better_html (2.0.2)
+    better_html (2.1.1)
       actionview (>= 6.0)
       activesupport (>= 6.0)
       ast (~> 2.0)
       erubi (~> 1.4)
       parser (>= 2.4)
       smart_properties
-    bigdecimal (3.1.6)
+    bigdecimal (3.1.7)
     binding_of_caller (1.0.1)
       debug_inspector (>= 1.2.0)
     bootsnap (1.18.3)
@@ -153,7 +153,7 @@ GEM
       regexp_parser (>= 1.5, < 3.0)
       xpath (~> 3.2)
     concurrent-ruby (1.2.3)
-    config (5.3.0)
+    config (5.4.0)
       deep_merge (~> 1.2, >= 1.2.1)
     connection_pool (2.4.1)
     crack (1.0.0)
@@ -239,8 +239,8 @@ GEM
     faraday-net_http (3.1.0)
       net-http
     ffi (1.16.3)
-    ffi-compiler (1.0.1)
-      ffi (>= 1.0.0)
+    ffi-compiler (1.3.2)
+      ffi (>= 1.15.5)
       rake
     ffi-libarchive (1.1.14)
       ffi (~> 1.0)
@@ -331,7 +331,7 @@ GEM
     mini_portile2 (2.8.5)
     mini_racer (0.8.0)
       libv8-node (~> 18.16.0.0)
-    minitest (5.22.2)
+    minitest (5.22.3)
     minitest-focus (1.4.0)
       minitest (>= 4, < 6)
     msgpack (1.7.2)
@@ -350,7 +350,7 @@ GEM
     net-smtp (0.4.0.1)
       net-protocol
     nio4r (2.7.0)
-    nokogiri (1.16.2)
+    nokogiri (1.16.3)
       mini_portile2 (~> 2.8.2)
       racc (~> 1.4)
     oauth (0.4.7)
@@ -456,7 +456,7 @@ GEM
     rails-html-sanitizer (1.6.0)
       loofah (~> 2.21)
       nokogiri (~> 1.14)
-    rails-i18n (7.0.8)
+    rails-i18n (7.0.9)
       i18n (>= 0.7, < 2)
       railties (>= 6.0.0, < 8)
     railties (7.1.3.2)
@@ -482,7 +482,7 @@ GEM
     rexml (3.2.6)
     rinku (2.0.6)
     rotp (6.3.0)
-    rouge (4.2.0)
+    rouge (4.2.1)
     rtlcss (0.2.1)
       mini_racer (>= 0.6.3)
     rubocop (1.62.1)
index ef4c0a778dc487dcadf7a5b014340599869d2c7d..b43cc6b29af238e3cd54328282de367b0a9ea6b1 100644 (file)
@@ -4,10 +4,9 @@ class Ability
   include CanCan::Ability
 
   def initialize(user)
-    can [:relation, :relation_history, :way, :way_history, :node, :node_history, :query], :browse
-    can [:show], OldNode
-    can [:show], OldWay
-    can [:show], OldRelation
+    can :query, :browse
+    can :show, [Node, Way, Relation]
+    can [:index, :show], [OldNode, OldWay, OldRelation]
     can [:show, :new], Note
     can :search, :direction
     can [:index, :permalink, :edit, :help, :fixthemap, :offline, :export, :about, :communities, :preview, :copyright, :key, :id], :site
index 8ee280b3a116d2f464c9114b1c65f47b45d50d39..e20b849d11d96991f494be946776cd9ede66987b 100644 (file)
@@ -29,20 +29,14 @@ class ApiAbility
         if user.terms_agreed?
           can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset
           can :create, ChangesetComment
-          can [:create, :update, :delete], Node
-          can [:create, :update, :delete], Way
-          can [:create, :update, :delete], Relation
+          can [:create, :update, :delete], [Node, Way, Relation]
         end
 
         if user.moderator?
           can [:destroy, :restore], ChangesetComment
           can :destroy, Note
 
-          if user.terms_agreed?
-            can :redact, OldNode
-            can :redact, OldWay
-            can :redact, OldRelation
-          end
+          can :redact, [OldNode, OldWay, OldRelation] if user.terms_agreed?
         end
       end
     end
index 95d7ab9ab92d2145b90f11373a69416aacc9f959..f27dd2e63a515d0a0bf51571b6a49d6a5032c954 100644 (file)
@@ -23,19 +23,13 @@ class ApiCapability
         if user.terms_agreed?
           can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset if scope?(token, :write_api)
           can :create, ChangesetComment if scope?(token, :write_api)
-          can [:create, :update, :delete], Node if scope?(token, :write_api)
-          can [:create, :update, :delete], Way if scope?(token, :write_api)
-          can [:create, :update, :delete], Relation if scope?(token, :write_api)
+          can [:create, :update, :delete], [Node, Way, Relation] if scope?(token, :write_api)
         end
 
         if user.moderator?
           can [:destroy, :restore], ChangesetComment if scope?(token, :write_api)
           can :destroy, Note if scope?(token, :write_notes)
-          if user&.terms_agreed?
-            can :redact, OldNode if scope?(token, :write_api) || scope?(token, :write_redactions)
-            can :redact, OldWay if scope?(token, :write_api) || scope?(token, :write_redactions)
-            can :redact, OldRelation if scope?(token, :write_api) || scope?(token, :write_redactions)
-          end
+          can :redact, [OldNode, OldWay, OldRelation] if user&.terms_agreed? && (scope?(token, :write_api) || scope?(token, :write_redactions))
         end
       end
     end
index fdc0cbd76383cb999464247d3ce78ca2a3d8b22a..1f739764834586f6940428a24b87510d29425deb 100644 (file)
@@ -1 +1 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 36 36"><defs><style>.a{fill:#575352;}.b{fill:#f25022;}.c{fill:#7fba00;}.d{fill:#00a4ef;}.e{fill:#ffb900;}</style></defs><rect class="a" width="36" height="36"/><rect class="b" x="4" y="3.99" width="13.31" height="13.31"/><rect class="c" x="18.69" y="3.99" width="13.31" height="13.31"/><rect class="d" x="4" y="18.69" width="13.31" height="13.3"/><rect class="e" x="18.69" y="18.69" width="13.31" height="13.3"/></svg>
\ No newline at end of file
+<svg xmlns="http://www.w3.org/2000/svg" width="21" height="21" viewBox="0 0 21 21"><title>MS-SymbolLockup</title><rect x="1" y="1" width="9" height="9" fill="#f25022"/><rect x="1" y="11" width="9" height="9" fill="#00a4ef"/><rect x="11" y="1" width="9" height="9" fill="#7fba00"/><rect x="11" y="11" width="9" height="9" fill="#ffb900"/></svg>
\ No newline at end of file
index db291f6eb89a8fc5900cd8c4da953f987473c55e..a3e65a1b7bec4f2352ce11c5e72a144977dd8903 100644 (file)
@@ -6,63 +6,8 @@ class BrowseController < ApplicationController
   before_action -> { check_database_readable(:need_api => true) }
   before_action :require_oauth
   before_action :update_totp, :only => [:query]
-  before_action :require_moderator_for_unredacted_history, :only => [:relation_history, :way_history, :node_history]
   around_action :web_timeout
   authorize_resource :class => false
 
-  def relation
-    @type = "relation"
-    @feature = Relation.preload(:relation_tags, :containing_relation_members, :changeset => [:changeset_tags, :user], :relation_members => :member).find(params[:id])
-    render "feature"
-  rescue ActiveRecord::RecordNotFound
-    render :action => "not_found", :status => :not_found
-  end
-
-  def relation_history
-    @type = "relation"
-    @feature = Relation.preload(:relation_tags, :old_relations => [:old_tags, { :changeset => [:changeset_tags, :user], :old_members => :member }]).find(params[:id])
-    render "history"
-  rescue ActiveRecord::RecordNotFound
-    render :action => "not_found", :status => :not_found
-  end
-
-  def way
-    @type = "way"
-    @feature = Way.preload(:way_tags, :containing_relation_members, :changeset => [:changeset_tags, :user], :nodes => [:node_tags, { :ways => :way_tags }]).find(params[:id])
-    render "feature"
-  rescue ActiveRecord::RecordNotFound
-    render :action => "not_found", :status => :not_found
-  end
-
-  def way_history
-    @type = "way"
-    @feature = Way.preload(:way_tags, :old_ways => [:old_tags, { :changeset => [:changeset_tags, :user], :old_nodes => { :node => [:node_tags, :ways] } }]).find(params[:id])
-    render "history"
-  rescue ActiveRecord::RecordNotFound
-    render :action => "not_found", :status => :not_found
-  end
-
-  def node
-    @type = "node"
-    @feature = Node.preload(:node_tags, :containing_relation_members, :changeset => [:changeset_tags, :user], :ways => :way_tags).find(params[:id])
-    render "feature"
-  rescue ActiveRecord::RecordNotFound
-    render :action => "not_found", :status => :not_found
-  end
-
-  def node_history
-    @type = "node"
-    @feature = Node.preload(:node_tags, :old_nodes => [:old_tags, { :changeset => [:changeset_tags, :user] }]).find(params[:id])
-    render "history"
-  rescue ActiveRecord::RecordNotFound
-    render :action => "not_found", :status => :not_found
-  end
-
   def query; end
-
-  private
-
-  def require_moderator_for_unredacted_history
-    deny_access(nil) if params[:show_redactions] && !current_user&.moderator?
-  end
 end
diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb
new file mode 100644 (file)
index 0000000..a05fa8c
--- /dev/null
@@ -0,0 +1,20 @@
+class NodesController < ApplicationController
+  layout :map_layout
+
+  before_action :authorize_web
+  before_action :set_locale
+  before_action -> { check_database_readable(:need_api => true) }
+  before_action :require_oauth
+
+  authorize_resource
+
+  around_action :web_timeout
+
+  def show
+    @type = "node"
+    @feature = Node.preload(:node_tags, :containing_relation_members, :changeset => [:changeset_tags, :user], :ways => :way_tags).find(params[:id])
+    render "browse/feature"
+  rescue ActiveRecord::RecordNotFound
+    render "browse/not_found", :status => :not_found
+  end
+end
index 9ef2ef881671550281858e5d8d967760646eb456..596b579673649c4bcd806c628dd8a8218a8344ed 100644 (file)
@@ -11,6 +11,14 @@ class OldNodesController < ApplicationController
   before_action :require_moderator_for_unredacted_history
   around_action :web_timeout
 
+  def index
+    @type = "node"
+    @feature = Node.preload(:node_tags, :old_nodes => [:old_tags, { :changeset => [:changeset_tags, :user] }]).find(params[:id])
+    render "browse/history"
+  rescue ActiveRecord::RecordNotFound
+    render "browse/not_found", :status => :not_found
+  end
+
   def show
     @type = "node"
     @feature = OldNode.preload(:old_tags, :changeset => [:changeset_tags, :user]).find([params[:id], params[:version]])
index b9e151a4fd8b9cc702bf753bc700efcb60528afc..d57cf25fe070dc3d3a278650ede0c2d049c67e89 100644 (file)
@@ -11,6 +11,14 @@ class OldRelationsController < ApplicationController
   before_action :require_moderator_for_unredacted_history
   around_action :web_timeout
 
+  def index
+    @type = "relation"
+    @feature = Relation.preload(:relation_tags, :old_relations => [:old_tags, { :changeset => [:changeset_tags, :user], :old_members => :member }]).find(params[:id])
+    render "browse/history"
+  rescue ActiveRecord::RecordNotFound
+    render "browse/not_found", :status => :not_found
+  end
+
   def show
     @type = "relation"
     @feature = OldRelation.preload(:old_tags, :changeset => [:changeset_tags, :user], :old_members => :member).find([params[:id], params[:version]])
index dd3c3279fd41fa54928bbe13362da0e7468e2055..de60de317fde2ed5c89e5e6d675b51e545d69ebe 100644 (file)
@@ -11,6 +11,14 @@ class OldWaysController < ApplicationController
   before_action :require_moderator_for_unredacted_history
   around_action :web_timeout
 
+  def index
+    @type = "way"
+    @feature = Way.preload(:way_tags, :old_ways => [:old_tags, { :changeset => [:changeset_tags, :user], :old_nodes => { :node => [:node_tags, :ways] } }]).find(params[:id])
+    render "browse/history"
+  rescue ActiveRecord::RecordNotFound
+    render "browse/not_found", :status => :not_found
+  end
+
   def show
     @type = "way"
     @feature = OldWay.preload(:old_tags, :changeset => [:changeset_tags, :user], :old_nodes => { :node => [:node_tags, :ways] }).find([params[:id], params[:version]])
diff --git a/app/controllers/relations_controller.rb b/app/controllers/relations_controller.rb
new file mode 100644 (file)
index 0000000..8aeefd6
--- /dev/null
@@ -0,0 +1,20 @@
+class RelationsController < ApplicationController
+  layout :map_layout
+
+  before_action :authorize_web
+  before_action :set_locale
+  before_action -> { check_database_readable(:need_api => true) }
+  before_action :require_oauth
+
+  authorize_resource
+
+  around_action :web_timeout
+
+  def show
+    @type = "relation"
+    @feature = Relation.preload(:relation_tags, :containing_relation_members, :changeset => [:changeset_tags, :user], :relation_members => :member).find(params[:id])
+    render "browse/feature"
+  rescue ActiveRecord::RecordNotFound
+    render "browse/not_found", :status => :not_found
+  end
+end
diff --git a/app/controllers/ways_controller.rb b/app/controllers/ways_controller.rb
new file mode 100644 (file)
index 0000000..d4abe2d
--- /dev/null
@@ -0,0 +1,20 @@
+class WaysController < ApplicationController
+  layout :map_layout
+
+  before_action :authorize_web
+  before_action :set_locale
+  before_action -> { check_database_readable(:need_api => true) }
+  before_action :require_oauth
+
+  authorize_resource
+
+  around_action :web_timeout
+
+  def show
+    @type = "way"
+    @feature = Way.preload(:way_tags, :containing_relation_members, :changeset => [:changeset_tags, :user], :nodes => [:node_tags, { :ways => :way_tags }]).find(params[:id])
+    render "browse/feature"
+  rescue ActiveRecord::RecordNotFound
+    render "browse/not_found", :status => :not_found
+  end
+end
index 53e980fdceb8d090a22378fea2f3815e6954421a..d3e8f10f900174119adf34a9b023774fe734c4dc 100644 (file)
@@ -1,6 +1,6 @@
 module BrowseHelper
-  def element_single_current_link(type, object, url)
-    link_to url, { :class => element_class(type, object), :title => element_title(object), :rel => (link_follow(object) if type == "node") } do
+  def element_single_current_link(type, object)
+    link_to object, { :class => element_class(type, object), :title => element_title(object), :rel => (link_follow(object) if type == "node") } do
       element_strikethrough object do
         printable_element_name object
       end
index dbee08c507f175e691fffae849b45b357f3515f7..9705221607cddd6a9180b1533d59d61579fcec7f 100644 (file)
@@ -3,7 +3,7 @@ module ChangesetsHelper
     if changeset.user.status == "deleted"
       t("users.no_such_user.deleted")
     elsif changeset.user.data_public?
-      link_to(changeset.user.display_name, user_path(changeset.user))
+      link_to changeset.user.display_name, changeset.user
     else
       t("browse.anonymous")
     end
index f819c1ac5ca665607218f671512988a7d7466b12..882f2c8354eb73e2415371b54a8871d0b1359386 100644 (file)
@@ -3,7 +3,7 @@ module GeocoderHelper
     html_options = { :class => "set_position stretched-link", :data => {} }
 
     url = if result[:type] && result[:id]
-            url_for(:controller => :browse, :action => result[:type], :id => result[:id])
+            url_for(:controller => result[:type].pluralize, :action => :show, :id => result[:id])
           elsif result[:min_lon] && result[:min_lat] && result[:max_lon] && result[:max_lat]
             "/?bbox=#{result[:min_lon]},#{result[:min_lat]},#{result[:max_lon]},#{result[:max_lat]}"
           else
index 3554980b84fc37fa53e7f23f797c2a401f364455..e1ab423a1e4b567b57f6a83c4e5ff072ed6d0d8d 100644 (file)
@@ -58,7 +58,10 @@ module UserHelper
 
   def auth_button(name, provider, options = {})
     link_to(
-      image_tag("#{name}.svg", :alt => t("sessions.new.auth_providers.#{name}.alt"), :class => "rounded-3"),
+      image_tag("#{name}.svg",
+                :alt => t("sessions.new.auth_providers.#{name}.alt"),
+                :class => "rounded-3",
+                :size => "36"),
       auth_path(options.merge(:provider => provider)),
       :method => :post,
       :class => "auth_button",
index 33abc66f9102f7fcf5a62c299d34a8ce5a019f24..86e77703b697569f021e281e575349c8595753b2 100644 (file)
@@ -177,7 +177,7 @@ class UserMailer < ApplicationMailer
       @changeset_comment = comment.changeset.tags["comment"].presence
       @time = comment.created_at
       @changeset_author = comment.changeset.user.display_name
-      @unsubscribe_url = changeset_unsubscribe_url(comment.changeset)
+      @unsubscribe_url = unsubscribe_changeset_url(comment.changeset)
       @author = @commenter
 
       subject = if @owner
@@ -193,7 +193,7 @@ class UserMailer < ApplicationMailer
       set_list_headers(
         "#{comment.changeset.id}.changeset.www.openstreetmap.org",
         t(".description", :id => comment.changeset.id),
-        :subscribe => changeset_subscribe_url(comment.changeset),
+        :subscribe => subscribe_changeset_url(comment.changeset),
         :unsubscribe => @unsubscribe_url,
         :archive => @changeset_url
       )
index 2547ff7aa6a7cbcae116c43300b68bfc3c30c045..febb3e129fcbdd4575a80cc4d024cab458415b42 100644 (file)
@@ -1,4 +1,4 @@
-<li><%= linked_name = link_to printable_element_name(containing_relation.relation), :action => "relation", :id => containing_relation.relation.id.to_s
+<li><%= linked_name = link_to printable_element_name(containing_relation.relation), containing_relation.relation
         if containing_relation.member_role.blank?
           t ".entry_html", :relation_name => linked_name
         else
index e395a4283832c99054de1f2829f37ed025795218..4e2ae0343d2e57f5ba7a460b5701892ed0d923b3 100644 (file)
@@ -17,7 +17,7 @@
           <summary><%= t "browse.part_of_ways", :count => node.ways.uniq.count %></summary>
           <ul class="list-unstyled">
             <% node.ways.uniq.each do |way| %>
-              <li><%= element_single_current_link "way", way, way_path(way) %></li>
+              <li><%= element_single_current_link "way", way %></li>
             <% end %>
           </ul>
         </details>
index 922e642cc76b18f2942f1b1eb9387256b35baf3f..a987fe4d8e179bdedd701197e80e1a8c22a45302 100644 (file)
@@ -15,7 +15,7 @@
       <details <%= "open" if relation.containing_relation_members.count < 10 %>>
         <summary><%= t "browse.part_of_relations", :count => relation.containing_relation_members.uniq.count %></summary>
         <ul class="list-unstyled">
-          <%= render :partial => "containing_relation", :collection => relation.containing_relation_members.uniq %>
+          <%= render :partial => "browse/containing_relation", :collection => relation.containing_relation_members.uniq %>
         </ul>
       </details>
     <% end %>
index 16842f56922c97d9bd03f25ee6aa0a3936ffb283..d122f0edfed8f327f2c81893a317cbfb588073d8 100644 (file)
@@ -1,4 +1,4 @@
-<% linked_name = link_to printable_element_name(relation_member.member), { :controller => :browse, :action => relation_member.member_type.downcase, :id => relation_member.member_id.to_s }, { :rel => link_follow(relation_member.member) }
+<% linked_name = link_to printable_element_name(relation_member.member), relation_member.member, { :rel => link_follow(relation_member.member) }
    type_str = t ".type.#{relation_member.member_type.downcase}" %>
 <%= element_list_item relation_member.member_type.downcase, relation_member.member do %>
   <%= if relation_member.member_role.blank?
index 3d4e4be13ea8acf3d8de8577828ce8b463af1f43..94e18e45777bb27e950f573b7d86039634fe0b4a 100644 (file)
@@ -1,5 +1,5 @@
 <div class='secondary-actions'>
-  <%= link_to t("browse.view_details"), :controller => :browse, :action => @type %>
+  <%= link_to t("browse.view_details"), :controller => @type.pluralize, :action => :show %>
   <% if !@feature.redacted? %>
     &middot;
     <%= link_to t("browse.download_xml"), :controller => "api/old_#{@type.pluralize}", :action => :show %>
@@ -21,7 +21,7 @@
     <% end %>
     &middot;
   <% end %>
-  <%= link_to t("browse.view_history"), :controller => :browse, :action => "#{@type}_history" %>
+  <%= link_to t("browse.view_history"), :action => :index %>
   <% unless @feature.latest_version? %>
     &middot;
     <%= link_to({ :version => @feature.version + 1 }, { :class => "icon-link" }) do %>
index d93321a0fab98f3b14a93cbf23d3f9267d7076fa..d015438fe998568ae45c1a454ff63f8e6ef0b2d7 100644 (file)
@@ -15,7 +15,7 @@
       <details <%= "open" if way.containing_relation_members.count < 10 %>>
         <summary><%= t "browse.part_of_relations", :count => way.containing_relation_members.uniq.count %></summary>
         <ul class="list-unstyled">
-          <%= render :partial => "containing_relation", :collection => way.containing_relation_members.uniq %>
+          <%= render :partial => "browse/containing_relation", :collection => way.containing_relation_members.uniq %>
         </ul>
       </details>
     <% end %>
         <ul class="list-unstyled">
           <% way.way_nodes.each do |wn| %>
             <li>
-              <%= element_single_current_link "node", wn.node, node_path(wn.node) %>
+              <%= element_single_current_link "node", wn.node %>
               <% related_ways = wn.node.ways.reject { |w| w.id == wn.way_id } %>
               <% if related_ways.size > 0 then %>
                 (<%= t ".also_part_of_html",
                        :count => related_ways.size,
-                       :related_ways => to_sentence(related_ways.map { |w| element_single_current_link "way", w, way_path(w) }) %>)
+                       :related_ways => to_sentence(related_ways.map { |w| element_single_current_link "way", w }) %>)
               <% end %>
             </li>
           <% end %>
index 9ee9f807fb1899f395b2bd0fd9529209bd6ee050..29f911f799302c703aafd6d66a90116032177d18 100644 (file)
@@ -2,7 +2,7 @@
 
 <%= render "sidebar_header", :title => t("browse.#{@type}.title_html", :name => printable_element_name(@feature)) %>
 
-<%= render :partial => @type, :object => @feature %>
+<%= render :partial => "browse/#{@type}", :object => @feature %>
 
 <% if @feature.visible? %>
   <div class='secondary-actions'>
     <% end %>
     &middot;
   <% end %>
-    <%= link_to t("browse.view_history"), :action => "#{@type}_history" %>
+    <%= link_to t("browse.view_history"), :controller => "old_#{@type.pluralize}" %>
   <% if current_user&.moderator? %>
     &middot;
-    <%= link_to(t("browse.view_unredacted_history"), :action => "#{@type}_history", :params => { :show_redactions => true }) %>
+    <%= link_to(t("browse.view_unredacted_history"), :controller => "old_#{@type.pluralize}", :params => { :show_redactions => true }) %>
   <% end %>
   <% if @feature.version > 1 %>
     &middot;
index b557c339b172a9eb5e1c66f5df9e0b961f3f859f..1595df0216d129772d953d07c5a5923d85f32fa8 100644 (file)
@@ -2,17 +2,17 @@
 
 <%= render "sidebar_header", :title => t("browse.#{@type}.history_title_html", :name => printable_element_name(@feature)) %>
 
-<%= render :partial => @type, :collection => @feature.send(:"old_#{@type}s").reverse %>
+<%= render :partial => "browse/#{@type}", :collection => @feature.send(:"old_#{@type}s").reverse %>
 
 <div class='secondary-actions'>
-  <%= link_to(t("browse.download_xml"), :controller => "api/old_#{@type.pluralize}", :action => "history") %>
+  <%= link_to t("browse.download_xml"), :controller => "api/old_#{@type.pluralize}", :action => "history" %>
   &middot;
-  <%= link_to(t("browse.view_details"), :action => @type) %>
+  <%= link_to t("browse.view_details"), :controller => @type.pluralize, :action => :show %>
   <% if params[:show_redactions] %>
     &middot;
-    <%= link_to(t("browse.view_history"), :action => "#{@type}_history") %>
+    <%= link_to t("browse.view_history") %>
   <% elsif current_user&.moderator? %>
     &middot;
-    <%= link_to(t("browse.view_unredacted_history"), :action => "#{@type}_history", :params => { :show_redactions => true }) %>
+    <%= link_to t("browse.view_unredacted_history"), :params => { :show_redactions => true } %>
   <% end %>
 </div>
index 33bc7169693e17ac894a0ef67ba059e7eee62868..a125a135a5ff34c315f47cde4e4f0781492ee771 100644 (file)
@@ -5,11 +5,11 @@
       <%= user_thumbnail changeset.user %>
     </div>
     <div class="col">
-      <h2><%= link_to title, changeset_path(changeset) %></h2>
+      <h2><%= link_to title, changeset %></h2>
     </div>
   </div>
 
   <small class='text-muted'>
-    <%= t(".created_by_html", :link_user => link_to(changeset.user.display_name, user_path(changeset.user)), :created => l(changeset.created_at, :format => :blog)) %>
+    <%= t(".created_by_html", :link_user => link_to(changeset.user.display_name, changeset.user), :created => l(changeset.created_at, :format => :blog)) %>
   </small>
 </div>
index fdaf7654ceeb6180bd71abd9c6ff951634f71c7c..3ba3968f704b20626496e189676fec7e9e831994 100644 (file)
@@ -34,7 +34,7 @@
           <small class='text-muted'>
             <%= t comment.visible ? ".comment_by_html" : ".hidden_comment_by_html",
                   :time_ago => friendly_date_ago(comment.created_at),
-                  :user => link_to(comment.author.display_name, user_path(comment.author)) %>
+                  :user => link_to(comment.author.display_name, comment.author) %>
             <% if current_user&.moderator? %>
               —
               <%= tag.button t("javascripts.changesets.show.#{comment.visible ? 'hide' : 'unhide'}_comment"),
 <% if @next_by_user || @prev_by_user %>
   <div class='secondary-actions'>
     <% if @prev_by_user %>
-      <%= link_to({ :id => @prev_by_user.id }, :class => "icon-link") do %>
+      <%= link_to @prev_by_user, :class => "icon-link" do %>
         <%= previous_page_svg_tag :height => 11 %>
         <%= @prev_by_user.id %>
       <% end %>
         link_to tag.bdi(user), :controller => "changesets", :action => "index", :display_name => user %>
     <% if @next_by_user %>
       &middot;
-      <%= link_to({ :id => @next_by_user.id }, :class => "icon-link") do %>
+      <%= link_to @next_by_user, :class => "icon-link" do %>
         <%= @next_by_user.id %>
         <%= next_page_svg_tag :height => 11 %>
       <% end %>
index b789f721bc828eec29bbc7fc7da2303b6b6eb753..b28a28a26770ead4a7ffd029bcab072d8bf63a5e 100644 (file)
@@ -10,7 +10,7 @@
   </div>
   <div class="col">
     <p class='text-muted mb-0'>
-      <%= link_to contact.display_name, user_path(contact) %>
+      <%= link_to contact.display_name, contact %>
       <% if @user.home_location? and contact.home_location? %>
         <% distance = @user.distance(contact) %>
         <% if distance < 1 %>
@@ -25,7 +25,7 @@
       <% if changeset %>
         <%= t(".latest_edit_html", :ago => friendly_date_ago(changeset.created_at)) %>
         <% comment = changeset.tags["comment"].to_s == "" ? t("browse.no_comment") : changeset.tags["comment"] %>
-        <q><%= link_to comment, changeset_path(changeset), :title => t("changesets.changeset.view_changeset_details") %></q>
+        <q><%= link_to comment, changeset, :title => t("changesets.changeset.view_changeset_details") %></q>
       <% else %>
        <%= t "changesets.changeset.no_edits" %>
       <% end %>
index c4f8b627a153d7ab4fc854518e2d67e64cbea2cd..de90a117b236fc90de1490c0ba435a6cfb0b0ab9 100644 (file)
@@ -4,6 +4,6 @@
   </div>
   <div class="col mx-1">
     <p><%= t(".#{type}") %></p>
-    <p><%= link_to popup.display_name, user_path(popup) %></p>
+    <p><%= link_to popup.display_name, popup %></p>
   </div>
 </div>
index 7776d9ee398a89077a3899b1bbe9a79d83ece820..9200b4cec6246b8feebcc7dbaab1eee77fe19a43 100644 (file)
@@ -2,11 +2,11 @@
   <% comments.each do |comment| %>
     <div class="row">
       <div class="col-auto">
-        <%= link_to user_thumbnail(comment.user), user_path(comment.user) %>
+        <%= link_to user_thumbnail(comment.user), comment.user %>
       </div>
       <div class="col">
         <p class="text-muted">
-          <%= t ".comment_from_html", :user_link => link_to(comment.user.display_name, user_path(comment.user)),
+          <%= t ".comment_from_html", :user_link => link_to(comment.user.display_name, comment.user),
                                       :comment_created_at => tag.time(l(comment.created_at.to_datetime, :format => :friendly),
                                                                       :datetime => comment.created_at.xmlschema) %>
         </p>
index 9ef28f1c29007c06664aed58894350b90fcc0081..2d1b78800688bcb17d024b1d603c83fed890dd36 100644 (file)
@@ -1,12 +1,12 @@
 <% reports.each do |report| %>
   <div class="row">
     <div class="col-auto">
-      <%= link_to user_thumbnail(report.user), user_path(report.user) %>
+      <%= link_to user_thumbnail(report.user), report.user %>
     </div>
     <div class="col">
       <p class="text-muted">
         <%= t ".reported_by_html", :category => report.category,
-                                   :user => link_to(report.user.display_name, user_path(report.user)),
+                                   :user => link_to(report.user.display_name, report.user),
                                    :updated_at => tag.time(l(report.updated_at.to_datetime, :format => :friendly),
                                                            :datetime => report.updated_at.xmlschema) %>
       </p>
index 12ddf2b32a162f6e77c909eb4458dbd9a771571f..523f90846a1a35a4e459dddce6a445c72fca0ad9 100644 (file)
           <td><%= t ".states.#{issue.status}" %></td>
           <td class="text-nowrap"><%= link_to t(".reports_count", :count => issue.reports_count), issue %></td>
           <td><%= link_to reportable_title(issue.reportable), reportable_url(issue.reportable) %></td>
-          <td><%= link_to issue.reported_user.display_name, user_path(issue.reported_user) if issue.reported_user %></td>
+          <td><%= link_to issue.reported_user.display_name, issue.reported_user if issue.reported_user %></td>
           <td>
             <% if issue.user_updated %>
-              <%= t ".last_updated_time_ago_user_html", :user => link_to(issue.user_updated.display_name, user_path(issue.user_updated)),
+              <%= t ".last_updated_time_ago_user_html", :user => link_to(issue.user_updated.display_name, issue.user_updated),
                                                         :time_ago => friendly_date_ago(issue.updated_at) %>
             <% else %>
               <%= friendly_date_ago(issue.updated_at) %>
index e2099f8e6878cab075faf7657940676d408bfb42..8b5f7f42d222d8f6903e199cbce64b2ddeeb7ddb 100644 (file)
@@ -21,7 +21,7 @@
       | <%= t ".last_updated_at_html",
               :datetime => tag.time(l(@issue.updated_at.to_datetime, :format => :friendly),
                                     :datetime => @issue.updated_at.xmlschema),
-              :displayname => link_to(@issue.user_updated.display_name, user_path(@issue.user_updated)) %>
+              :displayname => link_to(@issue.user_updated.display_name, @issue.user_updated) %>
     <% end %>
   </small>
 </p>
index 4a552e83e05479a7d6df58d9cd0f23311c3742ef..8ac09251cd5ebdda43304266ee968beacb9e93fc 100644 (file)
@@ -1,6 +1,6 @@
 <tr id="inbox-<%= message_summary.id %>" class="inbox-row<%= "-unread" unless message_summary.message_read? %>">
-  <td><%= link_to message_summary.sender.display_name, user_path(message_summary.sender) %></td>
-  <td><%= link_to message_summary.title, message_path(message_summary) %></td>
+  <td><%= link_to message_summary.sender.display_name, message_summary.sender %></td>
+  <td><%= link_to message_summary.title, message_summary %></td>
   <td class="text-nowrap"><%= l message_summary.sent_on, :format => :friendly %></td>
   <td class="text-nowrap d-flex justify-content-end gap-1">
     <%= button_to t(".unread_button"), message_mark_path(message_summary, :mark => "unread"), :remote => true, :class => "btn btn-sm btn-primary", :form => { :class => "inbox-mark-unread", :hidden => !message_summary.message_read? } %>
index 24caba5ab0a495d1b74d6255b5983602cb9ed3e8..d869fd3cb1fb9b951d9e09619c2d571756519a30 100644 (file)
@@ -1,6 +1,6 @@
 <tr class="inbox-row">
-  <td><%= link_to sent_message_summary.recipient.display_name, user_path(sent_message_summary.recipient) %></td>
-  <td><%= link_to sent_message_summary.title, message_path(sent_message_summary) %></td>
+  <td><%= link_to sent_message_summary.recipient.display_name, sent_message_summary.recipient %></td>
+  <td><%= link_to sent_message_summary.title, sent_message_summary %></td>
   <td class="text-nowrap"><%= l sent_message_summary.sent_on, :format => :friendly %></td>
   <td class="text-nowrap d-flex justify-content-end gap-1">
     <%= button_to t(".destroy_button"), message_path(sent_message_summary, :referer => request.fullpath), :method => :delete, :remote => true, :class => "btn btn-sm btn-danger", :form_class => "inbox-destroy" %>
index 4d6be787b93fa5866404c8fc5721afe505382a12..611b0b1c972e02272fbedecbd84fc5683cf368aa 100644 (file)
@@ -9,5 +9,5 @@
 <% if current_user.messages.size > 0 %>
   <%= render :partial => "messages_table", :locals => { :columns => %w[from subject date], :messages => current_user.messages, :inner_partial => "message_summary" } %>
 <% else %>
-  <div><%= t(".no_messages_yet_html", :people_mapping_nearby_link => link_to(t(".people_mapping_nearby"), user_path(current_user))) %></div>
+  <div><%= t(".no_messages_yet_html", :people_mapping_nearby_link => link_to(t(".people_mapping_nearby"), dashboard_path)) %></div>
 <% end %>
index 7c91722ff1b37045457ea689f3875d90d128956f..2838a5dab1c93ca9ba866e9451f049e0e7ca5eab 100644 (file)
@@ -1,5 +1,5 @@
 <% content_for :heading do %>
-  <h1><%= t(".send_message_to_html", :name => link_to(@message.recipient.display_name, user_path(@message.recipient))) %></h1>
+  <h1><%= t(".send_message_to_html", :name => link_to(@message.recipient.display_name, @message.recipient)) %></h1>
 <% end %>
 
 <%= bootstrap_form_for @message do |f| %>
index 65fbaf3261c818aa79613e6b6a3c6b546b69a9b3..096427e8d4534ab507135169cefb77461a647a7b 100644 (file)
@@ -9,5 +9,5 @@
 <% if current_user.sent_messages.size > 0 %>
   <%= render :partial => "messages_table", :locals => { :columns => %w[to subject date], :messages => current_user.sent_messages, :inner_partial => "sent_message_summary" } %>
 <% else %>
-  <div class="messages"><%= t(".no_sent_messages_html", :people_mapping_nearby_link => link_to(t(".people_mapping_nearby"), user_path(current_user))) %></div>
+  <div class="messages"><%= t(".no_sent_messages_html", :people_mapping_nearby_link => link_to(t(".people_mapping_nearby"), dashboard_path)) %></div>
 <% end %>
index f0742280f76e410cc5ebcdc8ab9c9830d7b5e32b..29bf02cd8d137ca4901bfc611e6d8665b8500010 100644 (file)
@@ -5,10 +5,10 @@
 <div class='mb-3 border-bottom border-grey py-1 d-flex gap-1 flex-wrap'>
   <% if current_user == @message.recipient %>
     <%= user_thumbnail_tiny @message.sender %>
-    <%= link_to @message.sender.display_name, user_path(@message.sender) %>
+    <%= link_to @message.sender.display_name, @message.sender %>
   <% else %>
     <%= user_thumbnail_tiny @message.recipient %>
-    <%= link_to @message.recipient.display_name, user_path(@message.recipient) %>
+    <%= link_to @message.recipient.display_name, @message.recipient %>
   <% end %>
   <span class="ms-auto">
     <%= l @message.sent_on, :format => :friendly %>
index f15430efa554627f3b9a9dcf708818a40b6ee656..ffaad054af63f4b89f731415627b08a35e4ad03a 100644 (file)
       <label class="form-label"><%= t ".with external" %></label>
 
       <ul class='list-inline' id="login_auth_buttons">
-        <li class="list-inline-item me-3"><%= link_to image_tag("openid.png", :alt => t(".auth_providers.openid.title")), "#", :id => "openid_open_url", :title => t(".auth_providers.openid.title") %></li>
+        <li class="list-inline-item me-3">
+          <%= link_to image_tag("openid.png",
+                                :alt => t(".auth_providers.openid.title"),
+                                :size => "36"),
+                      "#",
+                      :id => "openid_open_url",
+                      :title => t(".auth_providers.openid.title") %>
+        </li>
+
         <% %w[google facebook microsoft github wikipedia].each do |provider| %>
           <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
             <li class="list-inline-item me-3"><%= auth_button provider, provider %></li>
index f4edc0e215c248c9a66a325163d4861fed5efe04..5fea819da26db58997e5756b6fc6030971e89bec 100644 (file)
@@ -1,4 +1,4 @@
-<%= image_tag(url_for(:controller => :traces, :action => :icon, :id => description.id, :display_name => description.user.display_name)) %>
+<%= image_tag trace_icon_path(description.user, description.id) %>
 <% if description.size -%>
 <%= t ".description_with_count", :count => description.size, :user => description.user.display_name %>
 <% else -%>
index 9ee58cf22122beff7633c1f02bd71c73f5c67e73..f72671e37adb9c6afb95be72e85b9a77922d8b5d 100644 (file)
@@ -2,7 +2,7 @@
   <td>
     <% if Settings.status != "gpx_offline" %>
       <% if trace.inserted %>
-        <a href="<%= url_for :controller => "traces", :action => "show", :id => trace.id, :display_name => trace.user.display_name %>"><img src="<%= url_for :controller => "traces", :action => "icon", :id => trace.id, :display_name => trace.user.display_name %>" border="0" alt="" /></a>
+        <%= link_to image_tag(trace_icon_path(trace.user, trace), :alt => ""), show_trace_path(trace.user, trace) %>
       <% else %>
         <span class="text-danger"><%= t ".pending" %></span>
       <% end %>
@@ -11,7 +11,7 @@
   <td>
     <ul class="list-inline mb-0">
       <li class="list-inline-item">
-        <%= link_to trace.name, :controller => "traces", :action => "show", :display_name => trace.user.display_name, :id => trace.id %>
+        <%= link_to trace.name, show_trace_path(trace.user, trace) %>
       </li>
 
       <% if trace.inserted? %>
@@ -30,7 +30,7 @@
     </ul>
     <p class="text-muted mb-0">
       <%= friendly_date_ago(trace.timestamp) %>
-      <%= t ".by" %> <%= link_to trace.user.display_name, user_path(trace.user) %>
+      <%= t ".by" %> <%= link_to trace.user.display_name, trace.user %>
       <% if !trace.tags.empty? %>
         <%= t ".in" %>
         <%= safe_join(trace.tags.collect { |tag| link_to_tag tag.tag }, ", ") %>
       <nav class="secondary-actions">
         <ul>
           <li>
-            <%= link_to t(".view_map"), { :controller => "site", :action => "index", :mlat => trace.latitude, :mlon => trace.longitude, :anchor => "map=14/#{trace.latitude}/#{trace.longitude}" } %>
+            <%= link_to t(".view_map"), root_path(:mlat => trace.latitude, :mlon => trace.longitude, :anchor => "map=14/#{trace.latitude}/#{trace.longitude}") %>
           </li>
           <li>
-            <%= link_to t(".edit_map"), { :controller => "site", :action => "edit", :gpx => trace.id } %>
+            <%= link_to t(".edit_map"), edit_path(:gpx => trace.id) %>
           </li>
         </ul>
       </nav>
index 09fe9c510515c0eae9aa3650a5edb1ebdf2f8280..809112d4b177bcf4397820f108cf2d6d1c26f02b 100644 (file)
@@ -2,7 +2,7 @@
   <h1><%= t ".heading", :name => @trace.name %></h1>
 <% end %>
 
-<img src="<%= url_for :controller => "traces", :action => "picture", :id => @trace.id, :display_name => @trace.user.display_name %>">
+<%= image_tag trace_picture_path(@trace.user, @trace) %>
 
 <%= bootstrap_form_for @trace do |f| %>
   <%= f.text_field :name, :disabled => true %>
index 36641fec0b4e2f14c8f7191f0be3f084655840de..924ffb9357257631c1213ea138691c9e7a57b7be 100644 (file)
@@ -21,8 +21,8 @@ xml.rss("version" => "2.0",
       xml.item do
         xml.title trace.name
 
-        xml.link url_for(:controller => :traces, :action => :show, :id => trace.id, :display_name => trace.user.display_name, :only_path => false)
-        xml.guid url_for(:controller => :traces, :action => :show, :id => trace.id, :display_name => trace.user.display_name, :only_path => false)
+        xml.link show_trace_url(trace.user, trace)
+        xml.guid show_trace_url(trace.user, trace)
 
         xml.description do
           xml.cdata! render(:partial => "description", :object => trace, :formats => [:html])
index 69f58b5b8e73c08cd91874b74ea4baa0fd7a83ec..def928da57bc56d604bbc759f92ee1c64ce42284 100644 (file)
@@ -4,7 +4,7 @@
 
 <% if Settings.status != "gpx_offline" %>
   <% if @trace.inserted %>
-    <img src="<%= url_for :controller => "traces", :action => "picture", :id => @trace.id, :display_name => @trace.user.display_name %>">
+    <%= image_tag trace_picture_path(@trace.user, @trace) %>
   <% else %>
     <span class="text-danger"><%= t ".pending" %></span>
   <% end %>
               :latitude => tag.span(number_with_delimiter(@trace.latitude), :class => "latitude"),
               :longitude => tag.span(number_with_delimiter(@trace.longitude), :class => "longitude") %>
       </div>
-      (<%= link_to t(".map"), :controller => "site", :action => "index", :mlat => @trace.latitude, :mlon => @trace.longitude, :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %> / <%= link_to t(".edit"), :controller => "site", :action => "edit", :gpx => @trace.id, :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %>)</td>
+      (<%= link_to t(".map"), root_path(:mlat => @trace.latitude, :mlon => @trace.longitude, :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}") %> / <%= link_to t(".edit"), edit_path(:gpx => @trace.id, :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}") %>)</td>
   </tr>
   <% end %>
   <tr>
     <th><%= t ".owner" %></th>
-    <td><%= link_to @trace.user.display_name, user_path(@trace.user) %></td>
+    <td><%= link_to @trace.user.display_name, @trace.user %></td>
   </tr>
   <tr>
     <th><%= t ".description" %></th>
@@ -63,6 +63,6 @@
     <% if current_user == @trace.user %>
       <%= link_to t(".edit_trace"), edit_trace_path(@trace), :class => "btn btn-outline-primary" %>
     <% end %>
-    <%= link_to t(".delete_trace"), { :controller => "traces", :action => "destroy", :id => @trace.id }, { :method => :delete, :class => "btn btn-outline-danger", :data => { :confirm => t(".confirm_delete") } } %>
+    <%= link_to t(".delete_trace"), @trace, { :method => :delete, :class => "btn btn-outline-danger", :data => { :confirm => t(".confirm_delete") } } %>
   </div>
 <% end %>
index f39efb571ecc477b044fe5e7f829f99ca793b2e7..50fe74e4cdf4616776bdea979c5008097cd15842 100644 (file)
@@ -1,9 +1,9 @@
 <tr>
   <% if show_user_name %>
-  <td><%= link_to block.user.display_name, user_path(block.user) %></td>
+  <td><%= link_to block.user.display_name, block.user %></td>
   <% end %>
   <% if show_creator_name %>
-  <td><%= link_to block.creator.display_name, user_path(block.creator) %></td>
+  <td><%= link_to block.creator.display_name, block.creator %></td>
   <% end %>
   <td><%= h truncate(block.reason) %></td>
   <td><%= h block_status(block) %></td>
@@ -11,7 +11,7 @@
     <% if block.revoker_id.nil? %>
       <%= t(".not_revoked") %>
     <% else %>
-      <%= link_to block.revoker.display_name, user_path(block.revoker) %>
+      <%= link_to block.revoker.display_name, block.revoker %>
     <% end %>
   </td>
   <td><%= link_to t(".show"), block %></td>
index d5283925bf9e61a1b788103875a78d07b2326936..87ff7f5b23a73a5c294aa587b907180783ea84a0 100644 (file)
@@ -1,6 +1,6 @@
 <% @title = t(".title", :name => @user.display_name) %>
 <% content_for :heading do %>
-  <h1><%= t(".heading_html", :name => link_to(@user.display_name, user_path(@user))) %></h1>
+  <h1><%= t(".heading_html", :name => link_to(@user.display_name, @user)) %></h1>
 <% end %>
 
 <% unless @user_blocks.empty? %>
index 7d1f83ce357e533edee42e529b6c27d8c172d0b6..ed03342dc73deed0014fc4516dd0df4baf28721f 100644 (file)
@@ -1,6 +1,6 @@
 <% @title = t(".title", :name => @user.display_name) %>
 <% content_for :heading do %>
-  <h1><%= t(".heading_html", :name => link_to(@user.display_name, user_path(@user))) %></h1>
+  <h1><%= t(".heading_html", :name => link_to(@user.display_name, @user)) %></h1>
 <% end %>
 
 <% unless @user_blocks.empty? %>
index db7c5e057f360d5c80ceab91cdbfee6e4fe86589..a5b165e9ad790e5c8b918b471a775ebf4091d0cf 100644 (file)
@@ -1,8 +1,6 @@
 <% @title = t ".title", :name => @user_block.user.display_name %>
 <% content_for :heading do %>
-  <h1><%= t(".heading_html",
-            :name => link_to(@user_block.user.display_name,
-                             user_path(@user_block.user))) %></h1>
+  <h1><%= t(".heading_html", :name => link_to(@user_block.user.display_name, @user_block.user)) %></h1>
   <nav class='secondary-actions'>
     <ul class='clearfix'>
       <li><%= link_to t(".show"), @user_block %></li>
index c390134ba3db8482127f0c0a34a085a147e39aeb..3de6aa539ec86d48964524437641f1ca86b5f07f 100644 (file)
@@ -1,8 +1,6 @@
 <% @title = t ".title", :name => @user.display_name %>
 <% content_for :heading do %>
-  <h1><%= t(".heading_html",
-            :name => link_to(@user.display_name,
-                             user_path(@user))) %></h1>
+  <h1><%= t(".heading_html", :name => link_to(@user.display_name, @user)) %></h1>
 <% end %>
 <%= bootstrap_form_for(@user_block) do |f| %>
   <%= hidden_field_tag "display_name", @user.display_name, :autocomplete => "off" %>
index eb1cc4cbebb4e9414043f828b753f03577ba25f8..6bf87c4c3cce00a12c11df92e4650e4416431a11 100644 (file)
@@ -4,10 +4,8 @@
 
 <% content_for :heading do %>
   <h1><%= t(".heading_html",
-            :block_on => link_to(@user_block.user.display_name,
-                                 user_path(@user_block.user)),
-            :block_by => link_to(@user_block.creator.display_name,
-                                 user_path(@user_block.creator))) %></h1>
+            :block_on => link_to(@user_block.user.display_name, @user_block.user),
+            :block_by => link_to(@user_block.creator.display_name, @user_block.creator)) %></h1>
 <% end %>
 
 <% if @user_block.ends_at > Time.now %>
index 7fef69b57fabddf64f3bf19f92529a7f0bf93532..75a425d706ce96444c5eb220f858aefd11316cc8 100644 (file)
@@ -1,10 +1,7 @@
-<% @title = t ".title",
-              :block_on => @user.display_name %>
+<% @title = t ".title", :block_on => @user.display_name %>
 
 <% content_for :heading do %>
-  <h1><%= t ".heading_html",
-            :block_on => link_to(@user.display_name,
-                                 user_path(@user)) %></h1>
+  <h1><%= t ".heading_html", :block_on => link_to(@user.display_name, @user) %></h1>
 <% end %>
 
 <% unless @user.blocks.active.empty? %>
index 03bcd30364d414e0d28e74d5626646e56c542823..94ea53b6446f983b38eab921c0d2af37a7727d18 100644 (file)
@@ -4,10 +4,8 @@
 
 <% content_for :heading do %>
   <h1><%= t(".heading_html",
-            :block_on => link_to(@user_block.user.display_name,
-                                 user_path(@user_block.user)),
-            :block_by => link_to(@user_block.creator.display_name,
-                                 user_path(@user_block.creator))) %></h1>
+            :block_on => link_to(@user_block.user.display_name, @user_block.user),
+            :block_by => link_to(@user_block.creator.display_name, @user_block.creator)) %></h1>
   <nav class='secondary-actions'>
     <ul class='clearfix'>
       <% if @user_block.ends_at > Time.now.getutc %>
@@ -26,7 +24,7 @@
 <dl class="row">
   <% if @user_block.revoker %>
     <dt class="col-sm-3"><%= t ".revoker" %></dt>
-    <dd class="col-sm-9"><%= link_to @user_block.revoker.display_name, user_path(@user_block.revoker) %></dd>
+    <dd class="col-sm-9"><%= link_to @user_block.revoker.display_name, @user_block.revoker %></dd>
   <% end %>
 
   <dt class="col-sm-3"><%= t ".created" %></dt>
index d2b2f6d3b40daeb0bc4c95ab185a012d6dd4b1d8..f1239bc1ec5d9b54ec9badd4f22cea85f4f3644c 100644 (file)
@@ -3,10 +3,9 @@
   <div class='header-illustration new-user-main'>
     <h1><%= t "users.new.title" %></h1>
   </div>
-  <div class='header-illustration new-user-arm'></div>
 <% end %>
 
-<div class="message">
-  <h1><%= t "users.new.no_auto_account_create" %></h1>
-  <h2><%= t "users.new.please_contact_support_html", :support_link => mail_to(Settings.support_email, t("users.new.support")) %></h2>
+<div class="mx-auto my-0">
+  <p><strong><%= t "users.new.no_auto_account_create" %></strong></p>
+  <p><%= t "users.new.please_contact_support_html", :support_link => mail_to(Settings.support_email, t("users.new.support")) %></p>
 </div>
index f6374862e1c7d76be811a047af0b83758954558a..f262620c6b69c570745cb45f5fc42c5f7c836a79 100644 (file)
@@ -1397,7 +1397,6 @@ af:
       daarvan is gratis en val onder 'n oop-lisensie.
     intro_2_create_account: Skep 'n gebruikerrekening
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: vennote
     tou: Gebruiksvoorwaardes
     osm_offline: Die OpenStreetMap-databasis is tans vanlyn terwyl noodsaaklike onderhoud
index 6c5334204634b2e79ce566b94ea9effea1336b75..fee1b0ac4f37a813a04f1bf2162b51c525552788 100644 (file)
@@ -1573,11 +1573,7 @@ ar:
     intro_text: خريطة الشارع المفتوحة هي خريطة العالم، أُنشِئت بواسطة أشخاص مثلك وحرة
       الاستخدام برخصة مفتوحة.
     intro_2_create_account: أنشئ حساب مستخدم
-    hosting_partners_html: يتم دعم الاستضافة بواسطة %{ucl} و%{fastly} و%{bytemark}
-      و%{partners} آخرين.
-    partners_ucl: UCL
     partners_fastly: بسرعة
-    partners_bytemark: استضافة Bytemark
     partners_partners: الشركاء
     tou: شروط الاستخدام
     osm_offline: حاليًا قاعدة بيانات خريطة الشارع المفتوحة مغلقة بينما يتم الانتهاء
index 08144489c2223ff623f87f708aecab5ffcc3f0f9..5dbc9e106bea37b418fa4e3bf5712f1f5ac61241 100644 (file)
@@ -1225,10 +1225,6 @@ ast:
     intro_text: OpenStreetMap ye un mapa del mundu, creáu por persones como tu y d'usu
       llibre baxo una llicencia abierta.
     intro_2_create_account: Crear una cuenta d'usuariu
-    hosting_partners_html: L'agospiamientu tien l'encontu de %{ucl}, %{bytemark},  y
-      otros %{partners}.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: asociaos
     tou: Condiciones d'usu
     osm_offline: La base de datos d'OpenStreetMap anguaño ta desconectada mentanto
index 53cbf4a7759bcc681b58d3c2ddfcd9c49d7a09f0..70ffe03744c9fe242677d6862e7c3eec1c96c0fe 100644 (file)
@@ -804,7 +804,6 @@ az:
     edit_with: '%{editor} köməyi ilə dəyişdir'
     tag_line: Azad Viki Dünya Xəritəsi
     intro_2_create_account: İstifadəçi hesabı yarat
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnyorlar
     help: Kömək
     copyright: Müəllif hüquqları və Lisenziyalar
index a99fc301f0ee0ab5ea24c59db4e315fcc2861c8f..a631ad62561bb9b3b3fb5d695f38b49644267996 100644 (file)
@@ -899,7 +899,6 @@ be-Tarask:
     edit_with: Рэдагаваць праз %{editor}
     tag_line: Вольная Wiki-мапа сьвету
     intro_2_create_account: Стварыце рахунак
-    partners_ucl: UCL
     osm_offline: База зьвестак OpenStreetMap у цяперашні момант недаступная, таму
       што праводзяцца неабходныя тэхнічныя работы.
     osm_read_only: База зьвестак OpenStreetMap у цяперашні момант даступная толькі
index 34f89167207b57cc17b6cc3ac025c171a96f0a68..10d3e0fc2b87a13382440d92239eabc792786e81 100644 (file)
@@ -284,6 +284,28 @@ be:
         title: Выдаліць мой уліковы запіс
         warning: Увага! Працэс выдалення ўліковага запісу з'яўляецца канчатковым і
           не можа быць зменены.
+        delete_account: Выдаліць уліковы запіс
+        delete_introduction: 'Вы можаце выдаліць свой уліковы запіс OpenStreetMap
+          з дапамогай кнопкі ніжэй. Звярніце ўвагу на наступныя дэталі:'
+        delete_profile: Інфармацыя вашага ўліковага запісу, разам з вашым аватарам,
+          апісаннем і месцазнаходжаннем дома, будзе выдалена.
+        delete_display_name: Назва вашага ўліковага запісу будзе выдалена і можа быць
+          паўторна выкарыстана іншымі ўліковымі запісамі.
+        retain_caveats: 'Аднак некаторая інфармацыя пра вас будзе захоўвацца на OpenStreetMap
+          нават пасля выдалення вашага ўліковага запісу:'
+        retain_edits: Вашыя змены ў базе даных карты, калі такія маюцца, будуць захаваныя.
+        retain_traces: Вашыя трасіроўкі, калі такія маюцца, будуць захаваны.
+        retain_diary_entries: Вашыя запісы і каментарыі ў дзённіку, калі такія маюцца,
+          будуць захаваныя, але схаваныя ад назірання.
+        retain_notes: Вашы нататкі на карце і каментарыі да іх, калі такія маюцца,
+          будуць захаваныя, але схаваныя ад назірання.
+        retain_changeset_discussions: Вашыя абмеркаванні зменаў, калі такія маюцца,
+          будуць захаваныя.
+        retain_email: Ваш адрас электроннай пошты будзе захаваны.
+        recent_editing_html: Вы нядаўна рэдагавалі ваш уліковы запіс, таму зараз яго
+          нельга выдаліць. Выдаленне будзе магчымае праз %{time}.
+        confirm_delete: Вы ўпэўненыя?
+        cancel: Скасаваць
   accounts:
     edit:
       title: Рэдагаваць уліковы запіс
@@ -300,7 +322,7 @@ be:
           ананімныя.
         disabled link text: чаму я не магу рэдагаваць?
       contributor terms:
-        heading: 'Умовы ўдзелу:'
+        heading: Умовы ўдзелу
         agreed: Вы пагадзіліся на новыя ўмовы ўдзелу.
         not yet agreed: Вы яшчэ не пагадзіліся на новыя ўмовы ўдзелу.
         review link text: Калі ласка, прайдзіце па гэтай спасылцы для Вашай зручнасці,
@@ -309,22 +331,31 @@ be:
           ў агульнай уласнасці.
         link text: што гэта?
       save changes button: Запісаць змены
+      delete_account: Выдаліць уліковы запіс...
     go_public:
-      heading: 'Публічнае рэдагаванне:'
+      heading: Публічнае рэдагаванне
       make_edits_public_button: Зрабіць усе мае змены публічнымі
     update:
       success_confirm_needed: Звесткі аб карыстальніку паспяхова абноўленыя. Праверце
         сваю эл.пошту, вам павінен прыйсці запыт на пацвярджэнне вашага новага адраса.
       success: Звесткі аб карыстальніку паспяхова абноўленыя.
+    destroy:
+      success: Уліковы запіс выдалены.
   browse:
+    deleted_ago_by_html: Выдалена %{time_ago} карыстальнікам %{user}
+    edited_ago_by_html: Адрэдагавана %{time_ago} карыстальнікам %{user}
     version: Версія
+    redacted_version: Адрэдагаваная версія
     in_changeset: Пакет правак
     anonymous: ананімны
     no_comment: (без каментароў)
     part_of: Частка
     download_xml: Спампаваць XML
     view_history: Прагляд гісторыі
+    view_unredacted_history: Прагляд неадрэдагаванай гісторыі
     view_details: Прагляд звестак
+    view_redacted_data: Прагляд адрэдагаваных даных
+    view_redaction_message: Прагляд паведамлення аб рэдагаванні
     location: 'Месца:'
     node:
       title_html: 'Пункт: %{name}'
@@ -350,6 +381,7 @@ be:
       entry_html: Дачыненне %{relation_name}
       entry_role_html: Дачыненне %{relation_name} (як %{relation_role})
     not_found:
+      title: Не знойдзена
       sorry: Прабачце, %{type} з нумарам %{id} не знойдзены.
       type:
         node: пункт
@@ -358,6 +390,7 @@ be:
         changeset: пакет правак
         note: заўвага
     timeout:
+      title: Памылка
       sorry: Прабачце, атрыманне даных для %{type} з ідэнтыфікатарам %{id} заняла
         зашмат часу.
       type:
@@ -389,6 +422,7 @@ be:
       wikimedia_commons_link: '%{page} ў Вікісховішчы'
       telephone_link: Патэлефанаваць %{phone_number}
       colour_preview: Прагляд колеру %{colour_value}
+      email_link: Электронная пошта %{email}
     query:
       title: Пошук аб’ектаў
       introduction: Націсніце на карце, каб атрымаць звесткі пра аб’екты паблізу.
@@ -412,6 +446,7 @@ be:
     index:
       title: Пакет правак
       title_user: Пакет правак ад %{user}
+      title_user_link_html: Змены ад %{user_link}
       title_friend: Пакеты правак ад вашых сяброў
       title_nearby: Пакеты правак ад карыстальнікаў паблізу
       empty: Пакеты правак не знойдзены.
@@ -427,8 +462,17 @@ be:
         created: Створаны
         closed: Зачынены
         belongs_to: Аўтар
+    subscribe:
+      heading: Падпісацца на наступнае абмеркаванне зменаў?
+      button: Падпісацца на абмеркаванне
+    unsubscribe:
+      heading: Скасаваць падпіску на наступнае абмеркаванне зменаў?
+      button: Адпісацца ад абмеркавання
+    heading:
+      title: Набор змен %{id}
     show:
       title: 'Набор змен: %{id}'
+      created: 'Створана: %{when}'
       discussion: Абмеркаванне
       join_discussion: Увайдзіце ў сістэму, каб далучыцца да абмеркавання
       still_open: Пакет правак яшчэ адкрыты. Абмеркаванне стане даступным, як толькі
@@ -465,6 +509,8 @@ be:
       nearby mapper: Карыстальнік
       friend: Сябар
     show:
+      title: Мая панэль
+      edit_your_profile: Адрэдагуйце свой профіль
       my friends: Мае сябры
       no friends: Вы пакуль не дадалі нікога ў сябры.
       nearby users: 'Карыстальнікі паблізу:'
@@ -478,7 +524,7 @@ be:
     new:
       title: Новы запіс дзённіку
     form:
-      location: 'Месца:'
+      location: Месца
       use_map_link: карыстацца картай
     index:
       title: Дзённікі карыстальнікаў
@@ -499,6 +545,7 @@ be:
     show:
       title: Дзённік карыстальніка %{user} | %{title}
       user_title: Дзённік карыстальніка %{user}
+      discussion: Абмеркаванне
       leave_a_comment: Пакінуць каментар
       login_to_leave_a_comment_html: '%{login_link} каб пакінуць каментар'
       login: Увайсці
@@ -515,6 +562,7 @@ be:
         one: 1 каментар
         zero: Каментароў няма
         other: 'Каментароў: %{count}'
+      no_comments: Няма каментароў
       edit_link: Правіць гэты запіс
       hide_link: Схаваць гэты запіс
       unhide_link: Паказаць гэты запіс
@@ -541,6 +589,7 @@ be:
         title: Дзеннікавыя запісы OpenStreetMap
         description: Свежыя дзеннікавыя запісы карыстальнікаў OpenStreetMap
     comments:
+      no_comments: Няма каментароў у дзённіку
       post: Апублікаваць
       when: Калі
       comment: Каментар
@@ -1244,9 +1293,6 @@ be:
     intro_text: OpenStreetMap - гэта карта свету, створаная людзьмі, як вы, і бясплатная
       для выкарыстання на ўмовах адкрытай ліцэнзіі.
     intro_2_create_account: Стварыць уліковы запіс удзельніка
-    hosting_partners_html: Хостынг падтрымліваецца %{ucl}, %{bytemark}, і іншымі %{partners}.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: партнёрамi
     tou: Умовы карыстання
     osm_offline: База дадзеных OpenStreetMap зараз па-за сецівам, таму што праходзіць
@@ -1257,6 +1303,7 @@ be:
     help: Даведка
     about: Пра праект
     copyright: Аўтарскае права
+    communities: Супольнасці
     community: Супольнасьць
     community_blogs: Блогі супольнасці
     community_blogs_title: Блогі ўдзельнікаў супольнасці OpenStreetMap
@@ -1267,15 +1314,27 @@ be:
     more: Больш падрабязна
   user_mailer:
     diary_comment_notification:
+      description: 'Запіс у дзённіку OpenStreetMap #%{id}'
       subject: '[OpenStreetMap] %{user} пакінуў каментар у вашым дзённіку'
       hi: Вітанні, %{to_user},
       header: '%{from_user} пракаментаваў ваш запіс у дзённіку на OpenStreetMap з
         тэмай %{subject}:'
+      header_html: '%{from_user} пракаментаваў ваш запіс у дзённіку на OpenStreetMap
+        з тэмай %{subject}:'
       footer: Вы можаце прагледзець каментар на %{readurl} і пракаментаваць на %{commenturl}
         ці адказаць на %{replyurl}
+      footer_html: Вы можаце прагледзець каментар на %{readurl} і пракаментаваць на
+        %{commenturl} ці адказаць на %{replyurl}
+      footer_unsubscribe: Вы можаце адмовіцца ад падпіскі на абмеркаванне праз %{unsubscribeurl}
+      footer_unsubscribe_html: Вы можаце адмовіцца ад падпіскі на абмеркаванне праз
+        %{unsubscribeurl}
     message_notification:
+      subject: '[OpenStreetMap] %{message_title}'
       hi: Прывітанне, %{to_user},
       header: '%{from_user} адправіў вам паведамленне з тэмай %{subject} праз OpenStreetMap:'
+      header_html: '%{from_user} адправіў вам паведамленне з тэмай %{subject} у OpenStreetMap:'
+      footer: Вы можаце таксама прачытаць паведамленне на %{readurl}, і вы можаце
+        адказаць на %{replyurl}
       footer_html: Вы можаце таксама прачытаць паведамленне на %{readurl}, і вы можаце
         адказаць на %{replyurl}
     friendship_notification:
@@ -1284,8 +1343,16 @@ be:
       had_added_you: '%{user} пасябраваў з Вамі на OpenStreetMap.'
       see_their_profile: Вы можаце прагледзець профіль на %{userurl} і дадаць, як
         сябра, у адказ, калі хочаце.
+      see_their_profile_html: Вы можаце прагледзець профіль на %{userurl}.
       befriend_them: Вы таксама можаце пасябраваць з імі на %{befriendurl}.
+      befriend_them_html: Вы таксама можаце дадаць як сябра па спасылцы %{befriendurl}.
+    gpx_description:
+      description_with_tags_html: 'Падобна, што ваш файл GPX %{trace_name} з апісаннем
+        %{trace_description} і наступнымі тэгамі: %{tags}'
+      description_with_no_tags_html: Падобна, што ваш файл GPX %{trace_name} з апісаннем
+        %{trace_description} і без тэгаў
     gpx_failure:
+      hi: Прывітанне, %{to_user},
       failed_to_import: 'збой імпарту. Адбылася памылка:'
       subject: '[OpenStreetMap] Збой імпарту GPX'
     gpx_success:
@@ -1758,6 +1825,13 @@ be:
         para_1: Калі трэба ўнесці дробнае ўдакладненне, дзеля якога не варта марнаваць
           час на рэгістрацыю і вывучэнне правілаў рэдагавання, раім проста дадаць
           заўвагу на карту.
+    communities:
+      title: Супольнасці
+      lede_text: |-
+        Людзі з усяго свету ўносяць свой уклад у OpenStreetMap або выкарыстоўваюць яго.
+        Многія ўдзельнічаюць паасобку, іншыя стварылі свае супольнасці.
+        Супольнасці бываюць розных памераў і могуць прадстаўляць як невялікія гарады, так і цэлыя рэгіёны з некалькімі краінамі.
+        Яны таксама могуць быць афіцыйнымі і неафіцыйнымі.
   traces:
     visibility:
       private: Прыватны (ананімны з неспарадкаванымі пунктамі)
@@ -1780,6 +1854,7 @@ be:
       traces_waiting: У вас %{count} след у чарзе. Калі ласка, пачакайце, пакуль яны
         будуць апрацаваныя, каб не блакірваць чаргу для астатніх карстальнікаў.
     edit:
+      cancel: Скасаваць
       title: Рэдагаванне следу %{name}
       heading: Рэдагаванне следу %{name}
       visibility_help: што гэта значыць?
@@ -1796,6 +1871,7 @@ be:
       uploaded: 'Прысланы:'
       points: 'Пункты:'
       start_coordinates: 'Каардынаты пачатку:'
+      coordinates_html: '%{latitude}; %{longitude}'
       map: карта
       edit: правіць
       owner: 'Уладальнік:'
@@ -1829,9 +1905,13 @@ be:
       in: у
     index:
       public_traces: Агульныя GPS-сляды
+      my_gps_traces: Мае GPS-трэкі
       public_traces_from: Агульныя GPS-сляды карыстальніка %{user}
       description: Агляд нядаўна дададзеных GPS-слядоў
       tagged_with: ' з тэгамі: %{tags}'
+      empty_title: Тут яшчэ нічога няма
+      empty_upload_html: '%{upload_link} або даведайцеся больш пра адсочванне GPS
+        на %{wiki_link}.'
       upload_trace: Адаслаць GPS-след
       my_traces: Мае GPS-сляды
     destroy:
index 4cff01a9b740ca86aa9ae12ed57a2adeb52f0e9c..fc4f86125979a142ecfbc7991c7385be9acabc62 100644 (file)
@@ -1256,10 +1256,6 @@ bg:
     intro_text: OpenStreetMap е карта на света създадена от хора като вас, за свободно
       ползване и под отворен лиценз.
     intro_2_create_account: Създаване на сметка
-    hosting_partners_html: Хостингът се поддържа от %{ucl}, %{fastly}, %{bytemark}
-      и други %{partners}.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark
     partners_partners: партньори
     tou: Условия за ползване
     osm_offline: Базата на данни на  OpenStreetMap в момента е изключена докато се
index ab9b7db6b992d226cd3d2186ea5552e45648ed60..1b7abeeb9f1cd2dc0f60fd4df176ccebd73610da 100644 (file)
@@ -1369,7 +1369,6 @@ bn:
     intro_text: ওপেনস্ট্রিটম্যাপ বিশ্বের একটি মানচিত্র; যা আপনার মতো মানুষের দ্বারা
       নির্মিত এবং এটি মুক্ত লাইসেন্সের অধীনে বিনামূল্যে ব্যবহারযোগ্য।
     intro_2_create_account: একটি ব্যবহারকারী অ্যাকাউন্ট তৈরি করুন
-    partners_ucl: UCL
     partners_partners: সহযোগীগণ
     tou: ব্যবহারের শর্তাবলী
     help: সাহায্য
index d860f1b11e6ba118614a0aac0e079484a935a6aa..747e1f3f886a4b45cbef59ab4b074662be050d35 100644 (file)
@@ -1604,11 +1604,7 @@ br:
     intro_text: Ur gartenn eus ar bed eo OprenStreetMap, krouet gant tud eveldoc'h
       ha frank hec'h implij dindan un aotre-implij digor.
     intro_2_create_account: Krouiñ ur gont implijer
-    hosting_partners_html: Kemeret eo an herberc'hiañ e karg gant %{ucl}, %{fastly},
-      %{bytemark}, ha %{partners} all.
-    partners_ucl: ↓"Universiy College" Londrez
     partners_fastly: Fastly
-    partners_bytemark: ↓Herberc'hiañ Bytemark
     partners_partners: Kevelourien
     tou: Termenoù implijout
     osm_offline: Ezlinenn eo diaz roadennoù OpenStreetMap evit bremañ e-pad ma pleder
index 5e42b99a3d8d7e3333cf058c037775c747d9c753..1e6b9bd012b9030d0aaec6a50ac7078bd73318a8 100644 (file)
@@ -869,8 +869,6 @@ bs:
     intro_text: OpenStreetMap predstavlja mapu svijeta, kreiranu od strane ljudi kao
       što ste vi i može se besplatno koristiti.
     intro_2_create_account: Napravite korisnički račun
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnera
     osm_offline: OpenStreetMap baza podataka je trenutno nedostupna dok se ne završe
       važni radovi na održavanju.
index 63896de195e0dc2d811a9359474f12560ecb8b35..ad1ef5c14377389be78b287a9a1da2bf3c45f590 100644 (file)
@@ -1564,11 +1564,7 @@ ca:
     intro_text: L'OpenStreetMap és un mapa del món creat per persones com tu i d'ús
       lliure sota una llicència oberta.
     intro_2_create_account: Crea un compte d’usuari
-    hosting_partners_html: L'allotjament és a càrrec de %{ucl}, %{fastly}, %{bytemark}
-      i d'altres %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: socis
     tou: Condicions d’ús
     osm_offline: La base de dades OpenStreetMap és fora de línia mentre es fan les
index 45a1707b32ca888fdf30006285370f9844452b33..337f88cd4fda480e757b6bbc26b35134e994a19a 100644 (file)
@@ -712,7 +712,6 @@ ce:
     gps_traces: GPS-трекаш
     gps_traces_tooltip: Болхбе GPS-трекашца
     user_diaries: Декъашхочун дневник
-    partners_ucl: UCL
     help: ГӀо
     about: Проектах лаьцна
     copyright: Авторийн бакъонаш
index ba9b12aabb2a69dd0e4ba0e1b5bf33503635c22a..cd529fae53e6d80ee12616117c6a0717124033de 100644 (file)
@@ -1631,11 +1631,7 @@ cs:
     intro_text: OpenStreetMap je mapa světa, vytvořená lidmi jako vy a volně využitelná
       pod otevřenou licencí.
     intro_2_create_account: Vytvořit uživatelský účet
-    hosting_partners_html: Hosting podporují %{ucl}, %{fastly}, %{bytemark} a další
-      %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partneři
     tou: Podmínky užití
     osm_offline: Databáze OpenStreetMap je momentálně kvůli probíhající neodkladné
index bada4729b083b57dfadac372b04328271920fc47..343f5b8efa5b2b5283064f2f16d1775fb56c51e4 100644 (file)
@@ -1529,11 +1529,7 @@ cy:
     intro_text: Mae OpenStreetMap yn fap o'r byd, wedi'i greu gan bobl fel chi ac
       sydd ar gael i'w ddefnyddio am ddim a dan drwydded rydd.
     intro_2_create_account: Creu cyfrif defnyddiwr
-    hosting_partners_html: Cefnogir y gynhaliaeth gan %{ucl}, %{fastly}, %{bytemark}
-      a %{partners} eraill
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: phartneriaid
     tou: Telerau Gwasanaeth
     osm_offline: Mae cronfa ddata OpenStreetMap all-lein ar hyn o bryd er mwyn gwaith
index b17966ea666b297764d6df6863c3d1056fe05c14..4afd66d779da54dbc75db6c689d2cd6f68694faf 100644 (file)
@@ -26,6 +26,7 @@
 # Author: Kaare
 # Author: Luckas
 # Author: Macofe
+# Author: Mehanika
 # Author: Mikini
 # Author: Mjjzf
 # Author: Nemo bis
@@ -243,8 +244,8 @@ da:
       name: iD
       description: iD (redigér i browseren)
     remote:
-      name: Fjernbetjening
-      description: Fjernbetjening (JOSM, Potlatch eller Merkaartor)
+      name: Eksternt program
+      description: eksternt program (JOSM, Potlatch eller Merkaartor)
   auth:
     providers:
       none: Ingen
@@ -535,8 +536,8 @@ da:
       friend: Ven
     show:
       title: Mit kontrolpanel
-      no_home_location_html: '%{edit_profile_link} og definer hvor du bor for at se
-        brugere i nærheden.'
+      no_home_location_html: '%{edit_profile_link} og angiv din hjemmeposition for
+        at se brugere i nærheden.'
       edit_your_profile: Rediger din profil
       my friends: Mine venner
       no friends: Du har ikke tilføjet nogle venner endnu.
@@ -1593,11 +1594,8 @@ da:
     intro_text: OpenStreetMap er et kort over verden, skabt af folk som dig og gratis
       at bruge under en åben licens.
     intro_2_create_account: Opret en brugerkonto
-    hosting_partners_html: Driften støttes af %{ucl}, %{fastly}, %{bytemark} og andre
-      %{partners}.
-    partners_ucl: University College London
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
+    partners_corpmembers: OSMF virksomhedsmedlemmer
     partners_partners: partnere
     tou: Vilkår for anvendelse
     osm_offline: OpenStreetMap-databasen er for øjeblikket offline på grund af nødvendig
@@ -2200,7 +2198,7 @@ da:
         copyright: Ophavsret tilhører OpenStreetMap og bidragsydere, under en åben
           licens
       remote_failed: Redigering mislykkede - tjek at JOSM eller Merkaartor er startet
-        og fjernbetjening er aktiveret
+        og at ekstern betjening er aktiveret
     edit:
       not_public: Du har ikke angivet af dine ændringer skal være offentlige.
       not_public_description_html: Du kan ikke længere redigere kortet medmindre du
index 044715fba4b241fa6a14bf6d17080bb8f109602e..44a57aea1ae637b5f5f0bef8e74ca59c7d8cd1a7 100644 (file)
@@ -1666,11 +1666,7 @@ de:
     intro_text: OpenStreetMap ist eine Karte der Welt, erstellt von Menschen wie dir
       und frei verwendbar unter einer offenen Lizenz.
     intro_2_create_account: Erstelle ein Benutzerkonto
-    hosting_partners_html: Das Hosting wird von %{ucl}, %{fastly}, %{bytemark} und
-      anderen %{partners} unterstützt.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: Partnern
     tou: Nutzungsbedingungen
     osm_offline: Die OpenStreetMap-Datenbank ist im Moment wegen wichtiger Wartungsarbeiten
index 2102e1a76602d6aeb6109c9dd37cc30f3881ae81..0c60715d4a35e5ca6054308c8e4f2d62748e594f 100644 (file)
@@ -106,7 +106,8 @@ dsb:
         description: Wopisanje
         home_lat: 'Šyrina:'
         home_lon: 'Dlinina:'
-        languages: Rěcy
+        languages: Preferěrowane rěcy
+        preferred_editor: Preferěrowany editor
         pass_crypt: Gronidło
     help:
       trace:
@@ -875,8 +876,6 @@ dsb:
     intro_text: OpenStreetMap jó kórta swěta, napórana wót luźi ako ty a dajo se licho
       pód wótwórjoneju licencu wužywaś.
     intro_2_create_account: Załož wužywarske konto
-    partners_ucl: z UCL VR Centre
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnerow
     osm_offline: Datowa banka OpenStreetMap jo tuchylu offline, dokulaž se wažne źěło
       za wótglědowanje datoweje banki pśewjedujo.
@@ -1075,6 +1074,16 @@ dsb:
       flash token bad: Njejo móžno było ten token namakaś, pšosym pśekontrolěruj URL.
     update:
       flash changed: Twójo gronidło jo se změniło.
+  preferences:
+    show:
+      title: Móje preference
+      preferred_editor: Preferěrowany editor
+      preferred_languages: Preferěrowane rěcy
+      edit_preferences: Preference wobźěłaś
+    edit:
+      title: Preference wobźěłaś
+    update_success_flash:
+      message: Preference su se zaktualizěrowali.
   profiles:
     edit:
       image: 'Wobraz:'
@@ -1510,6 +1519,7 @@ dsb:
       my profile: Mój profil
       my settings: Móje nastajenja
       my comments: Móje komentary
+      my_preferences: Móje preference
       my_dashboard: Mój pśeglědowy bok
       blocks on me: Dostane blokowanja
       blocks by me: Dane blokěrowanja
index 98daf1318713e9472af517e2c680631f09dde1e1..36433b27d9e3a3abc21b481cc61fd40af7fe6864 100644 (file)
@@ -1620,11 +1620,7 @@ el:
     intro_text: Το OpenStreetMap είναι χάρτης του κόσμου, που δημιουργήθηκε από ανθρώπους
       σαν κι εσάς και είναι δωρεάν, υπό άδεια ελεύθερης χρήσης.
     intro_2_create_account: Δημιουργήστε ένα λογαριασμό χρήστη
-    hosting_partners_html: Η φιλοξενία υποστηρίζεται από %{ucl}, %{fastly}, %{bytemark},
-      και άλλους %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: συνεργάτες
     tou: Όροι χρήσης
     osm_offline: Η βάση δεδομένων του OpenStreetMap είναι προσωρινά εκτός λειτουργίας
index 55077fc483f401012faf841b7b27a58d42298108..5c9b4eebe1573c828f9fe9f5681efbd9c906925a 100644 (file)
@@ -1143,8 +1143,6 @@ en-GB:
     intro_text: OpenStreetMap is a map of the world, created by people like you and
       free to use under an open licence.
     intro_2_create_account: Create a user account
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: partners
     osm_offline: The OpenStreetMap database is currently offline while essential database
       maintenance work is carried out.
index 251012d46e2d6766fe4ebd347c4b6e6c838602be..9af2dd5661528f033f9c63e74a65aa27ca7e361a 100644 (file)
@@ -546,7 +546,7 @@ en:
       discussion: "Discussion"
       leave_a_comment: "Leave a comment"
       login_to_leave_a_comment_html: "%{login_link} to leave a comment"
-      login: "Login"
+      login: "Log in"
     no_such_entry:
       title: "No such diary entry"
       heading: "No entry with the id: %{id}"
@@ -1766,14 +1766,14 @@ en:
         one: "%{count} muted message"
         other: "You have %{count} muted messages"
     reply:
-      wrong_user: "You are logged in as `%{user}' but the message you have asked to reply to was not sent to that user. Please login as the correct user in order to reply."
+      wrong_user: "You are logged in as `%{user}' but the message you have asked to reply to was not sent to that user. Please log in as the correct user in order to reply."
     show:
       title: "Read message"
       reply_button: "Reply"
       unread_button: "Mark as unread"
       destroy_button: "Delete"
       back: "Back"
-      wrong_user: "You are logged in as `%{user}' but the message you have asked to read was not sent by or to that user. Please login as the correct user in order to read it."
+      wrong_user: "You are logged in as `%{user}' but the message you have asked to read was not sent by or to that user. Please log in as the correct user in order to read it."
     sent_message_summary:
       destroy_button: "Delete"
     heading:
@@ -1847,44 +1847,44 @@ en:
       failure: Couldn't update profile.
   sessions:
     new:
-      title: "Login"
-      heading: "Login"
+      title: "Log in"
+      heading: "Log in"
       email or username: "Email Address or Username"
       password: "Password"
       openid_html: "%{logo} OpenID"
       remember: "Remember me"
       lost password link: "Lost your password?"
-      login_button: "Login"
+      login_button: "Log in"
       register now: Register now
-      with external: "Alternatively, use a third party to login:"
+      with external: "Alternatively, use a third party to log in:"
       no account: Don't have an account?
       auth failure: "Sorry, could not log in with those details."
       openid_logo_alt: "Log in with an OpenID"
       auth_providers:
         openid:
-          title: Login with OpenID
-          alt: Login with an OpenID URL
+          title: Log in with OpenID
+          alt: Log in with an OpenID URL
         google:
-          title: Login with Google
-          alt: Login with a Google OpenID
+          title: Log in with Google
+          alt: Log in with a Google OpenID
         facebook:
-          title: Login with Facebook
-          alt: Login with a Facebook Account
+          title: Log in with Facebook
+          alt: Log in with a Facebook Account
         microsoft:
-          title: Login with Microsoft
-          alt: Login with a Microsoft Account
+          title: Log in with Microsoft
+          alt: Log in with a Microsoft Account
         github:
-          title: Login with GitHub
-          alt: Login with a GitHub Account
+          title: Log in with GitHub
+          alt: Log in with a GitHub Account
         wikipedia:
-          title: Login with Wikipedia
-          alt: Login with a Wikipedia Account
+          title: Log in with Wikipedia
+          alt: Log in with a Wikipedia Account
         wordpress:
-          title: Login with Wordpress
-          alt: Login with a Wordpress OpenID
+          title: Log in with Wordpress
+          alt: Log in with a Wordpress OpenID
         aol:
-          title: Login with AOL
-          alt: Login with an AOL OpenID
+          title: Log in with AOL
+          alt: Log in with an AOL OpenID
     destroy:
       title: "Logout"
       heading: "Logout from OpenStreetMap"
@@ -2728,7 +2728,7 @@ en:
         paragraph_2: Sign up to get started contributing. We'll send an email to confirm your account.
       display name description: "Your publicly displayed username. You can change this later in the preferences."
       external auth: "Third Party Authentication:"
-      use external auth: "Alternatively, use a third party to login"
+      use external auth: "Alternatively, use a third party to log in"
       auth no password: "With third party authentication a password is not required, but some extra tools or server may still need one."
       continue: Sign Up
       terms accepted: "Thanks for accepting the new contributor terms!"
@@ -2859,7 +2859,7 @@ en:
         If you are new to OpenStreetMap, please create a new account
         using the form below.
       option_2: |
-        If you already have an account, you can login to your account
+        If you already have an account, you can log in to your account
         using your username and password and then associate the account
         with your ID in your user settings.
   user_role:
index d9b285ba5048f4c5ef539f9a3e6fc873f308c917..803883150108bac9e861a2784854ff39a1918bf2 100644 (file)
@@ -1605,11 +1605,10 @@ eo:
     intro_text: OpenStreetMap estas mapo de la mondo, kreata de homoj kiel vi, kaj
       libere uzebla laŭ malferma permesilo.
     intro_2_create_account: Krei konton
-    hosting_partners_html: Retgastigo estas subtenata de %{ucl}, %{fastly}, %{bytemark}
+    hosting_partners_2024_html: Retgastigo estas provizata de %{fastly}, %{corpmembers}
       kaj aliaj %{partners}.
-    partners_ucl: University College London
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
+    partners_corpmembers: firmaaj anoj de OSMF
     partners_partners: kunlaborantoj
     tou: Uzkondiĉoj
     osm_offline: La OpenStreetMap-datumbazo estas nuntempe nealireabla pro necesaj
index 5479e94a9ec026d12d005b1c35a9685ac3b8ea09..6fac40d2b8a9af33655dad3b9bf54388ef4a95fb 100644 (file)
@@ -27,6 +27,7 @@
 # Author: Dgstranz
 # Author: Egofer
 # Author: Ejegg
+# Author: Eulalio
 # Author: Fitoschido
 # Author: Fortega
 # Author: Francodiaz7
@@ -1693,11 +1694,10 @@ es:
     intro_text: OpenStreetMap es un mapa del mundo, creado por gente como tú y de
       uso libre bajo una licencia abierta.
     intro_2_create_account: Crear una cuenta de usuario
-    hosting_partners_html: '%{ucl}, %{fastly}, %{bytemark} y otros %{partners} patrocinan
-      el alojamiento.'
-    partners_ucl: UCL
+    hosting_partners_2024_html: El alojamiento cuenta con el respaldo de %{fastly},
+      %{corpmembers} y otros %{partners}.
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
+    partners_corpmembers: Miembros corporativos de OSMF
     partners_partners: socios
     tou: Términos de Uso
     osm_offline: La base de datos de OpenStreetMap no está disponible en estos momentos
index 7af1f2f5c27e00dbeae9e83501f643fc5ea68311..ff506f9562e9417884a1a334b72041a499613352 100644 (file)
@@ -1081,10 +1081,6 @@ et:
     intro_text: OpenStreetMap on maailma kaart, mille on loonud inimesed nagu sina
       ja seda võib vabalt kasutada avatud litsentsi tingimustel.
     intro_2_create_account: loo oma konto
-    hosting_partners_html: Majutust toetavad %{ucl}, %{fastly}, %{bytemark} ja teised
-      %{partners}.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnerid
     osm_offline: OpenStreetMapi andmebaas ei ole hetkel juurdepääsetav sest teostatakse
       vajalikke hooldustöid.
index a8736cb0a946c1b4e7b2e83c8d924b31d85fa61a..871113f57caf06ff0c27023506821e2f6c510da4 100644 (file)
@@ -1570,11 +1570,7 @@ eu:
     intro_text: OpenStreetMap munduko mapa da, zu bezalako jendeak sortutakoa eta
       doako lizentzia irekiarekin erabiltzeko dagoena.
     intro_2_create_account: Erabiltzaile kontua sortu
-    hosting_partners_html: Ostatatzea %{ucl}, %{fastly}, %{bytemark} eta beste %{partners}
-      babestua.
-    partners_ucl: UCLa
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Ostatua
     partners_partners: bazkideak
     tou: Erabilera-baldintzak
     osm_offline: OpenStreetMap datu-basea orain konexiorik gabe dago funtsezko datu-basearen
index 76db09a1cdf60376ea464d18a2d713351a3a7f64..554a722bebbbbdabe287f6d98c512d6e73fc10fc 100644 (file)
@@ -1493,10 +1493,6 @@ fa:
     intro_text: OpenStreetMap نقشه‌ای از جهان است که افرادی مانند شما آن را ساخته‌اند
       و آزادید آن را تحت پروانه‌ای آزاد استفاده کنید.
     intro_2_create_account: ساخت حساب کاربری
-    hosting_partners_html: میزبانی وب را %{ucl}،‏ %{fastly}،‏ %{bytemark} و سایر %{partners}
-      پشتیبانی می‌کنند.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: شرکای تجاری
     tou: شرایط استفاده
     osm_offline: پایگاه دادهٔ OpenStreetMap هم‌اکنون برون‌خط است تا کارهای ضروری برای
index e2a53fe95ab2d096a97f1f0f62b4f5b88f36d82e..d116bf387179a7ea33d994ed5a6b3604c281b6f1 100644 (file)
@@ -482,6 +482,8 @@ fi:
         belongs_to: Lähettäjä
     show:
       title: 'Muutoskokoelma: %{id}'
+      created: 'Luotu: %{when}'
+      closed: 'Suljettu: %{when}'
       created_ago_html: Luotu %{time_ago}
       closed_ago_html: Suljettu %{time_ago}
       created_ago_by_html: Luonut %{user}, %{time_ago}
@@ -1542,11 +1544,7 @@ fi:
     intro_text: OpenStreetMap on vapaaehtoisten luoma maailmankartta, jota voi käyttää
       vapaasti avoimella lisenssillä.
     intro_2_create_account: luomalla ensin käyttäjätunnuksen
-    hosting_partners_html: Palvelinkapasiteettia meille tarjoaa %{ucl}, %{fastly},
-      %{bytemark} ja muut %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: kumppanimme
     tou: Käyttöehdot
     osm_offline: OpenStreetMapin tietokanta ei toistaiseksi ole käytettävissä välttämättömien
index 84fda351a8d67b9560df998421e548c1e757354b..f186077cdd9a0c79c2ac7950ac8d1f683c46d5a2 100644 (file)
@@ -1709,11 +1709,7 @@ fr:
     intro_text: OpenStreetMap est une carte du monde, créée par des gens comme vous
       et libre d’utilisation sous licence libre.
     intro_2_create_account: Créez un compte d’utilisateur
-    hosting_partners_html: L’hébergement est pris en charge par %{ucl}, %{fastly},
-      %{bytemark}, et d’autres %{partners}.
-    partners_ucl: l’University College de Londres
     partners_fastly: Fastly
-    partners_bytemark: l'Hébergeur Bytemark
     partners_partners: partenaires
     tou: Conditions d’utilisation
     osm_offline: La base de données OpenStreetMap est actuellement hors ligne ; une
index 395aeb32e23336fd824c88cb4c6bca5d0f484c1e..4d6b429029cf08edf0e583c346f96aaccf1bb2ec 100644 (file)
@@ -962,11 +962,7 @@ fur:
     intro_text: OpenStreetMap e je une mape dal mont, creade di int come te e di ûs
       libar sot di une licence vierte.
     intro_2_create_account: Cree il to profîl utent
-    hosting_partners_html: L'hosting al è sostignût di %{ucl}, %{fastly}, %{bytemark}
-      e altris %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: associâts
     tou: Cundizions pal ûs
     osm_offline: La base di dâts di OpenStreetMap e je par cumò fûr linie parcè che
index 02ab1193a353c6bc942e7a780b90fe53b621e55e..952a3ff9de6c561a5ac3fc5fabcb9f638c5f5e5e 100644 (file)
@@ -1470,11 +1470,7 @@ fy:
     intro_text: OpenStreetMap is in wrâldkaart makke troch minsken krekt as jo, en
       frij te brûken ûnder in iepen lisinsje.
     intro_2_create_account: Meitsje in akkount as meidogger
-    hosting_partners_html: It webstee is ûnderdak by %{ucl}, %{fastly}, %{bytemark}
-      en oare %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partners
     tou: Gebrûksbetingsten
     osm_offline: De OpenStreetMap-databank is op it stuit ôfline, wylst der it nedige
index f2016986e8f43bba6f91aa66b81e44d0fd2940f5..53ba4347e19fc13324dc3274d451b668956ab3b1 100644 (file)
@@ -1082,10 +1082,6 @@ ga:
     intro_text: Is léarscáil den domhan é OpenStreetMap, a chruthaigh daoine cosúil
       leatsa agus atá saor in aisce le húsáid faoi cheadúnas oscailte.
     intro_2_create_account: Cruthaigh cuntas úsáideora
-    hosting_partners_html: Tacaíonn %{ucl}, %{bytemark} agus %{partners} eile leis
-      an óstáil.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: comhpháirtithe
     osm_offline: Tá bunachar sonraí OpenStreetMap as líne faoi láthair fad agus atá
       obair chothabhála riachtanach á dhéanamh ar an mbunachar sonraí.
index 3a378003dda7c572b29fa01e4d27815c421ab874..1d51a2ba67d144f03805bcaca61f33cb40f8db7a 100644 (file)
@@ -933,8 +933,6 @@ gd:
     intro_text: '''S e mapa an t-saoghail a tha san OpenStreetMap a chaidh a chruthachadh
       le daoine mar thu fhèin ''s a tha saor fo cheadachas fhosgailte.'
     intro_2_create_account: Cruthaich cunntas cleachdaiche
-    partners_ucl: UCL VR Centre
-    partners_bytemark: Bytemark Hosting
     partners_partners: com-pàirtichean eile
     osm_offline: Tha an stòr-dàta aig OpenStreetMap far loidhńe an-dràsta on a tha
       sinn a' dèanamh obair-charaidh riatanach air.
index 4a06b46e2da69c83b377a862ca548b939c427aac..37f4ca6edbc4e6b711eed9c8ec21700921162f40 100644 (file)
@@ -1589,11 +1589,7 @@ gl:
     intro_text: O OpenStreetMap é un mapa do mundo, creado por xente coma ti e de
       libre uso baixo unha licenza aberta.
     intro_2_create_account: Crea unha conta de usuario
-    hosting_partners_html: O aloxamento está fornecido por %{ucl}, %{fastly}, %{bytemark}
-      e outros %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: socios
     tou: Termos de uso
     osm_offline: A base de datos do OpenStreetMap atópase desconectada mentres realizamos
index da9c5fb83623c94a8e7aed405a57b549cfee272b..0172e29a091261346730a193036cff855c3a9b06 100644 (file)
@@ -1647,11 +1647,10 @@ he:
     intro_text: OpenStreetMap היא מפה של העולם, שנוצרת על־ידי אנשים כמוך, וחופשית
       לשימוש תחת רישיון פתוח.
     intro_2_create_account: נא ליצור חשבון משתמש
-    hosting_partners_html: האירוח בתמיכת %{ucl}, %{fastly}, %{bytemark}, ו%{partners}
-      נוספים.
-    partners_ucl: UCL
+    hosting_partners_2024_html: האירוח נתמך על־ידי %{fastly}, %{corpmembers} ועוד
+      %{partners}
     partners_fastly: פאסטלי
-    partners_bytemark: בייטמארק הוסטינג
+    partners_corpmembers: חברים תאגידיים אחרים ב־OSMF
     partners_partners: שותפים
     tou: תנאי השימוש
     osm_offline: מסד הנתונים של אתר OpenStreetMap אינו מקוון כעת בשל עבודות תחזוקה
index 38c898289e54d0098ed3900c3b78b2893e393b3b..0878275c66589b0e2f3ae9165c6c473089151df7 100644 (file)
@@ -1044,8 +1044,6 @@ hr:
     intro_text: OpenStreetMap je karta svijeta, stvorena od strane ljudi (volontera/doprinositelja)
       i može se slobodno koristiti pod licencijom otvorenog koda (ODbL).
     intro_2_create_account: Stvori korisnički račun
-    hosting_partners_html: Hosting podržavaju %{ucl}, %{fastly}, %{bytemark} i drugi
-      %{partners}.
     osm_offline: OpenStreetMap baza podataka je trenutno nedostupna dok se ne završe
       važni radovi na održavanju.
     osm_read_only: Zbog radova na održavanju baze podataka OpenStreetMapa, istu trenutačno
index 90760ed809458782f526ca09b2b036c78ef484bf..a9652efb6ca9443afe5c3650adb82c0b4cfe1031 100644 (file)
@@ -1507,10 +1507,6 @@ hsb:
     intro_text: OpenStreetMap je karta swěta, wutworjena wot ludźi kaž tebje a hodźi
       so swobodnje pod wotewrjenej licencu wužiwać.
     intro_2_create_account: Załož wužiwarske konto
-    hosting_partners_html: Hosting so wot %{ucl}, %{fastly}, %{bytemark} a druhich
-      %{partners} podpěruje.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnerow
     tou: Wužiwanske wuměnjenja
     osm_offline: Datowa banka OpenStreetMap je tuchwilu offline, dokelž so wažne hladanske
@@ -1782,12 +1778,12 @@ hsb:
       flash changed: Twoje hesło je so změniło.
   preferences:
     show:
-      title: Moje nastajenja
+      title: Moje preferency
       preferred_editor: Preferowany editor
       preferred_languages: Preferowane rěče
-      edit_preferences: Nastajenja wobdźěłać
+      edit_preferences: Preferency wobdźěłać
     edit:
-      title: Nastajenja wobdźěłać
+      title: Preferency wobdźěłać
       save: Nastajenja aktualizować
       cancel: Přetorhnyć
     update:
@@ -2475,7 +2471,7 @@ hsb:
       my profile: Mój profil
       my settings: Moje nastajenja
       my comments: Moje komentary
-      my_preferences: Moje nastajenja
+      my_preferences: Moje preferency
       my_dashboard: Moja přehladna strona
       blocks on me: Dostane blokowanja
       blocks by me: Date blokowanja
index c96b6eadc6997cfdb087ce809d47db7f5f974a93..f9c7c975345a718dab0c0afbfd20c3cf37058dc0 100644 (file)
@@ -1584,11 +1584,7 @@ hu:
     intro_text: Az OpenStreetMap egy világtérkép, amelyet hozzád hasonló emberek készítenek
       és szabad licenc alatt elérhető.
     intro_2_create_account: Felhasználói fiók létrehozása
-    hosting_partners_html: 'Az üzemeltetés támogatói: %{ucl}, %{fastly}, %{bytemark},
-      és további %{partners}.'
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnerek
     tou: Felhasználási feltételek
     osm_offline: Az OpenStreetMap-adatbázis jelenleg offline, miközben alapvető adatbázis-karbantartási
index b349832e88664fea2fc01494bb69f25fb161a506..1e05c164bbc8818609fd56680c75dcfcbd03ff6f 100644 (file)
@@ -1573,11 +1573,7 @@ ia:
     intro_text: OpenStreetMap es un carta del mundo, create per gente como tu e libere
       de usar sub un licentia aperte.
     intro_2_create_account: Crea un conto de usator
-    hosting_partners_html: Le allogiamento web es supportate per %{ucl}, %{fastly},
-      %{bytemark} e altere %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partners
     tou: Conditiones de uso
     osm_offline: Le base de datos de OpenStreetMap non es disponibile al momento debite
index c57c8c6f0a31cd3fb297f92727d1ebb3d5d2e201..0d53f53bd9f2b21ff61fdd3e9ac3cf1b9fb91faf 100644 (file)
@@ -1578,11 +1578,7 @@ id:
     intro_text: OpenStreetMap adalah peta dunia, diciptakan oleh orang-orang seperti
       Anda dan bebas untuk digunakan di bawah lisensi terbuka.
     intro_2_create_account: Buat Akun
-    hosting_partners_html: Hosting didukung oleh %{ucl}, %{fastly}, %{bytemark}, dan
-      %{partners} lainnya.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Hosting Bytemark
     partners_partners: mitra
     tou: Ketentuan Penggunaan
     osm_offline: Database OpenStreetMap saat ini sedang dimatikan karena sedang dilakukan
index 11cece8ee998f172c840845d3d64c51d5b82d8a0..69322f026d664c23cf339ed62af44d9243e48862 100644 (file)
@@ -1552,11 +1552,7 @@ is:
     intro_text: OpenStreetMap er heimskort gert af fólki eins og þér. Það er gefið
       út með opnu hugbúnaðarleyfi og það kostar ekkert að nota það.
     intro_2_create_account: Búa til notandaaðgang
-    hosting_partners_html: Vefhýsing er studd af %{ucl},%{fastly}, %{bytemark} og
-      öðrum %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: samstarfsaðilum
     tou: Notkunarskilmálar
     osm_offline: OpenStreetMap gagnagrunnurinn er niðri vegna viðhalds.
index 8971883bce7b2bc35110bbbce5dc651d125f736e..25e5303c5ad7c9d10cfd17f1556b90bc3776a9b3 100644 (file)
@@ -1622,11 +1622,7 @@ it:
     intro_text: OpenStreetMap è una mappa del mondo, creata da persone come te e libera
       da utilizzare secondo una licenza aperta.
     intro_2_create_account: Crea un account utente
-    hosting_partners_html: L'hosting è supportato da %{ucl}, %{fastly}, %{bytemark},
-      e da altri %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partner
     tou: Condizioni d'uso
     osm_offline: Il database di OpenStreetMap è al momento non in linea per permettere
@@ -1973,10 +1969,10 @@ it:
           alt: Accedi con un OpenID di Google
         facebook:
           title: Accedi con Facebook
-          alt: Accedi con un account Facebook
+          alt: Accedi con un'utenza Facebook
         microsoft:
           title: Accedi con Microsoft
-          alt: Accedi con un account Microsoft
+          alt: Accedi con un'utenza Microsoft
         github:
           title: Accedi con GitHub
           alt: Effettua l'acceso con un'utenza GitHub
index dfb3cc153b02a4b0980219b16fd664fa54bfc3f1..58fcd54a6f24754de56fbaa2f303fbe6ff7d2d15 100644 (file)
@@ -1513,10 +1513,7 @@ ja:
     intro_header: OpenStreetMap へようこそ!
     intro_text: OpenStreetMap は、あなたのような人々が作成した世界地図であり、オープン ライセンスの下で自由に利用できます。
     intro_2_create_account: 新しい利用者アカウントを作成
-    hosting_partners_html: ホスティングは、%{ucl}、%{fastly}、%{bytemark}、およびその他の%{partners}によってサポートされています。
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: バイトマーク ホスティング
     partners_partners: パートナー
     tou: 利用規約
     osm_offline: OpenStreetMap のデータベースはメンテナンスのため一時的に停止しています。
index 5182c2053c6eace3da793f6ccfcbe5ad1ae75462..b720abaaca7aa578859e05bdf561f5708a0d408a 100644 (file)
@@ -795,8 +795,6 @@ kab:
     intro_text: OpenStreetMap d takarḍa n umadal, rnna-tt yemdanen am kečč d tilellit
       i useqdec ddaw n turagt tilellit.
     intro_2_create_account: Rnu amiḍan n useqdac
-    partners_ucl: UCL
-    partners_bytemark: Tanezduɣt n Bytemark
     partners_partners: imendiden
     osm_offline: Taffa n isefka n OpenStreetMap ur teqqin ara yakan tura imi aseǧǧem
       ilaqen yettwaselkam akken ad teddu akken iwata.
index 38871346290b1cdbdfe55204cc0c8ecddd355000..76595014c79e7fccb971b9f81c37c986d1bd33d7 100644 (file)
@@ -832,9 +832,7 @@ kk-cyrl:
     user_diaries: Қолданушылардың күнделіктері
     edit_with: '%{editor} көмегімен өңдеу'
     intro_header: OpenStreetMap-ке қош келдіңіз!
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     help: Анықтама
     about: Жоба туралы
     copyright: Авторлық құқықтар
index 0a6378fafdd4328ec4f989cb7df1dafdb242036f..061519ece75744338ad659a485edaae598e55aa5 100644 (file)
@@ -680,8 +680,6 @@ kn:
     export_data: ದತ್ತಾಂಶ ರಫ್ತುಮಾಡು
     intro_header: ಒಪನ್ ಸ್ಟ್ರೀಟ್ ಮ್ಯಾಪ್ ಗೆ  ಸುಸ್ವಾಗತ!
     intro_2_create_account: ಹೊಸ ಬಳಕೆದಾರ ಖಾತೆಯನ್ನು ರಚಿಸಿ
-    partners_ucl: ಯುಸಿಎಲ್
-    partners_bytemark: ಬೈಟ್ಮಾರ್ಕ್ ಹೋಸ್ಟಿಂಗ್
     tou: ಬಳಕೆಯ ನಿಬಂಧನೆಗಳು
     help: ಸಹಾಯ
     about: ನಮ್ಮ ಬಗ್ಗೆ
index 54ad2c481dc867b4ef451be983d79ce594cd2ae8..746c0f5d88a0bd9703c28815a75b016ede9e4d70 100644 (file)
@@ -1497,10 +1497,7 @@ ko:
     intro_text: 오픈스트리트맵 (OpenStreetMap)은 여러분과 같은 사람들이 만들어, 개방형 라이선스에 따라 자유롭게 사용할 수
       있는 세계 지도입니다.
     intro_2_create_account: 사용자 계정을 만드세요
-    hosting_partners_html: 호스팅은 %{ucl}, %{fastly}, %{bytemark}, 다른 %{partners}에서 지원합니다.
-    partners_ucl: UCL
     partners_fastly: 빠르게
-    partners_bytemark: 바이트마크 호스팅
     partners_partners: 협력단체
     tou: 이용 약관
     osm_offline: 데이터베이스 점검을 위해 현재 오픈스트리트맵의 데이터가 오프라인 상태에 있습니다.
index 5eab4650a0c6fab3962bf4f9d206e463af4185cf..4be48b61277d3c37df84387a9c50c5578b9c37c4 100644 (file)
@@ -1524,11 +1524,7 @@ ku-Latn:
     intro_text: OpenStreetMap xerîteyekî dinyayê ye ku ji aliyê kesên wek te ve tê
       çêkirin û emilandina we belaş e û di bin lîsansa azad de ye.
     intro_2_create_account: Ji xwe re hesabekî çêbike
-    hosting_partners_html: Xizmeta hewandinê tê piştgirîkirin ji aliyê %{ucl}, %{fastly},
-      %{bytemark}, û %{partners} din ve.
-    partners_ucl: University College London
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: şirîkên me
     tou: Mercên Bikaranînê
     osm_offline: Databasa OpenStreetMapê vê gavê offline e ji ber ku niha xebatên
index d81af26d2a6d37393f0871dacab824d51380aeea..a6eb4ab133e8bba1ba7e87836ffb7899252b6c9c 100644 (file)
@@ -1494,11 +1494,7 @@ lb:
     intro_text: OpenStreetMap ass eng Kaart vun der Welt, déi vu Leit wéi Iech gemaach
       gouf an déi fräi ënner enger oppener Lizenz benotzt ka ginn.
     intro_2_create_account: E Benotzerkont uleeën
-    hosting_partners_html: Den Hosting gëtt vun %{ucl}, %{fastly}, %{bytemark} an
-      anere(n) %{partners} ënnerstëtzt.
-    partners_ucl: '''''University College'''' zu London'
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: Partneren
     tou: Benotzungs-Bedéngungen
     osm_offline: D'OpenStreetMap Datebank ass elo net disponibel well dru geschafft
index e9e07104abc267aac41acae211eb6d39503faeb1..941e568f44f887ebc79f80b03581a291c1d97289 100644 (file)
@@ -1567,11 +1567,7 @@ lt:
     intro_text: OpenStreetMap yra pasaulio žemėlapis, kuriamas žmonių, tokių kaip
       jūs. Jis atviras ir laisvas - naudojamas pagal atvirą licenciją.
     intro_2_create_account: sukurti naudotojo paskyrą
-    hosting_partners_html: Hostinimo paslaugas teikia %{ucl}, %{fastly}, %{bytemark}
-      ir kiti %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark serveris
     partners_partners: partneriai
     tou: Naudojimo sąlygos
     osm_offline: Šiuo metu OpenStreetMap duomenų bazė išjungta, nes vykdomi svarbūs
index 7731a84f50ee22643bd9ebdd59d1a119a4fbdaa7..ee0598c7db1dc2b1e7ac7f3a4ad845b3a3448d7d 100644 (file)
@@ -1204,8 +1204,6 @@ lv:
     intro_text: OpenStreetMap ir pasaules karte, kuru veido cilvēki kā tu, un tā ir
       bezmaksas lietošanai zem atvērtas licences.
     intro_2_create_account: Izveidot lietotāja kontu
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: partneri
     tou: Lietošanas noteikumi
     osm_offline: OpenStreetMap datubāze šobrīd nav pieejama, tiek veikti svarīgi datubāzes
index c189e22973809ca0dba29b9672908ec24bbf0ef2..3d322885e32119b5a190e6c0eece9c5cbcb065f0 100644 (file)
@@ -1590,11 +1590,10 @@ mk:
     intro_text: OpenStreetMap е карта на светот создадена од луѓе како вас и се нуди
       за слободна употреба под отворена лиценца.
     intro_2_create_account: Создајте корисничка сметка
-    hosting_partners_html: Вдомувањето е поддржано од %{ucl}, %{fastly}, %{bytemark}
+    hosting_partners_2024_html: Вдомувањето е поддржано од %{fastly}, %{corpmembers},
       и други %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: вдомителот „Bytemark“
+    partners_corpmembers: Корпоративни членови на OSMF
     partners_partners: партнери
     tou: Услови на употреба
     osm_offline: Базата на податоци на  OpenStreetMap моментално е исклучена додека
index 8fbfe90174080979a9767b376b6ae8c3044b06f1..0404ed3d33cec350d7df10343a88b83718dee435 100644 (file)
@@ -535,8 +535,6 @@ mo:
     intro_text: OpenStreetMap есте о хартэ а лумий, креатэ де оамень ка ши думнявоастрэ,
       ши поате фи утилизатэ ын мод либер суб о личенцэ дескисэ.
     intro_2_create_account: Креаць ун конт де утилизатор
-    partners_ucl: Колеӂиул Университар дин Лондра (UCL)
-    partners_bytemark: Хостингул Bytemark
     partners_partners: партенерь
     help: Ажутор
     about: Деспре проект
index b7ef14752e5ed4af4b2b3bbf90433f257c3edd2d..4b94e9068d4ab3c40f841dd21e3b0b2f1ae575d4 100644 (file)
@@ -857,8 +857,6 @@ mr:
     intro_text: ओपनस्ट्रीटमॅप हा जगाचा नकाशा आहे, जो आपल्यासारख्या लोकांनी तयार केला
       आहे, व जो खुल्या परवान्यांतर्गत वापरास मुक्त आहे.
     intro_2_create_account: सदस्यखाते तयार करा
-    partners_ucl: UCL VR सेंटर
-    partners_bytemark: बाईटमार्क होस्टिंग
     partners_partners: भागीदार
     osm_offline: डाटाबेसचे आवश्यक देखरेखीचे काम असल्यामुळे ओपनस्ट्रीटमॅप डाटाबेस ही
       जालावेगळी करण्यात आलेली आहे.
index a512e9ba6bd5724cb48df85647725c471b4d8f29..4c5a8b207ce2b52aa2abddde140908ad34d341c4 100644 (file)
@@ -1200,8 +1200,6 @@ ms:
     intro_text: OpenStreetMap ialah peta dunia yang diwujudkan oleh insan seperti
       anda, dan bebas digunakan dengan berlandaskan lesen terbuka.
     intro_2_create_account: Buka akaun pengguna
-    partners_ucl: Pusat VR UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: rakan-rakan kongsi
     tou: Syarat-Syarat Penggunaan
     osm_offline: Pangkalan data OpenStreetMap kini diputuskan sambungannya sementara
index 3021bf65dadbf8de7368d74e6020b2744161dfeb..29aa8b6c793c1c0dabe184fa5ed153a9138cd9af 100644 (file)
@@ -1389,10 +1389,6 @@ nb:
     intro_text: OpenStreetMap er et kart over verden, skapt av mennesker som deg,
       og gratis å bruke under en åpen lisens.
     intro_2_create_account: Opprett en brukerkonto
-    hosting_partners_html: Hosting støttes av %{ucl}, %{fastly}, %{bytemark}, og andre
-      %{partners}.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnere
     tou: Bruksvilkår
     osm_offline: OpenStreetMap databasen er for øyeblikket utilgjengelig mens essensielt
index e9ac68cce89fb0385c8e5ac15014d83f6223d798..f9fe304bbe20547a523cbe43141c1f602c70d0d3 100644 (file)
@@ -1629,11 +1629,7 @@ 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 account aan
-    hosting_partners_html: Hosting wordt ondersteund door %{ucl}, %{fastly}, %{bytemark},
-      en andere %{partners}.
-    partners_ucl: het UCL VR Centre
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partners
     tou: Gebruiksvoorwaarden
     osm_offline: De OpenStreetMap-database is momenteel niet beschikbaar wegens het
index f620fd5e0e7709466d9201ae6cacb7d5ae1d57d5..2eb003980817fcec24144acef711142604119027 100644 (file)
@@ -239,7 +239,7 @@ nn:
           andre kontoar.
         retain_caveats: Somme opplysingar vil verte tatt vare på, til og med etter
           at kontoen din er sletta.
-        retain_edits: Eventuelle redigeringer av kartdatabasen vil behaldast.
+        retain_edits: Eventuelle endringar av kartdatabasen vil behaldast.
         retain_traces: Spor du har lasta opp vil behaldast.
         retain_diary_entries: Innlegg og kommentarar frå deg i brukardagboken vil
           verte tekne vare på, men skylte frå ålmenta.
@@ -1471,11 +1471,7 @@ nn:
     intro_text: OpenStreetMap er eit verdskart, laga av folk som deg. Kartet er gratis
       å bruke under ein open lisens.
     intro_2_create_account: Opprett ein brukarkonto
-    hosting_partners_html: Drifta er støtta av %{ucl}, %{fastly}, %{bytemark} og andre
-      %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnarar
     tou: Bruksvilkår
     osm_offline: OpenStreetMap databasen er for augneblunken utilgjengelig medan essensielt
index b4a863563601c6fb050d614b0b0164552ab1eeb0..395cbcf0b5488d769973f624f3aaeb9ab4779503 100644 (file)
@@ -1092,7 +1092,6 @@ nqo:
     intro_text: ߏߔߌ߲߫ ߛߕߑߙߌߕ ߡߊߔ ߦߋ߫ ߘߎߢߊ߫ ߔߊ߬ߔߘߊ ߟߋ߬ ߘߌ߫߸ ߡߍ߲ ߛߌ߲ߘߌߣߍ߲߫ ߦߋ߫ ߡߐ߱ ߟߎ߬
       ߓߟߏ߫ ߦߏ߫ ߌߟߋ߸ ߊ߬ ߟߊߓߊ߯ߙߊ ߦߋ߫ ߛߙߊ߬ߓߊߟߌ ߟߋ߬ ߘߌ߫ ߟߊ߬ߘߤߊ߬ߟߌ߫ ߘߊߦߟߍ߬ߣߍ߲ ߞߘߐ߫.
     intro_2_create_account: ߖߊ߬ߕߋ߬ߘߊ ߘߏ߫ ߘߊߦߟߍ߬
-    partners_ucl: UCL
     partners_fastly: ߝߊߛߕߑߟߋ߫
     partners_partners: ߞߊ߬ߝߏ߬ߢߐ߲߮ ߠߎ߬
     tou: ߟߊ߬ߓߊ߰ߙߊ߬ߟߌ ߛߙߊߕߌ
index aadca117dd66c928838a8fe519692b11bfe905ed..c307080a122d7072b1a18afd2c65b2007eafc5e2 100644 (file)
@@ -1494,11 +1494,7 @@ oc:
     intro_text: OpenStreetMap es una mapa dau monde, creada per de personas coma vos
       e liura d’utilizacion sota licéncia liura.
     intro_2_create_account: Creatz un compte d'utilizaire
-    hosting_partners_html: L'aubergament es pres en carga per %{ucl}, %{fastly}, %{bytemark},
-      e d'autres %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Albergament Bytemark
     partners_partners: partenaris
     tou: Condicions d'utilizacion
     osm_offline: La basa de donadas de OpenStreetMap es actualament fòra linha; una
index 2c779fc472e87e4257faf1a9705e267645490506..c79fe92cef998cb7a3ca88a5528d409e971bca7a 100644 (file)
@@ -735,7 +735,6 @@ pa:
     export_data: ਸਮੱਗਰੀ ਬਰਾਮਦ ਕਰੋ
     edit_with: '%{editor} ਨਾਲ ਸੋਧੋ'
     intro_2_create_account: ਇੱਕ ਵਰਤੋਂਕਾਰ ਖਾਤਾ ਬਣਾਉ
-    partners_bytemark: ਬਾਈਟਮਾਰਕ ਹੋਸਟਿੰਗ
     partners_partners: ਜੋੜੀਦਾਰ
     help: ਮਦਦ
     about: ਬਾਬਤ
index a601e9a45519b3b4d7444f4c7e0f277d9a94d0c5..a12ab3f81f6134b0ecb413a7a00ce4fb280f155c 100644 (file)
@@ -1645,11 +1645,7 @@ pl:
     intro_text: OpenStreetMap to mapa świata stworzona przez ludzi takich jak ty i
       z możliwością użycia pod otwartą licencją.
     intro_2_create_account: Utwórz konto
-    hosting_partners_html: Hosting obsługuje %{ucl}, %{fastly}, %{bytemark}, a także
-      %{partners}.
-    partners_ucl: University College London
     partners_fastly: Fastly
-    partners_bytemark: Hosting Bytemark
     partners_partners: partnerzy
     tou: Warunki użytkowania
     osm_offline: Baza danych OpenStreetMap jest niedostępna na czas ważnych zadań
index 7e545358ac15733cc0bc5d98e7e75a20ca7f5cb6..6ae119469e7d0d190cc07c2c557b2a9e0d84ec1a 100644 (file)
@@ -1214,9 +1214,7 @@ pnb:
     tag_line: آزاد نقشہ جو جہڑے جہڑے سودھ سکدے اے
     intro_header: اوپن سٹریٹ میپ تے سواگت اے!
     intro_2_create_account: ورتنوالے دا کھاتہ بݨاؤݨ
-    partners_ucl: یو سی ایل
     partners_fastly: فَیستلی
-    partners_bytemark: بائیٹمارک ہوستِنگ
     partners_partners: جوڑیدار
     tou: ورتن شرطاں
     help: مدد
index 48b3164a170245662f8d38ddfe1dbf1a0861b127..ebf0687357018a827e98f55bdf7729c508843cda 100644 (file)
@@ -1605,11 +1605,7 @@ pt-PT:
     intro_text: O OpenStreetMap é um mapa do mundo, criado por pessoas como tu e de
       uso livre sob uma licença aberta.
     intro_2_create_account: Cria uma conta de utilizador
-    hosting_partners_html: O alojamento é suportado por %{ucl}, %{fastly}, %{bytemark}
-      e outros %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: parceiros
     tou: Condições de utilização
     osm_offline: A base de dados do OpenStreetMap está indisponível devido a trabalhos
index 839256b19679df906bf483cbed3be43181261b42..2d02a871ca69be7bf91199da6227e62ca51c83f3 100644 (file)
@@ -1618,11 +1618,7 @@ pt:
     intro_text: O OpenStreetMap é um mapa do mundo, criado por pessoas como você e
       de uso livre sob uma licença aberta.
     intro_2_create_account: Criar uma conta de usuário
-    hosting_partners_html: O hospedagem é suportada por %{ucl}, %{fastly}, %{bytemark}
-      e outros %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Hospedagem Bytemark
     partners_partners: parceiros
     tou: Termo de uso
     osm_offline: A base de dados do OpenStreetMap está fora do ar para manutenção.
index 5e2d5e54891bd90edd20fc10f199b31c96202585..690d6f538bdb4076f8130fcbfa7b43714c2b7f4c 100644 (file)
@@ -1587,11 +1587,7 @@ ro:
     intro_text: OpenStreetMap este o hartă a lumii, creată de oameni ca tine și liberă
       pentru utilizare sub o licență deschisă.
     intro_2_create_account: Creează un cont de utilizator
-    hosting_partners_html: Gazduirea este susținută de %{ucl}, %{fastly}, %{bytemark}
-      și alți %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Găzduire Bytemark
     partners_partners: parteneri
     tou: Termeni de Utilizare
     osm_offline: Baza de date OpenStreetMap este în prezent offline, în timp ce se
index 4f8c413ee69a5ddcc99fd43fd0f6ad67a83127f5..0840309c7b83679e7d6fb8f6574ff9be8f68980a 100644 (file)
@@ -1622,11 +1622,7 @@ ru:
     intro_text: OpenStreetMap является картой мира, созданной такими же людьми, как
       и вы, и может свободно использоваться под открытой лицензией.
     intro_2_create_account: Создайте учётную запись
-    hosting_partners_html: Хостинг поддерживается %{ucl}, %{fastly}, %{bytemark} и
-      другими %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: партнёрами
     tou: Условия использования
     osm_offline: База данных OpenStreetMap в данный момент не доступна, так как проводится
index e393cc7b5e16e9e179c4ab41d27c0adc4464073a..2adb201fc92a8337561be88da786ac619b1089d9 100644 (file)
@@ -1571,11 +1571,7 @@ sc:
     intro_text: OpenStreetMap est una mapa de su mundu, creada dae persones che a
       tie e de impreu lìberu suta de una litzèntzia aberta.
     intro_2_create_account: Crea unu contu de utente
-    hosting_partners_html: S'allògiu est a càrrigu de %{ucl}, %{fastly}, %{bytemark}
-      e de àteros %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: sòtzios
     tou: Conditziones de impreu
     osm_offline: In custu momentu sa base de datos de OpenStreetMap est foras de lìnia,
index c1fc274eb8ed3188601aa42fa9e114e4a5492841..1672f906e69e1b6cee9e250181d610597f5552c8 100644 (file)
@@ -1034,8 +1034,6 @@ scn:
     intro_text: OpenStreetMap è na cartina dû munnu, criata di genti comu a tìa e
       lìbbira a adupirari secunnu na licenza graputa.
     intro_2_create_account: Crea un cuntu d'utenti
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: cullabburatura
     osm_offline: La basi di dati d'OpenStreetMap comu a ora nun è n lìnia pirchì si
       stannu facennu travagghî di manutinzioni funnamintali.
index 474d1f4c7e0d1a5d4e4d3a6a33fcb76ded1bf03f..389717a4e0cf52090eae8b4b6bca1a78e458bd0c 100644 (file)
@@ -765,8 +765,6 @@ sco:
     intro_text: OpenStreetMap is a cairt o the warld, creatit bi fowk lik ye an free
       tae uise unner an open license.
     intro_2_create_account: Create a uiser accoont
-    partners_ucl: the UCL VR Centre
-    partners_bytemark: Bytemark Hosting
     partners_partners: pairtners
     osm_offline: The OpenStreetMap database is currently offline while essential database
       maintenance wirk is carried oot.
index ae047e325a86d6d4abea2ec62f7bfd8d687c79d2..5576d97f7d6d7744c3e71fb76caf98f4b21db872 100644 (file)
@@ -501,11 +501,7 @@ sh:
     intro_text: OpenStreetMap je karta svijeta stvorena od strane ljudi kao što ste
       vi i može se slobodno koristiti pod licencom otvorenog koda.
     intro_2_create_account: Napravi korisnički račun
-    hosting_partners_html: Hosting podržavaju %{ucl}, %{fastly}, %{bytemark} i drugi
-      %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partneri
     tou: Uslovi korištenja
     osm_offline: OpenStreetMap baza podataka je trenutno nedostupna dok se ne završe
index c59b5bc8645b5f8363f50b7a4106600fd4e83ae8..6dd3afed75f1d8ac06141d0c738f4ec3e8223225 100644 (file)
@@ -1489,11 +1489,7 @@ sk:
     intro_text: OpenStreetMap je mapa sveta, vytvorené ľuďmi ako vy, voľne využiteľná
       pod slobodnou licenciou.
     intro_2_create_account: Založte si konto
-    hosting_partners_html: Hosting podporuje %{ucl}, %{fastly}, %{bytemark} a ďalší
-      %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partneri
     tou: Podmienky používania
     osm_offline: OpenStreetMap databáza je teraz offline, zatiaľ čo potrebná údržba
index 1dee6c57a4189d346cb1e24e6a37af5a8d9074ef..cd252515db9095596fcd75a9107f93890f530ddd 100644 (file)
@@ -996,7 +996,6 @@ skr-arab:
     issues: مسئلے
     data: ڈیٹا
     export_data: ڈَیٹا برامد کرو
-    partners_ucl: یو سی ایل
     partners_fastly: تکھیرے
     partners_partners: بھائیوال
     tou: ورتݨ شرطاں
index 9a675aeefa29fa2015c8b2b7a6391c4ea643e7bd..b76921956191011171c374b34d4ca7778b3e6de1 100644 (file)
@@ -1632,11 +1632,7 @@ sl:
     intro_text: OpenStreetMap je zemljevid sveta, ki ga ustvarjajo ljudje, kot ste
       vi, in brezplačen za uporabo pod odprto licenco.
     intro_2_create_account: Ustvarite uporabniški račun
-    hosting_partners_html: Gostovanje omogočajo %{ucl}, %{fastly}, %{bytemark} in
-      drugi %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partnerji
     tou: Pogoji uporabe
     osm_offline: Baza OpenStreetMap zaradi izvajanja nujnih vzdrževalnih del trenutno
index 4e3932237a1183dea165ad51e296509bf0e52eb0..c9cc48111c3cf9598c909c04b2f8131b9c857f9a 100644 (file)
@@ -759,8 +759,6 @@ sr-Latn:
     edit_with: Uredi uređivačem %{editor}
     tag_line: Slobodna viki mapa sveta
     intro_2_create_account: Otvorite nalog
-    partners_ucl: VR centar UCL-a
-    partners_bytemark: Hosting „Bajtmark“
     partners_partners: partneri
     osm_offline: Baza podataka Openstritmapa je trenutno nedostupna dok se ne završe
       važni radovi na održavanju.
index d76c8f9275caa9729e73d6fc376477049eaa6554..0a9d08886dcebcf32aaefd8adecdad8e09a0f993 100644 (file)
@@ -422,6 +422,7 @@ sr:
         belongs_to: Аутор
     show:
       title: 'Скуп промена: %{id}'
+      created: 'Направљено: %{when}'
       created_ago_html: Направљено %{time_ago}
       closed_ago_html: Затворено %{time_ago}
       created_ago_by_html: Направљено %{time_ago} од %{user}
@@ -1330,10 +1331,8 @@ sr:
     intro_text: OpenStreetMap је мапа света коју су направили људи попут вас. Слободна
       је за коришћење под отвореном лиценцом.
     intro_2_create_account: Отворите кориснички налог
-    hosting_partners_html: Хостинг пружају %{ucl}, %{fastly}, %{bytemark}, и други
+    hosting_partners_2024_html: Хостинг пружају %{fastly}, %{corpmembers}, и други
       %{partners}.
-    partners_ucl: UCL
-    partners_bytemark: Bytemark Hosting
     partners_partners: партнери
     tou: Услови коришћења
     osm_offline: База OpenStreetMap-а је тренутно недоступна док се не заврше неопходни
index 734a6f45412d62084d18cde2d2b4ade4bb61d6db..336bcc5dd8bf2769d4202b7c369e8655c16fc045 100644 (file)
@@ -1607,10 +1607,7 @@ sv:
     intro_text: OpenStreetMap är en karta över världen, skapad av människor som du
       och fri att använda under en öppen licens.
     intro_2_create_account: Skapa ett användarkonto
-    hosting_partners_html: Drivs via %{ucl}, %{fastly}, %{bytemark} och andra %{partners}.
-    partners_ucl: University College London
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: partners
     tou: Användarvillkor
     osm_offline: OpenStreetMap-databasen är inte tillgänglig just nu, då nödvändigt
index 57aceabab6b6865dc1b26072f74f1dbfe2b3c947..b0d3fa9fcb7f73f8a75a265e057ac9f7d050a189 100644 (file)
@@ -1463,11 +1463,7 @@ te:
     intro_text: OpenStreetMap, ఓ ప్రపంచ మ్యాపు. మీలాంటి వారే దీన్ని తయారు చేసారు.
       స్వేచ్ఛా లైసెన్సు ద్వారా స్వేచ్ఛగా దీన్ని వాడుకోవచ్చు.
     intro_2_create_account: వాడుకరి ఖాతాను సృష్టించుకోండి
-    hosting_partners_html: '%{ucl}, %{fastly}, %{bytemark}, ఇతర %{partners} హోస్టింగుకు
-      మద్దతు నిస్తున్నారు.'
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: భాగస్వాములు
     tou: వాడుక నియమాలు
     osm_offline: OpenStreetMap డేటాబేసులో అత్యావశ్యకమైన నిర్వహణ పనులు జరుగుతున్నందున
index 4cb4befd4252917be1e035b0552e5b56cdd9c96f..d6e8ea59ed6ec578bee55b5dac2c69b688cb5967 100644 (file)
@@ -1227,10 +1227,6 @@ th:
     intro_header: ยินดีต้อนรับสู่ OpenStreetMap!
     intro_text: OpenStreetMap เป็นแผนที่โลกที่สร้างโดยผู้คนเช่นท่าน และใช้งานได้ไม่เสียค่าใช้จ่ายภายใต้สัญญาอนุญาตแบบเปิด
     intro_2_create_account: สร้างบัญชีผู้ใช้ใหม่
-    hosting_partners_html: การโฮสต์ได้รับการสนับสนุนโดย %{ucl}, %{bytemark}, และ%{partners}อื่น
-      ๆ
-    partners_ucl: ยูซีแอล (วิทยาลัยอุดมศึกษาลอนดอน)
-    partners_bytemark: ไบต์มาร์กโฮสติง
     partners_partners: องค์กรพันธมิตร
     tou: ข้อกำหนดการใช้งาน
     osm_offline: ฐานข้อมูลของ OpenStreetMap กำลังออฟไลน์เพื่อให้สามารถดำเนินการบำรุงรักษาตามปกติได้
index 5298b5e36855954db3b3c5dded8d15c554b12f14..62cf3120418ff2663a3fbea21718391f266c0af3 100644 (file)
@@ -1202,11 +1202,7 @@ tl:
     intro_text: Ang OpenStreetMap ay isang mapa ng mundo na nilikha ng mga taong katulad
       mo at malayang gamitin sa ilalim ng isang bukas na lisensya.
     intro_2_create_account: Lumikha ng isang akawnt ng tagagamit
-    hosting_partners_html: Ang pagpapasinaya ay sinusuportahan ng %{ucl}, %{fastly},
-      %{bytemark}, at iba pang %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: mga kawaksi
     tou: Pagtatakda sa Paggamit
     osm_offline: Ang kalipunan ng dato ng OpenStreetMap ay pangkasalukuyang nakapatay
index 1096e861982df150af611039444c42621b28e922..b75837e27cba00624177b04d2e5726839c26e10d 100644 (file)
@@ -1642,11 +1642,10 @@ tr:
     intro_text: OpenStreetMap, sizler tarafından oluşturulan ve açık lisans altında
       ücretsiz olarak kullanılabilen bir dünya haritasıdır.
     intro_2_create_account: Bir kullanıcı hesabı oluşturun
-    hosting_partners_html: Barındırma hizmeti; %{ucl}, %{fastly}, %{bytemark} ve diğer
+    hosting_partners_2024_html: Barındırma hizmeti; %{fastly}, %{corpmembers} ve diğer
       %{partners} tarafından sağlanmaktadır.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
+    partners_corpmembers: OSMF kurumsal üyeleri
     partners_partners: iş birlikçiler
     tou: Kullanım Şartları
     osm_offline: OpenStreetMap veritabanı bakım çalışmaları yürütüldüğü için veritabanı
index 2fef0aeb3715ff1010b6c69a4af95d0fdf72dfd0..e13c032bce0e52bf50fc151753b8ed256e35faee 100644 (file)
@@ -87,6 +87,8 @@ uk:
       messages:
         invalid_email_address: не схоже на коректну адресу електронної пошти
         email_address_not_routable: недоступний
+        display_name_is_user_n: не може бути user_n, якщо n не є вашим ідентифікатором
+          користувача
       models:
         user_mute:
           is_already_muted: вже стишено
@@ -395,6 +397,7 @@ uk:
     deleted_ago_by_html: Вилучив(ла) %{time_ago} %{user}
     edited_ago_by_html: Змінено %{user} %{time_ago}
     version: Версія
+    redacted_version: Очищена Версія
     in_changeset: Набір змін
     anonymous: анонім
     no_comment: (без коментарів)
@@ -411,7 +414,10 @@ uk:
       other: ""
     download_xml: Завантажити XML
     view_history: Перегляд історії
+    view_unredacted_history: Перегляд невідредагованої історії
     view_details: Поточна інформація
+    view_redacted_data: Переглянути очищені дані
+    view_redaction_message: Переглянути повідомлення про очищення
     location: 'Координати:'
     node:
       title_html: 'Точка: %{name}'
@@ -496,6 +502,15 @@ uk:
       introduction: Клацніть на мапі, щоб отримати дані про об’єкти поруч.
       nearby: Об’єкти поруч
       enclosing: Оточуючі об’єкти
+  old_nodes:
+    not_found:
+      sorry: 'На жаль, точку #%{id} версії %{version} не знайдено.'
+  old_ways:
+    not_found:
+      sorry: 'На жаль, лінію #%{id} версії %{version} не знайдено.'
+  old_relations:
+    not_found:
+      sorry: 'На жаль, звʼязок #%{id} версії %{version} не знайдено.'
   changesets:
     changeset_paging_nav:
       showing_page: Сторінка %{page}
@@ -530,8 +545,24 @@ uk:
         created: Створено
         closed: Закрито
         belongs_to: Автор
+    subscribe:
+      heading: Підписатися на обговорення набору змін?
+      button: Підписатись на обговорення
+    unsubscribe:
+      heading: Відписатись від обговорення набору змін?
+      button: Відписатися від обговорення
+    heading:
+      title: Набір змін %{id}
+      created_by_html: Створений %{link_user} %{created}.
+    no_such_entry:
+      title: Немає такого набору змін
+      heading: Немає запису з id %{id}
+      body: На жаль, немає набору змін %{id}. Будь ласка, перевірте посилання, або,
+        можливо, посилання, яке ви натиснули, неправильне.
     show:
       title: 'Набір змін: %{id}'
+      created: 'Створено: %{when}'
+      closed: 'Закрито: %{when}'
       created_ago_html: Створено %{time_ago}
       closed_ago_html: Закрито %{time_ago}
       created_ago_by_html: Створив(ла) %{user} %{time_ago}
@@ -613,6 +644,7 @@ uk:
     show:
       title: Щоденник %{user} | %{title}
       user_title: Щоденник %{user}
+      discussion: Обговорення
       leave_a_comment: Лишити коментар
       login_to_leave_a_comment_html: '%{login_link}, аби залишити коментар'
       login: Увійти
@@ -667,6 +699,12 @@ uk:
       comment: Коментар
       newer_comments: Нові коментарі
       older_comments: Старіші коментарі
+    subscribe:
+      heading: Підписатись на обговорення цього допису щоденника?
+      button: Підписатись на обговорення
+    unsubscribe:
+      heading: Відписатись від обговорення цього допису щоденника?
+      button: Відписатися від обговорення
   doorkeeper:
     errors:
       messages:
@@ -1644,11 +1682,10 @@ uk:
     intro_text: OpenStreetMap — мапа світу, створена такими ж людьми, як і ви, для
       вільного використання під відкритою ліцензією.
     intro_2_create_account: Створіть обліковий запис
-    hosting_partners_html: Хостинг підтримується %{ucl}, %{fastly}, %{bytemark} та
+    hosting_partners_2024_html: Хостинг підтримується %{fastly}, %{corpmembers} та
       іншими %{partners}.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
+    partners_corpmembers: Корпоративні члени OSMF
     partners_partners: партнерами
     tou: Умови використання
     osm_offline: База даних OpenStreetMap в даний момент недоступна, бо саме проводиться
@@ -1670,6 +1707,7 @@ uk:
     more: Більше
   user_mailer:
     diary_comment_notification:
+      description: 'Запис у щоденнику OpenStreetMap #%{id}'
       subject: '[OpenStreetMap] %{user} залишив коментар у вашому щоденнику'
       hi: Привіт, %{to_user},
       header: '%{from_user} прокоментував ваш допис у щоденнику у OpenStreetMap з
@@ -1679,6 +1717,9 @@ uk:
         або відповісти — %{replyurl}
       footer_html: Ви можете ознайомитись з коментарем за посиланням %{readurl}, відповісти
         на коментар - %{commenturl}, чи надіслати повідомлення автору - %{replyurl}
+      footer_unsubscribe: Ви можете скасувати підписку на обговорення за адресою %{unsubscribeurl}
+      footer_unsubscribe_html: Ви можете скасувати підписку на обговорення за адресою
+        %{unsubscribeurl}
     message_notification:
       subject: '[OpenStreetMap] %{message_title}'
       hi: Привіт, %{to_user},
@@ -1716,6 +1757,8 @@ uk:
         few: 'успішно завантажено %{trace_points} точки з %{count} можливих. '
         many: успішно завантажено %{trace_points} точок з %{count} можливих.
         other: ""
+      all_your_traces_html: Усі успішно завантажені треки GPX можна знайти за адресою
+        %{url}.
       subject: '[OpenStreetMap] Імпорт GPX пройшов успішно'
     signup_confirm:
       subject: '[OpenStreetMap] Ласкаво просимо до OpenStreetMap'
@@ -1741,6 +1784,7 @@ uk:
       click_the_link: Якщо це ви, будь ласка, клацніть на посилання нижче, щоб змінити
         свій пароль.
     note_comment_notification:
+      description: 'Нотатка OpenStreetMap #%{id}'
       anonymous: Анонімний учасник
       greeting: Привіт,
       commented:
@@ -1778,6 +1822,7 @@ uk:
       details: Докладніше про нотатку %{url}.
       details_html: Докладніше про нотатку %{url}.
     changeset_comment_notification:
+      description: 'Набір змін OpenStreetMap #%{id}'
       hi: Привіт %{to_user},
       greeting: Привіт,
       commented:
@@ -1798,10 +1843,10 @@ uk:
         partial_changeset_without_comment: без коментарів
       details: Більше деталей про зміни, які можуть бути знайдені в %{url}.
       details_html: Більше деталей про набір змін можна знайти за посиланням - %{url}.
-      unsubscribe: Щоб відмовитись від отримання повідомлень для цього набору змін,
-        Ð¿ÐµÑ\80ейдÑ\96Ñ\82Ñ\8c Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм %{url} Ð¹ Ð½Ð°Ñ\82иÑ\81нÑ\96Ñ\82Ñ\8c ÐºÐ½Ð¾Ð¿ÐºÑ\83 â\80\9eÐ\92Ñ\96дпиÑ\81аÑ\82иÑ\81Ñ\8câ\80\9c.
+      unsubscribe: Щоб відмовитись від отримання повідомлень для цього набору змін
+        Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм %{url}.
       unsubscribe_html: Щоб відмовитись від отримання повідомлень для цього набору
-        змін, перейдіть за посиланням %{url} й натисніть кнопку «Відписатись».
+        змін за посиланням %{url}.
   confirmations:
     confirm:
       heading: Перевірте вашу електронну пошту!
@@ -1922,10 +1967,13 @@ uk:
     new:
       title: Відновлення пароля
       heading: Забули пароль?
-      email address: 'Адреса ел. пошти:'
+      email address: Адреса ел. пошти
       new password button: Вишліть мені новий пароль
       help_text: Введіть адресу вашої електронної пошти, яку ви використовували для
         реєстрації, і ми надішлемо інструкції, як можна відновити ваш пароль.
+    create:
+      send_paranoid_instructions: Якщо адреса вашої електронної пошти є в нашій базі,
+        ви отримаєте посилання для відновлення пароля через кілька хвилин.
     edit:
       title: Скидання пароля
       heading: Скидання пароля для %{user}
@@ -1978,8 +2026,8 @@ uk:
     new:
       title: Ласкаво просимо
       heading: Ласкаво просимо
-      email or username: 'Ел. пошта або прізвисько:'
-      password: 'Пароль:'
+      email or username: Ел. пошта або прізвисько
+      password: Пароль
       remember: Запам’ятати мене
       lost password link: Забули пароль?
       login_button: Увійти
@@ -2329,8 +2377,8 @@ uk:
         title: Посібник новачка
         description: Посібник для новачків від спільноти.
       community:
-        title: Форум спільноти
-        description: Місце де можна поспілкуватись про OpenStreetMap.
+        title: Ð\94опомога Ñ\82а Ð¤Ð¾Ñ\80Ñ\83м Ñ\81пÑ\96лÑ\8cноÑ\82и
+        description: Ð\9cÑ\96Ñ\81Ñ\86е Ð´Ðµ Ð¼Ð¾Ð¶Ð½Ð° Ð¾Ñ\82Ñ\80имаÑ\82и Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ñ\83 Ñ\82а Ð¿Ð¾Ñ\81пÑ\96лкÑ\83ваÑ\82иÑ\81Ñ\8c Ð¿Ñ\80о OpenStreetMap.
       mailing_lists:
         title: Списки розсилки
         description: Поставте запитання або обговоріть цікаві речі у широкому виборі
@@ -2443,6 +2491,7 @@ uk:
           allotments: Сади-городи, дачні ділянки
           pitch: Спортмайданчик
           centre: Спортивний центр
+          beach: Пляж
           reserve: Заповідник
           military: Військова зона
           school: Школа
@@ -2460,7 +2509,9 @@ uk:
           bus_stop: Автобусна зупинка
           stop: Зупинка
           bicycle_shop: Веломагазин
+          bicycle_rental: Прокат велосипедів
           bicycle_parking: Велопарковка
+          bicycle_parking_small: Невелика велопарковка
           toilets: Туалети
     welcome:
       title: Ласкаво просимо!
@@ -2719,6 +2770,7 @@ uk:
   oauth_clients:
     new:
       title: Зареєструвати новий застосунок
+      disabled: Реєстрацію програм OAuth 1 вимкнено
     edit:
       title: Змінити дані вашого застосунку
     show:
@@ -2802,6 +2854,7 @@ uk:
       title: Авторизовані застосунки
       application: Застосунок
       permissions: Дозволи
+      last_authorized: Останній авторизований
       no_applications_html: У вас ще немає застосунків авторизованих через %{oauth2}.
     application:
       revoke: Відкликати доступ
@@ -2923,6 +2976,7 @@ uk:
           importer: Відкликати доступ на імпорт
       block_history: Активні блокування
       moderator_history: Створені блокування
+      revoke_all_blocks: Скасувати всі блокування
       comments: Коментарі
       create_block: Заблокувати цього учасника
       activate_user: Активувати цього учасника
@@ -3033,6 +3087,18 @@ uk:
       confirm: Ви впевнені, що бажаєте зняти це блокування?
       revoke: Зняти блокування!
       flash: Це блокування було знято.
+    revoke_all:
+      title: Зняти блокування з %{block_on}
+      heading_html: Зняти блокування з %{block_on}
+      empty: '%{name} не має активних блоків.'
+      confirm: Ви впевнені, що бажаєте відкликати %{active_blocks}?
+      active_blocks:
+        one: '%{count} активне блокування'
+        few: '%{count} активні блокування'
+        many: '%{count} активних блокувань'
+        other: ""
+      revoke: Відкликати!
+      flash: Усі активні блокування скасовано.
     helper:
       time_future_html: До закінчення %{time}.
       until_login: Активне доти, доки учасник не здійснить вхід.
index be8c2f827bad824a0539937bd85fcd1432e98a91..205ffe5a908d8a0827fc50225ad6d97d9b443eaa 100644 (file)
@@ -1413,11 +1413,7 @@ vi:
     intro_text: OpenStreetMap là bản đồ thế giới do những người như bạn xây dựng và
       cho phép sử dụng thoải mái theo một giấy phép nguồn mở.
     intro_2_create_account: Mở tài khoản mới
-    hosting_partners_html: Dịch vụ lưu trữ nhờ sự hỗ trợ của %{ucl}, %{fastly}, %{bytemark},
-      và %{partners} khác.
-    partners_ucl: UCL
     partners_fastly: Fastly
-    partners_bytemark: Bytemark Hosting
     partners_partners: các công ty bảo trợ
     tou: Điều khoản sử dụng
     osm_offline: Cơ sở dữ liệu OpenStreetMap đang ngoại tuyến trong lúc đang thực
index 43ae11f0793086210250f2fac3ee544f30a8d226..516c14511ae5cc7b64d1f513fac8ed9f332baf8c 100644 (file)
@@ -1620,10 +1620,7 @@ zh-CN:
     intro_header: 欢迎访问 OpenStreetMap!
     intro_text: OpenStreetMap 是一个世界地图,由像您一样的人们所构筑,可依据开放许可协议自由使用。
     intro_2_create_account: 创建用户账户
-    hosting_partners_html: 主机由%{ucl}、%{fastly}、%{bytemark},以及其他%{partners}所支持。
-    partners_ucl: 伦敦大学学院
     partners_fastly: Fastly
-    partners_bytemark: Bytemark主机
     partners_partners: 合作伙伴
     tou: 使用条款
     osm_offline: 由于正在进行基本的数据库维护工作,OpenStreetMap 数据库目前处于脱机状态。
@@ -1909,7 +1906,7 @@ zh-CN:
           title: 使用Google登录
           alt: 使用Google OpenID登录
         facebook:
-          title: 使用脸书登录
+          title: 使用Facebook登录
           alt: 使用Facebook账户登录
         microsoft:
           title: 使用Microsoft登录
index 4d69e96d9a02ed5c6a9c744bd2805d8bb03cc288..bb4e9b4264c0a4f8919d880642cf9dc04751daa2 100644 (file)
@@ -1595,10 +1595,9 @@ zh-TW:
     intro_header: 歡迎來到 OpenStreetMap!
     intro_text: OpenStreetMap 是一幅世界地圖,由像您這樣的人們所建立,在開放授權下可以自由使用。
     intro_2_create_account: 建立使用者帳號
-    hosting_partners_html: 由%{ucl}、%{fastly}、%{bytemark},和其他%{partners}支援代管。
-    partners_ucl: 倫敦大學學院
+    hosting_partners_2024_html: 由%{fastly}、%{corpmembers},和其他%{partners}支援代管。
     partners_fastly: Fastly
-    partners_bytemark: Bytemark ä¸»æ©\9f代管
+    partners_corpmembers: OSMF å\9c\98é«\94æ\88\90å\93¡
     partners_partners: 合作夥伴
     tou: 使用條款
     osm_offline: OpenStreetMap 資料庫目前正在離線,直到必要的資料庫維護工作完成為止。
index 842da82b3dc770198f2b79974e4f24018a22fed5..224639464fcbb1dfa3dccfb33544e459c09529be 100644 (file)
@@ -109,16 +109,18 @@ OpenStreetMap::Application.routes.draw do
   end
 
   # Data browsing
-  get "/way/:id" => "browse#way", :id => /\d+/, :as => :way
-  get "/way/:id/history" => "browse#way_history", :id => /\d+/, :as => :way_history
+  get "/way/:id" => "ways#show", :id => /\d+/, :as => :way
+  get "/way/:id/history" => "old_ways#index", :id => /\d+/, :as => :way_history
   resources :old_ways, :path => "/way/:id/history", :id => /\d+/, :version => /\d+/, :param => :version, :only => :show
-  get "/node/:id" => "browse#node", :id => /\d+/, :as => :node
-  get "/node/:id/history" => "browse#node_history", :id => /\d+/, :as => :node_history
+  get "/node/:id" => "nodes#show", :id => /\d+/, :as => :node
+  get "/node/:id/history" => "old_nodes#index", :id => /\d+/, :as => :node_history
   resources :old_nodes, :path => "/node/:id/history", :id => /\d+/, :version => /\d+/, :param => :version, :only => :show
-  get "/relation/:id" => "browse#relation", :id => /\d+/, :as => :relation
-  get "/relation/:id/history" => "browse#relation_history", :id => /\d+/, :as => :relation_history
+  get "/relation/:id" => "relations#show", :id => /\d+/, :as => :relation
+  get "/relation/:id/history" => "old_relations#index", :id => /\d+/, :as => :relation_history
   resources :old_relations, :path => "/relation/:id/history", :id => /\d+/, :version => /\d+/, :param => :version, :only => :show
-  resources :changesets, :path => "changeset", :id => /\d+/, :only => :show
+  resources :changesets, :path => "changeset", :id => /\d+/, :only => :show do
+    match :subscribe, :unsubscribe, :on => :member, :via => [:get, :post]
+  end
   get "/changeset/:id/comments/feed" => "changeset_comments#index", :as => :changeset_comments_feed, :id => /\d*/, :defaults => { :format => "rss" }
   resources :notes, :path => "note", :only => [:show, :new]
 
@@ -127,8 +129,6 @@ OpenStreetMap::Application.routes.draw do
   get "/user/:display_name/notes" => "notes#index", :as => :user_notes
   get "/history/friends" => "changesets#index", :friends => true, :as => "friend_changesets", :defaults => { :format => :html }
   get "/history/nearby" => "changesets#index", :nearby => true, :as => "nearby_changesets", :defaults => { :format => :html }
-  match "/changeset/:id/subscribe" => "changesets#subscribe", :via => [:get, :post], :as => "changeset_subscribe"
-  match "/changeset/:id/unsubscribe" => "changesets#unsubscribe", :via => [:get, :post], :as => "changeset_unsubscribe"
 
   get "/browse/way/:id",                :to => redirect(:path => "/way/%{id}")
   get "/browse/way/:id/history",        :to => redirect(:path => "/way/%{id}/history")
index ef8f0e371feb924e35651e227fe47dbaf279f572..63c8090a83d735929ab1421fcafb0d935dc813aa 100644 (file)
@@ -29,7 +29,7 @@ class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
     within "form", :text => "Email Address or Username" do
       fill_in "username", :with => user.email
       fill_in "password", :with => "test"
-      click_on "Login"
+      click_on "Log in"
     end
   end
 
index fcdd7c752163136e1a6f8eaa650aecb94feb80d0..1844dcc6cc253e90d49d38bc57ca600236daa3ef 100644 (file)
@@ -4,337 +4,15 @@ class BrowseControllerTest < ActionDispatch::IntegrationTest
   ##
   # test all routes which lead to this controller
   def test_routes
-    assert_routing(
-      { :path => "/node/1", :method => :get },
-      { :controller => "browse", :action => "node", :id => "1" }
-    )
-    assert_routing(
-      { :path => "/node/1/history", :method => :get },
-      { :controller => "browse", :action => "node_history", :id => "1" }
-    )
-    assert_routing(
-      { :path => "/way/1", :method => :get },
-      { :controller => "browse", :action => "way", :id => "1" }
-    )
-    assert_routing(
-      { :path => "/way/1/history", :method => :get },
-      { :controller => "browse", :action => "way_history", :id => "1" }
-    )
-    assert_routing(
-      { :path => "/relation/1", :method => :get },
-      { :controller => "browse", :action => "relation", :id => "1" }
-    )
-    assert_routing(
-      { :path => "/relation/1/history", :method => :get },
-      { :controller => "browse", :action => "relation_history", :id => "1" }
-    )
     assert_routing(
       { :path => "/query", :method => :get },
       { :controller => "browse", :action => "query" }
     )
   end
 
-  def test_read_relation
-    relation = create(:relation)
-    sidebar_browse_check :relation_path, relation.id, "browse/feature"
-    assert_select "h4", /^Version/ do
-      assert_select "a[href='#{old_relation_path relation, 1}']", :text => "1", :count => 1
-    end
-    assert_select ".secondary-actions a[href='#{api_relation_path relation}']", :count => 1
-    assert_select ".secondary-actions a[href='#{relation_history_path relation}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_relation_path relation, 1}']", :count => 0
-  end
-
-  def test_multiple_version_relation_links
-    relation = create(:relation, :with_history, :version => 2)
-    sidebar_browse_check :relation_path, relation.id, "browse/feature"
-    assert_select ".secondary-actions a[href='#{relation_history_path relation}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_relation_path relation, 1}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_relation_path relation, 2}']", :count => 1
-  end
-
-  def test_read_relation_history
-    relation = create(:relation, :with_history)
-    sidebar_browse_check :relation_history_path, relation.id, "browse/history"
-    assert_select "h4", /^Version/ do
-      assert_select "a[href='#{old_relation_path relation, 1}']", :text => "1", :count => 1
-    end
-  end
-
-  def test_read_way
-    way = create(:way)
-    sidebar_browse_check :way_path, way.id, "browse/feature"
-    assert_select "h4", /^Version/ do
-      assert_select "a[href='#{old_way_path way, 1}']", :text => "1", :count => 1
-    end
-    assert_select ".secondary-actions a[href='#{api_way_path way}']", :count => 1
-    assert_select ".secondary-actions a[href='#{way_history_path way}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_way_path way, 1}']", :count => 0
-  end
-
-  def test_multiple_version_way_links
-    way = create(:way, :with_history, :version => 2)
-    sidebar_browse_check :way_path, way.id, "browse/feature"
-    assert_select ".secondary-actions a[href='#{way_history_path way}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_way_path way, 1}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_way_path way, 2}']", :count => 1
-  end
-
-  def test_read_way_history
-    way = create(:way, :with_history)
-    sidebar_browse_check :way_history_path, way.id, "browse/history"
-    assert_select "h4", /^Version/ do
-      assert_select "a[href='#{old_way_path way, 1}']", :text => "1", :count => 1
-    end
-  end
-
-  def test_read_node
-    node = create(:node)
-    sidebar_browse_check :node_path, node.id, "browse/feature"
-    assert_select "h4", /^Version/ do
-      assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
-    end
-    assert_select ".secondary-actions a[href='#{api_node_path node}']", :count => 1
-    assert_select ".secondary-actions a[href='#{node_history_path node}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_node_path node, 1}']", :count => 0
-  end
-
-  def test_multiple_version_node_links
-    node = create(:node, :with_history, :version => 2)
-    sidebar_browse_check :node_path, node.id, "browse/feature"
-    assert_select ".secondary-actions a[href='#{node_history_path node}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_node_path node, 1}']", :count => 1
-    assert_select ".secondary-actions a[href='#{old_node_path node, 2}']", :count => 1
-  end
-
-  def test_read_deleted_node
-    node = create(:node, :visible => false)
-    sidebar_browse_check :node_path, node.id, "browse/feature"
-    assert_select "h4", /^Version/ do
-      assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
-    end
-    assert_select "a[href='#{api_node_path node}']", :count => 0
-  end
-
-  def test_read_node_history
-    node = create(:node, :with_history)
-    sidebar_browse_check :node_history_path, node.id, "browse/history"
-    assert_select "h4", /^Version/ do
-      assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
-    end
-  end
-
-  ##
-  #  Methods to check redaction.
-  #
-  # note that these are presently highly reliant on the structure of the
-  # page for the selection tests, which doesn't work out particularly
-  # well if that structure changes. so... if you change the page layout
-  # then please make it more easily (and robustly) testable!
-  ##
-  def test_redacted_node
-    node = create(:node, :with_history, :deleted, :version => 2)
-    node_v1 = node.old_nodes.find_by(:version => 1)
-    node_v1.redact!(create(:redaction))
-
-    get node_path(:id => node)
-    assert_response :success
-    assert_template "feature"
-
-    # check that we don't show lat/lon for a redacted node.
-    assert_select ".browse-section", 1
-    assert_select ".browse-section.browse-node", 1
-    assert_select ".browse-section.browse-node .latitude", 0
-    assert_select ".browse-section.browse-node .longitude", 0
-  end
-
-  def test_redacted_node_history
-    node = create(:node, :with_history, :deleted, :version => 2)
-    node_v1 = node.old_nodes.find_by(:version => 1)
-    node_v1.redact!(create(:redaction))
-
-    get node_history_path(:id => node)
-    assert_response :success
-    assert_template "browse/history"
-
-    # there are 2 revisions of the redacted node, but only one
-    # should be showing details here.
-    assert_select ".browse-section", 2
-    assert_select ".browse-section.browse-redacted", 1
-    assert_select ".browse-section.browse-node", 1
-    assert_select ".browse-section.browse-node .latitude", 0
-    assert_select ".browse-section.browse-node .longitude", 0
-  end
-
-  def test_redacted_node_unredacted_history
-    session_for(create(:moderator_user))
-    node = create(:node, :with_history, :deleted, :version => 2)
-    node_v1 = node.old_nodes.find_by(:version => 1)
-    node_v1.redact!(create(:redaction))
-
-    get node_history_path(:id => node, :params => { :show_redactions => true })
-    assert_response :success
-    assert_template "browse/history"
-
-    assert_select ".browse-section", 2
-    assert_select ".browse-section.browse-redacted", 0
-    assert_select ".browse-section.browse-node", 2
-  end
-
-  def test_redacted_way_history
-    way = create(:way, :with_history, :version => 4)
-    way_v1 = way.old_ways.find_by(:version => 1)
-    way_v1.redact!(create(:redaction))
-    way_v3 = way.old_ways.find_by(:version => 3)
-    way_v3.redact!(create(:redaction))
-
-    get way_history_path(:id => way)
-    assert_response :success
-    assert_template "browse/history"
-
-    # there are 4 revisions of the redacted way, but only 2
-    # should be showing details here.
-    assert_select ".browse-section", 4
-    assert_select ".browse-section.browse-redacted", 2
-    assert_select ".browse-section.browse-way", 2
-  end
-
-  def test_redacted_way_unredacted_history
-    session_for(create(:moderator_user))
-    way = create(:way, :with_history, :version => 4)
-    way_v1 = way.old_ways.find_by(:version => 1)
-    way_v1.redact!(create(:redaction))
-    way_v3 = way.old_ways.find_by(:version => 3)
-    way_v3.redact!(create(:redaction))
-
-    get way_history_path(:id => way, :params => { :show_redactions => true })
-    assert_response :success
-    assert_template "browse/history"
-
-    assert_select ".browse-section", 4
-    assert_select ".browse-section.browse-redacted", 0
-    assert_select ".browse-section.browse-way", 4
-  end
-
-  def test_redacted_relation_history
-    relation = create(:relation, :with_history, :version => 4)
-    relation_v1 = relation.old_relations.find_by(:version => 1)
-    relation_v1.redact!(create(:redaction))
-    relation_v3 = relation.old_relations.find_by(:version => 3)
-    relation_v3.redact!(create(:redaction))
-
-    get relation_history_path(:id => relation)
-    assert_response :success
-    assert_template "browse/history"
-
-    # there are 4 revisions of the redacted relation, but only 2
-    # should be showing details here.
-    assert_select ".browse-section", 4
-    assert_select ".browse-section.browse-redacted", 2
-    assert_select ".browse-section.browse-relation", 2
-  end
-
-  def test_redacted_relation_unredacted_history
-    session_for(create(:moderator_user))
-    relation = create(:relation, :with_history, :version => 4)
-    relation_v1 = relation.old_relations.find_by(:version => 1)
-    relation_v1.redact!(create(:redaction))
-    relation_v3 = relation.old_relations.find_by(:version => 3)
-    relation_v3.redact!(create(:redaction))
-
-    get relation_history_path(:id => relation, :params => { :show_redactions => true })
-    assert_response :success
-    assert_template "browse/history"
-
-    assert_select ".browse-section", 4
-    assert_select ".browse-section.browse-redacted", 0
-    assert_select ".browse-section.browse-relation", 4
-  end
-
   def test_query
     get query_path
     assert_response :success
     assert_template "browse/query"
   end
-
-  def test_anonymous_user_feature_page_secondary_actions
-    node = create(:node, :with_history)
-    get node_path(:id => node)
-    assert_response :success
-    assert_select ".secondary-actions a", :text => "View Details", :count => 0
-    assert_select ".secondary-actions a", :text => "View History", :count => 1
-    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
-  end
-
-  def test_regular_user_feature_page_secondary_actions
-    session_for(create(:user))
-    node = create(:node, :with_history)
-    get node_path(:id => node)
-    assert_response :success
-    assert_select ".secondary-actions a", :text => "View Details", :count => 0
-    assert_select ".secondary-actions a", :text => "View History", :count => 1
-    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
-  end
-
-  def test_moderator_user_feature_page_secondary_actions
-    session_for(create(:moderator_user))
-    node = create(:node, :with_history)
-    get node_path(:id => node)
-    assert_response :success
-    assert_select ".secondary-actions a", :text => "View Details", :count => 0
-    assert_select ".secondary-actions a", :text => "View History", :count => 1
-    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 1
-  end
-
-  def test_anonymous_user_history_page_secondary_actions
-    node = create(:node, :with_history)
-    get node_history_path(:id => node)
-    assert_response :success
-    assert_select ".secondary-actions a", :text => "View Details", :count => 1
-    assert_select ".secondary-actions a", :text => "View History", :count => 0
-    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
-  end
-
-  def test_regular_user_history_page_secondary_actions
-    session_for(create(:user))
-    node = create(:node, :with_history)
-    get node_history_path(:id => node)
-    assert_response :success
-    assert_select ".secondary-actions a", :text => "View Details", :count => 1
-    assert_select ".secondary-actions a", :text => "View History", :count => 0
-    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
-  end
-
-  def test_moderator_user_history_page_secondary_actions
-    session_for(create(:moderator_user))
-    node = create(:node, :with_history)
-    get node_history_path(:id => node)
-    assert_response :success
-    assert_select ".secondary-actions a", :text => "View Details", :count => 1
-    assert_select ".secondary-actions a", :text => "View History", :count => 0
-    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 1
-  end
-
-  def test_anonymous_user_unredacted_history_page_secondary_actions
-    node = create(:node, :with_history)
-    get node_history_path(:id => node, :params => { :show_redactions => true })
-    assert_response :redirect
-  end
-
-  def test_regular_user_unredacted_history_page_secondary_actions
-    session_for(create(:user))
-    node = create(:node, :with_history)
-    get node_history_path(:id => node, :params => { :show_redactions => true })
-    assert_response :redirect
-  end
-
-  def test_moderator_user_unredacted_history_page_secondary_actions
-    session_for(create(:moderator_user))
-    node = create(:node, :with_history)
-    get node_history_path(:id => node, :params => { :show_redactions => true })
-    assert_response :success
-    assert_select ".secondary-actions a", :text => "View Details", :count => 1
-    assert_select ".secondary-actions a", :text => "View History", :count => 1
-    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
-  end
 end
index 0b26165250fa00ccfa74333ec97a9ec27dd9db5e..32a4e4f70545eaddb275a3055fa40f63b2251cd7 100644 (file)
@@ -266,6 +266,7 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
     assert_dom "p", :text => "tested-changeset-comment"
     assert_dom "li#c#{changeset_comment.id}" do
       assert_dom "> small", :text => /^Comment from #{commenting_user.display_name}/
+      assert_dom "a[href='#{user_path(commenting_user)}']"
     end
   end
 
@@ -316,6 +317,15 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
     end
   end
 
+  def test_show_adjacent_changesets
+    user = create(:user)
+    changesets = create_list(:changeset, 3, :user => user)
+
+    sidebar_browse_check :changeset_path, changesets[1].id, "changesets/show"
+    assert_dom "a[href='#{changeset_path changesets[0]}']", :count => 1
+    assert_dom "a[href='#{changeset_path changesets[2]}']", :count => 1
+  end
+
   ##
   # This should display the last 20 non-empty changesets
   def test_feed
@@ -402,7 +412,7 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
     other_user = create(:user)
     changeset = create(:changeset, :user => user)
-    path = changeset_subscribe_path(changeset)
+    path = subscribe_changeset_path(changeset)
 
     get path
     assert_redirected_to login_path(:referer => path)
@@ -423,7 +433,7 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
 
     session_for(other_user)
     assert_difference "changeset.subscribers.count", 1 do
-      post changeset_subscribe_path(changeset)
+      post subscribe_changeset_path(changeset)
     end
     assert_redirected_to changeset_path(changeset)
     assert changeset.reload.subscribed?(other_user)
@@ -437,20 +447,20 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
 
     # not signed in
     assert_no_difference "changeset.subscribers.count" do
-      post changeset_subscribe_path(changeset)
+      post subscribe_changeset_path(changeset)
     end
     assert_response :forbidden
 
     session_for(other_user)
 
     # bad diary id
-    post changeset_subscribe_path(999111)
+    post subscribe_changeset_path(999111)
     assert_response :not_found
 
     # trying to subscribe when already subscribed
-    post changeset_subscribe_path(changeset)
+    post subscribe_changeset_path(changeset)
     assert_no_difference "changeset.subscribers.count" do
-      post changeset_subscribe_path(changeset)
+      post subscribe_changeset_path(changeset)
     end
   end
 
@@ -458,7 +468,7 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
     other_user = create(:user)
     changeset = create(:changeset, :user => user)
-    path = changeset_unsubscribe_path(changeset)
+    path = unsubscribe_changeset_path(changeset)
 
     get path
     assert_redirected_to login_path(:referer => path)
@@ -481,7 +491,7 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
 
     session_for(other_user)
     assert_difference "changeset.subscribers.count", -1 do
-      post changeset_unsubscribe_path(changeset)
+      post unsubscribe_changeset_path(changeset)
     end
     assert_redirected_to changeset_path(changeset)
     assert_not changeset.reload.subscribed?(other_user)
@@ -495,19 +505,19 @@ class ChangesetsControllerTest < ActionDispatch::IntegrationTest
 
     # not signed in
     assert_no_difference "changeset.subscribers.count" do
-      post changeset_unsubscribe_path(changeset)
+      post unsubscribe_changeset_path(changeset)
     end
     assert_response :forbidden
 
     session_for(other_user)
 
     # bad diary id
-    post changeset_unsubscribe_path(999111)
+    post unsubscribe_changeset_path(999111)
     assert_response :not_found
 
     # trying to unsubscribe when not subscribed
     assert_no_difference "changeset.subscribers.count" do
-      post changeset_unsubscribe_path(changeset)
+      post unsubscribe_changeset_path(changeset)
     end
   end
 
index e2300e27be6f3ba05851ec6a413aaa8e9b17eda0..84d650e239ea145cc411a845169f6f8c94bc1713 100644 (file)
@@ -258,20 +258,20 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Make sure that you are redirected to the login page when you are
     # not logged in, without and with the id of the entry you want to edit
-    get edit_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    get edit_diary_entry_path(entry.user, entry)
     assert_redirected_to login_path(:referer => "/user/#{ERB::Util.u(entry.user.display_name)}/diary/#{entry.id}/edit")
 
     session_for(other_user)
 
     # Verify that you get redirected to show if you are not the user
     # that created the entry
-    get edit_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    get edit_diary_entry_path(entry.user, entry)
     assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
 
     session_for(entry.user)
 
     # Verify that you get a not found error, when you pass a bogus id
-    get edit_diary_entry_path(:display_name => entry.user.display_name, :id => 9999)
+    get edit_diary_entry_path(entry.user, :id => 9999)
     assert_response :not_found
     assert_select "div.content-heading", :count => 1 do
       assert_select "h1", :text => "No entry with the id: 9999", :count => 1
@@ -279,7 +279,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Now pass the id, and check that you can edit it, when using the same
     # user as the person who created the entry
-    get edit_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    get edit_diary_entry_path(entry.user, entry)
     assert_response :success
     assert_select "title", :text => /Edit Diary Entry/, :count => 1
     assert_select "div.content-heading", :count => 1 do
@@ -305,13 +305,13 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     new_latitude = "1.1"
     new_longitude = "2.2"
     new_language_code = "en"
-    put diary_entry_path(:display_name => entry.user.display_name, :id => entry, :commit => "save",
-                         :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
-                                           :longitude => new_longitude, :language_code => new_language_code })
+    put diary_entry_path(entry.user, entry, :commit => "save",
+                                            :diary_entry => { :title => new_title, :body => new_body, :latitude => new_latitude,
+                                                              :longitude => new_longitude, :language_code => new_language_code })
     assert_redirected_to :action => :show, :display_name => entry.user.display_name, :id => entry.id
 
     # Now check that the new data is rendered, when logged in
-    get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    get diary_entry_path(entry.user, entry)
     assert_response :success
     assert_template "show"
     assert_select "title", :text => /Users' Diaries | /, :count => 1
@@ -330,7 +330,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # and when not logged in as the user who wrote the entry
     session_for(create(:user))
-    get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    get diary_entry_path(entry.user, entry)
     assert_response :success
     assert_template "show"
     assert_select "title", :text => /Users' Diaries | /, :count => 1
@@ -352,7 +352,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
     diary_entry = create(:diary_entry, :language_code => "en", :user => user)
     session_for(user)
-    get edit_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    get edit_diary_entry_path(user, diary_entry)
     assert_response :success
     assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry"
   end
@@ -364,13 +364,13 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     create(:diary_entry_subscription, :diary_entry => entry, :user => user)
 
     # Make sure that you are denied when you are not logged in
-    post comment_diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    post comment_diary_entry_path(entry.user, entry)
     assert_response :forbidden
 
     session_for(other_user)
 
     # Verify that you get a not found error, when you pass a bogus id
-    post comment_diary_entry_path(:display_name => entry.user.display_name, :id => 9999)
+    post comment_diary_entry_path(entry.user, :id => 9999)
     assert_response :not_found
     assert_select "div.content-heading", :count => 1 do
       assert_select "h1", :text => "No entry with the id: 9999", :count => 1
@@ -381,7 +381,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
       assert_no_difference "DiaryComment.count" do
         assert_no_difference "entry.subscribers.count" do
           perform_enqueued_jobs do
-            post comment_diary_entry_path(:display_name => entry.user.display_name, :id => entry, :diary_comment => { :body => "" })
+            post comment_diary_entry_path(entry.user, entry, :diary_comment => { :body => "" })
           end
         end
       end
@@ -394,7 +394,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
       assert_difference "DiaryComment.count", 1 do
         assert_difference "entry.subscribers.count", 1 do
           perform_enqueued_jobs do
-            post comment_diary_entry_path(:display_name => entry.user.display_name, :id => entry, :diary_comment => { :body => "New comment" })
+            post comment_diary_entry_path(entry.user, entry, :diary_comment => { :body => "New comment" })
           end
         end
       end
@@ -412,7 +412,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     assert_equal "New comment", comment.body
 
     # Now show the diary entry, and check the new comment is present
-    get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    get diary_entry_path(entry.user, entry)
     assert_response :success
     assert_select ".diary-comment", :count => 1 do
       assert_select "#comment#{comment.id}", :count => 1 do
@@ -437,7 +437,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     assert_difference "ActionMailer::Base.deliveries.size", 1 do
       assert_difference "DiaryComment.count", 1 do
         perform_enqueued_jobs do
-          post comment_diary_entry_path(:display_name => entry.user.display_name, :id => entry, :diary_comment => { :body => spammy_text })
+          post comment_diary_entry_path(entry.user, entry, :diary_comment => { :body => spammy_text })
         end
       end
     end
@@ -459,7 +459,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     assert_redirected_to :controller => :users, :action => :suspended
 
     # Now show the diary entry, and check the new comment is not present
-    get diary_entry_path(:display_name => entry.user.display_name, :id => entry)
+    get diary_entry_path(entry.user, entry)
     assert_response :success
     assert_select ".diary-comment", :count => 0
   end
@@ -685,7 +685,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Try a normal entry that should work
     diary_entry = create(:diary_entry, :user => user)
-    get diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    get diary_entry_path(user, diary_entry)
     assert_response :success
     assert_template :show
 
@@ -696,28 +696,28 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Try a deleted entry
     diary_entry_deleted = create(:diary_entry, :user => user, :visible => false)
-    get diary_entry_path(:display_name => user.display_name, :id => diary_entry_deleted)
+    get diary_entry_path(user, diary_entry_deleted)
     assert_response :not_found
 
     # Try an entry by a suspended user
     diary_entry_suspended_user = create(:diary_entry, :user => suspended_user)
-    get diary_entry_path(:display_name => suspended_user.display_name, :id => diary_entry_suspended_user)
+    get diary_entry_path(suspended_user, diary_entry_suspended_user)
     assert_response :not_found
 
     # Try an entry by a deleted user
     diary_entry_deleted_user = create(:diary_entry, :user => deleted_user)
-    get diary_entry_path(:display_name => deleted_user.display_name, :id => diary_entry_deleted_user)
+    get diary_entry_path(deleted_user, diary_entry_deleted_user)
     assert_response :not_found
 
     # Now try as a moderator
     session_for(create(:moderator_user))
-    get diary_entry_path(:display_name => user.display_name, :id => diary_entry_deleted)
+    get diary_entry_path(user, diary_entry_deleted)
     assert_response :success
     assert_template :show
 
     # Finally try as an administrator
     session_for(create(:administrator_user))
-    get diary_entry_path(:display_name => user.display_name, :id => diary_entry_deleted)
+    get diary_entry_path(user, diary_entry_deleted)
     assert_response :success
     assert_template :show
   end
@@ -731,7 +731,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     deleted_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => create(:user, :deleted))
     hidden_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false)
 
-    get diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    get diary_entry_path(user, diary_entry)
     assert_response :success
     assert_template :show
     assert_select "div.comments" do
@@ -747,19 +747,19 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     diary_entry = create(:diary_entry, :user => user)
 
     # Try without logging in
-    post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post hide_diary_entry_path(user, diary_entry)
     assert_response :forbidden
     assert DiaryEntry.find(diary_entry.id).visible
 
     # Now try as a normal user
     session_for(user)
-    post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post hide_diary_entry_path(user, diary_entry)
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert DiaryEntry.find(diary_entry.id).visible
 
     # Now try as a moderator
     session_for(create(:moderator_user))
-    post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post hide_diary_entry_path(user, diary_entry)
     assert_redirected_to :action => :index, :display_name => user.display_name
     assert_not DiaryEntry.find(diary_entry.id).visible
 
@@ -768,7 +768,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Finally try as an administrator
     session_for(create(:administrator_user))
-    post hide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post hide_diary_entry_path(user, diary_entry)
     assert_redirected_to :action => :index, :display_name => user.display_name
     assert_not DiaryEntry.find(diary_entry.id).visible
   end
@@ -778,19 +778,19 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Try without logging in
     diary_entry = create(:diary_entry, :user => user, :visible => false)
-    post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post unhide_diary_entry_path(user, diary_entry)
     assert_response :forbidden
     assert_not DiaryEntry.find(diary_entry.id).visible
 
     # Now try as a normal user
     session_for(user)
-    post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post unhide_diary_entry_path(user, diary_entry)
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert_not DiaryEntry.find(diary_entry.id).visible
 
     # Now try as a moderator
     session_for(create(:moderator_user))
-    post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post unhide_diary_entry_path(user, diary_entry)
     assert_redirected_to :action => :index, :display_name => user.display_name
     assert DiaryEntry.find(diary_entry.id).visible
 
@@ -799,7 +799,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Finally try as an administrator
     session_for(create(:administrator_user))
-    post unhide_diary_entry_path(:display_name => user.display_name, :id => diary_entry)
+    post unhide_diary_entry_path(user, diary_entry)
     assert_redirected_to :action => :index, :display_name => user.display_name
     assert DiaryEntry.find(diary_entry.id).visible
   end
@@ -810,19 +810,19 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     diary_comment = create(:diary_comment, :diary_entry => diary_entry)
 
     # Try without logging in
-    post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post hide_diary_comment_path(user, diary_entry, diary_comment)
     assert_response :forbidden
     assert DiaryComment.find(diary_comment.id).visible
 
     # Now try as a normal user
     session_for(user)
-    post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post hide_diary_comment_path(user, diary_entry, diary_comment)
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert DiaryComment.find(diary_comment.id).visible
 
     # Try as a moderator
     session_for(create(:moderator_user))
-    post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post hide_diary_comment_path(user, diary_entry, diary_comment)
     assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
     assert_not DiaryComment.find(diary_comment.id).visible
 
@@ -831,7 +831,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Finally try as an administrator
     session_for(create(:administrator_user))
-    post hide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post hide_diary_comment_path(user, diary_entry, diary_comment)
     assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
     assert_not DiaryComment.find(diary_comment.id).visible
   end
@@ -842,19 +842,19 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     diary_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false)
 
     # Try without logging in
-    post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post unhide_diary_comment_path(user, diary_entry, diary_comment)
     assert_response :forbidden
     assert_not DiaryComment.find(diary_comment.id).visible
 
     # Now try as a normal user
     session_for(user)
-    post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post unhide_diary_comment_path(user, diary_entry, diary_comment)
     assert_redirected_to :controller => :errors, :action => :forbidden
     assert_not DiaryComment.find(diary_comment.id).visible
 
     # Now try as a moderator
     session_for(create(:moderator_user))
-    post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post unhide_diary_comment_path(user, diary_entry, diary_comment)
     assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
     assert DiaryComment.find(diary_comment.id).visible
 
@@ -863,7 +863,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # Finally try as an administrator
     session_for(create(:administrator_user))
-    post unhide_diary_comment_path(:display_name => user.display_name, :id => diary_entry, :comment => diary_comment)
+    post unhide_diary_comment_path(user, diary_entry, diary_comment)
     assert_redirected_to :action => :show, :display_name => user.display_name, :id => diary_entry.id
     assert DiaryComment.find(diary_comment.id).visible
   end
@@ -903,7 +903,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
     other_user = create(:user)
     diary_entry = create(:diary_entry, :user => user)
-    path = diary_entry_subscribe_path(:id => diary_entry, :display_name => user.display_name)
+    path = diary_entry_subscribe_path(user, diary_entry)
 
     get path
     assert_redirected_to login_path(:referer => path)
@@ -912,7 +912,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     get path
     assert_response :success
     assert_dom ".content-body" do
-      assert_dom "a[href='#{diary_entry_path(:id => diary_entry, :display_name => user.display_name)}']", :text => diary_entry.title
+      assert_dom "a[href='#{diary_entry_path(user, diary_entry)}']", :text => diary_entry.title
       assert_dom "a[href='#{user_path(user)}']", :text => user.display_name
     end
   end
@@ -924,7 +924,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     session_for(other_user)
     assert_difference "diary_entry.subscribers.count", 1 do
-      post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
+      post diary_entry_subscribe_path(user, diary_entry)
     end
     assert_response :redirect
   end
@@ -937,20 +937,20 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # not signed in
     assert_no_difference "diary_entry.subscribers.count" do
-      post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
+      post diary_entry_subscribe_path(user, diary_entry)
     end
     assert_response :forbidden
 
     session_for(other_user)
 
     # bad diary id
-    post diary_entry_subscribe_path(:id => 999111, :display_name => "username")
+    post diary_entry_subscribe_path("username", 999111)
     assert_response :not_found
 
     # trying to subscribe when already subscribed
-    post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
+    post diary_entry_subscribe_path(user, diary_entry)
     assert_no_difference "diary_entry.subscribers.count" do
-      post diary_entry_subscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
+      post diary_entry_subscribe_path(user, diary_entry)
     end
   end
 
@@ -958,7 +958,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
     other_user = create(:user)
     diary_entry = create(:diary_entry, :user => user)
-    path = diary_entry_unsubscribe_path(:id => diary_entry, :display_name => user.display_name)
+    path = diary_entry_unsubscribe_path(user, diary_entry)
 
     get path
     assert_redirected_to login_path(:referer => path)
@@ -967,7 +967,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
     get path
     assert_response :success
     assert_dom ".content-body" do
-      assert_dom "a[href='#{diary_entry_path(:id => diary_entry, :display_name => user.display_name)}']", :text => diary_entry.title
+      assert_dom "a[href='#{diary_entry_path(user, diary_entry)}']", :text => diary_entry.title
       assert_dom "a[href='#{user_path(user)}']", :text => user.display_name
     end
   end
@@ -981,7 +981,7 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     session_for(other_user)
     assert_difference "diary_entry.subscribers.count", -1 do
-      post diary_entry_unsubscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
+      post diary_entry_unsubscribe_path(user, diary_entry)
     end
     assert_response :redirect
   end
@@ -994,19 +994,19 @@ class DiaryEntriesControllerTest < ActionDispatch::IntegrationTest
 
     # not signed in
     assert_no_difference "diary_entry.subscribers.count" do
-      post diary_entry_unsubscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
+      post diary_entry_unsubscribe_path(user, diary_entry)
     end
     assert_response :forbidden
 
     session_for(other_user)
 
     # bad diary id
-    post diary_entry_unsubscribe_path(:id => 999111, :display_name => "username")
+    post diary_entry_unsubscribe_path("username", 999111)
     assert_response :not_found
 
     # trying to unsubscribe when not subscribed
     assert_no_difference "diary_entry.subscribers.count" do
-      post diary_entry_unsubscribe_path(:id => diary_entry, :display_name => diary_entry.user.display_name)
+      post diary_entry_unsubscribe_path(user, diary_entry)
     end
   end
 
index 19de4ae8e6784ad8c4dba37ac5ac242ecb4a8869..f63a8e44982318701c6c486ecda0d283798543da 100644 (file)
@@ -32,7 +32,7 @@ class FriendshipsControllerTest < ActionDispatch::IntegrationTest
 
     # When not logged in a GET should ask us to login
     get make_friend_path(friend)
-    assert_redirected_to login_path(:referer => make_friend_path(:display_name => friend.display_name))
+    assert_redirected_to login_path(:referer => make_friend_path(friend))
 
     # When not logged in a POST should error
     post make_friend_path(friend)
@@ -113,7 +113,7 @@ class FriendshipsControllerTest < ActionDispatch::IntegrationTest
   def test_make_friend_unknown_user
     # Should error when a bogus user is specified
     session_for(create(:user))
-    get make_friend_path(:display_name => "No Such User")
+    get make_friend_path("No Such User")
     assert_response :not_found
     assert_template :no_such_user
   end
@@ -129,7 +129,7 @@ class FriendshipsControllerTest < ActionDispatch::IntegrationTest
 
     # When not logged in a GET should ask us to login
     get remove_friend_path(friend)
-    assert_redirected_to login_path(:referer => remove_friend_path(:display_name => friend.display_name))
+    assert_redirected_to login_path(:referer => remove_friend_path(friend))
 
     # When not logged in a POST should error
     post remove_friend_path, :params => { :display_name => friend.display_name }
@@ -191,7 +191,7 @@ class FriendshipsControllerTest < ActionDispatch::IntegrationTest
   def test_remove_friend_unknown_user
     # Should error when a bogus user is specified
     session_for(create(:user))
-    get remove_friend_path(:display_name => "No Such User")
+    get remove_friend_path("No Such User")
     assert_response :not_found
     assert_template :no_such_user
   end
index 4897e52bb67570bf4456a8965f2c44028344a3bd..df7146ad645686f6575c91561e3199cf5c7982f6 100644 (file)
@@ -47,8 +47,8 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
   def test_new_no_login
     # Check that the new message page requires us to login
     user = create(:user)
-    get new_message_path(:display_name => user.display_name)
-    assert_redirected_to login_path(:referer => new_message_path(:display_name => user.display_name))
+    get new_message_path(user)
+    assert_redirected_to login_path(:referer => new_message_path(user))
   end
 
   ##
@@ -60,10 +60,11 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     session_for(user)
 
     # Check that the new message page loads
-    get new_message_path(:display_name => recipient_user.display_name)
+    get new_message_path(recipient_user)
     assert_response :success
     assert_template "new"
     assert_select "title", "Send message | OpenStreetMap"
+    assert_select "a[href='#{user_path recipient_user}']", :text => recipient_user.display_name
     assert_select "form[action='/messages']", :count => 1 do
       assert_select "input[type='hidden'][name='display_name'][value='#{recipient_user.display_name}']"
       assert_select "input#message_title", :count => 1
@@ -84,8 +85,7 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     assert_difference "ActionMailer::Base.deliveries.size", 0 do
       assert_difference "Message.count", 0 do
         perform_enqueued_jobs do
-          get new_message_path(:display_name => recipient_user.display_name,
-                               :message => { :title => "Test Message", :body => "Test message body" })
+          get new_message_path(recipient_user, :message => { :title => "Test Message", :body => "Test message body" })
         end
       end
     end
@@ -197,7 +197,7 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     assert_equal "markdown", m.body_format
 
     # Asking to send a message with a bogus user name should fail
-    get new_message_path(:display_name => "non_existent_user")
+    get new_message_path("non_existent_user")
     assert_response :not_found
     assert_template "users/no_such_user"
     assert_select "h1", "The user non_existent_user does not exist"
@@ -245,7 +245,7 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     # Check that we can't reply to somebody else's message
     get message_reply_path(:message_id => unread_message)
     assert_redirected_to login_path(:referer => message_reply_path(:message_id => unread_message.id))
-    assert_equal "You are logged in as `#{other_user.display_name}' but the message you have asked to reply to was not sent to that user. Please login as the correct user in order to reply.", flash[:notice]
+    assert_equal "You are logged in as `#{other_user.display_name}' but the message you have asked to reply to was not sent to that user. Please log in as the correct user in order to reply.", flash[:notice]
 
     # Login as the right user
     session_for(recipient_user)
@@ -291,7 +291,7 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     # Check that we can't read the message
     get message_path(:id => unread_message)
     assert_redirected_to login_path(:referer => message_path(:id => unread_message.id))
-    assert_equal "You are logged in as `#{other_user.display_name}' but the message you have asked to read was not sent by or to that user. Please login as the correct user in order to read it.", flash[:notice]
+    assert_equal "You are logged in as `#{other_user.display_name}' but the message you have asked to read was not sent by or to that user. Please log in as the correct user in order to read it.", flash[:notice]
 
     # Login as the message sender
     session_for(user)
@@ -300,6 +300,7 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     get message_path(:id => unread_message)
     assert_response :success
     assert_template "show"
+    assert_select "a[href='#{user_path recipient_user}']", :text => recipient_user.display_name
     assert_not Message.find(unread_message.id).message_read
 
     # Login as the message recipient
@@ -309,6 +310,7 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     get message_path(:id => unread_message)
     assert_response :success
     assert_template "show"
+    assert_select "a[href='#{user_path user}']", :text => user.display_name
     assert Message.find(unread_message.id).message_read
 
     # Asking to read a message with no ID should fail
@@ -339,7 +341,10 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     assert_template "inbox"
     assert_select ".content-inner > table", :count => 1 do
       assert_select "tr", :count => 2
-      assert_select "tr#inbox-#{read_message.id}.inbox-row", :count => 1
+      assert_select "tr#inbox-#{read_message.id}.inbox-row", :count => 1 do
+        assert_select "a[href='#{user_path read_message.sender}']", :text => read_message.sender.display_name
+        assert_select "a[href='#{message_path read_message}']", :text => read_message.title
+      end
     end
   end
 
@@ -347,7 +352,7 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
   # test the outbox action
   def test_outbox
     user = create(:user)
-    create(:message, :sender => user)
+    message = create(:message, :sender => user)
 
     # Check that the outbox page requires us to login
     get outbox_messages_path
@@ -362,7 +367,10 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest
     assert_template "outbox"
     assert_select ".content-inner > table", :count => 1 do
       assert_select "tr", :count => 2
-      assert_select "tr.inbox-row", :count => 1
+      assert_select "tr.inbox-row", :count => 1 do
+        assert_select "a[href='#{user_path message.recipient}']", :text => message.recipient.display_name
+        assert_select "a[href='#{message_path message}']", :text => message.title
+      end
     end
   end
 
diff --git a/test/controllers/nodes_controller_test.rb b/test/controllers/nodes_controller_test.rb
new file mode 100644 (file)
index 0000000..5bb08ea
--- /dev/null
@@ -0,0 +1,93 @@
+require "test_helper"
+
+class NodesControllerTest < ActionDispatch::IntegrationTest
+  ##
+  # test all routes which lead to this controller
+  def test_routes
+    assert_routing(
+      { :path => "/node/1", :method => :get },
+      { :controller => "nodes", :action => "show", :id => "1" }
+    )
+  end
+
+  def test_show
+    node = create(:node)
+    sidebar_browse_check :node_path, node.id, "browse/feature"
+    assert_select "h4", /^Version/ do
+      assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
+    end
+    assert_select ".secondary-actions a[href='#{api_node_path node}']", :count => 1
+    assert_select ".secondary-actions a[href='#{node_history_path node}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_node_path node, 1}']", :count => 0
+  end
+
+  def test_show_multiple_versions
+    node = create(:node, :with_history, :version => 2)
+    sidebar_browse_check :node_path, node.id, "browse/feature"
+    assert_select ".secondary-actions a[href='#{node_history_path node}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_node_path node, 1}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_node_path node, 2}']", :count => 1
+  end
+
+  def test_show_relation_member
+    member = create(:node)
+    relation = create(:relation)
+    create(:relation_member, :relation => relation, :member => member)
+    sidebar_browse_check :node_path, member.id, "browse/feature"
+    assert_select "a[href='#{relation_path relation}']", :count => 1
+  end
+
+  def test_show_deleted
+    node = create(:node, :visible => false)
+    sidebar_browse_check :node_path, node.id, "browse/feature"
+    assert_select "h4", /^Version/ do
+      assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
+    end
+    assert_select "a[href='#{api_node_path node}']", :count => 0
+  end
+
+  def test_show_redacted
+    node = create(:node, :with_history, :deleted, :version => 2)
+    node_v1 = node.old_nodes.find_by(:version => 1)
+    node_v1.redact!(create(:redaction))
+
+    get node_path(node)
+    assert_response :success
+    assert_template "feature"
+
+    # check that we don't show lat/lon for a redacted node.
+    assert_select ".browse-section", 1
+    assert_select ".browse-section.browse-node", 1
+    assert_select ".browse-section.browse-node .latitude", 0
+    assert_select ".browse-section.browse-node .longitude", 0
+  end
+
+  def test_show_secondary_actions_to_anonymous_user
+    node = create(:node, :with_history)
+    get node_path(node)
+    assert_response :success
+    assert_select ".secondary-actions a", :text => "View Details", :count => 0
+    assert_select ".secondary-actions a", :text => "View History", :count => 1
+    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
+  end
+
+  def test_show_secondary_actions_to_regular_user
+    session_for(create(:user))
+    node = create(:node, :with_history)
+    get node_path(node)
+    assert_response :success
+    assert_select ".secondary-actions a", :text => "View Details", :count => 0
+    assert_select ".secondary-actions a", :text => "View History", :count => 1
+    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
+  end
+
+  def test_show_secondary_actions_to_moderator
+    session_for(create(:moderator_user))
+    node = create(:node, :with_history)
+    get node_path(node)
+    assert_response :success
+    assert_select ".secondary-actions a", :text => "View Details", :count => 0
+    assert_select ".secondary-actions a", :text => "View History", :count => 1
+    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 1
+  end
+end
index b2f14a127ea163d29f0d7bb2a5c7534027872db9..8f764a3f249b58bcad66fa7baa70a3735dff6870 100644 (file)
@@ -40,29 +40,28 @@ class NotesControllerTest < ActionDispatch::IntegrationTest
       create(:note_comment, :note => note, :author => second_user)
     end
 
-    # Note that the table rows include a header row
-    get user_notes_path(:display_name => first_user.display_name)
+    get user_notes_path(first_user)
     assert_response :success
-    assert_select "table.note_list tr", :count => 2
+    assert_select "table.note_list tbody tr", :count => 1
 
-    get user_notes_path(:display_name => second_user.display_name)
+    get user_notes_path(second_user)
     assert_response :success
-    assert_select "table.note_list tr", :count => 2
+    assert_select "table.note_list tbody tr", :count => 1
 
-    get user_notes_path(:display_name => "non-existent")
+    get user_notes_path("non-existent")
     assert_response :not_found
 
     session_for(moderator_user)
 
-    get user_notes_path(:display_name => first_user.display_name)
+    get user_notes_path(first_user)
     assert_response :success
-    assert_select "table.note_list tr", :count => 2
+    assert_select "table.note_list tbody tr", :count => 1
 
-    get user_notes_path(:display_name => second_user.display_name)
+    get user_notes_path(second_user)
     assert_response :success
-    assert_select "table.note_list tr", :count => 3
+    assert_select "table.note_list tbody tr", :count => 2
 
-    get user_notes_path(:display_name => "non-existent")
+    get user_notes_path("non-existent")
     assert_response :not_found
   end
 
@@ -73,18 +72,18 @@ class NotesControllerTest < ActionDispatch::IntegrationTest
       create(:note_comment, :note => note, :author => user)
     end
 
-    get user_notes_path(:display_name => user.display_name)
+    get user_notes_path(user)
     assert_response :success
-    assert_select "table.note_list tr", :count => 11
+    assert_select "table.note_list tbody tr", :count => 10
 
-    get user_notes_path(:display_name => user.display_name, :page => 2)
+    get user_notes_path(user, :page => 2)
     assert_response :success
-    assert_select "table.note_list tr", :count => 11
+    assert_select "table.note_list tbody tr", :count => 10
   end
 
   def test_empty_page
     user = create(:user)
-    get user_notes_path(:display_name => user.display_name)
+    get user_notes_path(user)
     assert_response :success
     assert_select "h4", :html => "No notes"
   end
index e448e09541117b2624e23ca45739c8bd5495c453..c4dd4a181a29d7199d5d43c1b5fe157d8d38e6eb 100644 (file)
@@ -39,12 +39,12 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
     create_list(:client_application, 2, :user => user)
     create_list(:access_token, 2, :user => user)
 
-    get oauth_clients_path(:display_name => user.display_name)
-    assert_redirected_to login_path(:referer => oauth_clients_path(:display_name => user.display_name))
+    get oauth_clients_path(user)
+    assert_redirected_to login_path(:referer => oauth_clients_path(user))
 
     session_for(user)
 
-    get oauth_clients_path(:display_name => user.display_name)
+    get oauth_clients_path(user)
     assert_response :success
     assert_template "index"
     assert_select "li.client_application", 2
@@ -53,12 +53,12 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
   def test_new
     user = create(:user)
 
-    get new_oauth_client_path(:display_name => user.display_name)
-    assert_redirected_to login_path(:referer => new_oauth_client_path(:display_name => user.display_name))
+    get new_oauth_client_path(user)
+    assert_redirected_to login_path(:referer => new_oauth_client_path(user))
 
     session_for(user)
 
-    get new_oauth_client_path(:display_name => user.display_name)
+    get new_oauth_client_path(user)
     assert_response :success
     assert_template "new"
     assert_select "form", 1 do
@@ -76,13 +76,13 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
 
     with_settings(:oauth_10_registration => false) do
-      get new_oauth_client_path(:display_name => user.display_name)
-      assert_redirected_to login_path(:referer => new_oauth_client_path(:display_name => user.display_name))
+      get new_oauth_client_path(user)
+      assert_redirected_to login_path(:referer => new_oauth_client_path(user))
 
       session_for(user)
 
-      get new_oauth_client_path(:display_name => user.display_name)
-      assert_redirected_to oauth_clients_path(:display_name => user.display_name)
+      get new_oauth_client_path(user)
+      assert_redirected_to oauth_clients_path(user)
     end
   end
 
@@ -90,23 +90,21 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
 
     assert_difference "ClientApplication.count", 0 do
-      post oauth_clients_path(:display_name => user.display_name)
+      post oauth_clients_path(user)
     end
     assert_response :forbidden
 
     session_for(user)
 
     assert_difference "ClientApplication.count", 0 do
-      post oauth_clients_path(:display_name => user.display_name,
-                              :client_application => { :name => "Test Application" })
+      post oauth_clients_path(user, :client_application => { :name => "Test Application" })
     end
     assert_response :success
     assert_template "new"
 
     assert_difference "ClientApplication.count", 1 do
-      post oauth_clients_path(:display_name => user.display_name,
-                              :client_application => { :name => "Test Application",
-                                                       :url => "http://test.example.com/" })
+      post oauth_clients_path(user, :client_application => { :name => "Test Application",
+                                                             :url => "http://test.example.com/" })
     end
     assert_redirected_to oauth_client_path(:id => ClientApplication.find_by(:name => "Test Application").id)
   end
@@ -116,16 +114,16 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
     client = create(:client_application, :user => user)
     other_client = create(:client_application)
 
-    get oauth_client_path(:display_name => user.display_name, :id => client)
-    assert_redirected_to login_path(:referer => oauth_client_path(:display_name => user.display_name, :id => client.id))
+    get oauth_client_path(user, client)
+    assert_redirected_to login_path(:referer => oauth_client_path(user, client.id))
 
     session_for(user)
 
-    get oauth_client_path(:display_name => user.display_name, :id => other_client)
+    get oauth_client_path(user, other_client)
     assert_response :not_found
     assert_template "not_found"
 
-    get oauth_client_path(:display_name => user.display_name, :id => client)
+    get oauth_client_path(user, client)
     assert_response :success
     assert_template "show"
   end
@@ -135,16 +133,16 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
     client = create(:client_application, :user => user)
     other_client = create(:client_application)
 
-    get edit_oauth_client_path(:display_name => user.display_name, :id => client)
-    assert_redirected_to login_path(:referer => edit_oauth_client_path(:display_name => user.display_name, :id => client.id))
+    get edit_oauth_client_path(user, client)
+    assert_redirected_to login_path(:referer => edit_oauth_client_path(user, client.id))
 
     session_for(user)
 
-    get edit_oauth_client_path(:display_name => user.display_name, :id => other_client)
+    get edit_oauth_client_path(user, other_client)
     assert_response :not_found
     assert_template "not_found"
 
-    get edit_oauth_client_path(:display_name => user.display_name, :id => client)
+    get edit_oauth_client_path(user, client)
     assert_response :success
     assert_template "edit"
     assert_select "form", 1 do
@@ -163,22 +161,20 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
     client = create(:client_application, :user => user)
     other_client = create(:client_application)
 
-    put oauth_client_path(:display_name => user.display_name, :id => client)
+    put oauth_client_path(user, client)
     assert_response :forbidden
 
     session_for(user)
 
-    put oauth_client_path(:display_name => user.display_name, :id => other_client)
+    put oauth_client_path(user, other_client)
     assert_response :not_found
     assert_template "not_found"
 
-    put oauth_client_path(:display_name => user.display_name, :id => client,
-                          :client_application => { :name => "New Name", :url => nil })
+    put oauth_client_path(user, client, :client_application => { :name => "New Name", :url => nil })
     assert_response :success
     assert_template "edit"
 
-    put oauth_client_path(:display_name => user.display_name, :id => client,
-                          :client_application => { :name => "New Name", :url => "http://new.example.com/url" })
+    put oauth_client_path(user, client, :client_application => { :name => "New Name", :url => "http://new.example.com/url" })
     assert_redirected_to oauth_client_path(:id => client.id)
   end
 
@@ -188,21 +184,21 @@ class OauthClientsControllerTest < ActionDispatch::IntegrationTest
     other_client = create(:client_application)
 
     assert_difference "ClientApplication.count", 0 do
-      delete oauth_client_path(:display_name => user.display_name, :id => client)
+      delete oauth_client_path(user, client)
     end
     assert_response :forbidden
 
     session_for(user)
 
     assert_difference "ClientApplication.count", 0 do
-      delete oauth_client_path(:display_name => user.display_name, :id => other_client)
+      delete oauth_client_path(user, other_client)
     end
     assert_response :not_found
     assert_template "not_found"
 
     assert_difference "ClientApplication.count", -1 do
-      delete oauth_client_path(:display_name => user.display_name, :id => client)
+      delete oauth_client_path(user, client)
     end
-    assert_redirected_to oauth_clients_path(:display_name => user.display_name)
+    assert_redirected_to oauth_clients_path(user)
   end
 end
index 81a98766abebfca4e6e22609620f78d351cc3fe1..bb4dffdc6e74636fd8c118e9bcc8207ceb7c775a 100644 (file)
@@ -2,12 +2,109 @@ require "test_helper"
 
 class OldNodesControllerTest < ActionDispatch::IntegrationTest
   def test_routes
+    assert_routing(
+      { :path => "/node/1/history", :method => :get },
+      { :controller => "old_nodes", :action => "index", :id => "1" }
+    )
     assert_routing(
       { :path => "/node/1/history/2", :method => :get },
       { :controller => "old_nodes", :action => "show", :id => "1", :version => "2" }
     )
   end
 
+  def test_history
+    node = create(:node, :with_history)
+    sidebar_browse_check :node_history_path, node.id, "browse/history"
+    assert_select "h4", /^Version/ do
+      assert_select "a[href='#{old_node_path node, 1}']", :text => "1", :count => 1
+    end
+  end
+
+  def test_history_of_redacted
+    node = create(:node, :with_history, :deleted, :version => 2)
+    node_v1 = node.old_nodes.find_by(:version => 1)
+    node_v1.redact!(create(:redaction))
+
+    get node_history_path(:id => node)
+    assert_response :success
+    assert_template "browse/history"
+
+    # there are 2 revisions of the redacted node, but only one
+    # should be showing details here.
+    assert_select ".browse-section", 2
+    assert_select ".browse-section.browse-redacted", 1
+    assert_select ".browse-section.browse-node", 1
+    assert_select ".browse-section.browse-node .latitude", 0
+    assert_select ".browse-section.browse-node .longitude", 0
+  end
+
+  def test_unredacted_history_of_redacted
+    session_for(create(:moderator_user))
+    node = create(:node, :with_history, :deleted, :version => 2)
+    node_v1 = node.old_nodes.find_by(:version => 1)
+    node_v1.redact!(create(:redaction))
+
+    get node_history_path(:id => node, :params => { :show_redactions => true })
+    assert_response :success
+    assert_template "browse/history"
+
+    assert_select ".browse-section", 2
+    assert_select ".browse-section.browse-redacted", 0
+    assert_select ".browse-section.browse-node", 2
+  end
+
+  def test_anonymous_user_history_page_secondary_actions
+    node = create(:node, :with_history)
+    get node_history_path(:id => node)
+    assert_response :success
+    assert_select ".secondary-actions a", :text => "View Details", :count => 1
+    assert_select ".secondary-actions a", :text => "View History", :count => 0
+    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
+  end
+
+  def test_regular_user_history_page_secondary_actions
+    session_for(create(:user))
+    node = create(:node, :with_history)
+    get node_history_path(:id => node)
+    assert_response :success
+    assert_select ".secondary-actions a", :text => "View Details", :count => 1
+    assert_select ".secondary-actions a", :text => "View History", :count => 0
+    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
+  end
+
+  def test_moderator_user_history_page_secondary_actions
+    session_for(create(:moderator_user))
+    node = create(:node, :with_history)
+    get node_history_path(:id => node)
+    assert_response :success
+    assert_select ".secondary-actions a", :text => "View Details", :count => 1
+    assert_select ".secondary-actions a", :text => "View History", :count => 0
+    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 1
+  end
+
+  def test_anonymous_user_unredacted_history_page_secondary_actions
+    node = create(:node, :with_history)
+    get node_history_path(:id => node, :params => { :show_redactions => true })
+    assert_response :redirect
+  end
+
+  def test_regular_user_unredacted_history_page_secondary_actions
+    session_for(create(:user))
+    node = create(:node, :with_history)
+    get node_history_path(:id => node, :params => { :show_redactions => true })
+    assert_response :redirect
+  end
+
+  def test_moderator_user_unredacted_history_page_secondary_actions
+    session_for(create(:moderator_user))
+    node = create(:node, :with_history)
+    get node_history_path(:id => node, :params => { :show_redactions => true })
+    assert_response :success
+    assert_select ".secondary-actions a", :text => "View Details", :count => 1
+    assert_select ".secondary-actions a", :text => "View History", :count => 1
+    assert_select ".secondary-actions a", :text => "View Unredacted History", :count => 0
+  end
+
   def test_visible_with_one_version
     node = create(:node, :with_history)
     get old_node_path(node, 1)
index 66a960e6f74efa87377ed668d3ec76156da6723f..a766f8b8db113178edf13a4504c8f8a622d6f646 100644 (file)
@@ -2,12 +2,59 @@ require "test_helper"
 
 class OldRelationsControllerTest < ActionDispatch::IntegrationTest
   def test_routes
+    assert_routing(
+      { :path => "/relation/1/history", :method => :get },
+      { :controller => "old_relations", :action => "index", :id => "1" }
+    )
     assert_routing(
       { :path => "/relation/1/history/2", :method => :get },
       { :controller => "old_relations", :action => "show", :id => "1", :version => "2" }
     )
   end
 
+  def test_history
+    relation = create(:relation, :with_history)
+    sidebar_browse_check :relation_history_path, relation.id, "browse/history"
+    assert_select "h4", /^Version/ do
+      assert_select "a[href='#{old_relation_path relation, 1}']", :text => "1", :count => 1
+    end
+  end
+
+  def test_history_of_redacted
+    relation = create(:relation, :with_history, :version => 4)
+    relation_v1 = relation.old_relations.find_by(:version => 1)
+    relation_v1.redact!(create(:redaction))
+    relation_v3 = relation.old_relations.find_by(:version => 3)
+    relation_v3.redact!(create(:redaction))
+
+    get relation_history_path(:id => relation)
+    assert_response :success
+    assert_template "browse/history"
+
+    # there are 4 revisions of the redacted relation, but only 2
+    # should be showing details here.
+    assert_select ".browse-section", 4
+    assert_select ".browse-section.browse-redacted", 2
+    assert_select ".browse-section.browse-relation", 2
+  end
+
+  def test_unredacted_history_of_redacted
+    session_for(create(:moderator_user))
+    relation = create(:relation, :with_history, :version => 4)
+    relation_v1 = relation.old_relations.find_by(:version => 1)
+    relation_v1.redact!(create(:redaction))
+    relation_v3 = relation.old_relations.find_by(:version => 3)
+    relation_v3.redact!(create(:redaction))
+
+    get relation_history_path(:id => relation, :params => { :show_redactions => true })
+    assert_response :success
+    assert_template "browse/history"
+
+    assert_select ".browse-section", 4
+    assert_select ".browse-section.browse-redacted", 0
+    assert_select ".browse-section.browse-relation", 4
+  end
+
   def test_visible_with_one_version
     relation = create(:relation, :with_history)
     get old_relation_path(relation, 1)
index 65e26ef20acf912b42b220f1da4764b0d6d57e4c..6455343cfa63af9b1e4c43cb28bab6b9bbb021a6 100644 (file)
@@ -2,12 +2,59 @@ require "test_helper"
 
 class OldWaysControllerTest < ActionDispatch::IntegrationTest
   def test_routes
+    assert_routing(
+      { :path => "/way/1/history", :method => :get },
+      { :controller => "old_ways", :action => "index", :id => "1" }
+    )
     assert_routing(
       { :path => "/way/1/history/2", :method => :get },
       { :controller => "old_ways", :action => "show", :id => "1", :version => "2" }
     )
   end
 
+  def test_history
+    way = create(:way, :with_history)
+    sidebar_browse_check :way_history_path, way.id, "browse/history"
+    assert_select "h4", /^Version/ do
+      assert_select "a[href='#{old_way_path way, 1}']", :text => "1", :count => 1
+    end
+  end
+
+  def test_history_of_redacted
+    way = create(:way, :with_history, :version => 4)
+    way_v1 = way.old_ways.find_by(:version => 1)
+    way_v1.redact!(create(:redaction))
+    way_v3 = way.old_ways.find_by(:version => 3)
+    way_v3.redact!(create(:redaction))
+
+    get way_history_path(:id => way)
+    assert_response :success
+    assert_template "browse/history"
+
+    # there are 4 revisions of the redacted way, but only 2
+    # should be showing details here.
+    assert_select ".browse-section", 4
+    assert_select ".browse-section.browse-redacted", 2
+    assert_select ".browse-section.browse-way", 2
+  end
+
+  def test_unredacted_history_of_redacted
+    session_for(create(:moderator_user))
+    way = create(:way, :with_history, :version => 4)
+    way_v1 = way.old_ways.find_by(:version => 1)
+    way_v1.redact!(create(:redaction))
+    way_v3 = way.old_ways.find_by(:version => 3)
+    way_v3.redact!(create(:redaction))
+
+    get way_history_path(:id => way, :params => { :show_redactions => true })
+    assert_response :success
+    assert_template "browse/history"
+
+    assert_select ".browse-section", 4
+    assert_select ".browse-section.browse-redacted", 0
+    assert_select ".browse-section.browse-way", 4
+  end
+
   def test_visible_with_one_version
     way = create(:way, :with_history)
     get old_way_path(way, 1)
diff --git a/test/controllers/relations_controller_test.rb b/test/controllers/relations_controller_test.rb
new file mode 100644 (file)
index 0000000..926d950
--- /dev/null
@@ -0,0 +1,39 @@
+require "test_helper"
+
+class RelationsControllerTest < ActionDispatch::IntegrationTest
+  ##
+  # test all routes which lead to this controller
+  def test_routes
+    assert_routing(
+      { :path => "/relation/1", :method => :get },
+      { :controller => "relations", :action => "show", :id => "1" }
+    )
+  end
+
+  def test_show
+    relation = create(:relation)
+    sidebar_browse_check :relation_path, relation.id, "browse/feature"
+    assert_select "h4", /^Version/ do
+      assert_select "a[href='#{old_relation_path relation, 1}']", :text => "1", :count => 1
+    end
+    assert_select ".secondary-actions a[href='#{api_relation_path relation}']", :count => 1
+    assert_select ".secondary-actions a[href='#{relation_history_path relation}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_relation_path relation, 1}']", :count => 0
+  end
+
+  def test_show_multiple_versions
+    relation = create(:relation, :with_history, :version => 2)
+    sidebar_browse_check :relation_path, relation.id, "browse/feature"
+    assert_select ".secondary-actions a[href='#{relation_history_path relation}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_relation_path relation, 1}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_relation_path relation, 2}']", :count => 1
+  end
+
+  def test_show_relation_member
+    member = create(:relation)
+    relation = create(:relation)
+    create(:relation_member, :relation => relation, :member => member)
+    sidebar_browse_check :relation_path, member.id, "browse/feature"
+    assert_select "a[href='#{relation_path relation}']", :count => 1
+  end
+end
index f5ff740643b5767e8ab67e1abce4eabfa762c99b..5bd8df18d2000dd801bdb87eef7adc16bf8d215a 100644 (file)
@@ -89,13 +89,13 @@ class SiteControllerTest < ActionDispatch::IntegrationTest
   # Test the index page redirects
   def test_index_redirect
     get root_path(:node => 123)
-    assert_redirected_to :controller => :browse, :action => :node, :id => 123
+    assert_redirected_to node_path(123)
 
     get root_path(:way => 123)
-    assert_redirected_to :controller => :browse, :action => :way, :id => 123
+    assert_redirected_to way_path(123)
 
     get root_path(:relation => 123)
-    assert_redirected_to :controller => :browse, :action => :relation, :id => 123
+    assert_redirected_to relation_path(123)
 
     get root_path(:note => 123)
     assert_redirected_to :controller => :notes, :action => :show, :id => 123
@@ -131,16 +131,16 @@ class SiteControllerTest < ActionDispatch::IntegrationTest
     assert_redirected_to :controller => :site, :action => :index, :anchor => "map=3/4.8779296875/3.955078125&layers=T"
 
     get permalink_path(:code => "wBz3--", :node => 1)
-    assert_redirected_to :controller => :browse, :action => :node, :id => 1, :anchor => "map=3/4.8779296875/3.955078125"
+    assert_redirected_to node_path(1, :anchor => "map=3/4.8779296875/3.955078125")
 
     get permalink_path(:code => "wBz3--", :way => 2)
-    assert_redirected_to :controller => :browse, :action => :way, :id => 2, :anchor => "map=3/4.8779296875/3.955078125"
+    assert_redirected_to way_path(2, :anchor => "map=3/4.8779296875/3.955078125")
 
     get permalink_path(:code => "wBz3--", :relation => 3)
-    assert_redirected_to :controller => :browse, :action => :relation, :id => 3, :anchor => "map=3/4.8779296875/3.955078125"
+    assert_redirected_to relation_path(3, :anchor => "map=3/4.8779296875/3.955078125")
 
     get permalink_path(:code => "wBz3--", :changeset => 4)
-    assert_redirected_to changeset_path(:id => 4, :anchor => "map=3/4.8779296875/3.955078125")
+    assert_redirected_to changeset_path(4, :anchor => "map=3/4.8779296875/3.955078125")
   end
 
   # Test the key page
index e6f3af4f1dc0548c99ad0d41d57b7b87a0d73e00..2a6dc12dc3acb07c997eaa50993b62a95ffe29d1 100644 (file)
@@ -374,17 +374,17 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     public_trace_file = create(:trace, :visibility => "public")
 
     # First with no auth, which should work since the trace is public
-    get show_trace_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get show_trace_path(public_trace_file.user, public_trace_file)
     check_trace_show public_trace_file
 
     # Now with some other user, which should work since the trace is public
     session_for(create(:user))
-    get show_trace_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get show_trace_path(public_trace_file.user, public_trace_file)
     check_trace_show public_trace_file
 
     # And finally we should be able to do it with the owner of the trace
     session_for(public_trace_file.user)
-    get show_trace_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get show_trace_path(public_trace_file.user, public_trace_file)
     check_trace_show public_trace_file
   end
 
@@ -393,17 +393,17 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     anon_trace_file = create(:trace, :visibility => "private")
 
     # First with no auth
-    get show_trace_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get show_trace_path(anon_trace_file.user, anon_trace_file)
     assert_redirected_to :action => :index
 
     # Now with some other user, which should not work since the trace is anon
     session_for(create(:user))
-    get show_trace_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get show_trace_path(anon_trace_file.user, anon_trace_file)
     assert_redirected_to :action => :index
 
     # And finally we should be able to do it with the owner of the trace
     session_for(anon_trace_file.user)
-    get show_trace_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get show_trace_path(anon_trace_file.user, anon_trace_file)
     check_trace_show anon_trace_file
   end
 
@@ -412,12 +412,12 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     deleted_trace_file = create(:trace, :deleted)
 
     # First with a trace that has never existed
-    get show_trace_path(:display_name => create(:user).display_name, :id => 0)
+    get show_trace_path(create(:user), 0)
     assert_redirected_to :action => :index
 
     # Now with a trace that has been deleted
     session_for(deleted_trace_file.user)
-    get show_trace_path(:display_name => deleted_trace_file.user.display_name, :id => deleted_trace_file)
+    get show_trace_path(deleted_trace_file.user, deleted_trace_file)
     assert_redirected_to :action => :index
   end
 
@@ -505,17 +505,17 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     public_trace_file = create(:trace, :visibility => "public", :fixture => "a")
 
     # First with no auth, which should work since the trace is public
-    get trace_picture_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get trace_picture_path(public_trace_file.user, public_trace_file)
     check_trace_picture public_trace_file
 
     # Now with some other user, which should work since the trace is public
     session_for(create(:user))
-    get trace_picture_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get trace_picture_path(public_trace_file.user, public_trace_file)
     check_trace_picture public_trace_file
 
     # And finally we should be able to do it with the owner of the trace
     session_for(public_trace_file.user)
-    get trace_picture_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get trace_picture_path(public_trace_file.user, public_trace_file)
     check_trace_picture public_trace_file
   end
 
@@ -524,17 +524,17 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     anon_trace_file = create(:trace, :visibility => "private", :fixture => "b")
 
     # First with no auth
-    get trace_picture_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get trace_picture_path(anon_trace_file.user, anon_trace_file)
     assert_response :forbidden
 
     # Now with some other user, which shouldn't work since the trace is anon
     session_for(create(:user))
-    get trace_picture_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get trace_picture_path(anon_trace_file.user, anon_trace_file)
     assert_response :forbidden
 
     # And finally we should be able to do it with the owner of the trace
     session_for(anon_trace_file.user)
-    get trace_picture_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get trace_picture_path(anon_trace_file.user, anon_trace_file)
     check_trace_picture anon_trace_file
   end
 
@@ -543,12 +543,12 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     deleted_trace_file = create(:trace, :deleted)
 
     # First with a trace that has never existed
-    get trace_picture_path(:display_name => create(:user).display_name, :id => 0)
+    get trace_picture_path(create(:user), 0)
     assert_response :not_found
 
     # Now with a trace that has been deleted
     session_for(deleted_trace_file.user)
-    get trace_picture_path(:display_name => deleted_trace_file.user.display_name, :id => deleted_trace_file)
+    get trace_picture_path(deleted_trace_file.user, deleted_trace_file)
     assert_response :not_found
   end
 
@@ -557,17 +557,17 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     public_trace_file = create(:trace, :visibility => "public", :fixture => "a")
 
     # First with no auth, which should work since the trace is public
-    get trace_icon_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get trace_icon_path(public_trace_file.user, public_trace_file)
     check_trace_icon public_trace_file
 
     # Now with some other user, which should work since the trace is public
     session_for(create(:user))
-    get trace_icon_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get trace_icon_path(public_trace_file.user, public_trace_file)
     check_trace_icon public_trace_file
 
     # And finally we should be able to do it with the owner of the trace
     session_for(public_trace_file.user)
-    get trace_icon_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    get trace_icon_path(public_trace_file.user, public_trace_file)
     check_trace_icon public_trace_file
   end
 
@@ -576,17 +576,17 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     anon_trace_file = create(:trace, :visibility => "private", :fixture => "b")
 
     # First with no auth
-    get trace_icon_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get trace_icon_path(anon_trace_file.user, anon_trace_file)
     assert_response :forbidden
 
     # Now with some other user, which shouldn't work since the trace is anon
     session_for(create(:user))
-    get trace_icon_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get trace_icon_path(anon_trace_file.user, anon_trace_file)
     assert_response :forbidden
 
     # And finally we should be able to do it with the owner of the trace
     session_for(anon_trace_file.user)
-    get trace_icon_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    get trace_icon_path(anon_trace_file.user, anon_trace_file)
     check_trace_icon anon_trace_file
   end
 
@@ -595,12 +595,12 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     deleted_trace_file = create(:trace, :deleted)
 
     # First with a trace that has never existed
-    get trace_icon_path(:display_name => create(:user).display_name, :id => 0)
+    get trace_icon_path(create(:user), 0)
     assert_response :not_found
 
     # Now with a trace that has been deleted
     session_for(deleted_trace_file.user)
-    get trace_icon_path(:display_name => deleted_trace_file.user.display_name, :id => deleted_trace_file)
+    get trace_icon_path(deleted_trace_file.user, deleted_trace_file)
     assert_response :not_found
   end
 
@@ -833,6 +833,7 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
             assert_select row, "li", Regexp.new(Regexp.escape("#{trace.size} points")) if trace.inserted?
             assert_select row, "td", Regexp.new(Regexp.escape(trace.description))
             assert_select row, "td", Regexp.new(Regexp.escape("by #{trace.user.display_name}"))
+            assert_select row, "a[href='#{user_path trace.user}']", :text => trace.user.display_name
           end
         end
       end
@@ -845,7 +846,7 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
 
     assert_select "table", :count => 1 do
       assert_select "td", /^#{Regexp.quote(trace.name)} /
-      assert_select "td", trace.user.display_name
+      assert_select "td a[href='#{user_path trace.user}']", :text => trace.user.display_name
       assert_select "td", trace.description
     end
   end
index 9aafa3001931d79653c042576f7bba218ffbb9b2..8891e5b36dcb3eae5055d3ccd1bf60b160cc8d6d 100644 (file)
@@ -67,14 +67,23 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
   ##
   # test the index action
   def test_index
+    revoked_block = create(:user_block, :revoked)
+
+    get user_blocks_path
+    assert_response :success
+    assert_select "table#block_list tbody tr", :count => 1 do
+      assert_select "a[href='#{user_path revoked_block.user}']", :text => revoked_block.user.display_name
+      assert_select "a[href='#{user_path revoked_block.creator}']", :text => revoked_block.creator.display_name
+      assert_select "a[href='#{user_path revoked_block.revoker}']", :text => revoked_block.revoker.display_name
+    end
+
     active_block = create(:user_block)
     expired_block = create(:user_block, :expired)
-    revoked_block = create(:user_block, :revoked)
 
     get user_blocks_path
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", 4
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", 3
       assert_select "a[href='#{user_block_path(active_block)}']", 1
       assert_select "a[href='#{user_block_path(expired_block)}']", 1
       assert_select "a[href='#{user_block_path(revoked_block)}']", 1
@@ -88,14 +97,14 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
 
     get user_blocks_path
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", :count => 21
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", :count => 20
     end
 
     get user_blocks_path(:page => 2)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", :count => 21
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", :count => 20
     end
   end
 
@@ -115,14 +124,21 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     # Viewing an expired block should work
     get user_block_path(:id => expired_block)
     assert_response :success
+    assert_select "h1 a[href='#{user_path expired_block.user}']", :text => expired_block.user.display_name
+    assert_select "h1 a[href='#{user_path expired_block.creator}']", :text => expired_block.creator.display_name
 
     # Viewing a revoked block should work
     get user_block_path(:id => revoked_block)
     assert_response :success
+    assert_select "h1 a[href='#{user_path revoked_block.user}']", :text => revoked_block.user.display_name
+    assert_select "h1 a[href='#{user_path revoked_block.creator}']", :text => revoked_block.creator.display_name
+    assert_select "a[href='#{user_path revoked_block.revoker}']", :text => revoked_block.revoker.display_name
 
     # Viewing an active block should work, but shouldn't mark it as seen
     get user_block_path(:id => active_block)
     assert_response :success
+    assert_select "h1 a[href='#{user_path active_block.user}']", :text => active_block.user.display_name
+    assert_select "h1 a[href='#{user_path active_block.creator}']", :text => active_block.creator.display_name
     assert UserBlock.find(active_block.id).needs_view
 
     # Login as the blocked user
@@ -140,22 +156,23 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     target_user = create(:user)
 
     # Check that the block creation page requires us to login
-    get new_user_block_path(:display_name => target_user.display_name)
-    assert_redirected_to login_path(:referer => new_user_block_path(:display_name => target_user.display_name))
+    get new_user_block_path(target_user)
+    assert_redirected_to login_path(:referer => new_user_block_path(target_user))
 
     # Login as a normal user
     session_for(create(:user))
 
     # Check that normal users can't load the block creation page
-    get new_user_block_path(:display_name => target_user.display_name)
+    get new_user_block_path(target_user)
     assert_redirected_to :controller => "errors", :action => "forbidden"
 
     # Login as a moderator
     session_for(create(:moderator_user))
 
     # Check that the block creation page loads for moderators
-    get new_user_block_path(:display_name => target_user.display_name)
+    get new_user_block_path(target_user)
     assert_response :success
+    assert_select "h1 a[href='#{user_path target_user}']", :text => target_user.display_name
     assert_select "form#new_user_block", :count => 1 do
       assert_select "textarea#user_block_reason", :count => 1
       assert_select "select#user_block_period", :count => 1
@@ -193,6 +210,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     # Check that the block edit page loads for moderators
     get edit_user_block_path(:id => active_block)
     assert_response :success
+    assert_select "h1 a[href='#{user_path active_block.user}']", :text => active_block.user.display_name
     assert_select "form#edit_user_block_#{active_block.id}", :count => 1 do
       assert_select "textarea#user_block_reason", :count => 1
       assert_select "select#user_block_period", :count => 1
@@ -232,7 +250,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
       post user_blocks_path(:display_name => target_user.display_name,
                             :user_block_period => "99")
     end
-    assert_redirected_to new_user_block_path(:display_name => target_user.display_name)
+    assert_redirected_to new_user_block_path(target_user)
     assert_equal "The blocking period must be one of the values selectable in the drop-down list.", flash[:error]
 
     # Check that creating a block works
@@ -364,6 +382,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     get revoke_user_block_path(:id => active_block)
     assert_response :success
     assert_template "revoke"
+    assert_select "h1 a[href='#{user_path active_block.user}']", :text => active_block.user.display_name
     assert_select "form", :count => 1 do
       assert_select "input#confirm[type='checkbox']", :count => 1
       assert_select "input[type='submit'][value='Revoke!']", :count => 1
@@ -396,7 +415,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     create(:user_block, :user => blocked_user)
 
     # Asking for the revoke all blocks page with a bogus user name should fail
-    get user_blocks_on_path(:display_name => "non_existent_user")
+    get user_blocks_on_path("non_existent_user")
     assert_response :not_found
 
     # Check that the revoke all blocks page requires us to login
@@ -416,6 +435,7 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     # Check that the revoke all blocks page loads for moderators
     get revoke_all_user_blocks_path(blocked_user)
     assert_response :success
+    assert_select "h1 a[href='#{user_path blocked_user}']", :text => blocked_user.display_name
   end
 
   ##
@@ -476,31 +496,33 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     expired_block = create(:user_block, :expired, :user => unblocked_user)
 
     # Asking for a list of blocks with a bogus user name should fail
-    get user_blocks_on_path(:display_name => "non_existent_user")
+    get user_blocks_on_path("non_existent_user")
     assert_response :not_found
     assert_template "users/no_such_user"
     assert_select "h1", "The user non_existent_user does not exist"
 
     # Check the list of blocks for a user that has never been blocked
-    get user_blocks_on_path(:display_name => normal_user.display_name)
+    get user_blocks_on_path(normal_user)
     assert_response :success
     assert_select "table#block_list", false
     assert_select "p", "#{normal_user.display_name} has not been blocked yet."
 
     # Check the list of blocks for a user that is currently blocked
-    get user_blocks_on_path(:display_name => blocked_user.display_name)
+    get user_blocks_on_path(blocked_user)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", 3
+    assert_select "h1 a[href='#{user_path blocked_user}']", :text => blocked_user.display_name
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", 2
       assert_select "a[href='#{user_block_path(active_block)}']", 1
       assert_select "a[href='#{user_block_path(revoked_block)}']", 1
     end
 
     # Check the list of blocks for a user that has previously been blocked
-    get user_blocks_on_path(:display_name => unblocked_user.display_name)
+    get user_blocks_on_path(unblocked_user)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", 2
+    assert_select "h1 a[href='#{user_path unblocked_user}']", :text => unblocked_user.display_name
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", 1
       assert_select "a[href='#{user_block_path(expired_block)}']", 1
     end
   end
@@ -511,16 +533,16 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     user = create(:user)
     create_list(:user_block, 50, :user => user)
 
-    get user_blocks_on_path(:display_name => user.display_name)
+    get user_blocks_on_path(user)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", :count => 21
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", :count => 20
     end
 
-    get user_blocks_on_path(:display_name => user.display_name, :page => 2)
+    get user_blocks_on_path(user, :page => 2)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", :count => 21
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", :count => 20
     end
   end
 
@@ -535,30 +557,32 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     revoked_block = create(:user_block, :revoked, :creator => second_moderator_user)
 
     # Asking for a list of blocks with a bogus user name should fail
-    get user_blocks_by_path(:display_name => "non_existent_user")
+    get user_blocks_by_path("non_existent_user")
     assert_response :not_found
     assert_template "users/no_such_user"
     assert_select "h1", "The user non_existent_user does not exist"
 
     # Check the list of blocks given by one moderator
-    get user_blocks_by_path(:display_name => moderator_user.display_name)
+    get user_blocks_by_path(moderator_user)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", 2
+    assert_select "h1 a[href='#{user_path moderator_user}']", :text => moderator_user.display_name
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", 1
       assert_select "a[href='#{user_block_path(active_block)}']", 1
     end
 
     # Check the list of blocks given by a different moderator
-    get user_blocks_by_path(:display_name => second_moderator_user.display_name)
+    get user_blocks_by_path(second_moderator_user)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", 3
+    assert_select "h1 a[href='#{user_path second_moderator_user}']", :text => second_moderator_user.display_name
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", 2
       assert_select "a[href='#{user_block_path(expired_block)}']", 1
       assert_select "a[href='#{user_block_path(revoked_block)}']", 1
     end
 
     # Check the list of blocks (not) given by a normal user
-    get user_blocks_by_path(:display_name => normal_user.display_name)
+    get user_blocks_by_path(normal_user)
     assert_response :success
     assert_select "table#block_list", false
     assert_select "p", "#{normal_user.display_name} has not made any blocks yet."
@@ -570,16 +594,16 @@ class UserBlocksControllerTest < ActionDispatch::IntegrationTest
     user = create(:moderator_user)
     create_list(:user_block, 50, :creator => user)
 
-    get user_blocks_by_path(:display_name => user.display_name)
+    get user_blocks_by_path(user)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", :count => 21
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", :count => 20
     end
 
-    get user_blocks_by_path(:display_name => user.display_name, :page => 2)
+    get user_blocks_by_path(user, :page => 2)
     assert_response :success
-    assert_select "table#block_list", :count => 1 do
-      assert_select "tr", :count => 21
+    assert_select "table#block_list tbody", :count => 1 do
+      assert_select "tr", :count => 20
     end
   end
 end
index c2ebd3c4795772ce2b3d28255393a8f272e56c53..73b4f04245d4b4a9d757ab9a0945c0234473ab05 100644 (file)
@@ -23,14 +23,14 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
     super_user = create(:super_user)
 
     # Granting should fail when not logged in
-    post grant_role_path(:display_name => target_user.display_name, :role => "moderator")
+    post grant_role_path(target_user, "moderator")
     assert_response :forbidden
 
     # Login as an unprivileged user
     session_for(normal_user)
 
     # Granting should still fail
-    post grant_role_path(:display_name => target_user.display_name, :role => "moderator")
+    post grant_role_path(target_user, "moderator")
     assert_redirected_to :controller => :errors, :action => :forbidden
 
     # Login as an administrator
@@ -39,7 +39,7 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
     UserRole::ALL_ROLES.each do |role|
       # Granting a role to a non-existent user should fail
       assert_difference "UserRole.count", 0 do
-        post grant_role_path(:display_name => "non_existent_user", :role => role)
+        post grant_role_path("non_existent_user", role)
       end
       assert_response :not_found
       assert_template "users/no_such_user"
@@ -47,20 +47,20 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
 
       # Granting a role to a user that already has it should fail
       assert_no_difference "UserRole.count" do
-        post grant_role_path(:display_name => super_user.display_name, :role => role)
+        post grant_role_path(super_user, role)
       end
       assert_redirected_to user_path(super_user)
       assert_equal "The user already has role #{role}.", flash[:error]
 
       # Granting a role to a user that doesn't have it should work...
       assert_difference "UserRole.count", 1 do
-        post grant_role_path(:display_name => target_user.display_name, :role => role)
+        post grant_role_path(target_user, role)
       end
       assert_redirected_to user_path(target_user)
 
       # ...but trying a second time should fail
       assert_no_difference "UserRole.count" do
-        post grant_role_path(:display_name => target_user.display_name, :role => role)
+        post grant_role_path(target_user, role)
       end
       assert_redirected_to user_path(target_user)
       assert_equal "The user already has role #{role}.", flash[:error]
@@ -68,7 +68,7 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
 
     # Granting a non-existent role should fail
     assert_difference "UserRole.count", 0 do
-      post grant_role_path(:display_name => target_user.display_name, :role => "no_such_role")
+      post grant_role_path(target_user, "no_such_role")
     end
     assert_redirected_to user_path(target_user)
     assert_equal "The string `no_such_role' is not a valid role.", flash[:error]
@@ -83,14 +83,14 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
     super_user = create(:super_user)
 
     # Revoking should fail when not logged in
-    post revoke_role_path(:display_name => target_user.display_name, :role => "moderator")
+    post revoke_role_path(target_user, "moderator")
     assert_response :forbidden
 
     # Login as an unprivileged user
     session_for(normal_user)
 
     # Revoking should still fail
-    post revoke_role_path(:display_name => target_user.display_name, :role => "moderator")
+    post revoke_role_path(target_user, "moderator")
     assert_redirected_to :controller => :errors, :action => :forbidden
 
     # Login as an administrator
@@ -99,7 +99,7 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
     UserRole::ALL_ROLES.each do |role|
       # Removing a role from a non-existent user should fail
       assert_difference "UserRole.count", 0 do
-        post revoke_role_path(:display_name => "non_existent_user", :role => role)
+        post revoke_role_path("non_existent_user", role)
       end
       assert_response :not_found
       assert_template "users/no_such_user"
@@ -107,20 +107,20 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
 
       # Removing a role from a user that doesn't have it should fail
       assert_no_difference "UserRole.count" do
-        post revoke_role_path(:display_name => target_user.display_name, :role => role)
+        post revoke_role_path(target_user, role)
       end
       assert_redirected_to user_path(target_user)
       assert_equal "The user does not have role #{role}.", flash[:error]
 
       # Removing a role from a user that has it should work...
       assert_difference "UserRole.count", -1 do
-        post revoke_role_path(:display_name => super_user.display_name, :role => role)
+        post revoke_role_path(super_user, role)
       end
       assert_redirected_to user_path(super_user)
 
       # ...but trying a second time should fail
       assert_no_difference "UserRole.count" do
-        post revoke_role_path(:display_name => super_user.display_name, :role => role)
+        post revoke_role_path(super_user, role)
       end
       assert_redirected_to user_path(super_user)
       assert_equal "The user does not have role #{role}.", flash[:error]
@@ -128,13 +128,13 @@ class UserRolesControllerTest < ActionDispatch::IntegrationTest
 
     # Revoking a non-existent role should fail
     assert_difference "UserRole.count", 0 do
-      post revoke_role_path(:display_name => target_user.display_name, :role => "no_such_role")
+      post revoke_role_path(target_user, "no_such_role")
     end
     assert_redirected_to user_path(target_user)
     assert_equal "The string `no_such_role' is not a valid role.", flash[:error]
 
     # Revoking administrator role from current user should fail
-    post revoke_role_path(:display_name => administrator_user.display_name, :role => "administrator")
+    post revoke_role_path(administrator_user, "administrator")
     assert_redirected_to user_path(administrator_user)
     assert_equal "Cannot revoke administrator role from current user.", flash[:error]
   end
index 2db0f43b334531a4028e8035d3425cafb9bcb67c..4ff9e76f6763bf4e967bc5b80b9ecd6f0eac68e9 100644 (file)
@@ -416,7 +416,7 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
   # information for the user
   def test_show
     # Test a non-existent user
-    get user_path(:display_name => "unknown")
+    get user_path("unknown")
     assert_response :not_found
 
     # Test a normal user
@@ -618,19 +618,19 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
     get users_path
     assert_response :success
     assert_template :index
-    assert_select "table#user_list tr", :count => 7 + 1
+    assert_select "table#user_list tbody tr", :count => 7
 
     # Should be able to limit by status
     get users_path, :params => { :status => "suspended" }
     assert_response :success
     assert_template :index
-    assert_select "table#user_list tr", :count => 1 + 1
+    assert_select "table#user_list tbody tr", :count => 1
 
     # Should be able to limit by IP address
     get users_path, :params => { :ip => "1.2.3.4" }
     assert_response :success
     assert_template :index
-    assert_select "table#user_list tr", :count => 1 + 1
+    assert_select "table#user_list tbody tr", :count => 1
   end
 
   def test_index_get_paginated
@@ -648,17 +648,17 @@ class UsersControllerTest < ActionDispatch::IntegrationTest
     get users_path
     assert_response :success
     assert_template :index
-    assert_select "table#user_list tr", :count => 51
+    assert_select "table#user_list tbody tr", :count => 50
 
     get users_path, :params => { :page => 2 }
     assert_response :success
     assert_template :index
-    assert_select "table#user_list tr", :count => 51
+    assert_select "table#user_list tbody tr", :count => 50
 
     get users_path, :params => { :page => 3 }
     assert_response :success
     assert_template :index
-    assert_select "table#user_list tr", :count => 3
+    assert_select "table#user_list tbody tr", :count => 2
   end
 
   def test_index_post_confirm
diff --git a/test/controllers/ways_controller_test.rb b/test/controllers/ways_controller_test.rb
new file mode 100644 (file)
index 0000000..e198f7c
--- /dev/null
@@ -0,0 +1,39 @@
+require "test_helper"
+
+class WaysControllerTest < ActionDispatch::IntegrationTest
+  ##
+  # test all routes which lead to this controller
+  def test_routes
+    assert_routing(
+      { :path => "/way/1", :method => :get },
+      { :controller => "ways", :action => "show", :id => "1" }
+    )
+  end
+
+  def test_show
+    way = create(:way)
+    sidebar_browse_check :way_path, way.id, "browse/feature"
+    assert_select "h4", /^Version/ do
+      assert_select "a[href='#{old_way_path way, 1}']", :text => "1", :count => 1
+    end
+    assert_select ".secondary-actions a[href='#{api_way_path way}']", :count => 1
+    assert_select ".secondary-actions a[href='#{way_history_path way}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_way_path way, 1}']", :count => 0
+  end
+
+  def test_show_multiple_versions
+    way = create(:way, :with_history, :version => 2)
+    sidebar_browse_check :way_path, way.id, "browse/feature"
+    assert_select ".secondary-actions a[href='#{way_history_path way}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_way_path way, 1}']", :count => 1
+    assert_select ".secondary-actions a[href='#{old_way_path way, 2}']", :count => 1
+  end
+
+  def test_show_relation_member
+    member = create(:way)
+    relation = create(:relation)
+    create(:relation_member, :relation => relation, :member => member)
+    sidebar_browse_check :way_path, member.id, "browse/feature"
+    assert_select "a[href='#{relation_path relation}']", :count => 1
+  end
+end
index 044f71681f2ec9ef2432bcc98c25dd00ecb3acfc..0767dea56c777b135d66666a2a183e1e4bcd9638 100644 (file)
@@ -116,7 +116,8 @@ class UserHelperTest < ActionView::TestCase
 
   def test_auth_button
     button = auth_button("google", "google")
-    assert_equal("<a class=\"auth_button\" title=\"Login with Google\" rel=\"nofollow\" data-method=\"post\" href=\"/auth/google\"><img alt=\"Login with a Google OpenID\" class=\"rounded-3\" src=\"/images/google.svg\" /></a>", button)
+    img_tag = "<img alt=\"Log in with a Google OpenID\" class=\"rounded-3\" src=\"/images/google.svg\" width=\"36\" height=\"36\" />"
+    assert_equal("<a class=\"auth_button\" title=\"Log in with Google\" rel=\"nofollow\" data-method=\"post\" href=\"/auth/google\">#{img_tag}</a>", button)
   end
 
   private
index 998e97330059c4ab4cd41a019851131cda35893d..25123b392f3dee63f15fd129b846674c8e584321 100644 (file)
@@ -68,4 +68,19 @@ class UserMailerTest < ActionMailer::TestCase
     assert_select body, "a[href^='#{url}']"
     assert_select body, "a[href='#{unsubscribe_url}']", :count => 1
   end
+
+  def test_changeset_comment_notification
+    create(:language, :code => "en")
+    user = create(:user)
+    other_user = create(:user)
+    changeset = create(:changeset, :user => user)
+    changeset_comment = create(:changeset_comment, :changeset => changeset)
+    email = UserMailer.changeset_comment_notification(changeset_comment, other_user)
+    body = Rails::Dom::Testing.html_document_fragment.parse(email.html_part.body)
+
+    url = Rails.application.routes.url_helpers.changeset_url(changeset, :host => Settings.server_url, :protocol => Settings.server_protocol)
+    unsubscribe_url = Rails.application.routes.url_helpers.unsubscribe_changeset_url(changeset, :host => Settings.server_url, :protocol => Settings.server_protocol)
+    assert_select body, "a[href^='#{url}']"
+    assert_select body, "a[href='#{unsubscribe_url}']", :count => 1
+  end
 end