]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/4843' master live
authorTom Hughes <tom@compton.nu>
Thu, 30 May 2024 15:33:59 +0000 (16:33 +0100)
committerTom Hughes <tom@compton.nu>
Thu, 30 May 2024 15:33:59 +0000 (16:33 +0100)
121 files changed:
Gemfile
Gemfile.lock
app/assets/images/directions.png [deleted file]
app/assets/images/openid.svg [new file with mode: 0644]
app/assets/images/openid_small.png [deleted file]
app/assets/images/welcome-sprite.svg [deleted file]
app/assets/javascripts/application.js
app/assets/javascripts/index/browse.js
app/assets/javascripts/index/directions.js
app/assets/javascripts/leaflet.layers.js
app/assets/javascripts/leaflet.share.js
app/assets/stylesheets/common.scss
app/controllers/accounts_controller.rb
app/controllers/api/capabilities_controller.rb
app/controllers/api/changeset_comments_controller.rb
app/controllers/api/changesets_controller.rb
app/controllers/api/map_controller.rb
app/controllers/api/nodes_controller.rb
app/controllers/api/notes_controller.rb
app/controllers/api/old_elements_controller.rb
app/controllers/api/permissions_controller.rb
app/controllers/api/relations_controller.rb
app/controllers/api/tracepoints_controller.rb
app/controllers/api/traces_controller.rb
app/controllers/api/user_blocks_controller.rb
app/controllers/api/user_preferences_controller.rb
app/controllers/api/users_controller.rb
app/controllers/api/versions_controller.rb
app/controllers/api/ways_controller.rb
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/controllers/changesets_controller.rb
app/controllers/concerns/session_methods.rb
app/controllers/diary_entries_controller.rb
app/controllers/export_controller.rb
app/controllers/friendships_controller.rb
app/controllers/messages_controller.rb
app/controllers/oauth2_authorizations_controller.rb
app/controllers/oauth_controller.rb
app/controllers/sessions_controller.rb
app/controllers/site_controller.rb
app/controllers/users_controller.rb
app/helpers/user_helper.rb
app/models/issue.rb
app/models/trace.rb
app/models/user.rb
app/views/accounts/edit.html.erb
app/views/application/_auth_providers.html.erb
app/views/browse/_node.html.erb
app/views/browse/_relation.html.erb
app/views/browse/_way.html.erb
app/views/changesets/_heading.html.erb
app/views/changesets/show.html.erb
app/views/confirmations/confirm.html.erb
app/views/dashboards/_contact.html.erb
app/views/diary_entries/_diary_comment.html.erb
app/views/diary_entries/_diary_entry.html.erb
app/views/diary_entries/_diary_entry_heading.html.erb
app/views/diary_entries/comments.html.erb
app/views/issues/_comments.html.erb
app/views/issues/_reports.html.erb
app/views/issues/show.html.erb
app/views/layouts/_head.html.erb
app/views/layouts/_header.html.erb
app/views/layouts/_inbox.html.erb [deleted file]
app/views/layouts/_search.html.erb
app/views/notes/new.html.erb
app/views/notes/show.html.erb
app/views/oauth2_applications/_application.html.erb
app/views/oauth2_applications/show.html.erb
app/views/profiles/edit.html.erb
app/views/sessions/new.html.erb
app/views/site/_any_questions.html.erb
app/views/site/fixthemap.html.erb
app/views/site/welcome.html.erb
app/views/traces/_trace.html.erb
app/views/users/new.html.erb
app/views/users/show.html.erb
app/views/users/terms.html.erb
config/initializers/abstract_adapter.rb
config/initializers/content_security_policy.rb
config/initializers/cors.rb
config/initializers/i18n.rb
config/initializers/mail_delivery_job.rb
config/initializers/oauth.rb
config/initializers/router.rb
config/initializers/rtlcss.rb
config/initializers/secure_headers.rb [deleted file]
config/initializers/session_store.rb
config/locales/bn.yml
config/locales/br.yml
config/locales/cs.yml
config/locales/de.yml
config/locales/diq.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/et.yml
config/locales/fr.yml
config/locales/gl.yml
config/locales/ia.yml
config/locales/it.yml
config/locales/ko.yml
config/locales/ms.yml
config/locales/ne.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/pt-PT.yml
config/locales/ru.yml
config/locales/sl.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
lib/osm.rb
test/controllers/api/capabilities_controller_test.rb
test/controllers/api/versions_controller_test.rb
test/helpers/user_helper_test.rb
test/integration/user_creation_test.rb
yarn.lock

diff --git a/Gemfile b/Gemfile
index 75387b5d5e3b5c8db060e427ca352e834c6b6014..77a9f1c97ff252c30ce1cd4f66dbd1034c1307ec 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -116,9 +116,6 @@ gem "connection_pool"
 gem "dalli"
 gem "kgio"
 
-# Load secure_headers for Content-Security-Policy support
-gem "secure_headers"
-
 # Load canonical-rails to generate canonical URLs
 gem "canonical-rails"
 
index 14beee830f5a12ad1b8b2f8fde27d9d61b79ac68..4c7bba388912ab8206d1b0b1d899f04569933f40 100644 (file)
@@ -3,35 +3,35 @@ GEM
   specs:
     aasm (5.5.0)
       concurrent-ruby (~> 1.0)
-    actioncable (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actioncable (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
       zeitwerk (~> 2.6)
-    actionmailbox (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailbox (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activestorage (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       mail (>= 2.7.1)
       net-imap
       net-pop
       net-smtp
-    actionmailer (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionmailer (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      actionview (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       mail (~> 2.5, >= 2.5.4)
       net-imap
       net-pop
       net-smtp
       rails-dom-testing (~> 2.2)
-    actionpack (7.1.3.2)
-      actionview (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionpack (7.1.3.3)
+      actionview (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       nokogiri (>= 1.8.5)
       racc
       rack (>= 2.2.4)
@@ -41,39 +41,39 @@ GEM
       rails-html-sanitizer (~> 1.6)
     actionpack-page_caching (1.2.4)
       actionpack (>= 4.0.0)
-    actiontext (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actiontext (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activestorage (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    actionview (7.1.3.3)
+      activesupport (= 7.1.3.3)
       builder (~> 3.1)
       erubi (~> 1.11)
       rails-dom-testing (~> 2.2)
       rails-html-sanitizer (~> 1.6)
     active_record_union (1.3.0)
       activerecord (>= 4.0)
-    activejob (7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activejob (7.1.3.3)
+      activesupport (= 7.1.3.3)
       globalid (>= 0.3.6)
-    activemodel (7.1.3.2)
-      activesupport (= 7.1.3.2)
-    activerecord (7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activemodel (7.1.3.3)
+      activesupport (= 7.1.3.3)
+    activerecord (7.1.3.3)
+      activemodel (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       timeout (>= 0.4.0)
-    activerecord-import (1.6.0)
+    activerecord-import (1.7.0)
       activerecord (>= 4.2)
-    activestorage (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    activestorage (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       marcel (~> 1.0)
-    activesupport (7.1.3.2)
+    activesupport (7.1.3.3)
       base64
       bigdecimal
       concurrent-ruby (~> 1.0, >= 1.0.2)
@@ -95,16 +95,16 @@ GEM
     autoprefixer-rails (10.4.16.0)
       execjs (~> 2)
     aws-eventstream (1.3.0)
-    aws-partitions (1.928.0)
-    aws-sdk-core (3.196.0)
+    aws-partitions (1.934.0)
+    aws-sdk-core (3.196.1)
       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.81.0)
+    aws-sdk-kms (1.82.0)
       aws-sdk-core (~> 3, >= 3.193.0)
       aws-sigv4 (~> 1.1)
-    aws-sdk-s3 (1.150.0)
+    aws-sdk-s3 (1.151.0)
       aws-sdk-core (~> 3, >= 3.194.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.8)
@@ -140,7 +140,7 @@ GEM
     builder (3.2.4)
     bzip2-ffi (1.1.1)
       ffi (~> 1.0)
-    cancancan (3.5.0)
+    cancancan (3.6.1)
     canonical-rails (0.2.15)
       actionview (>= 4.1, <= 7.2)
     capybara (3.40.0)
@@ -153,7 +153,7 @@ GEM
       regexp_parser (>= 1.5, < 3.0)
       xpath (~> 3.2)
     concurrent-ruby (1.2.3)
-    config (5.4.0)
+    config (5.5.0)
       deep_merge (~> 1.2, >= 1.2.1)
     connection_pool (2.4.1)
     crack (1.0.0)
@@ -198,7 +198,7 @@ GEM
       concurrent-ruby (~> 1.0)
       dry-core (~> 1.0, < 2)
       zeitwerk (~> 2.6)
-    dry-schema (1.13.3)
+    dry-schema (1.13.4)
       concurrent-ruby (~> 1.0)
       dry-configurable (~> 1.0, >= 1.0.1)
       dry-core (~> 1.0, < 2)
@@ -330,7 +330,7 @@ GEM
     mini_portile2 (2.8.6)
     mini_racer (0.9.0)
       libv8-node (~> 18.19.0.0)
-    minitest (5.22.3)
+    minitest (5.23.1)
     minitest-focus (1.4.0)
       minitest (>= 4, < 6)
     msgpack (1.7.2)
@@ -369,8 +369,9 @@ GEM
       hashie (>= 3.4.6)
       rack (>= 1.6.2, < 3)
       rack-protection
-    omniauth-facebook (9.0.0)
-      omniauth-oauth2 (~> 1.2)
+    omniauth-facebook (10.0.0)
+      bigdecimal
+      omniauth-oauth2 (>= 1.2, < 3)
     omniauth-github (2.0.1)
       omniauth (~> 2.0)
       omniauth-oauth2 (~> 1.8)
@@ -412,7 +413,7 @@ GEM
     puma (5.6.8)
       nio4r (~> 2.0)
     quad_tile (1.0.1)
-    racc (1.7.3)
+    racc (1.8.0)
     rack (2.2.9)
     rack-cors (2.0.2)
       rack (>= 2.0.0)
@@ -430,20 +431,20 @@ GEM
     rackup (1.0.0)
       rack (< 3)
       webrick
-    rails (7.1.3.2)
-      actioncable (= 7.1.3.2)
-      actionmailbox (= 7.1.3.2)
-      actionmailer (= 7.1.3.2)
-      actionpack (= 7.1.3.2)
-      actiontext (= 7.1.3.2)
-      actionview (= 7.1.3.2)
-      activejob (= 7.1.3.2)
-      activemodel (= 7.1.3.2)
-      activerecord (= 7.1.3.2)
-      activestorage (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    rails (7.1.3.3)
+      actioncable (= 7.1.3.3)
+      actionmailbox (= 7.1.3.3)
+      actionmailer (= 7.1.3.3)
+      actionpack (= 7.1.3.3)
+      actiontext (= 7.1.3.3)
+      actionview (= 7.1.3.3)
+      activejob (= 7.1.3.3)
+      activemodel (= 7.1.3.3)
+      activerecord (= 7.1.3.3)
+      activestorage (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       bundler (>= 1.15.0)
-      railties (= 7.1.3.2)
+      railties (= 7.1.3.3)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -461,9 +462,9 @@ GEM
     rails_param (1.3.1)
       actionpack (>= 3.2.0)
       activesupport (>= 3.2.0)
-    railties (7.1.3.2)
-      actionpack (= 7.1.3.2)
-      activesupport (= 7.1.3.2)
+    railties (7.1.3.3)
+      actionpack (= 7.1.3.3)
+      activesupport (= 7.1.3.3)
       irb
       rackup (>= 1.0.0)
       rake (>= 12.2)
@@ -472,22 +473,23 @@ GEM
     rainbow (3.1.1)
     rake (13.2.1)
     rb-fsevent (0.11.2)
-    rb-inotify (0.10.1)
+    rb-inotify (0.11.1)
       ffi (~> 1.0)
-    rdoc (6.6.3.1)
+    rdoc (6.7.0)
       psych (>= 4.0.0)
-    regexp_parser (2.9.1)
+    regexp_parser (2.9.2)
     reline (0.5.7)
       io-console (~> 0.5)
     request_store (1.7.0)
       rack (>= 1.4)
-    rexml (3.2.6)
+    rexml (3.2.8)
+      strscan (>= 3.0.9)
     rinku (2.0.6)
     rotp (6.3.0)
     rouge (4.2.1)
     rtlcss (0.2.1)
       mini_racer (>= 0.6.3)
-    rubocop (1.63.5)
+    rubocop (1.64.0)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)
@@ -510,7 +512,7 @@ GEM
     rubocop-performance (1.21.0)
       rubocop (>= 1.48.1, < 2.0)
       rubocop-ast (>= 1.31.1, < 2.0)
-    rubocop-rails (2.24.1)
+    rubocop-rails (2.25.0)
       activesupport (>= 4.2.0)
       rack (>= 1.1)
       rubocop (>= 1.33.0, < 2.0)
@@ -528,8 +530,7 @@ GEM
     sass-embedded (1.64.2)
       google-protobuf (~> 3.23)
       rake (>= 13.0.0)
-    secure_headers (6.5.0)
-    selenium-webdriver (4.20.1)
+    selenium-webdriver (4.21.1)
       base64 (~> 0.2)
       rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2, < 3.0)
@@ -541,8 +542,7 @@ GEM
     simplecov-html (0.12.3)
     simplecov-lcov (0.8.0)
     simplecov_json_formatter (0.1.4)
-    simpleidn (0.2.2)
-      unf (~> 0.1.4)
+    simpleidn (0.2.3)
     smart_properties (1.17.0)
     snaky_hash (2.0.1)
       hashie
@@ -560,6 +560,7 @@ GEM
     stringio (3.1.0)
     strong_migrations (1.8.0)
       activerecord (>= 5.2)
+    strscan (3.1.0)
     terminal-table (3.0.2)
       unicode-display_width (>= 1.1.1, < 3)
     terser (1.2.2)
@@ -573,9 +574,6 @@ GEM
       railties (>= 6.0.0)
     tzinfo (2.0.6)
       concurrent-ruby (~> 1.0)
-    unf (0.1.4)
-      unf_ext
-    unf_ext (0.0.9.1)
     unicode-display_width (2.5.0)
     uri (0.13.0)
     validates_email_format_of (1.8.2)
@@ -583,7 +581,7 @@ GEM
       simpleidn
     vendorer (0.2.0)
     version_gem (1.1.4)
-    webmock (3.23.0)
+    webmock (3.23.1)
       addressable (>= 2.8.0)
       crack (>= 0.3.2)
       hashdiff (>= 0.4.0, < 2.0.0)
@@ -594,7 +592,7 @@ GEM
     websocket-extensions (0.1.5)
     xpath (3.2.0)
       nokogiri (~> 1.8)
-    zeitwerk (2.6.14)
+    zeitwerk (2.6.15)
 
 PLATFORMS
   ruby
@@ -688,7 +686,6 @@ DEPENDENCIES
   rubocop-rake
   sanitize
   sass-embedded (~> 1.64.0)
-  secure_headers
   selenium-webdriver
   simplecov
   simplecov-lcov
diff --git a/app/assets/images/directions.png b/app/assets/images/directions.png
deleted file mode 100644 (file)
index 197244f..0000000
Binary files a/app/assets/images/directions.png and /dev/null differ
diff --git a/app/assets/images/openid.svg b/app/assets/images/openid.svg
new file mode 100644 (file)
index 0000000..d4de589
--- /dev/null
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" width="48px" height="48px">
+  <path fill="#9E9E9E" d="M44,27l-1-9l-2.9,1.9c-2.7-1.7-6.1-2.9-9.9-3.5c0,0-1.9-0.4-4.4-0.4s-4.8,0.3-4.8,0.3C11.3,17.5,4,23,4,29.6C4,36.4,11.5,42,23,43v-3.9c-7.9-1.1-12.9-4.8-12.9-9.5c0-4.4,4.6-8.1,10.9-9.3c0,0,4.9-1.1,9.2,0.2c2.1,0.5,4,1.2,5.6,2.2L32,25L44,27z"/>
+  <path d="M23 8L23 43 29 40 29 5z"/>
+  <path fill="#FF9800" d="M23 8L23 43 29 40 29 5z"/>
+</svg>
diff --git a/app/assets/images/openid_small.png b/app/assets/images/openid_small.png
deleted file mode 100644 (file)
index 41adc9f..0000000
Binary files a/app/assets/images/openid_small.png and /dev/null differ
diff --git a/app/assets/images/welcome-sprite.svg b/app/assets/images/welcome-sprite.svg
deleted file mode 100644 (file)
index 5381a25..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="500">
-  <g transform="translate(0 -552.362)">
-    <g fill="#70cd8f">
-      <path d="M-153 412.862v-2l10-4h2v2l-4 10h-2v-6z" filter="url(#filter6591-2)"/>
-      <use xlink:href="#B"/>
-    </g>
-    <use xlink:href="#B" x="100" fill="#cd7070"/>
-    <path d="M135 582.362h-2l-3 3v2l15 15-15 15v2l3 3h2l15-15 15 15h2l3-3v-2l-15-15 15-15v-2l-3-3h-2l-15 15zm130 20c0 8.284-6.716 15-15 15s-15-6.716-15-15 6.716-15 15-15 15 6.716 15 15z" fill="#fff"/>
-    <g fill="#7092ff">
-      <path d="M519.728 582.914l19.834-15.219L580 617.362l-19.834 15.219z" opacity=".5"/>
-      <path d="M510.597 571.013l19.834-15.219 6.088 7.934-19.834 15.219zm52.613 65.535l19.834-15.219 1.198 17.988-3.967 3.044z"/>
-    </g>
-    <use xlink:href="#B" x="600" fill="#fff"/>
-    <path d="M425 639.362l-20-20v-29l20-20h68l2 2v65l-2 2zm-45.698-82a15.7 15.7 0 0 0-15.698 15.698c0 1.581.284 3.074.719 4.513l-39.113 39.113c-1.44-.435-2.932-.719-4.513-.719A15.7 15.7 0 0 0 305 631.665a15.7 15.7 0 0 0 15.698 15.698 15.7 15.7 0 0 0 15.698-15.698c0-1.581-.284-3.074-.719-4.513l39.113-39.113c1.44.435 2.932.719 4.513.719A15.7 15.7 0 0 0 395 573.06a15.7 15.7 0 0 0-15.698-15.698zm0 9.419a6.28 6.28 0 0 1 6.279 6.279 6.28 6.28 0 0 1-6.279 6.279 6.28 6.28 0 0 1-6.279-6.279 6.28 6.28 0 0 1 6.279-6.279zm-58.605 58.605a6.28 6.28 0 0 1 6.279 6.279 6.28 6.28 0 0 1-6.279 6.279 6.28 6.28 0 0 1-6.279-6.279 6.28 6.28 0 0 1 6.279-6.279zM250 557.362c-20.71 0-37.5 16.789-37.5 37.5s37.5 52.5 37.5 52.5 37.5-31.789 37.5-52.5-16.789-37.5-37.5-37.5zm1.172 22.5c8.285 0 15 6.716 15 15s-6.716 15-15 15-15-6.716-15-15 6.716-15 15-15z" fill="#7092ff"/>
-    <path d="M31 598.362h-2l-3 3v2l14 14 5 5 5-5 25-25v-2l-3-3h-2l-25 25z" fill="#fff"/>
-    <path d="M337 631.362c0 8.837-7.163 16-16 16s-16-7.163-16-16 7.163-16 16-16 16 7.163 16 16z" fill="#7092ff"/>
-    <path d="M328 631.362a7 7 0 1 1-14 0 7 7 0 1 1 14 0z" fill="#fff"/>
-    <use xlink:href="#B" x="600" fill="#7092ff"/>
-    <g fill="#fff">
-      <path d="M644.42 607.312q0-3 1.26-5.04 1.26-2.04 4.32-4.26 2.7-1.92 3.84-3.3 1.2-1.44 1.2-3.36 0-1.92-1.44-2.88-1.38-1.02-3.9-1.02-2.52 0-4.98.78-2.46.78-5.04 2.1l-3.18-6.42q2.94-1.62 6.36-2.64 3.42-1.02 7.5-1.02 6.24 0 9.66 3 3.48 3 3.48 7.62 0 2.46-.78 4.26-.78 1.8-2.34 3.36-1.56 1.5-3.9 3.24-1.74 1.26-2.7 2.16-.96.9-1.32 1.74-.3.84-.3 2.1v1.74h-7.74zm-.96 12.18q0-2.76 1.5-3.84 1.5-1.14 3.66-1.14 2.1 0 3.6 1.14 1.5 1.08 1.5 3.84 0 2.64-1.5 3.84-1.5 1.14-3.6 1.14-2.16 0-3.66-1.14-1.5-1.2-1.5-3.84z"/>
-      <rect width="10" height="15" x="415" y="597.362" rx="3" ry="2.25"/>
-    </g>
-    <use xlink:href="#B" x="700" fill="#7092ff"/>
-    <path d="M741.072 601.642q0-2.4 1.152-3.84 1.152-1.488 2.64-2.208-1.728-.96-2.688-2.256-.96-1.344-.96-3.264 0-2.88 2.448-4.512 2.448-1.68 7.008-1.68 2.688 0 4.56.48 1.872.432 3.648 1.152l-1.296 3.216q-1.632-.672-3.264-1.104-1.632-.48-3.936-.48-2.88 0-4.08.768-1.152.72-1.152 2.064 0 1.344 1.344 2.304 1.344.912 4.992 2.256 3.696 1.344 5.76 3.072 2.064 1.728 2.064 4.608 0 2.448-1.104 4.032-1.104 1.536-2.496 2.352 1.68.912 2.592 2.208.96 1.248.96 3.072 0 3.312-2.784 5.136-2.736 1.824-7.68 1.824-2.64 0-4.608-.384-1.968-.432-3.504-1.2v-3.6q1.536.72 3.792 1.344 2.256.624 4.512.624 3.552 0 4.896-1.008 1.344-1.056 1.344-2.4 0-.912-.48-1.584-.432-.672-1.776-1.392-1.296-.768-3.936-1.728-2.496-.96-4.32-1.968-1.776-1.008-2.736-2.4-.912-1.392-.912-3.504zm3.6-.48q0 1.776 1.488 3.024 1.536 1.2 5.376 2.64l1.056.384q1.104-.672 2.064-1.68 1.008-1.056 1.008-2.688 0-1.2-.672-2.16-.624-.96-2.256-1.824-1.632-.912-4.608-1.824-1.344.336-2.4 1.44-1.056 1.104-1.056 2.688z" fill="#fff" stroke="#fff"/>
-  </g>
-  <defs>
-    <path id="B" d="M95 602.362c0 24.853-20.147 45-45 45s-45-20.147-45-45 20.147-45 45-45 45 20.147 45 45z"/>
-  </defs>
-</svg>
index 20976d15a56ff93264d1d81a511c564840517904..05474212645361fd975d3a0e188edbe1c4bdae81 100644 (file)
@@ -106,6 +106,7 @@ $(document).ready(function () {
     $("body").removeClass("compact-nav");
 
     $("header").removeClass("text-nowrap");
+    $("header nav.secondary > ul").removeClass("flex-nowrap");
 
     updateHeader();
 
index 69d625ecab5420ca85f83bcb1a2a0895ef5ec44e..7a761b50036dd30d02c1ec2d2fd0ca16f6b660d0 100644 (file)
@@ -58,7 +58,7 @@ OSM.initializeBrowse = function (map) {
               .click(cancel))),
         $("<p class='alert alert-warning'>")
           .text(I18n.t("browse.start_rjs.feature_warning", { num_features: count, max_features: limit })),
-        $("<input type='submit' class='btn btn-primary'>")
+        $("<input type='submit' class='btn btn-primary d-block mx-auto'>")
           .val(I18n.t("browse.start_rjs.load_data"))
           .click(add)));
   }
index 42854f2e2897b8ed19c64c6c6c6c48560dcead3a..89eccb8cbd7d9074fb08d188a7d3875730969a6d 100644 (file)
@@ -307,7 +307,7 @@ OSM.Directions = function (map) {
         var row = $("<tr class='turn'/>");
         row.append("<td class='border-0'><div class='direction i" + direction + "'/></td> ");
         row.append("<td>" + instruction);
-        row.append("<td class='distance text-muted text-end'>" + dist);
+        row.append("<td class='distance text-body-secondary text-end'>" + dist);
 
         row.on("click", function () {
           popup
index 1a34b05c24f80522d6d323e123d31a691c58845c..55d492b29421968cad2e0b3585aebdcdd2c0e23a 100644 (file)
@@ -84,7 +84,7 @@ L.OSM.layers = function (options) {
 
       $("<p>")
         .text(I18n.t("javascripts.map.layers.overlays"))
-        .attr("class", "text-muted")
+        .attr("class", "text-body-secondary small mb-2")
         .appendTo(overlaySection);
 
       var overlays = $("<ul class='list-unstyled form-check'>")
index 69db10ad78ae80069a8c64f8d1c7329942e151f9..0b868d2cac6cf31bdd8688c854a0368559031295 100644 (file)
@@ -98,7 +98,7 @@ L.OSM.share = function (options) {
           .on("click", select))
       .append(
         $("<p>")
-          .attr("class", "text-muted")
+          .attr("class", "text-body-secondary")
           .text(I18n.t("javascripts.share.paste_html")));
 
     // Geo URI
@@ -128,7 +128,7 @@ L.OSM.share = function (options) {
 
     $("<div>")
       .attr("id", "export-warning")
-      .attr("class", "text-muted")
+      .attr("class", "text-body-secondary")
       .text(I18n.t("javascripts.share.only_standard_layer"))
       .appendTo($imageSection);
 
@@ -223,7 +223,7 @@ L.OSM.share = function (options) {
     };
 
     $("<p>")
-      .attr("class", "text-muted")
+      .attr("class", "text-body-secondary")
       .html(I18n.t("javascripts.share.image_dimensions", args))
       .appendTo($form);
 
index c7b733f2605616d583dc0d98c77081e1a012a246..4b7380ffcc8aef2fd8d2aa035338a312ce7a1ef9 100644 (file)
@@ -16,8 +16,6 @@ time[title] {
   text-decoration: underline dotted;
 }
 
-#container { position: relative; }
-
 /* Rules for icons */
 
 .icon {
@@ -50,7 +48,7 @@ time[title] {
 
 /* Utility for de-emphasizing content */
 
-.text-muted a {
+.text-body-secondary a {
   color: $blue;
 }
 
@@ -98,23 +96,13 @@ header {
   position: relative;
   font-size: 14px;
 
-  h1, nav, nav > ul, nav > ul > li {
-    display: inline-block;
-  }
-
   > * {
-    height: 100%;
     padding: $lineheight * 0.5;
   }
 
-  img.logo {
-    margin-top: -2px;
-  }
-
   h1 {
+    height: $headerHeight;
     font-size: 18px;
-    line-height: 1.2;
-    padding-top: 15px;
   }
 
   .btn {
@@ -124,6 +112,10 @@ header {
   nav.primary {
     margin-right: auto;
   }
+
+  .username {
+    max-width: 12em;
+  }
 }
 
 nav.primary {
@@ -160,7 +152,7 @@ nav.primary {
 
 nav.secondary {
   .nav-link {
-    padding: 0.2rem;
+    padding: 0.3rem;
   }
 }
 
@@ -197,7 +189,7 @@ body.small-nav {
     min-height: $headerHeight;
 
     &.closed nav {
-      display: none;
+      display: none !important;
     }
 
     .search_forms {
@@ -222,6 +214,8 @@ body.small-nav {
   }
 
   nav.secondary {
+    flex-direction: column;
+
     .user-menu, .login-menu {
       width: 100%;
     }
@@ -429,10 +423,6 @@ body.small-nav {
   }
 
   .overlay-layers {
-    p {
-      font-size: 13px;
-      margin-bottom: 8px;
-    }
     li.disabled { color: $darkgrey; }
   }
 }
@@ -499,16 +489,6 @@ body.small-nav {
 
 .donate-attr { color: darken($green, 10%) !important; }
 
-/* Rules for the sidebar */
-
-#browse_status {
-  input {
-    display: block;
-    margin-left: auto;
-    margin-right: auto;
-  }
-}
-
 /* Temporary label size override until we remove site-wide font customisation */
 
 form {
@@ -590,10 +570,6 @@ tr.turn {
 
 .routing_marker { width: 15px; cursor: move; }
 
-.browse_status {
-  display: none;
-}
-
 /* Rules for the history sidebar */
 
 #sidebar .changesets {
@@ -642,26 +618,11 @@ tr.turn {
     }
   }
 
-  .note-description {
-    overflow: hidden;
-    margin: 0 0 10px 10px;
-  }
-
   .query-results {
     display: none;
   }
 }
 
-/* Bootstrap buttons don't have any vertical margin, so
-   they touch when adjacent buttons wrap onto a new line
-   e.g. wide form buttons on a narrow sidebar */
-
-.btn-wrapper {
-  > .btn {
-    margin-bottom: $spacer * 0.25;
-  }
-}
-
 /* Force LTR/RTL alignment for placeholder text */
 
 .form-control::placeholder {
@@ -891,53 +852,7 @@ div.secondary-actions {
   }
 }
 
-/* Rules for the "Welcome" page */
-.site-welcome, .site-fixthemap {
-  .sprite {
-    background-image: image-url("welcome-sprite.svg");
-    background-size: 500px 250px;
-    display: block;
-  }
-
-  .sprite.small {
-    width: 50px;
-    height: 50px;
-  }
-
-  .sprite.x {
-    /*rtl:ignore*/ background-position: -50px 0;
-  }
-
-  .sprite.term {
-    margin-right: 10px;
-    vertical-align: middle;
-    display: inline-block;
-  }
-
-  .sprite.node {
-    /*rtl:ignore*/ background-position: -100px 0;
-  }
-
-  .sprite.way {
-    /*rtl:ignore*/ background-position: -150px 0;
-  }
-
-  .sprite.tag {
-    /*rtl:ignore*/ background-position: -200px 0;
-  }
-
-  .sprite.editor {
-    /*rtl:ignore*/ background-position: -250px 0;
-  }
-
-  .sprite.question {
-    /*rtl:ignore*/ background-position: -300px 0;
-  }
-
-  .sprite.rules {
-    /*rtl:ignore*/ background-position: -350px 0;
-  }
-}
+/* Rules for the "About" page */
 
 .site-about #content {
   .content-inner {
index 6b47ca6660d1ee200691f05b0443178eb1d54997..d45dce66a8e00f6f413831d767436b8b537524e2 100644 (file)
@@ -11,15 +11,13 @@ class AccountsController < ApplicationController
 
   before_action :check_database_readable
   before_action :check_database_writable, :only => [:update]
-  before_action :allow_thirdparty_images, :only => [:edit, :update]
+
+  allow_thirdparty_images :only => [:edit, :update]
+  allow_social_login :only => [:edit, :update]
 
   def edit
     @tokens = current_user.oauth_tokens.authorized
 
-    append_content_security_policy_directives(
-      :form_action => %w[accounts.google.com *.facebook.com login.microsoftonline.com github.com meta.wikimedia.org]
-    )
-
     if errors = session.delete(:user_errors)
       errors.each do |attribute, error|
         current_user.errors.add(attribute, error)
@@ -31,10 +29,6 @@ class AccountsController < ApplicationController
   def update
     @tokens = current_user.oauth_tokens.authorized
 
-    append_content_security_policy_directives(
-      :form_action => %w[accounts.google.com *.facebook.com login.microsoftonline.com github.com meta.wikimedia.org]
-    )
-
     user_params = params.require(:user).permit(:display_name, :new_email, :pass_crypt, :pass_crypt_confirmation, :auth_provider)
 
     if params[:user][:auth_provider].blank? ||
index 80222c40bd93fb622753a5d672841cbe1fa2d12d..cbdcace0cd80b1a7c87ea47535b2cb81328b75fa 100644 (file)
@@ -1,5 +1,7 @@
 module Api
   class CapabilitiesController < ApiController
+    skip_before_action :check_api_readable
+
     authorize_resource :class => false
 
     before_action :set_request_formats
index 756e56dccdfb706d8d6e7c4456683fcc232eb08c..4a96ec3bbaef00087e8b03a464c7ee78e65c56c2 100644 (file)
@@ -1,7 +1,6 @@
 module Api
   class ChangesetCommentsController < ApiController
     before_action :check_api_writable
-    before_action :check_api_readable, :except => [:create]
     before_action :authorize
 
     authorize_resource
@@ -105,7 +104,7 @@ module Api
     ##
     # Check if the current user has exceed the rate limit for comments
     def rate_limit_exceeded?
-      recent_comments = current_user.changeset_comments.where("created_at >= ?", Time.now.utc - 1.hour).count
+      recent_comments = current_user.changeset_comments.where(:created_at => Time.now.utc - 1.hour..).count
 
       recent_comments >= current_user.max_changeset_comments_per_hour
     end
index 616d3fdec9d5360232740ed876d17e4a30bd8bcb..3d59eeb171e4232c70d5fe1b68dc5252a6d4de2b 100644 (file)
@@ -3,7 +3,6 @@
 module Api
   class ChangesetsController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :upload, :subscribe, :unsubscribe]
-    before_action :check_api_readable, :except => [:index, :create, :update, :upload, :download, :subscribe, :unsubscribe]
     before_action :setup_user_auth, :only => [:show]
     before_action :authorize, :only => [:create, :update, :upload, :close, :subscribe, :unsubscribe]
 
@@ -331,7 +330,7 @@ module Api
         changesets.where("closed_at >= ? and created_at <= ?", from, to)
       else
         # if there is no comma, assume its a lower limit on time
-        changesets.where("closed_at >= ?", Time.parse(time).utc)
+        changesets.where(:closed_at => Time.parse(time).utc..)
       end
       # stupid Time seems to throw both of these for bad parsing, so
       # we have to catch both and ensure the correct code path is taken.
index 5a05f6de2b527e6c236b665007ab8a5cd309b534..6d4a9feb6c3d8062cf141fb375eca35a42da018e 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class MapController < ApiController
-    before_action :check_api_readable
-
     authorize_resource :class => false
 
     around_action :api_call_handle_error, :api_call_timeout
index dc7d04dc5792d93698aa7ddc8b899a0592485c86..5aad78dbffb91bfc99c36f36adcbb20893b2d5dc 100644 (file)
@@ -3,7 +3,6 @@
 module Api
   class NodesController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :delete]
-    before_action :check_api_readable, :except => [:create, :update, :delete]
     before_action :authorize, :only => [:create, :update, :delete]
 
     authorize_resource
index 8a0a82c40150687063fbf0720b5114c409c73725..d53059a94e0f019f1e56e374e332d8b6f483f07f 100644 (file)
@@ -1,6 +1,5 @@
 module Api
   class NotesController < ApiController
-    before_action :check_api_readable
     before_action :check_api_writable, :only => [:create, :comment, :close, :reopen, :destroy]
     before_action :setup_user_auth, :only => [:create, :show]
     before_action :authorize, :only => [:close, :reopen, :destroy, :comment]
index 6a468a900631953247414ecee55145745c393e62..2343252dbb0a63243ece6e1c90c9de0875dfee4c 100644 (file)
@@ -3,7 +3,6 @@
 # nodes, ways and relations are basically identical.
 module Api
   class OldElementsController < ApiController
-    before_action :check_api_readable
     before_action :check_api_writable, :only => [:redact]
     before_action :setup_user_auth, :only => [:history, :show]
     before_action :authorize, :only => [:redact]
index 8c0c949dc2c71302f64b1611f2977961a71d7718..717bbfa6f7fd1c23428c9d952b1e18d55ef5032b 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class PermissionsController < ApiController
-    before_action :check_api_readable
-
     authorize_resource :class => false
 
     before_action :setup_user_auth
index e82ac6368a371fb43bb2bfaa6e7db071f3f0ddef..5fb99dbd18a390e1e234308bcf78b90f05a36939 100644 (file)
@@ -1,7 +1,6 @@
 module Api
   class RelationsController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :delete]
-    before_action :check_api_readable, :except => [:create, :update, :delete]
     before_action :authorize, :only => [:create, :update, :delete]
 
     authorize_resource
index f38351de96f0884e0a69aecebbb430871ad2c231..d8d9da98b680f62729b503085a5ab36c40e318cc 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class TracepointsController < ApiController
-    before_action :check_api_readable
-
     authorize_resource
 
     around_action :api_call_handle_error, :api_call_timeout
index 956bcde6e82dccabb23e022919d0d87673e74ec3..738642fff7dc56531bec8d550c3a5f31dcc414b6 100644 (file)
@@ -1,14 +1,11 @@
 module Api
   class TracesController < ApiController
-    before_action :check_database_readable, :except => [:show, :data]
-    before_action :check_database_writable, :only => [:create, :update, :destroy]
+    before_action :check_api_writable, :only => [:create, :update, :destroy]
     before_action :set_locale
     before_action :authorize
 
     authorize_resource
 
-    before_action :check_api_readable, :only => [:show, :data]
-    before_action :check_api_writable, :only => [:create, :update, :destroy]
     before_action :offline_error, :only => [:create, :destroy, :data]
     around_action :api_call_handle_error
 
index 19fd4b400b043c8736d29cab5fb236e37240856f..6c285e14a253d50e45daa31ef57134071560a708 100644 (file)
@@ -1,7 +1,5 @@
 module Api
   class UserBlocksController < ApiController
-    before_action :check_api_readable
-
     authorize_resource
 
     around_action :api_call_handle_error, :api_call_timeout
index 99d224c516ca5ec132f1ce236acea4ce3774fd3f..cb852ce881aa10909a267e776aa884c406e388b4 100644 (file)
@@ -1,6 +1,7 @@
 # Update and read user preferences, which are arbitrary key/val pairs
 module Api
   class UserPreferencesController < ApiController
+    before_action :check_api_writable, :only => [:update_all, :update, :destroy]
     before_action :authorize
 
     authorize_resource
index 6fa47095a16f9c062ba246100bea989ff7dd9ecb..5ff275ee9dc52f268b250d52f445dd71a3295b1c 100644 (file)
@@ -1,6 +1,5 @@
 module Api
   class UsersController < ApiController
-    before_action :check_api_readable
     before_action :disable_terms_redirect, :only => [:details]
     before_action :setup_user_auth, :only => [:show, :index]
     before_action :authorize, :only => [:details, :gpx_files]
index d5c9c5f87cebf2036316655c72013b49b55b4832..d311a18d24f14a1b3304bc3b8c7325272a805323 100644 (file)
@@ -1,5 +1,6 @@
 module Api
   class VersionsController < ApiController
+    skip_before_action :check_api_readable
     authorize_resource :class => false
 
     before_action :set_request_formats
index f8254d8027bacbd43fe8e0c6c641c78b8b04e338..4099e16763f15554e7b33de5f35cffb7eb8885f9 100644 (file)
@@ -1,7 +1,6 @@
 module Api
   class WaysController < ApiController
     before_action :check_api_writable, :only => [:create, :update, :delete]
-    before_action :check_api_readable, :except => [:create, :update, :delete]
     before_action :authorize, :only => [:create, :update, :delete]
 
     authorize_resource
index edafac7ccdc44f3f75f07e0f3a082909a793bfea..ff7f694c5eb63bac0ac23c7e00ba454630f7ac69 100644 (file)
@@ -1,6 +1,8 @@
 class ApiController < ApplicationController
   skip_before_action :verify_authenticity_token
 
+  before_action :check_api_readable
+
   private
 
   ##
index f5accc3c44d2d65654105a828d5ccc0fc6e94b64..05fa76658d55bedeecf412c4a5d1927cb6ce3899 100644 (file)
@@ -13,13 +13,30 @@ class ApplicationController < ActionController::Base
   rescue_from RailsParam::InvalidParameterError, :with => :invalid_parameter
 
   before_action :fetch_body
-  around_action :better_errors_allow_inline, :if => proc { Rails.env.development? }
 
   attr_accessor :current_user, :oauth_token
 
   helper_method :current_user
   helper_method :oauth_token
 
+  def self.allow_thirdparty_images(**options)
+    content_security_policy(options) do |policy|
+      policy.img_src("*")
+    end
+  end
+
+  def self.allow_social_login(**options)
+    content_security_policy(options) do |policy|
+      policy.form_action(*policy.form_action, "accounts.google.com", "*.facebook.com", "login.microsoftonline.com", "github.com", "meta.wikimedia.org")
+    end
+  end
+
+  def self.allow_all_form_action(**options)
+    content_security_policy(options) do |policy|
+      policy.form_action(nil)
+    end
+  end
+
   private
 
   def authorize_web
@@ -233,13 +250,15 @@ class ApplicationController < ActionController::Base
   end
 
   def map_layout
-    append_content_security_policy_directives(
-      :child_src => %w[http://127.0.0.1:8111 https://127.0.0.1:8112],
-      :frame_src => %w[http://127.0.0.1:8111 https://127.0.0.1:8112],
-      :connect_src => [Settings.nominatim_url, Settings.overpass_url, Settings.fossgis_osrm_url, Settings.graphhopper_url, Settings.fossgis_valhalla_url],
-      :form_action => %w[render.openstreetmap.org],
-      :style_src => %w['unsafe-inline']
-    )
+    policy = request.content_security_policy.clone
+
+    policy.child_src(*policy.child_src, "http://127.0.0.1:8111", "https://127.0.0.1:8112")
+    policy.frame_src(*policy.frame_src, "http://127.0.0.1:8111", "https://127.0.0.1:8112")
+    policy.connect_src(*policy.connect_src, Settings.nominatim_url, Settings.overpass_url, Settings.fossgis_osrm_url, Settings.graphhopper_url, Settings.fossgis_valhalla_url)
+    policy.form_action(*policy.form_action, "render.openstreetmap.org")
+    policy.style_src(*policy.style_src, :unsafe_inline)
+
+    request.content_security_policy = policy
 
     case Settings.status
     when "database_offline", "api_offline"
@@ -251,10 +270,6 @@ class ApplicationController < ActionController::Base
     request.xhr? ? "xhr" : "map"
   end
 
-  def allow_thirdparty_images
-    append_content_security_policy_directives(:img_src => %w[*])
-  end
-
   def preferred_editor
     if params[:editor]
       params[:editor]
@@ -277,17 +292,6 @@ class ApplicationController < ActionController::Base
     end
   end
 
-  def better_errors_allow_inline
-    yield
-  rescue StandardError
-    append_content_security_policy_directives(
-      :script_src => %w['unsafe-inline'],
-      :style_src => %w['unsafe-inline']
-    )
-
-    raise
-  end
-
   def current_ability
     Ability.new(current_user)
   end
index 19ec9c91ef5967a53661817e5f1966c08ae0400e..a5ddaf364fe44ae48dafeaa5f0e9761830e2ee98 100644 (file)
@@ -60,7 +60,7 @@ class ChangesetsController < ApplicationController
         changesets = changesets.where(:user => current_user.nearby)
       end
 
-      changesets = changesets.where("changesets.id <= ?", @params[:max_id]) if @params[:max_id]
+      changesets = changesets.where(:changesets => { :id => ..@params[:max_id] }) if @params[:max_id]
 
       @changesets = changesets.order("changesets.id DESC").limit(20).preload(:user, :changeset_tags, :comments)
 
@@ -88,7 +88,7 @@ class ChangesetsController < ApplicationController
     if @changeset.user.active? && @changeset.user.data_public?
       changesets = conditions_nonempty(@changeset.user.changesets)
       @next_by_user = changesets.where("id > ?", @changeset.id).reorder(:id => :asc).first
-      @prev_by_user = changesets.where("id < ?", @changeset.id).reorder(:id => :desc).first
+      @prev_by_user = changesets.where(:id => ...@changeset.id).reorder(:id => :desc).first
     end
     render :layout => map_layout
   rescue ActiveRecord::RecordNotFound
index 5dcddb82debb5e4849039c28e2d4cf128d6f5c5f..45cf0d9439607642725c088feb5517215e232524 100644 (file)
@@ -39,7 +39,7 @@ module SessionMethods
     session[:fingerprint] = user.fingerprint
     session_expires_after 28.days if session[:remember_me]
 
-    target = referer || session[:referer] || url_for(:controller => :site, :action => :index)
+    target = referer || url_for(:controller => :site, :action => :index)
 
     # The user is logged in, so decide where to send them:
     #
@@ -56,31 +56,28 @@ module SessionMethods
     end
 
     session.delete(:remember_me)
-    session.delete(:referer)
   end
 
   ##
   # process a failed login
-  def failed_login(message, username = nil)
+  def failed_login(message, username, referer = nil)
     flash[:error] = message
 
-    redirect_to :controller => "sessions", :action => "new", :referer => session[:referer],
+    redirect_to :controller => "sessions", :action => "new", :referer => referer,
                 :username => username, :remember_me => session[:remember_me]
 
     session.delete(:remember_me)
-    session.delete(:referer)
   end
 
   ##
   #
-  def unconfirmed_login(user)
+  def unconfirmed_login(user, referer = nil)
     session[:pending_user] = user.id
 
     redirect_to :controller => "confirmations", :action => "confirm",
-                :display_name => user.display_name, :referer => session[:referer]
+                :display_name => user.display_name, :referer => referer
 
     session.delete(:remember_me)
-    session.delete(:referer)
   end
 
   ##
index 8da0842eb09cbee7942cf28d725d5ee6b49e9308..9af36709eb20be1a2055a964daf2697d3443af1f 100644 (file)
@@ -12,7 +12,8 @@ class DiaryEntriesController < ApplicationController
 
   before_action :lookup_user, :only => [:show, :comments]
   before_action :check_database_writable, :only => [:new, :create, :edit, :update, :comment, :hide, :hidecomment, :subscribe, :unsubscribe]
-  before_action :allow_thirdparty_images, :only => [:new, :create, :edit, :update, :index, :show, :comments]
+
+  allow_thirdparty_images :only => [:new, :create, :edit, :update, :index, :show, :comments]
 
   def index
     if params[:display_name]
index 94851de96485741758d681a1247be029c402dc17..cddc97b6883e13044601c5b4a3a24b1f84d83f74 100644 (file)
@@ -4,6 +4,10 @@ class ExportController < ApplicationController
   before_action :update_totp, :only => [:finish]
   authorize_resource :class => false
 
+  content_security_policy(:only => :embed) do |policy|
+    policy.frame_ancestors("*")
+  end
+
   caches_page :embed
 
   # When the user clicks 'Export' we redirect to a URL which generates the export download
@@ -25,9 +29,5 @@ class ExportController < ApplicationController
     end
   end
 
-  def embed
-    append_content_security_policy_directives(
-      :frame_ancestors => %w[*]
-    )
-  end
+  def embed; end
 end
index 7b14f2e820799d3c9f47a2092cbdcbe646d552cc..ab54cbfd1b31f7dcd8fec56d4e23ec9c5c92908e 100644 (file)
@@ -19,7 +19,7 @@ class FriendshipsController < ApplicationController
       friendship.befriendee = @friend
       if current_user.friends_with?(@friend)
         flash[:warning] = t ".already_a_friend", :name => @friend.display_name
-      elsif current_user.friendships.where("created_at >= ?", Time.now.utc - 1.hour).count >= current_user.max_friends_per_hour
+      elsif current_user.friendships.where(:created_at => Time.now.utc - 1.hour..).count >= current_user.max_friends_per_hour
         flash.now[:error] = t ".limit_exceeded"
       elsif friendship.save
         flash[:notice] = t ".success", :name => @friend.display_name
index 111a31f96ae8cf4b27ce108215368aad5207d78b..779174e255ffc915fe14f44c67e2710b8cb87cba 100644 (file)
@@ -11,7 +11,8 @@ class MessagesController < ApplicationController
   before_action :lookup_user, :only => [:new, :create]
   before_action :check_database_readable
   before_action :check_database_writable, :only => [:new, :create, :reply, :mark, :destroy]
-  before_action :allow_thirdparty_images, :only => [:new, :create, :show]
+
+  allow_thirdparty_images :only => [:new, :create, :show]
 
   # Show a message
   def show
@@ -42,7 +43,7 @@ class MessagesController < ApplicationController
     @message.sender = current_user
     @message.sent_on = Time.now.utc
 
-    if current_user.sent_messages.where("sent_on >= ?", Time.now.utc - 1.hour).count >= current_user.max_messages_per_hour
+    if current_user.sent_messages.where(:sent_on => Time.now.utc - 1.hour..).count >= current_user.max_messages_per_hour
       flash.now[:error] = t ".limit_exceeded"
       render :action => "new"
     elsif @message.save
index dca95de4e7a34b737906ba2dd524d1c7b2e3f49f..415ab2775c12f248e90598bde7e2495078e126f9 100644 (file)
@@ -3,13 +3,8 @@ class Oauth2AuthorizationsController < Doorkeeper::AuthorizationsController
 
   prepend_before_action :authorize_web
   before_action :set_locale
-  before_action :allow_all_form_action, :only => [:new]
 
-  authorize_resource :class => false
-
-  private
+  allow_all_form_action :only => :new
 
-  def allow_all_form_action
-    override_content_security_policy_directives(:form_action => []) if Settings.csp_enforce || Settings.key?(:csp_report_url)
-  end
+  authorize_resource :class => false
 end
index 49af05b0d188e814960468d0a0f335cfd989f62e..62a68b53369ddc0e2cf4829a9a4c40f4d5f552d5 100644 (file)
@@ -9,6 +9,8 @@ class OauthController < ApplicationController
 
   layout "site"
 
+  allow_all_form_action :only => :oauth1_authorize
+
   def revoke
     @token = current_user.oauth_tokens.find_by :token => params[:token]
     if @token
@@ -41,8 +43,6 @@ class OauthController < ApplicationController
   end
 
   def oauth1_authorize
-    override_content_security_policy_directives(:form_action => []) if Settings.csp_enforce || Settings.key?(:csp_report_url)
-
     if @token.invalidated?
       @message = t "oauth.authorize_failure.invalid"
       render :action => "authorize_failure"
index fdf2df6a753cf51f1e639495ebe5d9b3c3477ba1..a3e6f42f03db4b172607bc26285d6c79c3b0ee8b 100644 (file)
@@ -11,18 +11,20 @@ class SessionsController < ApplicationController
 
   authorize_resource :class => false
 
-  def new
-    override_content_security_policy_directives(:form_action => []) if Settings.csp_enforce || Settings.key?(:csp_report_url)
+  allow_all_form_action :only => :new
 
-    session[:referer] = safe_referer(params[:referer]) if params[:referer]
+  def new
+    referer = safe_referer(params[:referer]) if params[:referer]
 
-    parse_oauth_referer session[:referer]
+    parse_oauth_referer referer
   end
 
   def create
     session[:remember_me] ||= params[:remember_me]
-    session[:referer] = safe_referer(params[:referer]) if params[:referer]
-    password_authentication(params[:username].strip, params[:password])
+
+    referer = safe_referer(params[:referer]) if params[:referer]
+
+    password_authentication(params[:username].strip, params[:password], referer)
   end
 
   def destroy
@@ -43,15 +45,15 @@ class SessionsController < ApplicationController
 
   ##
   # handle password authentication
-  def password_authentication(username, password)
+  def password_authentication(username, password, referer = nil)
     if (user = User.authenticate(:username => username, :password => password))
-      successful_login(user)
+      successful_login(user, referer)
     elsif (user = User.authenticate(:username => username, :password => password, :pending => true))
-      unconfirmed_login(user)
+      unconfirmed_login(user, referer)
     elsif User.authenticate(:username => username, :password => password, :suspended => true)
-      failed_login({ :partial => "sessions/suspended_flash" }, username)
+      failed_login({ :partial => "sessions/suspended_flash" }, username, referer)
     else
-      failed_login t("sessions.new.auth failure"), username
+      failed_login(t("sessions.new.auth failure"), username, referer)
     end
   end
 end
index 3d830c63f7fab352aa47b893a7c3fdfa0d9a9e07..15ffe58a2616765eac3b34474b9dd0542447cb33 100644 (file)
@@ -12,6 +12,17 @@ class SiteController < ApplicationController
 
   authorize_resource :class => false
 
+  content_security_policy(:only => :edit) do |policy|
+    policy.frame_src(*policy.frame_src, :blob)
+  end
+
+  content_security_policy(:only => :id) do |policy|
+    policy.connect_src("*")
+    policy.img_src(*policy.img_src, "*", :blob)
+    policy.script_src(*policy.script_src, :unsafe_eval)
+    policy.style_src(*policy.style_src, :unsafe_inline)
+  end
+
   def index
     session[:location] ||= OSM.ip_location(request.env["REMOTE_ADDR"]) unless Settings.status == "database_readonly" || Settings.status == "database_offline"
   end
@@ -71,12 +82,6 @@ class SiteController < ApplicationController
       require_user
     end
 
-    if %w[id].include?(editor)
-      append_content_security_policy_directives(
-        :frame_src => %w[blob:]
-      )
-    end
-
     begin
       if params[:node]
         bbox = Node.visible.find(params[:node]).bbox.to_unscaled
@@ -136,13 +141,6 @@ class SiteController < ApplicationController
   end
 
   def id
-    append_content_security_policy_directives(
-      :connect_src => %w[*],
-      :img_src => %w[* blob:],
-      :script_src => %w[dev.virtualearth.net 'unsafe-eval'],
-      :style_src => %w['unsafe-inline']
-    )
-
     render :layout => false
   end
 
index 2cdec642d33ed8a4876defd7f53100b97b1d18f6..b7c156bd913e98e11cdad31d496c14ef12fd5891 100644 (file)
@@ -17,7 +17,9 @@ class UsersController < ApplicationController
   before_action :check_database_writable, :only => [:new, :go_public]
   before_action :require_cookies, :only => [:new]
   before_action :lookup_user_by_name, :only => [:set_status, :destroy]
-  before_action :allow_thirdparty_images, :only => [:show]
+
+  allow_thirdparty_images :only => :show
+  allow_social_login :only => :new
 
   ##
   # display a list of users matching specified criteria
@@ -54,18 +56,10 @@ class UsersController < ApplicationController
 
   def new
     @title = t ".title"
-    @referer = if params[:referer]
-                 safe_referer(params[:referer])
-               else
-                 session[:referer]
-               end
+    @referer = safe_referer(params[:referer])
 
     parse_oauth_referer @referer
 
-    append_content_security_policy_directives(
-      :form_action => %w[accounts.google.com *.facebook.com login.microsoftonline.com github.com meta.wikimedia.org]
-    )
-
     if current_user
       # The user is logged in already, so don't show them the signup
       # page, instead send them to the home page
@@ -94,10 +88,6 @@ class UsersController < ApplicationController
     self.current_user = User.new(user_params)
 
     if check_signup_allowed(current_user.email)
-      session[:referer] = safe_referer(params[:referer]) if params[:referer]
-
-      Rails.logger.info "create: #{session[:referer]}"
-
       if current_user.auth_uid.present?
         # We are creating an account with external authentication and
         # no password was specified so create a random one
@@ -108,14 +98,9 @@ class UsersController < ApplicationController
       if current_user.invalid?
         # Something is wrong with a new user, so rerender the form
         render :action => "new"
-      elsif current_user.auth_provider.present?
-        # Verify external authenticator before moving on
-        session[:new_user] = current_user.slice("email", "display_name", "pass_crypt", "pass_crypt_confirmation")
-        redirect_to auth_url(current_user.auth_provider, current_user.auth_uid), :status => :temporary_redirect
       else
         # Save the user record
-        session[:new_user] = current_user.slice("email", "display_name", "pass_crypt", "pass_crypt_confirmation")
-        save_new_user params[:email_hmac]
+        save_new_user params[:email_hmac], params[:referer]
       end
     end
   end
@@ -200,6 +185,7 @@ class UsersController < ApplicationController
   ##
   # omniauth success callback
   def auth_success
+    referer = request.env["omniauth.params"]["referer"]
     auth_info = request.env["omniauth.auth"]
 
     provider = auth_info[:provider]
@@ -228,12 +214,6 @@ class UsersController < ApplicationController
       session[:user_errors] = current_user.errors.as_json
 
       redirect_to edit_account_path
-    elsif session[:new_user]
-      session[:new_user]["auth_provider"] = provider
-      session[:new_user]["auth_uid"] = uid
-
-      email_hmac = UsersController.message_hmac(email) if email_verified && email
-      save_new_user email_hmac
     else
       user = User.find_by(:auth_provider => provider, :auth_uid => uid)
 
@@ -246,18 +226,18 @@ class UsersController < ApplicationController
       if user
         case user.status
         when "pending"
-          unconfirmed_login(user)
+          unconfirmed_login(user, referer)
         when "active", "confirmed"
-          successful_login(user, request.env["omniauth.params"]["referer"])
+          successful_login(user, referer)
         when "suspended"
-          failed_login({ :partial => "sessions/suspended_flash" })
+          failed_login({ :partial => "sessions/suspended_flash" }, user.display_name, referer)
         else
-          failed_login t("sessions.new.auth failure")
+          failed_login(t("sessions.new.auth failure"), user.display_name, referer)
         end
       else
         email_hmac = UsersController.message_hmac(email) if email_verified && email
         redirect_to :action => "new", :nickname => name, :email => email, :email_hmac => email_hmac,
-                    :auth_provider => provider, :auth_uid => uid
+                    :auth_provider => provider, :auth_uid => uid, :referer => referer
       end
     end
   end
@@ -281,9 +261,7 @@ class UsersController < ApplicationController
 
   private
 
-  def save_new_user(email_hmac)
-    new_user = session.delete(:new_user)
-    self.current_user = User.new(new_user)
+  def save_new_user(email_hmac, referer = nil)
     if check_signup_allowed(current_user.email)
       current_user.data_public = true
       current_user.description = "" if current_user.description.nil?
@@ -306,11 +284,10 @@ class UsersController < ApplicationController
 
         flash[:matomo_goal] = Settings.matomo["goals"]["signup"] if defined?(Settings.matomo)
 
-        referer = welcome_path(welcome_options)
+        referer = welcome_path(welcome_options(referer))
 
         if current_user.status == "active"
-          session[:referer] = referer
-          successful_login(current_user)
+          successful_login(current_user, referer)
         else
           session[:pending_user] = current_user.id
           UserMailer.signup_confirm(current_user, current_user.generate_token_for(:new_user), referer).deliver_later
@@ -322,8 +299,8 @@ class UsersController < ApplicationController
     end
   end
 
-  def welcome_options
-    uri = URI(session[:referer]) if session[:referer].present?
+  def welcome_options(referer = nil)
+    uri = URI(referer) if referer.present?
 
     return { "oauth_return_url" => uri&.to_s } if uri&.path == oauth_authorization_path
 
index 536f2620e02df11c20004b7e0320954201ea38ad..e2de9934f6a5131150debf676c89265902b13676 100644 (file)
@@ -53,7 +53,7 @@ module UserHelper
   # External authentication support
 
   def openid_logo
-    image_tag "openid_small.png", :alt => t("application.auth_providers.openid_logo_alt"), :class => "align-text-bottom"
+    image_tag "openid.svg", :size => "24", :alt => t("application.auth_providers.openid_logo_alt"), :class => "align-text-bottom"
   end
 
   def auth_button(name, provider, options = {})
@@ -77,7 +77,7 @@ module UserHelper
                 :size => "24") + t("application.auth_providers.#{name}.title"),
       auth_path(options.merge(:provider => provider)),
       :method => :post,
-      :class => "auth_button fs-6 border rounded text-muted text-decoration-none py-2 px-4 d-flex justify-content-center align-items-center",
+      :class => "auth_button fs-6 border rounded text-body-secondary text-decoration-none py-2 px-4 d-flex justify-content-center align-items-center",
       :title => t("application.auth_providers.#{name}.title")
     )
   end
index 54947be303d569e76691e7959b17b7568a7e69ab..a3f82ee40b11881bddf5d5226404f8209668f614 100644 (file)
@@ -50,11 +50,11 @@ class Issue < ApplicationRecord
   scope :visible_to, ->(user) { where(:assigned_role => user.roles.map(&:role)) }
 
   def read_reports
-    resolved_at.present? ? reports.where("updated_at < ?", resolved_at) : nil
+    resolved_at.present? ? reports.where(:updated_at => ...resolved_at) : nil
   end
 
   def unread_reports
-    resolved_at.present? ? reports.where("updated_at >= ?", resolved_at) : reports
+    resolved_at.present? ? reports.where(:updated_at => resolved_at..) : reports
   end
 
   include AASM
index d1f917571a21287f5de4e0a7a290e8e8337babb3..20723b98d01ddc7e0efe3d732879c12c8345d77b 100644 (file)
@@ -81,7 +81,7 @@ class Trace < ApplicationRecord
             :content_type => content_type(attachable.path),
             :identify => false)
     else
-      super(attachable)
+      super
     end
   end
 
index 192f52ac4e74ebd440d073d9b8676b0799699c90..e4067a350fe822dac17a0adfd90d0f4b8cb43c63 100644 (file)
@@ -411,7 +411,7 @@ class User < ApplicationRecord
   def max_messages_per_hour
     account_age_in_seconds = Time.now.utc - created_at
     account_age_in_hours = account_age_in_seconds / 3600
-    recent_messages = messages.where("sent_on >= ?", Time.now.utc - 3600).count
+    recent_messages = messages.where(:sent_on => Time.now.utc - 3600..).count
     max_messages = account_age_in_hours.ceil + recent_messages - (active_reports * 10)
     max_messages.clamp(0, Settings.max_messages_per_hour)
   end
@@ -419,7 +419,7 @@ class User < ApplicationRecord
   def max_friends_per_hour
     account_age_in_seconds = Time.now.utc - created_at
     account_age_in_hours = account_age_in_seconds / 3600
-    recent_friends = Friendship.where(:befriendee => self).where("created_at >= ?", Time.now.utc - 3600).count
+    recent_friends = Friendship.where(:befriendee => self).where(:created_at => Time.now.utc - 3600..).count
     max_friends = account_age_in_hours.ceil + recent_friends - (active_reports * 10)
     max_friends.clamp(0, Settings.max_friends_per_hour)
   end
index e783367dd1b9600812e670e12c752aef3cba5a59..f15bc195c584d7614bfe1548f08fa4a63d24d860 100644 (file)
       <%= f.select(:auth_provider, Auth.providers, :hide_label => true, :wrapper => { :class => "col-auto mb-0" }) %>
       <%= f.text_field(:auth_uid, :hide_label => true, :wrapper => { :class => "col mb-0" }) %>
     </div>
-    <small class="form-text text-muted">(<a href="<%= t ".openid.link" %>" target="_new"><%= t ".openid.link text" %></a>)</small>
+    <small class="form-text text-body-secondary">(<a href="<%= t ".openid.link" %>" target="_new"><%= t ".openid.link text" %></a>)</small>
   </fieldset>
 
   <div class="mb-3">
     <label class="form-label"><%= t ".public editing.heading" %></label>
-    <span class="form-text text-muted">
+    <span class="form-text text-body-secondary">
       <% if current_user.data_public? %>
         <%= t ".public editing.enabled" %>
         (<a href="<%= t ".public editing.enabled link" %>" target="_new"><%= t ".public editing.enabled link text" %></a>)
@@ -40,7 +40,7 @@
 
   <div class="mb-3">
     <label class="form-label"><%= t ".contributor terms.heading" %></label>
-    <span class="form-text text-muted">
+    <span class="form-text text-body-secondary">
       <% if current_user.terms_agreed? %>
         <%= t ".contributor terms.agreed" %>
         (<a href="<%= t ".contributor terms.link" %>" target="_new"><%= t ".contributor terms.link text" %></a>)
     </span>
   </div>
 
-  <div class="row justify-content-between">
-    <div class="col-auto btn-wrapper">
+  <div class="row justify-content-between g-1">
+    <div class="col-auto">
       <%= f.primary t(".save changes button") %>
     </div>
-    <div class="col-auto btn-wrapper">
+    <div class="col-auto">
       <%= link_to t(".delete_account"), account_deletion_path, :class => "btn btn-outline-danger" %>
     </div>
   </div>
index a79e7b5ce3cf75e920d1e91d11664b590cf50a21..0cbb529a500c70a34be6dc605dcfc3d469328fdc 100644 (file)
@@ -1,29 +1,42 @@
 <div>
-  <div class="list-inline justify-content-center d-flex align-items-center flex-wrap mb-3 gap-3" id="login_auth_buttons">
+  <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-100 mb-3" id="login_auth_buttons">
 
+    <% prefered_auth_button_available = false %>
     <% %w[google facebook microsoft github wikipedia].each do |provider| %>
       <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
         <% if @preferred_auth_provider == provider %>
-          <div class="mx-2"><%= auth_button_preferred provider, provider %></div>
+          <% prefered_auth_button_available = true %>
         <% end %>
       <% end -%>
     <% end -%>
 
-    <div class="justify-content-center d-flex gap-1">
-      <div>
-        <%= link_to image_tag("openid.png",
-                              :alt => t("application.auth_providers.openid.title"),
-                              :size => "24"),
-                    "#",
-                    :id => "openid_open_url",
-                    :title => t("application.auth_providers.openid.title"),
-                    :class => "p-2 d-block" %>
+    <% if prefered_auth_button_available %>
+      <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-50">
+        <% %w[google facebook microsoft github wikipedia].each do |provider| %>
+          <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
+            <% if @preferred_auth_provider == provider %>
+              <%= auth_button_preferred provider, provider %>
+            <% end %>
+          <% end -%>
+        <% end -%>
       </div>
+      <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-50">
+    <% else %>
+      <div class="list-inline justify-content-center d-flex align-items-center flex-wrap w-100">
+    <% end %>
+
+      <%= link_to image_tag("openid.png",
+                            :alt => t("application.auth_providers.openid.title"),
+                            :size => "24"),
+                  "#",
+                  :id => "openid_open_url",
+                  :title => t("application.auth_providers.openid.title"),
+                  :class => "p-2 d-block" %>
 
       <% %w[google facebook microsoft github wikipedia].each do |provider| %>
         <% unless @preferred_auth_provider == provider %>
           <% if Settings.key?("#{provider}_auth_id".to_sym) -%>
-            <div><%= auth_button provider, provider %></div>
+            <%= auth_button provider, provider %>
           <% end -%>
         <% end %>
       <% end -%>
@@ -36,7 +49,7 @@
       <label for="openid_url" class="form-label"><%= t ".openid_html", :logo => openid_logo %></label>
       <%= hidden_field_tag("referer", params[:referer], :autocomplete => "off") %>
       <%= text_field_tag("openid_url", "", :tabindex => 20, :autocomplete => "on", :class => "openid_url form-control") %>
-      <span class="form-text text-muted">(<a href="<%= t "accounts.edit.openid.link" %>" target="_new"><%= t "accounts.edit.openid.link text" %></a>)</span>
+      <span class="form-text text-body-secondary">(<a href="<%= t "accounts.edit.openid.link" %>" target="_new"><%= t "accounts.edit.openid.link text" %></a>)</span>
     </div>
 
     <%= submit_tag t(".openid_login_button"), :tabindex => 21, :id => "openid_login_button", :class => "btn btn-primary" %>
index 4e2ae0343d2e57f5ba7a460b5701892ed0d923b3..0ffe7c68b82dd01c9cbafe2ca6966295d4b8532a 100644 (file)
@@ -7,7 +7,7 @@
                                        :id => node.redaction.id), node.redaction) %>
   </div>
 <% else %>
-  <%= tag.div :class => ["browse-section", "browse-node", { "text-muted" => node.redacted? }] do %>
+  <%= tag.div :class => ["browse-section", "browse-node", { "text-body-secondary" => node.redacted? }] do %>
     <%= render :partial => "browse/common_details", :object => node %>
 
     <% unless node.ways.empty? and node.containing_relation_members.empty? %>
index a987fe4d8e179bdedd701197e80e1a8c22a45302..5dcdffa47f6cc683d657fa8ad215adf546234c7f 100644 (file)
@@ -7,7 +7,7 @@
                                        :id => relation.redaction.id), relation.redaction) %>
   </div>
 <% else %>
-  <%= tag.div :class => ["browse-section", "browse-relation", { "text-muted" => relation.redacted? }] do %>
+  <%= tag.div :class => ["browse-section", "browse-relation", { "text-body-secondary" => relation.redacted? }] do %>
     <%= render :partial => "browse/common_details", :object => relation %>
 
     <% unless relation.containing_relation_members.empty? %>
index d015438fe998568ae45c1a454ff63f8e6ef0b2d7..d04eff14030183432704277a9e07802b378c2083 100644 (file)
@@ -7,7 +7,7 @@
                                        :id => way.redaction.id), way.redaction) %>
   </div>
 <% else %>
-  <%= tag.div :class => ["browse-section", "browse-way", { "text-muted" => way.redacted? }] do %>
+  <%= tag.div :class => ["browse-section", "browse-way", { "text-body-secondary" => way.redacted? }] do %>
     <%= render :partial => "browse/common_details", :object => way %>
 
     <% unless way.containing_relation_members.empty? %>
index a125a135a5ff34c315f47cde4e4f0781492ee771..acb6c9834a20fb72adace17eb8c6144db7e892c1 100644 (file)
@@ -9,7 +9,7 @@
     </div>
   </div>
 
-  <small class='text-muted'>
+  <small class='text-body-secondary'>
     <%= t(".created_by_html", :link_user => link_to(changeset.user.display_name, changeset.user), :created => l(changeset.created_at, :format => :blog)) %>
   </small>
 </div>
index 3ba3968f704b20626496e189676fec7e9e831994..d44ccfc075934a552ea4fc5c0ccf557de937ec15 100644 (file)
@@ -31,7 +31,7 @@
       <% @comments.each do |comment| %>
         <% next unless comment.visible || current_user&.moderator? %>
         <li id="c<%= comment.id %>">
-          <small class='text-muted'>
+          <small class='text-body-secondary'>
             <%= 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, comment.author) %>
index 879fb8f337cebf45c1a4f15ff46efdd1d5c422a6..4f98a85399a206d93f0be0dca30d3a9d49676e40 100644 (file)
 <% else %>
   <h1>
     <%= t ".introduction_1" %>
-    <span class="text-muted">
+    <span class="text-body-secondary">
       <%= t ".introduction_2" %>
     </span>
   </h1>
 
-  <p class='text-muted'>
+  <p class='text-body-secondary'>
     <%= t ".resend_html",
           :reconfirm_link => link_to(t(".click_here"), url_for(:action => "confirm_resend")) %>
   </p>
index b28a28a26770ead4a7ffd029bcab072d8bf63a5e..759faab8f7d50d713a301ffab32b29d6ba959e65 100644 (file)
@@ -9,7 +9,7 @@
     <%= user_thumbnail contact %>
   </div>
   <div class="col">
-    <p class='text-muted mb-0'>
+    <p class='text-body-secondary mb-0'>
       <%= link_to contact.display_name, contact %>
       <% if @user.home_location? and contact.home_location? %>
         <% distance = @user.distance(contact) %>
@@ -32,7 +32,7 @@
     </p>
 
     <nav class='secondary-actions'>
-      <ul class='clearfix text-muted'>
+      <ul class='clearfix text-body-secondary'>
         <li><%= link_to t("users.show.send message"), new_message_path(contact) %></li>
         <li>
           <% if current_user.friends_with?(contact) %>
index 5ade361aa1ac66ff90f0f70f1981a0e94a5f4637..c3c68fbc9934f0afdf2592e876f680d1ff9220f3 100644 (file)
@@ -1,9 +1,9 @@
-<div class="row diary-comment border-bottom py-3<%= " text-muted bg-danger bg-opacity-10" unless diary_comment.visible? %>">
+<div class="row diary-comment border-bottom py-3<%= " text-body-secondary bg-danger bg-opacity-10" unless diary_comment.visible? %>">
   <div class="col-auto pe-0 text-center">
     <%= user_thumbnail diary_comment.user %>
   </div>
   <div class="col">
-    <p class="text-muted m-0" id="comment<%= diary_comment.id %>"><%= t(".comment_from_html", :link_user => (link_to diary_comment.user.display_name, diary_comment.user), :comment_created_at => link_to(l(diary_comment.created_at, :format => :friendly), :anchor => "comment#{diary_comment.id}")) %>
+    <p class="text-body-secondary m-0" id="comment<%= diary_comment.id %>"><%= t(".comment_from_html", :link_user => (link_to diary_comment.user.display_name, diary_comment.user), :comment_created_at => link_to(l(diary_comment.created_at, :format => :friendly), :anchor => "comment#{diary_comment.id}")) %>
       <% if current_user and diary_comment.user.id != current_user.id %>
         | <%= report_link(t(".report"), diary_comment) %>
       <% end %>
index 9c7d7b2dc297bc211c6772d3902048eb60f9e0f0..d4ee530d7f9d80b7787ccdf52b20fd37b261a2cd 100644 (file)
@@ -1,4 +1,4 @@
-<article class='diary_post border-top border-secondary-subtle py-3<%= " text-muted px-3 bg-danger bg-opacity-10" unless diary_entry.visible %> user_<%= diary_entry.user.id %>'>
+<article class='diary_post border-top border-secondary-subtle py-3<%= " text-body-secondary px-3 bg-danger bg-opacity-10" unless diary_entry.visible %> user_<%= diary_entry.user.id %>'>
   <%= render :partial => "diary_entry_heading", :object => diary_entry, :as => "diary_entry" %>
 
   <div class="richtext text-break" xml:lang="<%= diary_entry.language_code %>" lang="<%= diary_entry.language_code %>">
index 30f7bc03baf2a13a27e4827901a1d1849dffc35d..b6dca2ee41da292f471562040cbe4c1ac45d54bc 100644 (file)
@@ -12,7 +12,7 @@
     </div>
   <% end %>
 
-  <small class='text-muted'>
+  <small class='text-body-secondary'>
     <%= t("diary_entries.diary_entry.posted_by_html", :link_user => (link_to diary_entry.user.display_name, diary_entry.user), :created => l(diary_entry.created_at, :format => :blog), :language_link => (link_to diary_entry.language.name, :controller => "diary_entries", :action => "index", :display_name => nil, :language => diary_entry.language_code)) %>
     <% if (l(diary_entry.updated_at, :format => :blog) != l(diary_entry.created_at, :format => :blog)) %>
       <%= t("diary_entries.diary_entry.updated_at_html", :updated => l(diary_entry.updated_at, :format => :blog)) %>
index aa0fceb95c921046bb962547c7a5816f8089692b..aa5c163847912083e64b706c9112910f869657a3 100644 (file)
     </thead>
     <% @comments.each do |comment| -%>
     <tr>
-      <td width="25%" class="<%= "text-muted" unless comment.visible? %>"><%= link_to comment.diary_entry.title, diary_entry_path(comment.diary_entry.user, comment.diary_entry) %></td>
-      <td width="25%" class="<%= "text-muted" unless comment.visible? %>">
+      <td width="25%" class="<%= "text-body-secondary" unless comment.visible? %>"><%= link_to comment.diary_entry.title, diary_entry_path(comment.diary_entry.user, comment.diary_entry) %></td>
+      <td width="25%" class="<%= "text-body-secondary" unless comment.visible? %>">
         <%= friendly_date_ago(comment.created_at) %>
       </td>
-      <td width="50%" class="richtext text-break<%= " text-muted" unless comment.visible? %>"><%= comment.body.to_html %></td>
+      <td width="50%" class="richtext text-break<%= " text-body-secondary" unless comment.visible? %>"><%= comment.body.to_html %></td>
     </tr>
     <% end -%>
   </table>
index 9200b4cec6246b8feebcc7dbaab1eee77fe19a43..f828e5a4350b4a80bb64306190aa85ecc4cd18bd 100644 (file)
@@ -5,7 +5,7 @@
         <%= link_to user_thumbnail(comment.user), comment.user %>
       </div>
       <div class="col">
-        <p class="text-muted">
+        <p class="text-body-secondary">
           <%= 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) %>
index 2d1b78800688bcb17d024b1d603c83fed890dd36..2d0f1650bdf4f3c2040c0c8c09086f7641ef7f92 100644 (file)
@@ -4,7 +4,7 @@
       <%= link_to user_thumbnail(report.user), report.user %>
     </div>
     <div class="col">
-      <p class="text-muted">
+      <p class="text-body-secondary">
         <%= t ".reported_by_html", :category => report.category,
                                    :user => link_to(report.user.display_name, report.user),
                                    :updated_at => tag.time(l(report.updated_at.to_datetime, :format => :friendly),
index ad463c259320daa443ac57d4836a2faf30d4059a..a58b8c5cb18b4f36c4bb1c0bf978618dc08b0255 100644 (file)
@@ -1,7 +1,7 @@
 <% content_for :heading do %>
 <h1><%= t ".title", :status => @issue.status.humanize, :issue_id => @issue.id %></h1>
 <p><%= @issue.reportable.model_name.human %> : <%= link_to reportable_title(@issue.reportable), reportable_url(@issue.reportable) %></p>
-<p class="text-muted">
+<p class="text-body-secondary">
   <small>
     <%= @issue.assigned_role %>
     <% if @issue.reports.count > 0 %>
@@ -45,7 +45,7 @@
     <h3><%= t ".reports_of_this_issue" %></h3>
 
     <% if @read_reports.present? %>
-    <div class="bg-body-tertiary text-muted">
+    <div class="bg-body-tertiary text-body-secondary">
       <h4><%= t ".read_reports" %></h4>
       <%= render "reports", :reports => @read_reports %>
     </div>
index 724ca552635e4582313d043070a85b3077a5faa7..3c691612ab1d4c37ec1ad7a0f8c001b334e50272 100644 (file)
@@ -12,6 +12,6 @@
   <%= yield :head %>
   <%= yield :auto_discovery_link_tag %>
   <%= csrf_meta_tag %>
-  <meta name="csp-nonce" content="<%= content_security_policy_style_nonce %>" />
+  <%= csp_meta_tag %>
   <title><%= "#{@title} | " if @title %><%= t "layouts.project_name.title" %></title>
 <% end %>
index 8942eb49c5703e3b3e13cdcafbff1366e570485a..77ef647a0d7817877544df342fee46024963e338 100644 (file)
@@ -1,7 +1,7 @@
 <header class="d-flex bg-body text-nowrap closed z-3">
-  <h1 class="m-0 fw-semibold">
-    <a href="<%= root_path %>" class="text-body-emphasis text-decoration-none geolink">
-      <%= image_tag "osm_logo.png", :srcset => image_path("osm_logo.svg"), :alt => t("layouts.logo.alt_text"), :width => 30, :height => 30, :class => "logo" %>
+  <h1 class="d-flex m-0 fw-semibold">
+    <a href="<%= root_path %>" class="icon-link gap-1 text-body-emphasis text-decoration-none geolink">
+      <%= image_tag "osm_logo.png", :srcset => image_path("osm_logo.svg"), :alt => t("layouts.logo.alt_text"), :size => 30 %>
       <%= t "layouts.project_name.h1" %>
     </a>
   </h1>
@@ -31,8 +31,8 @@
       <%= link_to t("layouts.export"), export_path, :class => "btn btn-outline-primary geolink", :id => "export_tab" %>
     </div>
   </nav>
-  <nav class='secondary'>
-    <ul class='mx-1 px-0'>
+  <nav class='secondary d-flex gap-2 align-items-center'>
+    <ul class='nav flex-nowrap'>
       <% if Settings.status != "database_offline" && can?(:index, Issue) %>
         <li class="compact-hide nav-item">
           <%= link_to issues_path(:status => "open"), :class => header_nav_link_class(issues_path) do %>
     </ul>
     <% if current_user && current_user.id %>
       <div class='d-inline-flex dropdown user-menu logged-in'>
-        <button class='dropdown-toggle btn btn-outline-secondary border-secondary-subtle bg-body text-secondary px-2 py-1 flex-grow-1' type='button' data-bs-toggle='dropdown'>
+        <button class='d-flex gap-1 align-items-center justify-content-center dropdown-toggle btn btn-outline-secondary border-secondary-subtle bg-body text-secondary px-2 py-1 flex-grow-1' type='button' data-bs-toggle='dropdown'>
           <%= user_thumbnail_tiny(current_user, :width => 25, :height => 25, :class => "user_thumbnail_tiny rounded-1 bg-body") %>
-          <%= render :partial => "layouts/inbox" %>
-          <span class="user-button">
-            <span class='username'>
-              <%= current_user.display_name %>
-            </span>
+          <% if current_user.new_messages.size > 0 %>
+            <span class="badge count-number position-static m-1"><%= current_user.new_messages.size %></span>
+          <% end %>
+          <span class='username align-middle text-truncate'>
+            <%= current_user.display_name %>
           </span>
         </button>
         <div class='dropdown-menu dropdown-menu-end'>
           <%= link_to t("layouts.logout"), logout_path(:referer => request.fullpath), :method => "post", :class => "geolink dropdown-item" %>
         </div>
       </div>
-    <% elsif (controller_name != "users" and controller_name != "sessions") || action_name != "new" %>
+    <% else %>
       <div class="d-inline-flex btn-group login-menu" role="">
         <%= link_to t("layouts.log_in"), login_path(:referer => request.fullpath), :class => "geolink btn btn-outline-secondary" %>
         <%= link_to t("layouts.sign_up"), user_new_path, :class => "btn btn-outline-secondary" %>
diff --git a/app/views/layouts/_inbox.html.erb b/app/views/layouts/_inbox.html.erb
deleted file mode 100644 (file)
index 2f5a637..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-<% if current_user.new_messages.size > 0 %>
-<span id="inboxanchor" class="badge count-number m-1"><%= current_user.new_messages.size %></span>
-<% end %>
index 41529e0c2d92293b58bcd9c16d33382183b54d4b..da9aa1c9e4ab89b4f6d3bc31cd54f03783925513 100644 (file)
         </div>
       </div>
       <div class="col-auto">
-        <%= link_to image_tag("directions.png", :width => "20", :height => "20", :class => "align-bottom"), directions_path, :class => "btn btn-sm btn-primary switch_link", :title => t("site.search.get_directions_title") %>
+        <%= link_to directions_path, :class => "btn btn-sm btn-primary px-1 switch_link", :title => t("site.search.get_directions_title") do %>
+          <svg width="28" height="20" class="align-bottom">
+            <path d="M11.5 9.5 v-3h3v-1l-5 -5l-5 5v1h3v6" fill="none" stroke="#fff8" />
+            <path d="M7.5 19.5h4v-5a1 1 0 0 1 1 -1h5v3h1l5 -5l-5 -5h-1v3h-6a4 4 0 0 0 -4 4z" fill="#fff8" stroke="#fff" />
+          </svg>
+        <% end %>
       </div>
     </div>
   </form>
index 6728b32ffbc6a501abb252fc6941b3ec3e2cfdcd..c9b1275b9493f43c9bca1525341dd9b6910af7d2 100644 (file)
@@ -15,7 +15,7 @@
     <div class="mb-3">
       <textarea class="form-control" name="text" cols="40" rows="10" maxlength="2000" placeholder="<%= t(".advice") %>"></textarea>
     </div>
-    <div class="btn-wrapper">
+    <div>
       <input type="submit" name="add" value="<%= t(".add") %>" disabled="1" class="btn btn-primary">
     </div>
   </form>
index a7baccf856dec921056d6c40fd8da7a8c75ff685..a04cbf9d9b215dee8fa5da9578bc27a0ef398c6c 100644 (file)
@@ -4,7 +4,7 @@
 
 <div>
   <h4><%= t(".description") %></h4>
-  <div class="note-description">
+  <div class="overflow-hidden ms-2">
     <%= h(@note_comments.first.body.to_html) %>
   </div>
 
@@ -33,7 +33,7 @@
       <ul class="list-unstyled">
         <% @note_comments.drop(1).each do |comment| %>
           <li id="c<%= comment.id %>">
-            <small class='text-muted'><%= note_event(comment.event, comment.created_at, comment.author) %></small>
+            <small class='text-body-secondary'><%= note_event(comment.event, comment.created_at, comment.author) %></small>
             <div class="mx-2">
               <%= comment.body.to_html %>
             </div>
@@ -51,7 +51,7 @@
         </div>
         <div id="comment-error" class="alert alert-danger p-2 mb-3" hidden>
         </div>
-        <div class="btn-wrapper">
+        <div class="d-flex flex-wrap gap-1">
           <% if current_user.moderator? -%>
             <%= submit_tag t(".hide"), :name => "hide", :class => "btn btn-light",
                                        :data => { :method => "DELETE",
@@ -77,7 +77,7 @@
       <input type="hidden" name="text" value="" autocomplete="off">
       <div id="comment-error" class="alert alert-danger p-2 mb-3" hidden>
       </div>
-      <div class="btn-wrapper">
+      <div class="d-flex flex-wrap gap-1">
         <% if @note.status != "hidden" and current_user and current_user.moderator? -%>
           <input type="submit" name="hide" value="<%= t(".hide") %>" class="btn btn-light" data-method="DELETE" data-url="<%= api_note_url(@note, "json") %>">
         <% end -%>
@@ -90,7 +90,7 @@
 
   <% if current_user && current_user != @note.author %>
     <p>
-      <small class="text-muted">
+      <small class="text-body-secondary">
         <%= t ".report_link_html", :link => report_link(t(".report"), @note) %>
         <% if @note.status == "open" %>
           <%= t ".other_problems_resolve", :link => report_link(t(".report"), @note) %>
   <% end %>
 
   <% if @note.freshly_closed? %>
-    <small class="text-muted">
+    <small class="text-body-secondary">
       <%= t ".disappear_date_html", :disappear_in => friendly_date(@note.freshly_closed_until) %>
     </small>
   <% end %>
index 57e852182941301acd09cb75543270dc149a406b..796e3e776857c551d06349c413d95333184d06cf 100644 (file)
@@ -3,14 +3,14 @@
     <ul class="list-unstyled mb-0">
       <li><%= link_to application.name, oauth_application_path(application) %></li>
       <% application.redirect_uri.split.each do |uri| -%>
-        <li class="text-muted"><%= uri %></li>
+        <li class="text-body-secondary"><%= uri %></li>
       <% end -%>
     </ul>
   </td>
   <td class="align-middle">
     <ul class="list-unstyled mb-0">
       <% application.scopes.each do |scope| -%>
-        <li><%= authorization_scope(scope) %> <code class="text-muted">(<%= scope %>)</code></li>
+        <li><%= authorization_scope(scope) %> <code class="text-body-secondary">(<%= scope %>)</code></li>
       <% end -%>
     </ul>
   </td>
index 8d9c8516dfd297ad5494e946a082d464bd16631b..2c4557c1e301ad4c4a9c90176de26816570d1787 100644 (file)
@@ -28,7 +28,7 @@
     <td>
       <ul class="list-unstyled mb-0">
         <% @application.scopes.each do |scope| -%>
-          <li><%= t "oauth.scopes.#{scope}" %> <code class="text-muted">(<%= scope %>)</code></li>
+          <li><%= t "oauth.scopes.#{scope}" %> <code class="text-body-secondary">(<%= scope %>)</code></li>
         <% end -%>
       </ul>
     </td>
index d755be52cae4b7d3f0bb931f9de4351f6d13db8a..fea15eb2fa4913628e0f23d57bf14f945e36ea32 100644 (file)
@@ -42,7 +42,7 @@
 
   <fieldset>
     <legend><%= t ".home location" -%></legend>
-    <p id="home_message" class="text-muted m-0<% if current_user.home_location? %> invisible<% end %>"><%= t ".no home location" %></p>
+    <p id="home_message" class="text-body-secondary m-0<% if current_user.home_location? %> invisible<% end %>"><%= t ".no home location" %></p>
     <div class="row">
       <%= f.text_field :home_lat, :wrapper_class => "col-sm-4 d-flex flex-column", :class => "mt-auto", :id => "home_lat" %>
       <%= f.text_field :home_lon, :wrapper_class => "col-sm-4 d-flex flex-column", :class => "mt-auto", :id => "home_lon" %>
index 71c0a14f3d2d2c7c58600eb9bcf170f8b5de2704..70839d1608533e0da9f29eb5f1ef81a7e8cd75d9 100644 (file)
@@ -7,16 +7,16 @@
 
 <% content_for :heading do %>
   <% if @client_app_name %>
-    <p class="text-center text-muted fs-6 py-2 mb-0 bg-body"><%= t(".login_to_authorize_html", :client_app_name => @client_app_name) %></p>
+    <p class="text-center text-body-secondary fs-6 py-2 mb-0 bg-body"><%= t(".login_to_authorize_html", :client_app_name => @client_app_name) %></p>
   <% end %>
 
   <div class="header-illustration new-user-main auth-container mx-auto">
-    <ul class="nav nav-tabs position-absolute bottom-0 px-3 fs-6 w-100">
+    <ul class="nav nav-tabs position-absolute bottom-0 fs-6 w-100">
       <li class="nav-item">
         <%= link_to t("sessions.new.tab_title"), "#", :class => "nav-link active" %>
       </li>
       <li class="nav-item">
-        <%= link_to t("users.new.tab_title"), url_for(:action => :new, :controller => :users), :class => "nav-link" %>
+        <%= link_to t("users.new.tab_title"), url_for(:action => :new, :controller => :users, :referer => params[:referer]), :class => "nav-link" %>
       </li>
     </ul>
   </div>
@@ -25,7 +25,7 @@
 <div id="login_login" class="auth-container mx-auto my-0">
   <% if @preferred_auth_provider %>
     <%= render :partial => "auth_providers" %>
-    <div class="d-flex justify-content-center align-items-center">
+    <div class="d-flex justify-content-center align-items-center mb-2">
       <div class="border-bottom border-1 flex-grow-1"></div>
       <div class="text-secondary mx-3"><%= t ".or" %></div>
       <div class="border-bottom border-1 flex-grow-1"></div>
   <%= bootstrap_form_tag(:action => "login", :html => { :id => "login_form" }) do |f| %>
     <%= hidden_field_tag("referer", h(params[:referer]), :autocomplete => "off") %>
 
-    <%= f.text_field :username, :label => t(".email or username"), :tabindex => 1, :value => params[:username] %>
+    <%= f.text_field :username, :label => t(".email or username"), :autofocus => true, :tabindex => 1, :value => params[:username] %>
 
     <div class="row">
       <div class="col">
-        <%= f.label :password, :class => "form-label" %>
+        <%= f.label :password, t(".password"), :class => "form-label" %>
       </div>
       <div class="col text-end">
         <small><%= link_to(t(".lost password link"), user_forgot_password_path) %></small>
       </div>
     </div>
-    <input class="form-control mb-3" type="password" name="password" id="password" tabindex="2" value="" autocomplete="off" />
+    <input class="form-control mb-3" type="password" name="password" id="password" tabindex="2" value="" autocomplete="on" />
 
     <%= f.form_group do %>
       <%= f.check_box :remember_me, { :label => t(".remember"), :tabindex => 3, :checked => (params[:remember_me] == "yes") }, "yes" %>
index 5098a1eee75790c98307037aefcbf1441c650599..0224fd3ea89d82a55a4de32fed27df6e3325d1d6 100644 (file)
@@ -1,6 +1,9 @@
-  <h2><%= t ".title" %></h2>
-  <div class='clearfix'>
-  <span class='sprite small term question float-start'></span>
+<h2><%= t ".title" %></h2>
+<div class='d-flex align-items-center gap-2'>
+  <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+    <circle cx="50" cy="50" r="45" fill="#7092ff" />
+    <path d="M44.42 54.95q0-3 1.26-5.04 1.26-2.04 4.32-4.26 2.7-1.92 3.84-3.3 1.2-1.44 1.2-3.36 0-1.92-1.44-2.88-1.38-1.02-3.9-1.02-2.52 0-4.98.78-2.46.78-5.04 2.1l-3.18-6.42q2.94-1.62 6.36-2.64 3.42-1.02 7.5-1.02 6.24 0 9.66 3 3.48 3 3.48 7.62 0 2.46-.78 4.26-.78 1.8-2.34 3.36-1.56 1.5-3.9 3.24-1.74 1.26-2.7 2.16-.96.9-1.32 1.74-.3.84-.3 2.1v1.74h-7.74zm-.96 12.18q0-2.76 1.5-3.84 1.5-1.14 3.66-1.14 2.1 0 3.6 1.14 1.5 1.08 1.5 3.84 0 2.64-1.5 3.84-1.5 1.14-3.6 1.14-2.16 0-3.66-1.14-1.5-1.2-1.5-3.84z" fill="#fff" />
+  </svg>
   <p><%= t ".paragraph_1_html", :help_link => link_to(t(".get_help_here"), help_path),
                                 :welcome_mat_link => link_to(t(".welcome_mat"), t(".welcome_mat_url")) %></p>
-  </div>
+</div>
index 3edafd8b7fc8ac99ff0b5bec2d768056a8e7c3b7..1e943c7cc8dc8eccffa8856a10cdb387cac7b1a4 100644 (file)
 
 <div class='row'>
   <div class='col-sm'>
-    <h5><%= t ".how_to_help.join_the_community.title" %></h5>
+    <h3 class='fs-5'><%= t ".how_to_help.join_the_community.title" %></h3>
     <p><%= t ".how_to_help.join_the_community.explanation_html" %></p>
     <p class='text-center'>
       <a class="btn btn-primary" href="<%= user_new_path %>"><%= t("layouts.start_mapping") %></a>
     </p>
   </div>
   <div class='col-sm'>
-    <h5><%= t "site.welcome.add_a_note.title" %></h5>
+    <h3 class='fs-5'><%= t "site.welcome.add_a_note.title" %></h3>
     <p><%= t "site.welcome.add_a_note.para_1" %></p>
     <p><%= t ".how_to_help.add_a_note.instructions_1_html", :note_icon => tag.a(:class => "icon note bg-dark rounded-1") %></p>
   </div>
index 3f16e08454947e97ab437db2a1b77994f0d890fb..33c9a7e24609f10427ef84759a89bec893d3d5b7 100644 (file)
 
 <div class='row'>
   <div class='col-sm'>
-    <div>
-      <span class='sprite small check mx-auto'></span>
-    </div>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='d-block mx-auto'>
+      <circle cx="50" cy="50" r="45" fill="#70cd8f" />
+      <path d="M31 46h-2l-3 3v2l14 14 5 5 5-5 25-25v-2l-3-3h-2l-25 25z" fill="#fff" />
+    </svg>
     <p><%= t ".whats_on_the_map.on_the_map_html", :real_and_current => tag.em(t(".whats_on_the_map.real_and_current")) %></p>
   </div>
   <div class='col-sm'>
-    <div>
-      <span class='sprite small x mx-auto'></span>
-    </div>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='d-block mx-auto'>
+      <circle cx="50" cy="50" r="45" fill="#cd7070" />
+      <path d="M35 30h-2l-3 3v2l15 15-15 15v2l3 3h2l15-15 15 15h2l3-3v-2l-15-15 15-15v-2l-3-3h-2l-15 15z" fill="#fff" />
+    </svg>
     <p><%= t ".whats_on_the_map.off_the_map_html", :doesnt => tag.em(t(".whats_on_the_map.doesnt")) %></p>
   </div>
 </div>
 
 <p><%= t ".basic_terms.paragraph_1" %></p>
 
-<div>
-  <div class='align-middle mb-2'>
-    <span class='sprite small term editor'></span>
+<ul class='list-unstyled'>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <path d="M19.728 30.552l19.834-15.219L80 65l-19.834 15.219z" fill="#7092ff" opacity=".5" />
+      <path d="M10.597 18.651l19.834-15.219 6.088 7.934-19.834 15.219zm52.613 65.535l19.834-15.219 1.198 17.988-3.967 3.044z" fill="#7092ff" />
+    </svg>
     <span><%= t ".basic_terms.an_editor_html", :editor => tag.strong(t(".basic_terms.editor")) %></span>
-  </div>
-  <div class='align-middle mb-2'>
-    <span class='sprite small term node'></span>
+  </li>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <path d="M50 5c-20.71 0-37.5 16.789-37.5 37.5s37.5 52.5 37.5 52.5 37.5-31.789 37.5-52.5-16.789-37.5-37.5-37.5z" fill="#7092ff" />
+      <circle cx="50" cy="42.5" r="15" fill="#fff" />
+    </svg>
     <span><%= t ".basic_terms.a_node_html", :node => tag.strong(t(".basic_terms.node")) %></span>
-  </div>
-  <div class='align-middle mb-2'>
-    <span class='sprite small term way'></span>
+  </li>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <line x1="20" y1="80" x2="80" y2="20" stroke="#7092ff" stroke-width="15" />
+      <circle cx="20" cy="80" r="15" fill="#7092ff" />
+      <circle cx="80" cy="20" r="15" fill="#7092ff" />
+      <circle cx="20" cy="80" r="7" fill="#fff" />
+      <circle cx="80" cy="20" r="7" fill="#fff" />
+    </svg>
     <span><%= t ".basic_terms.a_way_html", :way => tag.strong(t(".basic_terms.way")) %></span>
-  </div>
-  <div class='align-middle mb-2'>
-    <span class='sprite small term tag'></span>
+  </li>
+  <li class='d-flex align-items-center gap-2 mb-2'>
+    <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+      <path d="M25 87l-20-20v-29l20-20h68l2 2v65l-2 2z" fill="#7092ff" />
+      <rect width="10" height="15" x="15" y="45" rx="3" ry="2.25" fill="#fff" />
+    </svg>
     <span><%= t ".basic_terms.a_tag_html", :tag => tag.strong(t(".basic_terms.tag")) %></span>
-  </div>
-</div>
+  </li>
+</ul>
 
-<div class='clearfix'>
-  <h2><%= t ".rules.title" %></h2>
-  <span class='sprite small term rules float-start'></span>
+<h2><%= t ".rules.title" %></h2>
+<div class='d-flex align-items-center gap-2'>
+  <svg width='50' height='50' viewBox='0 0 100 100' class='flex-shrink-0 align-self-start'>
+    <circle cx="50" cy="50" r="45" fill="#7092ff" />
+    <path d="M41.072 49.28q0-2.4 1.152-3.84 1.152-1.488 2.64-2.208-1.728-.96-2.688-2.256-.96-1.344-.96-3.264 0-2.88 2.448-4.512 2.448-1.68 7.008-1.68 2.688 0 4.56.48 1.872.432 3.648 1.152l-1.296 3.216q-1.632-.672-3.264-1.104-1.632-.48-3.936-.48-2.88 0-4.08.768-1.152.72-1.152 2.064 0 1.344 1.344 2.304 1.344.912 4.992 2.256 3.696 1.344 5.76 3.072 2.064 1.728 2.064 4.608 0 2.448-1.104 4.032-1.104 1.536-2.496 2.352 1.68.912 2.592 2.208.96 1.248.96 3.072 0 3.312-2.784 5.136-2.736 1.824-7.68 1.824-2.64 0-4.608-.384-1.968-.432-3.504-1.2v-3.6q1.536.72 3.792 1.344 2.256.624 4.512.624 3.552 0 4.896-1.008 1.344-1.056 1.344-2.4 0-.912-.48-1.584-.432-.672-1.776-1.392-1.296-.768-3.936-1.728-2.496-.96-4.32-1.968-1.776-1.008-2.736-2.4-.912-1.392-.912-3.504zm3.6-.48q0 1.776 1.488 3.024 1.536 1.2 5.376 2.64l1.056.384q1.104-.672 2.064-1.68 1.008-1.056 1.008-2.688 0-1.2-.672-2.16-.624-.96-2.256-1.824-1.632-.912-4.608-1.824-1.344.336-2.4 1.44-1.056 1.104-1.056 2.688z" fill="#fff" stroke="#fff" />
+  </svg>
   <p><%= t ".rules.para_1_html", :imports_link => link_to(t(".rules.imports"), t(".rules.imports_url")),
                                  :automated_edits_link => link_to(t(".rules.automated_edits"), t(".rules.automated_edits_url")) %></p>
 </div>
 
-<div class='clearfix'>
-  <%= render "any_questions" %>
-</div>
+<%= render "any_questions" %>
 
-<div class='clearfix text-center'>
-  <p class="display-5">
+<div class='text-center mb-3'>
 <% if params[:oauth_return_url] %>
   <a class="btn btn-primary" href="<%= params[:oauth_return_url] %>"><%= t ".continue_authorization" %></a>
 <% else %>
-  <a class="button btn btn-primary start-mapping" href="<%= edit_path %>"><%= t ".start_mapping" %></a>
+  <a class="btn btn-primary start-mapping" href="<%= edit_path %>"><%= t ".start_mapping" %></a>
 <% end %>
-  </p>
 </div>
 
 <div class='alert alert-primary'>
index cd4dce99e1c2eca1592f1213027ec22a1f3c7fa6..37713679f1c12ee6a58ee7119f1f8999de900f3f 100644 (file)
@@ -30,7 +30,7 @@
         <span class="badge bg-<%= badge_class %> text-white"><%= t(".#{trace.visibility}") %></span>
       </li>
     </ul>
-    <p class="text-muted mb-0">
+    <p class="text-body-secondary mb-0">
       <% if trace.tags.empty? %>
         <%= t ".details_without_tags_html", :time_ago => friendly_date_ago(trace.timestamp),
                                             :user => link_to(trace.user.display_name, trace.user) %>
index a2a06836066398b467da603578321a1c93a1ba09..b618f381107260222c9343f3e7db44ef64173654 100644 (file)
@@ -7,13 +7,13 @@
 
 <% content_for :heading do %>
   <% if @client_app_name %>
-    <p class="text-center text-muted fs-6 py-2 mb-0 bg-body"><%= t(".signup_to_authorize_html", :client_app_name => @client_app_name) %></p>
+    <p class="text-center text-body-secondary fs-6 py-2 mb-0 bg-body"><%= t(".signup_to_authorize_html", :client_app_name => @client_app_name) %></p>
   <% end %>
 
   <div class="header-illustration new-user-main auth-container mx-auto">
-    <ul class="nav nav-tabs position-absolute bottom-0 px-3 fs-6 w-100">
+    <ul class="nav nav-tabs position-absolute bottom-0 fs-6 w-100">
       <li class="nav-item">
-        <%= link_to t("sessions.new.tab_title"), url_for(:action => :new, :controller => :sessions), :class => "nav-link" %>
+        <%= link_to t("sessions.new.tab_title"), url_for(:action => :new, :controller => :sessions, :referer => @referer), :class => "nav-link" %>
       </li>
       <li class="nav-item">
         <%= link_to t("users.new.tab_title"), "#", :class => "nav-link active" %>
 
 <div class="auth-container mx-auto my-0">
   <% if current_user.auth_uid.nil? %>
-    <div class="text-muted fs-6">
+    <div class="text-body-secondary fs-6">
       <p><strong><%= t ".about.header" %></strong> <%= t ".about.paragraph_1" %></p>
       <p><%= t ".about.paragraph_2" %></p>
     </div>
 
     <% unless @preferred_auth_provider.nil? %>
       <%= render :partial => "auth_providers" %>
-      <div class="d-flex justify-content-center align-items-center">
+      <div class="d-flex justify-content-center align-items-center mb-2">
         <div class="border-bottom border-1 flex-grow-1"></div>
         <div class="text-secondary mx-3"><%= t ".or" %></div>
         <div class="border-bottom border-1 flex-grow-1"></div>
@@ -53,6 +53,7 @@
                                                                            t(".privacy_policy_url"),
                                                                            :title => t(".privacy_policy_title"),
                                                                            :target => :new)),
+                                :autofocus => true,
                                 :tabindex => 1 %>
     <% else %>
       <%= f.hidden_field :email %>
       </div>
     <% end %>
 
-    <p class="mb-3 text-muted fs-6"><%= t(".by_signing_up_html",
-                                          :tou_link => link_to(t("layouts.tou"),
-                                                               "https://wiki.osmfoundation.org/wiki/Terms_of_Use",
-                                                               :target => :new),
-                                          :privacy_policy_link => link_to(t(".privacy_policy"),
-                                                                          t(".privacy_policy_url"),
-                                                                          :title => t(".privacy_policy_title"),
-                                                                          :target => :new),
-                                          :contributor_terms_link => link_to(t(".contributor_terms"),
-                                                                             t(".contributor_terms_url"),
-                                                                             :target => :new)) %></p>
+    <p class="mb-3 text-body-secondary fs-6"><%= t(".by_signing_up_html",
+                                                   :tou_link => link_to(t("layouts.tou"),
+                                                                        "https://wiki.osmfoundation.org/wiki/Terms_of_Use",
+                                                                        :target => :new),
+                                                   :privacy_policy_link => link_to(t(".privacy_policy"),
+                                                                                   t(".privacy_policy_url"),
+                                                                                   :title => t(".privacy_policy_title"),
+                                                                                   :target => :new),
+                                                   :contributor_terms_link => link_to(t(".contributor_terms"),
+                                                                                      t(".contributor_terms_url"),
+                                                                                      :target => :new)) %></p>
     <%= f.form_group do %>
       <%= f.check_box :consider_pd,
                       :tabindex => 5,
index 9da3f8f046884b37279fb2a579852006b277e41a..b6c5c6053373fa380045b51dc01564b18a68ace8 100644 (file)
         </nav>
       <% end %>
 
-      <div class='text-muted'>
+      <div class='text-body-secondary'>
         <small>
           <dl class="list-inline">
             <dt class="list-inline-item m-0"><%= t ".mapper since" %></dt>
       <% end %>
 
       <% if current_user and current_user.administrator? -%>
-        <div class='text-muted'>
+        <div class='text-body-secondary'>
           <small>
             <dl class="list-inline">
               <dt class="list-inline-item m-0"><%= t ".email address" %></dt>
index 340aaf04e2ac7c4604e8322844560f87e4759dde..b7efe912e27e68dea89326de851e2591b1f6e476 100644 (file)
 
 <%= form_tag({ :action => "save" }) do %>
   <!-- legale is <%= @legale %> -->
-  <p class="text-muted"><%= t ".read and accept with tou" %></p>
+  <p class="text-body-secondary"><%= t ".read and accept with tou" %></p>
   <h4>
     <%= t ".heading_ct" %>
   </h4>
-  <p class="text-muted"><%= t ".contributor_terms_explain" %></p>
+  <p class="text-body-secondary"><%= t ".contributor_terms_explain" %></p>
   <label class="form-label">
     <%= t ".legale_select" %>
   </label>
@@ -35,7 +35,7 @@
   </div>
 
   <div>
-    <p id="contributorGuidance" class="text-muted">
+    <p id="contributorGuidance" class="text-body-secondary">
       <%= t ".guidance_info_html",
             :readable_summary_link => link_to(t(".readable_summary"),
                                               "https://www.osmfoundation.org/wiki/License/Contributor_Terms_Summary"),
@@ -55,7 +55,7 @@
   <h4>
     <%= t "layouts.tou" %>
   </h4>
-  <p class="text-muted"><%= t ".tou_explain_html", :tou_link => link_to(t("layouts.tou"), "https://wiki.osmfoundation.org/wiki/Terms_of_Use", :target => :new) %></p>
+  <p class="text-body-secondary"><%= t ".tou_explain_html", :tou_link => link_to(t("layouts.tou"), "https://wiki.osmfoundation.org/wiki/Terms_of_Use", :target => :new) %></p>
 
   <div class="mb-3">
     <div class="form-check">
index 2bc4f5e59d40d07f552d36417bd3f211eda8d6ee..9d59656c7b2cd4255d019c523bf57952249e0648 100644 (file)
@@ -6,7 +6,7 @@ if defined?(ActiveRecord::ConnectionAdaptors::AbstractAdapter)
           if e.is_a?(Timeout::Error) || e.is_a?(OSM::APITimeoutError)
             e
           else
-            super(e, sql)
+            super
           end
         end
       end
index b3076b38fe14399a56099ba187b1cb21cac15f09..9ddaf70f94598b62f6d65a272457d61c68c05ed6 100644 (file)
@@ -4,22 +4,42 @@
 # See the Securing Rails Applications Guide for more information:
 # https://guides.rubyonrails.org/security.html#content-security-policy-header
 
-# Rails.application.configure do
-#   config.content_security_policy do |policy|
-#     policy.default_src :self, :https
-#     policy.font_src    :self, :https, :data
-#     policy.img_src     :self, :https, :data
-#     policy.object_src  :none
-#     policy.script_src  :self, :https
-#     policy.style_src   :self, :https
-#     # Specify URI for violation reports
-#     # policy.report_uri "/csp-violation-report-endpoint"
-#   end
-#
-#   # Generate session nonces for permitted importmap, inline scripts, and inline styles.
-#   config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
-#   config.content_security_policy_nonce_directives = %w(script-src style-src)
-#
-#   # Report violations without enforcing the policy.
-#   # config.content_security_policy_report_only = true
-# end
+Rails.application.configure do
+  connect_src = [:self]
+  img_src = [:self, :data, "www.gravatar.com", "*.wp.com", "tile.openstreetmap.org", "gps.tile.openstreetmap.org", "*.tile.thunderforest.com", "tile.tracestrack.com", "*.openstreetmap.fr"]
+  script_src = [:self]
+
+  connect_src << Settings.matomo["location"] if defined?(Settings.matomo)
+  img_src << Settings.matomo["location"] if defined?(Settings.matomo)
+  script_src << Settings.matomo["location"] if defined?(Settings.matomo)
+
+  img_src << Settings.avatar_storage_url if Settings.key?(:avatar_storage_url)
+  img_src << Settings.trace_image_storage_url if Settings.key?(:trace_image_storage_url)
+
+  config.content_security_policy do |policy|
+    policy.default_src :self
+    policy.child_src(:self)
+    policy.connect_src(*connect_src)
+    policy.font_src(:none)
+    policy.form_action(:self)
+    policy.frame_ancestors(:self)
+    policy.frame_src(:self)
+    policy.img_src(*img_src)
+    policy.manifest_src(:self)
+    policy.media_src(:none)
+    policy.object_src(:self)
+    policy.plugin_types
+    policy.script_src(*script_src)
+    policy.style_src(:self)
+    policy.worker_src(:none)
+    policy.manifest_src(:self)
+    policy.report_uri(Settings.csp_report_url) if Settings.key?(:csp_report_url)
+  end
+
+  # Generate session nonces for permitted importmap and inline scripts
+  config.content_security_policy_nonce_generator = ->(_request) { SecureRandom.base64(24) }
+  config.content_security_policy_nonce_directives = %w[style-src]
+
+  # Report violations without enforcing the policy.
+  config.content_security_policy_report_only = true unless Settings.csp_enforce
+end
index fdbf11a2ce05cacaaffcdd4a90a822518be92e81..e7b813b73f788fb7bf4cac947007c2ff0154340d 100644 (file)
@@ -6,7 +6,7 @@
 module OpenStreetMap
   class Cors < Rack::Cors
     def call(env)
-      status, headers, body = super(env)
+      status, headers, body = super
       headers["Cache-Control"] = "no-cache" if headers["Access-Control-Allow-Origin"]
       [status, headers, body]
     end
index 266e41cbb98d501435ba985efbdba9af475c8d63..8f74c3cd39455a0b5548aa8d6a364da9259a1309 100644 (file)
@@ -18,7 +18,7 @@ module OpenStreetMap
       def store_translations(locale, data, options = {})
         locale = ::I18n::Locale::Tag::Rfc4646.tag(locale).to_s
 
-        super(locale, data, options)
+        super
       end
     end
 
index 4bab2000b03ed897a600133b22bb9231ca32d4e8..30b23d2ddb47fa298df8dcba50a8aa5a82d3edc6 100644 (file)
@@ -4,7 +4,7 @@ module OpenStreetMap
       def perform(mailer, mail_method, delivery_method, *args, **kwargs)
         kwargs = args.pop if kwargs.empty? && args.last.is_a?(Hash)
 
-        super(mailer, mail_method, delivery_method, *args, **kwargs)
+        super
       end
     end
   end
index fbe4ad219161a6c87d58c872a98aced64b1acdfd..812e6610d9e67a46b1df270cd5a201cf41d3dff4 100644 (file)
@@ -45,7 +45,7 @@ module OpenStreetMap
         status = options.delete(:status) || :ok
         head status, options
       else
-        super(options)
+        super
       end
     end
 
@@ -61,7 +61,7 @@ module OpenStreetMap
           end
         end
 
-        super(controller)
+        super
       end
     end
   end
index 4357a87f25f47ea0cc98c8da6d9f155ed8dad750..849aba2ad15f428785b83f457b0141933dbdfd7a 100644 (file)
@@ -5,7 +5,7 @@ module OpenStreetMap
   module Router
     module ForceEncoding
       def normalize_path(path)
-        super(path).force_encoding("UTF-8")
+        super.force_encoding("UTF-8")
       end
     end
   end
index 11e4e0d5c053894f3752e730c06879d48e667dbb..793c484fc40127058a5ab790dcf0ae337151e6c8 100644 (file)
@@ -2,7 +2,7 @@ require "rtlcss"
 
 class RtlcssSCSSProcessor < SassC::Rails::ScssTemplate
   def self.call(input)
-    output = super(input)
+    output = super
     data = Rtlcss.flip_css(output[:data])
     output.delete(:map)
     output.merge(:data => data)
diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb
deleted file mode 100644 (file)
index 60f1551..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-csp_policy = {
-  :preserve_schemes => true,
-  :default_src => %w['self'],
-  :child_src => %w['self'],
-  :connect_src => %w['self'],
-  :font_src => %w['none'],
-  :form_action => %w['self'],
-  :frame_ancestors => %w['self'],
-  :frame_src => %w['self'],
-  :img_src => %w['self' data: www.gravatar.com *.wp.com tile.openstreetmap.org *.tile.openstreetmap.org *.tile.thunderforest.com tile.tracestrack.com *.openstreetmap.fr],
-  :manifest_src => %w['self'],
-  :media_src => %w['none'],
-  :object_src => %w['self'],
-  :plugin_types => %w[],
-  :script_src => %w['self'],
-  :style_src => %w['self'],
-  :worker_src => %w['none'],
-  :report_uri => []
-}
-
-csp_policy[:connect_src] << Settings.matomo["location"] if defined?(Settings.matomo)
-csp_policy[:img_src] << Settings.matomo["location"] if defined?(Settings.matomo)
-csp_policy[:script_src] << Settings.matomo["location"] if defined?(Settings.matomo)
-
-csp_policy[:img_src] << Settings.avatar_storage_url if Settings.key?(:avatar_storage_url)
-csp_policy[:img_src] << Settings.trace_image_storage_url if Settings.key?(:trace_image_storage_url)
-
-csp_policy[:report_uri] << Settings.csp_report_url if Settings.key?(:csp_report_url)
-
-cookie_policy = {
-  :httponly => { :only => %w[_osm_session _osm_totp_token] }
-}
-
-SecureHeaders::Configuration.default do |config|
-  config.hsts = SecureHeaders::OPT_OUT
-  config.referrer_policy = "strict-origin-when-cross-origin"
-
-  if Settings.csp_enforce
-    config.csp = csp_policy
-    config.csp_report_only = SecureHeaders::OPT_OUT
-  elsif Settings.key?(:csp_report_url)
-    config.csp = SecureHeaders::OPT_OUT
-    config.csp_report_only = csp_policy
-  else
-    config.csp = SecureHeaders::OPT_OUT
-    config.csp_report_only = SecureHeaders::OPT_OUT
-  end
-
-  config.cookies = cookie_policy
-end
index a122848553bf1a9f00fe4d09f2f18ee292617f3b..4119064c39cf1601dbcf5babc877ff06ae953ae1 100644 (file)
@@ -1,7 +1,7 @@
 # Be sure to restart your server when you modify this file.
 
 if Settings.key?(:memcache_servers)
-  Rails.application.config.session_store :mem_cache_store, :memcache_server => Settings.memcache_servers, :namespace => "rails:session", :key => "_osm_session"
+  Rails.application.config.session_store :mem_cache_store, :memcache_server => Settings.memcache_servers, :namespace => "rails:session", :key => "_osm_session", :same_site => :lax
 else
-  Rails.application.config.session_store :cache_store, :key => "_osm_session", :cache => ActiveSupport::Cache::MemoryStore.new
+  Rails.application.config.session_store :cache_store, :key => "_osm_session", :cache => ActiveSupport::Cache::MemoryStore.new, :same_site => :lax
 end
index a9f60ec4e3f1b5f22ac5626e2a04b92a7210cecb..0c1cf6f6f69b805c5f798488b2fb9b353b36e6f6 100644 (file)
@@ -19,6 +19,7 @@
 # Author: R4356th
 # Author: R4bb1
 # Author: Rasal Lia
+# Author: RiazACU
 # Author: Sayma Jahan
 # Author: Tahmid
 # Author: Tauhid16
index 67c5b031cf23ec04a7a1c86768ffa076b8e3b4e0..d91b60e3b4a1ede4b5bcf689268fe87a6df3cdcb 100644 (file)
@@ -676,6 +676,8 @@ br:
   errors:
     contact:
       contact: darempred
+    bad_request:
+      title: Reked fall
     forbidden:
       title: Difennet
     internal_server_error:
@@ -1927,7 +1929,8 @@ br:
       lost password link: Ankouaet ho ker-tremen ganeoc'h ?
       login_button: Kevreañ
       register now: En em enskrivañ bremañ
-      with external: 'Mod all, implijit un tredeour evit kevreañ :'
+      with external: 'pe kevreit gant un tredeour:'
+      or: pe
       auth failure: Ho tigarez, met n'eus ket bet gallet hoc'h anavezout gant an titouroù
         pourchaset.
     destroy:
@@ -2195,7 +2198,7 @@ br:
       close: Serriñ
     search:
       search: Klask
-      get_directions: Kaout an tuioù
+      get_directions: Kaout an durc'hadurioù
       get_directions_title: Kavit an hentoù etre an daou boent
       from: Eus
       to: Da
@@ -2417,6 +2420,7 @@ br:
       identifiable: ANAVEZADUS
       private: PREVEZ
       trackable: HEULIADUS
+      details_with_tags_html: '%{time_ago} gant %{user} e-barzh %{tags}'
       details_without_tags_html: '%{time_ago} gant %{user}'
     index:
       public_traces: Roudoù GPS foran
@@ -2451,6 +2455,7 @@ br:
         other: restr GPX gant %{count} poent digant {user}
       description_without_count: Restr GPX digant %{user}
   application:
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: N'emañ ket an aotreoù ret ganeoc'h evit seveniñ an ober-se.
     require_cookies:
       cookies_needed: Diweredekaet eo an toupinoù ganeoc'h war a seblant - gweredekait
@@ -2473,6 +2478,7 @@ br:
       muted_users: Implijerien kuzhet
     auth_providers:
       openid_logo_alt: Kevreañ gant un OpenID
+      openid_login_button: Kenderc'hel
       openid:
         title: Kevreañ gant OpenID
         alt: Kevreañ gant un URL OpenID
@@ -2623,20 +2629,23 @@ br:
   users:
     new:
       title: Kevreañ
+      tab_title: En em enskrivañ
       no_auto_account_create: Siwazh n'omp ket evit krouiñ ur gont evidoc'h ent emgefreek.
       please_contact_support_html: Kit e darempred gant ar %{support_link}, mar plij,
         evit ma krouo ur gont evidoc'h - klask a raimp plediñ gant ho koulenn kerkent
         ha ma vo tu.
       support: skor
       about:
-        header: Digoust hag aozadus
+        header: Digoust hag aozadus.
         paragraph_1: E-skoaz ar c'hartennoù all eo savet OpenStreetMap penn-da-benn
           gant tud eveldoc'h ha tu zo da bep hini reizhañ, hizivaat, pellgargañ hag
           implijout e gartennoù.
-        paragraph_2: Lakait hoc'h anv ha stagit da gemer perzh. Kaset a vo ur postel
-          deoc'h a-benn kadarnaat ho kont.
+        paragraph_2: Lakait hoc'h anv ha stagit da gemer perzh.
+        welcome: Degemer mat en OpenStreetMap
       display name description: Emañ hoc'h anv implijer a-wel d'an holl. Se a c'hallit
         cheñch diwezhatoc'h en ho penndibaboù.
+      tou: Termenoù implijout
+      contributor_terms: reolennoù ar genlabourerien
       external auth: 'Dilesadur trede :'
       continue: En em enskrivañ
       terms accepted: Trugarez deoc'h evit bezañ asantet da ziferadennoù nevez ar
@@ -2644,7 +2653,9 @@ br:
       email_help_html: Ho chomlec'h ne vo ket hewel d'an holl, sellit ouzh %{privacy_policy_link}
         evit gouzout hiroc'h.
       privacy_policy: reolennoù prevezded
-      use external auth: 'Mod all, implijit un tredeour evit kevreañ :'
+      consider_pd: domani foran
+      or: pe
+      use external auth: 'pe kevreit gant un tredeour:'
     terms:
       title: Termenoù
       heading: Termenoù
@@ -2974,12 +2985,15 @@ br:
       reactivate: Adweredekaat
       comment_and_resolve: Addisplegañ & Diskoulmañ
       comment: Evezhiadenn
+      log_in_to_comment: Kevreit evit skrivañ war an notenn-mañ
       other_problems_resolved: Evit an holl gudennoù all ez eo a-walc'h d'o diskoulmañ.
     new:
       title: Notenn nevez
       intro: Gwelet ho peus ur fazi pe un dra a vank ? Roit an dra-se da c'houzout
         d'ar gartennaouerien all evit ma vo renket. Lakait ar merker el lec'h mat
         ha skrivit un notenn da zisplegañ ar gudenn.
+      anonymous_warning_log_in: kevreañ
+      anonymous_warning_sign_up: en em enskrivañ
       advice: Foran eo ho notenn ha ne c'hall ket bezañ implijet evit hizivaat ar
         gartenn. Setu perak eo arabat ebarzhiñ titouroù personel pe titouroù o tont
         eus kartennoù gwarezet na endalc'hioù rolloù.
@@ -3036,6 +3050,7 @@ br:
         standard: Standard
         cycle_map: Kelc'hiad kartenn
         transport_map: Kartenn treuzdougen
+        tracestracktop_topo: Tracestrack Topo
         hot: Denegour
       layers:
         header: Gwiskadoù kartenn
@@ -3082,7 +3097,7 @@ br:
         fossgis_valhalla_car: Karr (Valhalla)
         fossgis_valhalla_foot: War droad (Valhalla)
       descend: Diskenn
-      directions: Tuioù
+      directions: Durc'hadurioù
       distance: Hed
       distance_m: '%{distance}m'
       distance_km: '%{distance}km'
index f609f48500f1c5ceaa670efa677c318ff3c7d051..c84032e2dedbd967d6ce65d632138f921e73d269 100644 (file)
@@ -2876,8 +2876,8 @@ cs:
       continue: Zaregistrovat se
       terms accepted: Děkujeme za odsouhlasení nových podmínek pro přispěvatele!
       email_help_html: Vaše adresa se nezobrazuje veřejně, více informací získáte
-        v našich %{privacy_policy_link}.
-      privacy_policy: pravidlech ochrany osobních údajů
+        na stránce s našimi %{privacy_policy_link}.
+      privacy_policy: pravidly ochrany osobních údajů
       privacy_policy_title: Pravidla ochrany osobních údajů OSMF, včetně části o e-mailových
         adresách
       consider_pd_html: Své příspěvky považuji za %{consider_pd_link}.
index 4103dbcbada13f0e150b11fb05f0d143314f3464..d48d67a9725309e0cd08b91c487dcbc65460b889 100644 (file)
@@ -72,6 +72,7 @@
 # Author: MarkusHD
 # Author: McDutchie
 # Author: Mcandri13
+# Author: Mcliquid
 # Author: Metalhead64
 # Author: Michi
 # Author: Milet
@@ -776,6 +777,10 @@ de:
       contact_the_community_html: Bitte nimm %{contact_link} mit der OpenStreetMap-Community
         auf, wenn du einen defekten Link / Fehler gefunden hast. Notiere dir die genaue
         URL deiner Anfrage.
+    bad_request:
+      title: Ungültige Anfrage
+      description: Die angeforderte Operation auf dem OpenStreetMap-Server ist ungültig
+        (HTTP 400).
     forbidden:
       title: Verboten
       description: Die von dir angeforderte Aktion auf dem OpenStreetMap-Server ist
@@ -1854,8 +1859,8 @@ de:
           den du kommentiert hattest, reaktivert.'
         commented_note_html: '%{commenter} hat einen Hinweis in der Nähe von %{place},
           den du kommentiert hattest, reaktivert.'
-      details: Weitere Details über den Hinweis findest du unter %{url}.
-      details_html: Weitere Details über den Hinweis findest du unter %{url}.
+      details: Antworte oder erfahre mehr über die Notiz unter %{url}.
+      details_html: Antworte oder erfahre mehr über die Notiz unter %{url}.
     changeset_comment_notification:
       description: 'OpenStreetMap-Änderungssatz #%{id}'
       hi: Hallo %{to_user},
@@ -1876,9 +1881,8 @@ de:
         partial_changeset_with_comment: mit der Bemerkung „%{changeset_comment}“
         partial_changeset_with_comment_html: mit der Bemerkung „%{changeset_comment}“
         partial_changeset_without_comment: ohne Kommentar
-      details: Weitere Details über den Änderungssatz können gefunden werden unter
-        %{url}.
-      details_html: Weitere Details über den Änderungssatz findest Du unter %{url}.
+      details: Antworte oder erfahre mehr über den Änderungssatz unter %{url}.
+      details_html: Antworte oder erfahre mehr über den Änderungssatz unter %{url}.
       unsubscribe: Du kannst dich auf %{url} von den Benachrichtigungen dieses Änderungssatzes
         abmelden.
       unsubscribe_html: Du kannst dich auf %{url} von den Benachrichtigungen dieses
@@ -2059,6 +2063,8 @@ de:
     new:
       title: Anmelden
       tab_title: Anmelden
+      login_to_authorize_html: Melde dich bei OpenStreetMap an, um auf %{client_app_name}
+        zuzugreifen.
       email or username: E-Mail-Adresse oder Benutzername
       password: Passwort
       remember: Anmeldedaten merken
@@ -2739,6 +2745,9 @@ de:
         other: GPX-Datei mit %{count} Punkten von %{user}
       description_without_count: GPX-Datei von %{user}
   application:
+    basic_auth_disabled: 'Die HTTP-Basisauthentifizierung ist deaktiviert: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 und 1.0a sind deaktiviert: %{link}'
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/DE:2024_authentication_update
     permission_denied: Du hast keine Berechtigung, um auf diese Aktion zuzugreifen.
     require_cookies:
       cookies_needed: Es scheint als hättest du Cookies ausgeschaltet. Bitte aktiviere
@@ -2827,6 +2836,9 @@ de:
       write_redactions: Kartendaten redigieren
       read_email: Lesen der Benutzer-E-Mail-Adresse
       skip_authorization: Antrag automatisch genehmigen
+    for_roles:
+      moderator: Diese Berechtigung gilt nur für Aktionen, die nur Moderatoren zur
+        Verfügung stehen.
   oauth_clients:
     new:
       title: Eine neue Anwendung registrieren
@@ -2931,18 +2943,21 @@ de:
         erstellen zu lassen - wir werden die Anfrage möglichst schnell bearbeiten.
       support: Support
       about:
-        header: Frei und editierbar
+        header: Frei und editierbar.
         paragraph_1: Im Gegensatz zu anderen Karten wird OpenStreetMap vollständig
           von Leuten wie dir erstellt und kann von jedem kostenlos repariert, aktualisiert,
           heruntergeladen und verwendet werden.
-        paragraph_2: Melde dich an, um mit der Mitarbeit zu beginnen. Wir senden dir
-          eine E-Mail zur Bestätigung deines Kontos.
+        paragraph_2: Registriere dich, um mit deinem Beitrag zu beginnen.
         welcome: Willkommen bei OpenStreetMap
+      duplicate_social_email: Wenn du bereits ein OpenStreetMap-Konto hast und einen
+        Identitätsanbieter eines Drittanbieters verwenden möchtest, melde dich bitte
+        mit deinem Passwort an und ändere die Einstellungen deines Kontos.
       display name description: Dein öffentlich angezeigter Benutzername. Er kann
         später in den Einstellungen geändert werden.
       by_signing_up_html: Mit Ihrer Anmeldung stimmen Sie unseren %{tou_link}, %{privacy_policy_link}
         und %{contributor_terms_link} zu.
       tou: Nutzungsbedingungen
+      contributor_terms: Bedingungen für Mitwirkende
       external auth: 'Drittparteiauthentifikation:'
       continue: Registrieren
       terms accepted: Vielen Dank, dass du den neuen Bedingungen für Mitwirkende zugestimmt
@@ -2952,6 +2967,8 @@ de:
       privacy_policy: Datenschutzrichtlinie
       privacy_policy_title: OSMF-Datenschutzrichtlinie einschließlich Abschnitt zu
         E-Mail-Adressen
+      consider_pd_html: Ich betrachte meine Beiträge als %{consider_pd_link}.
+      consider_pd: gemeinfrei
       or: oder
       use external auth: oder melde dich über einen Drittanbieter an
     terms:
@@ -3315,6 +3332,10 @@ de:
       intro: Fehlt etwas oder hast du einen Fehler gefunden? Bitte verschiebe den
         Marker auf die exakte Position und gib genaue Hinweise/Informationen an bzw.
         beschreibe den Fehler in der Karte möglichst präzise.
+      anonymous_warning_html: Du bist nicht eingeloggt. Bitte %{log_in} oder %{sign_up},
+        wenn du Updates für deine Notiz erhalten möchtest.
+      anonymous_warning_log_in: Anmelden
+      anonymous_warning_sign_up: Registrieren
       advice: Deine Meldung ist öffentlich und kann zur Aktualisierung der Karte verwendet
         werden. Gib deshalb keine persönlichen oder urheberrechtlich geschützten Informationen
         von anderen Karten oder Verzeichnislisten an.
index de3966bf3bd9ac902669334513aba66af1083d82..4a018f7d79f81219979545486db05a1b6eb32bc1 100644 (file)
@@ -149,7 +149,7 @@ diq:
         new_email: E-postay adresiyo neweh
         active: Aktiv
         display_name: Nameyo ke Aseno
-        description: Şınasiya weci
+        description: Şınasiya Profili
         home_lat: 'Verıniye:'
         home_lon: Derganiye
         languages: Zıwanê tercihi
index 647cf66f2c6194560b76fc40d765cfaac82496b3..7b463421036030b059fb757657dbc1631d27100f 100644 (file)
@@ -1673,8 +1673,8 @@ en:
         your_note_html: "%{commenter} has reactivated one of your map notes near %{place}."
         commented_note: "%{commenter} has reactivated a map note you have commented on. The note is near %{place}."
         commented_note_html: "%{commenter} has reactivated a map note you have commented on. The note is near %{place}."
-      details: "More details about the note can be found at %{url}."
-      details_html: "More details about the note can be found at %{url}."
+      details: "Reply or learn more about the note at %{url}."
+      details_html: "Reply or learn more about the note at %{url}."
     changeset_comment_notification:
       description: "OpenStreetMap Changeset #%{id}"
       hi: "Hi %{to_user},"
@@ -1689,8 +1689,8 @@ en:
         partial_changeset_with_comment: "with comment '%{changeset_comment}'"
         partial_changeset_with_comment_html: "with comment '%{changeset_comment}'"
         partial_changeset_without_comment: "without comment"
-      details: "More details about the changeset can be found at %{url}."
-      details_html: "More details about the changeset can be found at %{url}."
+      details: "Reply or learn more about the changeset at %{url}."
+      details_html: "Reply or learn more about the changeset at %{url}."
       unsubscribe: "You can unsubscribe from updates to this changeset at %{url}."
       unsubscribe_html: "You can unsubscribe from updates to this changeset at %{url}."
   confirmations:
index 87a5466e6e653a180325fdcd60774850ec0511c0..b2d676c9abf58fc01d0232056b8084748439417d 100644 (file)
@@ -1737,8 +1737,8 @@ eo:
           La rimarko troviĝis ĉe %{place}.'
         commented_note_html: '%{commenter} remalfermis rimarkon sur la mapo pri kiu
           vi interesiĝis. La rimarko troviĝis ĉe %{place}.'
-      details: Pli da detaloj pri la rimarko, vi povas trovi je %{url}.
-      details_html: Pli da detaloj pri la noto troveblas ĉe %{url}.
+      details: Vi povas respondi aŭ sciiĝi pli pri la rimarko ĉe %{url}.
+      details_html: Vi povas respondi aŭ sciiĝi pli pri la rimarko ĉe %{url}.
     changeset_comment_notification:
       description: 'OpenStreetMap: ŝanĝaro %{id}'
       hi: Saluton %{to_user},
@@ -1756,8 +1756,8 @@ eo:
         partial_changeset_with_comment: kun komento '%{changeset_comment}'
         partial_changeset_with_comment_html: kun komento '%{changeset_comment}'
         partial_changeset_without_comment: sen komento
-      details: Pli da detaloj pri la ŝanĝaro povas esti trovita ĉe %{url}.
-      details_html: Pli da detaloj pri la ŝanĝaro povas esti trovita ĉe %{url}.
+      details: Vi povas respondi aŭ sciiĝi pli pri la ŝanĝaro ĉe %{url}.
+      details_html: Vi povas respondi aŭ sciiĝi pli pri la ŝanĝaro ĉe %{url}.
       unsubscribe: Vi povas malaboni ĝisdatigojn pri tiu ĉi ŝanĝaro ĉe %{url}.
       unsubscribe_html: Vi povas malaboni ĝisdatigojn pri tiu ĉi ŝanĝaro ĉe %{url}.
   confirmations:
@@ -1869,7 +1869,7 @@ eo:
   passwords:
     new:
       title: Perdita pasvorto
-      heading: Forgesis vian pasvorton ?
+      heading: Ĉu vi forgesis pasvorton?
       email address: Retpoŝta adreso
       new password button: Nuligi pasvorton
       help_text: Entajpu la retpoŝtan adreson kiun vi uzis por ensaluto, ni sendos
@@ -1936,7 +1936,7 @@ eo:
       lost password link: Ĉu vi forgesis vian pasvorton?
       login_button: Ensaluti
       register now: Registriĝi
-      with external: aŭ ensalutu uzante eksteran liveranton
+      with external: 'ensaluti per ekstera liveranto:'
       or: aŭ
       auth failure: Bedaŭrinde ne povas ensaluti kun ĉi tiuj informoj.
     destroy:
@@ -2788,7 +2788,7 @@ eo:
       consider_pd_html: Mi konsideras ke miaj kontribuoj estu eldonitaj en la %{consider_pd_link}.
       consider_pd: publika havaĵo
       or: aŭ
-      use external auth: aŭ registriĝu uzante eksteran liveranton
+      use external auth: 'registriĝi per ekstera liveranto:'
     terms:
       title: Kondiĉoj
       heading: Kondiĉoj
index 0c3b1427cc614ef55eb2f673fb980dc2427c31d4..3ab6a2a2dcdd67527113844becd1124e9739300f 100644 (file)
@@ -108,7 +108,7 @@ et:
       diary_entry:
         user: Kasutaja
         title: Teema
-        body: Päevikusissekanne
+        body: Kehatekst
         latitude: Laius
         longitude: Pikkus
         language_code: Keel
@@ -1662,8 +1662,8 @@ et:
           Märkus on koha %{place} lähedal.'
         commented_note_html: '%{commenter} on taasaktiveerinud märkuse, mida oled
           kommenteerinud. Märkus on koha %{place} lähedal.'
-      details: Üksikasjad märkuse kohta leiad aadressilt %{url}.
-      details_html: Üksikasjad märkuse kohta leiad aadressilt %{url}.
+      details: Vasta või loe veel märkuse kohta aadressil %{url}.
+      details_html: Vasta või loe veel märkuse kohta aadressil %{url}.
     changeset_comment_notification:
       description: 'OpenStreetMapi muudatuskogum #%{id}'
       hi: Tere, %{to_user}
@@ -1682,8 +1682,8 @@ et:
         partial_changeset_with_comment: kommentaariga '%{changeset_comment}'.
         partial_changeset_with_comment_html: kommentaariga '%{changeset_comment}'.
         partial_changeset_without_comment: ilma kommentaarita.
-      details: Üksikasjad muudatuskogumi kohta leiad aadressilt %{url}.
-      details_html: Üksikasjad muudatuskogumi kohta leiad aadressilt %{url}.
+      details: Vasta või loe muudatuskogumi kohta veel aadressil %{url}.
+      details_html: Vasta või loe muudatuskogumi kohta veel aadressil %{url}.
       unsubscribe: Saad muudatuskogumi uuendusteadetest ära ütelda aadressil %{url}.
       unsubscribe_html: Saad muudatuskogumi uuendusteadetest ära ütelda aadressil
         %{url}.
@@ -1859,7 +1859,7 @@ et:
       lost password link: Kas unustasid parooli?
       login_button: Logi sisse
       register now: Registreeru nüüd
-      with external: 'Teise võimalusena võid sisse logida kolmanda osapoole kaudu:'
+      with external: või logi sisse kolmanda osapoole kaudu
       auth failure: Kahjuks ei õnnestu nende andmetega sisse logida.
     destroy:
       title: Logi välja
@@ -2653,6 +2653,7 @@ et:
       title: Minu volitatud rakendused
       application: Rakendus
       permissions: Õigused
+      last_authorized: Viimati volitatud
       no_applications_html: Sa pole volitanud veel ühtegi %{oauth2} rakendust.
     application:
       revoke: Eemalda juurdepääs
@@ -2660,27 +2661,33 @@ et:
   users:
     new:
       title: Registreerumine
+      tab_title: Registreeru
       no_auto_account_create: Kahjuks ei ole meil võimalik luua hetkel sinu jaoks
         automaatselt kontot.
       please_contact_support_html: Palun võta ühendust %{support_link}, et kasutajakonto
         luua. Üritame tegeleda selle taotlusega nii kiiresti kui võimalik.
       support: toega
       about:
-        header: Vaba ja muudetav
+        header: Vaba ja muudetav.
         paragraph_1: Erinevalt teistest kaartidest on kogu OpenStreetMapi loonud sinusugused
           inimesed ja igaüks võib seda parandada, täiendada, alla laadida ja kasutada.
-        paragraph_2: Registreeru, et alustada kaardi täiendamist. Saadame sulle e-kirja,
-          et saaksid kinnitada enda kasutajakonto.
+        paragraph_2: Registreeru, et alustada kaardi täiendamist.
       display name description: Avalikult kuvatud kasutajanimi. Seda saate muuta hiljem
         eelistustes.
+      by_signing_up_html: Registreerudes nõustud meie %{tou_link}, %{privacy_policy_link}
+        ja %{contributor_terms_link}.
+      tou: kasutustingimustega
+      contributor_terms: kaastöötingimustega
       external auth: 'Kolmanda osapoole autentimine:'
       continue: Registreeru
       terms accepted: Täname, et nõustusid uute kaastöötingimustega!
-      email_help_html: Sinu aadressi ei kuvata avalikult, loe täpsemalt meie %{privacy_policy_link}.
-      privacy_policy: andmekaitsereeglitest
+      email_help_html: Sinu aadressi ei kuvata avalikult, tutvu meie %{privacy_policy_link}.
+      privacy_policy: andmekaitsereeglitega
       privacy_policy_title: OSMF-i andmekaitsereeglid, milles on alaosa e-posti aadresside
         kohta
-      use external auth: Teise võimalusena võid sisse logida kolmanda osapoole kaudu
+      consider_pd_html: Pean enda kaastööd %{consider_pd_link} kuuluvaks.
+      consider_pd: avalikku omandisse
+      use external auth: või registreeru kolmanda osapoole kaudu
     terms:
       title: Tingimused
       heading: Tingimused
@@ -2856,8 +2863,8 @@ et:
         andis.
       success: Blokeering uuendatud.
     index:
-      title: Kasutaja blokeeringud
-      heading: Kasutaja blokeeringute loetelu
+      title: Kasutajate blokeeringud
+      heading: Kasutajate blokeeringute loetelu
       empty: Ühtegi blokeeringut pole veel antud.
     revoke:
       title: Kasutaja %{block_on} blokeeringu eemaldamine
@@ -3001,6 +3008,10 @@ et:
       intro: Kas märkasid viga või midagi, mis vajab täiendamist? Anna sellest teistele
         kaardistajatele teada, et nad saaksid seda parandada. Lohista marker õigele
         kohale ja kirjuta märkus, et probleemi selgitada.
+      anonymous_warning_html: Sa pole sisse logitud. Palun %{log_in} või %{sign_up},
+        kui soovid saada enda märkuse kohta uuendusi.
+      anonymous_warning_log_in: logi sisse
+      anonymous_warning_sign_up: registreeru
       advice: Märkus on avalik ja seda võidakse kasutada kaardi uuendamiseks. Seega
         palun ära kirjuta siia isiklikku teavet ega teavet autoriõigustega kaitstud
         kaartidelt ega kataloogiloenditest.
@@ -3105,24 +3116,24 @@ et:
         continue_without_exit: 'Liigu edasi teele: %{name}'
         slight_right_without_exit: 'Pööra kergelt paremal pool asuvale teele: %{name}'
         offramp_right: Sõida paremal asuvale kaldteele
-        offramp_right_with_exit: Lahku teelt paremal asuva ärapöörde %{exit} kaudu
-        offramp_right_with_exit_name: 'Lahku teelt paremal asuva ärapöörde %{exit}
-          kaudu sõites teele: %{name}'
-        offramp_right_with_exit_directions: 'Lahku teelt paremal asuva ärapöörde %{exit}
-          kaudu võttes suunaks: %{directions}'
-        offramp_right_with_exit_name_directions: 'Lahku teelt paremal asuva ärapöörde
-          %{exit} kaudu sõites teele: %{name} suunaga %{directions} poole'
+        offramp_right_with_exit: Lahku teelt %{exit}. väljumise kaudu paremal
+        offramp_right_with_exit_name: 'Lahku paremalt %{exit}. väljumise kaudu sõites
+          teele: %{name}'
+        offramp_right_with_exit_directions: Lahku paremalt %{exit}. väljumise kaudu,
+          sõites tee %{directions} suunas
+        offramp_right_with_exit_name_directions: Lahku paremalt %{exit}. väljumise
+          kaudu sõites teele %{name} tee %{directions} suunas
         offramp_right_with_name: 'Pööra paremal asuvalt kaldteelt teele: %{name}'
-        offramp_right_with_directions: Pööra paremal asuvale kaldteele suunaga %{directions}
-          poole
+        offramp_right_with_directions: Pööra paremal asuvale kaldteele, liikudes tee
+          %{directions} suunas
         offramp_right_with_name_directions: 'Pööra paremal asuvale kaldteele: uus
           tee on %{name} ja suunaks %{directions}'
         onramp_right_without_exit: 'Pööra paremale ja sõida kaldteed mööda teele:
           %{name}'
-        onramp_right_with_directions: Pööra paremale ja sõida kaldteelt %{directions}
+        onramp_right_with_directions: Pööra paremale ja sõida kaldteelt tee %{directions}
           suunas
-        onramp_right_with_name_directions: Pööra paremal asuvale kaldteele %{name}
-          poole, suunaks %{directions}
+        onramp_right_with_name_directions: Pööra paremal asuvalt kaldteelt teele %{name},
+          sõites tee %{directions} suunas
         onramp_right_without_directions: Sõida paremal asuvale kaldteele
         onramp_right: Sõida paremal asuvale kaldteele
         endofroad_right_without_exit: 'Tee lõpus pööra paremale teele: %{name}'
@@ -3134,20 +3145,20 @@ et:
         sharp_left_without_exit: 'Pööra järsult vasakul pool asuvale teele: %{name}'
         turn_left_without_exit: 'Pööra vasakul pool asuvale teele: %{name}'
         offramp_left: Sõida vasakul asuvale kaldteele
-        offramp_left_with_exit: Lahku teelt vasakul asuva ärapöörde %{exit} kaudu
-        offramp_left_with_exit_name: 'Lahku teelt vasakul asuva ärapöörde %{exit}
-          kaudu sõites teele: %{name}'
-        offramp_left_with_exit_directions: 'Lahku teelt vasakul asuva ärapöörde %{exit}
-          kaudu võttes suunaks: %{directions}'
-        offramp_left_with_exit_name_directions: 'Lahku teelt vasakul asuva ärapöörde
-          %{exit} kaudu sõites teele: %{name} suunaga %{directions} poole'
+        offramp_left_with_exit: Lahku vasakult %{exit}. väljumise kaudu
+        offramp_left_with_exit_name: 'Lahku vasakult %{exit}. väljumise kaudu sõites
+          teele: %{name}'
+        offramp_left_with_exit_directions: Lahku vasakult %{exit}. väljumise kaudu,
+          sõites tee %{directions} suunas
+        offramp_left_with_exit_name_directions: Lahku vasakult %{exit}. väljumise
+          kaudu sõites teele %{name} tee %{directions} suunas
         offramp_left_with_name: 'Pööra vasakul asuvalt kaldteelt teele: %{name}'
-        offramp_left_with_directions: Pööra vasakul asuvale kaldteele suunaga %{directions}
-          poole
+        offramp_left_with_directions: Pööra vasakul asuvale kaldteele, liikudes tee
+          %{directions} suunas
         offramp_left_with_name_directions: 'Pööra vasakul asuvale kaldteele: uus tee
           on %{name} ja suunaks %{directions}'
         onramp_left_without_exit: 'Pööra vasakule ja sõida kaldteed mööda teele: %{name}'
-        onramp_left_with_directions: Pööra vasakule ja sõida kaldteelt %{directions}
+        onramp_left_with_directions: Pööra vasakule ja sõida kaldteelt tee %{directions}
           suunas
         onramp_left_with_name_directions: 'Pööra vaskul asuvale kaldteele: uus tee
           on %{name} ja suunaks %{directions}'
@@ -3159,7 +3170,7 @@ et:
         slight_left_without_exit: 'Pööra kergelt vasakule teele: %{name}'
         via_point_without_exit: (teekonnapunkti kaudu)
         follow_without_exit: 'Sõida edasi mööda teed: %{name}'
-        roundabout_without_exit: 'Pööra ringteelt järgnevale teele: %{name}'
+        roundabout_without_exit: 'Pööra ringteelt järgmisele teele: %{name}'
         leave_roundabout_without_exit: Pööra ära ringteelt - %{name}
         stay_roundabout_without_exit: Jätka sõitmist ringteel - %{name}
         start_without_exit: 'Alusta teelt: %{name}'
index da9281e0d215dad78daf74aeb7d7f361e6d39394..1bb90b0629980ff569e6d077d651897f0d90b9a4 100644 (file)
@@ -38,6 +38,7 @@
 # Author: GeorgeKaplan
 # Author: Gileri
 # Author: Gomoko
+# Author: Graineahumus
 # Author: Gravitystorm
 # Author: Guilhelma
 # Author: Hashar
@@ -75,6 +76,7 @@
 # Author: Orikrin1998
 # Author: Otourly
 # Author: Oupsa
+# Author: Overflorian
 # Author: Peter17
 # Author: Phoenamandre
 # Author: Pipo
@@ -457,6 +459,7 @@ fr:
     view_unredacted_history: Voir l'historique non censuré
     view_details: Afficher les détails
     view_redacted_data: Afficher les données censurées
+    view_redaction_message: Afficher le message de rédaction
     location: 'Emplacement :'
     common_details:
       coordinates_html: '%{latitude} ; %{longitude}'
@@ -583,6 +586,7 @@ fr:
         closed: Fermé
         belongs_to: Auteur
     subscribe:
+      heading: S'abonner à la discussion sur l'ensemble de modifications suivante ?
       button: S'abonner à la discussion
     unsubscribe:
       heading: Se désabonner de la discussion du groupe de modifications suivant ?
@@ -591,6 +595,7 @@ fr:
       title: Groupe de modifications %{id}
       created_by_html: Créé par %{link_user} le %{created}.
     no_such_entry:
+      title: Aucun ensemble de modifications de ce type
       heading: 'Aucune entrée avec l’identifiant : %{id}'
       body: Désolé, il n’y a aucun groupe de modifications avec l'identifiant %{id}.
         Veuillez vérifier l'orthographe ou la validité du lien sur lequel vous avez
@@ -740,8 +745,10 @@ fr:
       newer_comments: Commentaires plus récents
       older_comments: Commentaires plus anciens
     subscribe:
+      heading: S'abonner à la discussion suivante sur les entrées de journal ?
       button: S'abonner à la discussion
     unsubscribe:
+      heading: Se désinscrire de la discussion suivante sur les entrées du journal ?
       button: Se désinscrire de la discussion
   doorkeeper:
     errors:
@@ -785,6 +792,10 @@ fr:
       contact_the_community_html: N’hésitez pas à %{contact_link} la communauté OpenStreetMap
         si vous avez trouvé un lien cassé ou une anomalie. Notez l’URL exacte de votre
         demande.
+    bad_request:
+      title: Mauvaise requête
+      description: L'opération que vous avez demandée sur le serveur OpenStreetMap
+        n'est pas valide (HTTP 400)
     forbidden:
       title: Interdit
       description: L’opération que vous avez demandée sur le serveur OpenStreetMap
@@ -1725,6 +1736,7 @@ fr:
     hosting_partners_2024_html: L’hébergement est pris en charge par %{fastly}, %{corpmembers},
       et d’autres %{partners}.
     partners_fastly: Fastly
+    partners_corpmembers: Membres d'entreprise de l'OSMF
     partners_partners: partenaires
     tou: Conditions d’utilisation
     osm_offline: La base de données OpenStreetMap est actuellement hors ligne ; une
@@ -1860,8 +1872,8 @@ fr:
           La note se trouve près de %{place}.'
         commented_note_html: '%{commenter} a réactivé une note de carte que vous avez
           commentée. La note est près de %{place}.'
-      details: Plus de détails concernant la note se trouvent à %{url}.
-      details_html: Plus de détails concernant la note se trouvent à %{url}.
+      details: Répondez ou apprenez-en plus sur la note sur %{url}.
+      details_html: Répondez ou en savoir plus sur la note sur %{url}.
     changeset_comment_notification:
       description: 'Groupe de modifications OpenStreetMap #%{id}'
       hi: Bonjour %{to_user},
@@ -1882,9 +1894,8 @@ fr:
         partial_changeset_with_comment: avec le commentaire « %{changeset_comment} »
         partial_changeset_with_comment_html: avec le commentaire « %{changeset_comment} »
         partial_changeset_without_comment: sans commentaire
-      details: Plus de détails sur l’ensemble de modifications à %{url}.
-      details_html: Vous pouvez trouver plus de détails sur l’ensemble de modifications
-        sur %{url}.
+      details: Répondez ou en savoir plus sur l'ensemble de changements sur %{url}.
+      details_html: Répondre ou en savoir plus sur l'ensemble de changements sur %{url}.
       unsubscribe: Vous pouvez vous désabonner des mises à jour de cet ensemble de
         modifications depuis %{url}.
       unsubscribe_html: Vous pouvez vous désabonner des mises à jour de cet ensemble
@@ -1983,9 +1994,9 @@ fr:
       unread_button: Marque comme non lu
       destroy_button: Supprimer
       back: Retour
-      wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
-        de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné. Veuillez
-        vous connecter avec l’identifiant correct pour pouvoir le lire.
+      wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous avez
+        demandé de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné.
+        Veuillez vous connecter avec le bon identifiant pour pouvoir le lire.
     sent_message_summary:
       destroy_button: Supprimer
     heading:
@@ -2067,6 +2078,7 @@ fr:
     new:
       title: Se connecter
       tab_title: Se connecter
+      login_to_authorize_html: Connectez-vous à OpenStreetMap pour accéder à %{client_app_name}.
       email or username: 'Adresse de courriel ou nom d’utilisateur :'
       password: 'Mot de passe :'
       remember: Se souvenir de moi
@@ -2266,7 +2278,12 @@ fr:
           générale des finances publiques (anciennement la Direction générale des
           impôts).'
         contributors_fr_france: France
+        contributors_hr_credit_html: |-
+          %{croatia} : contient des données de %{dgu_link} et %{open_data_portal}
+          (informations publiques de Croatie).
         contributors_hr_croatia: Croatie
+        contributors_hr_dgu: Administration géodésique de l'État de Croatie
+        contributors_hr_open_data_portal: Portail national des données ouvertes
         contributors_nl_credit_html: '%{netherlands} : contient des données © AND,
           2007 (%{and_link})'
         contributors_nl_netherlands: Pays-Bas
@@ -2719,6 +2736,8 @@ fr:
       identifiable: IDENTIFIABLE
       private: PRIVÉE
       trackable: PISTABLE
+      details_with_tags_html: '%{time_ago} par %{user} dans %{tags}'
+      details_without_tags_html: '%{time_ago} par %{user}'
     index:
       public_traces: Traces GPS publiques
       my_gps_traces: Mes traces GPS
@@ -2776,17 +2795,18 @@ fr:
       muted_users: Utilisateurs silencieux
     auth_providers:
       openid_logo_alt: Se connecter avec OpenID
+      openid_login_button: Continuer
       openid:
         title: Connexion avec OpenID
         alt: Se connecter avec une URL OpenID
       google:
-        title: Connexion avec Google
+        title: Se connecter avec Google
         alt: Se connecter avec un OpenID de Google
       facebook:
         title: Connexion avec Facebook
         alt: Se connecter avec un compte de Facebook
       microsoft:
-        title: Connexion avec Microsoft
+        title: Se connecter avec Microsoft
         alt: Se connecter avec un compte Microsoft
       github:
         title: Connexion avec GitHub
@@ -2798,7 +2818,7 @@ fr:
         title: Connexion avec Wordpress
         alt: Se connecter avec un OpenID de Wordpress
       aol:
-        title: Connexion avec AOL
+        title: Se connecter avec AOL
         alt: Se connecter avec un OpenID d’AOL
   oauth:
     authorize:
@@ -2843,6 +2863,9 @@ fr:
       write_redactions: Caviarder les données cartographiques
       read_email: Lire l’adresse courriel de l’utilisateur
       skip_authorization: Demande d’approbation automatique
+    for_roles:
+      moderator: Cette autorisation concerne les actions disponibles uniquement pour
+        les modérateurs
   oauth_clients:
     new:
       title: Inscrire une nouvelle application
@@ -2939,6 +2962,7 @@ fr:
   users:
     new:
       title: S’inscrire
+      tab_title: Créer un compte
       no_auto_account_create: Malheureusement, nous ne sommes actuellement pas en
         mesure de vous créer un compte automatiquement.
       please_contact_support_html: Veuillez contacter %{support_link} pour organiser
@@ -2952,8 +2976,15 @@ fr:
           la réparer, la mettre à jour, la télécharger et l’utiliser.
         paragraph_2: Inscrivez-vous pour commencer à contribuer. Nous vous enverrons
           un courriel pour confirmer votre compte.
+      duplicate_social_email: Si vous possédez déjà un compte OpenStreetMap et souhaitez
+        utiliser un fournisseur d'identité tiers, veuillez vous connecter en utilisant
+        votre mot de passe et modifier les paramètres de votre compte.
       display name description: Votre nom d’utilisateur affiché publiquement. Vous
         pouvez changer ceci ultérieurement dans les préférences.
+      by_signing_up_html: En vous inscrivant, vous acceptez nos %{tou_link}, %{privacy_policy_link}
+        et %{contributor_terms_link}.
+      tou: conditions d'utilisation
+      contributor_terms: Conditions de contribution
       external auth: 'Authentification tierce :'
       continue: S’inscrire
       terms accepted: Merci d’avoir accepté les nouveaux termes du contributeur !
@@ -2962,8 +2993,10 @@ fr:
       privacy_policy: politique de confidentialité
       privacy_policy_title: Politique de confidentialité de l’OSMF, qui comprend une
         section sur les adresses de courriel
-      use external auth: Vous pouvez également utiliser un service tiers pour vous
-        connecter.
+      consider_pd_html: Je considère que mes contributions se situent dans le %{consider_pd_link}.
+      consider_pd: domaine public
+      or: ou
+      use external auth: ou vous pouvez vous connecter avec un service tiers.
     terms:
       title: Conditions
       heading: Conditions
@@ -3074,6 +3107,9 @@ fr:
       heading: Utilisateurs
       older: Utilisateurs plus anciens
       newer: Utilisateurs plus récents
+      found_users:
+        one: '%{count} utilisateur trouvé'
+        other: '%{count} utilisateurs trouvés'
       summary_html: '%{name} créé depuis %{ip_address} le %{date}'
       summary_no_ip_html: '%{name} créé le %{date}'
       confirm: Confirmer les utilisateurs sélectionnés
@@ -3098,9 +3134,9 @@ fr:
       heading: Votre identifiant n’est pas encore associé à un compte OpenStreetMap.
       option_1: Si vous êtes nouveau sur OpenStreetMap, veuillez créer un nouveau
         compte à l’aide du formulaire ci-dessous.
-      option_2: Si vous avez déjà un compte, vous pouvez vous connecter avec en utilisant
-        votre nom d’utilisateur et votre mot de passe, puis associer le compte avec
-        votre ID dans vos préférences utilisateur.
+      option_2: Si vous avez déjà un compte, vous pouvez vous y connecter avec en
+        utilisant votre nom d’utilisateur et votre mot de passe, puis associer le
+        compte avec votre ID dans vos préférences utilisateur.
   user_role:
     filter:
       not_a_role: La chaîne « %{role} » n’est pas un rôle valide.
@@ -3231,6 +3267,8 @@ fr:
       reason: Motif du blocage
       status: État
       revoker_name: Révoqué par
+      older: Blocs plus anciens
+      newer: Blocs plus récents
     navigation:
       all_blocks: Tous les blocages
       blocks_on_me: Blocages me concernant
@@ -3312,6 +3350,10 @@ fr:
       intro: Vous avez repéré une erreur ou un manque ? Faites-le savoir aux autres
         cartographes afin qu’ils puissent y remédier. Déplacez le marqueur à la position
         exacte et écrivez une note pour expliquer le problème.
+      anonymous_warning_html: Vous n'êtes pas connecté. Veuillez %{log_in} ou %{sign_up}
+        si vous souhaitez recevoir des mises à jour pour votre note.
+      anonymous_warning_log_in: se connecter
+      anonymous_warning_sign_up: créer un compte
       advice: Votre note est publique et peut être utilisée pour mettre à jour la
         carte, aussi n’entrez aucune information personnelle, ni aucune information
         venant de cartes protégées, ni aucune entrée de répertoire ou d’annuaire.
index b757d74ff65334405f53d7c71072263a87ca2341..16b818b4cc7d11e83e5a16f0558bf92134c7e5c7 100644 (file)
@@ -685,6 +685,10 @@ gl:
       contact_the_community_html: Non dubides en %{contact_link} coa comunidade do
         OpenStreetMap se atopaches un erro ou unha ligazón rota. Anota o enderezo
         URL exacto da túa solicitude.
+    bad_request:
+      title: Solicitude incorrecta
+      description: A operación que solicitaches no servidor do OpenStreetMap non é
+        válida (HTTP 400)
     forbidden:
       title: Prohibido
       description: A operación que solicitaches no servidor do OpenStreetMap só está
@@ -2631,6 +2635,9 @@ gl:
         other: Ficheiro GPX con %{count} puntos de %{user}
       description_without_count: Ficheiro GPX de %{user}
   application:
+    basic_auth_disabled: 'A autenticación básica HTTP está desactivada: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 e 1.0a están desactivados: %{link}'
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: Non ten permisos para acceder a esa acción
     require_cookies:
       cookies_needed: Semella que ten as cookies do navegador desactivadas. Actíveas
index be024cccb46b96f2bf0d7def77fc6a66d5dea77d..439ab8f6198cef585242cb27355bdf15808e6251 100644 (file)
@@ -256,7 +256,7 @@ ia:
         delete_introduction: 'Tu pote deler tu conto OpenStreetMap con le button sequente.
           Nota ben que:'
         delete_profile: Tu information de profilo, includente tu avatar, description
-          e domicilio, essera removite.
+          e loco de residentia, essera removite.
         delete_display_name: Tu nomine a monstrar essera removite e potera esser reusate
           per altere contos.
         retain_caveats: 'Nonobstante, alcun informationes sur te essera retenite sur
@@ -529,8 +529,8 @@ ia:
       friend: Amico
     show:
       title: Mi pannello
-      no_home_location_html: '%{edit_profile_link} e defini tu loco de domicilio pro
-        vider le usatores a proximitate.'
+      no_home_location_html: '%{edit_profile_link} e defini tu loco de residentia
+        pro vider le usatores a proximitate.'
       edit_your_profile: Modifica tu profilo
       my friends: Mi amicos
       no friends: Tu non ha ancora addite alcun amico.
@@ -665,6 +665,10 @@ ia:
       contact_the_community_html: Sia libere de %{contact_link} le communitate de
         OpenStreetMap si tu ha trovate un ligamine rupte o qualcunque anomalia. Nota
         le URL exacte de tu requesta.
+    bad_request:
+      title: Mal requesta
+      description: Le operation que tu ha requestate sur le servitor de OpenStreetMap
+        non es valide (HTTP 400)
     forbidden:
       title: Prohibite
       description: Le operation que tu ha requestate sur le servitor de OpenStreetMap
@@ -1578,7 +1582,7 @@ ia:
   layouts:
     logo:
       alt_text: Logo de OpenStreetMap
-    home: Vader al position de initio
+    home: Vader al loco de residentia
     logout: Clauder session
     log_in: Aperir session
     sign_up: Crear conto
@@ -1927,9 +1931,9 @@ ia:
       delete image: Remover le imagine actual
       replace image: Reimplaciar le imagine actual
       image size hint: (imagines quadrate de al minus 100×100 functiona melio)
-      home location: Position de origine
-      no home location: Tu non ha entrate tu position de origine.
-      update home location on click: Actualisar le position de origine quando io clicca
+      home location: Loco de residentia
+      no home location: Tu non ha definite tu loco de residentia.
+      update home location on click: Actualisar le loco de residentia quando io clicca
         sur le carta?
       show: Monstrar
       delete: Deler
@@ -2600,6 +2604,9 @@ ia:
         other: File GPX con %{count} punctos de %{user}
       description_without_count: File GPX de %{user}
   application:
+    basic_auth_disabled: 'Le authentication HTTP basic es disactivate: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 e 1.0a es disactivate: %{link}'
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: Tu non ha le permission de acceder a iste action
     require_cookies:
       cookies_needed: Tu pare haber disactivate le cookies. Per favor activa le cookies
@@ -3161,6 +3168,10 @@ ia:
       intro: Tu ha trovate un error? Qualcosa manca? Face lo saper al altere cartographos
         a fin que nos pote corriger lo. Displacia le marcator al position correcte
         e scribe un nota pro explicar le problema.
+      anonymous_warning_html: Tu non ha aperite session. Per favor %{log_in} o %{sign_up}
+        si tu vole reciper actualisationes pro tu nota.
+      anonymous_warning_log_in: aperi session
+      anonymous_warning_sign_up: crea un conto
       advice: Tu nota es public e pote esser usate pro actualisar le carta. Dunque,
         non insere alcun information personal, ni datos ab cartas o catalogos protegite
         per derectos de autor.
index 5db27d3b8e598a02a4c3901b6c2d184e138217e5..54cb5dd0526355ef9d8fca8bb58f7b25b9e2ff2d 100644 (file)
@@ -1797,8 +1797,8 @@ it:
           La nota si trova vicino a %{place}.'
         commented_note_html: '%{commenter} ha riattivato una nota che avevi commentato.
           La nota si trova vicino a %{place}.'
-      details: Ulteriori dettagli sulla nota possono essere trovati su %{url}.
-      details_html: Ulteriori dettagli sulla nota possono essere trovati su %{url}.
+      details: Rispondi o scopri di più sulla nota su %{url}.
+      details_html: Rispondi o scopri di più sulla nota su %{url}.
     changeset_comment_notification:
       description: 'Gruppo di modifiche OpenStreetMap #%{id}'
       hi: Ciao %{to_user},
@@ -1818,10 +1818,8 @@ it:
         partial_changeset_with_comment: con il commento '%{changeset_comment}'
         partial_changeset_with_comment_html: con il commento '%{changeset_comment}'
         partial_changeset_without_comment: senza commento
-      details: Ulteriori dettagli sul gruppo di modifiche possono essere trovati su
-        %{url}.
-      details_html: Ulteriori dettagli sul gruppo di modifiche possono essere trovati
-        su %{url}.
+      details: Rispondi o scopri di più sul gruppo di modifiche su %{url}.
+      details_html: Rispondi o scopri di più sul gruppo di modifiche su %{url}.
       unsubscribe: Puoi annullare l'iscrizione agli aggiornamenti di questo insieme
         di modifiche su %{url}.
       unsubscribe_html: Puoi annullare l'iscrizione agli aggiornamenti di questo insieme
index 03188391bb4f3142595e4bc82c752e5c6e9c1865..444c0b841c360cc4a3ecca964f0bb01bde59d261 100644 (file)
@@ -86,6 +86,9 @@ ko:
       messages:
         invalid_email_address: 유효한 이메일 주소로 보이지 않음
         email_address_not_routable: 라우팅할 수 없음
+      models:
+        user_mute:
+          is_already_muted: 님은 이미 음소거되어 있습니다
     models:
       acl: 접근 제어 목록
       changeset: 바뀜집합
@@ -416,6 +419,15 @@ ko:
       introduction: 근처의 지물을 찾으려면 지도에서 클릭하세요.
       nearby: 근처 지물
       enclosing: 근접 지역 내 지물
+  old_nodes:
+    not_found:
+      sorry: '죄송합니다. 버전 %{version}의 노드 #%{id}를 찾을 수 없습니다.'
+  old_ways:
+    not_found:
+      sorry: '죄송합니다. 버전 %{version}의 경로 #%{id}를 찾을 수 없습니다.'
+  old_relations:
+    not_found:
+      sorry: '죄송합니다. 버전 %{version}의 관계 #%{id}를 찾을 수 없습니다.'
   changesets:
     changeset_paging_nav:
       showing_page: '%{page}쪽'
@@ -620,6 +632,8 @@ ko:
       contact: 여러 연락 수단
       contact_the_community_html: 끊어진 링크나 버그를 발견했다면 언제든지 오픈스트리트맵 커뮤니티에 %{contact_link}으로
         알려주십시오. 요청의 정확한 URL을 기록해 두십시오.
+    bad_request:
+      title: 잘못된 요청
     forbidden:
       title: 접근 거부됨
       description: 오픈스트리트맵 서버에 요청한 이 작업은 관리자만 사용할 수 있습니다(HTTP 403).
@@ -1794,7 +1808,8 @@ ko:
       lost password link: 비밀번호를 잊으셨나요?
       login_button: 로그인
       register now: 지금 등록하세요
-      with external: '다른 제3자 로그인 방식 사용하기:'
+      with external: 혹은 제3자 방식으로 로그인하기
+      or: 혹은
       auth failure: 죄송합니다, 입력한 정보로 로그인할 수 없습니다.
     destroy:
       title: 로그아웃
@@ -2166,6 +2181,7 @@ ko:
           lake: 호수
           reservoir: 저수지
           glacier: 빙하
+          reef: 암초
           wetland: 습지
           farm: 농장
           brownfield: 재개발지역
@@ -2227,6 +2243,7 @@ ko:
         imports: 들여오기
         automated_edits: 자동화 편집
       start_mapping: 매핑 시작하기
+      continue_authorization: 승인 계속하기
       add_a_note:
         title: 편집할 짬을 내기가 어려우신가요? 손쉽게 '노트'(참고)를 덧붙이세요!
         para_1: 가입한 다음 편집 방법을 배울 시간이 없거나 자잘한 사항만 고치고 싶은 경우, '노트'(참고)를 덧붙여서 알려주면 쉽습니다.
@@ -2320,6 +2337,7 @@ ko:
       identifiable: 식별 가능
       private: 비공개
       trackable: 추적 가능
+      details_without_tags_html: '%{time_ago} %{user}님'
     index:
       public_traces: 공개 GPS 궤적
       my_gps_traces: 내 GPS 궤적
@@ -2519,6 +2537,7 @@ ko:
   users:
     new:
       title: 가입하기
+      tab_title: 가입하기
       no_auto_account_create: 불행하게도 현재로서는 자동으로 계정을 만들 수 없습니다.
       please_contact_support_html: 계정 생성 준비를 위해 %{support_link}(으)로 문의해 주세요. 요청 처리가
         최대한 빨리 이뤄질 수 있도록 노력하겠습니다.
@@ -2527,14 +2546,19 @@ ko:
         header: 자유롭게 편집 가능
         paragraph_1: 다른 지도와 달리 오픈스트리트맵은 전부 여러분과 같은 사람들이 제작했으며 누구나 자유롭게 수정, 업데이트, 다운로드,
           사용을 할 수 있습니다.
-        paragraph_2: 기여를 시작하려면 가입하세요. 당신의 계정 확인을 위해 이메일을 보내드리겠습니다.
+        paragraph_2: 회원 가입으로 기여를 시작해 봅시다.
+        welcome: 오픈스트리트맵에 오신 것을 환영합니다
       display name description: 공개적으로 표시되는 사용자 이름입니다. 나중에 환경 설정에서 바꿀 수 있습니다.
+      tou: 이용 약관
+      contributor_terms: 기여자 약관
       external auth: '제3자 인증:'
       continue: 가입하기
       terms accepted: 새 기여자 약관에 동의해 주셔서 감사합니다!
       email_help_html: 당신의 주소는 공개적으로 노출되지 않습니다. 자세한 내용은 %{privacy_policy_link}를 참조하세요.
       privacy_policy: 개인정보처리방침
       privacy_policy_title: 이메일 주소 섹션을 포함한 OSMF 개인 정보 보호 정책
+      consider_pd: 퍼블릭 도메인
+      or: 혹은
       use external auth: 다른 제3자 로그인 방식 사용하기
     terms:
       title: 약관
@@ -2585,6 +2609,8 @@ ko:
       my_dashboard: 내 대시보드
       blocks on me: 나를 차단
       blocks by me: 나한테 차단
+      create_mute: 이 사용자 음소거하기
+      destroy_mute: 이 사용자를 음소거 해제
       edit_profile: 프로필 수정
       send message: 메시지 보내기
       diary: 일기
@@ -2715,6 +2741,7 @@ ko:
       flash: 이 차단을 해제했습니다.
     revoke_all:
       revoke: 해제!
+      flash: 모든 차단 내역이 비활성화되었습니다.
     helper:
       time_future_html: '%{time}에 끝납니다.'
       until_login: 사용자가 로그인할 때까지 활성합니다.
@@ -2763,8 +2790,14 @@ ko:
       reason: 차단 이유
       status: 상태
       revoker_name: 해제자
+      older: 옛 차단내역
+      newer: 최근 차단내역
     navigation:
       all_blocks: 모든 차단
+      blocks_on_me: 나의 차단내역
+      blocks_on_user: '%{user}님의 차단내역'
+      blocks_by_me: 내가 차단한 내역
+      blocks_by_user: '%{user}님이 차단한 내역'
       block: '#%{id} 차단'
   user_mutes:
     index:
@@ -2772,7 +2805,14 @@ ko:
         thead:
           actions: 동작
         tbody:
+          unmute: 음소거 해제
           send_message: 메시지 보내기
+    create:
+      notice: '%{name}님을 음소거했습니다.'
+      error: '%{name}님을 음소거할 수 없습니다. %{full_message}.'
+    destroy:
+      notice: '%{name}님의 음소거를 해제했습니다.'
+      error: 유저의 음소거를 해제할 수 없습니다. 다시 시도해 주세요.
   notes:
     index:
       title: '%{user} 님이 제출했거나 덧글을 남긴 참고'
@@ -2817,6 +2857,8 @@ ko:
       title: 새로운 참고
       intro: 실수했거나 없는 무언가를 발견했나요? 다른 매퍼에게 알려주어 고칠 수 있게 해주세요. 마커를 올바른 위치로 이동하고, 참고를
         남겨 문제를 설명해주세요.
+      anonymous_warning_log_in: 로그인
+      anonymous_warning_sign_up: 가입하기
       advice: 노트는 공개되어 지도 업데이트에 쓰일 수 있으므로 개인정보 또는 저작권이 있는 지도나 디렉터리 리스팅의 정보를 입력하지 마십시오.
       add: 참고 추가
   javascripts:
index e73c511c1a2b8f62b75d8402a608184ad4653bb7..5c61fc8167f01f85cdc4afc73707025c2cfb82de 100644 (file)
@@ -1469,7 +1469,7 @@ ms:
       url: URL
     richtext_field:
       edit: Sunting
-      preview: Pralihat
+      preview: Pratayang
   site:
     about:
       next: Berikutnya
index 8d7b4561e1f7d7d7b6aa9e4f96cd23fb5674fa17..93f2054ffb8219ce732f6ca1b31b15e04b951419 100644 (file)
@@ -4,6 +4,7 @@
 # Author: Bada Kaji
 # Author: Danieldegroot2
 # Author: Drjpoudel
+# Author: Gravitystorm
 # Author: Haribanshi
 # Author: Krish Dulal
 # Author: Nirajan pant
 # Author: हिमाल सुबेदी
 ---
 ne:
+  html:
+    dir: ltr
   time:
     formats:
       friendly: '%e %B %Y मा %H:%M'
+  count:
+    at_least_pattern: '%{count}+'
   helpers:
     file:
       prompt: फाइल छान्नुहोस्
@@ -39,10 +44,23 @@ ne:
       oauth2_application:
         create: दर्ता गर्नुहाेस्
         update: अद्यावधिक गर्नुहोस्
+      redaction:
+        create: डेटा हटाउनुहोस्
+        update: डेटा हटाउने सङ्ग्रह गर्नुहोस्
       trace:
-        create: अपलोड गर्ने
-        update: परिवर्तनहरू संग्रह गर्ने
+        create: अपलोड गर्नुहोस्
+        update: परिवर्तनहरू संग्रह गर्नुहोस्
+      user_block:
+        create: ब्लक सिर्जना गर्नुहोस्
+        update: ब्लक अद्यावधिक गर्नुहाेस्
   activerecord:
+    errors:
+      messages:
+        invalid_email_address: इमेल मान्य देखिँदैन
+        email_address_not_routable: राउटेबल छैन
+      models:
+        user_mute:
+          is_already_muted: पहिले नै म्युट गरिएको छ
     models:
       acl: अनुमति नियन्त्रण सूची
       changeset: परिवर्तनहरू सूची
@@ -51,6 +69,7 @@ ne:
       diary_comment: डायरी टिप्पणी
       diary_entry: डायरी प्रविष्टी
       friend: साथी
+      issue: इस्यु
       language: भाषा
       message: सन्देश
       node: नोड
@@ -66,6 +85,7 @@ ne:
       relation: रिलेशन
       relation_member: रिलेशन सदस्य
       relation_tag: सम्बन्ध चिनो
+      report: रिपोर्ट गर्नुहोस्
       session: सत्र
       trace: ट्रेस
       tracepoint: ट्रेस बिन्दु
@@ -77,14 +97,32 @@ ne:
       way_node: बाटो नोड
       way_tag: मार्ग चिनो
     attributes:
+      client_application:
+        name: नाम (आवश्यक)
+        url: मुख्य एप्लिकेसन युआरएल (आवश्यक)
+        callback_url: कलब्याक युआरएल
+        support_url: सहायता युआरएल
+        allow_read_prefs: उनीहरूको प्रयोगकर्ता अभिरुचीहरू पढ्नुहोस्
+        allow_write_prefs: उनीहरूको प्रयोगकर्ता अभिरुचीहरू परिमार्जन गर्नुहोस्
+        allow_write_diary: डायरी प्रविष्टी गर्नुहोस्, टिप्पणीहरू र साथी बनाउनुहोस्
+        allow_write_api: नक्सा परिमार्जन गर्नुहोस्
+        allow_read_gpx: उनीहरूको निजी जिपिएस ट्रेसहरू पढ्नुहोस्
+        allow_write_gpx: जिपिएस ट्रेसहरू अपलोड गर्नुहोस्
+        allow_write_notes: टिपोटहरू परिमार्जन गर्नुहोस्
       diary_comment:
         body: बडी
       diary_entry:
         user: प्रयोगकर्ता
         title: विषय
+        body: बडी
         latitude: अक्षांश
         longitude: देशान्तर
         language_code: भाषा
+      doorkeeper/application:
+        name: नाम
+        redirect_uri: रिडाइरेक्ट युआरआइहरू
+        confidential: गोप्य एप्लिकेसन?
+        scopes: अनुमतिहरू
       friend:
         user: प्रयोगकर्ता
         friend: साथी
@@ -97,23 +135,26 @@ ne:
         longitude: देशान्तर
         public: सार्वजनिक
         description: वर्णन
-        gpx_file: 'जिपिएक्स फाइल उर्ध्वभरण गर्नुहाेस्:'
-        visibility: 'दृश्यक्षमता:'
-        tagstring: ट्यागहरू
+        gpx_file: GPX फाइल अपलोड गर्नुहोस्
+        visibility: प्रदर्शन
+        tagstring: ट्यागहरू
       message:
         sender: पठाउने
         title: विषय
         body: बडी
         recipient: प्रापक
       redaction:
+        title: शीर्षक
         description: वर्णन
+      report:
+        category: तपाईँको रिपोर्टको कारण छान्नुहोस्
       user:
         email: इमेल
         active: सक्रिय
         display_name: देखाउने नाम
         description: वर्णन
-        home_lat: 'देशान्तर:'
-        home_lon: 'अक्षांश:'
+        home_lat: अक्षांश
+        home_lon: देशान्तर
         languages: भाषाहरू
         pass_crypt: पासवर्ड
     help:
@@ -127,24 +168,42 @@ ne:
     remote:
       name: रिमोट कन्ट्रोल
       description: रिमोट कन्ट्रोल  (JOSM वा Merkaartor)
+  auth:
+    providers:
+      none: कुनै पनि होइन
   api:
     notes:
+      comment:
+        commented_at_by_html: '%{user}  द्वारा  %{when} पहिले अद्यावधिक गरिएको'
       entry:
         comment: टिप्पणी
+  account:
+    deletions:
+      show:
+        confirm_delete: निश्चित हुनुहुन्छ ?
+        cancel: रद्द गर्नुहोस्
   accounts:
     edit:
-      my settings: मेरो अनुकुलताहरु
+      title: खाता सम्पादन गर्नुहोस्
+      my settings: मेरो सेटिङहरू
+      current email address: हालको इमेल ठेगाना
+      external auth: वाह्य अथेन्टिकेसन
       openid:
+        link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: यो के हो ?
       public editing:
         heading: सार्वजनिक सम्पादन
+        enabled: सक्रिय। Not anonymous and can edit data.
         enabled link text: यो के हो ?
         disabled link text: म किन सम्पादन गर्न सक्दिन?
       contributor terms:
+        heading: योगदानकर्ता सर्तहरू
+        agreed: तपाईँले नयाँ योगदानकर्ता सर्तहरू स्वीकार गर्नुभएको छ।
+        not yet agreed: तपाईँले नयाँ योगदानकर्ता सर्तहरू स्वीकार गर्नुभएको छैन।
         link text: यो के हो ?
       save changes button: परिवर्तनहरू संग्रह गर्नुहोस्
     go_public:
-      heading: 'सार्वजनिक सम्पादन:'
+      heading: सार्वजनिक सम्पादन
     update:
       success_confirm_needed: प्रयोगकर्ताको जानकारीहरू सफलतापूर्वक अध्यावधिक गरियो।
         Check your email for a note to confirm your new email address.
@@ -211,7 +270,7 @@ ne:
       feature_warning: '%{num_features}वटा सुविधाहरु लोड हुँदै छन्, जसले गर्दा तपाईंको
         ब्राउजर सुस्त वा अनुत्तरदायी बनाउन सक्छ । तपाईं साँच्चै यो जानकारी हेर्न चाहनुहुन्छ
         ?'
-      load_data: डेटा लोडगर्ने
+      load_data: डेटा लोड गर्नुहोस्
       loading: खुल्दै छ…
     tag_details:
       tags: ट्यागहरू
@@ -245,7 +304,7 @@ ne:
       title: परिवर्नहरू
       title_user: '%{user}द्वरा गरिएका परिवर्तनहरू'
       title_friend: तपाईको मित्रहरूद्वारा गरिएका परिवर्तनहरू
-      title_nearby: à¤¤à¤ªà¤¾à¤\88à¤\82 नजिक हुनुभएका प्रयोगकर्ताहरूद्वारा गरिएका परिवर्तनहरू
+      title_nearby: à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95à¥\8b नजिक हुनुभएका प्रयोगकर्ताहरूद्वारा गरिएका परिवर्तनहरू
       empty: कुनै पनि परिवर्तनहरू भेटिएनन्।
       empty_area: यो क्षेत्रमा कुनै परिवर्तनहरू छैनन्।
       empty_user: यस प्रयोगकर्ताद्वारा कुनै परिवर्तनहरू गरिएका छैनन्।
@@ -259,6 +318,10 @@ ne:
         created: सृजना गरिएको
         closed: समापन भएको
         belongs_to: रचयिता
+    heading:
+      title: 'परिवर्तनहरू: %{id}'
+    no_such_entry:
+      heading: '%{id} आइडी भएको कुनै अभिलेख भेटिएन'
     show:
       title: 'परिवर्तनहरू: %{id}'
       discussion: छलफल
@@ -273,12 +336,14 @@ ne:
       relations: सम्बन्धहरू (%{count})
       relations_paginated: सम्बन्धहरू (जम्मा %{count} मध्येबाट %{x}-%{y})
     timeout:
-      sorry: à¤®à¤¾à¤« à¤\97रà¥\8dनà¥\81हà¥\8bला, à¤¤à¤ªà¤¾à¤\88à¤\82ले खोज्नुभएको परिवर्तनहरूको सूची प्राप्त गर्न निकै
+      sorry: à¤®à¤¾à¤« à¤\97रà¥\8dनà¥\81हà¥\8bला, à¤¤à¤ªà¤¾à¤\88à¤\81ले खोज्नुभएको परिवर्तनहरूको सूची प्राप्त गर्न निकै
         समय लाग्यो ।
   changeset_comments:
     comment:
-      comment: ' %{author}द्वारा #%{changeset_id}मा नयाँ टिप्पणी'
-      commented_at_by_html: ' %{user}  द्वारा  %{when} पहिले अद्यावधिक गरिएको'
+      comment: '%{author}द्वारा #%{changeset_id}मा नयाँ टिप्पणी'
+      commented_at_by_html: '%{user}  द्वारा  %{when} पहिले अद्यावधिक गरिएको'
+    comments:
+      comment: '%{author}द्वारा #%{changeset_id}मा नयाँ टिप्पणी'
     index:
       title_all: OpenStreetMap परिवर्वतन सूची छलफल
       title_particular: 'OpenStreetMap परिवर्तन सूची #%{changeset_id} छलफल'
@@ -292,7 +357,8 @@ ne:
       friend: साथी
     show:
       my friends: मेरा साथीहरू
-      no friends: तपाईं कुनै साथीहरूलाई जोड्नु भएको छैन
+      no friends: तपाईँ कुनै साथीहरूलाई थप्नु भएको छैन
+      nearby users: अन्य नजिकका प्रयोगकर्ताहरू
   diary_entries:
     new:
       title: नयाँ दैनिकी प्रविष्टी
@@ -306,17 +372,19 @@ ne:
       user_title: '%{user}को डायरी'
       in_language_title: '%{language} भाषामा भएका दैनिकीहरू'
       new: नयाँ दैनिकी
-      new_title: तपाईंको डायरीमा नयाँ दैनिकी सिर्जना गर्नुहोस्
+      new_title: तपाईँको डायरीमा नयाँ दैनिकी सिर्जना गर्नुहोस्
+      my_diary: मेरो डायरी
       no_entries: कुनै पनि अभिलेखहरू भेटिएनन्
       recent_entries: हालैका दैनिकीहरू
       older_entries: पुराना अभिलेखहरू
       newer_entries: नयाँ अभिलेखहरू
     edit:
-      title: à¤¦à¥\88निà¤\95à¥\80 à¤ªà¥\8dरविषà¥\8dठà¥\80 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\87
-      marker_text: à¤¦à¥\88निà¤\95ी प्रविष्ठी स्थान
+      title: à¤¡à¤¾à¤¯à¤°à¥\80 à¤ªà¥\8dरविषà¥\8dठà¥\80 à¤¸à¤®à¥\8dपादन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
+      marker_text: à¤¡à¤¾à¤¯à¤°ी प्रविष्ठी स्थान
     show:
       title: '%{user}को डायरी | %{title}'
       user_title: '%{user}को डायरी'
+      discussion: छलफल
       leave_a_comment: टिप्पणी छोड्ने
       login_to_leave_a_comment_html: '%{login_link} टिप्पणी छोड्नलाई'
       login: प्रवेश
@@ -337,26 +405,27 @@ ne:
       edit_link: यो प्रविष्टी सम्पादन गर्ने
       hide_link: यो प्रविष्टी लुकाउने
       confirm: निश्चित गर्नुहोस्
-      report: à¤¯à¥\8b à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80à¤\95à¥\8b à¤\89à¤\9cà¥\81रà¥\80 à¤\97रà¥\8dनà¥\87
+      report: à¤¯à¥\8b à¤ªà¥\8dरविषà¥\8dà¤\9fà¥\80à¤\95à¥\8b à¤\89à¤\9cà¥\81रà¥\80 à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
     diary_comment:
       comment_from_html: '%{link_user}द्वारा %{comment_created_at}मा गरिएको टिप्पणी'
       hide_link: यो टिप्पणी लुकाउनुहोस्
       confirm: निश्चित गर्नुहोस्
     location:
       location: 'स्थान:'
-      view: अवलोकन गर्ने
-      edit: सम्पादन
+      view: अवलोकन गर्नुहोस्
+      edit: सम्पादन गर्नुहोस्
+      coordinates: '%{latitude}; %{longitude}'
     feed:
       user:
-        title: '%{user}को लागि ओपनस्ट्रीटम्याप दैनिकी'
-        description: '%{user}को लागि हालैका ओपनस्ट्रीटम्याप दैनिकीहरू'
+        title: '%{user}को लागि OpenStreetMap डायरी'
+        description: '%{user}को लागि हालैका OpenStreetMap डायरी'
       language:
         title: '%{language_name} भाषामा OpenStreetMap दैनिकी'
-        description: '%{language_name} भाषामा ओपनस्ट्रीटम्याप प्रयोगकर्ताहरूका हालैका
-          à¤¦à¥\88निà¤\95ी'
+        description: '%{language_name} भाषामा OpenStreetMap प्रयोगकर्ताहरूका हालैका
+          à¤¡à¤¾à¤¯à¤°ी'
       all:
-        title: ओपनस्ट्रीटम्याप दैनिकीहरू
-        description: ओपनस्ट्रीटम्याप प्रयोगकर्ताहरूका हालैका दैनिकीहरू
+        title: OpenStreetMap डायरी प्रविष्टीहरू
+        description: OpenStreetMap प्रयोगकर्ताहरूका हालैका डायरी प्रविष्टीहरू
     comments:
       post: पोष्ट
       when: कहिले
@@ -366,9 +435,11 @@ ne:
   friendships:
     make_friend:
       button: साथीको रूपमा थप्नुहोस्
-      success: '%{name} à¤\85ब à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95à¥\8b à¤®à¤¿à¤¤à¥\8dर हुनुभएको छ!'
+      success: '%{name} à¤\85ब à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95à¥\8b à¤¸à¤¾à¤¥à¥\80 हुनुभएको छ!'
       failed: माफ गर्नुहोला, %{name}लाई मित्रको रुपमा थप्न सकिएन।
-      already_a_friend: '%{name} सँग तपाईंले पहिले नै मित्रता गरिसक्नु भएको छ ।'
+      already_a_friend: '%{name} सँग तपाईँले पहिले साथी हुनुहुन्छ।'
+      limit_exceeded: तपाईँले हालसालै थुप्रै प्रयोगकर्ताहरूलाई साथी बनाउनु भएको छ।
+        Please wait a while before trying to friend any more.
     remove_friend:
       button: साथीबाट हटाउने
   geocoder:
@@ -483,6 +554,10 @@ ne:
           viaduct: भियाडक्ट
           "yes": पुल
         building:
+          garages: ग्यारेजहरू
+          hangar: ह्याङ्गर
+          house: घर
+          public: सार्वजनिक भवन
           "yes": भवन
         craft:
           brewery: ब्रुएरी
@@ -551,6 +626,7 @@ ne:
           "yes": ऐतिहासिक स्थल
         landuse:
           basin: बेसिन
+          cemetery: अन्त्यष्टी स्थल
           commercial: व्यवसायिक क्षेत्र
           conservation: संरक्षण
           construction: निर्माण
@@ -626,6 +702,7 @@ ne:
           administrative: प्रबन्धकीय स्थल
           architect: आर्किटेक्ट
           company: कम्पनी
+          estate_agent: घरजग्गा एजेन्ट
           government: सरकारी कार्यालय
           insurance: बीमा कार्यालय
           it: आइटी कार्यालय
@@ -657,6 +734,7 @@ ne:
         railway:
           abandoned: परित्यक्त रेलमार्ग
           junction: रेलमार्ग जङ्सन
+          subway: सबवे
         shop:
           bakery: बेकरी
           beauty: सौन्दर्य पसल
@@ -704,6 +782,7 @@ ne:
           sports: खेलकुद सामग्री पसल
           tailor: सुचीकार
           toys: खेलौना पसल
+          travel_agency: ट्राभल एजेन्सी
           video: भिडियो पसल
           "yes": पसल
         tourism:
@@ -734,6 +813,7 @@ ne:
           "yes": जलमार्ग
       admin_levels:
         level2: राष्ट्रिय सीमा
+        level3: क्षेत्र सीमा
         level4: राज्य सीमा
         level5: क्षेत्र सीमा
         level6: इलाका सीमा
@@ -759,16 +839,25 @@ ne:
   reports:
     new:
       categories:
+        diary_entry:
+          other_label: अन्य
+        diary_comment:
+          other_label: अन्य
+        user:
+          other_label: अन्य
         note:
           other_label: अन्य
   layouts:
+    project_name:
+      title: OpenStreetMap
+      h1: OpenStreetMap
     logo:
       alt_text: OpenStreetMap लोगो
     logout: निर्गमन
     log_in: प्रवेश गर्नुहोस्
     sign_up: खाता खाेल्नुहाेस्
     start_mapping: म्यापिङ गर्न सुरु गर्नुहोस्
-    edit: सम्पादन
+    edit: सम्पादन गर्नुहोस्
     history: इतिहास
     export: निर्यात गर्नुहोस्
     data: डेटा
@@ -798,6 +887,10 @@ ne:
     friendship_notification:
       hi: नमस्ते %{to_user},
       subject: '[OpenStreetMap] %{user} ले तपाईँलाई मित्रको रूपमा थप्नु भयो'
+    gpx_failure:
+      hi: नमस्ते %{to_user},
+    gpx_success:
+      hi: नमस्ते %{to_user},
     signup_confirm:
       greeting: नमस्ते!
     email_confirm:
@@ -860,27 +953,39 @@ ne:
       title: पासवर्ड बिर्सियो
       heading: पासवर्ड बिर्सिनुभयो ?
       email address: 'इमेल ठेगाना:'
-      new password button: à¤ªà¥\8dरवà¥\87स à¤¶à¤¬à¥\8dद à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\87
+      new password button: à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
     edit:
-      title: à¤ªà¥\8dरवà¥\87स à¤¶à¤¬à¥\8dद à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\87
-      heading: '%{user}à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¥\8dरवà¥\87स à¤¶à¤¬à¥\8dद à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\87'
-      reset: à¤¨à¤¯à¤¾à¤\81 à¤ªà¥\8dरवà¥\87शशवà¥\8dद
+      title: à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
+      heading: '%{user}à¤\95à¥\8b à¤²à¤¾à¤\97ि à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d'
+      reset: à¤ªà¤¾à¤¸à¤µà¤°à¥\8dड à¤°à¤¿à¤¸à¥\87à¤\9f à¤\97रà¥\8dनà¥\81हà¥\8bसà¥\8d
     update:
-      flash changed: तपाईंको प्रवेश शब्द परिवर्तन गरिएको छ।
+      flash changed: तपाईँको पासवर्ड परिवर्तन गरिएको छ।
+  preferences:
+    edit:
+      cancel: रद्द गर्नुहोस्
   profiles:
     edit:
-      image: 'चित्र:'
+      cancel: रद्द गर्नुहोस्
+      image: तस्विर
       home location: 'गृह स्थान:'
-      no home location: तपाईंले आफ्नो गृहस्थान प्रविष्ठ गर्नुभएको छैन।
+      no home location: तपाईँले आफ्नो गृहस्थान प्रविष्ठ गर्नुभएको छैन।
+      show: देखाउनुहोस्
+      delete: हटाउनुहोस्
   sessions:
     new:
       title: प्रवेश
       tab_title: प्रवेश
-      password: 'पासवर्ड:'
+      password: पासवर्ड
       login_button: प्रवेश
     destroy:
       title: लगआउट
       logout_button: निर्गमन
+  shared:
+    markdown_help:
+      link: कडी
+      image: तस्विर
+    richtext_field:
+      edit: सम्पादन गर्नुहोस्
   site:
     about:
       next: अर्को
@@ -896,6 +1001,7 @@ ne:
       legal_babble:
         more_title_html: थप जान्नको लागि
         contributors_title_html: हाम्रा योगदान कर्ताहरू
+        contributors_fr_france: फ्रान्स
     index:
       permalink: स्थायी लिङ्क
       shortlink: छोटो लिङ्क
@@ -970,35 +1076,52 @@ ne:
           subway: सबवे
           cable_car: केबल कार
           chair_lift: कुर्सी लिफ्ट
+          taxiway: ट्याक्सीको बाटो
+          city: शहर
+          vineyard: अङ्गुर-बगैँचा
           forest: वन
           wood: कुञ्ज
+          farmland: खेतीयोग्य जमिन
+          grass: घाँस
+          meadow: घाँसेमैदान
+          sand: बालुवा
           golf: गल्फ कोर्स
           park: उद्यान
           resident: आवासीय क्षेत्र
           lake: ताल
-          reservoir: मुहान
+          reservoir: जलाशय
+          glacier: हिमनदी
+          wetland: सिमसार
           farm: खेती
           cemetery: अन्त्यष्टी स्थल
+          beach: समुद्र किनारा
           school: विद्यालय
           university: विश्वविद्यालय
+          hospital: अस्पताल
           summit: शिखर
           peak: शिखर
           bicycle_shop: साइकल पसल
           bicycle_parking: साकल पार्किङ
           toilets: शौचालय
     welcome:
-      title: स्वागतम्!
+      title: स्वागत!
       whats_on_the_map:
         title: म्यापमा के छ
+      basic_terms:
+        node: नोड
+        way: बाटो
       rules:
         title: नियमहरू !
+      start_mapping: म्यापिङ गर्न सुरु गर्नुहोस्
   traces:
     new:
+      upload_trace: GPS Trace अपलोड गर्ने
       visibility_help: यसको मतलाब के हो ?
       help: सहायता
     create:
       upload_trace: GPS Trace अपलोड गर्ने
     edit:
+      cancel: रद्द गर्नुहोस्
       title: ट्रेस सम्पादन गर्दै %{name}
       heading: ट्रेस सम्पादन गर्दै %{name}
       visibility_help: यसको मतलब के हो ?
@@ -1013,6 +1136,7 @@ ne:
       uploaded: 'अपलोड गरिएको:'
       points: 'विन्दुहरू:'
       start_coordinates: 'सुरूको निर्देशङ्क:'
+      coordinates_html: '%{latitude}; %{longitude}'
       map: नक्सा
       edit: सम्पादन
       owner: 'मालिक:'
@@ -1033,9 +1157,11 @@ ne:
       public: सार्वजनिक
       private: निजी
     index:
-      public_traces: सारवजनिक GPS ट्रेसहरु
-      public_traces_from: '%{user}बाट सार्वकनिक GPS ट्रेसहरु'
+      public_traces: सार्वजनिक GPS ट्रेसहरू
+      my_gps_traces: मेरो जिपिएस ट्रेसहरू
+      public_traces_from: '%{user}बाट सार्वजनिक GPS ट्रेसहरू'
       tagged_with: ' %{tags}हरूद्वारा ट्याग गरिएको'
+      my_traces: मेरा ट्रेसहरू
     destroy:
       scheduled_for_deletion: मेट्नको लागि तालिकावद्ध गरिएको ट्रेस
     make_public:
@@ -1049,8 +1175,20 @@ ne:
     show:
       confirm: निश्चित हुनुहुन्छ ?
   oauth2_applications:
+    index:
+      name: नाम
+      permissions: अनुमतिहरू
+    application:
+      edit: सम्पादन गर्नुहोस्
+      delete: हटाउनुहोस्
     show:
+      edit: सम्पादन गर्नुहोस्
       delete: मेट्ने
+      permissions: अनुमतिहरू
+      redirect_uris: रिडाइरेक्ट युआरआइहरू
+  oauth2_authorized_applications:
+    index:
+      permissions: अनुमतिहरू
   users:
     new:
       title: खाता खाेल्नुहाेस्
@@ -1076,6 +1214,8 @@ ne:
       my comments: मेरा टिप्पणीहरू
       edits: सम्पादनहरू
       traces: ट्रेसहरू
+      notes: म्याप टिप्पणीहरू
+      remove as friend: साथीबाट हटाउने
       add as friend: साथी जोड्नुहोस्
       status: 'स्थिति:'
       role:
@@ -1083,7 +1223,7 @@ ne:
       comments: टिप्पणी
       confirm: निश्चित गर्नुहोस्
     go_public:
-      flash success: à¤¤à¤ªà¤¾à¤\88à¤\82à¤\95ा à¤¸à¤¬à¥\88 à¤¸à¤®à¥\8dपादनहरà¥\82 à¤¸à¤¾à¤°à¥\8dवाà¤\9cनिà¤\95 à¤\9bनà¥\8d , à¤¤à¤ªà¤¾à¤\88à¤\82 अब सम्पादन लायक
+      flash success: à¤¤à¤ªà¤¾à¤\88à¤\81à¤\95ा à¤¸à¤¬à¥\88 à¤¸à¤®à¥\8dपादनहरà¥\82 à¤¸à¤¾à¤°à¥\8dवाà¤\9cनिà¤\95 à¤\9bनà¥\8d , à¤¤à¤ªà¤¾à¤\88à¤\81 अब सम्पादन लायक
         हुनु भयो ।
     index:
       title: प्रयोगकर्ताहरू
@@ -1104,7 +1244,7 @@ ne:
     revoke:
       title: भूमिका फिर्ता निश्चित गर्ने
       heading: भूमिका फिर्ता निश्चित गर्ने
-      are_you_sure: à¤¤à¤ªà¤¾à¤\88à¤\82 भूमिका `%{role}' , `%{name} प्रोगकर्ताबाट फिर्ता लिने कुरामा
+      are_you_sure: à¤¤à¤ªà¤¾à¤\88à¤\81 भूमिका `%{role}' , `%{name} प्रोगकर्ताबाट फिर्ता लिने कुरामा
         निश्चित हुनुहुन्छ'?
       confirm: निश्चित गर्नुहोस्
       fail: भूमिका `%{role}' ,`%{name}'बाट फिर्ता लिन सकिएन । प्रोगकर्ता नाम र भूमिका
@@ -1112,16 +1252,21 @@ ne:
   user_blocks:
     show:
       created: सृजना गरिएको
-      status: वस्तुस्थिति
+      status: 'स्थिति:'
       show: देखाउनुहोस्
-      edit: सम्पादन
+      edit: सम्पादन गर्नुहोस्
       confirm: निश्चित हुनुहुन्छ ?
     block:
       show: देखाउनुहोस्
-      edit: सम्पादन
+      edit: सम्पादन गर्नुहोस्
     blocks:
       creator_name: सर्जक
       status: वस्तुस्थिति
+  user_mutes:
+    index:
+      table:
+        tbody:
+          send_message: सान्देस पठाउ
   notes:
     index:
       id: आईडी
@@ -1143,7 +1288,7 @@ ne:
     share:
       title: आदान-प्रदान गर्नुहोस्
       cancel: रद्द गर्नुहोस्
-      image: à¤\9bवि
+      image: à¤¤à¤¸à¥\8dविर
       long_link: कडी
       embed: एचटीएमएल
       format: 'ढाँचा:'
@@ -1158,6 +1303,8 @@ ne:
       layers:
         header: म्याप लेयरहरू
         notes: म्याप टिप्पणीहरू
+        gps: सार्वजनिक GPS ट्रेसहरू
+      make_a_donation: दान गर्नुहोस्
     changesets:
       show:
         comment: टिप्पणी
index 1439d1c1e298e860ae4f71d69acd2f0f9540b778..07edc2883f0f9c07ceec2d0844955860a7ab4599 100644 (file)
@@ -4,6 +4,7 @@
 # Author: Aalam
 # Author: Babanwalia
 # Author: Bgo eiu
+# Author: Cabal
 # Author: Jimidar
 # Author: Kuldeepburjbhalaike
 # Author: Satnam S Virdi
@@ -18,7 +19,7 @@ pa:
       diary_comment:
         create: ਸਾਂਭੋ
       diary_entry:
-        create: à¨\9bਾਪ
+        create: à¨¸à¨¾à¨\82ਭ
         update: ਅੱਪਡੇਟ ਕਰੋ
       issue_comment:
         create: ਟਿੱਪਣੀ ਕਰੋ
@@ -166,7 +167,7 @@ pa:
     download_xml: XML ਲਾਹੋ
     view_history: ਅਤੀਤ ਵੇਖੋ
     view_details: ਵੇਰਵੇ ਵੇਖੋ
-    location: 'ਸਥਿਤà©\80:'
+    location: 'à¨\9fਿà¨\95ਾਣਾ:'
     relation:
       members: ਜੀਅ
     relation_member:
@@ -196,7 +197,7 @@ pa:
         relation: ਸਬੰਧ
     start_rjs:
       load_data: ਡਾਟਾ ਲੋਡ ਕਰੋ
-      loading: à¨²à©\8bਡ à¨¹à©\8b à¨°à¨¿à¨¹à¨¾ à¨¹à©\88â\80¦
+      loading: à¨²à©±à¨¦ à¨°à¨¿à¨¹à¨¾ à¨¹à©\88...
     tag_details:
       tags: ਟੈਗ
       wikipedia_link: '%{page} ਲੇਖ ਵਿਕਿਪੀਡਿਆ ਉੱਤੇ'
@@ -369,7 +370,7 @@ pa:
           waste_basket: ਕੂੜਾਦਾਨ
           waste_disposal: ਕੂੜੇਦਾਨ
         boundary:
-          administrative: à¨ªà©\8dਰਸ਼ਾਸਕੀ ਸਰਹੱਦ
+          administrative: à¨ªà©\8dਰਬੰਧਕੀ ਸਰਹੱਦ
           census: ਮਰਦਮਸ਼ੁਮਾਰੀ ਸਰਹੱਦ
           national_park: ਕੌਮੀ ਬਾਗ਼
           protected_area: ਸੁਰੱਖਿਅਤ ਖੇਤਰ
@@ -730,7 +731,7 @@ pa:
     sign_up: ਭਰਤੀ ਹੋਵੋ
     start_mapping: ਨਕਸ਼ਾਬੰਦੀ ਸ਼ੁਰੂ ਕਰੋ
     edit: ਸੋਧੋ
-    history: à¨\85ਤà©\80ਤ
+    history: à¨ªà©\81ਰਾਣਾ
     export: ਬਰਾਮਦ
     data: ਸਮੱਗਰੀ
     export_data: ਸਮੱਗਰੀ ਬਰਾਮਦ ਕਰੋ
@@ -783,7 +784,7 @@ pa:
       date: ਮਿਤੀ
     message_summary:
       reply_button: ਜੁਆਬ
-      destroy_button: à¨®à¨¿à¨\9fਾà¨\89
+      destroy_button: à¨®à¨¿à¨\9fਾà¨\93
     new:
       title: ਸੁਨੇਹਾ ਘੱਲੋ
     create:
@@ -799,7 +800,7 @@ pa:
       unread_button: ਅਣ-ਪੜ੍ਹਿਆ ਨਿਸ਼ਾਨ ਲਾਉ
       back: ਪਿੱਛੇ
     sent_message_summary:
-      destroy_button: à¨®à¨¿à¨\9fਾà¨\89
+      destroy_button: à¨®à¨¿à¨\9fਾà¨\93
     heading:
       my_inbox: ਮੇਰਾ ਇਨਬਾਕਸ
     destroy:
@@ -869,7 +870,7 @@ pa:
     export:
       title: ਬਰਾਮਦ
       manually_select: ਆਪਣੇ ਆਪ ਇੱਕ ਵੱਖਰਾ ਖੇਤਰ ਚੁਣੋ
-      licence: à¨²à¨¾à¨\87ਸੰਸ
+      licence: ਲਸੰਸ
       too_large:
         other:
           title: ਹੋਰ ਸਰੋਤ
@@ -879,7 +880,7 @@ pa:
       how_to_help:
         title: ਮਦਦ ਕਿਵੇਂ ਕਰਨੀ ਹੈ
         join_the_community:
-          title: ਭਾਈਚਾਰੇ ਨਾਲ ਜੁੜੋ
+          title: ਭਾਈਚਾਰੇ ਨਾਲ ਜੁੜੋ
       other_concerns:
         title: ਹੋਰ ਫ਼ਿਕਰ
     help:
@@ -923,7 +924,7 @@ pa:
           runway: ਹਵਾਈ ਅੱਡੇ ਦੀ ਉਡਾਣ ਪੱਟੀ
           taxiway: ਟੈਕਸੀਵੇਅ
           apron: ਹਵਾਈ ਅੱਡੇ ਦਾ ਐਪਰਨ
-          admin: à¨ªà©\8dਰਸ਼ਾਸਕੀ ਸਰਹੱਦ
+          admin: à¨ªà©\8dਰਬੰਧਕੀ ਸਰਹੱਦ
           forest: ਜੰਗਲ
           wood: ਜੰਗਲ
           golf: ਗੋਲਫ਼ ਮੈਦਾਨ
@@ -1059,10 +1060,10 @@ pa:
       created from: 'ਕਿੱਥੋਂ ਉਸਾਰਿਆ:'
       status: 'ਦਰਜਾ:'
       role:
-        administrator: à¨\87ਹ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ à¨\87ੱà¨\95 à¨ªà©\8dਰਸ਼ਾਸਕ ਹੈ।
+        administrator: à¨\87ਹ à¨µà¨°à¨¤à©\8bà¨\82à¨\95ਾਰ à¨\87ੱà¨\95 à¨ªà©\8dਰਬੰਧਕ ਹੈ।
         moderator: ਇਹ ਵਰਤੋਂਕਾਰ ਇੱਕ ਵਿਚੋਲਾ ਹੈ।
         grant:
-          administrator: à¨ªà©\8dਰਸ਼ਾਸà¨\95à©\80 à¨¹à©±à¨\95 à¨¦à¨¿à¨\89
+          administrator: à¨ªà©\8dਰਬੰਧà¨\95à©\80 à¨¹à©±à¨\95 à¨¦à¨¿à¨\93
           moderator: ਵਿਚੋਲਗੀ ਦੇ ਹੱਕ ਦਿਉ
       comments: ਟਿੱਪਣੀਆਂ
       create_block: ਇਸ ਵਰਤੋਂਕਾਰ 'ਤੇ ਰੋਕ ਲਾਉ
index 88ac2cc0833119eebc0fc7c684ba689ebfdc0ca3..a7a581fd8810677b06977f24ef8ea31ce07f15da 100644 (file)
@@ -466,7 +466,7 @@ pl:
       entry_role_html: Relacja %{relation_name} (jako %{relation_role})
     not_found:
       title: Nie znaleziono
-      sorry: 'Niestety, nie odnaleziono %{type} #%{id}.'
+      sorry: 'Nie odnaleziono %{type} #%{id}.'
       type:
         node: węzła
         way: linii
@@ -512,6 +512,15 @@ pl:
       introduction: Kliknij na mapie, by wyszukać pobliskie obiekty.
       nearby: Obiekty w pobliżu
       enclosing: Większe, otaczające obiekty
+  old_nodes:
+    not_found:
+      sorry: 'Nie odnaleziono węzła #%{id} w wersji %{version}.'
+  old_ways:
+    not_found:
+      sorry: 'Nie odnaleziono linii #%{id} w wersji %{version}.'
+  old_relations:
+    not_found:
+      sorry: 'Nie odnaleziono relacji #%{id} w wersji %{version}.'
   changesets:
     changeset_paging_nav:
       showing_page: Strona %{page}
@@ -742,7 +751,7 @@ pl:
     search:
       title:
         results_from_html: Wyniki z %{results_link}
-        latlon: Wewnętrzny
+        latlon: Internal
         osm_nominatim: Nominatim
         osm_nominatim_reverse: Nominatim
     search_osm_nominatim:
@@ -1911,6 +1920,10 @@ pl:
       new password button: Wyczyść hasło
       help_text: Proszę wprowadzić adres e-mail używany do logowania. Zostanie wysłany
         na niego odnośnik służący do wyczyszczenia hasła.
+    create:
+      send_paranoid_instructions: Jeśli twój adres e-mail istnieje w naszej bazie
+        danych, otrzymasz link do odzyskania hasła na swój adres e-mail w ciągu kilku
+        minut.
     edit:
       title: Wyczyść hasło
       heading: Czyszczenie hasła użytkownika %{user}
@@ -1918,6 +1931,7 @@ pl:
       flash token bad: Nie znaleziono tokenu, sprawdź URL
     update:
       flash changed: Hasło zostało zmienione.
+      flash token bad: Nie znalaziono tego tokena. Sprawdź adres URL.
   preferences:
     show:
       title: Preferencje
@@ -2116,6 +2130,14 @@ pl:
         contributors_fr_credit_html: '%{france}: Zawiera dane uzyskane z Direction
           Générale des Impôts.'
         contributors_fr_france: Francja
+        contributors_hr_credit_html: |-
+          %{croatia}: Zawiera dane z %{dgu_link} i %{open_data_portal}
+          (informacje publiczne Chorwacji).
+        contributors_hr_croatia: Chorwacja
+        contributors_hr_dgu: Państwowej Administracji Geodezyjnej Chorwacji (Državna
+          geodetska uprava)
+        contributors_hr_open_data_portal: Krajowego portalu otwartych danych (Portal
+          otvorenih podataka)
         contributors_nl_credit_html: '%{netherlands}: Zawiera dane &copy; AND, 2007
           (%{and_link})'
         contributors_nl_netherlands: Holandia
@@ -2124,8 +2146,12 @@ pl:
         contributors_nz_new_zealand: Nowa Zelandia
         contributors_nz_linz_data_service: LINZ Data Service
         contributors_nz_cc_by: CC BY 4.0
+        contributors_rs_credit_html: |-
+          %{serbia}: Zawiera dane z %{rgz_link} i %{open_data_portal}
+          (informacje publiczne Serbii), 2018.
         contributors_rs_serbia: Serbia
-        contributors_rs_open_data_portal: Krajowy Portal Otwartych Danych
+        contributors_rs_rgz: Serbskiego Urzędu Geodezyjnego
+        contributors_rs_open_data_portal: Krajowego portalu otwartych danych
         contributors_si_credit_html: '%{slovenia}: Zawiera dane %{gu_link} oraz %{mkgp_link}
           (informacja publiczna Słowenii).'
         contributors_si_slovenia: Słowenia
@@ -2146,7 +2172,7 @@ pl:
         contributors_gb_united_kingdom: Wielka Brytania
         contributors_2_html: Szczegóły tych i innych źródeł, które zostały wykorzystane,
           aby udoskonalić OpenStreetMap, są dostępne na stronie %{contributors_page_link}.
-        contributors_2_contributors_page: Contributors (en)
+        contributors_2_contributors_page: Contributors
         contributors_footer_2_html: Włączenie danych do OpenStreetMap nie musi oznaczać,
           że udostępniający je podmiot popiera OpenStreetMap, udziela jakiejkolwiek
           gwarancji lub ponosi jakąkolwiek odpowiedzialność.
@@ -2327,6 +2353,7 @@ pl:
           farmland: Grunty rolne
           grass: Trawnik
           meadow: Łąka
+          bare_rock: Odkryte skały
           sand: Piaski
           golf: Pole golfowe
           park: Park
@@ -2340,6 +2367,7 @@ pl:
           scrubland: Zarośla
           lake: Jezioro
           reservoir: Zbiornik
+          intermittent_water: Okresowy ciek
           glacier: Lodowiec
           reef: Rafa
           wetland: Mokradła
@@ -2532,6 +2560,7 @@ pl:
         other: Plik GPX z %{count} punktami od %{user}
       description_without_count: Plik GPX od %{user}
   application:
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: Nie masz uprawnień do wykonywania tej akcji
     require_cookies:
       cookies_needed: Wygląda na to, że wyłączono obsługę ciasteczek w przeglądarce.
@@ -2553,6 +2582,7 @@ pl:
       oauth2_authorizations: Autoryzacje OAuth 2
     auth_providers:
       openid_logo_alt: Zaloguj się przez OpenID
+      openid_login_button: Kontynuuj
       openid:
         title: Zaloguj się przez OpenID
         alt: Zaloguj się za pomocą adresu URL OpenID
@@ -2713,6 +2743,7 @@ pl:
   users:
     new:
       title: Zarejestruj się
+      tab_title: Rejestracja
       no_auto_account_create: Niestety nie możemy aktualnie stworzyć ci konta automatycznie.
       please_contact_support_html: Skontaktuj się z %{support_link} w celu umówienia
         się na założenie konta – postaramy się rozpatrzyć prośbę jak najszybciej.
@@ -2735,7 +2766,7 @@ pl:
       privacy_policy_title: Polityka prywatności OSMF, w tym sekcja dotycząca adresów
         e-mail
       or: lub
-      use external auth: Alternatywnie, zaloguj się przez...
+      use external auth: 'Alternatywnie, zarejestruj się przez:'
     terms:
       title: Warunki
       heading: Warunki
@@ -2809,14 +2840,18 @@ pl:
       role:
         administrator: Ten użytkownik jest administratorem
         moderator: Ten użytkownik jest moderatorem
+        importer: Ten użytkownik jest importerem
         grant:
           administrator: Przyznaj dostęp administratora
           moderator: Przyznaj dostęp moderatora
+          importer: Przyznaj rolę importera
         revoke:
           administrator: Cofnij dostęp administratora
           moderator: Cofnij dostęp moderatora
+          importer: Odwołaj rolę importera
       block_history: aktywne blokady
       moderator_history: nałożone blokady
+      revoke_all_blocks: Odwołaj wszystkie blokady
       comments: komentarze
       create_block: Zablokuj tego użytkownika
       activate_user: Aktywuj tego użytkownika
@@ -2922,6 +2957,18 @@ pl:
       confirm: Czy na pewno chcesz odwołać tę blokadę?
       revoke: Odwołaj!
       flash: Blokada została odwołana.
+    revoke_all:
+      title: Odwoływanie wszystkich blokad nałożonych na użytkownika %{block_on}
+      heading_html: Odwoływanie wszystkich blokad nałożonych na użytkownika %{block_on}
+      empty: Użytkownik %{name} nie ma aktywnych blokad.
+      confirm: Jesteś pewny, że chcesz odwołać %{active_blocks}?
+      active_blocks:
+        one: '%{count} aktywna blokada'
+        few: '%{count} aktywne blokady'
+        many: '%{count} aktywnych blokad'
+        other: ""
+      revoke: Odwołaj!
+      flash: Wszystkie aktywne blokady zostały odwołane.
     helper:
       time_future_html: Blokada wygasa za %{time}.
       until_login: Aktywna do momentu zalogowania się użytkownika.
@@ -2957,7 +3004,7 @@ pl:
     blocks_on:
       title: Blokady na użytkownika %{name}
       heading_html: Lista blokad na użytkownika %{name}
-      empty: '%{name} nie był jeszcze zablokowany.'
+      empty: Użytkownik %{name} nie był jeszcze zablokowany.
     blocks_by:
       title: Blokady nałożone przez %{name}
       heading_html: Lista blokad nałożonych przez %{name}
@@ -2986,14 +3033,31 @@ pl:
       reason: Powód blokady
       status: Status
       revoker_name: Odwołana przez
+      older: Starsze blokady
+      newer: Nowsze blokady
+    navigation:
+      all_blocks: Wszystkie blokady
+      blocks_on_me: Blokady nałożone na mnie
+      blocks_on_user: Blokady na %{user}
+      blocks_by_me: Blokady nałożone przeze mnie
+      blocks_by_user: Blokady nałożone przez %{user}
+      block: Blokada nr %{id}
   user_mutes:
     index:
+      user_mute_explainer: Wiadomości od wyciszonych użytkowników są przenoszone do
+        osobnej skrzynki odbiorczej, a ty nie otrzymasz powiadomień e-mailem.
+      user_mute_admins_and_moderators: Możesz wyciszyć administratorów i moderatorów,
+        jednak ich wiadomości nie będą wyciszone.
       table:
         tbody:
           unmute: Wyłącz wyciszenie
           send_message: Wyślij wiadomość
     create:
-      notice: Wyciszyłeś %{name}.
+      notice: Wyciszyłeś użytkownika %{name}.
+      error: Nie udało się wyciszyć użytkownika %{name}. %{full_message}
+    destroy:
+      notice: Odciszyłeś użytkownika %{name}.
+      error: Nie udało się odciszyć użytkownika. Spróbuj ponownie.
   notes:
     index:
       title: Uwagi użytkownika %{user}
@@ -3043,6 +3107,10 @@ pl:
       intro: Zauważyłeś błąd lub brak czegoś? Daj znać innym mapującym, aby mogli
         to poprawić. Przesuń znacznik do właściwej pozycji i wpisz notatkę opisującą
         problem.
+      anonymous_warning_html: Nie jesteś zalogowany. %{log_in} lub %{sign_up}, jeśli
+        chcesz otrzymywać aktualizacje tej uwagi.
+      anonymous_warning_log_in: Zaloguj się
+      anonymous_warning_sign_up: zarejestruj
       advice: Twoja uwaga jest publiczna i może zostać użyta do zaktualizowania mapy,
         nie podawaj tu więc informacji osobistych oraz informacji z map i źródeł chronionych
         prawami autorskimi.
@@ -3113,6 +3181,7 @@ pl:
       osm_france: OpenStreetMap France
       thunderforest_credit: Kafelki dzięki uprzejmości %{thunderforest_link}
       andy_allan: Andy'ego Allana
+      tracestrack_credit: Kafelki dzięki uprzejmości %{tracestrack_link}
       hotosm_credit: 'Styl kafelków: %{hotosm_link}. Hosting: %{osm_france_link}'
       hotosm_name: Humanitarian OpenStreetMap Team
     site:
index 1dc5c537ac548062dc9a93a372d6466b073a967d..638a310b0a11a80b4575a092e0b273b3c3c65928 100644 (file)
@@ -710,6 +710,10 @@ pt-PT:
       contact_the_community_html: Fique à vontade para %{contact_link} a comunidade
         OpenStreetMap caso tenha encontrado uma ligação inativa ou um erro. Deixe
         uma nota da URL exata da sua solicitação.
+    bad_request:
+      title: Pedido inválido
+      description: A operação solicitada no servidor OpenStreetMap não é válida (HTTP
+        400)
     forbidden:
       title: Proibido
       description: A operação solicitada no servidor do OpenStreetMap só está disponível
@@ -1778,8 +1782,8 @@ pt-PT:
           perto de %{place}.'
         commented_note_html: '%{commenter} reabriu uma nota comentada por ti. A nota
           fica perto de %{place}.'
-      details: Podes ver mais detalhes sobre a nota em %{url}.
-      details_html: Podes ver mais detalhes sobre a nota em %{url}.
+      details: Responde ou descobre mais sobre a nota em %{url}.
+      details_html: Responde ou descobre mais sobre a nota em %{url}.
     changeset_comment_notification:
       description: Conjunto de alterações n.º %{id}
       hi: Olá, %{to_user}.
@@ -1800,10 +1804,8 @@ pt-PT:
         partial_changeset_with_comment: com o comentário '%{changeset_comment}'
         partial_changeset_with_comment_html: com o comentário '%{changeset_comment}'
         partial_changeset_without_comment: sem comentários
-      details: Podes encontrar mais informações sobre o conjunto de alterações em
-        %{url}.
-      details_html: Podes encontrar mais informações sobre o conjunto de alterações
-        em %{url}.
+      details: Responde ou descobre mais sobre o conjunto de alterações em %{url}.
+      details_html: Responde ou descobre mais sobre o conjunto de alterações em %{url}.
       unsubscribe: Podes deixar de acompanhar as atualizações deste conjunto de alterações
         em %{url}.
       unsubscribe_html: Podes deixar de acompanhar as atualizações deste conjunto
@@ -1980,13 +1982,15 @@ pt-PT:
     new:
       title: Entrar
       tab_title: Iniciar sessão
+      login_to_authorize_html: Inicia sessão no OpenStreetMap para acederes a %{client_app_name}.
       email or username: 'E-mail ou Nome de utilizador:'
       password: Palavra-passe
       remember: Ficar autenticado entre sessões
       lost password link: Perdeste a tua palavra-passe?
       login_button: Iniciar sessão
       register now: Regista-te agora
-      with external: 'Em alternativa, usa um serviço externo para iniciares sessão:'
+      with external: ou inicia sessão com uma aplicação de terceiros
+      or: ou
       auth failure: Lamentamos, mas não foi possível iniciar sessão com os dados fornecidos.
     destroy:
       title: Sair
@@ -2157,6 +2161,12 @@ pt-PT:
         contributors_fr_credit_html: '%{france}: contém dados provenientes da Direção
           Geral de Impostos.'
         contributors_fr_france: França
+        contributors_hr_credit_html: |-
+          %{croatia}: Contém dados de %{dgu_link} e %{open_data_portal}
+          (informação pública da Croácia).
+        contributors_hr_croatia: Croácia
+        contributors_hr_dgu: Administração Geodésica Estatal da Croácia
+        contributors_hr_open_data_portal: Portal Nacional de Dados Abertos
         contributors_nl_credit_html: '%{netherlands}: Contém &copy; e dados, 2007
           (%{and_link})'
         contributors_nl_netherlands: Países Baixos
@@ -2617,6 +2627,9 @@ pt-PT:
         other: Ficheiro GPX com %{count} pontos de %{user}
       description_without_count: Ficheiro GPX de %{user}
   application:
+    basic_auth_disabled: 'A Autenticação Básica HTTP está desativada: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 e 1.0a estão desativados: %{link}'
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: Não tens permissões para realizar essa operação
     require_cookies:
       cookies_needed: Parece que tens os "cookies" desativados - por favor, ativa-os
@@ -2639,6 +2652,7 @@ pt-PT:
       muted_users: Utilizadores Silenciados
     auth_providers:
       openid_logo_alt: Iniciar sessão com um OpenID
+      openid_login_button: Continuar
       openid:
         title: Iniciar sessão com OpenID
         alt: Iniciar sessão com um URL do OpenID
@@ -2703,6 +2717,8 @@ pt-PT:
       write_redactions: Rever dados do mapa
       read_email: ‎Ler e-mail de utilizador
       skip_authorization: Aprovar a aplicação automaticamente
+    for_roles:
+      moderator: Esta permissão é para ações disponíveis apenas para moderadores
   oauth_clients:
     new:
       title: Registar uma nova aplicação
@@ -2798,20 +2814,29 @@ pt-PT:
   users:
     new:
       title: Criar conta
+      tab_title: Registar
+      signup_to_authorize_html: Inicia sessão no OpenStreetMap para acederes a %{client_app_name}.
       no_auto_account_create: Infelizmente, e de momento, não é possível criar uma
         conta automaticamente.
       please_contact_support_html: Por favor, contacta %{support_link} para pedir
         a criação de uma conta - tentaremos tratar do pedido o mais rapidamente possível.
       support: apoio
       about:
-        header: Livre e editável
+        header: Gratuito e editável.
         paragraph_1: Ao contrário de outros mapas, o OpenStreetMap é completamente
           criado por pessoas como tu, e qualquer pessoa o pode corrigir, transferir
           e usar de forma gratuita.
-        paragraph_2: Regista-te para começares a contribuir. Iremos enviar um e-mail
-          para confirmar a tua conta.
+        paragraph_2: Regista-te para começares a contribuir.
+        welcome: Bem-vind@ ao OpenStreetMap
+      duplicate_social_email: Se já tens uma conta OpenStreetMap e desejas utilizar
+        um provedor de identidade externo, inicia sessão com a tua palavra-passe e
+        modifica as definições da tua conta.
       display name description: O nome de utilizador ficará visível publicamente.
         Poderás alterar o nome posteriormente nas configurações do teu perfil.
+      by_signing_up_html: Ao registares-te, aceitas os nossos %{tou_link}, %{privacy_policy_link}
+        e %{contributor_terms_link}.
+      tou: Termos de Utilização
+      contributor_terms: Termos de Contribuidor
       external auth: 'Autenticação por terceiros:'
       continue: Criar conta
       terms accepted: Obrigado por aceitares os novos termos de contribuidor!
@@ -2820,7 +2845,10 @@ pt-PT:
       privacy_policy: política de privacidade
       privacy_policy_title: Política de privacidade da OSMF incluindo secção sobre
         endereços de correio eletrónico
-      use external auth: Em alternativa, usa um serviço externo para iniciares sessão
+      consider_pd_html: Considero que as minhas contribuições estão no %{consider_pd_link}.
+      consider_pd: domínio público
+      or: ou
+      use external auth: ou regista-te com um serviço externo
     terms:
       title: Termos
       heading: Termos
@@ -3091,6 +3119,13 @@ pt-PT:
       revoker_name: Revogado por
       older: Blocos mais antigos
       newer: Blocos mais recentes
+    navigation:
+      all_blocks: Todos os bloqueios
+      blocks_on_me: Quem me bloqueou
+      blocks_on_user: Bloqueios a %{user}
+      blocks_by_me: Os meus bloqueios
+      blocks_by_user: Bloqueios de %{user}
+      block: 'Bloqueio #%{id}'
   user_mutes:
     index:
       title: Utilizadores Silenciados
@@ -3166,6 +3201,10 @@ pt-PT:
         o mais pormenorizada possível sobre o que pretendes ver alterado no mapa,
         para que outros mapeadores te possam ajudar. Posiciona o marcador no local
         correto e escreve uma nota que explique o problema.
+      anonymous_warning_html: Não tens sessão iniciada. Por favor, %{log_in} ou %{sign_up}
+        se quiseres receber atualizações sobre a tua nota.
+      anonymous_warning_log_in: inicia sessão
+      anonymous_warning_sign_up: regista-te
       advice: 'Lembra-te: a tua nota é pública e poderá ser usada para atualizar o
         mapa, portanto, não introduzas informações pessoais, dados de mapas ou catálogos
         protegidos por direitos de autor.'
index 83a1f5f2883af5bd5458dd3659a29aa7778a9241..0023f649b954073e3c8a21e8d643f5c5e45fc9f3 100644 (file)
@@ -1834,8 +1834,8 @@ ru:
           заметок недалеко от %{place}.'
         commented_note_html: '%{commenter} открыл заново одну из вами прокомментированных
           заметок недалеко от %{place}.'
-      details: Ð\9fодÑ\80обнее о заметке %{url}.
-      details_html: 'Ð\9fодÑ\80обнее о заметке: %{url}.'
+      details: Ð\9eÑ\82веÑ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83знаÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е о заметке %{url}.
+      details_html: 'Ð\9eÑ\82веÑ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83знаÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е о заметке: %{url}.'
     changeset_comment_notification:
       hi: Здравствуйте, %{to_user},
       greeting: Здравствуйте,
@@ -1855,8 +1855,8 @@ ru:
         partial_changeset_with_comment: с комментарием '%{changeset_comment}'
         partial_changeset_with_comment_html: с комментарием '%{changeset_comment}'
         partial_changeset_without_comment: без комментария
-      details: Дополнительные сведения о пакете правок можно найти на %{url}.
-      details_html: Ð\94ополниÑ\82елÑ\8cнÑ\8bе Ñ\81ведениÑ\8f Ð¾ Ð¿Ð°ÐºÐµÑ\82е Ð¿Ñ\80авок Ð¼Ð¾Ð¶Ð½Ð¾ Ð½Ð°Ð¹Ñ\82и на %{url}.
+      details: 'Ответить или узнать больше о пакете правок: %{url}.'
+      details_html: Ð\9eÑ\82веÑ\82иÑ\82Ñ\8c Ð¸Ð»Ð¸ Ñ\83знаÑ\82Ñ\8c Ð±Ð¾Ð»Ñ\8cÑ\88е Ð¾ Ð¿Ð°ÐºÐµÑ\82е Ð¿Ñ\80авок Ð¼Ð¾Ð¶Ð½Ð¾ на %{url}.
       unsubscribe: Чтобы отказаться от новых сообщений для этого пакета правок, перейдите
         по ссылке %{url} и нажмите кнопку "Отписаться".
       unsubscribe_html: Чтобы отказаться от подписки на обновления этого набора изменений,
index 7c3a19f10688dc9b9579aa828ae80cfebc955ba7..7e046f0def796bee44ae6029d039016a75cf440e 100644 (file)
@@ -15,6 +15,7 @@
 # Author: Mtej
 # Author: Peter Klofutar
 # Author: Pickle12
+# Author: Pipi Ferry
 # Author: Ruila
 # Author: Skalcaa
 # Author: Stefanb
@@ -522,6 +523,8 @@ sl:
         in povezavo, ki ste jo kliknili.
     show:
       title: 'Nabor sprememb: %{id}'
+      created: 'Ustvarjeno: %{when}'
+      closed: 'Zaprto: %{when}'
       created_ago_html: Ustvaril_a %{time_ago}
       closed_ago_html: Zaprto %{time_ago}
       created_ago_by_html: Ustvaril %{user} %{time_ago}
@@ -603,6 +606,7 @@ sl:
     show:
       title: Dnevnik uporabnika %{user} | %{title}
       user_title: Dnevnik uporabnika %{user}
+      discussion: Pogovor
       leave_a_comment: Napiši komentar
       login_to_leave_a_comment_html: '%{login_link} za vpis komentarja'
       login: Prijava
@@ -802,7 +806,7 @@ sl:
           fountain: Vodomet
           fuel: Polnilna postaja
           gambling: Igre na srečo
-          grave_yard: Pokopališče
+          grave_yard: Pokopališče v bližini cerkve
           grit_bin: Posoda za pesek
           hospital: Bolnišnica
           hunting_stand: Lovska preža
@@ -834,7 +838,7 @@ sl:
           pub: Pivnica
           public_bath: Kopališče
           public_bookcase: Javna knjižna omara
-          public_building: Javne stavba
+          public_building: Javna stavba
           ranger_station: Gozdarska postaja
           recycling: Reciklirna točka
           restaurant: Restavracija
@@ -874,7 +878,7 @@ sl:
           "yes": Meja
         bridge:
           aqueduct: Akvadukt
-          boardwalk: Sprehajališče
+          boardwalk: Sprehajališče iz desk
           suspension: Viseči most
           swing: Vrteči most
           viaduct: Viadukt
@@ -885,7 +889,7 @@ sl:
           barn: Skedenj
           bungalow: Bungalov
           cabin: Brunarica
-          chapel: Kapelica
+          chapel: Kapela
           church: Cerkveno poslopje
           civic: Občinska stavba
           college: VIsokošolska stavba
@@ -894,7 +898,7 @@ sl:
           detached: Osamljena hiša
           dormitory: Študentski dom
           duplex: Dvostanovanjska hiša
-          farm: Kmetija
+          farm: Hiša kmetije
           farm_auxiliary: Pomožna kmetijska stavba
           garage: Garaža
           garages: Garaže
@@ -903,7 +907,7 @@ sl:
           hospital: Poslopje bolnišnice
           hotel: Poslopje hotela
           house: Hiša
-          houseboat: Bivalni čoln
+          houseboat: Bivalni čoln - Hiša-čoln
           hut: Koča
           industrial: Industrijski objekt
           kindergarten: Poslopje vrtca
@@ -918,7 +922,7 @@ sl:
           semidetached_house: Dvojček
           service: Servisna stavba
           shed: Lopa
-          stable: Hlev
+          stable: Hlev za konje
           static_caravan: Stanovanjska prikolica
           temple: Tempelj
           terrace: Terasa
@@ -1009,7 +1013,7 @@ sl:
           stop: Stop znak
           street_lamp: Ulična svetilka
           tertiary: Lokalna cesta
-          tertiary_link: Terciarna cesta
+          tertiary_link: Priključek na lokalno cesto
           track: Kolovoz
           traffic_mirror: Prometno ogledalo
           traffic_signals: Prometna signalizacija
@@ -1018,7 +1022,7 @@ sl:
           trunk_link: Priključek na hitro cesto
           turning_circle: Obračališče
           turning_loop: Obračališče
-          unclassified: Neopredeljena cesta
+          unclassified: Neopredeljena cesta - Neklasificirana cesta
           "yes": Cesta
         historic:
           aircraft: Zgodovinsko letalo
@@ -1052,7 +1056,7 @@ sl:
           tomb: Grobnica
           tower: Stolp
           wayside_chapel: Obcestna kapelica
-          wayside_cross: Križ
+          wayside_cross: Obpotni križ
           wayside_shrine: Kapelica
           wreck: Razbitina
           "yes": Zgodovinski kraj
@@ -1063,12 +1067,12 @@ sl:
           aquaculture: Akvakultura
           basin: Čistilni bazen
           brownfield: Gradbišče
-          cemetery: Pokopališče
+          cemetery: Pokopališče, ki ni ob cerkvi
           commercial: Poslovna cona
           conservation: Zaščiteno območje
           construction: Gradbišče
           farmland: Kmetijsko zemljišče
-          farmyard: Kmetija
+          farmyard: Kmetija - dvorišče
           forest: Gozd
           garages: Garaže
           grass: Trata
@@ -1303,7 +1307,7 @@ sl:
           funicular: Žična vzpenjača
           halt: Železniško postajališče
           junction: Križišče železnic
-          level_crossing: Prehod
+          level_crossing: Nivojski prehod
           light_rail: Mestna železnica
           miniature: Miniaturna železnica
           monorail: Monorail
@@ -1368,7 +1372,7 @@ sl:
           erotic: Erotična trgovina
           estate_agent: Nepremičninska agencija
           fabric: Prodajalna blaga
-          farm: Kmečka trgovina
+          farm: Kmetijska trgovina
           fashion: Modna trgovina
           fishing: Prodajalna ribiške opreme
           florist: Cvetličarna
@@ -1442,7 +1446,7 @@ sl:
           wine: Vinoteka
           "yes": Trgovina
         tourism:
-          alpine_hut: Koča
+          alpine_hut: Alpska koča
           apartment: Počitniški apartma
           artwork: Umetnina
           attraction: Zanimivost
@@ -1450,7 +1454,7 @@ sl:
           cabin: Turistično prenočišče
           camp_pitch: Prostor za kampiranje
           camp_site: Kamp
-          caravan_site: Kamp
+          caravan_site: Kamp - Prostor za avtodome/bivalne prikolice
           chalet: Počitniška hišica
           gallery: Galerija
           guest_house: Penzion
@@ -2173,6 +2177,10 @@ sl:
           %{france}: Vsebuje podatke iz
           Direction Générale des Impôts.
         contributors_fr_france: Francija
+        contributors_hr_credit_html: |-
+          %{croatia}: Vsebuje podatke iz %{dgu_link} in %{open_data_portal}
+          (javne informacije Hrvaške).
+        contributors_hr_croatia: Hrvaška
         contributors_nl_credit_html: '%{netherlands}: Vsebuje podatke © IN, 2007 (%{and_link})'
         contributors_nl_netherlands: Nizozemska
         contributors_nz_credit_html: |-
@@ -3189,6 +3197,8 @@ sl:
       intro: Ste opazili napako ali pomanjkljivost? Obvestite druge kartografe o tem,
         da lahko to popravimo. Premaknite označevalec na pravo mesto in vpišite opombo,
         v kateri pojasnite težavo.
+      anonymous_warning_log_in: Prijavite se
+      anonymous_warning_sign_up: Registrirajte se
       advice: Vaša opomba je javna in se lahko uporabi za posodobitev zemljevida.
         Ne vnašajte osebnih podatkov ali podatkov iz avtorsko varovanih zemljevidov
         ali imenikov.
index b09af786ced5ffe55de7b07220f91a420ad346c7..ad4b00b3fe73b52731497c4e18de97aa17ade3e4 100644 (file)
@@ -1462,7 +1462,7 @@ sr:
           места %{place}.'
         commented_note: '%{commenter} је реактивирао белешку мапе коју сте коментарисали.
           Белешка је у близини места %{place}.'
-      details: Ð\92иÑ\88е Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98а Ð¾ Ð±ÐµÐ»ÐµÑ\88Ñ\86и Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80онаÑ\92е на %{url}.
+      details: Ð\9eдговоÑ\80иÑ\82е Ð¸Ð»Ð¸ Ñ\81азнаÑ\98Ñ\82е Ð²Ð¸Ñ\88е Ð¾ Ð±ÐµÐ»ÐµÑ\88Ñ\86и на %{url}.
     changeset_comment_notification:
       hi: Поздрав, %{to_user},
       greeting: Поздрав,
@@ -1477,7 +1477,7 @@ sr:
           мапе који надгледате и који је направио %{changeset_author}'
         partial_changeset_with_comment: са коментаром „%{changeset_comment}”
         partial_changeset_without_comment: без коментара
-      details: Ð\92иÑ\88е Ð¸Ð½Ñ\84оÑ\80маÑ\86иÑ\98а Ð¾ Ñ\87еÑ\98нÑ\9fÑ\81еÑ\82овима Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80онаÑ\92е на %{url}.
+      details: Ð\9eдговоÑ\80иÑ\82е Ð¸Ð»Ð¸ Ñ\81азнаÑ\98Ñ\82е Ð²Ð¸Ñ\88е Ð¾ Ñ\81еÑ\82овима Ð¿Ñ\80омена на %{url}.
       unsubscribe: Можете одјавити обавештења овог скупа измена на %{url}.
   confirmations:
     confirm:
index 184082f24e115d5275b0818ceac0baa2459f816c..b25c1466a3505b8ed793e1b555944fc855166d71 100644 (file)
@@ -369,6 +369,7 @@ sv:
     deleted_ago_by_html: Raderades %{time_ago} av %{user}
     edited_ago_by_html: Redigerades %{time_ago} av %{user}
     version: Version
+    redacted_version: Redigerad version
     in_changeset: Ändringsuppsättning
     anonymous: anonym
     no_comment: (inga kommentarer)
@@ -381,7 +382,10 @@ sv:
       other: '%{count} sträckor'
     download_xml: Ladda ner XML
     view_history: Visa historik
+    view_unredacted_history: Visa oredigerad historik
     view_details: Visa detaljer
+    view_redacted_data: Visa redigerad data
+    view_redaction_message: Visa redigeringsmeddelande
     location: 'Plats:'
     node:
       title_html: 'Nod: %{name}'
@@ -503,8 +507,12 @@ sv:
         created: Skapad
         closed: Stängd
         belongs_to: Författare
+    subscribe:
+      button: Prenumerera på diskussion
     show:
       title: 'Ändringsuppsättning: %{id}'
+      created: 'Skapades: %{when}'
+      closed: 'Stängdes: %{when}'
       created_ago_html: Skapades %{time_ago}
       closed_ago_html: Stängdes %{time_ago}
       created_ago_by_html: Skapades %{time_ago} av %{user}
@@ -588,6 +596,7 @@ sv:
     show:
       title: '%{user}s dagbok | %{title}'
       user_title: '%{user}s dagbok'
+      discussion: Diskussion
       leave_a_comment: Lämna en kommentar
       login_to_leave_a_comment_html: '%{login_link} för att lämna en kommentar'
       login: Logga in
@@ -640,6 +649,8 @@ sv:
       comment: Kommentar
       newer_comments: Nyare kommentarer
       older_comments: Äldre kommentarer
+    subscribe:
+      button: Prenumerera på diskussion
   doorkeeper:
     errors:
       messages:
@@ -1928,13 +1939,15 @@ sv:
     new:
       title: Logga in
       tab_title: Logga in
+      login_to_authorize_html: Logga in på OpenStreetMap för att komma åt %{client_app_name}.
       email or username: E-postadress eller Användarnamn
       password: Lösenord
       remember: Kom ihåg mig
       lost password link: Glömt ditt lösenord?
       login_button: Logga in
       register now: Registrera dig nu
-      with external: 'Alternativt kan du använda en tredje part för att logga in:'
+      with external: eller logga in med en tredje part
+      or: eller
       auth failure: Kunde inte logga in med de uppgifterna.
     destroy:
       title: Logga ut
@@ -2110,6 +2123,7 @@ sv:
           %{france}: Innehåller data hämtade från
           Direction Générale des Impôts.
         contributors_fr_france: Frankrike
+        contributors_hr_croatia: Kroatien
         contributors_nl_credit_html: '%{netherlands}: Innehåller &copy; AND data,
           2007 (%{and_link}).'
         contributors_nl_netherlands: Nederländerna
@@ -2581,6 +2595,7 @@ sv:
       muted_users: Tystade användare
     auth_providers:
       openid_logo_alt: Logga in med ett OpenID
+      openid_login_button: Fortsätt
       openid:
         title: Logga in med OpenID
         alt: Logga in med en OpenID-URL
@@ -2646,6 +2661,9 @@ sv:
       write_redactions: Omarbeta kartdata
       read_email: Läs användarens e-postadress
       skip_authorization: Godkänn applikation automatiskt
+    for_roles:
+      moderator: Denna behörighet är till för åtgärder som endast är tillgängliga
+        för moderatorer
   oauth_clients:
     new:
       title: Registrera en ny applikation
@@ -2741,20 +2759,25 @@ sv:
   users:
     new:
       title: Registrera
+      tab_title: Registrera
+      signup_to_authorize_html: Registrera dig på OpenStreetMap för att få åtkomst
+        till %{client_app_name}
       no_auto_account_create: Tyvärr kan vi för närvarande inte kan skapa ett konto
         åt dig automatiskt.
       please_contact_support_html: Kontakta %{support_link} för att ordna att ett
         konto ska skapas - vi kommer att försöka ta itu med begäran så fort som möjligt.
       support: support
       about:
-        header: Fri och redigerbar
+        header: Fri och redigerbar.
         paragraph_1: Till skillnad från andra kartor är OpenStreetMap helt skapad
           av människor som du, och det är gratis för alla att fixa, uppdatera, ladda
           ner och använda.
-        paragraph_2: Registrera dig för att börja bidra. Vi skickar ett e-postmeddelande
-          för att bekräfta ditt konto.
+        paragraph_2: Registrera dig för att börja bidra.
+        welcome: Välkommen till OpenStreetMap
       display name description: Ditt offentligt visade användarnamn. Du kan ändra
         detta senare i alternativ.
+      tou: användarvillkor
+      contributor_terms: bidragsvillkor
       external auth: 'Tredjepartsautentisering:'
       continue: Registrera
       terms accepted: Tack för att du accepterat de nya villkoren för bidrag till
@@ -2763,7 +2786,9 @@ sv:
         för mer information.
       privacy_policy: integritetspolicy
       privacy_policy_title: OSMFs integritetspolicy inklusive avsnitt om e-postadresser
-      use external auth: Alternativt kan du använda en tredje part för att logga in
+      consider_pd: public domain
+      or: eller
+      use external auth: eller registrera med en tredje part
     terms:
       title: Villkor för deltagare
       heading: Villkor för deltagare
@@ -2868,6 +2893,8 @@ sv:
     index:
       title: Användare
       heading: Användare
+      older: Äldre användare
+      newer: Nyare användare
       summary_html: '%{name} skapades från %{ip_address} den %{date}'
       summary_no_ip_html: '%{name} skapad den %{date}'
       confirm: Bekräfta valda användare
@@ -3024,6 +3051,15 @@ sv:
       reason: Orsak till blockering
       status: Status
       revoker_name: Återkallad av
+      older: Äldre blockeringar
+      newer: Nya blockeringar
+    navigation:
+      all_blocks: Alla blockeringar
+      blocks_on_me: Blockeringar på mig
+      blocks_on_user: Blockeringar på %{user}
+      blocks_by_me: Blockeringar av mig
+      blocks_by_user: Blockeringar av %{user}
+      block: 'Blockering #%{id}'
   user_mutes:
     index:
       title: Tystade användare
@@ -3096,6 +3132,10 @@ sv:
       intro: Upptäckt ett misstag eller något som saknas? Låt andra karterare veta
         så att vi kan fixa det. Flytta markören till rätt position och skriv in en
         kommentar som förklarar problemet.
+      anonymous_warning_html: Du är inte inloggad. %{log_in} eller %{sign_up} om du
+        vill få uppdateringar för din anteckning.
+      anonymous_warning_log_in: logga in
+      anonymous_warning_sign_up: registrera dig
       advice: Din anteckning är offentlig och kan användas för att uppdatera kartan,
         så skriv inte personuppgifter eller information från upphovsrättsligt skyddade
         kartor eller kataloger.
@@ -3144,6 +3184,7 @@ sv:
         standard: Standard
         cycle_map: Cykelkarta
         transport_map: Transportkarta
+        tracestracktop_topo: Tracetrack Topo
         hot: Humanitärt
       layers:
         header: Kartskikt
index 2b7c2c0fe71d7e2e032a0e84e3b9390cedc68cd2..3f9f01c463df0ec6209f8047649b2de2e244e528 100644 (file)
@@ -708,6 +708,10 @@ tr:
       contact_the_community_html: Bozuk bir bağlantı/hata bulduysanız OpenStreetMap
         topluluğuna %{contact_link} bağlantısıyla iletmekten çekinmeyin. İsteğinizin
         tam URL'sini not edin.
+    bad_request:
+      title: Geçersiz İstek
+      description: OpenStreetMap sunucusunda talep ettiğiniz işlem geçerli değil (HTTP
+        400)
     forbidden:
       title: Yasaklı
       description: OpenStreetMap sunucusunda talep ettiğiniz işlem sadece yöneticiler
@@ -1782,8 +1786,10 @@ tr:
           Not, %{place} yakınlarında yer almakta.'
         commented_note_html: '%{commenter}, yorumladığınız bir harita notunu yeniden
           etkinleştirdi. Not, %{place} yakınlarında yer almakta.'
-      details: Not hakkındaki ayrıntılı bilgiler %{url} bağlantısında görülebilir.
-      details_html: Notla ilgili daha fazla ayrıntı %{url} adresinde bulunabilir.
+      details: '%{url} bağlantısındaki notu yanıtlayın veya not hakkında daha fazla
+        bilgi edinin.'
+      details_html: '%{url} bağlantısındaki notu yanıtlayın veya not hakkında daha
+        fazla bilgi edinin.'
     changeset_comment_notification:
       description: 'OpenStreetMap Değişiklik Kaydı #%{id}'
       hi: Merhaba %{to_user},
@@ -1804,9 +1810,10 @@ tr:
         partial_changeset_with_comment: '''%{changeset_comment}'' yorumuyla'
         partial_changeset_with_comment_html: '''%{changeset_comment}'' yorumuyla'
         partial_changeset_without_comment: yorumsuz
-      details: Değişiklik kaydıyla ilgili daha fazla bilgi %{url} sayfasından edinebilirsiniz.
-      details_html: Değişiklik kümesiyle ilgili daha fazla ayrıntı %{url} adresinde
-        bulunabilir.
+      details: '%{url} bağlantısına yanıt verin veya değişiklik seti hakkında daha
+        fazla bilgi edinin.'
+      details_html: '%{url} bağlantısına yanıt verin veya değişiklik seti hakkında
+        daha fazla bilgi edinin.'
       unsubscribe: Bu değişiklik kaydındaki güncellemelere ilişkin aboneliğinizi %{url}
         adresinden iptal edebilirsiniz.
       unsubscribe_html: Bu değişiklik kaydındaki güncellemelere ilişkin aboneliğinizi
@@ -2643,6 +2650,9 @@ tr:
         other: '%{user} tarafından %{count} noktalı GPX dosyası'
       description_without_count: '%{user} tarafından GPX dosyası'
   application:
+    basic_auth_disabled: 'HTTP Temel Kimlik Doğrulaması devre dışı: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 ve 1.0a devre dışı bırakıldı: %{link}'
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: Bu eyleme erişme izniniz yok
     require_cookies:
       cookies_needed: Çerezleri devre dışı bırakmış görünüyorsunuz - devam etmeden
index a2b46449b2abdd0863ada85af20e63f90add2070..798a9e2b109b7664f6bf1eb8372888bb28a38846 100644 (file)
@@ -100,7 +100,7 @@ uk:
       diary_comment: Коментарі щоденника
       diary_entry: Запис щоденника
       friend: Друг
-      issue: Звіт
+      issue: Звернення
       language: Мова
       message: Повідомлення
       node: Точка
@@ -572,15 +572,15 @@ uk:
         він стане закритим.
       comment_by_html: Коментар від %{user} %{time_ago}
       hidden_comment_by_html: Прихований коментар від %{user} %{time_ago}
-      changesetxml: XML опис набору змін
+      changesetxml: Набір змін в XML
       osmchangexml: osmChange XML
     paging_nav:
       nodes: Точки (%{count})
-      nodes_paginated: Точки (%{x}-%{y} із %{count})
+      nodes_paginated: Точки (%{x}-%{y} з %{count})
       ways: Лінії (%{count})
-      ways_paginated: Лінії (%{x}-%{y} із %{count})
+      ways_paginated: Лінії (%{x}-%{y} з %{count})
       relations: Зв’язки (%{count})
-      relations_paginated: Зв’язки (%{x}-%{y} із %{count})
+      relations_paginated: Зв’язки (%{x}-%{y} з %{count})
     timeout:
       sorry: На жаль, перелік наборів змін, який ви запросили, потребує забагато часу
         для завантаження.
@@ -742,6 +742,10 @@ uk:
       contact_the_community_html: Будь ласка, %{contact_link} зі спільнотою OpenStreetMap,
         якщо ви знайшли несправне посилання або помилку. Запишіть точну URL-адресу
         вашого запиту.
+    bad_request:
+      title: Хибний запит
+      description: Операція, яку ви запитали на сервері OpenStreetMap, не є дійсною
+        (HTTP 400)
     forbidden:
       title: Заборонено
       description: Дія, яку ви намагались виконати, доступна лише адміністраторам
@@ -1089,7 +1093,7 @@ uk:
           memorial: Меморіал
           milestone: Історичний межовий стовп
           mine: Копальня
-          mine_shaft: Шахтний вал
+          mine_shaft: Шахтний ствол
           monument: Пам’ятник
           railway: Історична залізниця
           roman_road: Римська дорога
@@ -1590,7 +1594,7 @@ uk:
         other: ""
       no_reports: Скарг немає
       report_created_at_html: Вперше повідомлено %{datetime}
-      last_resolved_at_html: Востаннє розв'язано %{datetime}
+      last_resolved_at_html: Востаннє розвʼязано %{datetime}
       last_updated_at_html: В останнє оновлено %{datetime}, %{displayname}
       resolve: Розв'язати
       ignore: Ігнорувати
@@ -1736,7 +1740,7 @@ uk:
       had_added_you: '%{user} додав Вас як друга в OpenStreetMap.'
       see_their_profile: Ви можете побачити їх профіль на %{userurl}.
       see_their_profile_html: Ви можете ознайомитись з його/її профілем - %{userurl}.
-      befriend_them: Ð\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и Ñ\97Ñ\85 Ñ\83 Ñ\8fкоÑ\81Ñ\82Ñ\96 друзів %{befriendurl}.
+      befriend_them: Ð\92и Ñ\82акож Ð¼Ð¾Ð¶ÐµÑ\82е Ð´Ð¾Ð´Ð°Ñ\82и Ñ\97Ñ\85 Ñ\8fк друзів %{befriendurl}.
       befriend_them_html: Ви також можете додати його/її до друзів %{befriendurl}.
     gpx_description:
       description_with_tags_html: 'Схоже це ваш файл GPX %{trace_name}, що має опис
@@ -1818,8 +1822,8 @@ uk:
           біля %{place}.'
         commented_note_html: '%{commenter} поновив нотатку, прокоментовану вами, що
           знаходиться біля %{place}.'
-      details: Ð\94окладнÑ\96Ñ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 %{url}.
-      details_html: Ð\94окладнÑ\96Ñ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 %{url}.
+      details: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 Ð·Ð° %{url}.
+      details_html: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð¾Ñ\82аÑ\82кÑ\83 Ð·Ð° %{url}.
     changeset_comment_notification:
       description: 'Набір змін OpenStreetMap #%{id}'
       hi: Привіт %{to_user},
@@ -1840,8 +1844,8 @@ uk:
         partial_changeset_with_comment: з коментарем '%{changeset_comment}'
         partial_changeset_with_comment_html: з коментарем '%{changeset_comment}'
         partial_changeset_without_comment: без коментарів
-      details: Ð\91Ñ\96лÑ\8cÑ\88е Ð´ÐµÑ\82алей Ð¿Ñ\80о Ð·Ð¼Ñ\96ни, Ñ\8fкÑ\96 Ð¼Ð¾Ð¶Ñ\83Ñ\82Ñ\8c Ð±Ñ\83Ñ\82и Ð·Ð½Ð°Ð¹Ð´ÐµÐ½Ñ\96 Ð² %{url}.
-      details_html: Ð\91Ñ\96лÑ\8cÑ\88е Ð´ÐµÑ\82алей Ð¿Ñ\80о Ð½Ð°Ð±Ñ\96Ñ\80 Ð·Ð¼Ñ\96н Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹Ñ\82и Ð·Ð° Ð¿Ð¾Ñ\81иланнÑ\8fм - %{url}.
+      details: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð°Ð±Ñ\96Ñ\80 Ð·Ð¼Ñ\96н Ð·Ð° %{url}.
+      details_html: Ð\94айÑ\82е Ð²Ñ\96дповÑ\96дÑ\8c Ð°Ð±Ð¾ Ð´Ñ\96знайÑ\82еÑ\81Ñ\8f Ð±Ñ\96лÑ\8cÑ\88е Ð¿Ñ\80о Ð½Ð°Ð±Ñ\96Ñ\80 Ð·Ð¼Ñ\96н Ð·Ð° %{url}.
       unsubscribe: Щоб відмовитись від отримання повідомлень для цього набору змін
         за посиланням %{url}.
       unsubscribe_html: Щоб відмовитись від отримання повідомлень для цього набору
@@ -1988,7 +1992,7 @@ uk:
       preferred_languages: Типові мови
       edit_preferences: Зміна вподобань
     edit:
-      title: Ð\97мÑ\96на Ð½Ð°Ð»Ð°Ñ\88Ñ\82Ñ\83вань
+      title: Ð\97мÑ\96на Ð²Ð¿Ð¾Ð´Ð¾Ð±ань
       save: Зберегти вподобання
       cancel: Скасувати
     update:
@@ -2025,13 +2029,15 @@ uk:
     new:
       title: Ласкаво просимо
       tab_title: Ласкаво просимо
+      login_to_authorize_html: Увійдіть до OpenStreetMap, щоб отримати доступ до %{client_app_name}.
       email or username: Ел. пошта або прізвисько
       password: Пароль
       remember: Запам’ятати мене
       lost password link: Забули пароль?
       login_button: Увійти
       register now: Зареєструйтеся зараз
-      with external: 'Або використовуйте, облікові записи з інших ресурсів:'
+      with external: Або використовуйте, облікові записи з інших ресурсів
+      or: або
       auth failure: Вибачте, вхід з цими ім’ям або паролем неможливий.
     destroy:
       title: Вийти
@@ -2683,6 +2689,9 @@ uk:
         other: ""
       description_without_count: GPX файл від %{user}
   application:
+    basic_auth_disabled: 'HTTP Basic Authentication вимкнено: %{link}'
+    oauth_10a_disabled: 'OAuth 1.0 та 1.0a вимкнено: %{link}'
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: Вибачте, у вас недостатньо прав для виконання цієї дії.
     require_cookies:
       cookies_needed: Схоже, що у вас вимкнені куки. Будь ласка, увімкніть куки у
@@ -2704,10 +2713,11 @@ uk:
       oauth2_authorizations: авторизації OAuth 2
       muted_users: Стишені учасники
     auth_providers:
-      openid_logo_alt: Увійти з допомогою OpenID
+      openid_logo_alt: Увійти з OpenID
+      openid_login_button: Продовжити
       openid:
-        title: Увійти за допомогою OpenID
-        alt: Увійти за допомогою OpenID URL
+        title: Увійти за OpenID
+        alt: Увійти за OpenID URL
       google:
         title: Увійти через Google
         alt: Увійти через Google OpenID
@@ -2770,6 +2780,8 @@ uk:
       write_redactions: Виконувати очищення даних
       read_email: Отримувати адресу е-пошти
       skip_authorization: Автоматичне схвалення заявки
+    for_roles:
+      moderator: Цей дозвіл призначений для дій, доступних лише модераторам
   oauth_clients:
     new:
       title: Зареєструвати новий застосунок
@@ -2865,6 +2877,9 @@ uk:
   users:
     new:
       title: Реєстрація
+      tab_title: Реєстрація
+      signup_to_authorize_html: Увійдіть до свого облікового запису OpenStreetMap,
+        щоб отримати доступ до %{client_app_name}.
       no_auto_account_create: На жаль, наразі ми не в змозі створити для вас обліковий
         запис автоматично.
       please_contact_support_html: Будь ласка, зв’яжіться з %{support_link}, щоб домовитися
@@ -2872,14 +2887,22 @@ uk:
         швидше.
       support: підтримкою
       about:
-        header: Вільні й доступні для редагування
+        header: Вільні й доступні для редагування.
         paragraph_1: На відміну від інших мап, OpenStreetMap повністю створено людьми,
           такими ж як ви, і кожен може вільно виправляти, оновлювати, завантажувати
           та використовувати дані OpenStreetMap.
-        paragraph_2: Зареєструйтеся, щоб почати мапити. Ми надішлемо електронного
-          листа для підтвердження вашого облікового запису.
+        paragraph_2: Зареєструйтеся, щоб почати мапити.
+        welcome: Ласкаво просимо до OpenStreetMap
+      duplicate_social_email: Якщо у вас вже є обліковий запис OpenStreetMap і ви
+        хочете використовувати стороннього постачальника ідентифікаційних даних, будь
+        ласка, увійдіть, використовуючи свій пароль, і змініть налаштування свого
+        облікового запису.
       display name description: Ваше ім’я учасника, доступне всім. Ви можете змінити
         його потім у ваших налаштуваннях.
+      by_signing_up_html: Реєструючись, ви приймаєте наші %{tou_link}, %{privacy_policy_link}
+        і %{contributor_terms_link}.
+      tou: умови використання
+      contributor_terms: умови співпраці
       external auth: 'Автентифікація через:'
       continue: Зареєструватись
       terms accepted: Дякуємо за прийняття нових умов співпраці!
@@ -2888,7 +2911,10 @@ uk:
       privacy_policy: Політикою конфіденційності
       privacy_policy_title: Політика конфіденційності OSMF, включаючи розділ про адреси
         електронної пошти
-      use external auth: Або використовуйте, облікові записи з інших ресурсів для
+      consider_pd_html: Я вважаю, що мій внесок належать до %{consider_pd_link}.
+      consider_pd: суспільного надбання
+      or: або
+      use external auth: або використовуйте, облікові записи з інших ресурсів для
         входу
     terms:
       title: Умови
@@ -3250,6 +3276,10 @@ uk:
       intro: Помітили помилку або чогось не вистачає? Дайте знати іншим маперам, щоб
         можна було це виправити. Перемістіть позначку в потрібне місце та додайте
         пояснення проблеми.
+      anonymous_warning_html: Ви не ввійшли в систему. Будь ласка, %{log_in} або %{sign_up},
+        якщо ви хочете отримувати оновлення щодо своєї нотатки.
+      anonymous_warning_log_in: увійдіть
+      anonymous_warning_sign_up: зареєструйтесь
       advice: Ваша нотатка є публічною та може бути використана для оновлення мапи.
         Будь ласка, не додавайте персональні дані або інформацію, яка міститься на
         захищених авторським правом мапах чи каталогах.
@@ -3343,7 +3373,7 @@ uk:
     edit_help: Перемістіть мапу і наблизьтесь до місця, яке ви бажаєте змінити, потім
       клацніть тут.
     directions:
-      ascend: Ð\92гоÑ\80Ñ\83
+      ascend: Ð\9fÑ\96дйом
       engines:
         fossgis_osrm_bike: Велосипед (OSRM)
         fossgis_osrm_car: Машина (OSRM)
@@ -3354,7 +3384,7 @@ uk:
         fossgis_valhalla_bicycle: Велосипед (Valhalla)
         fossgis_valhalla_car: Машина (Valhalla)
         fossgis_valhalla_foot: Пішки (Valhalla)
-      descend: Ð\92низ
+      descend: Ð¡Ð¿Ñ\83Ñ\81к
       directions: Маршрут
       distance: Відстань
       distance_m: '%{distance} м'
index bb10289150f6ea34547245b4afa2119bbd725fbc..1ecfa3182e58fac6ca4dee0f92b507938f1c930f 100644 (file)
@@ -702,6 +702,9 @@ zh-CN:
       contact: 联系
       contact_the_community_html: 如果您发现有损坏的链接/错误,请随时%{contact_link} OpenStreetMap
         社区。并记下您请求的确切 URL。
+    bad_request:
+      title: 错误请求
+      description: 您在 OpenStreetMap 服务器上请求的操作无效 (HTTP 400)
     forbidden:
       title: 禁止
       description: 您在 OpenStreetMap 服务器上请求的操作仅限管理员使用(HTTP 403)
@@ -1726,8 +1729,8 @@ zh-CN:
         your_note_html: '%{commenter} 重新激活了您在 %{place} 附近的一个注记。'
         commented_note: '%{commenter} 重新激活了您感兴趣的一个地图注记。该注记位于 %{place} 附近。'
         commented_note_html: '%{commenter} 重新激活了您感兴趣的一个地图注记。该注记位于 %{place} 附近。'
-      details: 更多关于笔记的详细信息可以在%{url}找到
-      details_html: 更多关于笔记的详细信息可以在%{url}找到
+      details: 在 %{url} 回复或了解更多有关注记的信息
+      details_html: 在 %{url} 回复或了解更多有关注记的信息
     changeset_comment_notification:
       description: 'OpenStreetMap 变更集 #%{id}'
       hi: 您好,%{to_user}:
@@ -1742,8 +1745,8 @@ zh-CN:
         partial_changeset_with_comment: 带评论“%{changeset_comment}”
         partial_changeset_with_comment_html: 带有评论“%{changeset_comment}”
         partial_changeset_without_comment: 没有评论
-      details: 更多关于变更集的详细信息可以在 %{url} 找到
-      details_html: 更多有关变更集的详细信息,请参见 %{url}
+      details: 在 %{url} 回复或了解更多有关变更集的信息
+      details_html: 在 %{url} 回复或了解更多有关变更集的信息
       unsubscribe: 您可访问%{url}以从该变更集中退订。
       unsubscribe_html: 您可访问%{url}以从该变更集中退订。
   confirmations:
@@ -2438,6 +2441,9 @@ zh-CN:
         other: 来自 %{user} 的带 %{count} 点的GPX文件
       description_without_count: 来自 %{user} 的 GPX 文件
   application:
+    basic_auth_disabled: HTTP 基本身份验证已禁用:%{link}
+    oauth_10a_disabled: OAuth 1.0 和 1.0a 已禁用:%{link}
+    auth_disabled_link: https://wiki.openstreetmap.org/wiki/2024_authentication_update
     permission_denied: 您没有权限来执行此操作
     require_cookies:
       cookies_needed: 您似乎停用了 cookie - 请在继续操作前启用您的浏览器 cookie。
@@ -2947,6 +2953,9 @@ zh-CN:
     new:
       title: 新注记
       intro: 发现错误或遗漏了什么?请告诉其他绘图者以便于我们更正错误。将标记移动到正确的位置并输入备注说明问题。
+      anonymous_warning_html: 您尚未登录。如果您想接收笔记的更新信息,请%{log_in}或%{sign_up}。
+      anonymous_warning_log_in: 登录
+      anonymous_warning_sign_up: 注册
       advice: 您的注释会公开,并可能用于更新地图,所以不要输入个人信息,或是来自版权保护地图的信息或目录列表。
       add: 添加注记
   javascripts:
index eb8fabd0baefc404818ff80ad004d9ab696d7c95..f8fd338d9b4e57bdf674b35e531d23854c4759ab 100644 (file)
@@ -43,6 +43,7 @@
 # Author: Winston Sung
 # Author: Wrightbus
 # Author: Xiplus
+# Author: Yuchenglinedu
 # Author: 予弦
 # Author: 列维劳德
 # Author: 捍粵者
@@ -86,7 +87,7 @@ zh-TW:
     errors:
       messages:
         invalid_email_address: 似乎不是有效的電子郵件信箱地址。
-        email_address_not_routable: ä¸\8då\8f¯ç¹\9e
+        email_address_not_routable: ä¸\8då\8f¯ç\99¼
         display_name_is_user_n: 不能是「user_n」除非「n」是您的使用者 ID
       models:
         user_mute:
@@ -122,21 +123,21 @@ zh-TW:
       tracetag: 軌跡標籤
       user: 使用者
       user_preference: 使用者偏好設定
-      user_token: 使用者令牌
+      user_token: 使用者Token
       way: 路徑
       way_node: 路徑節點
       way_tag: 路徑標籤
     attributes:
       client_application:
-        name: 名稱(必
-        url: 主程式 URL(必需
-        callback_url: 回 (Callback) URL
+        name: 名稱(必
+        url: 主要應用程式 URL(必填
+        callback_url: 回 (Callback) URL
         support_url: 支援 URL
-        allow_read_prefs: è®\80å\8f\96ä»\96å\80\91ç\9a\84使ç\94¨è\80\85å\81\8f好設å®\9a
-        allow_write_prefs: ä¿®æ\94¹ä»\96å\80\91ç\9a\84使ç\94¨è\80\85å\81\8f好設å®\9a
+        allow_read_prefs: 讀取使用者偏好設定
+        allow_write_prefs: 修改使用者偏好設定
         allow_write_diary: 建立日記、評論和加入好友
         allow_write_api: 修改地圖
-        allow_read_gpx: 讀取他們的私人GPS軌跡
+        allow_read_gpx: 讀取人GPS軌跡
         allow_write_gpx: 上傳 GPS 軌跡
         allow_write_notes: 修改註記
       diary_comment:
@@ -164,7 +165,7 @@ zh-TW:
         latitude: 緯度
         longitude: 經度
         public: 公開
-        description: 說明
+        description: 描述
         gpx_file: 上傳 GPX 檔案
         visibility: 能見度
         tagstring: 標籤
@@ -175,18 +176,18 @@ zh-TW:
         recipient: 收件者
       redaction:
         title: 標題
-        description: 說明
+        description: 描述
       report:
-        category: 選擇回報的原因
-        details: è«\8bæ\8f\90ä¾\9bæ\9c\89é\97\9cå\95\8fé¡\8cç\9a\84æ\9b´å¤\9aäº\9b詳æ\83\85ï¼\88å¿\85é\9c\80
+        category: 選擇回報的原因
+        details: è«\8bæ\8f\90ä¾\9bæ\9b´å¤\9aæ\9c\89é\97\9cå\95\8fé¡\8cç\9a\84詳æ\83\85ï¼\88å¿\85å¡«
       user:
-        auth_provider: 認證提供
+        auth_provider: 認證提供
         auth_uid: 認證 UID
         email: 電子郵件
         new_email: 新的電子郵件地址
-        active: 開啟中
+        active: 活躍
         display_name: 顯示名稱
-        description: å\9fºæ\9c¬è³\87æ\96\99說æ\98\8e
+        description: å\80\8b人æª\94æ¡\88æ\8f\8fè¿°
         home_lat: 緯度
         home_lon: 經度
         languages: 偏好的語言
@@ -196,14 +197,14 @@ zh-TW:
     help:
       doorkeeper/application:
         confidential: 應用程式會在客戶端密鑰可以維持機密時使用(本地端移動應用程式和單一頁面應用程式不保密)
-        redirect_uri: 一行一URI
+        redirect_uri: 每條 URI 使用一行
       trace:
-        tagstring: 逗點分隔
+        tagstring: 逗點分隔
       user_block:
-        reason: 封鎖使用者的理由。請盡量以平靜、合理態度詳細描述情況,並記住訊息公開可見。請注意,並非所有使用者都了解社群術語,所以請盡量使用通俗說法。
+        reason: 封鎖使用者的理由。請盡量以平靜、合理態度詳細描述情況,並記住訊息公開可見。請注意,並非所有使用者都了解社群術語,所以請盡量使用通俗說法。
         needs_view: 解封前是否需要使用者登入?
       user:
-        new_email: (永不公開顯示)
+        new_email: (永遠不公開顯示)
   datetime:
     distance_in_words_ago:
       about_x_hours:
@@ -215,34 +216,22 @@ zh-TW:
       about_x_years:
         one: 約 %{count} 年前
         other: 約 %{count} 年前
-      almost_x_years:
-        one: 將近 %{count} 年前
-        other: 將近 %{count} 年前
+      almost_x_years: 將近 %{count} 年前
       half_a_minute: 半分鐘前
-      less_than_x_seconds:
-        one: 小於 %{count} 秒前
-        other: 小於 %{count} 秒前
-      less_than_x_minutes:
-        one: 小於 %{count} 分前
-        other: 小於 %{count} 分前
+      less_than_x_seconds: 不到 %{count} 秒前
+      less_than_x_minutes: 不到 %{count} 分鐘前
       over_x_years:
-        one: 超過 %{count} 年前
-        other: 超過 %{count} 年前
+        one: 超過1年前
+        other: 超過%{count}年前
       x_seconds:
-        one: '%{count} 秒前'
-        other: '%{count} 秒前'
-      x_minutes:
-        one: '%{count} 分鐘前'
-        other: '%{count} 分鐘前'
-      x_days:
-        one: '%{count} 天前'
-        other: '%{count} 天前'
+        one: 1秒前
+        other: '%{count}秒前'
+      x_minutes: '%{count} 分鐘前'
+      x_days: '%{count} 天前'
       x_months:
         one: '%{count} 個月前'
         other: '%{count} 個月前'
-      x_years:
-        one: '%{count} 年前'
-        other: '%{count} 年前'
+      x_years: '%{count} 年前'
   printable_name:
     current_and_old_links_html: '%{current_link},%{old_link}'
   editor:
@@ -274,13 +263,13 @@ zh-TW:
         reopened_at_by_html: 於%{when}由%{user}重新開啟
       rss:
         title: OpenStreetMap 註記
-        description_all: å·²å ±å\91\8aã\80\81è©\95è«\96ã\80\81æ\88\96æ\98¯é\97\9cé\96\89註è¨\98ç\9a\84清單
+        description_all: å ±å\91\8aã\80\81è©\95è«\96ã\80\81æ\88\96é\97\9cé\96\89ç\9a\84註è¨\98清單
         description_area: 在你的區域[(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]所報告、評論或關閉的註記的清單
         description_item: 註記 %{id} 的 RSS feed
         opened: 新的註記 (在 %{place} 附近)
         commented: 新的評論 (在 %{place} 附近)
         closed: 關閉的註記 (在 %{place} 附近)
-        reopened: 重新開啟的註記 (在 %{place} 附近)
+        reopened: 重新開啟的註記(在%{place}附近)
       entry:
         comment: 評論
         full: 註記原文
@@ -288,20 +277,20 @@ zh-TW:
     deletions:
       show:
         title: 刪除我的帳號
-        warning: 警告!帳號刪除處理是完全徹底、無法還原的
+        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: 確定嗎?
+        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:
@@ -315,28 +304,28 @@ zh-TW:
         heading: 公開編輯
         enabled: 已開啟。非匿名且可以編輯資料。
         enabled link text: 這是什麼?
-        disabled: 已停用且不能編輯資料,所有先前的編輯都會成為匿名的。
+        disabled: 已停用且不能編輯資料,所有先前的編輯都會成為匿名的。
         disabled link text: 為什麼我不能編輯?
       contributor terms:
         heading: 貢獻者條款
-        agreed: 已同意新的貢獻者條款。
-        not yet agreed: 未同意新的貢獻者條款。
+        agreed: 已同意新的貢獻者條款。
+        not yet agreed: 未同意新的貢獻者條款。
         review link text: 請跟隨此連結,方便你檢視並接受新的貢獻者條款。
-        agreed_with_pd: 您亦同意將您的編輯放到公共領域
+        agreed_with_pd: 你亦同意將你的編輯放到公共領域
         link text: 這是什麼?
       save changes button: 儲存變更
       delete_account: 刪除帳號…
     go_public:
       heading: 公開編輯
-      currently_not_public: 目前你的編輯都是暱名的,其他人無法寄給你訊息或是知道你的位置。要讓別人知道你編輯什麼,以及透過網站聯繫你,你點下面的按鈕。
+      currently_not_public: 目前你的編輯都是暱名的,其他人無法寄給你訊息或是知道你的位置。要讓別人知道你編輯什麼,以及透過網站聯繫你,請你點以下的按鈕。
       only_public_can_edit: 自從 API 0.6 版本上線,只有公共帳號的使用者可以編輯地圖資料。
       find_out_why_html: (%{link})。
-      find_out_why: 找出來為什麼
-      email_not_revealed: 你的電子郵件地址不會揭露公開
+      find_out_why: 找出原因
+      email_not_revealed: 你的電子郵件地址不會公開洩漏
       not_reversible: 這項操作無法撤銷,所有的新使用者都是預設公開的。
-      make_edits_public_button: 將所有的編輯設為公開
+      make_edits_public_button: 將與我有關的所有的編輯設為公開
     update:
-      success_confirm_needed: 使用者資訊成功的更新。請檢查您的電子郵件,以確認收到新電子郵件地址的通知。
+      success_confirm_needed: 使用者資訊成功的更新。請檢查你的電子郵件,以便確認收到新電子郵件地址的通知。
       success: 使用者資訊已成功更新。
     destroy:
       success: 帳號已刪除。
@@ -346,21 +335,21 @@ zh-TW:
     version: 版本
     redacted_version: 編修版本
     in_changeset: 變更集
-    anonymous: 匿名
+    anonymous: 匿名使用者
     no_comment: (沒有評論)
     part_of: 屬於:
     part_of_relations:
-      one: '%{count} 個關聯'
+      one: 1 個關聯
       other: '%{count} 個關聯'
     part_of_ways:
       one: '%{count} 條路徑'
       other: '%{count} 條路徑'
     download_xml: 下載 XML
     view_history: 檢視歷史
-    view_unredacted_history: 查看未編修的歷史
+    view_unredacted_history: 查看未編輯的歷史記錄
     view_details: 檢視詳細資料
     view_redacted_data: 查看編修資料
-    view_redaction_message: 查看編修訊息
+    view_redaction_message: 查看密文訊息
     location: 位置:
     node:
       title_html: 節點:%{name}
@@ -1700,7 +1689,7 @@ zh-TW:
         commented_note: '%{commenter} 重新開啟了一個您曾評論的地圖註記。該註記位於 %{place} 附近。'
         commented_note_html: '%{commenter} 重新開啟了一個您曾評論的地圖註記。該註記位於 %{place} 附近。'
       details: 關於註記的更多詳細資料可在 %{url} 找到。
-      details_html: 關於註記的更多詳細資料可在 %{url} 找到
+      details_html: 在%{url}回覆或是瞭解更多有關註記的訊息
     changeset_comment_notification:
       description: 'OpenStreetMap 變更集 #%{id}'
       hi: 嗨 %{to_user},
@@ -1715,8 +1704,8 @@ zh-TW:
         partial_changeset_with_comment: 評論 "%{changeset_comment}"
         partial_changeset_with_comment_html: 評論 "%{changeset_comment}"
         partial_changeset_without_comment: 沒有評論
-      details: 關於變更集的詳情可在 %{url} 找到
-      details_html: 關於變更集的詳情可在 %{url} 找到
+      details: 在 %{url} 回覆或瞭解更多有關於變更集的資訊
+      details_html: 在 %{url} 回覆或瞭解更多有關變更集的資訊
       unsubscribe: 您可以在 %{url} 取消訂閱此變更集的更新內容。
       unsubscribe_html: 您可以在 %{url} 取消訂閱此變更集的更新內容。
   confirmations:
@@ -2171,7 +2160,7 @@ zh-TW:
       search: 搜尋
       get_directions: 取得方向指引
       get_directions_title: 尋找兩點之間的路線
-      from: 來自
+      from: 
       to: 到
       where_am_i: 這是哪裡?
       where_am_i_title: 使用搜尋引擎描述目前的位置
index 65eab6907a00ff6008299f28d7d2beb8b674d78c..a0fcef8b9f2cf86a238844b0b5170f8dd0552fde 100644 (file)
@@ -8,7 +8,7 @@ module OSM
   # The base class for API Errors.
   class APIError < RuntimeError
     def initialize(message = "Generic API Error")
-      super(message)
+      super
     end
 
     def status
index 46ebb6a3741ea0d8f8ce934311a2f279b5460b25..7d2feed292dc585be422d6b67e165581fb1d08d5 100644 (file)
@@ -71,5 +71,75 @@ module Api
       assert_equal "online", js["api"]["status"]["gpx"]
       assert_equal Settings.imagery_blacklist.length, js["policy"]["imagery"]["blacklist"].length
     end
+
+    def test_capabilities_api_readonly
+      with_settings(:status => "api_readonly") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='online']", :count => 1
+            assert_select "status[api='readonly']", :count => 1
+            assert_select "status[gpx='online']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_api_offline
+      with_settings(:status => "api_offline") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='online']", :count => 1
+            assert_select "status[api='offline']", :count => 1
+            assert_select "status[gpx='online']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_database_readonly
+      with_settings(:status => "database_readonly") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='readonly']", :count => 1
+            assert_select "status[api='readonly']", :count => 1
+            assert_select "status[gpx='readonly']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_database_offline
+      with_settings(:status => "database_offline") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='offline']", :count => 1
+            assert_select "status[api='offline']", :count => 1
+            assert_select "status[gpx='offline']", :count => 1
+          end
+        end
+      end
+    end
+
+    def test_capabilities_gpx_offline
+      with_settings(:status => "gpx_offline") do
+        get api_capabilities_path
+        assert_response :success
+        assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "status[database='online']", :count => 1
+            assert_select "status[api='online']", :count => 1
+            assert_select "status[gpx='offline']", :count => 1
+          end
+        end
+      end
+    end
   end
 end
index 1c70831c93c9b65293cb107ac1f04b059f4fd90c..d2b353a8edfe5142f8697b099c0346eb39050590 100644 (file)
@@ -46,5 +46,17 @@ module Api
       assert_response :success
       assert_select "osm[version]", :count => 0
     end
+
+    def test_versions_available_while_offline
+      with_settings(:status => "api_offline") do
+        get api_versions_path
+        assert_response :success
+        assert_select "osm[generator='#{Settings.generator}']", :count => 1 do
+          assert_select "api", :count => 1 do
+            assert_select "version", Settings.api_version
+          end
+        end
+      end
+    end
   end
 end
index c2883c2c09e4dffd85e51120e8852c793ec039ed..3cd53e16996a87bbe17d070d8de7c7908f2ddf22 100644 (file)
@@ -111,7 +111,7 @@ class UserHelperTest < ActionView::TestCase
 
   def test_openid_logo
     logo = openid_logo
-    assert_match %r{^<img .* src="/images/openid_small.png" />$}, logo
+    assert_match %r{^<img .* src="/images/openid.svg" .* />$}, logo
   end
 
   def test_auth_button
index 4611860d02552705267c588419d8e275353d1faa..1b0933d32b0f9c760f704ba707e49362cdc7f5ff 100644 (file)
@@ -45,47 +45,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
     assert_select "form > div > input.is-invalid#user_email"
   end
 
-  def test_user_create_association_bad_auth_provider
-    assert_difference("User.count", 0) do
-      assert_no_difference("ActionMailer::Base.deliveries.size") do
-        perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => "test@example.com",
-                                       :display_name => "new_tester",
-                                       :pass_crypt => "testtest",
-                                       :pass_crypt_confirmation => "testtest",
-                                       :auth_provider => "noprovider",
-                                       :auth_uid => "123454321",
-                                       :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "noprovider", :origin => "/user/new")
-          post response.location
-        end
-      end
-    end
-    assert_response :not_found
-  end
-
-  def test_user_create_association_no_auth_uid
-    OmniAuth.config.mock_auth[:google] = :invalid_credentials
-    assert_difference("User.count", 0) do
-      assert_no_difference("ActionMailer::Base.deliveries.size") do
-        perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => "test@example.com",
-                                       :display_name => "new_tester",
-                                       :pass_crypt => "testtest",
-                                       :pass_crypt_confirmation => "testtest",
-                                       :auth_provider => "google",
-                                       :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-        end
-      end
-    end
-    follow_redirect!
-    assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/user/new")
-  end
-
   def test_user_create_association_submit_duplicate_email
     dup_email = create(:user).email
     display_name = "new_tester"
@@ -275,6 +234,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_openid_success
     new_email = "newtester-openid@osm.org"
     display_name = "new_tester-openid"
+    openid_url = "http://localhost:1000/new.tester"
     auth_uid = "http://localhost:1123/new.tester"
 
     OmniAuth.config.add_mock(:openid,
@@ -284,8 +244,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest
     assert_difference("User.count") do
       assert_difference("ActionMailer::Base.deliveries.size", 1) do
         perform_enqueued_jobs do
-          post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+          post auth_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
+          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
           follow_redirect!
           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => new_email,
                                :auth_provider => "openid", :auth_uid => auth_uid
@@ -294,11 +254,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                :params => { :user => { :email => new_email,
                                        :display_name => display_name,
                                        :auth_provider => "openid",
-                                       :auth_uid => "http://localhost:1123/new.tester",
+                                       :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          post response.location
-          follow_redirect!
         end
       end
     end
@@ -335,22 +292,10 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_openid_failure
     OmniAuth.config.mock_auth[:openid] = :connection_failed
 
-    new_email = "newtester-openid2@osm.org"
-    display_name = "new_tester-openid2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "openid",
-                                       :auth_uid => "http://localhost:1123/new.tester",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+          post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -363,6 +308,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   end
 
   def test_user_create_openid_redirect
+    openid_url = "http://localhost:1000/new.tester"
     auth_uid = "http://localhost:1123/new.tester"
     new_email = "redirect_tester_openid@osm.org"
     display_name = "redirect_tester_openid"
@@ -374,8 +320,8 @@ class UserCreationTest < ActionDispatch::IntegrationTest
     assert_difference("User.count") do
       assert_difference("ActionMailer::Base.deliveries.size", 1) do
         perform_enqueued_jobs do
-          post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
+          post auth_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
+          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => openid_url, :origin => "/user/new")
           follow_redirect!
           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => new_email,
                                :auth_provider => "openid", :auth_uid => auth_uid
@@ -386,11 +332,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "openid",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           follow_redirect!
         end
       end
@@ -454,10 +395,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" },
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "google")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -499,22 +436,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_google_failure
     OmniAuth.config.mock_auth[:google] = :connection_failed
 
-    new_email = "newtester-google2@osm.org"
-    display_name = "new_tester-google2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "google",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "google")
+          post auth_path(:provider => "google", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -555,11 +481,7 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "google",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "google")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
+          assert_response :redirect
           follow_redirect!
         end
       end
@@ -622,10 +544,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" },
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "facebook")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -666,22 +584,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_facebook_failure
     OmniAuth.config.mock_auth[:facebook] = :connection_failed
 
-    new_email = "newtester-facebook2@osm.org"
-    display_name = "new_tester-facebook2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "facebook",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "facebook")
+          post auth_path(:provider => "facebook", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -723,11 +630,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "facebook",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "facebook")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
@@ -790,10 +692,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" },
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "microsoft", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "microsoft")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -834,22 +732,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_microsoft_failure
     OmniAuth.config.mock_auth[:microsoft] = :connection_failed
 
-    new_email = "newtester-microsoft2@osm.org"
-    display_name = "new_tester-microsoft2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "microsoft",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "microsoft", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "microsoft")
+          post auth_path(:provider => "microsoft", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -890,11 +777,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "microsoft",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "microsoft", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "microsoft")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
@@ -962,10 +844,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                             :read_ct => 1,
                             :read_tou => 1,
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "github")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -1007,22 +885,10 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_github_failure
     OmniAuth.config.mock_auth[:github] = :connection_failed
 
-    new_email = "newtester-github2@osm.org"
-    display_name = "new_tester-github2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "github",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "github")
+          post auth_path(:provider => "github", :origin => "/user/new")
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -1062,11 +928,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "github",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "github")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
@@ -1133,10 +994,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                             :read_ct => 1,
                             :read_tou => 1,
                             :email_hmac => email_hmac }
-          assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
-          follow_redirect!
           assert_redirected_to welcome_path
           follow_redirect!
         end
@@ -1175,22 +1032,11 @@ class UserCreationTest < ActionDispatch::IntegrationTest
   def test_user_create_wikipedia_failure
     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
 
-    new_email = "newtester-wikipedia2@osm.org"
-    display_name = "new_tester-wikipedia2"
     assert_difference("User.count", 0) do
       assert_difference("ActionMailer::Base.deliveries.size", 0) do
         perform_enqueued_jobs do
-          post "/user/new",
-               :params => { :user => { :email => new_email,
-                                       :email_confirmation => new_email,
-                                       :display_name => display_name,
-                                       :auth_provider => "wikipedia",
-                                       :auth_uid => "123454321",
-                                       :pass_crypt => "",
-                                       :pass_crypt_confirmation => "" } }
-          assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
+          post auth_path(:provider => "wikipedia", :origin => "/user/new")
+          assert_response :redirect
           follow_redirect!
           assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
           follow_redirect!
@@ -1232,11 +1078,6 @@ class UserCreationTest < ActionDispatch::IntegrationTest
                                        :auth_provider => "wikipedia",
                                        :auth_uid => auth_uid,
                                        :consider_pd => "1" } }
-          assert_redirected_to auth_path(:provider => "wikipedia", :origin => "/user/new")
-          post response.location
-          assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
-          follow_redirect!
-          assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
           assert_response :redirect
           follow_redirect!
         end
index 0c3bd5c63097296c8e592e6c7262a55f3b98d8a6..dec04559d1beb6d10efceed8149bc69bceab5009 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
   resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8"
   integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==
 
-"@eslint/eslintrc@^3.0.2":
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.0.2.tgz#36180f8e85bf34d2fe3ccc2261e8e204a411ab4e"
-  integrity sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==
+"@eslint/eslintrc@^3.1.0":
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6"
+  integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@9.2.0":
-  version "9.2.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.2.0.tgz#b0a9123e8e91a3d9a2eed3a04a6ed44fdab639aa"
-  integrity sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==
+"@eslint/js@9.3.0":
+  version "9.3.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.3.0.tgz#2e8f65c9c55227abc4845b1513c69c32c679d8fe"
+  integrity sha512-niBqk8iwv96+yuTwjM6bWg8ovzAPF9qkICsGtcoa5/dmqcEMfdwNAX7+/OHcJHc7wj7XqPxH98oAHytFYlw6Sw==
 
 "@humanwhocodes/config-array@^0.13.0":
   version "0.13.0"
   resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
   integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
 
-"@humanwhocodes/retry@^0.2.3":
-  version "0.2.3"
-  resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.2.3.tgz#c9aa036d1afa643f1250e83150f39efb3a15a631"
-  integrity sha512-X38nUbachlb01YMlvPFojKoiXq+LzZvuSce70KPMPdeM1Rj03k4dR7lDslhbqXn3Ang4EU3+EAmwEAsbrjHW3g==
+"@humanwhocodes/retry@^0.3.0":
+  version "0.3.0"
+  resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.0.tgz#6d86b8cb322660f03d3f0aa94b99bdd8e172d570"
+  integrity sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==
 
 "@nodelib/fs.scandir@2.1.5":
   version "2.1.5"
@@ -246,17 +246,17 @@ eslint-visitor-keys@^4.0.0:
   integrity sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==
 
 eslint@^9.0.0:
-  version "9.2.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.2.0.tgz#0700ebc99528753315d78090876911d3cdbf19fe"
-  integrity sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==
+  version "9.3.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.3.0.tgz#36a96db84592618d6ed9074d677e92f4e58c08b9"
+  integrity sha512-5Iv4CsZW030lpUqHBapdPo3MJetAPtejVW8B84GIcIIv8+ohFaddXsrn1Gn8uD9ijDb+kcYKFUVmC8qG8B2ORQ==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.6.1"
-    "@eslint/eslintrc" "^3.0.2"
-    "@eslint/js" "9.2.0"
+    "@eslint/eslintrc" "^3.1.0"
+    "@eslint/js" "9.3.0"
     "@humanwhocodes/config-array" "^0.13.0"
     "@humanwhocodes/module-importer" "^1.0.1"
-    "@humanwhocodes/retry" "^0.2.3"
+    "@humanwhocodes/retry" "^0.3.0"
     "@nodelib/fs.walk" "^1.2.8"
     ajv "^6.12.4"
     chalk "^4.0.0"
@@ -512,9 +512,9 @@ keyv@^4.5.4:
     json-buffer "3.0.1"
 
 leaflet.locatecontrol@^0.81.0:
-  version "0.81.0"
-  resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.81.0.tgz#75e92d07c19edade910a2b5a177ac24cef7d10e7"
-  integrity sha512-5Dqj6VXVFl1vPquYZW95hQYegvzqSI4eLIpZrBMuHuyoAo5i9y6js3z02TF//XXZByIyTI/XBtlxlZLUM08Pcg==
+  version "0.81.1"
+  resolved "https://registry.yarnpkg.com/leaflet.locatecontrol/-/leaflet.locatecontrol-0.81.1.tgz#8aec3124ef5cdda3476fd9013315789b4e301a45"
+  integrity sha512-ZtsdScGufPw330X3UIaGGjnfQ1NrhLySnlruWufIMnfzsHgQPz0+mSxsCQMVh7QgOBoefCGb/lioSejiaNx1EQ==
 
 leaflet@^1.8.0:
   version "1.9.4"
@@ -576,9 +576,9 @@ optionator@^0.9.3:
     type-check "^0.4.0"
 
 osm-community-index@^5.2.0:
-  version "5.6.3"
-  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.6.3.tgz#8c7621683a2a4c1037ddb14d060b8442a3aa15cb"
-  integrity sha512-UnJBRbaMPIM3J08CA1crKeAok6c1HYiK6tB8AdnjvrvGNnl2JXPxdztA4Jcb3pbrjq/0q14v1mBr300TmtMwbQ==
+  version "5.7.1"
+  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.7.1.tgz#2341666c83d14c00ef3d9a90298c96d5e791b56c"
+  integrity sha512-E+Xib5m//WliNq2iqeUXyKqZk7yhZu/vSJbwwyxDAPzcNWxgIMoO0B7cUMeFNckhMQsKM2UuC2BAjWuVfbYf1Q==
   dependencies:
     diacritics "^1.3.0"