]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/5391'
authorTom Hughes <tom@compton.nu>
Wed, 18 Dec 2024 14:11:51 +0000 (14:11 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 18 Dec 2024 14:11:51 +0000 (14:11 +0000)
144 files changed:
Gemfile.lock
app/abilities/api_ability.rb
app/assets/images/social_icons/email.svg [new file with mode: 0644]
app/assets/images/social_icons/facebook.svg [new file with mode: 0644]
app/assets/images/social_icons/linkedin.svg [new file with mode: 0644]
app/assets/images/social_icons/mastodon.svg [new file with mode: 0644]
app/assets/images/social_icons/telegram.svg [new file with mode: 0644]
app/assets/images/social_icons/x.svg [new file with mode: 0644]
app/assets/javascripts/id.js
app/assets/javascripts/index.js
app/assets/javascripts/leaflet.map.js
app/assets/javascripts/social_share_button.js [new file with mode: 0644]
app/assets/stylesheets/browse.scss [deleted file]
app/assets/stylesheets/common.scss
app/assets/stylesheets/parameters.scss
app/assets/stylesheets/screen-auto-ltr.scss [new file with mode: 0644]
app/assets/stylesheets/screen-auto-rtl.rtlcss.scss [new file with mode: 0644]
app/assets/stylesheets/screen-ltr.scss [deleted file]
app/assets/stylesheets/screen-manual-ltr.scss [new file with mode: 0644]
app/assets/stylesheets/screen-manual-rtl.rtlcss.scss [new file with mode: 0644]
app/assets/stylesheets/screen-rtl.rtlcss.scss [deleted file]
app/controllers/api/traces/data_controller.rb [new file with mode: 0644]
app/controllers/api/traces_controller.rb
app/controllers/application_controller.rb
app/controllers/notes_controller.rb
app/controllers/oauth2_authorizations_controller.rb
app/controllers/preferences_controller.rb
app/helpers/application_helper.rb
app/helpers/browse_helper.rb
app/helpers/user_blocks_helper.rb
app/views/browse/_containing_relation.html.erb
app/views/browse/_node.html.erb
app/views/browse/_relation.html.erb
app/views/browse/_relation_member.html.erb
app/views/browse/_way.html.erb
app/views/changesets/_elements.html.erb
app/views/diary_entries/_diary_entry.html.erb
app/views/diary_entries/show.html.erb
app/views/layouts/_head.html.erb
app/views/layouts/site.html.erb
app/views/notes/new_readonly.html.erb [new file with mode: 0644]
app/views/preferences/edit.html.erb
app/views/preferences/show.html.erb
app/views/user_blocks/_block.html.erb
app/views/user_blocks/_page.html.erb
config/browse_icons.yml [new file with mode: 0644]
config/initializers/browse_icons.rb [new file with mode: 0644]
config/layers.yml
config/locales/af.yml
config/locales/aln.yml
config/locales/ar.yml
config/locales/arz.yml
config/locales/ast.yml
config/locales/az.yml
config/locales/ba.yml
config/locales/be-Tarask.yml
config/locales/be.yml
config/locales/bg.yml
config/locales/br.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/ce.yml
config/locales/cs.yml
config/locales/cy.yml
config/locales/da.yml
config/locales/de.yml
config/locales/diq.yml
config/locales/dsb.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fit.yml
config/locales/fr.yml
config/locales/fur.yml
config/locales/fy.yml
config/locales/ga.yml
config/locales/gd.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hi.yml
config/locales/hr.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/id.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ka.yml
config/locales/kab.yml
config/locales/ko.yml
config/locales/ku-Latn.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nl.yml
config/locales/nn.yml
config/locales/nqo.yml
config/locales/oc.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/pnb.yml
config/locales/pt-PT.yml
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sc.yml
config/locales/scn.yml
config/locales/sh.yml
config/locales/sk.yml
config/locales/skr-arab.yml
config/locales/sl.yml
config/locales/sq.yml
config/locales/sr-Latn.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/te.yml
config/locales/th.yml
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/routes.rb
lib/social_share_button_helper.rb [new file with mode: 0644]
test/controllers/api/messages_controller_test.rb
test/controllers/api/traces/data_controller_test.rb [new file with mode: 0644]
test/controllers/api/traces_controller_test.rb
test/controllers/oauth2_authorizations_controller_test.rb
test/controllers/preferences_controller_test.rb
test/helpers/browse_helper_test.rb
test/helpers/social_share_button_helper_test.rb [new file with mode: 0644]
test/system/create_note_test.rb [new file with mode: 0644]
yarn.lock

index d909ddad6af5fd325fe5d0684b1dbb57ed7445b0..0200f153e5f9f2f8a926e44a2af1bc07d736ec55 100644 (file)
@@ -3,29 +3,29 @@ GEM
   specs:
     aasm (5.5.0)
       concurrent-ruby (~> 1.0)
-    actioncable (7.2.2)
-      actionpack (= 7.2.2)
-      activesupport (= 7.2.2)
+    actioncable (7.2.2.1)
+      actionpack (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
       zeitwerk (~> 2.6)
-    actionmailbox (7.2.2)
-      actionpack (= 7.2.2)
-      activejob (= 7.2.2)
-      activerecord (= 7.2.2)
-      activestorage (= 7.2.2)
-      activesupport (= 7.2.2)
+    actionmailbox (7.2.2.1)
+      actionpack (= 7.2.2.1)
+      activejob (= 7.2.2.1)
+      activerecord (= 7.2.2.1)
+      activestorage (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       mail (>= 2.8.0)
-    actionmailer (7.2.2)
-      actionpack (= 7.2.2)
-      actionview (= 7.2.2)
-      activejob (= 7.2.2)
-      activesupport (= 7.2.2)
+    actionmailer (7.2.2.1)
+      actionpack (= 7.2.2.1)
+      actionview (= 7.2.2.1)
+      activejob (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       mail (>= 2.8.0)
       rails-dom-testing (~> 2.2)
-    actionpack (7.2.2)
-      actionview (= 7.2.2)
-      activesupport (= 7.2.2)
+    actionpack (7.2.2.1)
+      actionview (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       nokogiri (>= 1.8.5)
       racc
       rack (>= 2.2.4, < 3.2)
@@ -36,39 +36,39 @@ GEM
       useragent (~> 0.16)
     actionpack-page_caching (1.2.4)
       actionpack (>= 4.0.0)
-    actiontext (7.2.2)
-      actionpack (= 7.2.2)
-      activerecord (= 7.2.2)
-      activestorage (= 7.2.2)
-      activesupport (= 7.2.2)
+    actiontext (7.2.2.1)
+      actionpack (= 7.2.2.1)
+      activerecord (= 7.2.2.1)
+      activestorage (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (7.2.2)
-      activesupport (= 7.2.2)
+    actionview (7.2.2.1)
+      activesupport (= 7.2.2.1)
       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.2.2)
-      activesupport (= 7.2.2)
+    activejob (7.2.2.1)
+      activesupport (= 7.2.2.1)
       globalid (>= 0.3.6)
-    activemodel (7.2.2)
-      activesupport (= 7.2.2)
-    activerecord (7.2.2)
-      activemodel (= 7.2.2)
-      activesupport (= 7.2.2)
+    activemodel (7.2.2.1)
+      activesupport (= 7.2.2.1)
+    activerecord (7.2.2.1)
+      activemodel (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       timeout (>= 0.4.0)
-    activerecord-import (1.8.1)
+    activerecord-import (2.0.0)
       activerecord (>= 4.2)
-    activestorage (7.2.2)
-      actionpack (= 7.2.2)
-      activejob (= 7.2.2)
-      activerecord (= 7.2.2)
-      activesupport (= 7.2.2)
+    activestorage (7.2.2.1)
+      actionpack (= 7.2.2.1)
+      activejob (= 7.2.2.1)
+      activerecord (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       marcel (~> 1.0)
-    activesupport (7.2.2)
+    activesupport (7.2.2.1)
       base64
       benchmark (>= 0.3)
       bigdecimal
@@ -92,7 +92,7 @@ GEM
     autoprefixer-rails (10.4.19.0)
       execjs (~> 2)
     aws-eventstream (1.3.0)
-    aws-partitions (1.1016.0)
+    aws-partitions (1.1023.0)
     aws-sdk-core (3.214.0)
       aws-eventstream (~> 1, >= 1.3.0)
       aws-partitions (~> 1, >= 1.992.0)
@@ -101,7 +101,7 @@ GEM
     aws-sdk-kms (1.96.0)
       aws-sdk-core (~> 3, >= 3.210.0)
       aws-sigv4 (~> 1.5)
-    aws-sdk-s3 (1.175.0)
+    aws-sdk-s3 (1.176.1)
       aws-sdk-core (~> 3, >= 3.210.0)
       aws-sdk-kms (~> 1)
       aws-sigv4 (~> 1.5)
@@ -208,7 +208,7 @@ GEM
       activerecord (>= 3.0, < 9.0)
       delayed_job (>= 3.0, < 5)
     docile (1.4.1)
-    doorkeeper (5.8.0)
+    doorkeeper (5.8.1)
       railties (>= 5)
     doorkeeper-i18n (5.2.7)
       doorkeeper (>= 5.2)
@@ -265,7 +265,7 @@ GEM
     factory_bot_rails (6.4.4)
       factory_bot (~> 6.5)
       railties (>= 5.0.0)
-    faraday (2.12.1)
+    faraday (2.12.2)
       faraday-net_http (>= 2.0, < 3.5)
       json
       logger
@@ -328,7 +328,7 @@ GEM
     in_threads (1.6.0)
     iniparse (1.5.0)
     io-console (0.8.0)
-    irb (1.14.1)
+    irb (1.14.2)
       rdoc (>= 4.0.0)
       reline (>= 0.4.2)
     jbuilder (2.13.0)
@@ -353,7 +353,7 @@ GEM
     listen (3.9.0)
       rb-fsevent (~> 0.10, >= 0.10.3)
       rb-inotify (~> 0.9, >= 0.9.10)
-    logger (1.6.2)
+    logger (1.6.3)
     logstasher (2.1.5)
       activesupport (>= 5.2)
       request_store
@@ -373,7 +373,7 @@ GEM
     mini_portile2 (2.8.8)
     mini_racer (0.9.0)
       libv8-node (~> 18.19.0.0)
-    minitest (5.25.2)
+    minitest (5.25.4)
     minitest-focus (1.4.0)
       minitest (>= 4, < 6)
     msgpack (1.7.5)
@@ -383,7 +383,7 @@ GEM
     nap (1.1.0)
     net-http (0.6.0)
       uri
-    net-imap (0.5.1)
+    net-imap (0.5.2)
       date
       net-protocol
     net-pop (0.1.2)
@@ -393,7 +393,7 @@ GEM
     net-smtp (0.5.0)
       net-protocol
     nio4r (2.7.4)
-    nokogiri (1.16.8)
+    nokogiri (1.17.2)
       mini_portile2 (~> 2.8.2)
       racc (~> 1.4)
     oauth (1.1.0)
@@ -461,7 +461,7 @@ GEM
     pg (1.5.9)
     popper_js (2.11.8)
     progress (3.6.0)
-    pstore (0.1.3)
+    pstore (0.1.4)
     psych (5.2.1)
       date
       stringio
@@ -487,20 +487,20 @@ GEM
     rackup (1.0.1)
       rack (< 3)
       webrick
-    rails (7.2.2)
-      actioncable (= 7.2.2)
-      actionmailbox (= 7.2.2)
-      actionmailer (= 7.2.2)
-      actionpack (= 7.2.2)
-      actiontext (= 7.2.2)
-      actionview (= 7.2.2)
-      activejob (= 7.2.2)
-      activemodel (= 7.2.2)
-      activerecord (= 7.2.2)
-      activestorage (= 7.2.2)
-      activesupport (= 7.2.2)
+    rails (7.2.2.1)
+      actioncable (= 7.2.2.1)
+      actionmailbox (= 7.2.2.1)
+      actionmailer (= 7.2.2.1)
+      actionpack (= 7.2.2.1)
+      actiontext (= 7.2.2.1)
+      actionview (= 7.2.2.1)
+      activejob (= 7.2.2.1)
+      activemodel (= 7.2.2.1)
+      activerecord (= 7.2.2.1)
+      activestorage (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       bundler (>= 1.15.0)
-      railties (= 7.2.2)
+      railties (= 7.2.2.1)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -509,7 +509,7 @@ GEM
       activesupport (>= 5.0.0)
       minitest
       nokogiri (>= 1.6)
-    rails-html-sanitizer (1.6.1)
+    rails-html-sanitizer (1.6.2)
       loofah (~> 2.21)
       nokogiri (>= 1.15.7, != 1.16.7, != 1.16.6, != 1.16.5, != 1.16.4, != 1.16.3, != 1.16.2, != 1.16.1, != 1.16.0.rc1, != 1.16.0)
     rails-i18n (7.0.10)
@@ -518,9 +518,9 @@ GEM
     rails_param (1.3.1)
       actionpack (>= 3.2.0)
       activesupport (>= 3.2.0)
-    railties (7.2.2)
-      actionpack (= 7.2.2)
-      activesupport (= 7.2.2)
+    railties (7.2.2.1)
+      actionpack (= 7.2.2.1)
+      activesupport (= 7.2.2.1)
       irb (~> 1.13)
       rackup (>= 1.0.0)
       rake (>= 12.2)
@@ -532,20 +532,20 @@ GEM
     rb-inotify (0.11.1)
       ffi (~> 1.0)
     rchardet (1.8.0)
-    rdoc (6.8.1)
+    rdoc (6.9.1)
       psych (>= 4.0.0)
     regexp_parser (2.9.3)
-    reline (0.5.12)
+    reline (0.6.0)
       io-console (~> 0.5)
     request_store (1.7.0)
       rack (>= 1.4)
-    rexml (3.3.9)
+    rexml (3.4.0)
     rinku (2.0.6)
     rotp (6.3.0)
     rouge (4.5.1)
     rtlcss (0.2.1)
       mini_racer (>= 0.6.3)
-    rubocop (1.69.1)
+    rubocop (1.69.2)
       json (~> 2.3)
       language_server-protocol (>= 3.17.0)
       parallel (~> 1.10)
@@ -555,7 +555,7 @@ GEM
       rubocop-ast (>= 1.36.2, < 2.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 2.4.0, < 4.0)
-    rubocop-ast (1.36.2)
+    rubocop-ast (1.37.0)
       parser (>= 3.3.1.0)
     rubocop-capybara (2.21.0)
       rubocop (~> 1.41)
@@ -589,7 +589,7 @@ GEM
     sawyer (0.9.2)
       addressable (>= 2.3.5)
       faraday (>= 0.17.3, < 3)
-    securerandom (0.4.0)
+    securerandom (0.4.1)
     selenium-webdriver (4.23.0)
       base64 (~> 0.2)
       logger (~> 1.4)
@@ -631,7 +631,7 @@ GEM
       execjs (>= 0.3.0, < 3)
     thor (1.3.2)
     tilt (2.4.0)
-    timeout (0.4.2)
+    timeout (0.4.3)
     turbo-rails (2.0.11)
       actionpack (>= 6.0.0)
       railties (>= 6.0.0)
@@ -639,7 +639,7 @@ GEM
       concurrent-ruby (~> 1.0)
     unicode-display_width (2.6.0)
     uri (0.13.1)
-    useragent (0.16.10)
+    useragent (0.16.11)
     validates_email_format_of (1.8.2)
       i18n (>= 0.8.0)
       simpleidn
index 96ed9b080fa3b79f4692aab8c52c21aa1c4efe5d..c790da66ab522f1b6fcbed3baee9cfa214b5b4f1 100644 (file)
@@ -22,7 +22,7 @@ class ApiAbility
 
       if user&.active?
         can [:comment, :close, :reopen], Note
-        can [:create, :show, :update, :destroy, :data], Trace
+        can [:create, :show, :update, :destroy], Trace
         can [:details, :gpx_files], User
         can [:index, :show, :update, :update_all, :destroy], UserPreference
 
diff --git a/app/assets/images/social_icons/email.svg b/app/assets/images/social_icons/email.svg
new file mode 100644 (file)
index 0000000..d35d51d
--- /dev/null
@@ -0,0 +1,4 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48Z" fill="#0971BD"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.8 17.1754C12.8 17.1754 22.4595 22.653 24.3344 22.653C26.2995 22.653 35.8544 17.28 35.8544 17.28L35.8698 16.32C35.8698 15.2602 35.0096 14.4 33.9469 14.4H14.7219C13.6602 14.4 12.8 15.2602 12.8 16.32V17.1754ZM35.8544 20.16C35.8544 20.16 26.3898 25.293 24.3344 25.293C22.4595 25.293 12.8144 20.16 12.8154 20.16L12.8 31.68C12.8 32.7399 13.6611 33.6 14.7219 33.6H33.9469C35.0096 33.6 35.8698 32.7399 35.8698 31.68L35.8544 20.16Z" fill="white"/>
+</svg>
diff --git a/app/assets/images/social_icons/facebook.svg b/app/assets/images/social_icons/facebook.svg
new file mode 100644 (file)
index 0000000..8024147
--- /dev/null
@@ -0,0 +1,4 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24Z" fill="#3B5998"/>
+<path d="M26.5015 38.1115V25.0542H30.1059L30.5836 20.5546H26.5015L26.5077 18.3025C26.5077 17.1289 26.6192 16.5001 28.3048 16.5001H30.5581V12H26.9532C22.6231 12 21.0991 14.1828 21.0991 17.8536V20.5551H18.4V25.0547H21.0991V38.1115H26.5015Z" fill="white"/>
+</svg>
diff --git a/app/assets/images/social_icons/linkedin.svg b/app/assets/images/social_icons/linkedin.svg
new file mode 100644 (file)
index 0000000..908c867
--- /dev/null
@@ -0,0 +1,4 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24Z" fill="#0077B5"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.3188 14.8227C17.3188 16.3918 16.1377 17.6473 14.2412 17.6473H14.2064C12.3805 17.6473 11.2 16.3918 11.2 14.8227C11.2 13.2204 12.4164 12 14.277 12C16.1377 12 17.2835 13.2204 17.3188 14.8227ZM16.9605 19.8778V36.2196H11.5216V19.8778H16.9605ZM36.5752 36.2196L36.5754 26.8497C36.5754 21.8303 33.8922 19.4941 30.3131 19.4941C27.4254 19.4941 26.1325 21.0802 25.4107 22.1929V19.8783H19.9711C20.0428 21.4117 19.9711 36.22 19.9711 36.22H25.4107V27.0934C25.4107 26.605 25.446 26.1178 25.5898 25.7681C25.9829 24.7924 26.8779 23.7822 28.3805 23.7822C30.3494 23.7822 31.1365 25.2807 31.1365 27.4767V36.2196H36.5752Z" fill="white"/>
+</svg>
diff --git a/app/assets/images/social_icons/mastodon.svg b/app/assets/images/social_icons/mastodon.svg
new file mode 100644 (file)
index 0000000..a8b4bc4
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg width="800px" height="800px" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
+   <circle cx="512" cy="512" r="512" style="fill:#2b90d9"/>
+   <path d="M750.7 448.1c0-111-72.8-143.6-72.8-143.6-36.7-16.9-99.7-23.9-165.1-24.5h-1.6c-65.4.5-128.4 7.6-165.1 24.5 0 0-72.8 32.5-72.8 143.6 0 25.4-.5 55.8.3 88.1 2.6 108.6 19.9 215.6 120.3 242.2 46.3 12.2 86 14.8 118.1 13.1 58.1-3.2 90.7-20.7 90.7-20.7l-1.9-42.1s-41.5 13.1-88.1 11.5c-46.2-1.6-94.9-5-102.4-61.7-.7-5.3-1-10.6-1-15.9 0 0 45.3 11.1 102.7 13.7 35.1 1.6 68-2.1 101.5-6 64.1-7.7 120-47.2 127-83.3 11.1-56.9 10.2-138.9 10.2-138.9zm-85.8 143.1h-53.3V460.7c0-27.5-11.6-41.5-34.7-41.5-25.6 0-38.4 16.6-38.4 49.3V540h-53v-71.5c0-32.8-12.8-49.3-38.4-49.3-23.1 0-34.7 14-34.7 41.5v130.5h-53.3V456.8c0-27.5 7-49.3 21.1-65.5 14.5-16.2 33.5-24.4 57-24.4 27.3 0 47.9 10.5 61.6 31.4l13.2 22.2 13.3-22.2c13.7-21 34.3-31.4 61.6-31.4 23.5 0 42.5 8.3 57 24.4 14 16.1 21 38 21 65.5v134.4z" style="fill:#fff"/>
+</svg>
\ No newline at end of file
diff --git a/app/assets/images/social_icons/telegram.svg b/app/assets/images/social_icons/telegram.svg
new file mode 100644 (file)
index 0000000..84c0879
--- /dev/null
@@ -0,0 +1,16 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48Z" fill="url(#paint0_linear_34411_836)"/>
+<path d="M19.6 35C18.8225 35 18.9546 34.7064 18.6864 33.9661L16.4 26.4412L34 16" fill="#C8DAEA"/>
+<path d="M19.6 34.9999C20.2 34.9999 20.4651 34.7255 20.8 34.3999L24 31.2883L20.0084 28.8813" fill="#A9C9DD"/>
+<path d="M20.008 28.882L29.68 36.0278C30.7837 36.6368 31.5803 36.3215 31.8552 35.0031L35.7922 16.4505C36.1953 14.8344 35.1762 14.1015 34.1203 14.5808L11.0023 23.495C9.4243 24.128 9.4335 25.0084 10.7147 25.4006L16.6473 27.2523L30.3819 18.5873C31.0303 18.1941 31.6253 18.4055 31.1369 18.839" fill="url(#paint1_linear_34411_836)"/>
+<defs>
+<linearGradient id="paint0_linear_34411_836" x1="18.0024" y1="2.0016" x2="6.0024" y2="30" gradientUnits="userSpaceOnUse">
+<stop stop-color="#37AEE2"/>
+<stop offset="1" stop-color="#1E96C8"/>
+</linearGradient>
+<linearGradient id="paint1_linear_34411_836" x1="20.9956" y1="25.4742" x2="23.56" y2="33.7692" gradientUnits="userSpaceOnUse">
+<stop stop-color="#EFF7FC"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>
diff --git a/app/assets/images/social_icons/x.svg b/app/assets/images/social_icons/x.svg
new file mode 100644 (file)
index 0000000..937dcc7
--- /dev/null
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 512"><path d="M256 0c141.385 0 256 114.615 256 256S397.385 512 256 512 0 397.385 0 256 114.615 0 256 0z"/><path fill="#fff" fill-rule="nonzero" d="M318.64 157.549h33.401l-72.973 83.407 85.85 113.495h-67.222l-52.647-68.836-60.242 68.836h-33.423l78.052-89.212-82.354-107.69h68.924l47.59 62.917 55.044-62.917zm-11.724 176.908h18.51L205.95 176.493h-19.86l120.826 157.964z"/></svg>
index 706097bbaf2c4f01dcd4bfac7888ce29a11080b0..15f77b1c14dda0d3542b40979d1987cdd8e13e98 100644 (file)
@@ -28,6 +28,12 @@ document.addEventListener("DOMContentLoaded", function () {
       .containerNode(container)
       .init();
 
+    if (parent === window) {
+      // iD not opened in an iframe -> skip setting of parent  handlers
+      return;
+    }
+
+    var hashChangedAutomatically = false;
     id.map().on("move.embed", parent.$.throttle(250, function () {
       if (id.inIntro()) return;
       var zoom = ~~id.map().zoom(),
@@ -40,14 +46,12 @@ document.addEventListener("DOMContentLoaded", function () {
       // https://gist.github.com/jfirebaugh/5439412
       var hash = parent.OSM.formatHash(llz);
       if (hash !== parent.location.hash) {
+        hashChangedAutomatically = true;
         parent.location.replace(parent.location.href.replace(/(#.*|$)/, hash));
       }
     }));
 
-    parent.$("body").on("click", "a.set_position", function (e) {
-      e.preventDefault();
-      var data = parent.$(this).data();
-
+    function goToLocation(data) {
       // 0ms timeout to avoid iframe JS context weirdness.
       // https://gist.github.com/jfirebaugh/5439412
       setTimeout(function () {
@@ -55,6 +59,22 @@ document.addEventListener("DOMContentLoaded", function () {
           [data.lon, data.lat],
           Math.max(data.zoom || 15, 13));
       }, 0);
+    }
+
+    parent.$("body").on("click", "a.set_position", function (e) {
+      e.preventDefault();
+      var data = parent.$(this).data();
+      goToLocation(data);
+    });
+
+    parent.addEventListener("hashchange", function (e) {
+      if (hashChangedAutomatically) {
+        hashChangedAutomatically = false;
+        return;
+      }
+      e.preventDefault();
+      var data = parent.OSM.mapParams();
+      goToLocation(data);
     });
   }
 });
index 9df0f0ad5a432b34be12258c6ead602362fa05d0..56495b31a31c87fd18ca8b864ac492b84f1f0240 100644 (file)
@@ -207,7 +207,7 @@ $(document).ready(function () {
   if (OSM.MATOMO) {
     map.on("layeradd", function (e) {
       if (e.layer.options) {
-        var goal = OSM.MATOMO.goals[e.layer.options.keyid];
+        var goal = OSM.MATOMO.goals[e.layer.options.layerId];
 
         if (goal) {
           $("body").trigger("matomogoal", goal);
index f478f4351b58a644ab0b5b35015021b28abaf48c..02ed318acffc89eded8d0dccad99a682c8e2d05f 100644 (file)
@@ -26,8 +26,6 @@ L.OSM.Map = L.Map.extend({
       for (const [property, value] of Object.entries(layerDefinition)) {
         if (property === "credit") {
           layerOptions.attribution = makeAttribution(value);
-        } else if (property === "keyId") {
-          layerOptions.keyid = value;
         } else if (property === "nameId") {
           layerOptions.name = I18n.t(`javascripts.map.base.${value}`);
         } else if (property === "apiKeyId") {
@@ -134,7 +132,7 @@ L.OSM.Map = L.Map.extend({
   getMapBaseLayerId: function () {
     var baseLayerId;
     this.eachLayer(function (layer) {
-      if (layer.options && layer.options.keyid) baseLayerId = layer.options.keyid;
+      if (layer.options && layer.options.layerId) baseLayerId = layer.options.layerId;
     });
     return baseLayerId;
   },
diff --git a/app/assets/javascripts/social_share_button.js b/app/assets/javascripts/social_share_button.js
new file mode 100644 (file)
index 0000000..409b2c5
--- /dev/null
@@ -0,0 +1,21 @@
+function openShareUrl(url, initialWidth = 640, initialHeight = 480) {
+  const width = Math.max(100, Math.min(screen.width, initialWidth));
+  const height = Math.max(100, Math.min(screen.height, initialHeight));
+
+  const left = (screen.width / 2) - (width / 2);
+  const top = (screen.height * 0.3) - (height / 2);
+  const opts = `width=${width},height=${height},left=${left},top=${top},menubar=no,status=no,location=no`;
+
+  window.open(url, "popup", opts);
+}
+
+$(document).ready(function () {
+  $(".ssb-icon").on("click", function (e) {
+    const shareUrl = $(this).attr("href");
+    if (!shareUrl.startsWith("mailto:")) {
+      e.preventDefault();
+      openShareUrl(shareUrl);
+    }
+  });
+});
+
diff --git a/app/assets/stylesheets/browse.scss b/app/assets/stylesheets/browse.scss
deleted file mode 100644 (file)
index 2dac602..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-$map-sidebar-icons: (
-
-  /* Nodes (and ways as areas) */
-
-  ".aeroway.aerodrome": ("filename": "aerodrome.p.16.png"),
-  
-  ".amenity.atm": ("filename": "amenity_atm.16.png", "invert": true),
-  ".amenity.bank": ("filename": "amenity_bank.16.png", "invert": true),
-  ".amenity.bar": ("filename": "amenity_bar.16.png", "invert": true),
-  ".amenity.bench": ("filename": "amenity_bench.16.png", "invert": true),
-  ".amenity.biergarten": ("filename": "amenity_biergarten.16.png", "invert": true),
-  ".amenity.bicycle_parking": ("filename": "amenity_bicycle_parking.16.png"),
-  ".amenity.bicycle_rental": ("filename": "transport_rental_bicycle.16.png"),
-  ".amenity.bus_station": ("filename": "bus_station.n.16.png"),
-  ".amenity.cafe": ("filename": "amenity_cafe.16.png", "invert": true),
-  ".amenity.car_rental": ("filename": "transport_rental_car.16.png"),
-  ".amenity.car_sharing": ("filename": "car_share.p.16.png"),
-  ".amenity.childcare": ("filename": "amenity_childcare.p.16.png"),
-  ".amenity.cinema": ("filename": "amenity_cinema.16.png", "invert": true),
-  ".amenity.courthouse": ("filename": "amenity_courthouse.16.png", "invert": true),
-  ".amenity.dentist": ("filename": "amenity_dentist.16.png"),
-  ".amenity.doctors": ("filename": "amenity_doctors.16.png"),
-  ".amenity.drinking_water": ("filename": "amenity_drinking_water.16.png", "invert": true),
-  ".amenity.fast_food": ("filename": "amenity_fast_food.16.png", "invert": true),
-  ".amenity.fire_station": ("filename": "amenity_fire_station.16.png", "invert": true),
-  ".amenity.fuel": ("filename": "amenity_fuel.16.png"),
-  ".amenity.hospital": ("filename": "amenity_hospital.16.png"),
-  ".amenity.kindergarten": ("filename": "amenity_childcare.p.16.png"),
-  ".amenity.library": ("filename": "library.p.16.png", "invert": true),
-  ".amenity.nightclub": ("filename": "amenity_nightclub.16.png", "invert": true),
-  ".amenity.parking": ("filename": "parking.p.16.png"),
-  ".amenity.pharmacy": ("filename": "amenity_pharmacy.16.png"),
-  ".amenity.place_of_worship": ("filename": "amenity_place_of_worship.16.png", "invert": true),
-  ".amenity.police": ("filename": "amenity_police.16.png", "invert": true),
-  ".amenity.post_box": ("filename": "post_box.p.16.png", "invert": true),
-  ".amenity.post_office": ("filename": "post_office.p.16.png", "invert": true),
-  ".amenity.prison": ("filename": "amenity_prison.16.png", "invert": true),
-  ".amenity.pub": ("filename": "amenity_pub.16.png", "invert": true),
-  ".amenity.restaurant": ("filename": "amenity_restaurant.16.png", "invert": true),
-  ".amenity.recycling": ("filename": "amenity_recycling.16.png", "invert": true),
-  ".amenity.school": ("filename": "education_school.p.16.png"),
-  ".amenity.shelter": ("filename": "shelter2.p.16.png"),
-  ".amenity.taxi": ("filename": "amenity_taxi.16.png"),
-  ".amenity.telephone": ("filename": "telephone.p.16.png", "invert": true),
-  ".amenity.theatre": ("filename": "amenity_theatre.16.png", "invert": true),
-  ".amenity.toilets": ("filename": "amenity_toilets.16.png", "invert": true),
-  ".amenity.townhall": ("filename": "amenity_townhall.16.png", "invert": true),
-  ".amenity.university": ("filename": "education_university.p.16.png"),
-  ".amenity.veterinary": ("filename": "health_veterinary.p.16.png"),
-  ".amenity.waste_basket": ("filename": "amenity_waste_basket.16.png", "invert": true),
-
-  ".barrier.gate": ("filename": "gate2.p.16.png", "invert": true),
-
-  ".highway.bus_stop": ("filename": "highway_bus_stop.16.png"),
-  ".highway.mini_roundabout": ("filename": "mini_round.p.16.png"),
-  ".highway.traffic_signals": ("filename": "traffic_light.png", "invert": true),
-  ".highway.turning_circle": ("filename": "turning_circle.p.16.png"),
-
-  ".historic.archaeological_site": ("filename": "historic_archaeological_site.16.png", "invert": true),
-  ".historic.castle": ("filename": "tourist_castle.p.16.png", "invert": true),
-  ".historic.memorial": ("filename": "historic_memorial.16.png", "invert": true),
-  ".historic.monument": ("filename": "historic_monument.16.png", "invert": true),
-  ".historic.ruins": ("filename": "tourist_ruins.p.16.png", "invert": true),
-  ".historic.wreck": ("filename": "tourist_wreck.p.16.png", "invert": true),
-
-  ".man_made.lighthouse": ("filename": "man_made_lighthouse.16.png"),
-  ".man_made.water_tower": ("filename": "man_made_water_tower.16.png", "invert": true),
-  ".man_made.windmill": ("filename": "man_made_windmill.16.png", "invert": true),
-
-  ".natural.tree": ("filename": "tree.p.16.png"),
-
-  ".office.diplomatic": ("filename": "office_diplomatic.16.png"),
-  ".office.estate_agent": ("filename": "shop_estateagent.16.png"),
-
-  ".railway.halt": ("filename": "halt.p.16.png"),
-  ".railway.station": ("filename": "station.p.16.png"),
-  ".railway.level_crossing": ("filename": "level_crossing.p.16.png", "invert": true),
-
-  ".shop": ("filename": "shop_convenience.p.16.png"),
-  ".shop.alcohol": ("filename": "shop_alcohol.16.png"),
-  ".shop.bakery": ("filename": "shop_bakery.16.png"),
-  ".shop.bicycle": ("filename": "shop_bicycle.16.png"),
-  ".shop.books": ("filename": "shop_books.16.png"),
-  ".shop.butcher": ("filename": "shop_butcher.p.16.png"),
-  ".shop.clothes": ("filename": "shop_clothes.16.png"),
-  ".shop.car_parts": ("filename": "shop_car_parts.16.png"),
-  ".shop.car_repair": ("filename": "shop_car_repair.16.png"),
-  ".shop.convenience": ("filename": "shop_convenience.p.16.png"),
-  ".shop.doityourself": ("filename": "shop_doityourself.16.png"),
-  ".shop.electronics": ("filename": "shop_electronics.16.png"),
-  ".shop.estate_agent": ("filename": "shop_estateagent.16.png"),
-  ".shop.fashion": ("filename": "shop_clothes.16.png"),
-  ".shop.florist": ("filename": "shop_florist.16.png"),
-  ".shop.furniture": ("filename": "shop_furniture.16.png"),
-  ".shop.garden_centre": ("filename": "shop_florist.16.png"),
-  ".shop.gift": ("filename": "shop_gift.16.png"),
-  ".shop.greengrocer": ("filename": "shop_greengrocer.p.16.png"),
-  ".shop.hardware": ("filename": "shop_doityourself.16.png"),
-  ".shop.hairdresser": ("filename": "shop_hairdresser.16.png"),
-  ".shop.jewelry": ("filename": "shop_jewelry.16.png"),
-  ".shop.mobile_phone": ("filename": "shop_mobile_phone.16.png"),
-  ".shop.optician": ("filename": "shop_optician.16.png"),
-  ".shop.pet": ("filename": "shop_pet.16.png"),
-  ".shop.seafood": ("filename": "shop_seafood.16.png"),
-  ".shop.shoes": ("filename": "shop_shoes.16.png"),
-  ".shop.supermarket": ("filename": "shop_supermarket.p.16.png"),
-
-  ".tourism.alpine_hut": ("filename": "tourism_alpine_hut.16.png"),
-  ".tourism.camp_site": ("filename": "tourism_camp_site.16.png"),
-  ".tourism.caravan_site": ("filename": "tourism_caravan_site.16.png"),
-  ".tourism.hostel": ("filename": "tourism_hostel.16.png"),
-  ".tourism.hotel": ("filename": "tourism_hotel.16.png"),
-  ".tourism.motel": ("filename": "tourism_motel.16.png"),
-  ".tourism.museum": ("filename": "tourism_museum.16.png", "invert": true),
-  ".tourism.picnic_site": ("filename": "tourism_picnic_site.16.png", "invert": true),
-  ".tourism.viewpoint": ("filename": "view_point.p.16.png", "invert": true),
-  ".tourism.wilderness_hut": ("filename": "tourism_wilderness_hut.16.png"),
-
-  /* Ways */
-
-  ".aeroway.runway": ("filename": "runway.20.png"),
-  ".aeroway.taxiway": ("filename": "taxiway.20.png"),
-
-  ".barrier.wall": ("filename": "wall.20.png"),
-
-  ".building": ("filename": "building.png"),
-
-  ".highway.bridleway": ("filename": "bridleway.20.png"),
-  ".highway.cycleway": ("filename": "cycleway.20.png"),
-  ".highway.footway": ("filename": "footway.20.png"),
-  ".highway.motorway": ("filename": "motorway.20.png"),
-  ".highway.motorway_link": ("filename": "motorway.20.png"),
-  ".highway.path": ("filename": "path.20.png"),
-  ".highway.pedestrian": ("filename": "service.20.png"),
-  ".highway.primary": ("filename": "primary.20.png"),
-  ".highway.primary_link": ("filename": "primary.20.png"),
-  ".highway.residential": ("filename": "unclassified.20.png"),
-  ".highway.secondary": ("filename": "secondary.20.png"),
-  ".highway.secondary_link": ("filename": "secondary.20.png"),
-  ".highway.service": ("filename": "service.20.png"),
-  ".highway.tertiary": ("filename": "tertiary.20.png"),
-  ".highway.track": ("filename": "track.20.png"),
-  ".highway.trunk": ("filename": "trunk.20.png"),
-  ".highway.trunk_link": ("filename": "trunk.20.png"),
-  ".highway.unclassified": ("filename": "unclassified.20.png"),
-
-  ".landuse.brownfield": ("filename": "brownfield.png"),
-  ".landuse.cemetery": ("filename": "cemetery.png"),
-  ".landuse.commercial": ("filename": "commercial.png"),
-  ".landuse.farmland": ("filename": "farmland.png"),
-  ".landuse.farmyard": ("filename": "farmyard.png"),
-  ".landuse.forest": ("filename": "forest.png"),
-  ".landuse.grass": ("filename": "grass.png"),
-  ".landuse.industrial": ("filename": "industrial.png"),
-  ".landuse.meadow": ("filename": "meadow.png"),
-  ".landuse.military": ("filename": "military.png"),
-  ".landuse.residential": ("filename": "residential.png"),
-  ".landuse.retail": ("filename": "retail.png"),
-  ".landuse.tourism": ("filename": "tourism.png"),
-
-  ".leisure.golf_course": ("filename": "golf.png"),
-  ".leisure.park": ("filename": "park.png"),
-  ".leisure.picnic_table": ("filename": "tourism_picnic_site.16.png", "invert": true),
-  ".leisure.playground": ("filename": "leisure_playground.16.png", "invert": true),
-  ".leisure.pitch": ("filename": "pitch.png"),
-  ".leisure.nature_reserve": ("filename": "reserve.png"),
-  ".leisure.water_park": ("filename": "leisure_water_park.16.png", "invert": true),
-
-  ".natural.grassland": ("filename": "grassland.png"),
-  ".natural.heath": ("filename": "heathland.png"),
-  ".natural.scrub": ("filename": "scrub.png"),
-  ".natural.water": ("filename": "lake.png"),
-  ".natural.wood": ("filename": "wood.png"),
-
-  ".railway.light_rail": ("filename": "light_rail.20.png"),
-  ".railway.rail": ("filename": "rail.20.png"),
-  ".railway.subway": ("filename": "subway.20.png"),
-  ".railway.tram": ("filename": "tram.20.png"),
-
-)
index 668d050d8bbbc42da49826961dc97fcd2fd03563..323f60e08c192a91d2934f5e2309c1841591f357 100644 (file)
@@ -1,6 +1,5 @@
 @use "sass:map";
 @import "parameters";
-@import "browse";
 @import "bootstrap";
 @import "rails_bootstrap_forms";
 
@@ -10,6 +9,7 @@
 
 body {
   font-size: $typeheight;
+  --dark-mode-map-filter: brightness(.8);
 }
 
 time[title] {
@@ -506,11 +506,6 @@ body.small-nav {
 }
 
 @include color-mode(dark) {
-  .leaflet-tile-container .leaflet-tile,
-  .mapkey-table-entry td:first-child > * {
-    filter: brightness(.8);
-  }
-
   .leaflet-container .leaflet-control-attribution a {
     color: var(--bs-link-color);
   }
@@ -520,6 +515,27 @@ body.small-nav {
   }
 }
 
+@mixin dark-map-color-scheme {
+  .leaflet-tile-container,
+  .mapkey-table-entry td:first-child > * {
+    filter: var(--dark-mode-map-filter);
+  }
+
+  .leaflet-tile-container .leaflet-tile {
+    filter: none;
+  }
+}
+
+body[data-map-theme="dark"] {
+  @include dark-map-color-scheme;
+}
+
+@include color-mode(dark) {
+  body:not([data-map-theme]) {
+    @include dark-map-color-scheme;
+  }
+}
+
 /* Rules for attribution text under the main map shown on printouts */
 
 .donate-attr { color: darken($green, 10%) !important; }
@@ -970,34 +986,20 @@ img.trace_image {
 
 /* Rules for map sidebar icons */
 
-.browse-section {
-  .node::before,
-  .way::before,
-  .relation::before {
-    display: inline-block;
-    width: 25px;
-    margin-left: -25px;
-  }
+.browse-section .browse-element-list {
+  line-height: 1.25rem;
 
-  .node, .way, .relation {
-    margin-left: 25px;
+  .browse-icon {
+    height: 1.25rem;
   }
 
-  .node::before     { content: image-url('browse/node.svg'); }
-  .way::before      { content: image-url('browse/way.svg'); }
-  .relation::before { content: image-url('browse/relation.svg'); }
-}
-
-@each $class, $item in $map-sidebar-icons {
-  .browse-section #{$class}::before {
-    content: image-url('browse/#{map.get($item, "filename")}');
+  .d-flex > .browse-icon {
+    height: max(20px, 1.25rem);
   }
 
-  @if map.get($item, "invert") {
-    @include color-mode(dark) {
-      .browse-section #{$class}::before {
-        filter: invert(.8) hue-rotate(180deg);
-      }
+  @include color-mode(dark) {
+    .browse-icon-invertible {
+      filter: invert(.8) hue-rotate(180deg);
     }
   }
 }
index 28bf569016a607d81b4aa01b994226ca8366845e..07549d69bb33e939238f98e6ef6d1e44eea4a816 100644 (file)
@@ -20,4 +20,3 @@ $table-border-factor: .1;
 $list-group-hover-bg: rgba(var(--bs-emphasis-color-rgb), .075);
 
 $enable-negative-margins: true;
-$color-mode-type: media-query;
diff --git a/app/assets/stylesheets/screen-auto-ltr.scss b/app/assets/stylesheets/screen-auto-ltr.scss
new file mode 100644 (file)
index 0000000..89e3159
--- /dev/null
@@ -0,0 +1,3 @@
+@use "common" with (
+  $color-mode-type: media-query
+);
diff --git a/app/assets/stylesheets/screen-auto-rtl.rtlcss.scss b/app/assets/stylesheets/screen-auto-rtl.rtlcss.scss
new file mode 100644 (file)
index 0000000..89e3159
--- /dev/null
@@ -0,0 +1,3 @@
+@use "common" with (
+  $color-mode-type: media-query
+);
diff --git a/app/assets/stylesheets/screen-ltr.scss b/app/assets/stylesheets/screen-ltr.scss
deleted file mode 100644 (file)
index c525060..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@import "common";
diff --git a/app/assets/stylesheets/screen-manual-ltr.scss b/app/assets/stylesheets/screen-manual-ltr.scss
new file mode 100644 (file)
index 0000000..00f65f7
--- /dev/null
@@ -0,0 +1,3 @@
+@use "common" with (
+  $color-mode-type: data
+);
diff --git a/app/assets/stylesheets/screen-manual-rtl.rtlcss.scss b/app/assets/stylesheets/screen-manual-rtl.rtlcss.scss
new file mode 100644 (file)
index 0000000..00f65f7
--- /dev/null
@@ -0,0 +1,3 @@
+@use "common" with (
+  $color-mode-type: data
+);
diff --git a/app/assets/stylesheets/screen-rtl.rtlcss.scss b/app/assets/stylesheets/screen-rtl.rtlcss.scss
deleted file mode 100644 (file)
index c525060..0000000
+++ /dev/null
@@ -1 +0,0 @@
-@import "common";
diff --git a/app/controllers/api/traces/data_controller.rb b/app/controllers/api/traces/data_controller.rb
new file mode 100644 (file)
index 0000000..e04931c
--- /dev/null
@@ -0,0 +1,36 @@
+module Api
+  module Traces
+    class DataController < ApiController
+      before_action :set_locale
+      before_action :authorize
+
+      authorize_resource :trace
+
+      before_action :offline_error
+
+      def show
+        trace = Trace.visible.find(params[:trace_id])
+
+        if trace.public? || trace.user == current_user
+          if request.format == Mime[:xml]
+            send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
+          elsif request.format == Mime[:gpx]
+            send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
+          elsif trace.file.attached?
+            redirect_to rails_blob_path(trace.file, :disposition => "attachment")
+          else
+            send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
+          end
+        else
+          head :forbidden
+        end
+      end
+
+      private
+
+      def offline_error
+        report_error "GPX files offline for maintenance", :service_unavailable if Settings.status == "gpx_offline"
+      end
+    end
+  end
+end
index 76dfb3a2dc1bd4b6d57728b17b3f074894ef88cd..e91261058efe05db7500626deacec804f562d581 100644 (file)
@@ -6,7 +6,7 @@ module Api
 
     authorize_resource
 
-    before_action :offline_error, :only => [:create, :destroy, :data]
+    before_action :offline_error, :only => [:create, :destroy]
     skip_around_action :api_call_timeout, :only => :create
 
     def show
@@ -71,24 +71,6 @@ module Api
       end
     end
 
-    def data
-      trace = Trace.visible.find(params[:id])
-
-      if trace.public? || trace.user == current_user
-        if request.format == Mime[:xml]
-          send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
-        elsif request.format == Mime[:gpx]
-          send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
-        elsif trace.file.attached?
-          redirect_to rails_blob_path(trace.file, :disposition => "attachment")
-        else
-          send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
-        end
-      else
-        head :forbidden
-      end
-    end
-
     private
 
     def do_create(file, tags, description, visibility)
index bde7e028765c81b5426a5eed2e8c74957abee4b2..32b53bad71c3f431d79234d65e354f6cafcf13c9 100644 (file)
@@ -279,7 +279,15 @@ class ApplicationController < ActionController::Base
     end
   end
 
-  helper_method :preferred_editor
+  def preferred_color_scheme(subject)
+    if current_user
+      current_user.preferences.find_by(:k => "#{subject}.color_scheme")&.v || "auto"
+    else
+      "auto"
+    end
+  end
+
+  helper_method :preferred_editor, :preferred_color_scheme
 
   def update_totp
     if Settings.key?(:totp_key)
index c47a3abfb9a1e3d605b0fb3e7d92cc072de6fffa..c40e776b444074efc192c9e4ae496924a05dc640 100644 (file)
@@ -44,5 +44,7 @@ class NotesController < ApplicationController
     render :template => "browse/not_found", :status => :not_found
   end
 
-  def new; end
+  def new
+    render :action => :new_readonly if api_status != "online"
+  end
 end
index 415ab2775c12f248e90598bde7e2495078e126f9..9f86e8b184e711bce1e3429be2bd96a2d016c578 100644 (file)
@@ -7,4 +7,6 @@ class Oauth2AuthorizationsController < Doorkeeper::AuthorizationsController
   allow_all_form_action :only => :new
 
   authorize_resource :class => false
+
+  before_action :check_database_writable
 end
index dcf0d8b64e2682364b7c5b489ad1c9c72662bd19..1d96766ef227b7dbaa86b870f03ca1534c8513c6 100644 (file)
@@ -21,7 +21,20 @@ class PreferencesController < ApplicationController
                                     else
                                       params[:user][:preferred_editor]
                                     end
-    if current_user.save
+
+    success = current_user.save
+
+    if params[:site_color_scheme]
+      site_color_scheme_preference = current_user.preferences.find_or_create_by(:k => "site.color_scheme")
+      success &= site_color_scheme_preference.update(:v => params[:site_color_scheme])
+    end
+
+    if params[:map_color_scheme]
+      map_color_scheme_preference = current_user.preferences.find_or_create_by(:k => "map.color_scheme")
+      success &= map_color_scheme_preference.update(:v => params[:map_color_scheme])
+    end
+
+    if success
       # Use a partial so that it is rendered during the next page load in the correct language.
       flash[:notice] = { :partial => "preferences/update_success_flash" }
       redirect_to preferences_path
index fcf253289ea45ff65e11f0f30c5909146bfa1f10..5558e69fbd6819f701a6baf3addcaf78ceee0bfa 100644 (file)
@@ -1,5 +1,6 @@
 module ApplicationHelper
   require "rexml/document"
+  include SocialShareButtonHelper
 
   def linkify(text)
     if text.html_safe?
@@ -75,4 +76,32 @@ module ApplicationHelper
   rescue StandardError
     flash.inspect if Rails.env.development?
   end
+
+  # Generates a set of social share buttons based on the specified options.
+  def render_social_share_buttons(opts = {})
+    sites = opts.fetch(:allow_sites, [])
+    valid_sites, invalid_sites = SocialShareButtonHelper.filter_allowed_sites(sites)
+
+    # Log invalid sites
+    invalid_sites.each do |invalid_site|
+      Rails.logger.error("Invalid site or icon not configured: #{invalid_site}")
+    end
+
+    tag.div(
+      :class => "social-share-button d-flex gap-1 align-items-end flex-wrap mb-3"
+    ) do
+      valid_sites.map do |site|
+        link_options = {
+          :rel => ["nofollow", opts[:rel]].compact,
+          :class => "ssb-icon rounded-circle",
+          :title => I18n.t("application.share.#{site}.title"),
+          :target => "_blank"
+        }
+
+        link_to SocialShareButtonHelper.generate_share_url(site, opts), link_options do
+          image_tag(SocialShareButtonHelper.icon_path(site), :alt => I18n.t("application.share.#{site}.alt"), :size => 28)
+        end
+      end.join.html_safe
+    end
+  end
 end
index 69a8f8fa2e57eb5b76a717f98506c5f4752c33da..482503e8ae66b3c48e5be261e5974c5d66aba821 100644 (file)
@@ -1,15 +1,38 @@
 module BrowseHelper
+  def element_icon(type, object)
+    selected_icon_data = { :filename => "#{type}.svg", :priority => 1 }
+
+    unless object.redacted?
+      target_tags = object.tags.find_all { |k, _v| BROWSE_ICONS.key? k }.sort
+      title = target_tags.map { |k, v| "#{k}=#{v}" }.to_sentence unless target_tags.empty?
+
+      target_tags.each do |k, v|
+        icon_data = BROWSE_ICONS[k][v] || BROWSE_ICONS[k][:*]
+        selected_icon_data = icon_data if icon_data && icon_data[:priority] > selected_icon_data[:priority]
+      end
+    end
+
+    image_tag "browse/#{selected_icon_data[:filename]}",
+              :size => 20,
+              :class => ["align-bottom object-fit-none browse-icon", { "browse-icon-invertible" => selected_icon_data[:invert] }],
+              :title => title
+  end
+
   def element_single_current_link(type, object)
-    link_to object, { :class => element_class(type, object), :title => element_title(object), :rel => (link_follow(object) if type == "node") } do
+    link_to object, { :rel => (link_follow(object) if type == "node") } do
       element_strikethrough object do
         printable_element_name object
       end
     end
   end
 
-  def element_list_item(type, object, &block)
-    tag.li :class => element_class(type, object), :title => element_title(object) do
-      element_strikethrough object, &block
+  def element_list_item(type, object, &)
+    tag.li(tag.div(element_icon(type, object) + tag.div(:class => "align-self-center", &), :class => "d-flex gap-1"))
+  end
+
+  def element_list_item_with_strikethrough(type, object, &)
+    element_list_item type, object do
+      element_strikethrough object, &
     end
   end
 
@@ -52,20 +75,6 @@ module BrowseHelper
     end
   end
 
-  def element_class(type, object)
-    classes = [type]
-    classes += icon_tags(object).flatten.map { |t| h(t) } unless object.redacted?
-    classes.join(" ")
-  end
-
-  def element_title(object)
-    if object.redacted?
-      ""
-    else
-      h(icon_tags(object).map { |k, v| "#{k}=#{v}" }.to_sentence)
-    end
-  end
-
   def link_follow(object)
     "nofollow" if object.tags.empty?
   end
@@ -107,12 +116,6 @@ module BrowseHelper
 
   private
 
-  ICON_TAGS = %w[aeroway amenity barrier building highway historic landuse leisure man_made natural office railway shop tourism waterway].freeze
-
-  def icon_tags(object)
-    object.tags.find_all { |k, _v| ICON_TAGS.include? k }.sort
-  end
-
   def name_locales(object)
     object.tags.keys.map { |k| Regexp.last_match(1) if k =~ /^name:(.*)$/ }.flatten
   end
index e2770eb69ea5bf655866b04499708eadd70a575e..8a3a8a3eb460f2b8c550d7daeba3c99e724e48f2 100644 (file)
@@ -25,6 +25,48 @@ module UserBlocksHelper
     end
   end
 
+  def block_short_status(block)
+    if block.active?
+      if block.needs_view?
+        if block.ends_at > Time.now.utc
+          t("user_blocks.helper.short.active_unread")
+        else
+          t("user_blocks.helper.short.expired_unread")
+        end
+      else
+        t("user_blocks.helper.short.active")
+      end
+    else
+      if block.revoker_id.nil?
+        if block.updated_at > block.ends_at
+          t("user_blocks.helper.short.read_html", :time => block_short_time_in_past(block.updated_at))
+        else
+          t("user_blocks.helper.short.ended")
+        end
+      else
+        t("user_blocks.helper.short.revoked_html", :name => link_to(block.revoker.display_name, block.revoker,
+                                                                    :class => "username d-inline-block text-truncate text-wrap align-bottom",
+                                                                    :dir => "auto"))
+      end
+    end
+  end
+
+  def block_short_time_in_future(time)
+    tag.time l(time.to_date),
+             :datetime => time.xmlschema,
+             :title => t("user_blocks.helper.short.time_in_future_title",
+                         :time_absolute => l(time, :format => :friendly),
+                         :time_relative => time_ago_in_words(time))
+  end
+
+  def block_short_time_in_past(time)
+    tag.time l(time.to_date),
+             :datetime => time.xmlschema,
+             :title => t("user_blocks.helper.short.time_in_past_title",
+                         :time_absolute => l(time, :format => :friendly),
+                         :time_relative => time_ago_in_words(time, :scope => :"datetime.distance_in_words_ago"))
+  end
+
   def block_duration_in_words(duration)
     # Ensure the requested duration isn't negative, even by a millisecond
     duration = 0 if duration.negative?
index 2ab0fcf9785d6bd445cabdbdcbbc0eef77af011d..2c107236497a8a7f445d10051fbd53e4f1865ee9 100644 (file)
@@ -1,7 +1,8 @@
-<li><%= linked_name = link_to printable_element_name(containing_relation.relation), containing_relation.relation, :class => "relation"
-        if containing_relation.member_role.blank?
-          linked_name
-        else
-          t ".entry_role_html", :relation_name => linked_name, :relation_role => containing_relation.member_role
-        end %>
-</li>
+<%= element_list_item "relation", containing_relation.relation do %>
+  <%= linked_name = link_to printable_element_name(containing_relation.relation), containing_relation.relation
+      if containing_relation.member_role.blank?
+        linked_name
+      else
+        t ".entry_role_html", :relation_name => linked_name, :relation_role => containing_relation.member_role
+      end %>
+<% end %>
index 0ffe7c68b82dd01c9cbafe2ca6966295d4b8532a..52939d3a1c5587272d64ba7e42b06c96853a6be4 100644 (file)
       <% unless node.ways.empty? %>
         <details <%= "open" if node.ways.count < 10 %>>
           <summary><%= t "browse.part_of_ways", :count => node.ways.uniq.count %></summary>
-          <ul class="list-unstyled">
+          <ul class="list-unstyled browse-element-list">
             <% node.ways.uniq.each do |way| %>
-              <li><%= element_single_current_link "way", way %></li>
+              <%= element_list_item "way", way do %>
+                <%= element_single_current_link "way", way %>
+              <% end %>
             <% end %>
           </ul>
         </details>
@@ -25,7 +27,7 @@
       <% unless node.containing_relation_members.empty? %>
         <details <%= "open" if node.containing_relation_members.count < 10 %>>
           <summary><%= t "browse.part_of_relations", :count => node.containing_relation_members.uniq.count %></summary>
-          <ul class="list-unstyled">
+          <ul class="list-unstyled browse-element-list">
             <%= render :partial => "browse/containing_relation", :collection => node.containing_relation_members.uniq %>
           </ul>
         </details>
index 5dcdffa47f6cc683d657fa8ad215adf546234c7f..44706790044d6153452ad91d4b41661e15c26a56 100644 (file)
@@ -14,7 +14,7 @@
       <h4><%= t "browse.part_of" %></h4>
       <details <%= "open" if relation.containing_relation_members.count < 10 %>>
         <summary><%= t "browse.part_of_relations", :count => relation.containing_relation_members.uniq.count %></summary>
-        <ul class="list-unstyled">
+        <ul class="list-unstyled browse-element-list">
           <%= render :partial => "browse/containing_relation", :collection => relation.containing_relation_members.uniq %>
         </ul>
       </details>
@@ -24,7 +24,7 @@
       <h4><%= t ".members" %></h4>
       <details <%= "open" if relation.relation_members.count < 10 %>>
         <summary><%= t ".members_count", :count => relation.relation_members.count %></summary>
-        <ul class="list-unstyled">
+        <ul class="list-unstyled browse-element-list">
           <%= render :partial => "browse/relation_member", :collection => relation.relation_members %>
         </ul>
       </details>
index d122f0edfed8f327f2c81893a317cbfb588073d8..c00396fbd84388c31abc8f6c3374d3a7394e16de 100644 (file)
@@ -1,6 +1,6 @@
 <% linked_name = link_to printable_element_name(relation_member.member), relation_member.member, { :rel => link_follow(relation_member.member) }
    type_str = t ".type.#{relation_member.member_type.downcase}" %>
-<%= element_list_item relation_member.member_type.downcase, relation_member.member do %>
+<%= element_list_item_with_strikethrough relation_member.member_type.downcase, relation_member.member do %>
   <%= if relation_member.member_role.blank?
         t ".entry_html", :type => type_str, :name => linked_name
       else
index d04eff14030183432704277a9e07802b378c2083..9181a3e0804d7f5e5e198bfba4c27fca7b30bdf4 100644 (file)
@@ -14,7 +14,7 @@
       <h4><%= t "browse.part_of" %></h4>
       <details <%= "open" if way.containing_relation_members.count < 10 %>>
         <summary><%= t "browse.part_of_relations", :count => way.containing_relation_members.uniq.count %></summary>
-        <ul class="list-unstyled">
+        <ul class="list-unstyled browse-element-list">
           <%= render :partial => "browse/containing_relation", :collection => way.containing_relation_members.uniq %>
         </ul>
       </details>
       <h4><%= t ".nodes" %></h4>
       <details <%= "open" if way.way_nodes.count < 10 %>>
         <summary><%= t ".nodes_count", :count => way.way_nodes.count %></summary>
-        <ul class="list-unstyled">
+        <ul class="list-unstyled browse-element-list">
           <% way.way_nodes.each do |wn| %>
-            <li>
+            <%= element_list_item "node", wn.node do %>
               <%= element_single_current_link "node", wn.node %>
               <% related_ways = wn.node.ways.reject { |w| w.id == wn.way_id } %>
+              <% icon_connector = " " %>
               <% if related_ways.size > 0 then %>
                 (<%= t ".also_part_of_html",
                        :count => related_ways.size,
-                       :related_ways => to_sentence(related_ways.map { |w| element_single_current_link "way", w }) %>)
+                       :related_ways => to_sentence(related_ways.map { |w| element_icon("way", w) + icon_connector + element_single_current_link("way", w) }) %>)
               <% end %>
-            </li>
+            <% end %>
           <% end %>
         </ul>
       </details>
index fd5dd8a26a3cd16ca6aeb5fd9a9b0f47b58fdbcc..a95bed6fa3ab5d73bd55da685cbab8d5c7b9897a 100644 (file)
@@ -1,12 +1,12 @@
 <%= turbo_frame_tag "changeset_#{type.pluralize}" do %>
   <%= render :partial => "paging_nav", :locals => { :type => type, :pages => pages } %>
-  <ul class="list-unstyled" data-turbo="false">
+  <ul class="list-unstyled browse-element-list" data-turbo="false">
     <% elements.each do |element| %>
-      <%= element_list_item type, element do
-            t "printable_name.current_and_old_links_html",
+      <%= element_list_item_with_strikethrough type, element do %>
+        <%= t "printable_name.current_and_old_links_html",
               :current_link => link_to(printable_element_name(element), :controller => type.pluralize, :action => :show, :id => element.id[0]),
-              :old_link => link_to(printable_element_version(element), :controller => "old_#{type.pluralize}", :action => :show, :id => element.id[0], :version => element.version)
-          end %>
+              :old_link => link_to(printable_element_version(element), :controller => "old_#{type.pluralize}", :action => :show, :id => element.id[0], :version => element.version) %>
+      <% end %>
     <% end %>
   </ul>
 <% end %>
index 62e701d1444f8fb6bbf55d488c7e08caf27e07e0..2d8243d1b23bf68af5ca3935c175bc398ffc0c1a 100644 (file)
@@ -44,4 +44,5 @@
       <% end %>
     </ul>
   </nav>
+
 </article>
index e80a44f096005c1bdac773818bb4bc5472841feb..14b1576f0fdc9f6339f169fedddef1622e3bc44b 100644 (file)
@@ -1,3 +1,7 @@
+<% content_for :head do %>
+  <%= javascript_include_tag "social_share_button" %>
+<% end %>
+
 <% content_for :heading do %>
   <div class="row">
     <div class="col-sm-auto">
 <% end %>
 
 <%= render @entry %>
+<%= render_social_share_buttons({
+                                  :title => @entry.title,
+                                  :url => diary_entry_url(@entry.user, @entry)
+                                }) %>
 
 <div id="comments" class="comments mb-3 overflow-hidden">
   <div class="row border-bottom border-secondary-subtle">
index 3c691612ab1d4c37ec1ad7a0f8c001b334e50272..bab19c217191fb089bc1681a5e93851c3df965dd 100644 (file)
@@ -5,7 +5,11 @@
   <%= javascript_include_tag "turbo", :type => "module" %>
   <%= javascript_include_tag "application" %>
   <%= javascript_include_tag "i18n/#{I18n.locale}" %>
-  <%= stylesheet_link_tag "screen-#{dir}", :media => "screen" %>
+  <% if preferred_color_scheme(:site) == "auto" %>
+    <%= stylesheet_link_tag "screen-auto-#{dir}", :media => "screen" %>
+  <% else %>
+    <%= stylesheet_link_tag "screen-manual-#{dir}", :media => "screen" %>
+  <% end %>
   <%= stylesheet_link_tag "print-#{dir}", :media => "print" %>
   <%= stylesheet_link_tag "leaflet-all", :media => "screen, print" %>
   <%= render :partial => "layouts/meta" %>
index 7c921658d46102d54b720eb5deb57a7107f07d9b..f02f024a57a69e84905c76122f1b16ff053e8f20 100644 (file)
@@ -1,11 +1,14 @@
 <!DOCTYPE html>
-<html lang="<%= I18n.locale %>" dir="<%= dir %>">
+<%= tag.html :lang => I18n.locale,
+             :dir => dir,
+             :data => { :bs_theme => (preferred_color_scheme(:site) if preferred_color_scheme(:site) != "auto") } do %>
   <%= render :partial => "layouts/head" %>
-  <body class="<%= body_class %>">
+  <%= tag.body :class => body_class,
+               :data => { :map_theme => (preferred_color_scheme(:map) if preferred_color_scheme(:map) != "auto") } do %>
     <%= render :partial => "layouts/header" %>
     <%= render :partial => "layouts/content" %>
     <% if defined?(Settings.matomo) -%>
     <noscript><p><img src="<%= request.protocol %><%= Settings.matomo["location"] %>/matomo.php?idsite=<%= Settings.matomo["site"] %>" class="matomo" alt="" /></p></noscript>
     <% end -%>
-  </body>
-</html>
+  <% end %>
+<% end %>
diff --git a/app/views/notes/new_readonly.html.erb b/app/views/notes/new_readonly.html.erb
new file mode 100644 (file)
index 0000000..033530c
--- /dev/null
@@ -0,0 +1,7 @@
+<% set_title(t(".title")) %>
+
+<%= render "sidebar_header", :title => t(".title") %>
+
+<div class="note">
+  <p class="alert alert-warning"><%= t(".warning") %></p>
+</div>
index 07d89fbb5bcb567fe443f8ec30c11175ceffeb3f..aaf07e927e27a11b9d0a599a9ce2d4887563307d 100644 (file)
@@ -7,6 +7,22 @@
 
   <%= f.text_field :languages %>
 
+  <div class="mb-3">
+    <%= label_tag "site_color_scheme", t("preferences.show.preferred_site_color_scheme"), :class => "form-label" %>
+    <%= select_tag "site_color_scheme",
+                   options_for_select(%w[auto light dark].map { |scheme| [t("preferences.show.site_color_schemes.#{scheme}"), scheme] },
+                                      preferred_color_scheme(:site)),
+                   :class => "form-select" %>
+  </div>
+
+  <div class="mb-3">
+    <%= label_tag "map_color_scheme", t("preferences.show.preferred_map_color_scheme"), :class => "form-label" %>
+    <%= select_tag "map_color_scheme",
+                   options_for_select(%w[auto light dark].map { |scheme| [t("preferences.show.map_color_schemes.#{scheme}"), scheme] },
+                                      preferred_color_scheme(:map)),
+                   :class => "form-select" %>
+  </div>
+
   <%= f.primary t(".save") %>
   <%= link_to t(".cancel"), preferences_path, :class => "btn btn-link" %>
 <% end %>
index 7a63d0be8dadeb57514fba42b8b139b7335cce62..9bf83cbf1f0f72b846e3c43bbac278703fcef61a 100644 (file)
         <li><%= locale %></li>
       <% end %>
     </ul>
+  </dd>
 
+  <dt class="col-sm-4"><%= t ".preferred_site_color_scheme" %></dt>
+  <dd class="col-sm-8">
+    <%= t ".site_color_schemes.#{preferred_color_scheme(:site)}" %>
+  </dd>
+
+  <dt class="col-sm-4"><%= t ".preferred_map_color_scheme" %></dt>
+  <dd class="col-sm-8">
+    <%= t ".map_color_schemes.#{preferred_color_scheme(:map)}" %>
   </dd>
 </dl>
 
index 8ae1408c609babe4efe469118e6ba09130342235..cbc2ee23c0b39297c07f4aac73acd2c6121a0082 100644 (file)
@@ -6,14 +6,13 @@
   <td><%= link_to block.creator.display_name, block.creator, :class => "username d-inline-block text-truncate text-wrap", :dir => "auto" %></td>
   <% end %>
   <td><%= h truncate(block.reason) %></td>
-  <td><%= h block_status(block) %></td>
-  <td>
-    <% if block.revoker_id.nil? %>
-      <%= t(".not_revoked") %>
-    <% else %>
-      <%= link_to block.revoker.display_name, block.revoker, :class => "username d-inline-block text-truncate text-wrap", :dir => "auto" %>
-    <% end %>
-  </td>
+  <td><%= block_short_time_in_past(block.created_at) %></td>
+  <% if block.ends_at > Time.now.utc %>
+  <td><%= block_short_time_in_future(block.ends_at) %></td>
+  <% else %>
+  <td><%= block_short_time_in_past(block.ends_at) %></td>
+  <% end %>
+  <td><%= h block_short_status(block) %></td>
   <td><%= link_to t(".show"), block %></td>
   <td><% if can?(:edit, block) %><%= link_to t(".edit"), edit_user_block_path(block) %><% end %></td>
 </tr>
index 8c8557f606e358b196d170209ecbb5779947ccd1..c2e516170a2ee655c65aca2dfbaf8cca5f9967e8 100644 (file)
@@ -9,8 +9,9 @@
         <th><%= t ".creator_name" %></th>
         <% end %>
         <th><%= t ".reason" %></th>
+        <th><%= t ".start" %></th>
+        <th><%= t ".end" %></th>
         <th><%= t ".status" %></th>
-        <th><%= t ".revoker_name" %></th>
         <th></th>
         <th></th>
       </tr>
diff --git a/config/browse_icons.yml b/config/browse_icons.yml
new file mode 100644 (file)
index 0000000..f24d767
--- /dev/null
@@ -0,0 +1,186 @@
+aeroway:
+  aerodrome: { filename: "aerodrome.p.16.png" }
+
+  runway: { filename: "runway.20.png" }
+  taxiway: { filename: "taxiway.20.png" }
+
+amenity:
+  atm: { filename: "amenity_atm.16.png", invert: true }
+  bank: { filename: "amenity_bank.16.png", invert: true }
+  bar: { filename: "amenity_bar.16.png", invert: true }
+  bench: { filename: "amenity_bench.16.png", invert: true }
+  biergarten: { filename: "amenity_biergarten.16.png", invert: true }
+  bicycle_parking: { filename: "amenity_bicycle_parking.16.png" }
+  bicycle_rental: { filename: "transport_rental_bicycle.16.png" }
+  bus_station: { filename: "bus_station.n.16.png" }
+  cafe: { filename: "amenity_cafe.16.png", invert: true }
+  car_rental: { filename: "transport_rental_car.16.png" }
+  car_sharing: { filename: "car_share.p.16.png" }
+  childcare: { filename: "amenity_childcare.p.16.png" }
+  cinema: { filename: "amenity_cinema.16.png", invert: true }
+  courthouse: { filename: "amenity_courthouse.16.png", invert: true }
+  dentist: { filename: "amenity_dentist.16.png" }
+  doctors: { filename: "amenity_doctors.16.png" }
+  drinking_water: { filename: "amenity_drinking_water.16.png", invert: true }
+  fast_food: { filename: "amenity_fast_food.16.png", invert: true }
+  fire_station: { filename: "amenity_fire_station.16.png", invert: true }
+  fuel: { filename: "amenity_fuel.16.png" }
+  hospital: { filename: "amenity_hospital.16.png" }
+  kindergarten: { filename: "amenity_childcare.p.16.png" }
+  library: { filename: "library.p.16.png", invert: true }
+  nightclub: { filename: "amenity_nightclub.16.png", invert: true }
+  parking: { filename: "parking.p.16.png" }
+  pharmacy: { filename: "amenity_pharmacy.16.png" }
+  place_of_worship: { filename: "amenity_place_of_worship.16.png", invert: true }
+  police: { filename: "amenity_police.16.png", invert: true }
+  post_box: { filename: "post_box.p.16.png", invert: true }
+  post_office: { filename: "post_office.p.16.png", invert: true }
+  prison: { filename: "amenity_prison.16.png", invert: true }
+  pub: { filename: "amenity_pub.16.png", invert: true }
+  restaurant: { filename: "amenity_restaurant.16.png", invert: true }
+  recycling: { filename: "amenity_recycling.16.png", invert: true }
+  school: { filename: "education_school.p.16.png" }
+  shelter: { filename: "shelter2.p.16.png" }
+  taxi: { filename: "amenity_taxi.16.png" }
+  telephone: { filename: "telephone.p.16.png", invert: true }
+  theatre: { filename: "amenity_theatre.16.png", invert: true }
+  toilets: { filename: "amenity_toilets.16.png", invert: true }
+  townhall: { filename: "amenity_townhall.16.png", invert: true }
+  university: { filename: "education_university.p.16.png" }
+  veterinary: { filename: "health_veterinary.p.16.png" }
+  waste_basket: { filename: "amenity_waste_basket.16.png", invert: true }
+
+barrier:
+  gate: { filename: "gate2.p.16.png", invert: true }
+
+  wall: { filename: "wall.20.png" }
+
+building:
+  :*: { filename: "building.png" }
+
+highway:
+  bus_stop: { filename: "highway_bus_stop.16.png" }
+  mini_roundabout: { filename: "mini_round.p.16.png" }
+  traffic_signals: { filename: "traffic_light.png", invert: true }
+  turning_circle: { filename: "turning_circle.p.16.png" }
+
+  bridleway: { filename: "bridleway.20.png" }
+  cycleway: { filename: "cycleway.20.png" }
+  footway: { filename: "footway.20.png" }
+  motorway: { filename: "motorway.20.png" }
+  motorway_link: { filename: "motorway.20.png" }
+  path: { filename: "path.20.png" }
+  pedestrian: { filename: "service.20.png" }
+  primary: { filename: "primary.20.png" }
+  primary_link: { filename: "primary.20.png" }
+  residential: { filename: "unclassified.20.png" }
+  secondary: { filename: "secondary.20.png" }
+  secondary_link: { filename: "secondary.20.png" }
+  service: { filename: "service.20.png" }
+  tertiary: { filename: "tertiary.20.png" }
+  track: { filename: "track.20.png" }
+  trunk: { filename: "trunk.20.png" }
+  trunk_link: { filename: "trunk.20.png" }
+  unclassified: { filename: "unclassified.20.png" }
+
+historic:
+  archaeological_site: { filename: "historic_archaeological_site.16.png", invert: true }
+  castle: { filename: "tourist_castle.p.16.png", invert: true }
+  memorial: { filename: "historic_memorial.16.png", invert: true }
+  monument: { filename: "historic_monument.16.png", invert: true }
+  ruins: { filename: "tourist_ruins.p.16.png", invert: true }
+  wreck: { filename: "tourist_wreck.p.16.png", invert: true }
+
+landuse:
+  brownfield: { filename: "brownfield.png" }
+  cemetery: { filename: "cemetery.png" }
+  commercial: { filename: "commercial.png" }
+  farmland: { filename: "farmland.png" }
+  farmyard: { filename: "farmyard.png" }
+  forest: { filename: "forest.png" }
+  grass: { filename: "grass.png" }
+  industrial: { filename: "industrial.png" }
+  meadow: { filename: "meadow.png" }
+  military: { filename: "military.png" }
+  residential: { filename: "residential.png" }
+  retail: { filename: "retail.png" }
+  tourism: { filename: "tourism.png" }
+
+leisure:
+  golf_course: { filename: "golf.png" }
+  park: { filename: "park.png" }
+  picnic_table: { filename: "tourism_picnic_site.16.png", invert: true }
+  playground: { filename: "leisure_playground.16.png", invert: true }
+  pitch: { filename: "pitch.png" }
+  nature_reserve: { filename: "reserve.png" }
+  water_park: { filename: "leisure_water_park.16.png", invert: true }
+
+man_made:
+  lighthouse: { filename: "man_made_lighthouse.16.png" }
+  water_tower: { filename: "man_made_water_tower.16.png", invert: true }
+  windmill: { filename: "man_made_windmill.16.png", invert: true }
+
+natural:
+  tree: { filename: "tree.p.16.png" }
+
+  grassland: { filename: "grassland.png" }
+  heath: { filename: "heathland.png" }
+  scrub: { filename: "scrub.png" }
+  water: { filename: "lake.png" }
+  wood: { filename: "wood.png" }
+
+office:
+  diplomatic: { filename: "office_diplomatic.16.png" }
+  estate_agent: { filename: "shop_estateagent.16.png" }
+
+railway:
+  halt: { filename: "halt.p.16.png" }
+  station: { filename: "station.p.16.png" }
+  level_crossing: { filename: "level_crossing.p.16.png", invert: true }
+
+  light_rail: { filename: "light_rail.20.png" }
+  rail: { filename: "rail.20.png" }
+  subway: { filename: "subway.20.png" }
+  tram: { filename: "tram.20.png" }
+
+shop:
+  :*: { filename: "shop_convenience.p.16.png", priority: 20 }
+  alcohol: { filename: "shop_alcohol.16.png" }
+  bakery: { filename: "shop_bakery.16.png" }
+  bicycle: { filename: "shop_bicycle.16.png" }
+  books: { filename: "shop_books.16.png" }
+  butcher: { filename: "shop_butcher.p.16.png" }
+  clothes: { filename: "shop_clothes.16.png" }
+  car_parts: { filename: "shop_car_parts.16.png" }
+  car_repair: { filename: "shop_car_repair.16.png" }
+  convenience: { filename: "shop_convenience.p.16.png" }
+  doityourself: { filename: "shop_doityourself.16.png" }
+  electronics: { filename: "shop_electronics.16.png" }
+  estate_agent: { filename: "shop_estateagent.16.png" }
+  fashion: { filename: "shop_clothes.16.png" }
+  florist: { filename: "shop_florist.16.png" }
+  furniture: { filename: "shop_furniture.16.png" }
+  garden_centre: { filename: "shop_florist.16.png" }
+  gift: { filename: "shop_gift.16.png" }
+  greengrocer: { filename: "shop_greengrocer.p.16.png" }
+  hardware: { filename: "shop_doityourself.16.png" }
+  hairdresser: { filename: "shop_hairdresser.16.png" }
+  jewelry: { filename: "shop_jewelry.16.png" }
+  mobile_phone: { filename: "shop_mobile_phone.16.png" }
+  optician: { filename: "shop_optician.16.png" }
+  pet: { filename: "shop_pet.16.png" }
+  seafood: { filename: "shop_seafood.16.png" }
+  shoes: { filename: "shop_shoes.16.png" }
+  supermarket: { filename: "shop_supermarket.p.16.png" }
+
+tourism:
+  alpine_hut: { filename: "tourism_alpine_hut.16.png" }
+  camp_site: { filename: "tourism_camp_site.16.png" }
+  caravan_site: { filename: "tourism_caravan_site.16.png" }
+  hostel: { filename: "tourism_hostel.16.png" }
+  hotel: { filename: "tourism_hotel.16.png" }
+  motel: { filename: "tourism_motel.16.png" }
+  museum: { filename: "tourism_museum.16.png", invert: true }
+  picnic_site: { filename: "tourism_picnic_site.16.png", invert: true }
+  viewpoint: { filename: "view_point.p.16.png", invert: true }
+  wilderness_hut: { filename: "tourism_wilderness_hut.16.png" }
diff --git a/config/initializers/browse_icons.rb b/config/initializers/browse_icons.rb
new file mode 100644 (file)
index 0000000..a55df97
--- /dev/null
@@ -0,0 +1,13 @@
+begin
+  BROWSE_ICONS = YAML.load_file(Rails.root.join("config/browse_icons.yml")).transform_values do |tag_key_data|
+    transformed_tag_key_data = {}
+    tag_key_data.each do |tag_value, tag_value_data|
+      tag_value_data = tag_value_data.deep_symbolize_keys
+      tag_value_data[:priority] ||= tag_value == :* ? 10 : 100
+      transformed_tag_key_data[tag_value] = tag_value_data
+    end
+    transformed_tag_key_data
+  end
+rescue StandardError
+  BROWSE_ICONS = {}.freeze
+end
index 3b5bc944fe14a2c321cd86cf36e8d491edbbda07..4f883cc9403eea879eaad8128882e27e2d04b31f 100644 (file)
@@ -1,6 +1,6 @@
 - leafletOsmId: "Mapnik"
   code: "M"
-  keyId: "mapnik"
+  layerId: "mapnik"
   nameId: "standard"
   credit:
     id: "make_a_donation"
@@ -9,7 +9,7 @@
 
 - leafletOsmId: "CyclOSM"
   code: "Y"
-  keyId: "cyclosm"
+  layerId: "cyclosm"
   nameId: "cyclosm"
   credit:
     id: "cyclosm_credit"
@@ -23,7 +23,7 @@
 
 - leafletOsmId: "CycleMap"
   code: "C"
-  keyId: "cyclemap"
+  layerId: "cyclemap"
   nameId: "cycle_map"
   apiKeyId: "THUNDERFOREST_KEY"
   credit:
@@ -35,7 +35,7 @@
 
 - leafletOsmId: "TransportMap"
   code: "T"
-  keyId: "transportmap"
+  layerId: "transportmap"
   nameId: "transport_map"
   apiKeyId: "THUNDERFOREST_KEY"
   credit:
@@ -47,7 +47,7 @@
 
 - leafletOsmId: "TracestrackTopo"
   code: "P"
-  keyId: "tracestracktopo"
+  layerId: "tracestracktopo"
   nameId: "tracestracktop_topo"
   apiKeyId: "TRACESTRACK_KEY"
   credit:
@@ -59,7 +59,7 @@
 
 - leafletOsmId: "HOT"
   code: "H"
-  keyId: "hot"
+  layerId: "hot"
   nameId: "hot"
   credit:
     id: "hotosm_credit"
index 7c7cdcb689b495285933161891601615ceae49aa..1d99104a34dcbc7debb62f8c78a4cadf8ee01cdd 100644 (file)
@@ -1284,7 +1284,6 @@ af:
         other: '%{count} verslae'
       reported_item: Gerapporteerde item
     show:
-      title: '%{status} Probleem #%{issue_id}'
       report_created_at_html: Eerste vermelding op %{datetime}
       last_resolved_at_html: Laas geregmaak op %{datetime}
       last_updated_at_html: Laaste opgedateer op %{datetime} deur %{displayname}
@@ -1930,7 +1929,6 @@ af:
       reason: 'Rede agter die versperring:'
       revoker: 'Herroep deur:'
     block:
-      not_revoked: (nie herroep nie)
       show: Wys
       edit: Redigeer
     page:
@@ -1938,7 +1936,6 @@ af:
       creator_name: Skepper
       reason: Rede vir die versperring
       status: Status
-      revoker_name: Herroep deur
   notes:
     index:
       heading: Notas van %{user}
index 91784f1873de0ffa7282b0368e2ddb2f943b1ef7..0081760c9408f793e8e4da64f1adfaa908b027fb 100644 (file)
@@ -1114,7 +1114,6 @@ aln:
       reason: 'Arsyeja për bllok:'
       revoker: 'Revoker:'
     block:
-      not_revoked: (Jo revokuar)
       show: Tregoj
       edit: Redaktoj
     page:
@@ -1122,7 +1121,6 @@ aln:
       creator_name: Krijuesi
       reason: Arsyeja për bllok
       status: Statusi
-      revoker_name: Revokuar nga ana
   notes:
     notes_paging_nav:
       showing_page: Tu e shfaq faqen %{page}
index ee85a6bf119016bb0138a5685b774ea9c0fdf0af..ef001f88aa7e6998cba9dd1add8a83f15a01a88d 100644 (file)
@@ -31,6 +31,7 @@
 # Author: McDutchie
 # Author: Meno25
 # Author: Mido
+# Author: Mohammed Qays
 # Author: Mohammed Qubati
 # Author: Mutarjem horr
 # Author: NEHAOUA
@@ -105,6 +106,7 @@ ar:
       message: الرسالة
       node: عقدة
       node_tag: وسم عقدة
+      note: ملاحظة
       old_node: عقدة قديمة
       old_node_tag: وسم عقدة قديمة
       old_relation: علاقة قديمة
@@ -450,7 +452,7 @@ ar:
         way: طريق
         relation: علاقة
     containing_relation:
-      entry_role_html: العلاقة %{relation_name} (كــ%{relation_role})
+      entry_role_html: '%{relation_name} (مثل %{relation_role})'
     not_found:
       title: لم يتم العثور عليه
       sorry: 'عفوًا، تعذر العثور على %{type} #%{id}.'
@@ -1493,7 +1495,6 @@ ar:
         other: '%{count} بلاغ'
       reported_item: شيء تم الابلاغ عنه
     show:
-      title: '%{status} المشكلة #%{issue_id}'
       reports:
         zero: صفر تقرير
         one: تقرير واحد
@@ -2589,7 +2590,6 @@ ar:
       reason: 'سبب العرقلة:'
       revoker: 'المبطل:'
     block:
-      not_revoked: (لم تلغ)
       show: اعرض
       edit: تعديل
     page:
@@ -2597,7 +2597,6 @@ ar:
       creator_name: المنشئ
       reason: السبب العرقلة
       status: الحالة
-      revoker_name: مُبطل بواسطة
   user_mutes:
     index:
       title: المستخدمون الممنوعون
index 1cfd348d396821b592f8567aca475a9186837534..a983f1b8b917eb98a9df872d50048230a16ba7ee 100644 (file)
@@ -131,7 +131,7 @@ arz:
         way: طريق
         relation: علاقة
     containing_relation:
-      entry_role_html: العلاقه %{relation_name} (كــ %{relation_role})
+      entry_role_html: '%{relation_name} (كــ %{relation_role})'
     not_found:
       sorry: عفوًا، لم يتم العثور على %{type} بالمعرّف %{id}.
       type:
@@ -944,7 +944,6 @@ arz:
       reason: 'سبب العرقلة:'
       revoker: 'المبطل:'
     block:
-      not_revoked: (لم تلغ)
       show: اعرض
       edit: عدّل
     page:
@@ -952,7 +951,6 @@ arz:
       creator_name: المنشئ
       reason: السبب للعرقلة
       status: الحالة
-      revoker_name: مُبطل بواسطة
   notes:
     notes_paging_nav:
       showing_page: الصفحه %{page}
index b25bfd269a037180a0f89c0f5f0f97d238836344..90bebd8699f45ba5afd237ce83b305cec7eb9474 100644 (file)
@@ -1106,7 +1106,6 @@ ast:
         other: '%{count} Informes'
       reported_item: Elementu reportáu
     show:
-      title: '%{status} Problema #%{issue_id}'
       reports:
         zero: Nun hai informes
         one: 1 informe
@@ -1990,7 +1989,6 @@ ast:
       reason: 'Motivu del bloquéu:'
       revoker: 'Desaniciador:'
     block:
-      not_revoked: (non desaniciáu)
       show: Amosar
       edit: Editar
     page:
@@ -1998,7 +1996,6 @@ ast:
       creator_name: Creador
       reason: Motivu del bloquéu
       status: Estáu
-      revoker_name: Desaniciáu por
   notes:
     index:
       title: Notes unviaes o comentaes por %{user}
index f74e4dbc9b18348c7baba5e110c17bbbf8e64eb4..af7d0bb62b2e48a1676f97657221c631b3430d42 100644 (file)
@@ -40,7 +40,7 @@ az:
         update: Dəyişiklikləri yadda saxla
       user_block:
         create: Blok yarat
-        update: Bloku yenilən
+        update: Bloku yenilə
   activerecord:
     models:
       acl: Giriş Məhdudiyyətləri siyahısı
@@ -1041,7 +1041,6 @@ az:
       title: '%{block_on}, %{block_by} tərəfindən blok edilib'
       status: Status
     block:
-      not_revoked: (ləgv edilməyib)
       show: Göstər
       edit: Redaktə et
     page:
@@ -1049,7 +1048,6 @@ az:
       creator_name: Yaradıcı
       reason: Bloklanma səbəbi
       status: Status
-      revoker_name: Tərəfindən ləgv edilib
   notes:
     show:
       description: Təsvir
index d097f80accb980542c4e5acbc5c4df4b4bb5a1d2..aa273e8768de7a53adadf3e42d906cd25529301d 100644 (file)
@@ -1497,7 +1497,6 @@ ba:
         open: Асыҡ
         resolved: Хәл ителде
     show:
-      title: '%{status} Мәсьәлә #%{issue_id}'
       reports:
         one: '%{count} хәбәр'
         other: '%{count} хәбәрҙәр'
index b87ac1252de0adf91135406cc08cd8469958e7fd..6bb1f970b0eb1522ada756a458de26a439f21622 100644 (file)
@@ -1393,7 +1393,6 @@ be-Tarask:
       reason: 'Прычына блякаваньня:'
       revoker: 'Адклікаўшы:'
     block:
-      not_revoked: (не адкліканае)
       show: Паказаць
       edit: Рэдагаваць
     page:
@@ -1401,7 +1400,6 @@ be-Tarask:
       creator_name: Стваральнік
       reason: Прычына блякаваньня
       status: Статус
-      revoker_name: Адкліканае
   notes:
     show:
       title: 'Нататка: %{id}'
index b722d3745854354cd14ecb4908e222edfa83ff7f..f63aefc9dbe0e0330ed8709052a908b40dc1ee4a 100644 (file)
@@ -1560,7 +1560,6 @@ be:
         other: '%{count} скаргі(-аў)'
       reported_item: Скарга
     show:
-      title: '%{status} Праблема #%{issue_id}'
       reports:
         one: '%{count} скарга'
         few: '%{count} скаргі'
@@ -2729,7 +2728,6 @@ be:
       reason: 'Прычына блакіроўкі:'
       revoker: 'Адклікаўшы:'
     block:
-      not_revoked: (не адкліканы)
       show: Паказаць
       edit: Рэдагаваць
     page:
@@ -2737,7 +2735,6 @@ be:
       creator_name: Стваральнік
       reason: Прычына блакіроўкі
       status: Статус
-      revoker_name: Адкліканы
   user_mutes:
     index:
       table:
index 2cb7d4afb3b28585158309020ccd9dcd86369f55..8b475353f12061d69785c66778528dfbf746b022 100644 (file)
@@ -1147,7 +1147,6 @@ bg:
         other: '%{count} доклада'
       reported_item: Докладван елемент
     show:
-      title: '%{status} Проблем #%{issue_id}'
       reports:
         one: '%{count} доклад'
         other: '%{count} доклада'
index dea9d56dd4287025fb3f99de050cf9b7a4ab9cc4..cdf6d44cf596c14cca2532c555065ba0f5df46ea 100644 (file)
@@ -1494,7 +1494,6 @@ br:
         open: Digor
         resolved: Diskoulmet
     show:
-      title: '%{status} Kudenn #%{issue_id}'
       reports:
         one: 1 danevell
         two: 2 zanevell
@@ -2788,7 +2787,6 @@ br:
       reason: 'Abeg ar stankadur :'
       revoker: 'Torrer :'
     block:
-      not_revoked: (n'eo ket torret)
       show: Diskouez
       edit: Aozañ
     page:
@@ -2796,7 +2794,6 @@ br:
       creator_name: Krouer
       reason: Abeg evit stankañ
       status: Statud
-      revoker_name: Torret gant
     navigation:
       all_blocks: An holl stankadurioù
       blocks_on_me: Stankadurioù evidon
index cd7607a916cc93d9bc844fb03f8579fbb49c5769..c34b08750743d2b73235267af6efeeac514f4c96 100644 (file)
@@ -1397,7 +1397,6 @@ bs:
       reason: Razlog za blokadu
       revoker: 'Opozivalac:'
     block:
-      not_revoked: (nije opozvano)
       show: Pokazati
       edit: Urediti
     page:
@@ -1405,7 +1404,6 @@ bs:
       creator_name: Kreator
       reason: Razlog za blokadu
       status: Stanje
-      revoker_name: Opozvano od strane
   notes:
     index:
       id: Id
index 9322319b979640cc2a94699b8eec516be14004c8..3fede6bc56d25262f5b042677fcc518797fef93e 100644 (file)
@@ -1458,7 +1458,6 @@ ca:
         other: '%{count} Informes'
       reported_item: Element denunciat
     show:
-      title: '%{status} Incidència #%{issue_id}'
       reports:
         one: '%{count} informe'
         other: '%{count} informes'
@@ -2807,7 +2806,6 @@ ca:
       reason: 'Motiu del blocatge:'
       revoker: 'Revoker:'
     block:
-      not_revoked: (no revocat)
       show: Mostra
       edit: Edita
     page:
@@ -2815,7 +2813,6 @@ ca:
       creator_name: Creador
       reason: Motiu del blocatge
       status: Estat
-      revoker_name: Revocat per
     navigation:
       all_blocks: Tots els bloquejos
       blocks_on_me: Bloquejos a mi
index c8ae5a52fa26d1e8e520afa125e66d5a3bb033b6..e3fa5a6124c736114995fa23af0dc440b87deb46 100644 (file)
@@ -1493,7 +1493,6 @@ ce:
         open: Йиллина
         resolved: Кечйина
     show:
-      title: '%{status} проблема #%{issue_id}'
       reports:
         one: '%{count} хаам'
         other: '%{count} хаамаш'
@@ -2938,7 +2937,6 @@ ce:
       reason: 'Блоктохаран бахьана:'
       revoker: 'БлокдӀайаьккхинарг:'
     block:
-      not_revoked: (блок дIа ца йаьккхина)
       show: Гайта
       edit: Нисйан
     page:
@@ -2946,7 +2944,6 @@ ce:
       creator_name: Автор
       reason: Блоктохаран бахьана
       status: Статус
-      revoker_name: ДӀайаьккхина блок
     navigation:
       all_blocks: Ерриге а блокаш
       blocks_on_me: Сан блоктохарш
index 79489fdce65982647cd51989c12acf24029c76df..fca91575a102f95eeaf4f91cc19f16a70618221d 100644 (file)
@@ -106,6 +106,7 @@ cs:
       message: Zpráva
       node: Uzel
       node_tag: Tag uzlu
+      note: Poznámka
       old_node: Starý uzel
       old_node_tag: Tag starého uzlu
       old_relation: Stará relace
@@ -1586,7 +1587,6 @@ cs:
         open: Otevřeno
         resolved: Vyřešeno
     show:
-      title: '%{status} Problém #%{issue_id}'
       reports:
         one: '%{count} hlášení'
         few: '%{count} hlášení'
@@ -3069,7 +3069,6 @@ cs:
       reason: 'Důvod bloku:'
       revoker: 'Zrušil:'
     block:
-      not_revoked: (nezrušeno)
       show: Zobrazit
       edit: Upravit
     page:
@@ -3077,7 +3076,6 @@ cs:
       creator_name: Autor
       reason: Důvod pro blok
       status: Stav
-      revoker_name: Zrušil
     navigation:
       all_blocks: Všechny bloky
       blocks_on_me: Moje zablokování
index 8116b511e3c0360b6e1574759bcd1dd60350c8fb..9fb4f10d2488a75abeebeb07746881a814b8f158 100644 (file)
@@ -60,6 +60,7 @@ cy:
       message: Neges
       node: Nod
       node_tag: Tag Nod
+      note: Nodyn
       old_node: Hen Nod
       old_node_tag: Tag Hen Nod
       old_relation: Hen Berthynas
@@ -366,7 +367,7 @@ cy:
     no_comment: (dim sylw)
     part_of: Rhan o
     part_of_relations:
-      zero: '%{count} perthnasoedd'
+      zero: '%{count} perthnasau'
       one: '%{count} perthynas'
       two: '%{count} berthynas'
       few: '%{count} pherthynas'
@@ -425,7 +426,7 @@ cy:
         way: Llwybr
         relation: Perthynas
     containing_relation:
-      entry_role_html: Perthynas %{relation_name} (fel %{relation_role})
+      entry_role_html: '%{relation_name} (fel %{relation_role})'
     not_found:
       title: Heb ei Ganfod
       sorry: 'Ymddiheurwn, ni ellir canfod %{type} #%{id}.'
@@ -570,8 +571,8 @@ cy:
       nodes_paginated: Nodau (%{x}-%{y} o %{count})
       ways: Llwybrau (%{count})
       ways_paginated: Llwybrau (%{x}-%{y} o %{count})
-      relations: Perthnasoedd (%{count})
-      relations_paginated: Perthnasoedd (%{x}-%{y} o %{count})
+      relations: Perthnasau (%{count})
+      relations_paginated: Perthnasau (%{x}-%{y} o %{count})
     timeout:
       sorry: Mae'n ddrwg gennym, cymerodd y rhestr o grwpiau newid y gofynnoch amdanynt
         rhy hir i'w hadalw.
@@ -1555,7 +1556,10 @@ cy:
         open: Agored
         resolved: Wedi datrys
     show:
-      title: '%{status} Gwall #%{issue_id}'
+      title:
+        open: 'Mater agored #%{issue_id}'
+        ignored: 'Mater wedi''i anwybyddu #%{issue_id}'
+        resolved: 'Mater wedi''i ddatrys #%{issue_id}'
       reports:
         zero: '%{count} adroddiad'
         one: '%{count} adroddiad'
@@ -1911,6 +1915,16 @@ cy:
       title: Dewisiadau
       preferred_editor: Hoff Olygydd
       preferred_languages: Ieithoedd
+      preferred_site_color_scheme: Dewis Lliw Gwefan
+      site_color_schemes:
+        auto: Awtomatig
+        light: Golau
+        dark: Tywyll
+      preferred_map_color_scheme: Dewis Lliw Map
+      map_color_schemes:
+        auto: Awtomatig
+        light: Golau
+        dark: Tywyll
       edit_preferences: Golygu Dewisiadau
     edit:
       title: Golygu Dewisiadau
@@ -2894,6 +2908,9 @@ cy:
           few: '%{count} blynedd'
           many: '%{count} blynedd'
           other: '%{count} blynedd'
+      short:
+        time_in_future_title: '%{time_absolute}; ymhen %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Blociau ar %{name}
       heading_html: Rhestr Blociau ar %{name}
@@ -2912,15 +2929,15 @@ cy:
       reason: 'Rheswm dros y bloc:'
       revoker: 'Dad-flociwr:'
     block:
-      not_revoked: (heb ei ddirymu)
       show: Dangos
       edit: Golygu
     page:
       display_name: Defnyddiwr wedi'i blocio
       creator_name: Crëwr
       reason: Rheswm dros flocio
+      start: Dechrau
+      end: Diwedd
       status: Statws
-      revoker_name: Dirymwyd gan
     navigation:
       all_blocks: Pob Bloc
       blocks_on_me: Blociau arnaf i
index e816a6ebcd9b21886d7544e7acf9b6d30a0dd239..9e136347ec4d4e4fa2485f09c979cbaa26694855 100644 (file)
@@ -84,11 +84,12 @@ da:
       diary_comment: Blogkommentar
       diary_entry: Blogindlæg
       friend: Ven
-      issue: Problem
+      issue: Sag
       language: Sprog
       message: Meddelelse
       node: Punkt
       node_tag: Punktegenskab
+      note: Bemærkning
       old_node: Tidligere punkt
       old_node_tag: Tidligere punktegenskab
       old_relation: Tidligere relation
@@ -1506,7 +1507,7 @@ da:
       more_results: Flere resultater
   issues:
     index:
-      title: Problemer
+      title: Sager
       select_status: Vælg status
       select_type: Vælg type
       select_last_updated_by: Vælg sidst opdateret af
@@ -1516,7 +1517,7 @@ da:
       search_guidance: 'Søgning blandt sager:'
       states:
         ignored: Ignoréret
-        open: Åbn
+        open: Åben
         resolved: Løst
     page:
       user_not_found: Brugeren findes ikke
@@ -1535,7 +1536,10 @@ da:
         open: Åben
         resolved: Løst
     show:
-      title: '%{status} Sag #%{issue_id}'
+      title:
+        open: Åben sag %{issue_id}
+        ignored: 'Ignoreret sag #%{issue_id}'
+        resolved: Løst sag %{issue_id}
       reports:
         one: '%{count} rapport'
         other: '%{count} rapporter'
@@ -1618,7 +1622,7 @@ da:
     edit: Redigér
     history: Historik
     export: Eksportér
-    issues: Problemer
+    issues: Sager
     gps_traces: GPS-spor
     user_diaries: Brugerblogs
     edit_with: Redigér med %{editor}
@@ -1924,6 +1928,16 @@ da:
       title: Mine præferencer
       preferred_editor: Foretrukken editor
       preferred_languages: Foretrukne sprog
+      preferred_site_color_scheme: Foretrukket farvetema for webside
+      site_color_schemes:
+        auto: Auto
+        light: Lyst
+        dark: Mørkt
+      preferred_map_color_scheme: Foretrukket farvetema for kort
+      map_color_schemes:
+        auto: Auto
+        light: Lyst
+        dark: Mørkt
       edit_preferences: Rediger præferencer
     edit:
       title: Rediger præferencer
@@ -2008,8 +2022,8 @@ da:
         older: Ældre indlæg
         newer: Nyere indlæg
       issues:
-        older: Ældre problemer
-        newer: Nyere problemer
+        older: Ældre sager
+        newer: Nyere sager
       traces:
         older: Ældre spor
         newer: Nyere spor
@@ -2982,6 +2996,15 @@ da:
         years:
           one: '%{count} år'
           other: '%{count} år'
+      short:
+        ended: ophørt
+        revoked_html: ophævet af %{name}
+        active: aktiv
+        active_unread: aktiv ulæst
+        expired_unread: udløbet ulæst
+        read_html: læst %{time}
+        time_in_future_title: '%{time_absolute}; om %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Blokeringer af %{name}
       heading_html: Liste over blokeringer af %{name}
@@ -3000,15 +3023,15 @@ da:
       reason: 'Årsag til blokering:'
       revoker: 'Tilbagekalder:'
     block:
-      not_revoked: (ikke tilbagekaldt)
       show: Vis
       edit: Redigér
     page:
       display_name: Blokkeret bruger
       creator_name: Oprettet af
       reason: Årsag til blokering
+      start: Start
+      end: Slut
       status: Status
-      revoker_name: Tilbagekaldt af
     navigation:
       all_blocks: Alle blokeringer
       blocks_on_me: Blokeringer af mig
index ec05952589faf8706864a96d3afb599b56b4e076..6202a187538b708c16a41ce08459975e2a7f8328 100644 (file)
@@ -79,6 +79,7 @@
 # Author: Milet
 # Author: Mormegil
 # Author: Nadjita
+# Author: Nielkrokodil
 # Author: Onefloid
 # Author: P24
 # Author: Pczaja
@@ -1633,7 +1634,6 @@ de:
         open: Offen
         resolved: Erledigt
     show:
-      title: '%{status} Problem Nr. %{issue_id}'
       reports:
         one: Eine Meldung
         other: '%{count} Meldungen'
@@ -2579,7 +2579,7 @@ de:
           tunnel: Gestrichelter Rand = Tunnel
           bridge: Schwarzer Rand = Brücke
           private: Privater Zugang
-          destination: Nur für Anrainer
+          destination: Nur Zufahrt gestattet
           construction: Straßen im Bau
           bus_stop: Bushaltestelle
           bicycle_shop: Fahrradladen
@@ -3160,7 +3160,6 @@ de:
       reason: 'Grund der Sperre:'
       revoker: 'Aufgehoben von:'
     block:
-      not_revoked: (nicht aufgehoben)
       show: Anzeigen
       edit: Bearbeiten
     page:
@@ -3168,7 +3167,6 @@ de:
       creator_name: Urheber
       reason: Grund der Sperre
       status: Status
-      revoker_name: Aufgehoben von
     navigation:
       all_blocks: Alle Sperren
       blocks_on_me: Meine Sperren
index 73bdfb705f3138a39cc6c30134ecd18cb35a25f9..49369bc9f974056c4ad5befccedf333e59fb74b2 100644 (file)
@@ -1076,14 +1076,12 @@ diq:
       edit: Bıvurne
       revoker: 'Terkner:'
     block:
-      not_revoked: (nê terkiyayo)
       show: Bımocne
       edit: Bıvurne
     page:
       display_name: Karberê kılitbiyayey
       creator_name: Vıraştoğ
       status: Weziyet
-      revoker_name: Terknoğ
   notes:
     index:
       description: Şınasnayış
index 1d7db4aa17be1eb8c2ad4ee5b0b886ee039afbea..5c29dfc864513acdd87e7c8fa6a656cf1483865c 100644 (file)
@@ -1547,7 +1547,6 @@ dsb:
       reason: 'Pśicyna za blokěrowanje:'
       revoker: 'Anulěrowaŕ:'
     block:
-      not_revoked: (nic wótpórany)
       show: Pokazaś
       edit: Wobźěłaś
     page:
@@ -1555,7 +1554,6 @@ dsb:
       creator_name: Blokěrowaŕ
       reason: Pśicyna za blokěrowanje
       status: Status
-      revoker_name: Wótpórany wót
   notes:
     index:
       title: Pokazki, kótarež su se wót %{user} dali abo komentěrowali
index 465f9fd9a49a750836c47b161add956ac261443a..a4b77ecd2cc92bf9e3fc24916f79b2bd3fb619b7 100644 (file)
@@ -100,6 +100,7 @@ el:
       message: Μήνυμα
       node: Κόμβος
       node_tag: Ετικέτα κόμβου
+      note: Σημείωση
       old_node: Παλαιός κόμβος
       old_node_tag: Παλαιά ετικέτα κόμβου
       old_relation: Παλαιά σχέση
@@ -414,7 +415,7 @@ el:
         way: Γραμμή
         relation: Σχέση
     containing_relation:
-      entry_role_html: Σχέση %{relation_name} (ως %{relation_role})
+      entry_role_html: '%{relation_name} (ως %{relation_role})'
     not_found:
       title: Δεν βρέθηκε
       sorry: 'Λυπάμαι, το %{type} #%{id} δεν βρέθηκε.'
@@ -1571,7 +1572,10 @@ el:
         open: Ανοιχτό
         resolved: Επιλυμένο
     show:
-      title: '%{status} Ζήτημα #%{issue_id}'
+      title:
+        open: 'Ανοιχτό ζήτημα #%{issue_id}'
+        ignored: 'Αγνοημένο ζήτημα #%{issue_id}'
+        resolved: 'Επιλυμένο ζήτημα #%{issue_id}'
       reports:
         one: '%{count} αναφορά'
         other: '%{count} αναφορές'
@@ -1974,6 +1978,16 @@ el:
       title: Οι προτιμήσεις μου
       preferred_editor: Προτιμώμενος επεξεργαστής
       preferred_languages: Προτιμώμενες γλώσσες
+      preferred_site_color_scheme: Προτιμώμενος συνδυασμός χρωμάτων ιστότοπου
+      site_color_schemes:
+        auto: Αυτόματο
+        light: Φωτεινό
+        dark: Σκοτεινό
+      preferred_map_color_scheme: Προτιμώμενος συνδυασμός χρωμάτων χάρτη
+      map_color_schemes:
+        auto: Αυτόματο
+        light: Φωτεινό
+        dark: Σκοτεινό
       edit_preferences: Επεξεργασία προτιμήσεων
     edit:
       title: Επεξεργασία προτιμίσεων
@@ -3066,6 +3080,15 @@ el:
         years:
           one: '%{count} χρόνος'
           other: '%{count} χρόνια'
+      short:
+        ended: τελείωσε
+        revoked_html: ανακλήθηκε από %{name}
+        active: ενεργή
+        active_unread: ενεργή μη αναγνωσμένη
+        expired_unread: έληξε μη αναγνωσμένη
+        read_html: διαβάστηκε στις %{time}
+        time_in_future_title: '%{time_absolute}; σε %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Φραγές στον %{name}
       heading_html: Κατάλογος φραγών στον %{name}
@@ -3084,15 +3107,15 @@ el:
       reason: 'Αιτία φραγής:'
       revoker: 'Έκανε την ανάκληση:'
     block:
-      not_revoked: (δεν έχει ανακληθεί)
       show: Εμφάνιση
       edit: Επεξεργασία
     page:
       display_name: Αποκλεισμένος Χρήστης
       creator_name: Δημιουργός
       reason: Αιτία φραγής
+      start: Έναρξη
+      end: Τέλος
       status: Κατάσταση
-      revoker_name: Ανακλήθηκε από
     navigation:
       all_blocks: Όλες οι φραγές
       blocks_on_me: Φραγές σε μένα
index 9d4d1c4a4467c39d48cff079db5645687852bd77..5dbdabe23fdc420b3694dc4b9c1a50714fbaad8c 100644 (file)
@@ -1767,7 +1767,6 @@ en-GB:
       reason: 'Reason for block:'
       revoker: 'Revoker:'
     block:
-      not_revoked: (not revoked)
       show: Show
       edit: Edit
     page:
@@ -1775,7 +1774,6 @@ en-GB:
       creator_name: Creator
       reason: Reason for block
       status: Status
-      revoker_name: Revoked by
   notes:
     index:
       title: Notes submitted or commented on by %{user}
index 89686d4e3b8229cad819739fb08bd7d2f8481ffd..16bef0bd0919a0a803b4f19dc49b34032be835b2 100644 (file)
@@ -1001,6 +1001,14 @@ en:
           wayside_shrine: "Wayside Shrine"
           wreck: "Wreck"
           "yes": "Historic Site"
+        information:
+          guidepost: "Guidepost"
+          board: "Information Board"
+          map: "Map"
+          office: "Tourist Office"
+          terminal: "Information Terminal"
+          sign: "Information Sign"
+          stele: "Information Stele"
         junction:
           "yes": "Junction"
         landuse:
@@ -1073,6 +1081,8 @@ en:
           track: "Running Track"
           water_park: "Water Park"
           "yes": "Leisure"
+        lock:
+          "yes": "Lock"
         man_made:
           adit: "Adit"
           advertising: "Advertising"
@@ -1413,6 +1423,17 @@ en:
           building_passage: "Building Passage"
           culvert: "Culvert"
           "yes": "Tunnel"
+        water:
+          lake: "Lake"
+          pond: "Pond"
+          reservoir: "Reservoir"
+          basin: "Water basin"
+          fishpond: "Fish Pond"
+          lagoon: "Lagoon"
+          wastewater: "Waste Water"
+          oxbow: "Oxbow"
+          stream_pool: "Stream Pool"
+          lock: "Lock"
         waterway:
           artificial: "Artificial Waterway"
           boatyard: "Boatyard"
@@ -1810,6 +1831,16 @@ en:
       title: My Preferences
       preferred_editor: Preferred Editor
       preferred_languages: Preferred Languages
+      preferred_site_color_scheme: Preferred Website Color Scheme
+      site_color_schemes:
+        auto: Auto
+        light: Light
+        dark: Dark
+      preferred_map_color_scheme: Preferred Map Color Scheme
+      map_color_schemes:
+        auto: Auto
+        light: Light
+        dark: Dark
       edit_preferences: Edit Preferences
     edit:
       title: Edit Preferences
@@ -2597,6 +2628,25 @@ en:
       wikipedia:
         title: Log in with Wikipedia
         alt: Wikipedia logo
+    share:
+      email:
+        title: Share via Email
+        alt: Email icon
+      facebook:
+        title: Share via Facebook
+        alt: Facebook Icon
+      linkedin:
+        title: Share via LinkedIn
+        alt: LinkedIn Icon
+      mastodon:
+        title: Share on Mastodon
+        alt: Mastodon Icon
+      telegram:
+        title: Share on Telegram
+        alt: Telegram Icon
+      x:
+        title: Share on X
+        alt: X Icon
   oauth:
     permissions:
       missing: "You have not permitted the application access to this facility"
@@ -2900,6 +2950,15 @@ en:
         years:
           one: "%{count} year"
           other: "%{count} years"
+      short:
+        ended: "ended"
+        revoked_html: "revoked by %{name}"
+        active: "active"
+        active_unread: "active unread"
+        expired_unread: "expired unread"
+        read_html: "read at %{time}"
+        time_in_future_title: "%{time_absolute}; in %{time_relative}"
+        time_in_past_title: "%{time_absolute}; %{time_relative}"
     blocks_on:
       title: "Blocks on %{name}"
       heading_html: "List of Blocks on %{name}"
@@ -2918,15 +2977,15 @@ en:
       reason: "Reason for block:"
       revoker: "Revoker:"
     block:
-      not_revoked: "(not revoked)"
       show: "Show"
       edit: "Edit"
     page:
       display_name: "Blocked User"
       creator_name: "Creator"
       reason: "Reason for block"
+      start: "Start"
+      end: "End"
       status: "Status"
-      revoker_name: "Revoked by"
     navigation:
       all_blocks: "All Blocks"
       blocks_on_me: "Blocks on Me"
@@ -3015,6 +3074,9 @@ en:
       anonymous_warning_sign_up: "sign up"
       advice: "Your note is public and may be used to update the map, so don't enter personal information, or information from copyrighted maps or directory listings."
       add: Add Note
+    new_readonly:
+      title: "New Note"
+      warning: "New notes cannot be created because the OpenStreetMap API is currently in read-only mode."
     notes_paging_nav:
       showing_page: "Page %{page}"
       next: "Next"
index 4489a540fbde9323c4707595b2a5c7d518fdf80e..497bfcd3c21aed75b59e52ac660c861d6fa6c05d 100644 (file)
@@ -81,6 +81,7 @@ eo:
       message: Mesaĝo
       node: Nodo
       node_tag: Etikedo de nodo
+      note: Rimarko
       old_node: Malnova nodo
       old_node_tag: Etikedo de malnova nodo
       old_relation: Malnova rilato
@@ -386,7 +387,7 @@ eo:
         way: Linio
         relation: Rilato
     containing_relation:
-      entry_role_html: Rilato %{relation_name} (kiel %{relation_role})
+      entry_role_html: '%{relation_name} (kiel %{relation_role})'
     not_found:
       title: Ne trovita
       sorry: Bedaŭrinde la %{type} kun id %{id} ne troveblas.
@@ -1528,7 +1529,10 @@ eo:
         open: Malfermita
         resolved: Solvita
     show:
-      title: '%{status} problemo #%{issue_id}'
+      title:
+        open: 'Malfermita problemo #%{issue_id}'
+        ignored: 'Ignorita problemo #%{issue_id}'
+        resolved: 'Solvita problemo #%{issue_id}'
       reports:
         one: '%{count} raporto'
         other: '%{count} raportoj'
@@ -1780,7 +1784,7 @@ eo:
       button: Konfirmi
       success: Via konto estas konfirmita, multan dankon por vi registrado!
       already active: Ĉi tiu konto jam estas konfirmita.
-      unknown token: Ĉi tiu konfirma kodo malvalidiĝis aŭ ne ekzistas.
+      unknown token: Tiu ĉi konfirma kodo eksvalidiĝis aŭ ne ekzistas.
       resend_html: Se vi volas, ke ni resendu la konfirman retleteron, %{reconfirm_link}.
       click_here: alklaku tie ĉi
     confirm_resend:
@@ -1791,7 +1795,7 @@ eo:
       button: Konfirmi
       success: Ŝanĝo de via retpoŝta adreso konfirmita!
       failure: Retadreso jam estis konfirmita per tiu ĵetono.
-      unknown_token: Ĉi tiu konfirma kodo malvalidiĝis aŭ ne ekzistas.
+      unknown_token: Tiu ĉi konfirma kodo eksvalidiĝis aŭ ne ekzistas.
     resend_success_flash:
       confirmation_sent: Ni sendis novan konfirman kodon al %{email}. Tuj kiam vi
         konfirmos vian konton, vi povos ekigi mapigadon.
@@ -1898,6 +1902,16 @@ eo:
       title: Miaj preferoj
       preferred_editor: Preferata redaktilo
       preferred_languages: Preferataj lingvoj
+      preferred_site_color_scheme: Preferata kolorskemo de retejo
+      site_color_schemes:
+        auto: aŭtomate
+        light: hela
+        dark: malhela
+      preferred_map_color_scheme: Preferata kolorskemo de mapo
+      map_color_schemes:
+        auto: aŭtomate
+        light: hela
+        dark: malhela
       edit_preferences: Redakti preferojn
     edit:
       title: Redakti preferojn
@@ -2940,6 +2954,15 @@ eo:
         years:
           one: '%{count} jaro'
           other: '%{count} jaroj'
+      short:
+        ended: finita
+        revoked_html: nuligita de %{name}
+        active: aktiva
+        active_unread: aktiva, nelegita
+        expired_unread: eksvalida, nelegita
+        read_html: legita je %{time}
+        time_in_future_title: '%{time_absolute}; post %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Blokadoj por %{name}
       heading_html: Listo de blokadoj por %{name}
@@ -2958,15 +2981,15 @@ eo:
       reason: 'Kialo de blokado:'
       revoker: 'Malblokanto:'
     block:
-      not_revoked: (ne nuligita)
       show: Montri
       edit: Redakti
     page:
       display_name: Blokita uzanto
       creator_name: Kreinto
       reason: Kialo de blokado
+      start: Komenco
+      end: Fino
       status: Stato
-      revoker_name: Nuligita de
     navigation:
       all_blocks: Ĉiuj blokadoj
       blocks_on_me: Blokadoj por mi
index 5487993957179abc536c6e84238e2dbb052a2d6d..29e12c3f3d991e39a3cb3d53781a01380464324c 100644 (file)
@@ -1616,7 +1616,6 @@ es:
         open: Abierto
         resolved: Resuelto
     show:
-      title: '%{status} Incidencia n.º %{issue_id}'
       reports:
         one: '%{count} reporte'
         other: '%{count} reportes'
@@ -3120,7 +3119,6 @@ es:
       reason: 'Razón del bloqueo:'
       revoker: 'Revocador:'
     block:
-      not_revoked: (no revocado)
       show: Mostrar
       edit: Editar
     page:
@@ -3128,7 +3126,6 @@ es:
       creator_name: Creador
       reason: Razón del bloqueo
       status: Estado
-      revoker_name: Revocado por
     navigation:
       all_blocks: Todos los bloqueos
       blocks_on_me: Bloqueos sobre mí
index 7f9c9783bb0fd0fa0301ce4f7bb73aa7e9b940ab..f8a56340de5d5f2a4f47e565cbf65a01341af699 100644 (file)
@@ -2793,7 +2793,6 @@ et:
       reason: 'Blokeerimise põhjus:'
       revoker: Tühistaja
     block:
-      not_revoked: (pole tühistatud)
       show: Näita
       edit: Redigeeri
     page:
@@ -2801,7 +2800,6 @@ et:
       creator_name: Blokeerija
       reason: Blokeerimise põhjus
       status: Olek
-      revoker_name: Tühistanud
     navigation:
       all_blocks: Kõik blokeeringud
       blocks_on_me: Mulle seatud blokeeringud
index e635fa0f615363fc898608c0242d24d02e4d9dc1..ef3365522c418ccd2af57eec0c750f3592e56394 100644 (file)
@@ -1459,7 +1459,6 @@ eu:
         other: '%{count} txosten'
       reported_item: Salatutako elementua
     show:
-      title: '%{status} %{issue_id} arazoa'
       reports:
         one: '%{count} report'
         other: '%{count} jakinarazpen'
@@ -2723,7 +2722,6 @@ eu:
       reason: 'Blokeatzeko arrazoia:'
       revoker: 'Ezeztatu duena:'
     block:
-      not_revoked: (ez da ezeztatu)
       show: Erakutsi
       edit: Aldatu
     page:
@@ -2731,7 +2729,6 @@ eu:
       creator_name: Egilea
       reason: Blokeatzeko arrazoia
       status: Egoera
-      revoker_name: -k ezeztatua
   notes:
     index:
       title: '%{user}k igotako edo iruzkinak utzitako oharrak'
index 4c659ad3e53932f814f8a9d038cc47728c3d8b9f..4ff0a76a1790617a98bdbd5fb942552eb257212b 100644 (file)
@@ -1376,7 +1376,6 @@ fa:
         other: '%{count} گزارش'
       reported_item: مورد گزارش‌شده
     show:
-      title: '%{status} موضوع #%{issue_id}'
       reports:
         one: '%{count} گزارش'
         other: '%{count} گزارش'
@@ -2463,7 +2462,6 @@ fa:
       reason: 'دلیل مسدودی:'
       revoker: 'باطل‌کننده:'
     block:
-      not_revoked: (باطل نشده)
       show: نمایش
       edit: ویرایش
     page:
@@ -2471,7 +2469,6 @@ fa:
       creator_name: ایجادکننده
       reason: دلیل مسدودی
       status: وضعیت
-      revoker_name: باطل‌کننده
     navigation:
       all_blocks: تمام قطع دسترسی‌ها
       blocks_on_me: قطع دسترسی‌های من
index e288faa10c802a898b5ec68c63928450fac2549d..1f3f4a8b00e92ddd3ee0b9c9000794d5c1bcff67 100644 (file)
@@ -1433,7 +1433,6 @@ fi:
         other: '%{count} ilmiantoa'
       reported_item: Ilmiannettu kohde
     show:
-      title: '%{status} Tapaus #%{issue_id}'
       reports:
         one: '%{count} ilmianto'
         other: '%{count} ilmiantoa'
@@ -2669,7 +2668,6 @@ fi:
       reason: 'Syy estoon:'
       revoker: 'Estäjä:'
     block:
-      not_revoked: (ei kumottu)
       show: Näytä
       edit: Muokkaa
     page:
@@ -2677,7 +2675,6 @@ fi:
       creator_name: Tekijä
       reason: Eston syy
       status: Tila
-      revoker_name: Eston tehnyt
   user_mutes:
     index:
       table:
index 4f9ea0c0adbfcda1d989b466409903ceb7f0840d..77018061499e6c5f4bfbfaac2e2e6d808fa91a6f 100644 (file)
@@ -492,7 +492,6 @@ fit:
         one: 1 ilmotus
         other: '%{count} ilmiantoa'
     show:
-      title: '%{status} Tapaus #%{issue_id}'
       reports:
         zero: Ei ilmiantoa
         one: Yksi ilmianto
index 45da8d456c97ed288afbfa9e761088c70ad3c069..535294e840ff26310ff7b14d6b6d5ccd4d203a46 100644 (file)
@@ -173,6 +173,7 @@ fr:
       message: Message
       node: Nœud
       node_tag: Attribut du nœud
+      note: Note
       old_node: Ancien nœud
       old_node_tag: Attribut de l’ancien nœud
       old_relation: Ancienne relation
@@ -498,7 +499,7 @@ fr:
         way: Chemin
         relation: Relation
     containing_relation:
-      entry_role_html: Relation %{relation_name} (avec le rôle %{relation_role})
+      entry_role_html: '%{relation_name} (avec le rôle %{relation_role})'
     not_found:
       title: Non trouvé
       sorry: Désolé, l’objet %{type} nº %{id} n’a pas pu être trouvé.
@@ -510,8 +511,8 @@ fr:
         note: note
     timeout:
       title: Erreur de dépassement du délai d’attente
-      sorry: Désolé, l'extraction des données pour le %{type} avec l'identifiant %{id}
-        a pris trop de temps.
+      sorry: Désolé, l’extraction des données pour l’objet de type « %{type} » avec
+        l’identifiant %{id} a pris trop de temps.
       type:
         node: nœud
         way: chemin
@@ -1653,7 +1654,10 @@ fr:
         open: Ouvert
         resolved: Résolu
     show:
-      title: Problème %{status} nº %{issue_id}
+      title:
+        open: 'Problème ouvert n° #%{issue_id}'
+        ignored: 'Problème ignoré n° #%{issue_id}'
+        resolved: 'Problème résolu n° #%{issue_id}'
       reports:
         one: '%{count} rapport'
         other: '%{count} rapports'
@@ -2056,6 +2060,16 @@ fr:
       title: Mes préférences
       preferred_editor: Éditeur préféré
       preferred_languages: Langues préférées
+      preferred_site_color_scheme: Système de couleurs préféré pour le site Internet
+      site_color_schemes:
+        auto: Auto
+        light: Clair
+        dark: Sombre
+      preferred_map_color_scheme: Système de couleurs préféré pour la cartographie
+      map_color_schemes:
+        auto: Auto
+        light: Clair
+        dark: Sombre
       edit_preferences: Modifier les préférences
     edit:
       title: Modifier les préférences
@@ -3171,6 +3185,15 @@ fr:
         years:
           one: '%{count} année'
           other: '%{count} années'
+      short:
+        ended: terminé
+        revoked_html: révoqué par %{name}
+        active: actif
+        active_unread: actif non lu
+        expired_unread: expiré non lu
+        read_html: lu à %{time}
+        time_in_future_title: '%{time_absolute}; dans %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Blocages de « %{name} »
       heading_html: Liste des blocages sur « %{name} »
@@ -3189,15 +3212,15 @@ fr:
       reason: 'Raison du blocage :'
       revoker: 'Révocateur :'
     block:
-      not_revoked: (non révoqué)
       show: Afficher
       edit: Modifier
     page:
       display_name: Utilisateur bloqué
       creator_name: Créateur
       reason: Motif du blocage
+      start: Début
+      end: Fin
       status: État
-      revoker_name: Révoqué par
     navigation:
       all_blocks: Tous les blocages
       blocks_on_me: Blocages me concernant
index 74187c38e171ae1d45417e49c331a90c797b57c8..90d1490c3abb819b4c847c6505a3dcde5370ec5d 100644 (file)
@@ -1559,7 +1559,6 @@ fur:
       reason: 'Reson dal bloc:'
       revoker: 'Chel che al à revocât:'
     block:
-      not_revoked: (no revocât)
       show: Mostre
       edit: Cambie
     page:
@@ -1567,7 +1566,6 @@ fur:
       creator_name: Creadôr
       reason: Reson dal bloc
       status: Stât
-      revoker_name: Revocât di
   user_mutes:
     index:
       table:
index 825f9a5835ae6a87ca1d1681697099f236831cf0..4083810f1652f82a99cc540e1b9d54f67a510a8f 100644 (file)
@@ -1353,7 +1353,6 @@ fy:
         other: '%{count} meldings'
       reported_item: Meld elemint
     show:
-      title: '%{status} probleem #%{issue_id}'
       reports:
         one: 1 melding
         other: '%{count} meldings'
@@ -2404,7 +2403,6 @@ fy:
       reason: 'Reden foar útsluting:'
       revoker: 'Ynlûker:'
     block:
-      not_revoked: (net ynlutsen)
       show: Werjaan
       edit: Bewurkje
     page:
@@ -2412,7 +2410,6 @@ fy:
       creator_name: Oanmakker
       reason: Reden foar útsluting
       status: Status
-      revoker_name: Ynlutsen troch
   notes:
     index:
       title: Troch %{user} yntsjinne as op reägearre notysjes
index 92f446ed7a5c34aeef25772c23160a5137db6a15..9b94afc339e2d44bfb3fd41525664b21616e9ac7 100644 (file)
@@ -981,7 +981,6 @@ ga:
     page:
       last_updated: Nuashonrú deireanach
     show:
-      title: '%{status} Fadhb #%{issue_id}'
       reports:
         zero: Tuairisc ar bith
         one: Tuairisc amháin
@@ -1696,7 +1695,6 @@ ga:
           one: uair amháin an chloig
           other: '%{count} uair an chloig'
     block:
-      not_revoked: (nár tarraingíodh siar)
       show: Taispeáin
       edit: Cuir in Eagar
     page:
@@ -1704,7 +1702,6 @@ ga:
       creator_name: Cruthaitheoir
       reason: Cúis don bhac
       status: Stádas
-      revoker_name: Tarraingthe siar ag
   notes:
     index:
       id: ID
index 61aa60109dd332ab9c7cb26133a805bc025616c0..656dc98255294a970ea516e9f6455f222bcaf93e 100644 (file)
@@ -1827,7 +1827,6 @@ gd:
       reason: 'Adhbhar a'' bhacaidh:'
       revoker: 'Cùl-ghairm le:'
     block:
-      not_revoked: (cha deach a chùl-ghairm)
       show: Seall
       edit: Deasaich
     page:
@@ -1835,7 +1834,6 @@ gd:
       creator_name: Cruthadair
       reason: Adhbhar a' bhacaidh
       status: Staid
-      revoker_name: Air a chùl-ghairm le
   notes:
     index:
       title: Nòtaichean a chuir %{user} a-null no a thug %{user} beachd dhaibh
index 76e063b016441dd5fb8aa09760400d13b6c47318..d52eff6fb12e8eb5860de5501cc601e2288ed3ea 100644 (file)
@@ -75,6 +75,7 @@ gl:
       message: Mensaxe
       node: Nó
       node_tag: Etiqueta do nó
+      note: Nota
       old_node: Nó vello
       old_node_tag: Etiqueta do nó vello
       old_relation: Relación vella
@@ -385,7 +386,7 @@ gl:
         way: Vía
         relation: Relación
     containing_relation:
-      entry_role_html: Relación %{relation_name} (como %{relation_role})
+      entry_role_html: '%{relation_name} (como %{relation_role})'
     not_found:
       title: Non atopado
       sorry: Sentímolo, non se puido atopar o/a %{type} co n.º %{id}.
@@ -1537,7 +1538,10 @@ gl:
         open: Aberto
         resolved: Resolto
     show:
-      title: '%{status} Erro n.º %{issue_id}'
+      title:
+        open: Problema aberto n.º %{issue_id}
+        ignored: Problema ignorado n.º %{issue_id}
+        resolved: Problema resolto n.º %{issue_id}
       reports:
         one: '%{count} denuncia'
         other: '%{count} denuncias'
@@ -1932,6 +1936,16 @@ gl:
       title: As miñas preferencias
       preferred_editor: Editor preferido
       preferred_languages: Linguas preferidas
+      preferred_site_color_scheme: Esquema de cores preferido para o sitio web
+      site_color_schemes:
+        auto: Automático
+        light: Claro
+        dark: Escuro
+      preferred_map_color_scheme: Esquema de cores preferido para o mapa
+      map_color_schemes:
+        auto: Automático
+        light: Claro
+        dark: Escuro
       edit_preferences: Editar preferencias
     edit:
       title: Editar preferencias
@@ -3012,6 +3026,15 @@ gl:
         years:
           one: '%{count} ano'
           other: '%{count} anos'
+      short:
+        ended: finalizado
+        revoked_html: revogado por %{name}
+        active: activo
+        active_unread: activo sen ler
+        expired_unread: caducado sen ler
+        read_html: lido ás %{time}
+        time_in_future_title: '%{time_absolute}; en %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Bloqueos feitos a %{name}
       heading_html: Listaxe dos bloqueos feitos a %{name}
@@ -3030,15 +3053,15 @@ gl:
       reason: 'Motivo para o bloqueo:'
       revoker: 'Autor da revogación:'
     block:
-      not_revoked: (non revogado)
       show: Amosar
       edit: Editar
     page:
       display_name: Usuario bloqueado
       creator_name: Creador
       reason: Motivo para o bloqueo
+      start: Inicio
+      end: Fin
       status: Estado
-      revoker_name: Revogado por
     navigation:
       all_blocks: Todos os bloqueos
       blocks_on_me: Os meus bloqueos
index e77888d9c8bb51ecced9b1933f1e6b38886fd628..92084d8f0169dacca1808df1f938dad9319133f1 100644 (file)
@@ -95,6 +95,7 @@ he:
       message: הודעה
       node: נקודה
       node_tag: תג נקודה
+      note: הערה
       old_node: נקודה ישנה
       old_node_tag: תג צומת ישן
       old_relation: יחס ישן
@@ -1560,7 +1561,10 @@ he:
         open: פתוח
         resolved: פתור
     show:
-      title: בעיה במצב %{status} מס׳ %{issue_id}
+      title:
+        open: בעיה פתוחה %{issue_id}
+        ignored: בעיה חסרת־השפעה %{issue_id}
+        resolved: בעיה פתורה %{issue_id}
       reports:
         one: דו״ח אחד
         two: '%{count} דו״חות'
@@ -1929,6 +1933,16 @@ he:
       title: ההעדפות שלי
       preferred_editor: עורך מועדף
       preferred_languages: שפות מועדפות
+      preferred_site_color_scheme: ערכת צבעי האתר המועדפת
+      site_color_schemes:
+        auto: אוטומטית
+        light: בהירה
+        dark: כהה
+      preferred_map_color_scheme: ערכת צבעי המפה המועדפת
+      map_color_schemes:
+        auto: אוטומטית
+        light: בהירה
+        dark: כהה
       edit_preferences: עריכת העדפות
     edit:
       title: עריכת העדפות
@@ -2255,7 +2269,7 @@ he:
       license:
         copyright: 'זכויות היוצרים: מיזם OpenStreetMap ותורמיו, בכפוף לרישיון פתוח'
       remote_failed: העריכה נכשלה – נא לוודא כי JOSM או Merkaartor נטענו ושאפשרות
-        ×\94ש×\9c×\99×\98×\94 ×\9eק×\97×\95ר מופעלת
+        ×\94ש×\9c×\99×\98×\94 ×\9eר×\97×\95ק מופעלת
     edit:
       not_public: לא הגדרת את העריכות שלך כציבוריות.
       not_public_description_html: לא תהיה לך אפשרות להמשיך לערוך את המפה לפני שזה
@@ -2735,7 +2749,7 @@ he:
         paragraph_1: בניגוד למפות אחרות, OpenStreetMap נוצרה לחלוטין על־ידי אנשים
           כמוך והיא חופשית לתיקונים, עדכונים, הורדה ושימוש של כל מי שחפץ.
         paragraph_2: אפשר להירשם כדי להתחיל לתרום.
-        welcome: ברוך בואך ל־OoenStreetMap
+        welcome: ברוך בואך ל־OpenStreetMap
       duplicate_social_email: אם כבר יש לך חשבון OpenStreetMap וברצונך להשתמש בספק
         זהות של צד שלישי, נא להתחבר באמצעות הסיסמה שלך ולשנות את הגדרות החשבון שלך.
       display name description: שם המשתמש שלך, שמוצג בפומבי. אפשר לשנות את זה בהעדפות
@@ -2977,6 +2991,15 @@ he:
           two: שנתיים
           many: '%{count} שנה'
           other: '%{count} שנים'
+      short:
+        ended: הסתיימה
+        revoked_html: בוטלה על־ידי %{name}
+        active: פעילה
+        active_unread: פעילה, לא נקראה
+        expired_unread: פגה, לא נקראה
+        read_html: נקראה ב־%{time}
+        time_in_future_title: '%{time_absolute}; ב־%{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: חסימות של %{name}
       heading_html: רשימת החסימות של %{name}
@@ -2995,15 +3018,15 @@ he:
       reason: 'סיבה לחסימה:'
       revoker: 'מבטל:'
     block:
-      not_revoked: (לא בוטלה)
       show: הצגה
       edit: עריכה
     page:
       display_name: משתמש חסום
       creator_name: יוצר
       reason: סיבה לחסימה
+      start: התחלה
+      end: סיום
       status: מצב
-      revoker_name: בוטלה על־ידי
     navigation:
       all_blocks: כל החסימות
       blocks_on_me: חסימות שלי
index d0e7e46e5bdb2eb6448a7e74bdf00a38ed33cc01..9f1fa981ef3515d98b2b855a016c60542101d4c5 100644 (file)
@@ -1038,6 +1038,9 @@ hi:
     filter:
       not_revoke_admin_current_user: वर्तमान उपयोगकर्ता के द्वारा व्यवस्थापक भूमिका
         को रद्द नहीं कर सकता है|
+  user_blocks:
+    page:
+      end: अन्त
   notes:
     index:
       created_at: 'निर्माण का समय:'
index be5c340a8910cd00f7d25298de5e6d83d3a98424..08474a4d9f6db68e5ab3bfcea813934fdc588c06 100644 (file)
@@ -1679,7 +1679,6 @@ hr:
       reason: 'Razlog za blokadu:'
       revoker: 'Opozivatelj:'
     block:
-      not_revoked: (nije opozvano)
       show: Prikaži
       edit: Uredi
     page:
@@ -1687,7 +1686,6 @@ hr:
       creator_name: Tvorac
       reason: Razlog za blokadu
       status: Status
-      revoker_name: Opozvao
   notes:
     index:
       title: Bilješke stvorio ili komentirao %{user}
index db45ff706d83d942d7cff83904691d58e5a13a62..76b83c6cc6f206afcd347f7c43d492247e098170 100644 (file)
@@ -1390,7 +1390,6 @@ hsb:
         other: '%{count} rozprawow'
       reported_item: Zjewjeny objekt
     show:
-      title: '%{status} Problem čo. %{issue_id}'
       reports:
         one: '%{count} rozprawa'
         two: '%{count} rozprawje'
@@ -2516,7 +2515,6 @@ hsb:
       reason: 'Přičina za blokowanje:'
       revoker: 'Zeběracy wužiwar:'
     block:
-      not_revoked: (njezběhnjeny)
       show: Pokazać
       edit: Wobdźěłać
     page:
@@ -2524,7 +2522,6 @@ hsb:
       creator_name: Blokowar
       reason: Přičina za blokowanje
       status: Status
-      revoker_name: Zběhnjene wot
   user_mutes:
     index:
       title: Zněmjeni wužiwarjo
index a71e7c654ab28a706ee0bd53d84c2f83a9acddbc..19b2349b4dc97a30183e7fbe34b7ae060bde93fe 100644 (file)
@@ -1540,7 +1540,6 @@ hu:
         open: Nyitva
         resolved: Megoldva
     show:
-      title: '#%{issue_id} probléma %{status}'
       reports:
         one: '%{count} bejelentés'
         other: '%{count} bejelentés'
@@ -3004,7 +3003,6 @@ hu:
       reason: 'Blokkolás indoklása:'
       revoker: 'Visszavonó:'
     block:
-      not_revoked: (nincs visszavonva)
       show: Megjelenítés
       edit: Szerkesztés
     page:
@@ -3012,7 +3010,6 @@ hu:
       creator_name: Készítő
       reason: Blokkolás indoklása
       status: Állapot
-      revoker_name: 'Visszavonta:'
     navigation:
       all_blocks: Minden blokk
       blocks_on_me: Engem sújtó blokkolások
index 1afe3205a4ea6b345b07399e6b9454a8a6d5ed33..63c8fb7a24c1e30737ad91a743b4988e80032c32 100644 (file)
@@ -1518,7 +1518,6 @@ ia:
         open: Aperte
         resolved: Resolvite
     show:
-      title: '%{status} Problema №%{issue_id}'
       reports:
         one: '%{count} reporto'
         other: '%{count} reportos'
@@ -2998,7 +2997,6 @@ ia:
       reason: 'Motivo del blocada:'
       revoker: 'Revocator:'
     block:
-      not_revoked: (non revocate)
       show: Monstrar
       edit: Modificar
     page:
@@ -3006,7 +3004,6 @@ ia:
       creator_name: Creator
       reason: Motivo del blocada
       status: Stato
-      revoker_name: Revocate per
     navigation:
       all_blocks: Tote le blocadas
       blocks_on_me: Blocadas sur me
index d44592b693f177f1c27f46fc848e2bf3e8210393..cbde28471149ca5555dab2254d9d6a77052c6920 100644 (file)
@@ -1466,7 +1466,6 @@ id:
         other: '%{count} Laporan'
       reported_item: Butir dilaporkan
     show:
-      title: '%{status} Isu #%{issue_id}'
       reports:
         other: '%{count} laporan'
       no_reports: Tidak ada laporan
@@ -2864,7 +2863,6 @@ id:
       reason: 'Alasan untuk blokir:'
       revoker: 'Pembatal:'
     block:
-      not_revoked: (tidak dicabut)
       show: Tampilkan
       edit: Edit
     page:
@@ -2872,7 +2870,6 @@ id:
       creator_name: Pencipta
       reason: Alasan untuk blokir
       status: Status
-      revoker_name: Dibatalkan oleh
   user_mutes:
     index:
       title: Pengguna yang Dibisukan
index c83902172a8c7aeeb0fa86e035d41e6d0aff0ebe..561954e8af840f7259d17489d36bc4d97ab982cd 100644 (file)
@@ -1516,7 +1516,6 @@ is:
         other: '%{count} skýrslur'
       reported_item: Tilkynnt atriði
     show:
-      title: '%{status} vandamál #%{issue_id}'
       reports:
         one: '%{count} skýrsla'
         other: '%{count} skýrslur'
@@ -3051,7 +3050,6 @@ is:
       reason: 'Ástæða banns:'
       revoker: 'Eytt af:'
     block:
-      not_revoked: (ekki eytt)
       show: Sýna
       edit: Breyta
     page:
@@ -3059,7 +3057,6 @@ is:
       creator_name: Búið til af
       reason: Ástæða banns
       status: Staða
-      revoker_name: Eytt af
     navigation:
       all_blocks: Öll bönn
       blocks_on_me: Bönn gegn mér
index d0925a5f6f9089ca5fb3da3f3cd68f8d442a671f..c3042225ef4f01acf53248111f43d11065758fd1 100644 (file)
@@ -120,6 +120,7 @@ it:
       message: Messaggio
       node: Nodo
       node_tag: Etichetta del nodo
+      note: Nota
       old_node: Vecchio nodo
       old_node_tag: Vecchia etichetta del nodo
       old_relation: Vecchia relazione
@@ -1582,7 +1583,6 @@ it:
         open: Aperto
         resolved: Risolto
     show:
-      title: '%{status} Problema #%{issue_id}'
       reports:
         one: '%{count} segnalazione'
         other: '%{count} segnalazioni'
@@ -1978,6 +1978,15 @@ it:
       title: Preferenze
       preferred_editor: Editor preferito
       preferred_languages: Lingue preferite
+      preferred_site_color_scheme: Schema di colori preferito per il sito web
+      site_color_schemes:
+        auto: Automatico
+        light: Chiaro
+        dark: Scuro
+      map_color_schemes:
+        auto: Automatico
+        light: Chiaro
+        dark: Scuro
       edit_preferences: Modifica preferenze
     edit:
       title: Modifica preferenze
@@ -3048,6 +3057,15 @@ it:
         years:
           one: '%{count} anno'
           other: '%{count} anni'
+      short:
+        ended: terminato
+        revoked_html: revocato da %{name}
+        active: attivo
+        active_unread: attivo non letto
+        expired_unread: scaduto non letto
+        read_html: letto alle %{time}
+        time_in_future_title: '%{time_absolute}; in %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Blocchi su %{name}
       heading_html: Lista dei blocchi su %{name}
@@ -3066,15 +3084,15 @@ it:
       reason: 'Motivazione del blocco:'
       revoker: 'Revocatore:'
     block:
-      not_revoked: (non revocato)
       show: Mostra
       edit: Modifica
     page:
       display_name: Utente bloccato
       creator_name: Autore
       reason: Motivo del blocco
+      start: Inizio
+      end: Fine
       status: Stato
-      revoker_name: Revocato da
     navigation:
       all_blocks: Tutti i blocchi
       blocks_on_me: Blocchi su di me
index 9f85fac2983bccd4d3fa8eaddd4d0a1f88370982..7a92b346b01451439b5d5fc181b10529d0b05b9e 100644 (file)
@@ -1508,7 +1508,6 @@ ja:
         open: 開く
         resolved: 解決済
     show:
-      title: '%{status} 問題 #%{issue_id}'
       reports:
         other: '%{count}件のレポート'
       no_reports: 報告はありません
@@ -2721,7 +2720,6 @@ ja:
       reason: 'ブロックの理由:'
       revoker: '取消:'
     block:
-      not_revoked: (取り消されていません)
       show: 表示する
       edit: 編集
     page:
@@ -2729,7 +2727,6 @@ ja:
       creator_name: 作成者
       reason: ブロックされた理由
       status: 状態
-      revoker_name: 取り消し者
   user_mutes:
     index:
       title: ミュートした利用者
index 6cc951a446c3a91aaa232020ac2ede290448223b..3dd471231660a467e915e97e7882d6beaf656655 100644 (file)
@@ -1024,7 +1024,6 @@ ka:
       reason: 'დაბლოკვის მიზეზი:'
       revoker: 'განმბლოკველი:'
     block:
-      not_revoked: (არ არის განბლოკილი)
       show: ჩვენება
       edit: რედაქტირება
     page:
@@ -1032,7 +1031,6 @@ ka:
       creator_name: შემქმნელი
       reason: დაბლოკვის მიზეზი
       status: სტატუსი
-      revoker_name: განბლოკილია
   notes:
     index:
       creator: შემქმნელი
index dffc4b02dd9488787808b64e32c1c8f8abf6ebd3..0dead6ae16013862f23aa8132c6daf975246c5c0 100644 (file)
@@ -1224,7 +1224,6 @@ kab:
       creator_name: Amernay
       reason: Taɣzint n  usewḥel
       status: Addad
-      revoker_name: Isewḥel-it
   notes:
     index:
       heading: Tizmilin n %{user}
index 75fb9dbd8a9bea917da3fa01cdf63acc99ea148e..b934070259ae0fcaf15c67af86e1ba65e1a8b42d 100644 (file)
@@ -1188,6 +1188,7 @@ ko:
           lawyer: 변호사 사무실
           newspaper: 신문사
           ngo: 비정부 기구 사무실
+          religion: 종교 사무소
           research: 연구실
           tax_advisor: 세무사
           telecommunication: 통신 회사 사옥
@@ -1328,6 +1329,7 @@ ko:
           massage: 안마시술소
           medical_supply: 의료용품 공급점
           mobile_phone: 휴대폰 상점
+          money_lender: 대금업자
           motorcycle: 이륜자동차(오토바이) 상점
           motorcycle_repair: 오토바이 수리점
           music: 음반 가게
@@ -1444,6 +1446,7 @@ ko:
     page:
       user_not_found: 사용자가 존재하지 않습니다
       issues_not_found: 해당 이슈를 찾을 수 없습니다
+      reported_user: 신고된 사용자
       status: 상태
       reports: 보고서
       last_updated: 최근 업데이트
@@ -1451,8 +1454,11 @@ ko:
       reports_count:
         other: 신고 %{count}건
       reported_item: 항목 신고함
+      states:
+        ignored: 무시됨
+        open: 열림
+        resolved: 해결됨
     show:
-      title: '%{status} 문제 #%{issue_id}'
       reports:
         other: 신고 %{count}건
       no_reports: 보고서 없음
@@ -1778,6 +1784,16 @@ ko:
       title: 내 환경 설정
       preferred_editor: 선호하는 편집기
       preferred_languages: 선호하는 언어
+      preferred_site_color_scheme: 선호하는 웹사이트 색상 구성표
+      site_color_schemes:
+        auto: 자동
+        light: 밝음
+        dark: 어두움
+      preferred_map_color_scheme: 선호하는 지도 색상 구성표
+      map_color_schemes:
+        auto: 자동
+        light: 밝음
+        dark: 어두움
       edit_preferences: 환경 설정 편집
     edit:
       title: 환경 설정 편집
@@ -2725,7 +2741,6 @@ ko:
       reason: '차단 이유:'
       revoker: '해제:'
     block:
-      not_revoked: (철회하지 않음)
       show: 보기
       edit: 편집
     page:
@@ -2733,7 +2748,6 @@ ko:
       creator_name: 만든이
       reason: 차단 이유
       status: 상태
-      revoker_name: 해제자
     navigation:
       all_blocks: 모든 차단
       blocks_on_me: 나의 차단내역
index 8d02e9c3bdd0a2ce2362bcf1add9736d1db350b3..450c5539ab87cac2106e4dce1457075b340a98d9 100644 (file)
@@ -1405,7 +1405,6 @@ ku-Latn:
         other: '%{count} Rapor'
       reported_item: Hêmanê Raporkirî
     show:
-      title: '%{status} Pirsgirêk #%{issue_id}'
       reports:
         one: '%{count} rapor'
         other: '%{count} raporan'
@@ -2512,7 +2511,6 @@ ku-Latn:
       reason: 'Sedema astengkirinê:'
       revoker: Yê ku rakiriyeː
     block:
-      not_revoked: (ne betalkirî)
       show: Nîşan bide
       edit: Biguherîne
     page:
@@ -2520,7 +2518,6 @@ ku-Latn:
       creator_name: Çêker
       reason: Sedema astengkirinê
       status: Rewş
-      revoker_name: Yê ku betal kiriyeː
   notes:
     index:
       title: Notên ku ji aliyê %{user} ve hatine şandin an jî şirovekirin
index a1bcbdb99a95916c5daf132545dda7f482550f90..40d94d6a31bfbdb014e4b11f8334b3469f08fe97 100644 (file)
@@ -346,7 +346,7 @@ lb:
         way: Wee
         relation: Relatioun
     containing_relation:
-      entry_role_html: Relatioun %{relation_name} (als %{relation_role})
+      entry_role_html: '%{relation_name} (als %{relation_role})'
     not_found:
       title: Net fonnt
       sorry: Pardon, den %{type}#%{id}, konnt net fonnt ginn.
@@ -1401,7 +1401,6 @@ lb:
         open: Oppen
         resolved: Geléist
     show:
-      title: '%{status} Problem Nr. %{issue_id}'
       reports:
         one: '%{count} Meldung'
         other: '%{count} Meldungen'
@@ -1763,6 +1762,14 @@ lb:
       title: Meng Benotzerastellungen
       preferred_editor: Liblingseditor
       preferred_languages: Léifste Sproochen
+      site_color_schemes:
+        auto: Automatesch
+        light: Hell
+        dark: Däischter
+      map_color_schemes:
+        auto: Automatesch
+        light: Hell
+        dark: Däischter
       edit_preferences: Benotzerastellungen änneren
     edit:
       title: Benotzerastellungen änneren
@@ -2318,6 +2325,8 @@ lb:
         years:
           one: '%{count} Joer'
           other: '%{count} Joren'
+      short:
+        active: aktiv
     blocks_on:
       title: Späre vum %{name}
       empty: '%{name} gouf bis elo nach net gespaart.'
@@ -2333,14 +2342,12 @@ lb:
       edit: Änneren
       reason: 'Grond fir d''Spär:'
     block:
-      not_revoked: (net opgehuewen)
       show: Weisen
       edit: Änneren
     page:
       display_name: Gespaarte Benotzer
       reason: Grond fir d'Spär
       status: Status
-      revoker_name: Opgehuewe vum
   user_mutes:
     index:
       table:
index 55ab98698dec5589330fe28793421eece8e90092..4f5605313cc553b1bbcf56604dc01d32647fe8c9 100644 (file)
@@ -1510,7 +1510,6 @@ lt:
         open: Atidaryta
         resolved: Išspręsta
     show:
-      title: '%{status} Problema #%{issue_id}'
       reports:
         one: '{%count} pranešimas'
         few: '%{count} pranešimai'
@@ -2933,7 +2932,6 @@ lt:
       reason: 'Blokavimo priežastis:'
       revoker: 'Atšaukėjas:'
     block:
-      not_revoked: (neatšauktas)
       show: Rodyti
       edit: Keisti
     page:
@@ -2941,7 +2939,6 @@ lt:
       creator_name: Kūrėjas
       reason: Blokavimo priežastis
       status: Būsena
-      revoker_name: Atšaukė
     navigation:
       all_blocks: Visi blokavimai
       blocks_on_me: Mano blokavimai
index 3cc3fe8b1dc20434da62a987d0107be8b7afaaa3..ded57b0c3cdae9f1e1f7090459ce2e1e70d479ab 100644 (file)
@@ -1987,7 +1987,6 @@ lv:
       reason: 'Bloķēšanas iemesls:'
       revoker: 'Atsaucējs:'
     block:
-      not_revoked: (nav atsaukts)
       show: Rādīt
       edit: Labot
     page:
@@ -1995,7 +1994,6 @@ lv:
       creator_name: Autors
       reason: Iemesls liegumam
       status: Statuss
-      revoker_name: Atsaucis
   notes:
     index:
       title: Piezīmes, kuras veidojis vai komentējis %{user}
index aff5cfc22bcdd94d57c0dd0424b733e985c16610..dbb556bc9056a03e9f106330efcd37aa2a547d28 100644 (file)
@@ -62,6 +62,7 @@ mk:
       message: Порака
       node: Јазол
       node_tag: Ознака на јазол
+      note: Напомена
       old_node: Стар јазол
       old_node_tag: Стара ознака за јазол
       old_relation: Стар однос
@@ -365,7 +366,7 @@ mk:
         way: Пат
         relation: Однос
     containing_relation:
-      entry_role_html: Однос %{relation_name} (како %{relation_role})
+      entry_role_html: '%{relation_name} (како %{relation_role})'
     not_found:
       title: Не е најдено
       sorry: За жал, не да најдам %{type} со бр. %{id}.
@@ -1510,7 +1511,10 @@ mk:
         open: Отворено
         resolved: Решено
     show:
-      title: '%{status} Проблем бр. #%{issue_id}'
+      title:
+        open: Отворен проблем бр. %{issue_id}
+        ignored: Занемарен проблем бр. %{issue_id}
+        resolved: Решен проблем бр. %{issue_id}
       reports:
         one: '%{count} пријава'
         other: '%{count} пријави'
@@ -1894,6 +1898,16 @@ mk:
       title: Мои нагодувања
       preferred_editor: Претпочитан уредник
       preferred_languages: Претпочитани јазици
+      preferred_site_color_scheme: Претпочитана бојна шема на мрежното место
+      site_color_schemes:
+        auto: Автоматски
+        light: Светло
+        dark: Темно
+      preferred_map_color_scheme: Претпочитана бојна шема на картите
+      map_color_schemes:
+        auto: Автоматски
+        light: Светло
+        dark: Темно
       edit_preferences: Измени нагодувања
     edit:
       title: Измени нагодувања
@@ -2888,11 +2902,11 @@ mk:
       not_revoke_admin_current_user: Не можам да му ја одземам администраторската
         улога на тековниот корисник.
     grant:
-      are_you_sure: Дали сигурно сакае да му ја доделите улогата `%{role}' на корисникот
-        `%{name}'?
+      are_you_sure: Дали сигурно сакае да му ја доделите улогата „%{role}“ на корисникот
+        „%{name}“?
     revoke:
-      are_you_sure: Дали сигурно сакате да го лишите корисникот  `%{name}' од улогата
-        `%{role}' ?
+      are_you_sure: Дали сигурно сакате да го лишите корисникот „%{name}“ од улогата
+        „%{role}“?
   user_blocks:
     model:
       non_moderator_update: Морате да бидете модератор за да правите или подновувате
@@ -2959,6 +2973,15 @@ mk:
         years:
           one: '%{count} година'
           other: '%{count} години'
+      short:
+        ended: завршен
+        revoked_html: отповикано од %{name}
+        active: активен
+        active_unread: активен непрочитан
+        expired_unread: истечен непрочитан
+        read_html: порочитај во %{time}
+        time_in_future_title: '%{time_absolute}; за %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Блокови за %{name}
       heading_html: Список на блокови за %{name}
@@ -2977,15 +3000,15 @@ mk:
       reason: 'Причина за блокирање:'
       revoker: 'Поништувач:'
     block:
-      not_revoked: (не се поништува)
       show: Прикажи
       edit: Уреди
     page:
       display_name: Блокиран корисник
       creator_name: Создавач
       reason: Причина за блокирање
+      start: Почеток
+      end: Крај
       status: Статус
-      revoker_name: 'Поништил:'
     navigation:
       all_blocks: Сите блокови
       blocks_on_me: Добиени блокови
@@ -3031,6 +3054,11 @@ mk:
       description: Опис
       created_at: Создадена
       last_changed: Изменета
+      apply: Примени
+      all: Сите
+      open: Отворено
+      closed: Затворено
+      status: Статус
     show:
       title: 'Белешка: %{id}'
       description: Опис
@@ -3049,6 +3077,9 @@ mk:
       report: пријави ја белешкава
       anonymous_warning: Оваа белешка има коментари од анонимни корисници што треба
         независно да се проверат.
+      discussion: Разговор
+      subscribe: Претплати се
+      unsubscribe: Отпиши се
       hide: Скриј
       resolve: Решена
       reactivate: Преактивирај
index cbb0cd37fa2e54420e197a584fa593f2895be509..0bbcd79c94202c20fbd2b8f95651174856d2e963 100644 (file)
@@ -2005,7 +2005,6 @@ ms:
       reason: 'Sebab sekatan:'
       revoker: 'Penarik balik:'
     block:
-      not_revoked: (tidak ditarik balik)
       show: Tunjukkan
       edit: Sunting
     page:
@@ -2013,7 +2012,6 @@ ms:
       creator_name: Pembuat
       reason: Sebab sekatan
       status: Status
-      revoker_name: Ditarik balik oleh
   user_mutes:
     index:
       title: Pengguna yang Diredamkan
index 01e32571f9740ad3e1adfa4752d3fe8c064cb977..cff3c645db152e095586ec13973774158812088a 100644 (file)
@@ -1276,7 +1276,6 @@ nb:
         other: '%{count} rapporter'
       reported_item: Rapportert element
     show:
-      title: '%{status} Sak #%{issue_id}'
       reports:
         one: '%{count} rapport'
         other: '%{count} rapporter'
@@ -2248,7 +2247,6 @@ nb:
       reason: 'Årsak for blokkering:'
       revoker: 'Tilbakekaller:'
     block:
-      not_revoked: (ikke tilbakekalt)
       show: Vis
       edit: Rediger
     page:
@@ -2256,7 +2254,6 @@ nb:
       creator_name: Opprettet av
       reason: Årsak for blokkering
       status: Status
-      revoker_name: Tilbakekalt av
   notes:
     index:
       title: Merknader sendt inn eller kommentert på av %{user}
index 80aa25e974d14c50e283b0a9aff6d9829181b234..3e30056ec09f72b3f8ca62159f2aeacd01b978b5 100644 (file)
@@ -119,6 +119,7 @@ nl:
       message: Bericht
       node: Knooppunt
       node_tag: Knooppuntlabel
+      note: Opmerking
       old_node: Oud knooppunt
       old_node_tag: Oud knooppuntlabel
       old_relation: Oude relatie
@@ -429,7 +430,7 @@ nl:
         way: Weg
         relation: Relatie
     containing_relation:
-      entry_role_html: Relatie %{relation_name} (als %{relation_role})
+      entry_role_html: '%{relation_name} (als %{relation_role})'
     not_found:
       title: Kon niet gevonden worden
       sorry: 'De %{type} #%{id} kon helaas niet worden gevonden.'
@@ -1574,7 +1575,10 @@ nl:
         open: Open
         resolved: Opgelost
     show:
-      title: '%{status} Probleem #%{issue_id}'
+      title:
+        open: 'Open probleem #%{issue_id}'
+        ignored: 'Genegeerd probleem #%{issue_id}'
+        resolved: 'Opgelost probleem #%{issue_id}'
       reports:
         one: '%{count} rapport'
         other: '%{count} rapporten'
@@ -1972,6 +1976,16 @@ nl:
       title: Mijn voorkeuren
       preferred_editor: Voorkeursprogramma voor kaartbewerking
       preferred_languages: Voorkeurstalen
+      preferred_site_color_scheme: Het gewenste kleurenschema voor de website
+      site_color_schemes:
+        auto: Automatisch
+        light: Licht
+        dark: Donker
+      preferred_map_color_scheme: Het gewenste kleurenschema voor de kaart
+      map_color_schemes:
+        auto: Automatisch
+        light: Licht
+        dark: Donker
       edit_preferences: Voorkeuren instellen
     edit:
       title: Voorkeuren instellen
@@ -3055,6 +3069,15 @@ nl:
         years:
           one: '%{count} jaar'
           other: '%{count} jaar'
+      short:
+        ended: beëindigd
+        revoked_html: ingetrokken door %{name}
+        active: actief
+        active_unread: actief ongelezen
+        expired_unread: verlopen ongelezen
+        read_html: gelezen op %{time}
+        time_in_future_title: '%{time_absolute}; in %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Blokkades voor %{name}
       heading_html: Lijst met blokkades voor %{name}
@@ -3073,15 +3096,15 @@ nl:
       reason: 'Reden voor blokkade:'
       revoker: 'Ingetrokken door:'
     block:
-      not_revoked: (niet ingetrokken)
       show: Weergeven
       edit: Bewerken
     page:
       display_name: Geblokkeerde gebruiker
       creator_name: Auteur
       reason: Reden voor blokkade
+      start: Begin
+      end: Einde
       status: Status
-      revoker_name: Ingetrokken door
     navigation:
       all_blocks: Alle blokkades
       blocks_on_me: Blokkades voor u
index 468da74f5eff888b073abcb9d8df06a5ee60f784..ee39c56b88f9a01dcc0679f1b235ec652d00ec53 100644 (file)
@@ -1355,7 +1355,6 @@ nn:
         other: '%{count} meldingar'
       reported_item: Meld objekt
     show:
-      title: '%{status} Sak #%{issue_id}'
       reports:
         one: '%{count} melding'
         other: '%{count} meldingar'
@@ -2398,7 +2397,6 @@ nn:
       reason: 'Årsak for blokkering:'
       revoker: 'Tilbakekaller:'
     block:
-      not_revoked: (ikkje tilbakekalt)
       show: Vis
       edit: Rediger
     page:
@@ -2406,7 +2404,6 @@ nn:
       creator_name: Oppretta av
       reason: Årsak for blokkering
       status: Status
-      revoker_name: Tilbakekalt av
   notes:
     index:
       heading: '%{user} sine merknadar'
index 3d06d9cf7154ddc5f604f1d60fb9d74839cea566..7d7e099005da80a7cc561df415127999d67b363b 100644 (file)
@@ -999,7 +999,6 @@ nqo:
       last_updated: ߟߏ߲ߘߐߦߊߟߌ ߞߐ߯ߟߕߊ
       reported_item: ߝߛߌ߬ ߟߊߞߏߝߐߣߍ߲
     show:
-      title: '%{status} ߝߌ߬ߛߌ #%{issue_id}'
       report_created_at_html: ߞߏߝߐߟߌ߫ ߝߟߐ ߞߍ߫ ߘߊ߫ %{datetime}
       last_resolved_at_html: ߢߊߓߐߟߌ߫ ߟߊߓߊ߲ ߞߍ߫ ߘߊ߫ %{datetime}
       last_updated_at_html: ߊ߬ ߟߊߛߋ߫ ߟߊߓߊ߲ ߞߍ߫ ߘߊ߫ ߘߊߞߎ߲ ߘߐ߫ %{datetime} ߊ߬ ߣߌ߫ %{displayname}
index 27c20f748ac0c4926270b5fd1a5df5abbe279d0d..06aba789500437a0589973ac92c6de2051ad57e8 100644 (file)
@@ -1379,7 +1379,6 @@ oc:
         other: '%{count} rapòrts'
       reported_item: Element raportat
     show:
-      title: '%{status} Incidéncia #%{issue_id}'
       reports:
         zero: Ges de rapòrt
         one: 1 rapport
@@ -2281,7 +2280,6 @@ oc:
       reason: 'Motiu del blocatge :'
       revoker: 'Revocador :'
     block:
-      not_revoked: (pas revocat)
       show: Mostrar
       edit: Modificar
     page:
@@ -2289,7 +2287,6 @@ oc:
       creator_name: Creator
       reason: Motiu del blocatge
       status: Estatut
-      revoker_name: Revocat per
   notes:
     index:
       title: Nòtas somesas o comentadas per %{user}
index 0236ca7c968ce044beaf1810ef32b2dc78ac9193..797f492c42d2e512636b4f124a770ff1c4145fbd 100644 (file)
@@ -1237,7 +1237,10 @@ pa:
         open: ਖੋਲ੍ਹੋ
         resolved: ਹੱਲ-ਕੱਢਿਆ ਗਿਆ
     show:
-      title: '%{status} ਮੁੱਦਾ #%{issue_id}'
+      title:
+        open: 'ਮੁੱਦਾ ਖੋਲ੍ਹੋ #%{issue_id}'
+        ignored: 'ਮੁੱਦਾ ਨਜ਼ਰਅੰਦਾਜ਼ ਕੀਤਾ #%{issue_id}'
+        resolved: 'ਮੁੱਦਾ ਹੱਲ ਕੀਤਾ ਗਿਆ #%{issue_id}'
       no_reports: ਕੋਈ ਇਤਲਾਹ ਨਹੀਂ
       report_created_at_html: ਪਹਿਲੀ ਵਾਰ %{datetime} ਨੂੰ ਇਤਲਾਹ ਕੀਤੀ ਗਈ
       last_resolved_at_html: ਆਖਰੀ ਵਾਰ %{datetime} 'ਤੇ ਹੱਲ ਕੀਤਾ ਗਿਆ
@@ -1407,6 +1410,14 @@ pa:
     show:
       title: ਮੇਰੀਆਂ ਤਰਜੀਹਾਂ
       preferred_languages: ਤਰਜੀਹੀ ਬੋਲੀਆਂ
+      site_color_schemes:
+        auto: ਆਪਣੇ-ਆਪ
+        light: ਚਾਨਣ
+        dark: ਗੂੜ੍ਹਾ
+      map_color_schemes:
+        auto: ਆਪਣੇ-ਆਪ
+        light: ਚਾਨਣ
+        dark: ਗੂੜ੍ਹਾ
       edit_preferences: ਤਰਜੀਹਾਂ ਨੂੰ ਸੋਧੋ
     edit:
       title: ਤਰਜੀਹਾਂ ਨੂੰ ਸੋਧੋ
@@ -1939,6 +1950,10 @@ pa:
         years:
           one: '%{count} ਸਾਲ'
           other: '%{count} ਸਾਲ'
+      short:
+        ended: ਖਤਮ ਹੋ ਗਿਆ/ਗਈ
+        active: ਸਰਗਰਮ
+        expired_unread: ਨਹੀਂ-ਪੜ੍ਹਿਆ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ
     show:
       created: 'ਬਣਾਇਆ ਗਿਆ:'
       duration: 'ਮਿਆਦ:'
@@ -1953,6 +1968,8 @@ pa:
       display_name: ਰੋਕਿਆ ਵਰਤੋਂਕਾਰ
       creator_name: ਸਿਰਜਣਹਾਰ
       reason: ਰੋਕ ਦਾ ਕਾਰਨ
+      start: ਸ਼ੁਰੂ ਕਰੋ
+      end: ਖ਼ਤਮ
       status: ਦਰਜਾ
   user_mutes:
     index:
index 9db8153886a391ac4ac7aa207f254f97336db892..57c80564f69fd1b1c28903f987cc6090e0f98c19 100644 (file)
@@ -125,6 +125,7 @@ pl:
       message: Wiadomość
       node: Węzeł
       node_tag: Znacznik węzła
+      note: Uwaga
       old_node: Stary węzeł
       old_node_tag: Znacznik wcześniejszego węzła
       old_relation: Stara relacja
@@ -1611,7 +1612,10 @@ pl:
         open: Otwórz
         resolved: Rozwiązane
     show:
-      title: '%{status} sprawa #%{issue_id}'
+      title:
+        open: Otwarta sprawa %{issue_id}
+        ignored: Zignorowana sprawa %{issue_id}
+        resolved: Rozwiązana sprawa %{issue_id}
       reports:
         one: '%{count} zgłoszenie'
         few: '%{count} zgłoszenia'
@@ -2012,6 +2016,16 @@ pl:
       title: Preferencje
       preferred_editor: 'Preferowane edytowanie w:'
       preferred_languages: 'Preferowane języki:'
+      preferred_site_color_scheme: Preferowany układ kolorystyczny strony
+      site_color_schemes:
+        auto: automatyczny
+        light: jasny
+        dark: ciemny
+      preferred_map_color_scheme: Preferowana kolorystyka mapy
+      map_color_schemes:
+        auto: automatyczna
+        light: jasna
+        dark: ciemna
       edit_preferences: Edytuj preferencje
     edit:
       title: Edycja preferencji
@@ -3081,6 +3095,15 @@ pl:
           few: '%{count} lata'
           many: '%{count} lat'
           other: '%{count} roku'
+      short:
+        ended: zakończona
+        revoked_html: odwołana przez %{name}
+        active: aktywna
+        active_unread: aktywna, nieprzeczytana
+        expired_unread: wygasła, nieprzeczytana
+        read_html: przeczytana %{time}
+        time_in_future_title: '%{time_absolute}; za %{time_relative}'
+        time_in_past_title: '%{time_absolute}; %{time_relative}'
     blocks_on:
       title: Blokady na użytkownika %{name}
       heading_html: Lista blokad na użytkownika %{name}
@@ -3099,15 +3122,15 @@ pl:
       reason: 'Przyczyna blokady:'
       revoker: 'Cofający uprawnienia:'
     block:
-      not_revoked: (nieodwołana)
       show: Pokaż
       edit: Edytuj
     page:
       display_name: Zablokowany użytkownik
       creator_name: Twórca
       reason: Powód blokady
+      start: Początek
+      end: Koniec
       status: Status
-      revoker_name: Odwołana przez
     navigation:
       all_blocks: Wszystkie blokady
       blocks_on_me: Blokady nałożone na mnie
index 7c325bb305305cb597aff604a4ef86d08b4a6c60..28d5d9d430a7fda84d81267ca1c4d8fad1dd4fd0 100644 (file)
@@ -1112,7 +1112,6 @@ pnb:
         other: '%{count} رپورٹاں'
       reported_item: رپورٹ دی چیز
     show:
-      title: '[%{status}] مسئلہ: %{issue_id}'
       reports:
         other: zeroرپورٹ نہیں
         one: اِکّ رپورٹ
@@ -1882,7 +1881,6 @@ pnb:
       edit: سودھو
       revoker: 'پرتاؤݨ والا:'
     block:
-      not_revoked: (نہیں پرتائی دتی گئی)
       show: وکھاؤ
       edit: سودھو
     page:
index 1a5f2f122393bbe7dd36e8f69115eb572b113545..c630bb0874e8c6857b7c1acfb2e2dbfb1c135a93 100644 (file)
@@ -1560,7 +1560,6 @@ pt-PT:
         open: Aberta
         resolved: Resolvida
     show:
-      title: '%{status} Denúncia #%{issue_id}'
       reports:
         one: '%{count} denúncia'
         other: '%{count} denúncias'
@@ -3028,7 +3027,6 @@ pt-PT:
       reason: 'Razão do bloqueio:'
       revoker: 'Quem revogou:'
     block:
-      not_revoked: (não revogado)
       show: Mostrar
       edit: Editar
     page:
@@ -3036,7 +3034,6 @@ pt-PT:
       creator_name: Criador
       reason: Motivo do bloqueio
       status: Estado
-      revoker_name: Revogado por
     navigation:
       all_blocks: Todos os bloqueios
       blocks_on_me: Quem me bloqueou
index 5a819de188afb4b2284d14ff4fc8f0b118b14e5e..9dc15c51d7ee12be3736677d3ee7061df4c81bdc 100644 (file)
@@ -1579,7 +1579,6 @@ pt:
         open: Abrir
         resolved: Resolvido
     show:
-      title: '%{status} Problema #%{issue_id}'
       reports:
         one: '%{count} denúncia'
         other: '%{count} denúncias'
@@ -3055,7 +3054,6 @@ pt:
       reason: 'Razão do bloqueio:'
       revoker: 'Quem retirou:'
     block:
-      not_revoked: (não retirado)
       show: Exibir
       edit: Editar
     page:
@@ -3063,7 +3061,6 @@ pt:
       creator_name: Criador
       reason: Razão para o bloqueio
       status: Status
-      revoker_name: Retirado por
     navigation:
       all_blocks: Todos os bloqueios
       blocks_on_me: Bloqueios sobre mim
index 4601eb5e44df63d00630a9db5ee7f092aad7c58c..4f30d10cac321739830a7d7913ca86afd83f9e11 100644 (file)
@@ -1507,7 +1507,6 @@ ro:
         open: Deschis
         resolved: Rezolvat
     show:
-      title: '%{status} Problema #%{issue_id}'
       reports:
         one: '%{count} raport'
         few: '%{count} raporturi'
@@ -2944,7 +2943,6 @@ ro:
       reason: 'Motivul blocării:'
       revoker: Revocă!
     block:
-      not_revoked: (nu este revocată)
       show: Arată
       edit: Modificare
     page:
@@ -2952,7 +2950,6 @@ ro:
       creator_name: Creator
       reason: Motivul blocării
       status: Stare
-      revoker_name: Revocat de
   user_mutes:
     index:
       table:
index 86b9b6eb29fcdfe5a5a138de85c5af9518f89b5c..fc7bdc4cdd33e2aae161f9a56462e63c155cf854 100644 (file)
@@ -171,6 +171,7 @@ ru:
       message: Сообщение
       node: Точка
       node_tag: Тег точки
+      note: Заметка
       old_node: Старая точка
       old_node_tag: Старый тег точки
       old_relation: Старое отношение
@@ -563,15 +564,36 @@ ru:
       introduction: Нажмите на карту, чтобы найти ближайшие объекты
       nearby: Ближайшие объекты
       enclosing: Окружающие объекты
+  nodes:
+    timeout:
+      sorry: Извините, данные для точки с id %{id} потребовали слишком много времени
+        для извлечения.
   old_nodes:
     not_found:
       sorry: 'К сожалению, узел #%{id} версии %{version} не найден.'
+    timeout:
+      sorry: Извините, история точки с id %{id} потребовала слишком много времени
+        для извлечения.
+  ways:
+    timeout:
+      sorry: Извините, данные для линии с id %{id} потребовали слишком много времени
+        для извлечения.
   old_ways:
     not_found:
       sorry: 'К сожалению, путь #%{id} версии %{version} не найден.'
+    timeout:
+      sorry: Извините, история линии с id %{id} потребовала слишком много времени
+        для извлечения.
+  relations:
+    timeout:
+      sorry: Извините, данные для отношения с id %{id} потребовали слишком много времени
+        для извлечения.
   old_relations:
     not_found:
       sorry: 'К сожалению, отношение #%{id} версии %{version} не найдено.'
+    timeout:
+      sorry: Извините, история отношения с id %{id} потребовала слишком много времени
+        для извлечения.
   changeset_comments:
     feeds:
       comment:
@@ -1638,7 +1660,10 @@ ru:
         other: '%{count} сообщений'
       reported_item: Элемент в сообщении
     show:
-      title: '%{status} Проблема #%{issue_id}'
+      title:
+        open: 'Открытая проблема #%{issue_id}'
+        ignored: 'Проигнорированная проблема #%{issue_id}'
+        resolved: 'Разрешённая проблема #%{issue_id}'
       reports:
         one: 1 сообщение
         few: '%{count} сообщения'
@@ -2989,7 +3014,6 @@ ru:
       reason: 'Причина блокировки:'
       revoker: 'Разблокировавший:'
     block:
-      not_revoked: (не разблокирован)
       show: Показать
       edit: Править
     page:
@@ -2997,7 +3021,6 @@ ru:
       creator_name: Автор
       reason: Причина блокировки
       status: Состояние
-      revoker_name: Разблокировал
   user_mutes:
     index:
       title: Заглушённые пользователи
index 2de82f03a53e44cfac92d146499f41f60d22933d..b6662e13724711c789d755ec802cfb2e4a859c17 100644 (file)
@@ -1452,7 +1452,6 @@ sc:
         other: '%{count} sinnalatziones'
       reported_item: Elementu sinnaladu
     show:
-      title: '%{status} Problema #%{issue_id}'
       reports:
         one: '%{count} sinnalatzione'
         other: '%{count} sinnalatziones'
@@ -2851,7 +2850,6 @@ sc:
       reason: 'Resone de su blocu:'
       revoker: 'Revocadore:'
     block:
-      not_revoked: (non revocadu)
       show: Ammustra
       edit: Modìfica
     page:
@@ -2859,7 +2857,6 @@ sc:
       creator_name: Creadore
       reason: Resone de su blocu
       status: Istadu
-      revoker_name: Revocadu dae
     navigation:
       all_blocks: Totu sos blocos
       blocks_on_me: Blocos subra a mene
index 850d9d5a2dbe7c4ab486f2bcb16ae039e2dc3318..8d59144198507c3ea7ec7dd54728672f96a782c2 100644 (file)
@@ -16,7 +16,7 @@ scn:
       friendly: '%e %B %Y ê %H:%M'
   helpers:
     file:
-      prompt: Scarta u pricu
+      prompt: Scarta lu file
     submit:
       diary_comment:
         create: Cummenta
@@ -118,13 +118,13 @@ scn:
       trace:
         user: Utenti
         visible: Visìbbili
-        name: Nomu dû pricu
+        name: Nomu dû file
         size: Grannizza
         latitude: Latitùdini
         longitude: Luncitùdini
         public: Pùbblicu
         description: Discrizzioni
-        gpx_file: Scarta u pricu dâ traccia GPS
+        gpx_file: Scarta lu file dâ traccia GPS
         visibility: Visibbilità
         tagstring: Etichetti
       message:
@@ -1342,7 +1342,7 @@ scn:
         html: Stai taliannu la virsioni n lingua ngrisa dâ pàggina dû drittu d'auturi.
           Poi turnari â %{native_link} di sta pàggina o puru poi finiri di nfurmàriti
           supra ô drittu d'auturi e %{mapping_link}.
-        native_link: virsioni n sicilianu
+        native_link: virsioni 'n sicilianu
         mapping_link: accuminzari a mappari
       legal_babble:
         credit_title_html: Comu s'attribbuisci a OpenStreetMap
@@ -1838,7 +1838,6 @@ scn:
       reason: 'Mutivu dû bloccu:'
       revoker: 'Rivucaturi:'
     block:
-      not_revoked: (nun arrivucatu)
       show: Ammustra
       edit: Cancia
     page:
@@ -1846,7 +1845,6 @@ scn:
       creator_name: Criaturi
       reason: Mutivu dû bloccu
       status: Statu
-      revoker_name: Arrivucatu di
   notes:
     index:
       title: Noti scritti o cummintati di l'utenti %{user}
index f50460fdfa77d342526313a6cfaf01fe1a173d60..27b2cc55316f142ed34280e955839dba813c247a 100644 (file)
@@ -1,4 +1,4 @@
-# Messages for Serbo-Croatian (srpskohrvatski / српскохрватски)
+# Messages for Serbo-Croatian (Latin script) (srpskohrvatski (latinica))
 # Exported from translatewiki.net
 # Export driver: phpyaml
 # Author: Vlad5250
index 5a4472b60efa1184fce5dce831bda54fdda04dd0..230bafef4ebb5968defb2b529aa56a4077a46c84 100644 (file)
@@ -1515,7 +1515,6 @@ sk:
         open: Otvorené
         resolved: Vyriešené
     show:
-      title: '%{status} Problém #%{issue_id}'
       reports:
         one: '%{count} hlásenie'
         few: '%{count} hlásenia'
@@ -2835,7 +2834,6 @@ sk:
       reason: 'Dôvod blokovania:'
       revoker: 'Odvolal:'
     block:
-      not_revoked: (nezrušený)
       show: Zobraziť
       edit: Upraviť
     page:
@@ -2843,7 +2841,6 @@ sk:
       creator_name: Tvorca
       reason: Dôvod pre blokovanie
       status: Stav
-      revoker_name: Zrušil
   user_mutes:
     index:
       title: Stlmení používatelia
index 01fd59b038c04c1c885218260ecbfdd238c7f2a9..785e32e8b0daf5f06dd63e292c1b7ac6b35aa4cf 100644 (file)
@@ -53,6 +53,7 @@ skr-arab:
       message: سنیہہ
       node: نوڈ
       node_tag: نوڈ ٹیگ
+      note: نوٹ
       old_node: پراݨا نوڈ
       old_node_tag: پراݨا نوڈ ٹیگ
       old_relation: پراݨا رشتہ
@@ -1076,6 +1077,14 @@ skr-arab:
       title: میݙیاں ترجیحاں
       preferred_editor: ترجیحی ایڈیٹر
       preferred_languages: ترجیحی زباناں
+      site_color_schemes:
+        auto: خود کار
+        light: پھکّا
+        dark: ڳوڑھا
+      map_color_schemes:
+        auto: خود بخود
+        light: پھکّا
+        dark: ڳوڑھا
       edit_preferences: ترجیحاں وچ تبدیلی کرو
     edit:
       save: ترجیحاں اپ ڈیٹ کرو
index 5a31955f6db5caa313e6775ba8bf2e2ca4c71138..c5bada9ae40e3f298fa61446a9d00ccbf73086c8 100644 (file)
@@ -1517,7 +1517,6 @@ sl:
         other: '%{count} poročil'
       reported_item: Prijavljeni predmet
     show:
-      title: '%{status} Težava #%{issue_id}'
       reports:
         one: '%{count} prijava'
         two: '%{count} prijavi'
@@ -2969,7 +2968,6 @@ sl:
       reason: 'Razlog za blokiranje:'
       revoker: 'Preklical:'
     block:
-      not_revoked: (ni preklicano)
       show: Prikaži
       edit: Uredi
     page:
@@ -2977,7 +2975,6 @@ sl:
       creator_name: Ustvarjalec
       reason: Razlog za blokiranje
       status: Stanje
-      revoker_name: Preklical
     navigation:
       block: 'Blokiraj #%{id}'
   user_mutes:
index 37686e78680d4fc77715907e6d609b119a546faa..8c9a0b8cf5257f8f6ad8433caa83b48aa9ede1bb 100644 (file)
@@ -1316,7 +1316,6 @@ sq:
       edit: Redakto
     page:
       status: Statusi
-      revoker_name: Revokuar nga
   notes:
     show:
       title: 'Shënim: %{id}'
index 5b2fbfd147e97c0339c936bbd15cef1da16d1efc..4eb3b4b2adc16391a236911bd55cd41e2b106020 100644 (file)
@@ -1234,7 +1234,6 @@ sr-Latn:
       reason: 'Razlog za blokiranje:'
       revoker: 'Opozivalac:'
     block:
-      not_revoked: (nije opozvano)
       show: Prikaži
       edit: Uredi
     page:
@@ -1242,7 +1241,6 @@ sr-Latn:
       creator_name: Tvorac
       reason: Razlozi za blokiranje
       status: Stanje
-      revoker_name: Opozvao
   notes:
     notes_paging_nav:
       showing_page: Prikaz stranice %{page}
index 686541447ddfa0780442a0cefb1f11079f33f04e..51469b5fb62e995874e33f7b37574e4f7fbcc199 100644 (file)
@@ -71,6 +71,7 @@ sr:
       message: Порука
       node: Чвор
       node_tag: Ознака тачке
+      note: Напомена
       old_node: Стари чвор
       old_node_tag: Ознака старе тачке
       old_relation: Стари однос
@@ -1554,6 +1555,11 @@ sr:
       title: Моја подешавања
       preferred_editor: Жељени уређивач
       preferred_languages: Жељени језици
+      site_color_schemes:
+        dark: Тамна
+      map_color_schemes:
+        auto: Аутоматски
+        light: Светла
       edit_preferences: Уреди подешавања
     edit:
       title: Моја подешавања
@@ -2261,7 +2267,6 @@ sr:
       reason: 'Разлог за блокирање:'
       revoker: 'Опозивалац:'
     block:
-      not_revoked: (није опозвано)
       show: Прикажи
       edit: Уреди
     page:
@@ -2269,7 +2274,6 @@ sr:
       creator_name: Творац
       reason: Разлози за блокирање
       status: Стање
-      revoker_name: Опозвао
   user_mutes:
     index:
       title: Пригушени корисници
index 5f124b2936249a34017bcd72651acd50c85dfd2c..5a56f08bea0b88f34a23fd5a4dfab3e5673803dc 100644 (file)
@@ -1548,7 +1548,6 @@ sv:
         open: Öppen
         resolved: Löst
     show:
-      title: '%{status} Ärende nr %{issue_id}'
       reports:
         one: '%{count} rapport'
         other: '%{count} rapporter'
@@ -3023,7 +3022,6 @@ sv:
       reason: 'Anledning för blockering:'
       revoker: 'Återkallare:'
     block:
-      not_revoked: (Inte återkallat)
       show: Visa
       edit: Redigera
     page:
@@ -3031,7 +3029,6 @@ sv:
       creator_name: Skapare
       reason: Orsak till blockering
       status: Status
-      revoker_name: Återkallad av
     navigation:
       all_blocks: Alla blockeringar
       blocks_on_me: Blockeringar på mig
index 49d0fd69a6fb144364507645adb04f763c7c6c74..a1f60b95fd15502acc4b81cbda2c6721ab5f71be 100644 (file)
@@ -1353,7 +1353,6 @@ te:
         other: '%{count} ఫిర్యాదులు'
       reported_item: అంశంపై ఫిర్యాదు చేసారు
     show:
-      title: '%{status} అంశం #%{issue_id}'
       report_created_at_html: '%{datetime} న మొదటిసారి ఫిర్యాదు చేసారు'
       last_resolved_at_html: '%{datetime} న చివరిగా పరిష్కరించారు'
       last_updated_at_html: చివరిగా %{displayname} గారు %{datetime} కు తాజాకరించారు
@@ -2272,7 +2271,6 @@ te:
       reason: 'నిరోధానికి కారణం:'
       revoker: 'ఎత్తివేసేవారు:'
     block:
-      not_revoked: (ఎత్తివేయలేదు)
       show: చూపించు
       edit: మార్చు
     page:
@@ -2280,7 +2278,6 @@ te:
       creator_name: సృష్టికర్త
       reason: నిరోధానికి కారణం
       status: స్థితి
-      revoker_name: ఎత్తివేసినవారు
   notes:
     index:
       title: గమనికలు సమర్పించినది లేదా వ్యాఖ్యానించినది %{user}
index 19e3c8483c7b83e0a1ef05dde208a2e0488f232a..e17cdee5840ad85d3784faa27b77788b729ec7ff 100644 (file)
@@ -1444,7 +1444,6 @@ th:
         other: '%{count} การรายงาน'
       reported_item: รายการที่รายงาน
     show:
-      title: 'ปัญหา %{status} #%{issue_id}'
       reports:
         other: '%{count} การรายงาน'
       no_reports: ไม่มีรายงาน
@@ -2234,7 +2233,6 @@ th:
       edit: แก้ไข
       reason: 'เหตุผลสำหรับการระงับใช้งาน:'
     block:
-      not_revoked: (ไม่ได้มีการยกเลิก)
       show: แสดง
       edit: แก้ไข
     page:
@@ -2242,7 +2240,6 @@ th:
       creator_name: ผู้สั่งให้ระงับ
       reason: เหตุผลที่ต้องระงับใช้งาน
       status: สถานะ
-      revoker_name: ยกเลิกโดย
   notes:
     index:
       heading: หมายเหตุของ %{user}
index 2df1597c6b762e78f6d3bfd91c7125d44afaaaa5..eaa8b6ed63786e5ba55f4e268838ae4feeb7140f 100644 (file)
@@ -1113,7 +1113,6 @@ tl:
         other: '%{count} mga Ulat'
       reported_item: Naiulat na bagay
     show:
-      title: '%{status} Isyu #%{issue_id}'
       reports:
         one: 1 ulat
         other: '%{count} mga ulat'
@@ -1978,7 +1977,6 @@ tl:
       reason: 'Dahilan ng paghadlang:'
       revoker: 'Tagapagbawi:'
     block:
-      not_revoked: (hindi binawi)
       show: Ipakita
       edit: Baguhin
     page:
@@ -1986,7 +1984,6 @@ tl:
       creator_name: Tagapaglikha
       reason: Dahilan ng pagharang
       status: Kalagayan
-      revoker_name: Binawi ni
   notes:
     index:
       title: Mga tala na isinumite o pinuna ni %{user}
index bff10101ec8a1944a760424e3f90c9b18aa98898..ece5bf7cbb5910be2e6815458786de759b426c30 100644 (file)
@@ -1541,7 +1541,6 @@ tr:
         open: Aç
         resolved: Çözüldü
     show:
-      title: '%{status} Sorun #%{issue_id}'
       reports:
         one: '%{count} rapor'
         other: '%{count} rapor'
@@ -3019,7 +3018,6 @@ tr:
       reason: 'Engellenme sebebi:'
       revoker: 'Geri alan:'
     block:
-      not_revoked: (iptal edilmemiş)
       show: Göster
       edit: Düzenle
     page:
@@ -3027,7 +3025,6 @@ tr:
       creator_name: Oluşturan
       reason: Engellenme sebebi
       status: Durum
-      revoker_name: İptal eden
     navigation:
       all_blocks: Tüm Engellemeler
       blocks_on_me: Engellendiklerim
index 12fbcd1996731ce53584e8e6df68e9ab6704658a..4fc01f7ada6e0aa6a7a3d23d89c1f892d295d468 100644 (file)
@@ -105,6 +105,7 @@ uk:
       message: Повідомлення
       node: Точка
       node_tag: Теґ точки
+      note: Примітка
       old_node: Стара точка
       old_node_tag: Старий теґ точки
       old_relation: Старий зв’язок
@@ -1601,7 +1602,6 @@ uk:
         open: Відкрито
         resolved: Вирішено
     show:
-      title: 'Звернення #%{issue_id} - %{status}'
       reports:
         one: '%{count} скарга'
         few: '%{count} скарги'
@@ -3109,7 +3109,6 @@ uk:
       reason: 'Причина блокування:'
       revoker: 'Розблокував:'
     block:
-      not_revoked: (не розблокований)
       show: Показати
       edit: Редагувати
     page:
@@ -3117,7 +3116,6 @@ uk:
       creator_name: Автор
       reason: Причина блокування
       status: Стан
-      revoker_name: Розблокував
     navigation:
       all_blocks: Всі блокування
       blocks_on_me: Мої блокування
index 3f31c152aeb393341d09f4eaa46f54492e93b12a..4b1f3280e601d494d6e1a93970b0dbc104efd34f 100644 (file)
@@ -82,6 +82,7 @@ vi:
       message: Thư
       node: Nốt
       node_tag: Thẻ Nốt
+      note: Ghi chú
       old_node: Nốt Cũ
       old_node_tag: Thẻ Nốt Cũ
       old_relation: Quan hệ Cũ
@@ -373,7 +374,7 @@ vi:
         way: Lối
         relation: Quan hệ
     containing_relation:
-      entry_role_html: 'Quan hệ %{relation_name} (vai trò: %{relation_role})'
+      entry_role_html: '%{relation_name} (vai trò: %{relation_role})'
     not_found:
       title: Không Tìm thấy
       sorry: 'Rất tiếc, không tìm thấy %{type} #%{id}.'
@@ -385,8 +386,8 @@ vi:
         note: ghi chú
     timeout:
       title: Lỗi Hết Thời gian Chờ
-      sorry: Rất tiếc, việc lấy dữ liệu loại %{type} có ID %{id} vượt quá thời gian
-        cho phép.
+      sorry: Rất tiếc, việc lấy dữ liệu cho phần tử kiểu %{type} số %{id} vượt quá
+        thời gian cho phép.
       type:
         node: nốt
         way: lối
@@ -424,20 +425,30 @@ vi:
       enclosing: Yếu tố bao gồm
   nodes:
     timeout:
-      sorry: Rất tiếc, việc lấy dữ liệu cho node có ID %{id} vượt quá thời gian cho
-        phép.
+      sorry: Rất tiếc, việc lấy dữ liệu cho nốt số %{id} vượt quá thời gian cho phép.
   old_nodes:
     not_found:
       sorry: 'Rất tiếc, không tìm thấy nốt #%{id} phiên bản %{version}.'
     timeout:
-      sorry: Rất tiếc, việc lấy lịch sử cho node có ID %{id} vượt quá thời gian cho
-        phép.
+      sorry: Rất tiếc, việc lấy lịch sử cho nốt số %{id} vượt quá thời gian cho phép.
+  ways:
+    timeout:
+      sorry: Rất tiếc, việc lấy dữ liệu cho lối số %{id} vượt quá thời gian cho phép.
   old_ways:
     not_found:
       sorry: 'Rất tiếc, không tìm thấy lối #%{id} phiên bản %{version}.'
+    timeout:
+      sorry: Rất tiếc, việc lấy lịch sử cho lối số %{id} vượt quá thời gian cho phép.
+  relations:
+    timeout:
+      sorry: Rất tiếc, việc lấy dữ liệu cho quan hệ số %{id} vượt quá thời gian cho
+        phép.
   old_relations:
     not_found:
       sorry: 'Rất tiếc, không tìm thấy #%{id} phiên bản %{version}.'
+    timeout:
+      sorry: Rất tiếc, việc lấy lịch sử cho quan hệ số %{id} vượt quá thời gian cho
+        phép.
   changeset_comments:
     feeds:
       comment:
@@ -619,6 +630,8 @@ vi:
       post: Mục nhật ký
       when: Lúc đăng
       comment: Nhận xét
+    new:
+      heading: Thêm bình luận vào cuộc thảo luận về mục nhật ký sau đây?
   doorkeeper:
     errors:
       messages:
@@ -1397,6 +1410,7 @@ vi:
     page:
       user_not_found: Người dùng không tồn tại
       issues_not_found: Không tìm thấy vấn đề
+      reported_user: Người dùng Báo cáo
       status: Trạng thái
       reports: Báo cáo
       last_updated: Lần Cập nhật Cuối
@@ -1404,8 +1418,15 @@ vi:
       reports_count:
         other: '%{count} Báo cáo'
       reported_item: Mục Báo cáo
+      states:
+        ignored: Bỏ qua
+        open: Mở
+        resolved: Giải quyết
     show:
-      title: 'Vấn đề %{status} #%{issue_id}'
+      title:
+        open: 'Vấn đề Mở #%{issue_id}'
+        ignored: 'Vấn đề Bỏ qua #%{issue_id}'
+        resolved: 'Vấn đề Giải quyết #%{issue_id}'
       reports:
         other: '%{count} báo cáo'
       no_reports: Không có báo cáo
@@ -1504,6 +1525,7 @@ vi:
       hiện những công việc bảo quản cơ sở dữ liệu cần thiết.
     osm_read_only: Cơ sở dữ liệu OpenStreetMap đang bị khóa không được sửa đổi trong
       lúc đang thực hiện những công việc bảo quản cơ sở dữ liệu cần thiết.
+    nothing_to_preview: Không có gì để xem trước.
     help: Trợ giúp
     about: Giới thiệu
     copyright: Bản quyền
@@ -1545,13 +1567,21 @@ vi:
       befriend_them_html: Bạn cũng có thể thêm họ vào danh sách bạn bè của bạn tại
         %{befriendurl}.
     gpx_description:
-      description_with_tags_html: 'Hình như tập tin GPX %{trace_name} của bạn có lời
-        miêu tả %{trace_description} và các thẻ sau: %{tags}'
-      description_with_no_tags_html: Hình như tập tin GPX %{trace_name} của bạn có
-        lời miêu tả %{trace_description} và không có thẻ
+      description_with_tags: 'Hình như tập tin %{trace_name} của bạn có lời miêu tả
+        %{trace_description} và các thẻ sau: %{tags}'
+      description_with_tags_html: 'Hình như tập tin %{trace_name} của bạn có lời miêu
+        tả %{trace_description} và các thẻ sau: %{tags}'
+      description_with_no_tags: Hình như tập tin %{trace_name} của bạn có lời miêu
+        tả %{trace_description} và không có thẻ
+      description_with_no_tags_html: Hình như tập tin %{trace_name} của bạn có lời
+        miêu tả %{trace_description} và không có thẻ
     gpx_failure:
       hi: Chào %{to_user},
-      failed_to_import: 'không nhập thành công. Đã gặp lỗi này:'
+      failed_to_import: 'không nhập thành công là tập tin tuyến GPS. Vui lòng kiểm
+        tra rằng tập tin của bạn là tập tin GPX hợp lệ hoặc gói chứa (các) tập tin
+        dưới định dạng được hỗ trợ (.tar.gz, .tar.bz2, .tar, .zip, .gpx.gz, .gpx.bz2).
+        Tập tin của bạn có phải có vấn đề định dạng hoặc cú pháp không? Lỗi nhập là:'
+      more_info: Tìm hiểu thêm về lỗi nhập GPX và cách tránh lỗi tại %{url}.
       more_info_html: Tìm hiểu thêm về lỗi nhập GPX và cách tránh lỗi tại %{url}.
       import_failures_url: https://wiki.openstreetmap.org/wiki/GPX_Import_Failures?uselang=vi
       subject: '[OpenStreetMap] Nhập GPX thất bại'
@@ -1559,6 +1589,9 @@ vi:
       hi: Chào %{to_user},
       loaded:
         other: tải thành công với %{trace_points} điểm trên tổng số %{count} điểm.
+      trace_location: Tuyến GPX của bạn có sẵn tại %{trace_url}
+      all_your_traces: Bạn có thể truy cập tất cả các tuyến GPX mà bạn đã tải lên
+        thành công tại %{url}
       all_your_traces_html: Bạn có thể truy cập tất cả các tuyến GPX mà bạn đã tải
         lên thành công tại %{url}.
       subject: '[OpenStreetMap] Nhập GPX thành công'
@@ -1771,6 +1804,16 @@ vi:
       title: Tùy chỉnh
       preferred_editor: Trình vẽ Ưu tiên
       preferred_languages: Ngôn ngữ Ưu tiên
+      preferred_site_color_scheme: Bộ màu Trang Ưa thích
+      site_color_schemes:
+        auto: Tự động
+        light: Sáng
+        dark: Tối
+      preferred_map_color_scheme: Bộ màu Bản đồ Ưa thích
+      map_color_schemes:
+        auto: Tự động
+        light: Sáng
+        dark: Tối
       edit_preferences: Thay đổi Tùy chỉnh
     edit:
       title: Thay đổi Tùy chỉnh
@@ -1847,6 +1890,7 @@ vi:
     richtext_field:
       edit: Sửa đổi
       preview: Xem trước
+      help: Trợ giúp
     pagination:
       diary_comments:
         older: Các Nhận xét Cũ hơn
@@ -1854,6 +1898,9 @@ vi:
       diary_entries:
         older: Mục cũ hơn
         newer: Mục mới hơn
+      issues:
+        older: Vấn đề Cũ hơn
+        newer: Vấn đề Mới hơn
       traces:
         older: Tuyến đường Cũ hơn
         newer: Tuyến đường Mới hơn
@@ -2031,6 +2078,8 @@ vi:
         infringement_1_html: Những người đóng góp vào OSM được khuyên không bao giờ
           bổ sung dữ liệu từ những nguồn có bản quyền (chẳng hạn Bản đồ Google hoặc
           các bản đồ trên giấy) trước khi các nhà giữ bản quyền cho phép rõ ràng.
+        infringement_2_1_takedown_procedure: thủ tục tháo gỡ
+        infringement_2_1_online_filing_page: trang nộp đơn trực tuyến
         trademarks_title: Nhãn hiệu
         trademarks_1_1_html: |-
           OpenStreetMap, biểu trưng kính lúp, và State of the Map là các nhãn hiệu do Quỹ OpenStreetMap đăng ký. Nếu bạn có thắc mắc về việc sử dụng các nhãn hiệu, xin vui lòng xem
@@ -2423,6 +2472,7 @@ vi:
       oauth2_authorizations: Ủy quyền OAuth 2
       muted_users: Người dùng bị Tắt tiếng
     auth_providers:
+      openid_url: Địa chỉ OpenID
       openid_login_button: Tiếp tục
       openid:
         title: Đăng nhập qua OpenID
@@ -2572,6 +2622,7 @@ vi:
       informal_translations: bản dịch không chính thức
       continue: Tiếp tục
       declined: https://wiki.openstreetmap.org/wiki/Contributor_Terms_Declined?uselang=vi
+      cancel: Hủy bỏ
       you need to accept or decline: Để tiếp tục, xin vui lòng đọc các Điều khoản
         Đóng góp mới và chấp nhận hoặc từ chối chúng.
       legale_select: 'Vui lòng chọn quốc gia cư trú:'
@@ -2771,15 +2822,15 @@ vi:
       reason: 'Lý do cấm:'
       revoker: 'Người bỏ cấm:'
     block:
-      not_revoked: (không bị hủy)
       show: Hiện
       edit: Sửa đổi
     page:
       display_name: Người bị cấm
       creator_name: Người cấm
       reason: Lý do cấm
+      start: Bắt đầu
+      end: Kết thúc
       status: Trạng thái
-      revoker_name: Người bỏ cấm
     navigation:
       all_blocks: Tất cả các Tác vụ Cấm
       blocks_on_me: Tác vụ Cấm Tôi
@@ -2787,6 +2838,7 @@ vi:
       blocks_by_me: Tác vụ Cấm bởi Tôi
       blocks_by_user_html: Tác vụ Cấm bởi %{user}
       block: Tác vụ cấm số %{id}
+      new_block: Tác vụ Cấm Mới
   user_mutes:
     index:
       title: Người dùng bị Tắt tiếng
@@ -2823,6 +2875,11 @@ vi:
       description: Miêu tả
       created_at: Lúc tạo
       last_changed: Thay đổi gần đây nhất
+      apply: Áp dụng
+      all: Tất cả
+      open: Mở
+      closed: Đóng
+      status: Trạng thái
     show:
       title: 'Ghi chú: %{id}'
       description: Miêu tả
@@ -2841,6 +2898,9 @@ vi:
       report: báo cáo ghi chú này
       anonymous_warning: Ghi chú này có bình luận của người dùng vô danh đóng góp;
         các bình luận này cần được xác nhận lại.
+      discussion: Thảo luận
+      subscribe: Theo dõi
+      unsubscribe: Ngừng theo dõi
       hide: Ẩn
       resolve: Giải quyết
       reactivate: Mở lại
@@ -2869,6 +2929,8 @@ vi:
       add: Thêm Ghi chú
     notes_paging_nav:
       showing_page: Trang %{page}
+      next: Sau
+      previous: Trước
   javascripts:
     close: Đóng
     share:
@@ -2883,14 +2945,15 @@ vi:
       custom_dimensions: Tùy biến kích thước
       format: 'Định dạng:'
       scale: 'Tỷ lệ:'
-      image_dimensions: Hình của lớp tiêu chuẩn với kích thước %{width}×%{height}
+      image_dimensions: Hình của lớp %{layer} với kích thước %{width}×%{height}
       download: Tải về
       short_url: URL Ngắn gọn
       include_marker: Ghim trên bản đồ
       center_marker: Chuyển ghim vào giữa bản đồ
       paste_html: Dán HTML để nhúng vào trang Web
       view_larger_map: Xem Bản đồ Rộng hơn
-      only_standard_layer: Chỉ có thể xuất lớp chuẩn ra hình ảnh
+      only_standard_layer: Chỉ có thể xuất các lớp Chuẩn, Bản đồ Xe đạp, và Bản đồ
+        Giao thông ra hình ảnh
     embed:
       report_problem: Báo vấn đề
     key:
index d764999195a7fe613f90fd87a9a6d4598f916adf..f31c415d31ceca9685d453118c0eb61efde4a011 100644 (file)
@@ -141,6 +141,7 @@ zh-CN:
       message: 消息
       node: 节点
       node_tag: 节点标签
+      note: 注释
       old_node: 旧节点
       old_node_tag: 旧节点标签
       old_relation: 旧关系
@@ -423,7 +424,7 @@ zh-CN:
         way: 路径
         relation: 关系
     containing_relation:
-      entry_role_html: 关系 %{relation_name} (作为 %{relation_role})
+      entry_role_html: '%{relation_name} (作为 %{relation_role})'
     not_found:
       title: 未找到
       sorry: '抱歉,无法找到 %{type} #%{id}。'
@@ -1544,7 +1545,6 @@ zh-CN:
         open: 开放
         resolved: 已解决
     show:
-      title: '%{status}问题#%{issue_id}'
       reports:
         one: '%{count}个举报'
         other: '%{count}个举报'
@@ -2784,7 +2784,6 @@ zh-CN:
       reason: 封禁的原因:
       revoker: 撤销者:
     block:
-      not_revoked: (未撤销)
       show: 显示
       edit: 编辑
     page:
@@ -2792,7 +2791,6 @@ zh-CN:
       creator_name: 创建者
       reason: 封禁的原因
       status: 状态
-      revoker_name: 撤销者
     navigation:
       all_blocks: 所有封禁
       blocks_on_me: 对我的封禁
index 7552d4882d67d459d0d026f6770cca177144f7ee..471725411d9d967d125201432b86e7def2ca7eff 100644 (file)
@@ -1499,7 +1499,6 @@ zh-TW:
         open: 開放
         resolved: 已解決
     show:
-      title: '%{status} 問題 #%{issue_id}'
       reports:
         one: '%{count} 份回報'
         other: '%{count} 份回報'
@@ -2756,7 +2755,6 @@ zh-TW:
       reason: 封鎖的理由:
       revoker: 撤銷者:
     block:
-      not_revoked: (沒有撤銷)
       show: 顯示
       edit: 編輯
     page:
@@ -2764,7 +2762,6 @@ zh-TW:
       creator_name: 建立者
       reason: 封鎖的理由
       status: 狀態
-      revoker_name: 撤銷者
     navigation:
       all_blocks: 所有封鎖
       blocks_on_me: 對我的封鎖
index 31b42f99f38063c4df7a6767b15f8e09ab164320..89e6364091b88e2af02560be9fd7531615a7a99e 100644 (file)
@@ -77,25 +77,25 @@ OpenStreetMap::Application.routes.draw do
         put "" => "user_preferences#update_all", :as => ""
       end
     end
+  end
 
-    resources :messages, :path => "user/messages", :constraints => { :id => /\d+/ }, :only => [:create, :show, :destroy], :controller => "messages", :as => :api_messages do
+  namespace :api, :path => "api/0.6" do
+    resources :messages, :path => "user/messages", :constraints => { :id => /\d+/ }, :only => [:create, :show, :update, :destroy] do
       collection do
         get "inbox"
         get "outbox"
       end
     end
+    post "/user/messages/:id" => "messages#update"
 
-    post "/user/messages/:id" => "messages#update", :as => :api_message_update
-
-    post "gpx/create" => "traces#create"
-    get "gpx/:id" => "traces#show", :as => :api_trace, :id => /\d+/
-    put "gpx/:id" => "traces#update", :id => /\d+/
-    delete "gpx/:id" => "traces#destroy", :id => /\d+/
-    get "gpx/:id/details" => "traces#show", :id => /\d+/
-    get "gpx/:id/data" => "traces#data", :as => :api_trace_data
-  end
+    resources :traces, :path => "gpx", :only => [:create, :show, :update, :destroy], :id => /\d+/ do
+      scope :module => :traces do
+        resource :data, :only => :show
+      end
+    end
+    post "gpx/create" => "traces#create", :id => /\d+/, :as => :trace_create
+    get "gpx/:id/details" => "traces#show", :id => /\d+/, :as => :trace_details
 
-  namespace :api, :path => "api/0.6" do
     # Map notes API
     resources :notes, :except => [:new, :edit, :update], :id => /\d+/, :controller => "notes" do
       collection do
diff --git a/lib/social_share_button_helper.rb b/lib/social_share_button_helper.rb
new file mode 100644 (file)
index 0000000..fe47c6c
--- /dev/null
@@ -0,0 +1,51 @@
+module SocialShareButtonHelper
+  require "uri"
+
+  SOCIAL_SHARE_CONFIG = {
+    :email => "social_icons/email.svg",
+    :facebook => "social_icons/facebook.svg",
+    :linkedin => "social_icons/linkedin.svg",
+    :mastodon => "social_icons/mastodon.svg",
+    :telegram => "social_icons/telegram.svg",
+    :x => "social_icons/x.svg"
+  }.freeze
+
+  def self.filter_allowed_sites(sites)
+    valid_sites = sites.empty? ? SOCIAL_SHARE_CONFIG.keys : sites.select { |site| valid_site?(site) }
+    invalid_sites = sites - valid_sites
+    [valid_sites, invalid_sites]
+  end
+
+  def self.icon_path(site)
+    SOCIAL_SHARE_CONFIG[site.to_sym] || ""
+  end
+
+  def self.valid_site?(site)
+    SOCIAL_SHARE_CONFIG.key?(site.to_sym)
+  end
+
+  def self.generate_share_url(site, params)
+    site = site.to_sym
+    case site
+    when :email
+      to = params[:to] || ""
+      subject = CGI.escape(params[:title])
+      body = CGI.escape(params[:url])
+      "mailto:#{to}?subject=#{subject}&body=#{body}"
+    when :x
+      via_str = params[:via] ? "&via=#{URI.encode_www_form_component(params[:via])}" : ""
+      hashtags_str = params[:hashtags] ? "&hashtags=#{URI.encode_www_form_component(params[:hashtags].join(','))}" : ""
+      "https://x.com/intent/tweet?url=#{URI.encode_www_form_component(params[:url])}&text=#{URI.encode_www_form_component(params[:title])}#{hashtags_str}#{via_str}"
+    when :linkedin
+      "https://www.linkedin.com/sharing/share-offsite/?url=#{URI.encode_www_form_component(params[:url])}"
+    when :facebook
+      "https://www.facebook.com/sharer/sharer.php?u=#{URI.encode_www_form_component('params[:url]')}&t=#{URI.encode_www_form_component(params[:title])}"
+    when :mastodon
+      "https://mastodonshare.com/?text=#{URI.encode_www_form_component(params[:title])}&url=#{URI.encode_www_form_component(params[:url])}"
+    when :telegram
+      "https://t.me/share/url?url=#{URI.encode_www_form_component(params[:url])}&text=#{URI.encode_www_form_component(params[:title])}"
+    else
+      raise ArgumentError, "Unsupported platform: #{platform}"
+    end
+  end
+end
index cbf8dc870294fc7362341c2c3700f0e2e6aecc56..2e763939538706e166f0e693689ee3d97441e5cd 100644 (file)
@@ -46,9 +46,13 @@ module Api
         { :controller => "api/messages", :action => "create" }
       )
       assert_routing(
-        { :path => "/api/0.6/user/messages/1", :method => :post },
+        { :path => "/api/0.6/user/messages/1", :method => :put },
         { :controller => "api/messages", :action => "update", :id => "1" }
       )
+      assert_recognizes(
+        { :controller => "api/messages", :action => "update", :id => "1" },
+        { :path => "/api/0.6/user/messages/1", :method => :post }
+      )
       assert_routing(
         { :path => "/api/0.6/user/messages/1", :method => :delete },
         { :controller => "api/messages", :action => "destroy", :id => "1" }
@@ -253,27 +257,27 @@ module Api
       msg = create(:message, :unread, :sender => sender, :recipient => recipient)
 
       # attempt to mark message as read by recipient, not authenticated
-      post api_message_path(:id => msg.id), :params => { :read_status => true }
+      put api_message_path(:id => msg.id), :params => { :read_status => true }
       assert_response :unauthorized
 
       # attempt to mark message as read by recipient, not allowed
-      post api_message_path(:id => msg.id), :params => { :read_status => true }, :headers => user3_auth
+      put api_message_path(:id => msg.id), :params => { :read_status => true }, :headers => user3_auth
       assert_response :forbidden
 
       # missing parameter
-      post api_message_path(:id => msg.id), :headers => recipient_auth
+      put api_message_path(:id => msg.id), :headers => recipient_auth
       assert_response :bad_request
 
       # wrong type of parameter
-      post api_message_path(:id => msg.id),
-           :params => { :read_status => "not a boolean" },
-           :headers => recipient_auth
+      put api_message_path(:id => msg.id),
+          :params => { :read_status => "not a boolean" },
+          :headers => recipient_auth
       assert_response :bad_request
 
       # mark message as read by recipient
-      post api_message_path(:id => msg.id, :format => "json"),
-           :params => { :read_status => true },
-           :headers => recipient_auth
+      put api_message_path(:id => msg.id, :format => "json"),
+          :params => { :read_status => true },
+          :headers => recipient_auth
       assert_response :success
       assert_equal "application/json", response.media_type
       js = ActiveSupport::JSON.decode(@response.body)
@@ -292,9 +296,9 @@ module Api
       assert_equal msg.body, jsm["body"]
 
       # mark message as unread by recipient
-      post api_message_path(:id => msg.id, :format => "json"),
-           :params => { :read_status => false },
-           :headers => recipient_auth
+      put api_message_path(:id => msg.id, :format => "json"),
+          :params => { :read_status => false },
+          :headers => recipient_auth
       assert_response :success
       assert_equal "application/json", response.media_type
       js = ActiveSupport::JSON.decode(@response.body)
diff --git a/test/controllers/api/traces/data_controller_test.rb b/test/controllers/api/traces/data_controller_test.rb
new file mode 100644 (file)
index 0000000..b4aa399
--- /dev/null
@@ -0,0 +1,114 @@
+require "test_helper"
+
+module Api
+  module Traces
+    class DataControllerTest < ActionDispatch::IntegrationTest
+      ##
+      # test all routes which lead to this controller
+      def test_routes
+        assert_routing(
+          { :path => "/api/0.6/gpx/1/data", :method => :get },
+          { :controller => "api/traces/data", :action => "show", :trace_id => "1" }
+        )
+        assert_routing(
+          { :path => "/api/0.6/gpx/1/data.xml", :method => :get },
+          { :controller => "api/traces/data", :action => "show", :trace_id => "1", :format => "xml" }
+        )
+      end
+
+      # Test downloading a trace through the api
+      def test_show
+        public_trace_file = create(:trace, :visibility => "public", :fixture => "a")
+
+        # First with no auth
+        get api_trace_data_path(public_trace_file)
+        assert_response :unauthorized
+
+        # Now with some other user, which should work since the trace is public
+        auth_header = bearer_authorization_header
+        get api_trace_data_path(public_trace_file), :headers => auth_header
+        follow_redirect!
+        follow_redirect!
+        check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
+
+        # And finally we should be able to do it with the owner of the trace
+        auth_header = bearer_authorization_header public_trace_file.user
+        get api_trace_data_path(public_trace_file), :headers => auth_header
+        follow_redirect!
+        follow_redirect!
+        check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
+      end
+
+      # Test downloading a compressed trace through the api
+      def test_data_compressed
+        identifiable_trace_file = create(:trace, :visibility => "identifiable", :fixture => "d")
+
+        # Authenticate as the owner of the trace we will be using
+        auth_header = bearer_authorization_header identifiable_trace_file.user
+
+        # First get the data as is
+        get api_trace_data_path(identifiable_trace_file), :headers => auth_header
+        follow_redirect!
+        follow_redirect!
+        check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/gzip", "gpx.gz"
+
+        # Now ask explicitly for XML format
+        get api_trace_data_path(identifiable_trace_file, :format => "xml"), :headers => auth_header
+        check_trace_data identifiable_trace_file, "abd6675fdf3024a84fc0a1deac147c0d", "application/xml", "xml"
+
+        # Now ask explicitly for GPX format
+        get api_trace_data_path(identifiable_trace_file, :format => "gpx"), :headers => auth_header
+        check_trace_data identifiable_trace_file, "abd6675fdf3024a84fc0a1deac147c0d"
+      end
+
+      # Check an anonymous trace can't be downloaded by another user through the api
+      def test_data_anon
+        anon_trace_file = create(:trace, :visibility => "private", :fixture => "b")
+
+        # First with no auth
+        get api_trace_data_path(anon_trace_file)
+        assert_response :unauthorized
+
+        # Now with some other user, which shouldn't work since the trace is anon
+        auth_header = bearer_authorization_header
+        get api_trace_data_path(anon_trace_file), :headers => auth_header
+        assert_response :forbidden
+
+        # And finally we should be able to do it with the owner of the trace
+        auth_header = bearer_authorization_header anon_trace_file.user
+        get api_trace_data_path(anon_trace_file), :headers => auth_header
+        follow_redirect!
+        follow_redirect!
+        check_trace_data anon_trace_file, "db4cb5ed2d7d2b627b3b504296c4f701"
+      end
+
+      # Test downloading a trace that doesn't exist through the api
+      def test_data_not_found
+        deleted_trace_file = create(:trace, :deleted)
+
+        # Try first with no auth, as it should require it
+        get api_trace_data_path(0)
+        assert_response :unauthorized
+
+        # Login, and try again
+        auth_header = bearer_authorization_header
+        get api_trace_data_path(0), :headers => auth_header
+        assert_response :not_found
+
+        # Now try a trace which did exist but has been deleted
+        auth_header = bearer_authorization_header deleted_trace_file.user
+        get api_trace_data_path(deleted_trace_file), :headers => auth_header
+        assert_response :not_found
+      end
+
+      private
+
+      def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx")
+        assert_response :success
+        assert_equal digest, Digest::MD5.hexdigest(response.body)
+        assert_equal content_type, response.media_type
+        assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"]
+      end
+    end
+  end
+end
index 6ce35bc7cb6089cb24c8dbe6860e582c999a009f..367bb6d21e1fe0b057d5f7de06abfe7f46e8f9c7 100644 (file)
@@ -6,9 +6,13 @@ module Api
     # test all routes which lead to this controller
     def test_routes
       assert_routing(
-        { :path => "/api/0.6/gpx/create", :method => :post },
+        { :path => "/api/0.6/gpx", :method => :post },
         { :controller => "api/traces", :action => "create" }
       )
+      assert_recognizes(
+        { :controller => "api/traces", :action => "create" },
+        { :path => "/api/0.6/gpx/create", :method => :post }
+      )
       assert_routing(
         { :path => "/api/0.6/gpx/1", :method => :get },
         { :controller => "api/traces", :action => "show", :id => "1" }
@@ -25,14 +29,6 @@ module Api
         { :controller => "api/traces", :action => "show", :id => "1" },
         { :path => "/api/0.6/gpx/1/details", :method => :get }
       )
-      assert_routing(
-        { :path => "/api/0.6/gpx/1/data", :method => :get },
-        { :controller => "api/traces", :action => "data", :id => "1" }
-      )
-      assert_routing(
-        { :path => "/api/0.6/gpx/1/data.xml", :method => :get },
-        { :controller => "api/traces", :action => "data", :id => "1", :format => "xml" }
-      )
     end
 
     # Check getting a specific trace through the api
@@ -93,91 +89,6 @@ module Api
       assert_response :not_found
     end
 
-    # Test downloading a trace through the api
-    def test_data
-      public_trace_file = create(:trace, :visibility => "public", :fixture => "a")
-
-      # First with no auth
-      get api_trace_data_path(public_trace_file)
-      assert_response :unauthorized
-
-      # Now with some other user, which should work since the trace is public
-      auth_header = bearer_authorization_header
-      get api_trace_data_path(public_trace_file), :headers => auth_header
-      follow_redirect!
-      follow_redirect!
-      check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
-
-      # And finally we should be able to do it with the owner of the trace
-      auth_header = bearer_authorization_header public_trace_file.user
-      get api_trace_data_path(public_trace_file), :headers => auth_header
-      follow_redirect!
-      follow_redirect!
-      check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
-    end
-
-    # Test downloading a compressed trace through the api
-    def test_data_compressed
-      identifiable_trace_file = create(:trace, :visibility => "identifiable", :fixture => "d")
-
-      # Authenticate as the owner of the trace we will be using
-      auth_header = bearer_authorization_header identifiable_trace_file.user
-
-      # First get the data as is
-      get api_trace_data_path(identifiable_trace_file), :headers => auth_header
-      follow_redirect!
-      follow_redirect!
-      check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/gzip", "gpx.gz"
-
-      # Now ask explicitly for XML format
-      get api_trace_data_path(identifiable_trace_file, :format => "xml"), :headers => auth_header
-      check_trace_data identifiable_trace_file, "abd6675fdf3024a84fc0a1deac147c0d", "application/xml", "xml"
-
-      # Now ask explicitly for GPX format
-      get api_trace_data_path(identifiable_trace_file, :format => "gpx"), :headers => auth_header
-      check_trace_data identifiable_trace_file, "abd6675fdf3024a84fc0a1deac147c0d"
-    end
-
-    # Check an anonymous trace can't be downloaded by another user through the api
-    def test_data_anon
-      anon_trace_file = create(:trace, :visibility => "private", :fixture => "b")
-
-      # First with no auth
-      get api_trace_data_path(anon_trace_file)
-      assert_response :unauthorized
-
-      # Now with some other user, which shouldn't work since the trace is anon
-      auth_header = bearer_authorization_header
-      get api_trace_data_path(anon_trace_file), :headers => auth_header
-      assert_response :forbidden
-
-      # And finally we should be able to do it with the owner of the trace
-      auth_header = bearer_authorization_header anon_trace_file.user
-      get api_trace_data_path(anon_trace_file), :headers => auth_header
-      follow_redirect!
-      follow_redirect!
-      check_trace_data anon_trace_file, "db4cb5ed2d7d2b627b3b504296c4f701"
-    end
-
-    # Test downloading a trace that doesn't exist through the api
-    def test_data_not_found
-      deleted_trace_file = create(:trace, :deleted)
-
-      # Try first with no auth, as it should require it
-      get api_trace_data_path(:id => 0)
-      assert_response :unauthorized
-
-      # Login, and try again
-      auth_header = bearer_authorization_header
-      get api_trace_data_path(:id => 0), :headers => auth_header
-      assert_response :not_found
-
-      # Now try a trace which did exist but has been deleted
-      auth_header = bearer_authorization_header deleted_trace_file.user
-      get api_trace_data_path(deleted_trace_file), :headers => auth_header
-      assert_response :not_found
-    end
-
     # Test creating a trace through the api
     def test_create
       # Get file to use
@@ -186,7 +97,7 @@ module Api
       user = create(:user)
 
       # First with no auth
-      post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }
+      post api_traces_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }
       assert_response :unauthorized
 
       # Rewind the file
@@ -200,7 +111,7 @@ module Api
 
       # Create trace and import tracepoints in background job
       perform_enqueued_jobs do
-        post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }, :headers => auth_header
+        post api_traces_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :visibility => "trackable" }, :headers => auth_header
       end
 
       assert_response :success
@@ -232,7 +143,7 @@ module Api
       # Now authenticated, with the legacy public flag
       assert_not_equal "public", user.preferences.find_by(:k => "gps.trace.visibility").v
       auth_header = bearer_authorization_header user
-      post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 1 }, :headers => auth_header
+      post api_traces_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 1 }, :headers => auth_header
       assert_response :success
       trace = Trace.find(response.body.to_i)
       assert_equal "a.gpx", trace.name
@@ -251,7 +162,7 @@ module Api
       second_user = create(:user)
       assert_nil second_user.preferences.find_by(:k => "gps.trace.visibility")
       auth_header = bearer_authorization_header second_user
-      post gpx_create_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 0 }, :headers => auth_header
+      post api_traces_path, :params => { :file => file, :description => "New Trace", :tags => "new,trace", :public => 0 }, :headers => auth_header
       assert_response :success
       trace = Trace.find(response.body.to_i)
       assert_equal "a.gpx", trace.name
@@ -354,13 +265,6 @@ module Api
 
     private
 
-    def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx")
-      assert_response :success
-      assert_equal digest, Digest::MD5.hexdigest(response.body)
-      assert_equal content_type, response.media_type
-      assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"]
-    end
-
     ##
     # build XML for traces
     # this builds a minimum viable XML for the tests in this suite
index 854f7cde5c717ef4c4e91ff19ee4633ed0557476..012bfd7f470877ebd340c2cdec4ec1cb5d4eb206 100644 (file)
@@ -102,6 +102,20 @@ class Oauth2AuthorizationsControllerTest < ActionDispatch::IntegrationTest
     assert_select "p", "The requested scope is invalid, unknown, or malformed."
   end
 
+  def test_new_db_readonly
+    application = create(:oauth_application, :scopes => "write_api")
+
+    session_for(create(:user))
+
+    with_settings(:status => "database_readonly") do
+      get oauth_authorization_path(:client_id => application.uid,
+                                   :redirect_uri => application.redirect_uri,
+                                   :response_type => "code",
+                                   :scope => "write_api")
+      assert_redirected_to offline_path
+    end
+  end
+
   def test_create
     application = create(:oauth_application, :scopes => "write_api")
 
index 81760fe5de54816a88b448dcdd6a47e3ea008a8e..1cd07b7d9f68a4adfaa6fc655215a80a21edceab 100644 (file)
@@ -22,6 +22,8 @@ class PreferencesControllerTest < ActionDispatch::IntegrationTest
 
   def test_update_preferred_editor
     user = create(:user, :languages => [])
+    user.preferences.create(:k => "site.color_scheme", :v => "light")
+    user.preferences.create(:k => "map.color_scheme", :v => "light")
     session_for(user)
 
     # Changing to a invalid editor should fail
@@ -32,6 +34,8 @@ class PreferencesControllerTest < ActionDispatch::IntegrationTest
     assert_select ".alert-success", false
     assert_select ".alert-danger", true
     assert_select "form > div > select#user_preferred_editor > option[selected]", false
+    assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
+    assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
 
     # Changing to a valid editor should work
     user.preferred_editor = "id"
@@ -41,6 +45,8 @@ class PreferencesControllerTest < ActionDispatch::IntegrationTest
     assert_template :show
     assert_select ".alert-success", /^Preferences updated/
     assert_select "dd", "iD (in-browser editor)"
+    assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
+    assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
 
     # Changing to the default editor should work
     user.preferred_editor = "default"
@@ -50,5 +56,51 @@ class PreferencesControllerTest < ActionDispatch::IntegrationTest
     assert_template :show
     assert_select ".alert-success", /^Preferences updated/
     assert_select "dd", "Default (currently iD)"
+    assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
+    assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
+  end
+
+  def test_update_preferred_site_color_scheme
+    user = create(:user, :languages => [])
+    session_for(user)
+    assert_nil user.preferences.find_by(:k => "site.color_scheme")
+
+    # Changing when previously not defined
+    put preferences_path, :params => { :user => user.attributes, :site_color_scheme => "light" }
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".alert-success", /^Preferences updated/
+    assert_equal "light", user.preferences.find_by(:k => "site.color_scheme")&.v
+
+    # Changing when previously defined
+    put preferences_path, :params => { :user => user.attributes, :site_color_scheme => "auto" }
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".alert-success", /^Preferences updated/
+    assert_equal "auto", user.preferences.find_by(:k => "site.color_scheme")&.v
+  end
+
+  def test_update_preferred_map_color_scheme
+    user = create(:user, :languages => [])
+    session_for(user)
+    assert_nil user.preferences.find_by(:k => "map.color_scheme")
+
+    # Changing when previously not defined
+    put preferences_path, :params => { :user => user.attributes, :map_color_scheme => "light" }
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".alert-success", /^Preferences updated/
+    assert_equal "light", user.preferences.find_by(:k => "map.color_scheme")&.v
+
+    # Changing when previously defined
+    put preferences_path, :params => { :user => user.attributes, :map_color_scheme => "auto" }
+    assert_redirected_to preferences_path
+    follow_redirect!
+    assert_template :show
+    assert_select ".alert-success", /^Preferences updated/
+    assert_equal "auto", user.preferences.find_by(:k => "map.color_scheme")&.v
   end
 end
index 4cf0ab69ad3aab53863c4c2872ffda8a45a03073..4162223d1b88919b8b537f9e114499706f1b09a5 100644 (file)
@@ -66,7 +66,7 @@ class BrowseHelperTest < ActionView::TestCase
     assert_equal "<s>test</s>", deleted_output
   end
 
-  def test_element_class
+  def test_element_icon
     node = create(:node, :with_history, :version => 2)
     node_v1 = node.old_nodes.find_by(:version => 1)
     node_v2 = node.old_nodes.find_by(:version => 2)
@@ -76,60 +76,35 @@ class BrowseHelperTest < ActionView::TestCase
     add_old_tags_selection(node_v2)
     add_old_tags_selection(node_v1)
 
-    assert_equal "node", element_class("node", create(:node))
-    assert_equal "node", element_class("node", create(:node, :deleted))
-
-    assert_equal "node building yes shop gift tourism museum", element_class("node", node)
-    assert_equal "node building yes shop gift tourism museum", element_class("node", node_v2)
-    assert_equal "node", element_class("node", node_v1)
-  end
-
-  def test_element_title
-    node = create(:node, :with_history, :version => 2)
-    node_v1 = node.old_nodes.find_by(:version => 1)
-    node_v2 = node.old_nodes.find_by(:version => 2)
-    node_v1.redact!(create(:redaction))
-
-    add_tags_selection(node)
-    add_old_tags_selection(node_v2)
-    add_old_tags_selection(node_v1)
-
-    assert_equal "", element_title(create(:node))
-    assert_equal "", element_title(create(:node, :deleted))
-
-    assert_equal "building=yes, shop=gift, and tourism=museum", element_title(node)
-    assert_equal "building=yes, shop=gift, and tourism=museum", element_title(node_v2)
-    assert_equal "", element_title(node_v1)
-  end
-
-  def test_icon_tags
-    node = create(:node, :with_history, :version => 2)
-    node_v1 = node.old_nodes.find_by(:version => 1)
-    node_v2 = node.old_nodes.find_by(:version => 2)
-    node_v1.redact!(create(:redaction))
+    icon = element_icon("node", create(:node))
+    icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
+    assert_dom icon_dom, "img:root", :count => 1 do
+      assert_dom "> @title", 0
+    end
 
-    add_tags_selection(node)
+    icon = element_icon("node", create(:node, :deleted))
+    icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
+    assert_dom icon_dom, "img:root", :count => 1 do
+      assert_dom "> @title", 0
+    end
 
-    tags = icon_tags(node)
-    assert_equal 3, tags.count
-    assert_includes tags, %w[building yes]
-    assert_includes tags, %w[tourism museum]
-    assert_includes tags, %w[shop gift]
+    icon = element_icon("node", node)
+    icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
+    assert_dom icon_dom, "img:root", :count => 1 do
+      assert_dom "> @title", "building=yes, shop=gift, and tourism=museum"
+    end
 
-    add_old_tags_selection(node_v2)
-    add_old_tags_selection(node_v1)
+    icon = element_icon("node", node_v2)
+    icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
+    assert_dom icon_dom, "img:root", :count => 1 do
+      assert_dom "> @title", "building=yes, shop=gift, and tourism=museum"
+    end
 
-    tags = icon_tags(node_v2)
-    assert_equal 3, tags.count
-    assert_includes tags, %w[building yes]
-    assert_includes tags, %w[tourism museum]
-    assert_includes tags, %w[shop gift]
-
-    tags = icon_tags(node_v1)
-    assert_equal 3, tags.count
-    assert_includes tags, %w[building yes]
-    assert_includes tags, %w[tourism museum]
-    assert_includes tags, %w[shop gift]
+    icon = element_icon("node", node_v1)
+    icon_dom = Rails::Dom::Testing.html_document_fragment.parse(icon)
+    assert_dom icon_dom, "img:root", :count => 1 do
+      assert_dom "> @title", 0
+    end
   end
 
   private
diff --git a/test/helpers/social_share_button_helper_test.rb b/test/helpers/social_share_button_helper_test.rb
new file mode 100644 (file)
index 0000000..9c75693
--- /dev/null
@@ -0,0 +1,48 @@
+require "test_helper"
+
+class SocialShareButtonHelperTest < ActionView::TestCase
+  include SocialShareButtonHelper
+  include ApplicationHelper
+
+  def setup
+    @options = {
+      :allow_sites => %w[x facebook linkedin],
+      :title => "Test Title",
+      :url => "https://example.com",
+      :desc => "Test Description",
+      :via => "testuser"
+    }
+  end
+
+  def test_render_social_share_buttons_with_valid_sites
+    result = render_social_share_buttons(@options)
+    assert_includes result, "x"
+    assert_includes result, "facebook"
+    assert_includes result, "linkedin"
+  end
+
+  def test_render_social_share_buttons_with_invalid_site
+    @options[:allow_sites] << "invalid_site"
+    result = render_social_share_buttons(@options)
+    assert_not_includes result, "invalid_site"
+  end
+
+  def test_render_social_share_buttons_with_no_sites
+    @options[:allow_sites] = []
+    result = render_social_share_buttons(@options)
+    SocialShareButtonHelper::SOCIAL_SHARE_CONFIG.each_key do |site|
+      assert_includes result, site.to_s # Convert symbol to string
+    end
+  end
+
+  def test_filter_allowed_sites
+    valid_sites, invalid_sites = SocialShareButtonHelper.filter_allowed_sites(%w[x facebook invalid_site])
+    assert_equal %w[x facebook], valid_sites
+    assert_equal %w[invalid_site], invalid_sites
+  end
+
+  def test_icon_path
+    assert_equal "social_icons/x.svg", SocialShareButtonHelper.icon_path("x")
+    assert_equal "", SocialShareButtonHelper.icon_path("invalid_site")
+  end
+end
diff --git a/test/system/create_note_test.rb b/test/system/create_note_test.rb
new file mode 100644 (file)
index 0000000..ccb2ed3
--- /dev/null
@@ -0,0 +1,23 @@
+require "application_system_test_case"
+
+class CreateNoteTest < ApplicationSystemTestCase
+  test "can create note" do
+    visit new_note_path(:anchor => "map=18/0/0")
+
+    assert_button "Add Note", :disabled => true
+
+    fill_in "text", :with => "Some newly added note description"
+    click_on "Add Note"
+
+    assert_content "Unresolved note ##{Note.last.id}"
+    assert_content "Some newly added note description"
+  end
+
+  test "cannot create note when api is readonly" do
+    with_settings(:status => "api_readonly") do
+      visit new_note_path(:anchor => "map=18/0/0")
+
+      assert_no_button "Add Note", :disabled => true
+    end
+  end
+end
index 45a3058f73d5ea438195753e4eadf7588a0345b5..28ca8971fe9c6b6b5ee0a3d3e8c5cd133aac42fd 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
     minimatch "^3.1.2"
     strip-json-comments "^3.1.1"
 
-"@eslint/js@9.16.0":
-  version "9.16.0"
-  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.16.0.tgz#3df2b2dd3b9163056616886c86e4082f45dbf3f4"
-  integrity sha512-tw2HxzQkrbeuvyj1tG2Yqq+0H9wGoI2IMk4EOsQeX+vmd75FtJAzf+gTA69WF+baUKRYQ3x2kbLE08js5OsTVg==
+"@eslint/js@9.17.0":
+  version "9.17.0"
+  resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.17.0.tgz#1523e586791f80376a6f8398a3964455ecc651ec"
+  integrity sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==
 
 "@eslint/object-schema@^2.1.4":
   version "2.1.4"
@@ -189,10 +189,10 @@ concat-map@0.0.1:
   resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
   integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
 
-cross-spawn@^7.0.5:
-  version "7.0.5"
-  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.5.tgz#910aac880ff5243da96b728bc6521a5f6c2f2f82"
-  integrity sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==
+cross-spawn@^7.0.6:
+  version "7.0.6"
+  resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
+  integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
   dependencies:
     path-key "^3.1.0"
     shebang-command "^2.0.0"
@@ -265,16 +265,16 @@ eslint-visitor-keys@^4.2.0:
   integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==
 
 eslint@^9.0.0:
-  version "9.16.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.16.0.tgz#66832e66258922ac0a626f803a9273e37747f2a6"
-  integrity sha512-whp8mSQI4C8VXd+fLgSM0lh3UlmcFtVwUQjyKCFfsp+2ItAIYhlq/hqGahGqHE6cv9unM41VlqKk2VtKYR2TaA==
+  version "9.17.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.17.0.tgz#faa1facb5dd042172fdc520106984b5c2421bb0c"
+  integrity sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==
   dependencies:
     "@eslint-community/eslint-utils" "^4.2.0"
     "@eslint-community/regexpp" "^4.12.1"
     "@eslint/config-array" "^0.19.0"
     "@eslint/core" "^0.9.0"
     "@eslint/eslintrc" "^3.2.0"
-    "@eslint/js" "9.16.0"
+    "@eslint/js" "9.17.0"
     "@eslint/plugin-kit" "^0.2.3"
     "@humanfs/node" "^0.16.6"
     "@humanwhocodes/module-importer" "^1.0.1"
@@ -283,7 +283,7 @@ eslint@^9.0.0:
     "@types/json-schema" "^7.0.15"
     ajv "^6.12.4"
     chalk "^4.0.0"
-    cross-spawn "^7.0.5"
+    cross-spawn "^7.0.6"
     debug "^4.3.2"
     escape-string-regexp "^4.0.0"
     eslint-scope "^8.2.0"
@@ -583,9 +583,9 @@ optionator@^0.9.3:
     type-check "^0.4.0"
 
 osm-community-index@^5.2.0:
-  version "5.8.0"
-  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.8.0.tgz#59fbf71ab9f359b307fcd0415fbce6f43dda94f6"
-  integrity sha512-7hg+D7u2vooujuihGTgKWDYjPUidlWuTjBrMP/drsHP/cVJI94ehsDulNkcKH0Od05n6vBl/ZyJJjdJvqcrMaA==
+  version "5.9.0"
+  resolved "https://registry.yarnpkg.com/osm-community-index/-/osm-community-index-5.9.0.tgz#cf70a560baca5ec029cd16eecab8c2aa84d6bbc2"
+  integrity sha512-/P09ig/iCtD17AvmihBcvz6617c1NCJkqNNk3G6veY4MBWH6Djhl+xz69FLOGy8Xt4jHV57zP1PU6UATqby5aQ==
   dependencies:
     diacritics "^1.3.0"