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)
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
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)
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)
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)
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
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)
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
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)
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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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
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
--- /dev/null
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48Z" fill="#0971BD"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M12.8 17.1754C12.8 17.1754 22.4595 22.653 24.3344 22.653C26.2995 22.653 35.8544 17.28 35.8544 17.28L35.8698 16.32C35.8698 15.2602 35.0096 14.4 33.9469 14.4H14.7219C13.6602 14.4 12.8 15.2602 12.8 16.32V17.1754ZM35.8544 20.16C35.8544 20.16 26.3898 25.293 24.3344 25.293C22.4595 25.293 12.8144 20.16 12.8154 20.16L12.8 31.68C12.8 32.7399 13.6611 33.6 14.7219 33.6H33.9469C35.0096 33.6 35.8698 32.7399 35.8698 31.68L35.8544 20.16Z" fill="white"/>
+</svg>
--- /dev/null
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24Z" fill="#3B5998"/>
+<path d="M26.5015 38.1115V25.0542H30.1059L30.5836 20.5546H26.5015L26.5077 18.3025C26.5077 17.1289 26.6192 16.5001 28.3048 16.5001H30.5581V12H26.9532C22.6231 12 21.0991 14.1828 21.0991 17.8536V20.5551H18.4V25.0547H21.0991V38.1115H26.5015Z" fill="white"/>
+</svg>
--- /dev/null
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 24C0 10.7452 10.7452 0 24 0C37.2548 0 48 10.7452 48 24C48 37.2548 37.2548 48 24 48C10.7452 48 0 37.2548 0 24Z" fill="#0077B5"/>
+<path fill-rule="evenodd" clip-rule="evenodd" d="M17.3188 14.8227C17.3188 16.3918 16.1377 17.6473 14.2412 17.6473H14.2064C12.3805 17.6473 11.2 16.3918 11.2 14.8227C11.2 13.2204 12.4164 12 14.277 12C16.1377 12 17.2835 13.2204 17.3188 14.8227ZM16.9605 19.8778V36.2196H11.5216V19.8778H16.9605ZM36.5752 36.2196L36.5754 26.8497C36.5754 21.8303 33.8922 19.4941 30.3131 19.4941C27.4254 19.4941 26.1325 21.0802 25.4107 22.1929V19.8783H19.9711C20.0428 21.4117 19.9711 36.22 19.9711 36.22H25.4107V27.0934C25.4107 26.605 25.446 26.1178 25.5898 25.7681C25.9829 24.7924 26.8779 23.7822 28.3805 23.7822C30.3494 23.7822 31.1365 25.2807 31.1365 27.4767V36.2196H36.5752Z" fill="white"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
+<svg width="800px" height="800px" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
+ <circle cx="512" cy="512" r="512" style="fill:#2b90d9"/>
+ <path d="M750.7 448.1c0-111-72.8-143.6-72.8-143.6-36.7-16.9-99.7-23.9-165.1-24.5h-1.6c-65.4.5-128.4 7.6-165.1 24.5 0 0-72.8 32.5-72.8 143.6 0 25.4-.5 55.8.3 88.1 2.6 108.6 19.9 215.6 120.3 242.2 46.3 12.2 86 14.8 118.1 13.1 58.1-3.2 90.7-20.7 90.7-20.7l-1.9-42.1s-41.5 13.1-88.1 11.5c-46.2-1.6-94.9-5-102.4-61.7-.7-5.3-1-10.6-1-15.9 0 0 45.3 11.1 102.7 13.7 35.1 1.6 68-2.1 101.5-6 64.1-7.7 120-47.2 127-83.3 11.1-56.9 10.2-138.9 10.2-138.9zm-85.8 143.1h-53.3V460.7c0-27.5-11.6-41.5-34.7-41.5-25.6 0-38.4 16.6-38.4 49.3V540h-53v-71.5c0-32.8-12.8-49.3-38.4-49.3-23.1 0-34.7 14-34.7 41.5v130.5h-53.3V456.8c0-27.5 7-49.3 21.1-65.5 14.5-16.2 33.5-24.4 57-24.4 27.3 0 47.9 10.5 61.6 31.4l13.2 22.2 13.3-22.2c13.7-21 34.3-31.4 61.6-31.4 23.5 0 42.5 8.3 57 24.4 14 16.1 21 38 21 65.5v134.4z" style="fill:#fff"/>
+</svg>
\ No newline at end of file
--- /dev/null
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M24 48C37.2548 48 48 37.2548 48 24C48 10.7452 37.2548 0 24 0C10.7452 0 0 10.7452 0 24C0 37.2548 10.7452 48 24 48Z" fill="url(#paint0_linear_34411_836)"/>
+<path d="M19.6 35C18.8225 35 18.9546 34.7064 18.6864 33.9661L16.4 26.4412L34 16" fill="#C8DAEA"/>
+<path d="M19.6 34.9999C20.2 34.9999 20.4651 34.7255 20.8 34.3999L24 31.2883L20.0084 28.8813" fill="#A9C9DD"/>
+<path d="M20.008 28.882L29.68 36.0278C30.7837 36.6368 31.5803 36.3215 31.8552 35.0031L35.7922 16.4505C36.1953 14.8344 35.1762 14.1015 34.1203 14.5808L11.0023 23.495C9.4243 24.128 9.4335 25.0084 10.7147 25.4006L16.6473 27.2523L30.3819 18.5873C31.0303 18.1941 31.6253 18.4055 31.1369 18.839" fill="url(#paint1_linear_34411_836)"/>
+<defs>
+<linearGradient id="paint0_linear_34411_836" x1="18.0024" y1="2.0016" x2="6.0024" y2="30" gradientUnits="userSpaceOnUse">
+<stop stop-color="#37AEE2"/>
+<stop offset="1" stop-color="#1E96C8"/>
+</linearGradient>
+<linearGradient id="paint1_linear_34411_836" x1="20.9956" y1="25.4742" x2="23.56" y2="33.7692" gradientUnits="userSpaceOnUse">
+<stop stop-color="#EFF7FC"/>
+<stop offset="1" stop-color="white"/>
+</linearGradient>
+</defs>
+</svg>
--- /dev/null
+<svg xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 512"><path d="M256 0c141.385 0 256 114.615 256 256S397.385 512 256 512 0 397.385 0 256 114.615 0 256 0z"/><path fill="#fff" fill-rule="nonzero" d="M318.64 157.549h33.401l-72.973 83.407 85.85 113.495h-67.222l-52.647-68.836-60.242 68.836h-33.423l78.052-89.212-82.354-107.69h68.924l47.59 62.917 55.044-62.917zm-11.724 176.908h18.51L205.95 176.493h-19.86l120.826 157.964z"/></svg>
.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(),
// 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 () {
[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);
});
}
});
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);
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") {
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;
},
--- /dev/null
+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);
+ }
+ });
+});
+
+++ /dev/null
-$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"),
-
-)
@use "sass:map";
@import "parameters";
-@import "browse";
@import "bootstrap";
@import "rails_bootstrap_forms";
body {
font-size: $typeheight;
+ --dark-mode-map-filter: brightness(.8);
}
time[title] {
}
@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);
}
}
}
+@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; }
/* 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);
}
}
}
$list-group-hover-bg: rgba(var(--bs-emphasis-color-rgb), .075);
$enable-negative-margins: true;
-$color-mode-type: media-query;
--- /dev/null
+@use "common" with (
+ $color-mode-type: media-query
+);
--- /dev/null
+@use "common" with (
+ $color-mode-type: media-query
+);
+++ /dev/null
-@import "common";
--- /dev/null
+@use "common" with (
+ $color-mode-type: data
+);
--- /dev/null
+@use "common" with (
+ $color-mode-type: data
+);
+++ /dev/null
-@import "common";
--- /dev/null
+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
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
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)
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)
render :template => "browse/not_found", :status => :not_found
end
- def new; end
+ def new
+ render :action => :new_readonly if api_status != "online"
+ end
end
allow_all_form_action :only => :new
authorize_resource :class => false
+
+ before_action :check_database_writable
end
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
module ApplicationHelper
require "rexml/document"
+ include SocialShareButtonHelper
def linkify(text)
if text.html_safe?
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
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
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
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
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?
-<li><%= linked_name = link_to printable_element_name(containing_relation.relation), containing_relation.relation, :class => "relation"
- if containing_relation.member_role.blank?
- linked_name
- else
- t ".entry_role_html", :relation_name => linked_name, :relation_role => containing_relation.member_role
- end %>
-</li>
+<%= element_list_item "relation", containing_relation.relation do %>
+ <%= linked_name = link_to printable_element_name(containing_relation.relation), containing_relation.relation
+ if containing_relation.member_role.blank?
+ linked_name
+ else
+ t ".entry_role_html", :relation_name => linked_name, :relation_role => containing_relation.member_role
+ end %>
+<% end %>
<% unless node.ways.empty? %>
<details <%= "open" if node.ways.count < 10 %>>
<summary><%= t "browse.part_of_ways", :count => node.ways.uniq.count %></summary>
- <ul class="list-unstyled">
+ <ul class="list-unstyled browse-element-list">
<% node.ways.uniq.each do |way| %>
- <li><%= element_single_current_link "way", way %></li>
+ <%= element_list_item "way", way do %>
+ <%= element_single_current_link "way", way %>
+ <% end %>
<% end %>
</ul>
</details>
<% unless node.containing_relation_members.empty? %>
<details <%= "open" if node.containing_relation_members.count < 10 %>>
<summary><%= t "browse.part_of_relations", :count => node.containing_relation_members.uniq.count %></summary>
- <ul class="list-unstyled">
+ <ul class="list-unstyled browse-element-list">
<%= render :partial => "browse/containing_relation", :collection => node.containing_relation_members.uniq %>
</ul>
</details>
<h4><%= t "browse.part_of" %></h4>
<details <%= "open" if relation.containing_relation_members.count < 10 %>>
<summary><%= t "browse.part_of_relations", :count => relation.containing_relation_members.uniq.count %></summary>
- <ul class="list-unstyled">
+ <ul class="list-unstyled browse-element-list">
<%= render :partial => "browse/containing_relation", :collection => relation.containing_relation_members.uniq %>
</ul>
</details>
<h4><%= t ".members" %></h4>
<details <%= "open" if relation.relation_members.count < 10 %>>
<summary><%= t ".members_count", :count => relation.relation_members.count %></summary>
- <ul class="list-unstyled">
+ <ul class="list-unstyled browse-element-list">
<%= render :partial => "browse/relation_member", :collection => relation.relation_members %>
</ul>
</details>
<% 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
<h4><%= t "browse.part_of" %></h4>
<details <%= "open" if way.containing_relation_members.count < 10 %>>
<summary><%= t "browse.part_of_relations", :count => way.containing_relation_members.uniq.count %></summary>
- <ul class="list-unstyled">
+ <ul class="list-unstyled browse-element-list">
<%= render :partial => "browse/containing_relation", :collection => way.containing_relation_members.uniq %>
</ul>
</details>
<h4><%= t ".nodes" %></h4>
<details <%= "open" if way.way_nodes.count < 10 %>>
<summary><%= t ".nodes_count", :count => way.way_nodes.count %></summary>
- <ul class="list-unstyled">
+ <ul class="list-unstyled browse-element-list">
<% way.way_nodes.each do |wn| %>
- <li>
+ <%= element_list_item "node", wn.node do %>
<%= element_single_current_link "node", wn.node %>
<% related_ways = wn.node.ways.reject { |w| w.id == wn.way_id } %>
+ <% icon_connector = " " %>
<% if related_ways.size > 0 then %>
(<%= t ".also_part_of_html",
:count => related_ways.size,
- :related_ways => to_sentence(related_ways.map { |w| element_single_current_link "way", w }) %>)
+ :related_ways => to_sentence(related_ways.map { |w| element_icon("way", w) + icon_connector + element_single_current_link("way", w) }) %>)
<% end %>
- </li>
+ <% end %>
<% end %>
</ul>
</details>
<%= turbo_frame_tag "changeset_#{type.pluralize}" do %>
<%= render :partial => "paging_nav", :locals => { :type => type, :pages => pages } %>
- <ul class="list-unstyled" data-turbo="false">
+ <ul class="list-unstyled browse-element-list" data-turbo="false">
<% elements.each do |element| %>
- <%= element_list_item type, element do
- t "printable_name.current_and_old_links_html",
+ <%= element_list_item_with_strikethrough type, element do %>
+ <%= t "printable_name.current_and_old_links_html",
:current_link => link_to(printable_element_name(element), :controller => type.pluralize, :action => :show, :id => element.id[0]),
- :old_link => link_to(printable_element_version(element), :controller => "old_#{type.pluralize}", :action => :show, :id => element.id[0], :version => element.version)
- end %>
+ :old_link => link_to(printable_element_version(element), :controller => "old_#{type.pluralize}", :action => :show, :id => element.id[0], :version => element.version) %>
+ <% end %>
<% end %>
</ul>
<% end %>
<% end %>
</ul>
</nav>
+
</article>
+<% content_for :head do %>
+ <%= javascript_include_tag "social_share_button" %>
+<% end %>
+
<% content_for :heading do %>
<div class="row">
<div class="col-sm-auto">
<% end %>
<%= render @entry %>
+<%= render_social_share_buttons({
+ :title => @entry.title,
+ :url => diary_entry_url(@entry.user, @entry)
+ }) %>
<div id="comments" class="comments mb-3 overflow-hidden">
<div class="row border-bottom border-secondary-subtle">
<%= 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" %>
<!DOCTYPE html>
-<html lang="<%= I18n.locale %>" dir="<%= dir %>">
+<%= tag.html :lang => I18n.locale,
+ :dir => dir,
+ :data => { :bs_theme => (preferred_color_scheme(:site) if preferred_color_scheme(:site) != "auto") } do %>
<%= render :partial => "layouts/head" %>
- <body class="<%= body_class %>">
+ <%= tag.body :class => body_class,
+ :data => { :map_theme => (preferred_color_scheme(:map) if preferred_color_scheme(:map) != "auto") } do %>
<%= render :partial => "layouts/header" %>
<%= render :partial => "layouts/content" %>
<% if defined?(Settings.matomo) -%>
<noscript><p><img src="<%= request.protocol %><%= Settings.matomo["location"] %>/matomo.php?idsite=<%= Settings.matomo["site"] %>" class="matomo" alt="" /></p></noscript>
<% end -%>
- </body>
-</html>
+ <% end %>
+<% end %>
--- /dev/null
+<% set_title(t(".title")) %>
+
+<%= render "sidebar_header", :title => t(".title") %>
+
+<div class="note">
+ <p class="alert alert-warning"><%= t(".warning") %></p>
+</div>
<%= f.text_field :languages %>
+ <div class="mb-3">
+ <%= label_tag "site_color_scheme", t("preferences.show.preferred_site_color_scheme"), :class => "form-label" %>
+ <%= select_tag "site_color_scheme",
+ options_for_select(%w[auto light dark].map { |scheme| [t("preferences.show.site_color_schemes.#{scheme}"), scheme] },
+ preferred_color_scheme(:site)),
+ :class => "form-select" %>
+ </div>
+
+ <div class="mb-3">
+ <%= label_tag "map_color_scheme", t("preferences.show.preferred_map_color_scheme"), :class => "form-label" %>
+ <%= select_tag "map_color_scheme",
+ options_for_select(%w[auto light dark].map { |scheme| [t("preferences.show.map_color_schemes.#{scheme}"), scheme] },
+ preferred_color_scheme(:map)),
+ :class => "form-select" %>
+ </div>
+
<%= f.primary t(".save") %>
<%= link_to t(".cancel"), preferences_path, :class => "btn btn-link" %>
<% end %>
<li><%= locale %></li>
<% end %>
</ul>
+ </dd>
+ <dt class="col-sm-4"><%= t ".preferred_site_color_scheme" %></dt>
+ <dd class="col-sm-8">
+ <%= t ".site_color_schemes.#{preferred_color_scheme(:site)}" %>
+ </dd>
+
+ <dt class="col-sm-4"><%= t ".preferred_map_color_scheme" %></dt>
+ <dd class="col-sm-8">
+ <%= t ".map_color_schemes.#{preferred_color_scheme(:map)}" %>
</dd>
</dl>
<td><%= link_to block.creator.display_name, block.creator, :class => "username d-inline-block text-truncate text-wrap", :dir => "auto" %></td>
<% end %>
<td><%= h truncate(block.reason) %></td>
- <td><%= h block_status(block) %></td>
- <td>
- <% if block.revoker_id.nil? %>
- <%= t(".not_revoked") %>
- <% else %>
- <%= link_to block.revoker.display_name, block.revoker, :class => "username d-inline-block text-truncate text-wrap", :dir => "auto" %>
- <% end %>
- </td>
+ <td><%= block_short_time_in_past(block.created_at) %></td>
+ <% if block.ends_at > Time.now.utc %>
+ <td><%= block_short_time_in_future(block.ends_at) %></td>
+ <% else %>
+ <td><%= block_short_time_in_past(block.ends_at) %></td>
+ <% end %>
+ <td><%= h block_short_status(block) %></td>
<td><%= link_to t(".show"), block %></td>
<td><% if can?(:edit, block) %><%= link_to t(".edit"), edit_user_block_path(block) %><% end %></td>
</tr>
<th><%= t ".creator_name" %></th>
<% end %>
<th><%= t ".reason" %></th>
+ <th><%= t ".start" %></th>
+ <th><%= t ".end" %></th>
<th><%= t ".status" %></th>
- <th><%= t ".revoker_name" %></th>
<th></th>
<th></th>
</tr>
--- /dev/null
+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" }
--- /dev/null
+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
- leafletOsmId: "Mapnik"
code: "M"
- keyId: "mapnik"
+ layerId: "mapnik"
nameId: "standard"
credit:
id: "make_a_donation"
- leafletOsmId: "CyclOSM"
code: "Y"
- keyId: "cyclosm"
+ layerId: "cyclosm"
nameId: "cyclosm"
credit:
id: "cyclosm_credit"
- leafletOsmId: "CycleMap"
code: "C"
- keyId: "cyclemap"
+ layerId: "cyclemap"
nameId: "cycle_map"
apiKeyId: "THUNDERFOREST_KEY"
credit:
- leafletOsmId: "TransportMap"
code: "T"
- keyId: "transportmap"
+ layerId: "transportmap"
nameId: "transport_map"
apiKeyId: "THUNDERFOREST_KEY"
credit:
- leafletOsmId: "TracestrackTopo"
code: "P"
- keyId: "tracestracktopo"
+ layerId: "tracestracktopo"
nameId: "tracestracktop_topo"
apiKeyId: "TRACESTRACK_KEY"
credit:
- leafletOsmId: "HOT"
code: "H"
- keyId: "hot"
+ layerId: "hot"
nameId: "hot"
credit:
id: "hotosm_credit"
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}
reason: 'Rede agter die versperring:'
revoker: 'Herroep deur:'
block:
- not_revoked: (nie herroep nie)
show: Wys
edit: Redigeer
page:
creator_name: Skepper
reason: Rede vir die versperring
status: Status
- revoker_name: Herroep deur
notes:
index:
heading: Notas van %{user}
reason: 'Arsyeja për bllok:'
revoker: 'Revoker:'
block:
- not_revoked: (Jo revokuar)
show: Tregoj
edit: Redaktoj
page:
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}
# Author: McDutchie
# Author: Meno25
# Author: Mido
+# Author: Mohammed Qays
# Author: Mohammed Qubati
# Author: Mutarjem horr
# Author: NEHAOUA
message: الرسالة
node: عقدة
node_tag: وسم عقدة
+ note: ملاحظة
old_node: عقدة قديمة
old_node_tag: وسم عقدة قديمة
old_relation: علاقة قديمة
way: طريق
relation: علاقة
containing_relation:
- entry_role_html: العلاقة %{relation_name} (كــ%{relation_role})
+ entry_role_html: '%{relation_name} (مثل %{relation_role})'
not_found:
title: لم يتم العثور عليه
sorry: 'عفوًا، تعذر العثور على %{type} #%{id}.'
other: '%{count} بلاغ'
reported_item: شيء تم الابلاغ عنه
show:
- title: '%{status} المشكلة #%{issue_id}'
reports:
zero: صفر تقرير
one: تقرير واحد
reason: 'سبب العرقلة:'
revoker: 'المبطل:'
block:
- not_revoked: (لم تلغ)
show: اعرض
edit: تعديل
page:
creator_name: المنشئ
reason: السبب العرقلة
status: الحالة
- revoker_name: مُبطل بواسطة
user_mutes:
index:
title: المستخدمون الممنوعون
way: طريق
relation: علاقة
containing_relation:
- entry_role_html: العلاقه %{relation_name} (كــ %{relation_role})
+ entry_role_html: '%{relation_name} (كــ %{relation_role})'
not_found:
sorry: عفوًا، لم يتم العثور على %{type} بالمعرّف %{id}.
type:
reason: 'سبب العرقلة:'
revoker: 'المبطل:'
block:
- not_revoked: (لم تلغ)
show: اعرض
edit: عدّل
page:
creator_name: المنشئ
reason: السبب للعرقلة
status: الحالة
- revoker_name: مُبطل بواسطة
notes:
notes_paging_nav:
showing_page: الصفحه %{page}
other: '%{count} Informes'
reported_item: Elementu reportáu
show:
- title: '%{status} Problema #%{issue_id}'
reports:
zero: Nun hai informes
one: 1 informe
reason: 'Motivu del bloquéu:'
revoker: 'Desaniciador:'
block:
- not_revoked: (non desaniciáu)
show: Amosar
edit: Editar
page:
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}
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ı
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:
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
open: Асыҡ
resolved: Хәл ителде
show:
- title: '%{status} Мәсьәлә #%{issue_id}'
reports:
one: '%{count} хәбәр'
other: '%{count} хәбәрҙәр'
reason: 'Прычына блякаваньня:'
revoker: 'Адклікаўшы:'
block:
- not_revoked: (не адкліканае)
show: Паказаць
edit: Рэдагаваць
page:
creator_name: Стваральнік
reason: Прычына блякаваньня
status: Статус
- revoker_name: Адкліканае
notes:
show:
title: 'Нататка: %{id}'
other: '%{count} скаргі(-аў)'
reported_item: Скарга
show:
- title: '%{status} Праблема #%{issue_id}'
reports:
one: '%{count} скарга'
few: '%{count} скаргі'
reason: 'Прычына блакіроўкі:'
revoker: 'Адклікаўшы:'
block:
- not_revoked: (не адкліканы)
show: Паказаць
edit: Рэдагаваць
page:
creator_name: Стваральнік
reason: Прычына блакіроўкі
status: Статус
- revoker_name: Адкліканы
user_mutes:
index:
table:
other: '%{count} доклада'
reported_item: Докладван елемент
show:
- title: '%{status} Проблем #%{issue_id}'
reports:
one: '%{count} доклад'
other: '%{count} доклада'
open: Digor
resolved: Diskoulmet
show:
- title: '%{status} Kudenn #%{issue_id}'
reports:
one: 1 danevell
two: 2 zanevell
reason: 'Abeg ar stankadur :'
revoker: 'Torrer :'
block:
- not_revoked: (n'eo ket torret)
show: Diskouez
edit: Aozañ
page:
creator_name: Krouer
reason: Abeg evit stankañ
status: Statud
- revoker_name: Torret gant
navigation:
all_blocks: An holl stankadurioù
blocks_on_me: Stankadurioù evidon
reason: Razlog za blokadu
revoker: 'Opozivalac:'
block:
- not_revoked: (nije opozvano)
show: Pokazati
edit: Urediti
page:
creator_name: Kreator
reason: Razlog za blokadu
status: Stanje
- revoker_name: Opozvano od strane
notes:
index:
id: Id
other: '%{count} Informes'
reported_item: Element denunciat
show:
- title: '%{status} Incidència #%{issue_id}'
reports:
one: '%{count} informe'
other: '%{count} informes'
reason: 'Motiu del blocatge:'
revoker: 'Revoker:'
block:
- not_revoked: (no revocat)
show: Mostra
edit: Edita
page:
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
open: Йиллина
resolved: Кечйина
show:
- title: '%{status} проблема #%{issue_id}'
reports:
one: '%{count} хаам'
other: '%{count} хаамаш'
reason: 'Блоктохаран бахьана:'
revoker: 'БлокдӀайаьккхинарг:'
block:
- not_revoked: (блок дIа ца йаьккхина)
show: Гайта
edit: Нисйан
page:
creator_name: Автор
reason: Блоктохаран бахьана
status: Статус
- revoker_name: ДӀайаьккхина блок
navigation:
all_blocks: Ерриге а блокаш
blocks_on_me: Сан блоктохарш
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
open: Otevřeno
resolved: Vyřešeno
show:
- title: '%{status} Problém #%{issue_id}'
reports:
one: '%{count} hlášení'
few: '%{count} hlášení'
reason: 'Důvod bloku:'
revoker: 'Zrušil:'
block:
- not_revoked: (nezrušeno)
show: Zobrazit
edit: Upravit
page:
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í
message: Neges
node: Nod
node_tag: Tag Nod
+ note: Nodyn
old_node: Hen Nod
old_node_tag: Tag Hen Nod
old_relation: Hen Berthynas
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'
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}.'
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.
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'
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
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}
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
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
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
search_guidance: 'Søgning blandt sager:'
states:
ignored: Ignoréret
- open: Åbn
+ open: Åben
resolved: Løst
page:
user_not_found: Brugeren findes ikke
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'
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}
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
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
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}
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
# Author: Milet
# Author: Mormegil
# Author: Nadjita
+# Author: Nielkrokodil
# Author: Onefloid
# Author: P24
# Author: Pczaja
open: Offen
resolved: Erledigt
show:
- title: '%{status} Problem Nr. %{issue_id}'
reports:
one: Eine Meldung
other: '%{count} Meldungen'
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
reason: 'Grund der Sperre:'
revoker: 'Aufgehoben von:'
block:
- not_revoked: (nicht aufgehoben)
show: Anzeigen
edit: Bearbeiten
page:
creator_name: Urheber
reason: Grund der Sperre
status: Status
- revoker_name: Aufgehoben von
navigation:
all_blocks: Alle Sperren
blocks_on_me: Meine Sperren
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ış
reason: 'Pśicyna za blokěrowanje:'
revoker: 'Anulěrowaŕ:'
block:
- not_revoked: (nic wótpórany)
show: Pokazaś
edit: Wobźěłaś
page:
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
message: Μήνυμα
node: Κόμβος
node_tag: Ετικέτα κόμβου
+ note: Σημείωση
old_node: Παλαιός κόμβος
old_node_tag: Παλαιά ετικέτα κόμβου
old_relation: Παλαιά σχέση
way: Γραμμή
relation: Σχέση
containing_relation:
- entry_role_html: Σχέση %{relation_name} (ως %{relation_role})
+ entry_role_html: '%{relation_name} (ως %{relation_role})'
not_found:
title: Δεν βρέθηκε
sorry: 'Λυπάμαι, το %{type} #%{id} δεν βρέθηκε.'
open: Ανοιχτό
resolved: Επιλυμένο
show:
- title: '%{status} Ζήτημα #%{issue_id}'
+ title:
+ open: 'Ανοιχτό ζήτημα #%{issue_id}'
+ ignored: 'Αγνοημένο ζήτημα #%{issue_id}'
+ resolved: 'Επιλυμένο ζήτημα #%{issue_id}'
reports:
one: '%{count} αναφορά'
other: '%{count} αναφορές'
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: Επεξεργασία προτιμίσεων
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}
reason: 'Αιτία φραγής:'
revoker: 'Έκανε την ανάκληση:'
block:
- not_revoked: (δεν έχει ανακληθεί)
show: Εμφάνιση
edit: Επεξεργασία
page:
display_name: Αποκλεισμένος Χρήστης
creator_name: Δημιουργός
reason: Αιτία φραγής
+ start: Έναρξη
+ end: Τέλος
status: Κατάσταση
- revoker_name: Ανακλήθηκε από
navigation:
all_blocks: Όλες οι φραγές
blocks_on_me: Φραγές σε μένα
reason: 'Reason for block:'
revoker: 'Revoker:'
block:
- not_revoked: (not revoked)
show: Show
edit: Edit
page:
creator_name: Creator
reason: Reason for block
status: Status
- revoker_name: Revoked by
notes:
index:
title: Notes submitted or commented on by %{user}
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:
track: "Running Track"
water_park: "Water Park"
"yes": "Leisure"
+ lock:
+ "yes": "Lock"
man_made:
adit: "Adit"
advertising: "Advertising"
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"
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
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"
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}"
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"
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"
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
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.
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'
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:
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.
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
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}
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
open: Abierto
resolved: Resuelto
show:
- title: '%{status} Incidencia n.º %{issue_id}'
reports:
one: '%{count} reporte'
other: '%{count} reportes'
reason: 'Razón del bloqueo:'
revoker: 'Revocador:'
block:
- not_revoked: (no revocado)
show: Mostrar
edit: Editar
page:
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í
reason: 'Blokeerimise põhjus:'
revoker: Tühistaja
block:
- not_revoked: (pole tühistatud)
show: Näita
edit: Redigeeri
page:
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
other: '%{count} txosten'
reported_item: Salatutako elementua
show:
- title: '%{status} %{issue_id} arazoa'
reports:
one: '%{count} report'
other: '%{count} jakinarazpen'
reason: 'Blokeatzeko arrazoia:'
revoker: 'Ezeztatu duena:'
block:
- not_revoked: (ez da ezeztatu)
show: Erakutsi
edit: Aldatu
page:
creator_name: Egilea
reason: Blokeatzeko arrazoia
status: Egoera
- revoker_name: -k ezeztatua
notes:
index:
title: '%{user}k igotako edo iruzkinak utzitako oharrak'
other: '%{count} گزارش'
reported_item: مورد گزارششده
show:
- title: '%{status} موضوع #%{issue_id}'
reports:
one: '%{count} گزارش'
other: '%{count} گزارش'
reason: 'دلیل مسدودی:'
revoker: 'باطلکننده:'
block:
- not_revoked: (باطل نشده)
show: نمایش
edit: ویرایش
page:
creator_name: ایجادکننده
reason: دلیل مسدودی
status: وضعیت
- revoker_name: باطلکننده
navigation:
all_blocks: تمام قطع دسترسیها
blocks_on_me: قطع دسترسیهای من
other: '%{count} ilmiantoa'
reported_item: Ilmiannettu kohde
show:
- title: '%{status} Tapaus #%{issue_id}'
reports:
one: '%{count} ilmianto'
other: '%{count} ilmiantoa'
reason: 'Syy estoon:'
revoker: 'Estäjä:'
block:
- not_revoked: (ei kumottu)
show: Näytä
edit: Muokkaa
page:
creator_name: Tekijä
reason: Eston syy
status: Tila
- revoker_name: Eston tehnyt
user_mutes:
index:
table:
one: 1 ilmotus
other: '%{count} ilmiantoa'
show:
- title: '%{status} Tapaus #%{issue_id}'
reports:
zero: Ei ilmiantoa
one: Yksi ilmianto
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
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é.
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
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'
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
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} »
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
reason: 'Reson dal bloc:'
revoker: 'Chel che al à revocât:'
block:
- not_revoked: (no revocât)
show: Mostre
edit: Cambie
page:
creator_name: Creadôr
reason: Reson dal bloc
status: Stât
- revoker_name: Revocât di
user_mutes:
index:
table:
other: '%{count} meldings'
reported_item: Meld elemint
show:
- title: '%{status} probleem #%{issue_id}'
reports:
one: 1 melding
other: '%{count} meldings'
reason: 'Reden foar útsluting:'
revoker: 'Ynlûker:'
block:
- not_revoked: (net ynlutsen)
show: Werjaan
edit: Bewurkje
page:
creator_name: Oanmakker
reason: Reden foar útsluting
status: Status
- revoker_name: Ynlutsen troch
notes:
index:
title: Troch %{user} yntsjinne as op reägearre notysjes
page:
last_updated: Nuashonrú deireanach
show:
- title: '%{status} Fadhb #%{issue_id}'
reports:
zero: Tuairisc ar bith
one: Tuairisc amháin
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:
creator_name: Cruthaitheoir
reason: Cúis don bhac
status: Stádas
- revoker_name: Tarraingthe siar ag
notes:
index:
id: ID
reason: 'Adhbhar a'' bhacaidh:'
revoker: 'Cùl-ghairm le:'
block:
- not_revoked: (cha deach a chùl-ghairm)
show: Seall
edit: Deasaich
page:
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
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
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}.
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'
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
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}
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
message: הודעה
node: נקודה
node_tag: תג נקודה
+ note: הערה
old_node: נקודה ישנה
old_node_tag: תג צומת ישן
old_relation: יחס ישן
open: פתוח
resolved: פתור
show:
- title: בעיה במצב %{status} מס׳ %{issue_id}
+ title:
+ open: בעיה פתוחה %{issue_id}
+ ignored: בעיה חסרת־השפעה %{issue_id}
+ resolved: בעיה פתורה %{issue_id}
reports:
one: דו״ח אחד
two: '%{count} דו״חות'
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: עריכת העדפות
license:
copyright: 'זכויות היוצרים: מיזם OpenStreetMap ותורמיו, בכפוף לרישיון פתוח'
remote_failed: העריכה נכשלה – נא לוודא כי JOSM או Merkaartor נטענו ושאפשרות
- ×\94ש×\9c×\99×\98×\94 ×\9eק×\97×\95ר מופעלת
+ ×\94ש×\9c×\99×\98×\94 ×\9eר×\97×\95ק מופעלת
edit:
not_public: לא הגדרת את העריכות שלך כציבוריות.
not_public_description_html: לא תהיה לך אפשרות להמשיך לערוך את המפה לפני שזה
paragraph_1: בניגוד למפות אחרות, OpenStreetMap נוצרה לחלוטין על־ידי אנשים
כמוך והיא חופשית לתיקונים, עדכונים, הורדה ושימוש של כל מי שחפץ.
paragraph_2: אפשר להירשם כדי להתחיל לתרום.
- welcome: ברוך בואך ל־OoenStreetMap
+ welcome: ברוך בואך ל־OpenStreetMap
duplicate_social_email: אם כבר יש לך חשבון OpenStreetMap וברצונך להשתמש בספק
זהות של צד שלישי, נא להתחבר באמצעות הסיסמה שלך ולשנות את הגדרות החשבון שלך.
display name description: שם המשתמש שלך, שמוצג בפומבי. אפשר לשנות את זה בהעדפות
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}
reason: 'סיבה לחסימה:'
revoker: 'מבטל:'
block:
- not_revoked: (לא בוטלה)
show: הצגה
edit: עריכה
page:
display_name: משתמש חסום
creator_name: יוצר
reason: סיבה לחסימה
+ start: התחלה
+ end: סיום
status: מצב
- revoker_name: בוטלה על־ידי
navigation:
all_blocks: כל החסימות
blocks_on_me: חסימות שלי
filter:
not_revoke_admin_current_user: वर्तमान उपयोगकर्ता के द्वारा व्यवस्थापक भूमिका
को रद्द नहीं कर सकता है|
+ user_blocks:
+ page:
+ end: अन्त
notes:
index:
created_at: 'निर्माण का समय:'
reason: 'Razlog za blokadu:'
revoker: 'Opozivatelj:'
block:
- not_revoked: (nije opozvano)
show: Prikaži
edit: Uredi
page:
creator_name: Tvorac
reason: Razlog za blokadu
status: Status
- revoker_name: Opozvao
notes:
index:
title: Bilješke stvorio ili komentirao %{user}
other: '%{count} rozprawow'
reported_item: Zjewjeny objekt
show:
- title: '%{status} Problem čo. %{issue_id}'
reports:
one: '%{count} rozprawa'
two: '%{count} rozprawje'
reason: 'Přičina za blokowanje:'
revoker: 'Zeběracy wužiwar:'
block:
- not_revoked: (njezběhnjeny)
show: Pokazać
edit: Wobdźěłać
page:
creator_name: Blokowar
reason: Přičina za blokowanje
status: Status
- revoker_name: Zběhnjene wot
user_mutes:
index:
title: Zněmjeni wužiwarjo
open: Nyitva
resolved: Megoldva
show:
- title: '#%{issue_id} probléma %{status}'
reports:
one: '%{count} bejelentés'
other: '%{count} bejelentés'
reason: 'Blokkolás indoklása:'
revoker: 'Visszavonó:'
block:
- not_revoked: (nincs visszavonva)
show: Megjelenítés
edit: Szerkesztés
page:
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
open: Aperte
resolved: Resolvite
show:
- title: '%{status} Problema №%{issue_id}'
reports:
one: '%{count} reporto'
other: '%{count} reportos'
reason: 'Motivo del blocada:'
revoker: 'Revocator:'
block:
- not_revoked: (non revocate)
show: Monstrar
edit: Modificar
page:
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
other: '%{count} Laporan'
reported_item: Butir dilaporkan
show:
- title: '%{status} Isu #%{issue_id}'
reports:
other: '%{count} laporan'
no_reports: Tidak ada laporan
reason: 'Alasan untuk blokir:'
revoker: 'Pembatal:'
block:
- not_revoked: (tidak dicabut)
show: Tampilkan
edit: Edit
page:
creator_name: Pencipta
reason: Alasan untuk blokir
status: Status
- revoker_name: Dibatalkan oleh
user_mutes:
index:
title: Pengguna yang Dibisukan
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'
reason: 'Ástæða banns:'
revoker: 'Eytt af:'
block:
- not_revoked: (ekki eytt)
show: Sýna
edit: Breyta
page:
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
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
open: Aperto
resolved: Risolto
show:
- title: '%{status} Problema #%{issue_id}'
reports:
one: '%{count} segnalazione'
other: '%{count} segnalazioni'
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
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}
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
open: 開く
resolved: 解決済
show:
- title: '%{status} 問題 #%{issue_id}'
reports:
other: '%{count}件のレポート'
no_reports: 報告はありません
reason: 'ブロックの理由:'
revoker: '取消:'
block:
- not_revoked: (取り消されていません)
show: 表示する
edit: 編集
page:
creator_name: 作成者
reason: ブロックされた理由
status: 状態
- revoker_name: 取り消し者
user_mutes:
index:
title: ミュートした利用者
reason: 'დაბლოკვის მიზეზი:'
revoker: 'განმბლოკველი:'
block:
- not_revoked: (არ არის განბლოკილი)
show: ჩვენება
edit: რედაქტირება
page:
creator_name: შემქმნელი
reason: დაბლოკვის მიზეზი
status: სტატუსი
- revoker_name: განბლოკილია
notes:
index:
creator: შემქმნელი
creator_name: Amernay
reason: Taɣzint n usewḥel
status: Addad
- revoker_name: Isewḥel-it
notes:
index:
heading: Tizmilin n %{user}
lawyer: 변호사 사무실
newspaper: 신문사
ngo: 비정부 기구 사무실
+ religion: 종교 사무소
research: 연구실
tax_advisor: 세무사
telecommunication: 통신 회사 사옥
massage: 안마시술소
medical_supply: 의료용품 공급점
mobile_phone: 휴대폰 상점
+ money_lender: 대금업자
motorcycle: 이륜자동차(오토바이) 상점
motorcycle_repair: 오토바이 수리점
music: 음반 가게
page:
user_not_found: 사용자가 존재하지 않습니다
issues_not_found: 해당 이슈를 찾을 수 없습니다
+ reported_user: 신고된 사용자
status: 상태
reports: 보고서
last_updated: 최근 업데이트
reports_count:
other: 신고 %{count}건
reported_item: 항목 신고함
+ states:
+ ignored: 무시됨
+ open: 열림
+ resolved: 해결됨
show:
- title: '%{status} 문제 #%{issue_id}'
reports:
other: 신고 %{count}건
no_reports: 보고서 없음
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: 환경 설정 편집
reason: '차단 이유:'
revoker: '해제:'
block:
- not_revoked: (철회하지 않음)
show: 보기
edit: 편집
page:
creator_name: 만든이
reason: 차단 이유
status: 상태
- revoker_name: 해제자
navigation:
all_blocks: 모든 차단
blocks_on_me: 나의 차단내역
other: '%{count} Rapor'
reported_item: Hêmanê Raporkirî
show:
- title: '%{status} Pirsgirêk #%{issue_id}'
reports:
one: '%{count} rapor'
other: '%{count} raporan'
reason: 'Sedema astengkirinê:'
revoker: Yê ku rakiriyeː
block:
- not_revoked: (ne betalkirî)
show: Nîşan bide
edit: Biguherîne
page:
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
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.
open: Oppen
resolved: Geléist
show:
- title: '%{status} Problem Nr. %{issue_id}'
reports:
one: '%{count} Meldung'
other: '%{count} Meldungen'
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
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.'
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:
open: Atidaryta
resolved: Išspręsta
show:
- title: '%{status} Problema #%{issue_id}'
reports:
one: '{%count} pranešimas'
few: '%{count} pranešimai'
reason: 'Blokavimo priežastis:'
revoker: 'Atšaukėjas:'
block:
- not_revoked: (neatšauktas)
show: Rodyti
edit: Keisti
page:
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
reason: 'Bloķēšanas iemesls:'
revoker: 'Atsaucējs:'
block:
- not_revoked: (nav atsaukts)
show: Rādīt
edit: Labot
page:
creator_name: Autors
reason: Iemesls liegumam
status: Statuss
- revoker_name: Atsaucis
notes:
index:
title: Piezīmes, kuras veidojis vai komentējis %{user}
message: Порака
node: Јазол
node_tag: Ознака на јазол
+ note: Напомена
old_node: Стар јазол
old_node_tag: Стара ознака за јазол
old_relation: Стар однос
way: Пат
relation: Однос
containing_relation:
- entry_role_html: Однос %{relation_name} (како %{relation_role})
+ entry_role_html: '%{relation_name} (како %{relation_role})'
not_found:
title: Не е најдено
sorry: За жал, не да најдам %{type} со бр. %{id}.
open: Отворено
resolved: Решено
show:
- title: '%{status} Проблем бр. #%{issue_id}'
+ title:
+ open: Отворен проблем бр. %{issue_id}
+ ignored: Занемарен проблем бр. %{issue_id}
+ resolved: Решен проблем бр. %{issue_id}
reports:
one: '%{count} пријава'
other: '%{count} пријави'
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: Измени нагодувања
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: Морате да бидете модератор за да правите или подновувате
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}
reason: 'Причина за блокирање:'
revoker: 'Поништувач:'
block:
- not_revoked: (не се поништува)
show: Прикажи
edit: Уреди
page:
display_name: Блокиран корисник
creator_name: Создавач
reason: Причина за блокирање
+ start: Почеток
+ end: Крај
status: Статус
- revoker_name: 'Поништил:'
navigation:
all_blocks: Сите блокови
blocks_on_me: Добиени блокови
description: Опис
created_at: Создадена
last_changed: Изменета
+ apply: Примени
+ all: Сите
+ open: Отворено
+ closed: Затворено
+ status: Статус
show:
title: 'Белешка: %{id}'
description: Опис
report: пријави ја белешкава
anonymous_warning: Оваа белешка има коментари од анонимни корисници што треба
независно да се проверат.
+ discussion: Разговор
+ subscribe: Претплати се
+ unsubscribe: Отпиши се
hide: Скриј
resolve: Решена
reactivate: Преактивирај
reason: 'Sebab sekatan:'
revoker: 'Penarik balik:'
block:
- not_revoked: (tidak ditarik balik)
show: Tunjukkan
edit: Sunting
page:
creator_name: Pembuat
reason: Sebab sekatan
status: Status
- revoker_name: Ditarik balik oleh
user_mutes:
index:
title: Pengguna yang Diredamkan
other: '%{count} rapporter'
reported_item: Rapportert element
show:
- title: '%{status} Sak #%{issue_id}'
reports:
one: '%{count} rapport'
other: '%{count} rapporter'
reason: 'Årsak for blokkering:'
revoker: 'Tilbakekaller:'
block:
- not_revoked: (ikke tilbakekalt)
show: Vis
edit: Rediger
page:
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}
message: Bericht
node: Knooppunt
node_tag: Knooppuntlabel
+ note: Opmerking
old_node: Oud knooppunt
old_node_tag: Oud knooppuntlabel
old_relation: Oude relatie
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.'
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'
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
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}
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
other: '%{count} meldingar'
reported_item: Meld objekt
show:
- title: '%{status} Sak #%{issue_id}'
reports:
one: '%{count} melding'
other: '%{count} meldingar'
reason: 'Årsak for blokkering:'
revoker: 'Tilbakekaller:'
block:
- not_revoked: (ikkje tilbakekalt)
show: Vis
edit: Rediger
page:
creator_name: Oppretta av
reason: Årsak for blokkering
status: Status
- revoker_name: Tilbakekalt av
notes:
index:
heading: '%{user} sine merknadar'
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}
other: '%{count} rapòrts'
reported_item: Element raportat
show:
- title: '%{status} Incidéncia #%{issue_id}'
reports:
zero: Ges de rapòrt
one: 1 rapport
reason: 'Motiu del blocatge :'
revoker: 'Revocador :'
block:
- not_revoked: (pas revocat)
show: Mostrar
edit: Modificar
page:
creator_name: Creator
reason: Motiu del blocatge
status: Estatut
- revoker_name: Revocat per
notes:
index:
title: Nòtas somesas o comentadas per %{user}
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} 'ਤੇ ਹੱਲ ਕੀਤਾ ਗਿਆ
show:
title: ਮੇਰੀਆਂ ਤਰਜੀਹਾਂ
preferred_languages: ਤਰਜੀਹੀ ਬੋਲੀਆਂ
+ site_color_schemes:
+ auto: ਆਪਣੇ-ਆਪ
+ light: ਚਾਨਣ
+ dark: ਗੂੜ੍ਹਾ
+ map_color_schemes:
+ auto: ਆਪਣੇ-ਆਪ
+ light: ਚਾਨਣ
+ dark: ਗੂੜ੍ਹਾ
edit_preferences: ਤਰਜੀਹਾਂ ਨੂੰ ਸੋਧੋ
edit:
title: ਤਰਜੀਹਾਂ ਨੂੰ ਸੋਧੋ
years:
one: '%{count} ਸਾਲ'
other: '%{count} ਸਾਲ'
+ short:
+ ended: ਖਤਮ ਹੋ ਗਿਆ/ਗਈ
+ active: ਸਰਗਰਮ
+ expired_unread: ਨਹੀਂ-ਪੜ੍ਹਿਆ ਦੀ ਮਿਆਦ ਪੁੱਗ ਗਈ
show:
created: 'ਬਣਾਇਆ ਗਿਆ:'
duration: 'ਮਿਆਦ:'
display_name: ਰੋਕਿਆ ਵਰਤੋਂਕਾਰ
creator_name: ਸਿਰਜਣਹਾਰ
reason: ਰੋਕ ਦਾ ਕਾਰਨ
+ start: ਸ਼ੁਰੂ ਕਰੋ
+ end: ਖ਼ਤਮ
status: ਦਰਜਾ
user_mutes:
index:
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
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'
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
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}
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
other: '%{count} رپورٹاں'
reported_item: رپورٹ دی چیز
show:
- title: '[%{status}] مسئلہ: %{issue_id}'
reports:
other: zeroرپورٹ نہیں
one: اِکّ رپورٹ
edit: سودھو
revoker: 'پرتاؤݨ والا:'
block:
- not_revoked: (نہیں پرتائی دتی گئی)
show: وکھاؤ
edit: سودھو
page:
open: Aberta
resolved: Resolvida
show:
- title: '%{status} Denúncia #%{issue_id}'
reports:
one: '%{count} denúncia'
other: '%{count} denúncias'
reason: 'Razão do bloqueio:'
revoker: 'Quem revogou:'
block:
- not_revoked: (não revogado)
show: Mostrar
edit: Editar
page:
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
open: Abrir
resolved: Resolvido
show:
- title: '%{status} Problema #%{issue_id}'
reports:
one: '%{count} denúncia'
other: '%{count} denúncias'
reason: 'Razão do bloqueio:'
revoker: 'Quem retirou:'
block:
- not_revoked: (não retirado)
show: Exibir
edit: Editar
page:
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
open: Deschis
resolved: Rezolvat
show:
- title: '%{status} Problema #%{issue_id}'
reports:
one: '%{count} raport'
few: '%{count} raporturi'
reason: 'Motivul blocării:'
revoker: Revocă!
block:
- not_revoked: (nu este revocată)
show: Arată
edit: Modificare
page:
creator_name: Creator
reason: Motivul blocării
status: Stare
- revoker_name: Revocat de
user_mutes:
index:
table:
message: Сообщение
node: Точка
node_tag: Тег точки
+ note: Заметка
old_node: Старая точка
old_node_tag: Старый тег точки
old_relation: Старое отношение
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:
other: '%{count} сообщений'
reported_item: Элемент в сообщении
show:
- title: '%{status} Проблема #%{issue_id}'
+ title:
+ open: 'Открытая проблема #%{issue_id}'
+ ignored: 'Проигнорированная проблема #%{issue_id}'
+ resolved: 'Разрешённая проблема #%{issue_id}'
reports:
one: 1 сообщение
few: '%{count} сообщения'
reason: 'Причина блокировки:'
revoker: 'Разблокировавший:'
block:
- not_revoked: (не разблокирован)
show: Показать
edit: Править
page:
creator_name: Автор
reason: Причина блокировки
status: Состояние
- revoker_name: Разблокировал
user_mutes:
index:
title: Заглушённые пользователи
other: '%{count} sinnalatziones'
reported_item: Elementu sinnaladu
show:
- title: '%{status} Problema #%{issue_id}'
reports:
one: '%{count} sinnalatzione'
other: '%{count} sinnalatziones'
reason: 'Resone de su blocu:'
revoker: 'Revocadore:'
block:
- not_revoked: (non revocadu)
show: Ammustra
edit: Modìfica
page:
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
friendly: '%e %B %Y ê %H:%M'
helpers:
file:
- prompt: Scarta u pricu
+ prompt: Scarta lu file
submit:
diary_comment:
create: Cummenta
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:
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
reason: 'Mutivu dû bloccu:'
revoker: 'Rivucaturi:'
block:
- not_revoked: (nun arrivucatu)
show: Ammustra
edit: Cancia
page:
creator_name: Criaturi
reason: Mutivu dû bloccu
status: Statu
- revoker_name: Arrivucatu di
notes:
index:
title: Noti scritti o cummintati di l'utenti %{user}
-# Messages for Serbo-Croatian (srpskohrvatski / српскохрватски)
+# Messages for Serbo-Croatian (Latin script) (srpskohrvatski (latinica))
# Exported from translatewiki.net
# Export driver: phpyaml
# Author: Vlad5250
open: Otvorené
resolved: Vyriešené
show:
- title: '%{status} Problém #%{issue_id}'
reports:
one: '%{count} hlásenie'
few: '%{count} hlásenia'
reason: 'Dôvod blokovania:'
revoker: 'Odvolal:'
block:
- not_revoked: (nezrušený)
show: Zobraziť
edit: Upraviť
page:
creator_name: Tvorca
reason: Dôvod pre blokovanie
status: Stav
- revoker_name: Zrušil
user_mutes:
index:
title: Stlmení používatelia
message: سنیہہ
node: نوڈ
node_tag: نوڈ ٹیگ
+ note: نوٹ
old_node: پراݨا نوڈ
old_node_tag: پراݨا نوڈ ٹیگ
old_relation: پراݨا رشتہ
title: میݙیاں ترجیحاں
preferred_editor: ترجیحی ایڈیٹر
preferred_languages: ترجیحی زباناں
+ site_color_schemes:
+ auto: خود کار
+ light: پھکّا
+ dark: ڳوڑھا
+ map_color_schemes:
+ auto: خود بخود
+ light: پھکّا
+ dark: ڳوڑھا
edit_preferences: ترجیحاں وچ تبدیلی کرو
edit:
save: ترجیحاں اپ ڈیٹ کرو
other: '%{count} poročil'
reported_item: Prijavljeni predmet
show:
- title: '%{status} Težava #%{issue_id}'
reports:
one: '%{count} prijava'
two: '%{count} prijavi'
reason: 'Razlog za blokiranje:'
revoker: 'Preklical:'
block:
- not_revoked: (ni preklicano)
show: Prikaži
edit: Uredi
page:
creator_name: Ustvarjalec
reason: Razlog za blokiranje
status: Stanje
- revoker_name: Preklical
navigation:
block: 'Blokiraj #%{id}'
user_mutes:
edit: Redakto
page:
status: Statusi
- revoker_name: Revokuar nga
notes:
show:
title: 'Shënim: %{id}'
reason: 'Razlog za blokiranje:'
revoker: 'Opozivalac:'
block:
- not_revoked: (nije opozvano)
show: Prikaži
edit: Uredi
page:
creator_name: Tvorac
reason: Razlozi za blokiranje
status: Stanje
- revoker_name: Opozvao
notes:
notes_paging_nav:
showing_page: Prikaz stranice %{page}
message: Порука
node: Чвор
node_tag: Ознака тачке
+ note: Напомена
old_node: Стари чвор
old_node_tag: Ознака старе тачке
old_relation: Стари однос
title: Моја подешавања
preferred_editor: Жељени уређивач
preferred_languages: Жељени језици
+ site_color_schemes:
+ dark: Тамна
+ map_color_schemes:
+ auto: Аутоматски
+ light: Светла
edit_preferences: Уреди подешавања
edit:
title: Моја подешавања
reason: 'Разлог за блокирање:'
revoker: 'Опозивалац:'
block:
- not_revoked: (није опозвано)
show: Прикажи
edit: Уреди
page:
creator_name: Творац
reason: Разлози за блокирање
status: Стање
- revoker_name: Опозвао
user_mutes:
index:
title: Пригушени корисници
open: Öppen
resolved: Löst
show:
- title: '%{status} Ärende nr %{issue_id}'
reports:
one: '%{count} rapport'
other: '%{count} rapporter'
reason: 'Anledning för blockering:'
revoker: 'Återkallare:'
block:
- not_revoked: (Inte återkallat)
show: Visa
edit: Redigera
page:
creator_name: Skapare
reason: Orsak till blockering
status: Status
- revoker_name: Återkallad av
navigation:
all_blocks: Alla blockeringar
blocks_on_me: Blockeringar på mig
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} కు తాజాకరించారు
reason: 'నిరోధానికి కారణం:'
revoker: 'ఎత్తివేసేవారు:'
block:
- not_revoked: (ఎత్తివేయలేదు)
show: చూపించు
edit: మార్చు
page:
creator_name: సృష్టికర్త
reason: నిరోధానికి కారణం
status: స్థితి
- revoker_name: ఎత్తివేసినవారు
notes:
index:
title: గమనికలు సమర్పించినది లేదా వ్యాఖ్యానించినది %{user}
other: '%{count} การรายงาน'
reported_item: รายการที่รายงาน
show:
- title: 'ปัญหา %{status} #%{issue_id}'
reports:
other: '%{count} การรายงาน'
no_reports: ไม่มีรายงาน
edit: แก้ไข
reason: 'เหตุผลสำหรับการระงับใช้งาน:'
block:
- not_revoked: (ไม่ได้มีการยกเลิก)
show: แสดง
edit: แก้ไข
page:
creator_name: ผู้สั่งให้ระงับ
reason: เหตุผลที่ต้องระงับใช้งาน
status: สถานะ
- revoker_name: ยกเลิกโดย
notes:
index:
heading: หมายเหตุของ %{user}
other: '%{count} mga Ulat'
reported_item: Naiulat na bagay
show:
- title: '%{status} Isyu #%{issue_id}'
reports:
one: 1 ulat
other: '%{count} mga ulat'
reason: 'Dahilan ng paghadlang:'
revoker: 'Tagapagbawi:'
block:
- not_revoked: (hindi binawi)
show: Ipakita
edit: Baguhin
page:
creator_name: Tagapaglikha
reason: Dahilan ng pagharang
status: Kalagayan
- revoker_name: Binawi ni
notes:
index:
title: Mga tala na isinumite o pinuna ni %{user}
open: Aç
resolved: Çözüldü
show:
- title: '%{status} Sorun #%{issue_id}'
reports:
one: '%{count} rapor'
other: '%{count} rapor'
reason: 'Engellenme sebebi:'
revoker: 'Geri alan:'
block:
- not_revoked: (iptal edilmemiş)
show: Göster
edit: Düzenle
page:
creator_name: Oluşturan
reason: Engellenme sebebi
status: Durum
- revoker_name: İptal eden
navigation:
all_blocks: Tüm Engellemeler
blocks_on_me: Engellendiklerim
message: Повідомлення
node: Точка
node_tag: Теґ точки
+ note: Примітка
old_node: Стара точка
old_node_tag: Старий теґ точки
old_relation: Старий зв’язок
open: Відкрито
resolved: Вирішено
show:
- title: 'Звернення #%{issue_id} - %{status}'
reports:
one: '%{count} скарга'
few: '%{count} скарги'
reason: 'Причина блокування:'
revoker: 'Розблокував:'
block:
- not_revoked: (не розблокований)
show: Показати
edit: Редагувати
page:
creator_name: Автор
reason: Причина блокування
status: Стан
- revoker_name: Розблокував
navigation:
all_blocks: Всі блокування
blocks_on_me: Мої блокування
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ũ
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}.'
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
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:
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:
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
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
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
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'
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'
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
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
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
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
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
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ú:'
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
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
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ả
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
add: Thêm Ghi chú
notes_paging_nav:
showing_page: Trang %{page}
+ next: Sau
+ previous: Trước
javascripts:
close: Đóng
share:
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:
message: 消息
node: 节点
node_tag: 节点标签
+ note: 注释
old_node: 旧节点
old_node_tag: 旧节点标签
old_relation: 旧关系
way: 路径
relation: 关系
containing_relation:
- entry_role_html: 关系 %{relation_name} (作为 %{relation_role})
+ entry_role_html: '%{relation_name} (作为 %{relation_role})'
not_found:
title: 未找到
sorry: '抱歉,无法找到 %{type} #%{id}。'
open: 开放
resolved: 已解决
show:
- title: '%{status}问题#%{issue_id}'
reports:
one: '%{count}个举报'
other: '%{count}个举报'
reason: 封禁的原因:
revoker: 撤销者:
block:
- not_revoked: (未撤销)
show: 显示
edit: 编辑
page:
creator_name: 创建者
reason: 封禁的原因
status: 状态
- revoker_name: 撤销者
navigation:
all_blocks: 所有封禁
blocks_on_me: 对我的封禁
open: 開放
resolved: 已解決
show:
- title: '%{status} 問題 #%{issue_id}'
reports:
one: '%{count} 份回報'
other: '%{count} 份回報'
reason: 封鎖的理由:
revoker: 撤銷者:
block:
- not_revoked: (沒有撤銷)
show: 顯示
edit: 編輯
page:
creator_name: 建立者
reason: 封鎖的理由
status: 狀態
- revoker_name: 撤銷者
navigation:
all_blocks: 所有封鎖
blocks_on_me: 對我的封鎖
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
--- /dev/null
+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
{ :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" }
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)
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)
--- /dev/null
+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
# 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" }
{ :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
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
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
# 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
# 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
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
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
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")
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
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"
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"
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
assert_equal "<s>test</s>", deleted_output
end
- def test_element_class
+ def test_element_icon
node = create(:node, :with_history, :version => 2)
node_v1 = node.old_nodes.find_by(:version => 1)
node_v2 = node.old_nodes.find_by(:version => 2)
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
--- /dev/null
+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
--- /dev/null
+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
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"
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"
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"
"@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"
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"