From: Tom Hughes Date: Wed, 18 Dec 2024 14:11:51 +0000 (+0000) Subject: Merge remote-tracking branch 'upstream/pull/5391' X-Git-Tag: live~10 X-Git-Url: https://git.openstreetmap.org./rails.git/commitdiff_plain/6094a97ce6297d390e5bbf733f5c2b4cc6b2076c?hp=507c395f51c20c3c0d5375313ea1ca0ed4156c75 Merge remote-tracking branch 'upstream/pull/5391' --- diff --git a/Gemfile.lock b/Gemfile.lock index d909ddad6..0200f153e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -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 diff --git a/app/abilities/api_ability.rb b/app/abilities/api_ability.rb index 96ed9b080..c790da66a 100644 --- a/app/abilities/api_ability.rb +++ b/app/abilities/api_ability.rb @@ -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 index 000000000..d35d51d60 --- /dev/null +++ b/app/assets/images/social_icons/email.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/social_icons/facebook.svg b/app/assets/images/social_icons/facebook.svg new file mode 100644 index 000000000..80241473e --- /dev/null +++ b/app/assets/images/social_icons/facebook.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/social_icons/linkedin.svg b/app/assets/images/social_icons/linkedin.svg new file mode 100644 index 000000000..908c86751 --- /dev/null +++ b/app/assets/images/social_icons/linkedin.svg @@ -0,0 +1,4 @@ + + + + diff --git a/app/assets/images/social_icons/mastodon.svg b/app/assets/images/social_icons/mastodon.svg new file mode 100644 index 000000000..a8b4bc44e --- /dev/null +++ b/app/assets/images/social_icons/mastodon.svg @@ -0,0 +1,5 @@ + + + + + \ 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 index 000000000..84c087929 --- /dev/null +++ b/app/assets/images/social_icons/telegram.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/app/assets/images/social_icons/x.svg b/app/assets/images/social_icons/x.svg new file mode 100644 index 000000000..937dcc732 --- /dev/null +++ b/app/assets/images/social_icons/x.svg @@ -0,0 +1 @@ + diff --git a/app/assets/javascripts/id.js b/app/assets/javascripts/id.js index 706097bba..15f77b1c1 100644 --- a/app/assets/javascripts/id.js +++ b/app/assets/javascripts/id.js @@ -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); }); } }); diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 9df0f0ad5..56495b31a 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -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); diff --git a/app/assets/javascripts/leaflet.map.js b/app/assets/javascripts/leaflet.map.js index f478f4351..02ed318ac 100644 --- a/app/assets/javascripts/leaflet.map.js +++ b/app/assets/javascripts/leaflet.map.js @@ -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 index 000000000..409b2c58a --- /dev/null +++ b/app/assets/javascripts/social_share_button.js @@ -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 index 2dac602fe..000000000 --- a/app/assets/stylesheets/browse.scss +++ /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"), - -) diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss index 668d050d8..323f60e08 100644 --- a/app/assets/stylesheets/common.scss +++ b/app/assets/stylesheets/common.scss @@ -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); } } } diff --git a/app/assets/stylesheets/parameters.scss b/app/assets/stylesheets/parameters.scss index 28bf56901..07549d69b 100644 --- a/app/assets/stylesheets/parameters.scss +++ b/app/assets/stylesheets/parameters.scss @@ -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 index 000000000..89e31599a --- /dev/null +++ b/app/assets/stylesheets/screen-auto-ltr.scss @@ -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 index 000000000..89e31599a --- /dev/null +++ b/app/assets/stylesheets/screen-auto-rtl.rtlcss.scss @@ -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 index c525060af..000000000 --- a/app/assets/stylesheets/screen-ltr.scss +++ /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 index 000000000..00f65f79a --- /dev/null +++ b/app/assets/stylesheets/screen-manual-ltr.scss @@ -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 index 000000000..00f65f79a --- /dev/null +++ b/app/assets/stylesheets/screen-manual-rtl.rtlcss.scss @@ -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 index c525060af..000000000 --- a/app/assets/stylesheets/screen-rtl.rtlcss.scss +++ /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 index 000000000..e04931cfb --- /dev/null +++ b/app/controllers/api/traces/data_controller.rb @@ -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 diff --git a/app/controllers/api/traces_controller.rb b/app/controllers/api/traces_controller.rb index 76dfb3a2d..e91261058 100644 --- a/app/controllers/api/traces_controller.rb +++ b/app/controllers/api/traces_controller.rb @@ -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) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index bde7e0287..32b53bad7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -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) diff --git a/app/controllers/notes_controller.rb b/app/controllers/notes_controller.rb index c47a3abfb..c40e776b4 100644 --- a/app/controllers/notes_controller.rb +++ b/app/controllers/notes_controller.rb @@ -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 diff --git a/app/controllers/oauth2_authorizations_controller.rb b/app/controllers/oauth2_authorizations_controller.rb index 415ab2775..9f86e8b18 100644 --- a/app/controllers/oauth2_authorizations_controller.rb +++ b/app/controllers/oauth2_authorizations_controller.rb @@ -7,4 +7,6 @@ class Oauth2AuthorizationsController < Doorkeeper::AuthorizationsController allow_all_form_action :only => :new authorize_resource :class => false + + before_action :check_database_writable end diff --git a/app/controllers/preferences_controller.rb b/app/controllers/preferences_controller.rb index dcf0d8b64..1d96766ef 100644 --- a/app/controllers/preferences_controller.rb +++ b/app/controllers/preferences_controller.rb @@ -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 diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index fcf253289..5558e69fb 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -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 diff --git a/app/helpers/browse_helper.rb b/app/helpers/browse_helper.rb index 69a8f8fa2..482503e8a 100644 --- a/app/helpers/browse_helper.rb +++ b/app/helpers/browse_helper.rb @@ -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 diff --git a/app/helpers/user_blocks_helper.rb b/app/helpers/user_blocks_helper.rb index e2770eb69..8a3a8a3eb 100644 --- a/app/helpers/user_blocks_helper.rb +++ b/app/helpers/user_blocks_helper.rb @@ -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? diff --git a/app/views/browse/_containing_relation.html.erb b/app/views/browse/_containing_relation.html.erb index 2ab0fcf97..2c1072364 100644 --- a/app/views/browse/_containing_relation.html.erb +++ b/app/views/browse/_containing_relation.html.erb @@ -1,7 +1,8 @@ -
  • <%= 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 %> -
  • +<%= 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 %> diff --git a/app/views/browse/_node.html.erb b/app/views/browse/_node.html.erb index 0ffe7c68b..52939d3a1 100644 --- a/app/views/browse/_node.html.erb +++ b/app/views/browse/_node.html.erb @@ -15,9 +15,11 @@ <% unless node.ways.empty? %>
    > <%= t "browse.part_of_ways", :count => node.ways.uniq.count %> -
    @@ -25,7 +27,7 @@ <% unless node.containing_relation_members.empty? %>
    > <%= t "browse.part_of_relations", :count => node.containing_relation_members.uniq.count %> -
    diff --git a/app/views/browse/_relation.html.erb b/app/views/browse/_relation.html.erb index 5dcdffa47..447067900 100644 --- a/app/views/browse/_relation.html.erb +++ b/app/views/browse/_relation.html.erb @@ -14,7 +14,7 @@

    <%= t "browse.part_of" %>

    > <%= t "browse.part_of_relations", :count => relation.containing_relation_members.uniq.count %> -
    @@ -24,7 +24,7 @@

    <%= t ".members" %>

    > <%= t ".members_count", :count => relation.relation_members.count %> -
    diff --git a/app/views/browse/_relation_member.html.erb b/app/views/browse/_relation_member.html.erb index d122f0edf..c00396fbd 100644 --- a/app/views/browse/_relation_member.html.erb +++ b/app/views/browse/_relation_member.html.erb @@ -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 diff --git a/app/views/browse/_way.html.erb b/app/views/browse/_way.html.erb index d04eff140..9181a3e08 100644 --- a/app/views/browse/_way.html.erb +++ b/app/views/browse/_way.html.erb @@ -14,7 +14,7 @@

    <%= t "browse.part_of" %>

    > <%= t "browse.part_of_relations", :count => way.containing_relation_members.uniq.count %> -
    @@ -24,17 +24,18 @@

    <%= t ".nodes" %>

    > <%= t ".nodes_count", :count => way.way_nodes.count %> -
    diff --git a/app/views/changesets/_elements.html.erb b/app/views/changesets/_elements.html.erb index fd5dd8a26..a95bed6fa 100644 --- a/app/views/changesets/_elements.html.erb +++ b/app/views/changesets/_elements.html.erb @@ -1,12 +1,12 @@ <%= turbo_frame_tag "changeset_#{type.pluralize}" do %> <%= render :partial => "paging_nav", :locals => { :type => type, :pages => pages } %> - + diff --git a/app/views/diary_entries/show.html.erb b/app/views/diary_entries/show.html.erb index e80a44f09..14b1576f0 100644 --- a/app/views/diary_entries/show.html.erb +++ b/app/views/diary_entries/show.html.erb @@ -1,3 +1,7 @@ +<% content_for :head do %> + <%= javascript_include_tag "social_share_button" %> +<% end %> + <% content_for :heading do %>
    @@ -11,6 +15,10 @@ <% end %> <%= render @entry %> +<%= render_social_share_buttons({ + :title => @entry.title, + :url => diary_entry_url(@entry.user, @entry) + }) %>
    diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index 3c691612a..bab19c217 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -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" %> diff --git a/app/views/layouts/site.html.erb b/app/views/layouts/site.html.erb index 7c921658d..f02f024a5 100644 --- a/app/views/layouts/site.html.erb +++ b/app/views/layouts/site.html.erb @@ -1,11 +1,14 @@ - +<%= 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" %> - + <%= 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) -%> <% end -%> - - + <% end %> +<% end %> diff --git a/app/views/notes/new_readonly.html.erb b/app/views/notes/new_readonly.html.erb new file mode 100644 index 000000000..033530c71 --- /dev/null +++ b/app/views/notes/new_readonly.html.erb @@ -0,0 +1,7 @@ +<% set_title(t(".title")) %> + +<%= render "sidebar_header", :title => t(".title") %> + +
    +

    <%= t(".warning") %>

    +
    diff --git a/app/views/preferences/edit.html.erb b/app/views/preferences/edit.html.erb index 07d89fbb5..aaf07e927 100644 --- a/app/views/preferences/edit.html.erb +++ b/app/views/preferences/edit.html.erb @@ -7,6 +7,22 @@ <%= f.text_field :languages %> +
    + <%= 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" %> +
    + +
    + <%= 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" %> +
    + <%= f.primary t(".save") %> <%= link_to t(".cancel"), preferences_path, :class => "btn btn-link" %> <% end %> diff --git a/app/views/preferences/show.html.erb b/app/views/preferences/show.html.erb index 7a63d0be8..9bf83cbf1 100644 --- a/app/views/preferences/show.html.erb +++ b/app/views/preferences/show.html.erb @@ -19,7 +19,16 @@
  • <%= locale %>
  • <% end %> + +
    <%= t ".preferred_site_color_scheme" %>
    +
    + <%= t ".site_color_schemes.#{preferred_color_scheme(:site)}" %> +
    + +
    <%= t ".preferred_map_color_scheme" %>
    +
    + <%= t ".map_color_schemes.#{preferred_color_scheme(:map)}" %>
    diff --git a/app/views/user_blocks/_block.html.erb b/app/views/user_blocks/_block.html.erb index 8ae1408c6..cbc2ee23c 100644 --- a/app/views/user_blocks/_block.html.erb +++ b/app/views/user_blocks/_block.html.erb @@ -6,14 +6,13 @@ <%= link_to block.creator.display_name, block.creator, :class => "username d-inline-block text-truncate text-wrap", :dir => "auto" %> <% end %> <%= h truncate(block.reason) %> - <%= h block_status(block) %> - - <% 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 %> - + <%= block_short_time_in_past(block.created_at) %> + <% if block.ends_at > Time.now.utc %> + <%= block_short_time_in_future(block.ends_at) %> + <% else %> + <%= block_short_time_in_past(block.ends_at) %> + <% end %> + <%= h block_short_status(block) %> <%= link_to t(".show"), block %> <% if can?(:edit, block) %><%= link_to t(".edit"), edit_user_block_path(block) %><% end %> diff --git a/app/views/user_blocks/_page.html.erb b/app/views/user_blocks/_page.html.erb index 8c8557f60..c2e516170 100644 --- a/app/views/user_blocks/_page.html.erb +++ b/app/views/user_blocks/_page.html.erb @@ -9,8 +9,9 @@ <%= t ".creator_name" %> <% end %> <%= t ".reason" %> + <%= t ".start" %> + <%= t ".end" %> <%= t ".status" %> - <%= t ".revoker_name" %> diff --git a/config/browse_icons.yml b/config/browse_icons.yml new file mode 100644 index 000000000..f24d7676c --- /dev/null +++ b/config/browse_icons.yml @@ -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 index 000000000..a55df97b6 --- /dev/null +++ b/config/initializers/browse_icons.rb @@ -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 diff --git a/config/layers.yml b/config/layers.yml index 3b5bc944f..4f883cc94 100644 --- a/config/layers.yml +++ b/config/layers.yml @@ -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" diff --git a/config/locales/af.yml b/config/locales/af.yml index 7c7cdcb68..1d99104a3 100644 --- a/config/locales/af.yml +++ b/config/locales/af.yml @@ -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} diff --git a/config/locales/aln.yml b/config/locales/aln.yml index 91784f187..0081760c9 100644 --- a/config/locales/aln.yml +++ b/config/locales/aln.yml @@ -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} diff --git a/config/locales/ar.yml b/config/locales/ar.yml index ee85a6bf1..ef001f88a 100644 --- a/config/locales/ar.yml +++ b/config/locales/ar.yml @@ -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: المستخدمون الممنوعون diff --git a/config/locales/arz.yml b/config/locales/arz.yml index 1cfd348d3..a983f1b8b 100644 --- a/config/locales/arz.yml +++ b/config/locales/arz.yml @@ -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} diff --git a/config/locales/ast.yml b/config/locales/ast.yml index b25bfd269..90bebd869 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -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} diff --git a/config/locales/az.yml b/config/locales/az.yml index f74e4dbc9..af7d0bb62 100644 --- a/config/locales/az.yml +++ b/config/locales/az.yml @@ -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 diff --git a/config/locales/ba.yml b/config/locales/ba.yml index d097f80ac..aa273e876 100644 --- a/config/locales/ba.yml +++ b/config/locales/ba.yml @@ -1497,7 +1497,6 @@ ba: open: Асыҡ resolved: Хәл ителде show: - title: '%{status} Мәсьәлә #%{issue_id}' reports: one: '%{count} хәбәр' other: '%{count} хәбәрҙәр' diff --git a/config/locales/be-Tarask.yml b/config/locales/be-Tarask.yml index b87ac1252..6bb1f970b 100644 --- a/config/locales/be-Tarask.yml +++ b/config/locales/be-Tarask.yml @@ -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}' diff --git a/config/locales/be.yml b/config/locales/be.yml index b722d3745..f63aefc9d 100644 --- a/config/locales/be.yml +++ b/config/locales/be.yml @@ -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: diff --git a/config/locales/bg.yml b/config/locales/bg.yml index 2cb7d4afb..8b475353f 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -1147,7 +1147,6 @@ bg: other: '%{count} доклада' reported_item: Докладван елемент show: - title: '%{status} Проблем #%{issue_id}' reports: one: '%{count} доклад' other: '%{count} доклада' diff --git a/config/locales/br.yml b/config/locales/br.yml index dea9d56dd..cdf6d44cf 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -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 diff --git a/config/locales/bs.yml b/config/locales/bs.yml index cd7607a91..c34b08750 100644 --- a/config/locales/bs.yml +++ b/config/locales/bs.yml @@ -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 diff --git a/config/locales/ca.yml b/config/locales/ca.yml index 9322319b9..3fede6bc5 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -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 diff --git a/config/locales/ce.yml b/config/locales/ce.yml index c8ae5a52f..e3fa5a612 100644 --- a/config/locales/ce.yml +++ b/config/locales/ce.yml @@ -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: Сан блоктохарш diff --git a/config/locales/cs.yml b/config/locales/cs.yml index 79489fdce..fca91575a 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -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í diff --git a/config/locales/cy.yml b/config/locales/cy.yml index 8116b511e..9fb4f10d2 100644 --- a/config/locales/cy.yml +++ b/config/locales/cy.yml @@ -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 diff --git a/config/locales/da.yml b/config/locales/da.yml index e816a6ebc..9e136347e 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -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 diff --git a/config/locales/de.yml b/config/locales/de.yml index ec0595258..6202a1875 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -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 diff --git a/config/locales/diq.yml b/config/locales/diq.yml index 73bdfb705..49369bc9f 100644 --- a/config/locales/diq.yml +++ b/config/locales/diq.yml @@ -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ış diff --git a/config/locales/dsb.yml b/config/locales/dsb.yml index 1d7db4aa1..5c29dfc86 100644 --- a/config/locales/dsb.yml +++ b/config/locales/dsb.yml @@ -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 diff --git a/config/locales/el.yml b/config/locales/el.yml index 465f9fd9a..a4b77ecd2 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -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: Φραγές σε μένα diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 9d4d1c4a4..5dbdabe23 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -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} diff --git a/config/locales/en.yml b/config/locales/en.yml index 89686d4e3..16bef0bd0 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -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" diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 4489a540f..497bfcd3c 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -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 diff --git a/config/locales/es.yml b/config/locales/es.yml index 548799395..29e12c3f3 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -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í diff --git a/config/locales/et.yml b/config/locales/et.yml index 7f9c9783b..f8a56340d 100644 --- a/config/locales/et.yml +++ b/config/locales/et.yml @@ -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 diff --git a/config/locales/eu.yml b/config/locales/eu.yml index e635fa0f6..ef3365522 100644 --- a/config/locales/eu.yml +++ b/config/locales/eu.yml @@ -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' diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 4c659ad3e..4ff0a76a1 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -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: قطع دسترسی‌های من diff --git a/config/locales/fi.yml b/config/locales/fi.yml index e288faa10..1f3f4a8b0 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -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: diff --git a/config/locales/fit.yml b/config/locales/fit.yml index 4f9ea0c0a..770180614 100644 --- a/config/locales/fit.yml +++ b/config/locales/fit.yml @@ -492,7 +492,6 @@ fit: one: 1 ilmotus other: '%{count} ilmiantoa' show: - title: '%{status} Tapaus #%{issue_id}' reports: zero: Ei ilmiantoa one: Yksi ilmianto diff --git a/config/locales/fr.yml b/config/locales/fr.yml index 45da8d456..535294e84 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -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 diff --git a/config/locales/fur.yml b/config/locales/fur.yml index 74187c38e..90d1490c3 100644 --- a/config/locales/fur.yml +++ b/config/locales/fur.yml @@ -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: diff --git a/config/locales/fy.yml b/config/locales/fy.yml index 825f9a583..4083810f1 100644 --- a/config/locales/fy.yml +++ b/config/locales/fy.yml @@ -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 diff --git a/config/locales/ga.yml b/config/locales/ga.yml index 92f446ed7..9b94afc33 100644 --- a/config/locales/ga.yml +++ b/config/locales/ga.yml @@ -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 diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 61aa60109..656dc9825 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -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 diff --git a/config/locales/gl.yml b/config/locales/gl.yml index 76e063b01..d52eff6fb 100644 --- a/config/locales/gl.yml +++ b/config/locales/gl.yml @@ -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 diff --git a/config/locales/he.yml b/config/locales/he.yml index e77888d9c..92084d8f0 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -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 נטענו ושאפשרות - השליטה מקחור מופעלת + השליטה מרחוק מופעלת 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: חסימות שלי diff --git a/config/locales/hi.yml b/config/locales/hi.yml index d0e7e46e5..9f1fa981e 100644 --- a/config/locales/hi.yml +++ b/config/locales/hi.yml @@ -1038,6 +1038,9 @@ hi: filter: not_revoke_admin_current_user: वर्तमान उपयोगकर्ता के द्वारा व्यवस्थापक भूमिका को रद्द नहीं कर सकता है| + user_blocks: + page: + end: अन्त notes: index: created_at: 'निर्माण का समय:' diff --git a/config/locales/hr.yml b/config/locales/hr.yml index be5c340a8..08474a4d9 100644 --- a/config/locales/hr.yml +++ b/config/locales/hr.yml @@ -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} diff --git a/config/locales/hsb.yml b/config/locales/hsb.yml index db45ff706..76b83c6cc 100644 --- a/config/locales/hsb.yml +++ b/config/locales/hsb.yml @@ -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 diff --git a/config/locales/hu.yml b/config/locales/hu.yml index a71e7c654..19b2349b4 100644 --- a/config/locales/hu.yml +++ b/config/locales/hu.yml @@ -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 diff --git a/config/locales/ia.yml b/config/locales/ia.yml index 1afe3205a..63c8fb7a2 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -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 diff --git a/config/locales/id.yml b/config/locales/id.yml index d44592b69..cbde28471 100644 --- a/config/locales/id.yml +++ b/config/locales/id.yml @@ -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 diff --git a/config/locales/is.yml b/config/locales/is.yml index c83902172..561954e8a 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -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 diff --git a/config/locales/it.yml b/config/locales/it.yml index d0925a5f6..c3042225e 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -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 diff --git a/config/locales/ja.yml b/config/locales/ja.yml index 9f85fac29..7a92b346b 100644 --- a/config/locales/ja.yml +++ b/config/locales/ja.yml @@ -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: ミュートした利用者 diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 6cc951a44..3dd471231 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -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: შემქმნელი diff --git a/config/locales/kab.yml b/config/locales/kab.yml index dffc4b02d..0dead6ae1 100644 --- a/config/locales/kab.yml +++ b/config/locales/kab.yml @@ -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} diff --git a/config/locales/ko.yml b/config/locales/ko.yml index 75fb9dbd8..b93407025 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -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: 나의 차단내역 diff --git a/config/locales/ku-Latn.yml b/config/locales/ku-Latn.yml index 8d02e9c3b..450c5539a 100644 --- a/config/locales/ku-Latn.yml +++ b/config/locales/ku-Latn.yml @@ -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 diff --git a/config/locales/lb.yml b/config/locales/lb.yml index a1bcbdb99..40d94d6a3 100644 --- a/config/locales/lb.yml +++ b/config/locales/lb.yml @@ -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: diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 55ab98698..4f5605313 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -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 diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 3cc3fe8b1..ded57b0c3 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -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} diff --git a/config/locales/mk.yml b/config/locales/mk.yml index aff5cfc22..dbb556bc9 100644 --- a/config/locales/mk.yml +++ b/config/locales/mk.yml @@ -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: Преактивирај diff --git a/config/locales/ms.yml b/config/locales/ms.yml index cbb0cd37f..0bbcd79c9 100644 --- a/config/locales/ms.yml +++ b/config/locales/ms.yml @@ -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 diff --git a/config/locales/nb.yml b/config/locales/nb.yml index 01e32571f..cff3c645d 100644 --- a/config/locales/nb.yml +++ b/config/locales/nb.yml @@ -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} diff --git a/config/locales/nl.yml b/config/locales/nl.yml index 80aa25e97..3e30056ec 100644 --- a/config/locales/nl.yml +++ b/config/locales/nl.yml @@ -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 diff --git a/config/locales/nn.yml b/config/locales/nn.yml index 468da74f5..ee39c56b8 100644 --- a/config/locales/nn.yml +++ b/config/locales/nn.yml @@ -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' diff --git a/config/locales/nqo.yml b/config/locales/nqo.yml index 3d06d9cf7..7d7e09900 100644 --- a/config/locales/nqo.yml +++ b/config/locales/nqo.yml @@ -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} diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 27c20f748..06aba7895 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -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} diff --git a/config/locales/pa.yml b/config/locales/pa.yml index 0236ca7c9..797f492c4 100644 --- a/config/locales/pa.yml +++ b/config/locales/pa.yml @@ -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: diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 9db815388..57c80564f 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -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 diff --git a/config/locales/pnb.yml b/config/locales/pnb.yml index 7c325bb30..28d5d9d43 100644 --- a/config/locales/pnb.yml +++ b/config/locales/pnb.yml @@ -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: diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml index 1a5f2f122..c630bb087 100644 --- a/config/locales/pt-PT.yml +++ b/config/locales/pt-PT.yml @@ -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 diff --git a/config/locales/pt.yml b/config/locales/pt.yml index 5a819de18..9dc15c51d 100644 --- a/config/locales/pt.yml +++ b/config/locales/pt.yml @@ -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 diff --git a/config/locales/ro.yml b/config/locales/ro.yml index 4601eb5e4..4f30d10ca 100644 --- a/config/locales/ro.yml +++ b/config/locales/ro.yml @@ -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: diff --git a/config/locales/ru.yml b/config/locales/ru.yml index 86b9b6eb2..fc7bdc4cd 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -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: Заглушённые пользователи diff --git a/config/locales/sc.yml b/config/locales/sc.yml index 2de82f03a..b6662e137 100644 --- a/config/locales/sc.yml +++ b/config/locales/sc.yml @@ -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 diff --git a/config/locales/scn.yml b/config/locales/scn.yml index 850d9d5a2..8d5914419 100644 --- a/config/locales/scn.yml +++ b/config/locales/scn.yml @@ -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} diff --git a/config/locales/sh.yml b/config/locales/sh.yml index f50460fdf..27b2cc553 100644 --- a/config/locales/sh.yml +++ b/config/locales/sh.yml @@ -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 diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 5a4472b60..230bafef4 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -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 diff --git a/config/locales/skr-arab.yml b/config/locales/skr-arab.yml index 01fd59b03..785e32e8b 100644 --- a/config/locales/skr-arab.yml +++ b/config/locales/skr-arab.yml @@ -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: ترجیحاں اپ ڈیٹ کرو diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 5a31955f6..c5bada9ae 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -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: diff --git a/config/locales/sq.yml b/config/locales/sq.yml index 37686e786..8c9a0b8cf 100644 --- a/config/locales/sq.yml +++ b/config/locales/sq.yml @@ -1316,7 +1316,6 @@ sq: edit: Redakto page: status: Statusi - revoker_name: Revokuar nga notes: show: title: 'Shënim: %{id}' diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml index 5b2fbfd14..4eb3b4b2a 100644 --- a/config/locales/sr-Latn.yml +++ b/config/locales/sr-Latn.yml @@ -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} diff --git a/config/locales/sr.yml b/config/locales/sr.yml index 686541447..51469b5fb 100644 --- a/config/locales/sr.yml +++ b/config/locales/sr.yml @@ -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: Пригушени корисници diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 5f124b293..5a56f08be 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -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 diff --git a/config/locales/te.yml b/config/locales/te.yml index 49d0fd69a..a1f60b95f 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -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} diff --git a/config/locales/th.yml b/config/locales/th.yml index 19e3c8483..e17cdee58 100644 --- a/config/locales/th.yml +++ b/config/locales/th.yml @@ -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} diff --git a/config/locales/tl.yml b/config/locales/tl.yml index 2df1597c6..eaa8b6ed6 100644 --- a/config/locales/tl.yml +++ b/config/locales/tl.yml @@ -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} diff --git a/config/locales/tr.yml b/config/locales/tr.yml index bff10101e..ece5bf7cb 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -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 diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 12fbcd199..4fc01f7ad 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -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: Мої блокування diff --git a/config/locales/vi.yml b/config/locales/vi.yml index 3f31c152a..4b1f3280e 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -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: diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index d76499919..f31c415d3 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -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: 对我的封禁 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 7552d4882..471725411 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -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: 對我的封鎖 diff --git a/config/routes.rb b/config/routes.rb index 31b42f99f..89e636409 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -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 index 000000000..fe47c6ca1 --- /dev/null +++ b/lib/social_share_button_helper.rb @@ -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 diff --git a/test/controllers/api/messages_controller_test.rb b/test/controllers/api/messages_controller_test.rb index cbf8dc870..2e7639395 100644 --- a/test/controllers/api/messages_controller_test.rb +++ b/test/controllers/api/messages_controller_test.rb @@ -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 index 000000000..b4aa399be --- /dev/null +++ b/test/controllers/api/traces/data_controller_test.rb @@ -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 diff --git a/test/controllers/api/traces_controller_test.rb b/test/controllers/api/traces_controller_test.rb index 6ce35bc7c..367bb6d21 100644 --- a/test/controllers/api/traces_controller_test.rb +++ b/test/controllers/api/traces_controller_test.rb @@ -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 diff --git a/test/controllers/oauth2_authorizations_controller_test.rb b/test/controllers/oauth2_authorizations_controller_test.rb index 854f7cde5..012bfd7f4 100644 --- a/test/controllers/oauth2_authorizations_controller_test.rb +++ b/test/controllers/oauth2_authorizations_controller_test.rb @@ -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") diff --git a/test/controllers/preferences_controller_test.rb b/test/controllers/preferences_controller_test.rb index 81760fe5d..1cd07b7d9 100644 --- a/test/controllers/preferences_controller_test.rb +++ b/test/controllers/preferences_controller_test.rb @@ -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 diff --git a/test/helpers/browse_helper_test.rb b/test/helpers/browse_helper_test.rb index 4cf0ab69a..4162223d1 100644 --- a/test/helpers/browse_helper_test.rb +++ b/test/helpers/browse_helper_test.rb @@ -66,7 +66,7 @@ class BrowseHelperTest < ActionView::TestCase assert_equal "test", 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 index 000000000..9c7569334 --- /dev/null +++ b/test/helpers/social_share_button_helper_test.rb @@ -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 index 000000000..ccb2ed32f --- /dev/null +++ b/test/system/create_note_test.rb @@ -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 diff --git a/yarn.lock b/yarn.lock index 45a3058f7..28ca8971f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -48,10 +48,10 @@ 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"