From: Tom Hughes Date: Thu, 23 Feb 2017 10:06:42 +0000 (+0000) Subject: Merge remote-tracking branch 'openstreetmap/pull/1436' X-Git-Tag: live~3582 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/392b68a65fd6ffa521b89e079b234bb0241380d3?hp=cc65b2d126d708499edb5fb5d513266cfa33a47b Merge remote-tracking branch 'openstreetmap/pull/1436' --- diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml index a7b456aec..4232b0574 100644 --- a/.rubocop_todo.yml +++ b/.rubocop_todo.yml @@ -50,7 +50,7 @@ Lint/ShadowingOuterLocalVariable: # Offense count: 630 Metrics/AbcSize: - Max: 271 + Max: 280 # Offense count: 35 # Configuration parameters: CountComments. diff --git a/VAGRANT.md b/VAGRANT.md index 549e06687..3825ad988 100644 --- a/VAGRANT.md +++ b/VAGRANT.md @@ -6,10 +6,13 @@ On Ubuntu, it should be as simple as: sudo apt-get install vagrant ``` -Other Linux distributions should have similar installation instructions using `yum` or similar. +Other Linux distributions should have similar installation instructions using `dnf`, `pacman`, or similar. Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](http://www.vagrantup.com/downloads.html) for more information. +Note than until there are suitable _xenial64_ [vagrant boxes](https://atlas.hashicorp.com/boxes/search?utf8=%E2%9C%93&sort=&provider=&q=xenial64) for other providers, +the only virtualization provider supported is virtualbox. You might need to install it and specify `--provider virtualbox` when setting up your environment. + # Setting up openstreetmap-website Once Vagrant has been installed, you can start an environment by checking out the openstreetmap-website code if you haven't already, then changing to the directory which contains the Vagrantfile by typing: diff --git a/Vendorfile b/Vendorfile index 361f2c843..304be9e15 100644 --- a/Vendorfile +++ b/Vendorfile @@ -20,6 +20,11 @@ folder 'vendor/assets' do file "images/#{image}", "https://unpkg.com/leaflet@1.0.3/dist/images/#{image}" end + from 'git://github.com/aratcliffe/Leaflet.contextmenu.git', :tag => 'v1.2.1' do + file 'leaflet.contextmenu.js', 'dist/leaflet.contextmenu.js' + file 'leaflet.contextmenu.css', 'dist/leaflet.contextmenu.css' + end + from 'git://github.com/kajic/leaflet-locationfilter.git' do file 'leaflet.locationfilter.css', 'src/locationfilter.css' file 'leaflet.locationfilter.js', 'src/locationfilter.js' diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index 9d7122e4d..1ba2fbbde 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -7,6 +7,8 @@ //= require leaflet.share //= require leaflet.polyline //= require leaflet.query +//= require leaflet.contextmenu +//= require index/contextmenu //= require index/search //= require index/browse //= require index/export @@ -77,7 +79,9 @@ $(document).ready(function () { var map = new L.OSM.Map("map", { zoomControl: false, - layerControl: false + layerControl: false, + contextmenu: true, + contextmenuWidth: 140 }); map.attributionControl.setPrefix(''); @@ -147,6 +151,8 @@ $(document).ready(function () { L.control.scale() .addTo(map); + OSM.initializeContextMenu(map); + if (OSM.STATUS !== 'api_offline' && OSM.STATUS !== 'database_offline') { OSM.initializeNotes(map); if (params.layers.indexOf(map.noteLayer.options.code) >= 0) { diff --git a/app/assets/javascripts/index/contextmenu.js b/app/assets/javascripts/index/contextmenu.js new file mode 100644 index 000000000..148ccf908 --- /dev/null +++ b/app/assets/javascripts/index/contextmenu.js @@ -0,0 +1,85 @@ +OSM.initializeContextMenu = function (map) { + map.contextmenu.addItem({ + text: I18n.t("javascripts.context.directions_from"), + callback: function directionsFromHere(e) { + var precision = OSM.zoomPrecision(map.getZoom()), + latlng = e.latlng.wrap(), + lat = latlng.lat.toFixed(precision), + lng = latlng.lng.toFixed(precision); + + OSM.router.route("/directions?" + querystring.stringify({ + route: lat + "," + lng + ";" + $("#route_to").val() + })); + } + }); + + map.contextmenu.addItem({ + text: I18n.t("javascripts.context.directions_to"), + callback: function directionsToHere(e) { + var precision = OSM.zoomPrecision(map.getZoom()), + latlng = e.latlng.wrap(), + lat = latlng.lat.toFixed(precision), + lng = latlng.lng.toFixed(precision); + + OSM.router.route("/directions?" + querystring.stringify({ + route: $("#route_from").val() + ";" + lat + "," + lng + })); + } + }); + + map.contextmenu.addItem({ + text: I18n.t("javascripts.context.add_note"), + callback: function addNoteHere(e) { + var precision = OSM.zoomPrecision(map.getZoom()), + latlng = e.latlng.wrap(), + lat = latlng.lat.toFixed(precision), + lng = latlng.lng.toFixed(precision); + + OSM.router.route("/note/new?lat=" + lat + "&lon=" + lng); + } + }); + + map.contextmenu.addItem({ + text: I18n.t("javascripts.context.show_address"), + callback: function describeLocation(e) { + var precision = OSM.zoomPrecision(map.getZoom()), + latlng = e.latlng.wrap(), + lat = latlng.lat.toFixed(precision), + lng = latlng.lng.toFixed(precision); + + OSM.router.route("/search?query=" + encodeURIComponent(lat + "," + lng)); + } + }); + + map.contextmenu.addItem({ + text: I18n.t("javascripts.context.query_features"), + callback: function queryFeatures(e) { + var precision = OSM.zoomPrecision(map.getZoom()), + latlng = e.latlng.wrap(), + lat = latlng.lat.toFixed(precision), + lng = latlng.lng.toFixed(precision); + + OSM.router.route("/query?lat=" + lat + "&lon=" + lng); + } + }); + + map.contextmenu.addItem({ + text: I18n.t("javascripts.context.centre_map"), + callback: function centreMap(e) { + map.panTo(e.latlng); + } + }); + + map.on("mousedown", function (e) { + if (e.originalEvent.shiftKey) map.contextmenu.disable(); + else map.contextmenu.enable(); + }); + + var updateMenu = function updateMenu () { + map.contextmenu.setDisabled(2, map.getZoom() < 12); + map.contextmenu.setDisabled(4, map.getZoom() < 14); + }; + + map.on("zoomend", updateMenu); + updateMenu(); +}; diff --git a/app/assets/javascripts/index/directions/graphhopper.js b/app/assets/javascripts/index/directions/graphhopper.js index 88a9c15c1..7a5d77d9b 100644 --- a/app/assets/javascripts/index/directions/graphhopper.js +++ b/app/assets/javascripts/index/directions/graphhopper.js @@ -49,12 +49,16 @@ function GraphHopperEngine(id, vehicleType) { instrText += instr.text; var latLng = line[instr.interval[0]]; var distInMeter = instr.distance; + var lineseg = []; + for (var j = instr.interval[0]; j <= instr.interval[1]; j++) { + lineseg.push({lat: line[j][0], lng: line[j][1]}); + } steps.push([ - {lat: latLng.lat, lng: latLng.lng}, + {lat: latLng[0], lng: latLng[1]}, instrCode, instrText, distInMeter, - [] + lineseg ]); // TODO does graphhopper map instructions onto line indices? } diff --git a/app/assets/javascripts/index/new_note.js b/app/assets/javascripts/index/new_note.js index 397daa637..53697e65b 100644 --- a/app/assets/javascripts/index/new_note.js +++ b/app/assets/javascripts/index/new_note.js @@ -77,7 +77,9 @@ OSM.NewNote = function(map) { } page.pushstate = page.popstate = function (path) { - OSM.loadSidebarContent(path, page.load); + OSM.loadSidebarContent(path, function () { + page.load(path); + }); }; function newHalo(loc, a) { @@ -97,7 +99,7 @@ OSM.NewNote = function(map) { } } - page.load = function () { + page.load = function (path) { if (addNoteButton.hasClass("disabled")) return; if (addNoteButton.hasClass("active")) return; @@ -105,12 +107,34 @@ OSM.NewNote = function(map) { map.addLayer(noteLayer); - var mapSize = map.getSize(); - var markerPosition; + var params = querystring.parse(path.substring(path.indexOf('?') + 1)); + var markerLatlng; + + if (params.lat && params.lon) { + markerLatlng = L.latLng(params.lat, params.lon); + + var markerPosition = map.latLngToContainerPoint(markerLatlng), + mapSize = map.getSize(), + panBy = L.point(0, 0); + + if (markerPosition.x < 50) { + panBy.x = markerPosition.x - 50; + } else if (markerPosition.x > mapSize.x - 50) { + panBy.x = 50 - mapSize.x + markerPosition.x; + } - markerPosition = [mapSize.x / 2, mapSize.y / 2]; + if (markerPosition.y < 50) { + panBy.y = markerPosition.y - 50; + } else if (markerPosition.y > mapSize.y - 50) { + panBy.y = 50 - mapSize.y + markerPosition.y; + } + + map.panBy(panBy); + } else { + markerLatlng = map.getCenter(); + } - newNote = L.marker(map.containerPointToLatLng(markerPosition), { + newNote = L.marker(markerLatlng, { icon: noteIcons["new"], opacity: 0.9, draggable: true diff --git a/app/assets/javascripts/leaflet.map.js b/app/assets/javascripts/leaflet.map.js index 4b50cc78c..b87764b1d 100644 --- a/app/assets/javascripts/leaflet.map.js +++ b/app/assets/javascripts/leaflet.map.js @@ -107,7 +107,7 @@ L.OSM.Map = L.Map.extend({ params.mlon = latLng.lng.toFixed(precision); } - var url = 'http://' + OSM.SERVER_URL + '/', + var url = window.location.protocol + '//' + OSM.SERVER_URL + '/', query = querystring.stringify(params), hash = OSM.formatHash(this); @@ -121,7 +121,8 @@ L.OSM.Map = L.Map.extend({ var zoom = this.getZoom(), latLng = marker && this.hasLayer(marker) ? marker.getLatLng().wrap() : this.getCenter().wrap(), str = window.location.hostname.match(/^www\.openstreetmap\.org/i) ? - 'http://osm.org/go/' : 'http://' + window.location.hostname + '/go/', + window.location.protocol + '//osm.org/go/' : + window.location.protocol + '//' + window.location.hostname + '/go/', char_array = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_~", x = Math.round((latLng.lng + 180.0) * ((1 << 30) / 90.0)), y = Math.round((latLng.lat + 90.0) * ((1 << 30) / 45.0)), diff --git a/app/assets/stylesheets/leaflet-all.scss b/app/assets/stylesheets/leaflet-all.scss index 10ad2607a..82312e5c2 100644 --- a/app/assets/stylesheets/leaflet-all.scss +++ b/app/assets/stylesheets/leaflet-all.scss @@ -1,6 +1,7 @@ /* *= require leaflet *= require leaflet.locationfilter + *= require leaflet.contextmenu */ /* Override to serve images through the asset pipeline. */ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 354fcc7c0..8eb5f2409 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -152,9 +152,14 @@ class ApplicationController < ActionController::Base # have we identified the user? if @user # check if the user has been banned - if @user.blocks.active.exists? - # NOTE: need slightly more helpful message than this. - report_error t("application.setup_user_auth.blocked"), :forbidden + user_block = @user.blocks.active.take + unless user_block.nil? + set_locale + if user_block.zero_hour? + report_error t("application.setup_user_auth.blocked_zero_hour"), :forbidden + else + report_error t("application.setup_user_auth.blocked"), :forbidden + end end # if the user hasn't seen the contributor terms then don't diff --git a/app/controllers/trace_controller.rb b/app/controllers/trace_controller.rb index e41bd01f3..8d9b670c5 100644 --- a/app/controllers/trace_controller.rb +++ b/app/controllers/trace_controller.rb @@ -170,7 +170,7 @@ class TraceController < ApplicationController else @title = t "trace.edit.title", :name => @trace.name - if request.post? + if request.post? && params[:trace] @trace.description = params[:trace][:description] @trace.tagstring = params[:trace][:tagstring] @trace.visibility = params[:trace][:visibility] diff --git a/app/helpers/user_blocks_helper.rb b/app/helpers/user_blocks_helper.rb index 282d9164a..3c9c0a37e 100644 --- a/app/helpers/user_blocks_helper.rb +++ b/app/helpers/user_blocks_helper.rb @@ -4,8 +4,13 @@ module UserBlocksHelper # user block (i.e: whether it's active, what the expiry time is) def block_status(block) if block.active? + # if the block hasn't expired yet show the date, if the user just needs to login show that if block.needs_view? - I18n.t("user_block.helper.until_login") + if block.ends_at > Time.now.getutc + I18n.t("user_block.helper.time_future_and_until_login", :time => friendly_date(block.ends_at)).html_safe + else + I18n.t("user_block.helper.until_login") + end else I18n.t("user_block.helper.time_future", :time => friendly_date(block.ends_at)).html_safe end diff --git a/app/models/user_block.rb b/app/models/user_block.rb index de14dcaa9..eb0daba65 100644 --- a/app/models/user_block.rb +++ b/app/models/user_block.rb @@ -26,6 +26,13 @@ class UserBlock < ActiveRecord::Base needs_view || ends_at > Time.now.getutc end + ## + # returns true if the block is a "zero hour" block + def zero_hour? + # if the times differ more than 1 minute we probably have more important issues + needs_view && (ends_at.to_i - updated_at.to_i) < 60 + end + ## # revokes the block, allowing the user to use the API again. the argument # is the user object who is revoking the ban. diff --git a/app/views/layouts/map.html.erb b/app/views/layouts/map.html.erb index 6607bf7a5..3f11edf59 100644 --- a/app/views/layouts/map.html.erb +++ b/app/views/layouts/map.html.erb @@ -49,6 +49,12 @@

<%= t 'layouts.intro_header' %>

<%= t 'layouts.intro_text' %>

+

<%= t 'layouts.partners_html', + :ucl => link_to(t('layouts.partners_ucl'), "http://www.bartlett.ucl.ac.uk"), + :ic => link_to(t('layouts.partners_ic'), "http://www.imperial.ac.uk/"), + :bytemark => link_to(t('layouts.partners_bytemark'), "http://www.bytemark.co.uk"), + :partners => link_to(t('layouts.partners_partners'), "https://hardware.openstreetmap.org/thanks/") %> +

<%= t('layouts.learn_more') %> <%= t('layouts.start_mapping') %> diff --git a/app/views/notes/_note.rss.builder b/app/views/notes/_note.rss.builder index 038ca564b..38c42f1ec 100644 --- a/app/views/notes/_note.rss.builder +++ b/app/views/notes/_note.rss.builder @@ -15,7 +15,7 @@ xml.item do xml.dc :creator, note.author.display_name if note.author - xml.pubDate note.updated_at.to_s(:rfc822) + xml.pubDate note.created_at.to_s(:rfc822) xml.geo :lat, note.lat xml.geo :long, note.lon xml.georss :point, "#{note.lat} #{note.lon}" diff --git a/app/views/site/about.html.erb b/app/views/site/about.html.erb index 07b2f9e52..9847cf5aa 100644 --- a/app/views/site/about.html.erb +++ b/app/views/site/about.html.erb @@ -36,7 +36,7 @@ :ucl => link_to(t('layouts.partners_ucl'), "http://www.bartlett.ucl.ac.uk"), :ic => link_to(t('layouts.partners_ic'), "http://www.imperial.ac.uk/"), :bytemark => link_to(t('layouts.partners_bytemark'), "http://www.bytemark.co.uk"), - :partners => link_to(t('layouts.partners_partners'), t('layouts.partners_url')) %> + :partners => link_to(t('layouts.partners_partners'), "https://hardware.openstreetmap.org/thanks/") %>

diff --git a/config/locales/ast.yml b/config/locales/ast.yml index 671d4a77c..57ba6a2f3 100644 --- a/config/locales/ast.yml +++ b/config/locales/ast.yml @@ -1308,6 +1308,7 @@ ast: La nota ta cerca de %{place}.' details: Pue alcontrar más detalles sobro la nota en %{url}. changeset_comment_notification: + hi: Bones %{to_user}, greeting: Bones, commented: subject_own: '[OpenStreetMap] %{commenter} comentó unu de los tos conxuntos @@ -1321,6 +1322,8 @@ ast: partial_changeset_with_comment: col comentariu '%{changeset_comment}' partial_changeset_without_comment: ensin comentarios details: Puen alcontrase más detalles del conxuntu de cambios en %{url} + unsubscribe: Pa date de baxa de les actualizaciones d'esti conxuntu de cambeos, + visita %{url} y fai clic en «dase de baxa». message: inbox: title: Buzón @@ -1645,6 +1648,8 @@ ast: require_moderator: not_a_moderator: Has de ser moderador pa facer esa aición. setup_user_auth: + blocked_zero_hour: Tienes un mensaxe urxente nel sitiu web d'OpenStreetMap. + Tienes de lleer el mensaxe antes de que puedas guardar les ediciones. blocked: Se bloquió el to accesu a la API. Por favor, coneuta pela interfaz web pa saber más. need_to_see_terms: El to accesu a la API ta torgáu de mou temporal. Por favor, @@ -2189,6 +2194,8 @@ ast: helper: time_future: Fina en %{time}. until_login: Activu fasta que'l usuariu anicie sesión. + time_future_and_until_login: Acaba en %{time} y después de que l'usuariu anicie + sesión. time_past: Finó hai %{time}. blocks_on: title: Bloqueos fechos a %{name} @@ -2353,9 +2360,9 @@ ast: merge_right_without_exit: Xúnite a la drecha haza %{name} fork_right_without_exit: Nel biforcu xira a la drecha haza %{name} turn_right_without_exit: Xira a la drecha haza %{name} - sharp_right_without_exit: Fuerte a la drecha haza %{name} + sharp_right_without_exit: Zarrao a la drecha haza %{name} uturn_without_exit: Cambiu de sentíu en %{name} - sharp_left_without_exit: Fuerte a la izquierda haza %{name} + sharp_left_without_exit: Zarrao a la izquierda haza %{name} turn_left_without_exit: Xira a la izquierda haza %{name} offramp_left_without_exit: Cueye la rampla a la izquierda haza %{name} onramp_left_without_exit: Xira a la izquierda na rampla haza %{name} @@ -2389,6 +2396,13 @@ ast: nothing_found: Nun s'alcontraron entidaes error: 'Error al comunicase con %{server}: %{error}' timeout: Tiempu escosáu al comunicase con %{server} + context: + directions_from: Direiciones dende equí + directions_to: Direiciones ata equí + add_note: Añadir una nota equí + show_address: Amosar la direición + query_features: Consultar entidaes + centre_map: Centrar el mapa equí redaction: edit: description: Descripción diff --git a/config/locales/bg.yml b/config/locales/bg.yml index dfbd128bb..e38963bb4 100644 --- a/config/locales/bg.yml +++ b/config/locales/bg.yml @@ -22,6 +22,7 @@ bg: language: Език message: Съобщение node: Възел + notifier: Известител old_node: Стар възел relation: Релация relation_member: Член на релация @@ -155,6 +156,8 @@ bg: new_note: Нова бележка description: Описание open_by: Създадено от %{user} преди %{when} + query: + title: Търсене на особености changeset: changeset_paging_nav: showing_page: Страница %{page} @@ -402,6 +405,7 @@ bg: speed_camera: Камера за контрол на скоростта steps: Стълбище street_lamp: Улична лампа + track: Полски път trunk: Скоростен път trunk_link: Скоростен път unsurfaced: Път без настилка @@ -646,6 +650,7 @@ bg: log_in: Влизане log_in_tooltip: Вписване със съществуващ профил sign_up: Регистриране + start_mapping: Картографиране edit: Редактиране history: История export: Изнасяне @@ -676,6 +681,7 @@ bg: english_link: Оригиналът на английски native: title: За тази страница + mapping_link: картографиране legal_babble: title_html: Авторски права и лиценз infringement_title_html: Нарушаване на авторските права @@ -738,6 +744,7 @@ bg: note_comment_notification: greeting: Здравейте, changeset_comment_notification: + hi: Здравейте %{to_user}, greeting: Здравейте, message: inbox: @@ -793,6 +800,7 @@ bg: trunk: Междуградски път primary: Главен път secondary: Второстепенен път + track: Полски път bridleway: Конен път cycleway: Велосипедна пътека footway: Пътека @@ -902,6 +910,7 @@ bg: user: login: title: Вписване + heading: Вписване email or username: 'Електронна поща или потребителско име:' password: 'Парола:' remember: Запомни ме @@ -916,8 +925,11 @@ bg: title: Вписване с Фейсбук wikipedia: title: Вписване с Уикипедия + alt: Вписване със сметка от Уикипедия yahoo: title: Вписване с Яху + wordpress: + title: Вписване с Уърдпрес lost_password: email address: 'Електронна поща:' reset_password: @@ -926,8 +938,11 @@ bg: flash changed: Паролата е променена успешно. new: title: Регистриране + about: + header: Безплатна и достъпна за редактиране email address: 'Електронна поща:' confirm email address: 'Потвърждаване на електронната поща:' + display name: Видимо потребителско имеː password: 'Парола:' confirm password: 'Потвърждаване на паролата:' continue: Регистриране @@ -995,9 +1010,13 @@ bg: cancel: Отказ image: Изображение link: Препратка или код + long_link: Препратка + short_link: Кратка препратка + embed: Код custom_dimensions: Размер по избор format: 'Формат:' scale: 'Мащаб:' + image_size: На изображението ще бъде обичайната карта с размер download: Изтегляне include_marker: Добавяне на маркер key: @@ -1023,6 +1042,8 @@ bg: site: edit_tooltip: Редактиране на картата createnote_tooltip: Добавяне на бележка на картата + queryfeature_tooltip: Търсене на особености + queryfeature_disabled_tooltip: Увеличете, за да търсите особености notes: new: add: Добавяне на бележка @@ -1049,4 +1070,6 @@ bg: destination_without_exit: Пристигнахте на местоназначението unnamed: неименуван път time: Време + context: + add_note: Добавете бележка тук ... diff --git a/config/locales/bn.yml b/config/locales/bn.yml index d74d289a7..bb1b5ef27 100644 --- a/config/locales/bn.yml +++ b/config/locales/bn.yml @@ -1043,10 +1043,10 @@ bn: back: পিছনে to: প্রাপক sent_message_summary: - delete_button: মুছে ফেলুন + delete_button: অপসারণ mark: - as_read: বার্তা পঠিত হিসেবে চিহ্নিত - as_unread: বার্তা অপঠিত হিসেবে চিহ্নিত + as_read: বার্তা পঠিত হিসেবে চিহ্নিত করুন + as_unread: বার্তা অপঠিত হিসেবে চিহ্নিত করুন delete: deleted: বার্তা মোছা হয়েছে site: @@ -1072,7 +1072,7 @@ bn: key: table: entry: - motorway: মোটোরপথ + motorway: মোটরপথ main_road: প্রধান সড়ক trunk: মূল সড়ক primary: প্রাথমিক সড়ক @@ -1140,7 +1140,7 @@ bn: description: 'বিবরণ:' tags: 'ট্যাগসমূহ:' save_button: পরিবর্তন সংরক্ষণ - visibility: দৃষ্টিযোগ্যতা + visibility: 'দৃষ্টিযোগ্যতা:' visibility_help: এটার মানে কি? trace_form: upload_gpx: 'জিপিএক্স ফাইল আপলোড:' @@ -1177,7 +1177,7 @@ bn: edit_track: এই অনুসরণটি সম্পাদনা করুন delete_track: এই অনুসরণটি মুছে ফেলুন trace_not_found: অনুসরণ পাওযা যায়নি। - visibility: দৃষ্টিযোগ্যতা + visibility: 'দৃষ্টিযোগ্যতা:' trace_paging_nav: showing_page: '%{page} পাতা' trace: @@ -1220,8 +1220,8 @@ bn: remember: আমাকে মনে রাখো login_button: প্রবেশ register now: এখনই নিবন্ধন করুন - with username: 'ইতিমধ্যে একটি ওপেনস্ট্রিটম্যাপ অ্যাকাউন্ট আছে? দয়া করে ব্যবহারকারীনাম - এবং পাসওয়ার্ড দিয়ে প্রবেশ করুন:' + with username: 'ইতিমধ্যে একটি ওপেনস্ট্রিটম্যাপ অ্যাকাউন্ট আছে? দয়া করে ব্যবহারকারী + নাম এবং পাসওয়ার্ড দিয়ে প্রবেশ করুন:' new to osm: ওপেনস্ট্রিটম্যাপে নতুন? no account: কোনও অ্যাকাউন্ট নেই? auth_providers: @@ -1386,6 +1386,9 @@ bn: way: রাস্তা relation: সম্পর্ক nothing_found: বৈশিষ্ট্য খুঁজে পাওয়া যায়নি + context: + add_note: এখানে একটি টীকা যোগ করুন + show_address: ঠিকানা দেখান redaction: edit: description: বিবরণ diff --git a/config/locales/br.yml b/config/locales/br.yml index c1e9bf6cc..8e6d20e30 100644 --- a/config/locales/br.yml +++ b/config/locales/br.yml @@ -662,6 +662,7 @@ br: pitch: Tachenn sport playground: Tachenn c'hoari recreation_ground: Tachenn c'hoari + resort: Lec'h hañviñ sauna: Saona slipway: Kal sports_centre: Kreizenn sport @@ -1024,12 +1025,13 @@ br: more_1_html: Ma fell deoc'h kaout muioc'h a ditouroù diwar-benn adimplij hor roadennoù, lennit Licence OSMF Licence page hag ar gumuniezh reolennoù evit implijout an API, - reolennoù evit implijout ar gartenn - ha reolennoù evit implijout Nominatim. + more_2_html: "Daoust da OpenStreetMap bezañ un hollad roadennoù digor, n'omp + ket evit pourchas un API digoust evit an dredeourien.\n Sellit ouzh hor + reolennoù + evit implijout an API, \n Sellit ouzh hor reolennoù evit + implijout an teolennoù, ha\nreolennoù + evit implijout Nominatin" contributors_title_html: Hor c'henlabourerien contributors_intro_html: 'Miliadoù a hiniennoù a labour ganimp. Ebarzhiñ a reomp ivez roadennoù digor eus ajañsoù kartennañ hag eus mamennoù all, hag en o @@ -1085,6 +1087,10 @@ br: dizober, mar plij, pe skrivit war-eeun war hor furmskrid enlinenn. trademarks_title_html: Merkoù + trademarks_1_html: Openstreet, al logo brasaer ha State of the Map zo merkoù + marilhet gant OpenStreetMap Foundation. M'ho pez goulennoù da sevel diwar-benn + implij ar merkoù-se, kit e darempred gant Licence + Working Group, mar plij. welcome_page: title: Deuet-mat oc'h ! introduction_html: Degemer mat en OpenStreetMap, ar gartenn digoust eus ar bed @@ -1114,6 +1120,12 @@ br: un hent, evel anv ur preti pe an tizh bevennet war un hent. rules: title: Reolennoù ! + paragraph_1_html: OpenStreetMap en deus un nebeud reolennoù furmel, met gortoz + a reomp ma vo kemeret perzh gant an holl berzhidi ha ma vo darempredoù gant + ar gumuniezh. Ma vezit e-sell d'ober traoù all estreget ober cheñchamantoù + gant an dorn, lennit ha heuilhit ar sturiadoù, mar plij, e An + ezporzhiadurioù ha + Ar c'hemmoù emgefre>/a>. questions: title: Traoù da c'houlenn ? paragraph_1_html: Ezhomm ho peus sikour evit kartennaouiñ, pe n'eo ket sklaer @@ -1209,10 +1221,13 @@ br: legal_title: Lezennel legal_html: "Al lec'hienn-mañ hag e-leizh a servijoù all kar zo korvoet ent furmel gant an Diazezaddur OpenStreetMap - (OSMF) \nen anv ar gumuniezh.\n
\nKit contacter + (OSMF) \nen anv ar gumuniezh.\nEvit implijout an holl servijoù kinniget gant + an OSMF e ranker doujañ d'hor \n + Politikerezh war an implijoù degemeret ha d'hor Politikerzh + prevezded.\n
\nKit contacter l'OSMF e darempred gant an OSMF, mar plij, m'ho peus goulennoù da sevel diwar-benn an aotreoù-implijout, ar gwirioù oberour pe diwar-benn goulennoù - lezennel all." + lezennel all.\n
" partners_title: Kevelerien notifier: diary_comment_notification: @@ -1320,6 +1335,7 @@ br: hoc''h eus addispleget. Emañ an notenn tost da %{place}.' details: Munudoù ouzhpenn diwar-benn an notenn a c'hall bezañ kavet e %{url}. changeset_comment_notification: + hi: Demat %{to_user}, greeting: Demat, commented: subject_own: '[OpenStreetMap] %{commenter} en deus addispleget unan eus ho @@ -1334,6 +1350,8 @@ br: partial_changeset_with_comment: gant an addispleg '%{changeset_comment}' partial_changeset_without_comment: Hep evezhiadenn details: Muioc'h a ditouroù war an holl cheñchamantoù e %{url}. + unsubscribe: Evit digoumanantiñ diouzh hizivadurioù an holl gemmoù, gweladennit + %{url} ha klikit war « Digoumanantiñ ». message: inbox: title: Boest resev @@ -1468,6 +1486,7 @@ br: bridleway: Hent evit kezeg cycleway: Roudenn divrodegoù cycleway_national: roudenn vroadel evit an divrodegoù + cycleway_regional: Roudenn divrodegoù rannvroel cycleway_local: roudenn lec'hel evit an divrodegoù footway: Hent evit an dud war droad rail: Hent-houarn @@ -1522,6 +1541,7 @@ br: destination: Moned d'ar pal construction: Hentoù war ar stern bicycle_shop: Stal varc'hoù-houarn + bicycle_parking: Parklec'h belioù toilets: Privezioù richtext_area: edit: Aozañ @@ -1659,6 +1679,8 @@ br: require_moderator: not_a_moderator: Ret eo deoc'h bezañ habaskaer evit kas an ober-mañ da benn. setup_user_auth: + blocked_zero_hour: Ur gemennadenn vallus zo war lec'hienn OpenStreetMap evidoc'h. + Ret eo deoc'h lenn ar gemennadenn-se a-raok gallout enrollañ ho kemmoù. blocked: Stanket eo bet ho moned d'an API. Kevreit ouzh an etrefas web evit gouzout hiroc'h. need_to_see_terms: Evit ar mare n'oc'h ket aotreet da vont war an API ken. Kevreit @@ -1678,6 +1700,7 @@ br: allow_read_gpx: lenn ho roudoù GPS prevez. allow_write_gpx: kas roudoù GPS. allow_write_notes: kemmañ notennoù + grant_access: Grataat ar monet oauthorize_success: title: Reked aotre roet allowed: Aotreet ho peus an arload %{app_name} da vont d'ho kont. @@ -1762,6 +1785,7 @@ br: register now: En em enskrivañ bremañ with username: 'Ur gont OpenStreetMap hoc''h eus dija ? Digorit un dalc''h en ur verkañ hoc''h anv implijer hag ho ker-tremen :' + with external: 'Peotramant, implijit un tredeour evit kevreañ :' new to osm: Nevez war OpenStreetMap ? to make changes: Evit kemmañ roadennoù OpenStreetMap e rankit kaout ur gont. create account minute: Krouiñ ur gont. Ne bad nemet ur vunutenn. @@ -1840,15 +1864,20 @@ br: ar c'henlabourer. email address: 'Chomlec''h postel :' confirm email address: 'Kadarnaat ar chomlec''h postel :' - not displayed publicly: N'eo ket diskwelet d'an holl (gwelet hor c'harta - prevezded) + not displayed publicly: N'eo ket diskwelet ho chomlec'h d'an holl (gwelet hor c'harta prevezded) evit + gouzout hiroc'h display name: 'Anv diskwelet :' display name description: Emañ hoc'h anv implijer a-wel d'an holl. Se a c'hallit cheñch diwezhatoc'h en ho penndibaboù. external auth: 'Dilesadur trede :' password: 'Ger-tremen :' confirm password: 'Kadarnaat ar ger-tremen :' + use external auth: 'Peotramant, implijit un tredeour evit kevreañ :' + auth no password: Gant dilesadur un tredeour n'eus ket ezhomm d'ober gant ur + ger-tremen, met evit binvioù ouzhpenn pe evit ur servijer e c'haller bepred + goulenn unan diganeco'h. continue: En em enskrivañ terms accepted: Trugarez deoc'h evit bezañ asantet da ziferadennoù nevez ar c'henlabourer ! @@ -1996,6 +2025,8 @@ br: gravatar: Implijout Gravatar link: http://wiki.openstreetmap.org/wiki/Gravatar link text: petra eo se ? + disabled: Diweredekaet eo bet Gravatar. + enabled: Gweredekaet eo bet diskwel ho Kravatar. new image: Ouzhpennañ ur skeudenn keep image: Derc'hel ar skeudenn a-vremañ delete image: Dilemel ar skeudenn a-vremañ @@ -2091,6 +2122,9 @@ br: heading: N'eo ket kevredet ho ID ouzh ur gont OpenStreetMap. option_1: Ma'z oc'h un den nevez en OpenStreetMap, krouit ur gont nevez, mar plij, war-bouez ar furmskrid amañ dindan. + option_2: M'ho pez ur gont dija e c'hallit kevreañ outi en ur implijout hoc'h + anv implijer hag ho ker-tremen, ha goude-se kevrediñ ho kont gant hoc'h ID + en ho tibaboù implijer. user_role: filter: not_an_administrator: N'eus nemet ar verourien a c'hall merañ ar rolloù, ha @@ -2194,6 +2228,8 @@ br: helper: time_future: Echuiñ a ray a-benn %{time}. until_login: Oberiant betek ma kevre an implijer. + time_future_and_until_login: Echuiñ a ra a-benn %{time} hag ur wech kevreet + an implijer. time_past: Echuet %{time} zo. blocks_on: title: Stankadurioù evit %{name} @@ -2272,12 +2308,15 @@ br: center_marker: Kreizañ ar gartenn war ar merker paste_html: Pegañ HTML evit bezañ enkorfet en ul lec'hienn web view_larger_map: Gwelet ur gartenn vrasoc'h + only_standard_layer: Ar gwiskad standart hepken a c'hall bezañ ezporzhiet evel + ur skeudenn. embed: report_problem: Menegiñ ur gudenn key: title: Alc'hwez ar gartenn tooltip: Alc'hwez ar gartenn - tooltip_disabled: Alc'hwez kartenn da gaout evit ar gwiskad standart hepken + tooltip_disabled: Ne c'haller ket kaout an alc'hwez kartenn evit ar gwiskad + stantart map: zoom: in: Zoumañ @@ -2294,6 +2333,7 @@ br: header: Gwiskadoù kartenn notes: Notennoù kartenn data: Roadennoù ar gartenn + gps: Roudoù GPS foran overlays: Gweredekaat an adwiskadoù evit dresañ ar gartenn title: Gwiskadoù copyright: © Kenlabourerien OpenStreetMap @@ -2351,11 +2391,21 @@ br: instructions: continue_without_exit: Kenderc'hel war%{name} slight_right_without_exit: Troit un tammig a-zehoù war %{name} + offramp_right_without_exit: Kemer ar vretell dehoù %{name} + onramp_right_without_exit: Troit a-zehoù war ar bretell war %{name} + endofroad_right_without_exit: E penn an hent, troit a-zezhoù war %{name} + merge_right_without_exit: Mont a-zehoù war %{name} + fork_right_without_exit: Er forc'h-hent, troit a-zehoù war %{name} turn_right_without_exit: Treiñ a-zehoù war %{name} sharp_right_without_exit: Troit prim a-zehoù war %{name} uturn_without_exit: Grit hanter dro war %{name} sharp_left_without_exit: Troit prim a-gleiz war %{name} turn_left_without_exit: Treiñ a-gleiz war %{name} + offramp_left_without_exit: Kemer ar vretell gleiz betek %{name} + onramp_left_without_exit: Troit a-gleiz war ar vretell war %{name} + endofroad_left_without_exit: E penn an hent, troit a-gleiz war %{name} + merge_left_without_exit: Mont a-gleiz war %{name} + fork_left_without_exit: Er forc'h-hent, troit a-gleiz war %{name} slight_left_without_exit: Troit un tammig a-gleiz war %{name} via_point_without_exit: (dre ar poent) follow_without_exit: Heuliañ %{name} @@ -2367,6 +2417,11 @@ br: against_oneway_without_exit: Mont gant ar straed untu war %{name} end_oneway_without_exit: Dibenn an tremen untun war %{name} roundabout_with_exit: Er c'hroashent-tro, kemer an hent-maez %{exit} war %{name} + turn_left_with_exit: Er c'hroashent-tro, troit a-gleiz war %{name} + slight_left_with_exit: Er c'hroashent, treiñ un tamm a-gleiz war %{name} + turn_right_with_exit: Er c'hroashent-tro, treiñ a-zehoù war %{name} + slight_right_with_exit: Er c'hroashent-tro, treiñ un tamm a-zehoù war %{name} + continue_with_exit: Er c'hroashent-tro, kenderc'hel war-eeun war %{name} unnamed: hep anv courtesy: Hent a-berzh %{link} time: Eur @@ -2377,6 +2432,13 @@ br: nothing_found: Arc'hweladur ebet kavet error: Fazi o vont e daremmpred gant %{server}:%{error} timeout: Amzer aet e-biou %{server} + context: + directions_from: Durc'hadurioù adalek amañ + directions_to: Durc'hadurioù betek amañ + add_note: Ouzhpennañ un notenn amañ + show_address: Diskouez ar chomlec'h + query_features: Perzhioù enklask + centre_map: Kreizañ ar gartenn amañ redaction: edit: description: Deskrivadur diff --git a/config/locales/ca.yml b/config/locales/ca.yml index f9e647fa6..315993ee5 100644 --- a/config/locales/ca.yml +++ b/config/locales/ca.yml @@ -19,6 +19,7 @@ # Author: Micru # Author: Mlforcada # Author: Nemo bis +# Author: Netol # Author: PerroVerd # Author: Pitort # Author: Ruila @@ -1399,7 +1400,7 @@ ca: reply_button: Respon delete_button: Suprimeix new: - title: Envia el missatge + title: Envia un missatge send_message_to: Envia un missatge nou per a %{name} subject: Assumpte body: Cos @@ -1947,7 +1948,7 @@ ca: oauth settings: configuració OAuth blocks on me: Blocs sobre mi blocks by me: Blocs fets per mi - send message: Envia el missatge + send message: Envia un missatge diary: Diari edits: Modificacions traces: Traces diff --git a/config/locales/cs.yml b/config/locales/cs.yml index ca65c0af2..803b68729 100644 --- a/config/locales/cs.yml +++ b/config/locales/cs.yml @@ -24,6 +24,7 @@ # Author: Nemo bis # Author: Paxt # Author: Reaperman +# Author: StenSoft # Author: Tchoř # Author: Urbanecm # Author: Veritaslibero @@ -790,7 +791,7 @@ cs: abandoned: Zrušená železniční trať construction: Železnice ve výstavbě disused: Nepoužívaná železniční trať - disused_station: Nepoužívaná železniční stanice + disused_station: Zrušená železniční stanice funicular: Lanová dráha halt: Železniční zastávka historic_station: Nádraží historické železnice @@ -936,7 +937,7 @@ cs: level6: Hranice okresu level8: Hranice obce level9: Hranice vesnice - level10: Hranice čtvrti + level10: Hranice městské části description: title: osm_nominatim: Poloha podle OpenStreetMap @@ -979,7 +980,6 @@ cs: partners_ic: Imperial College London partners_bytemark: Bytemark Hosting partners_partners: partneři - partners_url: http://wiki.openstreetmap.org/wiki/Partners?uselang=cs osm_offline: Databáze OpenStreetMap je momentálně kvůli probíhající neodkladné údržbě mimo provoz. osm_read_only: Databáze OpenStreetMap je momentálně kvůli probíhající neodkladné @@ -1326,6 +1326,7 @@ cs: Poznámka je umístěna poblíž %{place}.' details: Podrobnosti k poznámce můžete najít na %{url}. changeset_comment_notification: + hi: Dobrý den, uživateli %{to_user}, greeting: Ahoj, commented: subject_own: '[OpenStreetMap] %{commenter} okomentoval jednu z vašich sad @@ -1339,6 +1340,8 @@ cs: partial_changeset_with_comment: s komentářem „%{changeset_comment}“ partial_changeset_without_comment: bez komentáře details: Více informací o této sadě změn lze nalézt na %{url}. + unsubscribe: Pro odhlášení z aktualizací této sady změn jděte na %{url} a klikněte + na „Zrušit odebírání“. message: inbox: title: Doručená pošta @@ -2409,6 +2412,8 @@ cs: nothing_found: Žádné nalezené objekty error: 'Chyba při připojování k %{server}: %{error}' timeout: Vypršel čas při připojování k %{server} + context: + show_address: Zobrazit adresu redaction: edit: description: Popis diff --git a/config/locales/da.yml b/config/locales/da.yml index 7fc38de1f..d1adc7cd0 100644 --- a/config/locales/da.yml +++ b/config/locales/da.yml @@ -452,7 +452,7 @@ da: cinema: Biograf clinic: Klinik clock: Ur - college: Videregående uddanelsesinstitution + college: Videregående uddannelsesinstitution community_centre: Forsamlingshus / lokalcenter courthouse: Retsbygning crematorium: Krematorium diff --git a/config/locales/de.yml b/config/locales/de.yml index 7b5976c61..82fed433d 100644 --- a/config/locales/de.yml +++ b/config/locales/de.yml @@ -1002,7 +1002,6 @@ de: partners_ic: dem Imperial College London partners_bytemark: Bytemark Hosting partners_partners: Partnern - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: Die OpenStreetMap-Datenbank ist im Moment wegen wichtiger Wartungsarbeiten nicht verfügbar. osm_read_only: Die OpenStreetMap-Datenbank ist im Moment wegen wichtiger Wartungsarbeiten @@ -1745,6 +1744,8 @@ de: require_moderator: not_a_moderator: Du musst Moderator sein, um diese Aktion durchführen zu können. setup_user_auth: + blocked_zero_hour: Du hast eine dringende Nachricht auf der OpenStreetMap-Website. + Du musst sie zuerst lesen, bevor du deine Bearbeitungen speichern kannst. blocked: Dein Zugriff auf die API wurde gesperrt. Bitte melde dich auf der Web-Oberfläche an, um mehr zu erfahren. need_to_see_terms: Dein Zugriff auf die API wurde vorübergehend ausgesetzt. @@ -2305,6 +2306,8 @@ de: helper: time_future: Endet in %{time}. until_login: Aktiv, bis der Benutzer sich anmeldet. + time_future_and_until_login: Endet in %{time} und nachdem sich der Benutzer + angemeldet hat. time_past: Endete vor %{time} blocks_on: title: Sperren für %{name} @@ -2507,6 +2510,13 @@ de: nothing_found: Keine Objekte gefunden error: 'Fehler beim Kontaktieren von %{server}: %{error}' timeout: Zeitüberschreitung beim Kontaktieren von %{server} + context: + directions_from: Route von hier + directions_to: Route nach hier + add_note: Einen Kartenfehler hier einfügen + show_address: Adresse anzeigen + query_features: Abfrage-Funktionen + centre_map: Karte hier zentrieren redaction: edit: description: Beschreibung diff --git a/config/locales/diq.yml b/config/locales/diq.yml index 69b7a28b4..16173e1b9 100644 --- a/config/locales/diq.yml +++ b/config/locales/diq.yml @@ -920,7 +920,7 @@ diq: edits: Vurnayışi traces: Rêçi remove as friend: Embazan ra vec - add as friend: Embaz bı + add as friend: Embazi cı ke mapper since: 'Demê herdnigarwaniye:' ago: (%{time_in_words_ago} veror) ct undecided: Darıdeyo diff --git a/config/locales/el.yml b/config/locales/el.yml index b7b89dcc8..221ddff60 100644 --- a/config/locales/el.yml +++ b/config/locales/el.yml @@ -21,6 +21,7 @@ # Author: Stam.nikos # Author: SucreRouge # Author: Zserdx +# Author: Ανώνυμος Βικιπαιδιστής # Author: 아라 --- el: @@ -992,7 +993,6 @@ el: partners_ic: Imperial College του Λονδίνου partners_bytemark: Bytemark Hosting partners_partners: συνεργάτες - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: Η βάση δεδομένων του OpenStreetMap είναι προσωρινά εκτός λειτουργίας λόγω εργασιών συντήρησης της βάσης δεδομένων. osm_read_only: Η βάση δεδομένων του OpenStreetMap έχει τεθεί προσωρινά σε λειτουργία @@ -1372,6 +1372,7 @@ el: details: Περισσότερες λεπτομέρειες σχετικά με τη σημείωση μπορούν να βρεθούν στο %{url}. changeset_comment_notification: + hi: Γεια σας, %{to_user}, greeting: Γεια, commented: subject_own: '[OpenStreetMap] {{GENDER:%{commenter}|Ο|Η}} %{commenter} σχολίασε @@ -1387,6 +1388,8 @@ el: partial_changeset_without_comment: χωρίς σχόλιο details: Περισσότερες λεπτομέρειες για την ομάδα αλλαγών μπορούν να βρεθούν στο %{url}. + unsubscribe: Για να διαγραφείτε από τις ενημερώσεις αυτής της ομάδας αλλαγών, + επισκεφθείτε το %{url} και πατήστε "Διαγραφή". message: inbox: title: Εισερχόμενα @@ -1713,8 +1716,14 @@ el: not_a_moderator: Θα πρέπει να είστε συντονιστής για να εκτελέσετε αυτήν την ενέργεια. setup_user_auth: + blocked_zero_hour: Έχετε ένα επείγον μήνυμα στον ιστότοπο του OpenStreetMap. + Θα πρέπει να διαβάσετε το μήνυμα πριν να μπορείτε να αποθηκεύσετε τις αλλαγές + σας. blocked: Η πρόσβασή σας στο API έχει αποκλειστεί. Παρακαλώ συνδεθείτε με τη διεπαφή του ιστότοπου για να μάθετε περισσότερα. + need_to_see_terms: Η πρόσβασή σας στο API έχει ανασταλεί προσωρινά. Παρακαλούμε + συνδεθείτε στην ηλεκτρονική διεπαφή για να δείτε τους Όρους Συνεισφερόντων. + Δεν χρειάζεται να συμφωνήσετε, αλλά θα πρέπει να τους δείτε. oauth: oauthorize: title: Επιτρέψτε την πρόσβαση στο λογαριασμό σας @@ -2443,6 +2452,13 @@ el: nothing_found: Δεν βρέθηκαν χαρακτηριστικά error: 'Σφάλμα επικοινωνίας με τον %{server}: %{error}' timeout: Έληξε το χρονικό όριο επικοινωνίας με %{server} + context: + directions_from: Οδηγίες από εδώ + directions_to: Οδηγίες προς τα εδώ + add_note: Προσθέστε μια σημείωση εδώ + show_address: Εμφάνιση διεύθυνσης + query_features: Πληροφορίες χαρακτηριστικών + centre_map: Κεντράρισμα χάρτη εδώ redaction: edit: description: Περιγραφή diff --git a/config/locales/en-GB.yml b/config/locales/en-GB.yml index 4b0ccd15e..c3eca7447 100644 --- a/config/locales/en-GB.yml +++ b/config/locales/en-GB.yml @@ -973,7 +973,6 @@ en-GB: partners_ic: Imperial College London partners_bytemark: Bytemark Hosting partners_partners: partners - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: The OpenStreetMap database is currently offline while essential database maintenance work is carried out. osm_read_only: The OpenStreetMap database is currently in read-only mode while diff --git a/config/locales/en.yml b/config/locales/en.yml index 2414fcd1f..3afa7e805 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -933,12 +933,11 @@ en: intro_header: Welcome to OpenStreetMap! intro_text: OpenStreetMap is a map of the world, created by people like you and free to use under an open license. intro_2_create_account: "Create a user account" - partners_html: "Hosting is supported by %{ucl}, %{ic} and %{bytemark}, and other %{partners}." + partners_html: "Hosting is supported by %{ucl}, %{bytemark} and %{ic}, and other %{partners}." partners_ucl: "the UCL VR Centre" partners_ic: "Imperial College London" partners_bytemark: "Bytemark Hosting" partners_partners: "partners" - partners_url: "http://wiki.openstreetmap.org/wiki/Partners" osm_offline: "The OpenStreetMap database is currently offline while essential database maintenance work is carried out." osm_read_only: "The OpenStreetMap database is currently in read-only mode while essential database maintenance work is carried out." donate: "Support OpenStreetMap by %{link} to the Hardware Upgrade Fund." @@ -1626,6 +1625,7 @@ en: require_moderator: not_a_moderator: "You need to be a moderator to perform that action." setup_user_auth: + blocked_zero_hour: "You have an urgent message on the OpenStreetMap web site. You need to read the message before you will be able to save your edits." blocked: "Your access to the API has been blocked. Please log-in to the web interface to find out more." need_to_see_terms: "Your access to the API is temporarily suspended. Please log-in to the web interface to view the Contributor Terms. You do not need to agree, but you must view them." oauth: @@ -2112,6 +2112,7 @@ en: helper: time_future: "Ends in %{time}." until_login: "Active until the user logs in." + time_future_and_until_login: "Ends in %{time} and after the user has logged in." time_past: "Ended %{time} ago." blocks_on: title: "Blocks on %{name}" @@ -2305,6 +2306,13 @@ en: nothing_found: No features found error: "Error contacting %{server}: %{error}" timeout: "Timeout contacting %{server}" + context: + directions_from: Directions from here + directions_to: Directions to here + add_note: Add a note here + show_address: Show address + query_features: Query features + centre_map: Centre map here redaction: edit: description: "Description" diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 62034ca63..fda175ac0 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -1022,7 +1022,7 @@ eo: attribution_example: alt: Ekzemplo kiel atribui OpenStreetMap sur retpaĝo title: Ekzemplo de aŭtorec-atribuado - more_title_html: Sciigi pli + more_title_html: Sciiĝi pli more_1_html: |- Legu pli pri uzado de niaj datumoj kaj kiel atribui aŭtorecon je la retpaĝo de OSMF permesilo kaj je la elŝuti Flash Player el Adobe.com retpaĝo. Kelkaj @@ -1648,8 +1648,10 @@ eo: require_moderator: not_a_moderator: Vi devas esti kontrolanto por fari ĉi tiun agon. setup_user_auth: + blocked_zero_hour: Vi havas urĝan mesaĝon en la OpenStreetMap retejo. Vi devas + legi la mesaĝon antaŭ ol vi povos konservi viajn redaktojn. blocked: Via aliro al API estas blokita. Bonvolu ensaluti al reta interfaco - por sciigi pli. + por sciiĝi pli. need_to_see_terms: Via aliro al API estas dumtempe provizore haltigita. Bonvolu ensaluti al reta fasado por legi interkonsenton pri kontribuado. Vi ne devas akcepti ĝin, sed vi devas legi ĝin. @@ -1967,7 +1969,7 @@ eo: text: Nuntempe viaj redaktoj estas anonimaj kaj aliuloj ne povas sendi mesaĝojn al vi kaj vidi vian lokon. Por montri kion vi redaktis kaj ebligi al aliuloj kontakti vin per la retejo, alklaku la butonon sube. Ekde la versio 0.6 - de API, nur publikaj uzantoj povas redakti map-datumojn. (sciigi + de API, nur publikaj uzantoj povas redakti map-datumojn. (sciiĝi kial). contributor terms: @@ -2180,6 +2182,7 @@ eo: helper: time_future: Finiĝos %{time}. until_login: Aktiva ĝis la uzanto ensalutos. + time_future_and_until_login: Finiĝos dum %{time} kaj post la uzanto ensalutos. time_past: Finiĝis antaŭ %{time} blocks_on: title: Blokadoj por %{name} @@ -2379,6 +2382,13 @@ eo: nothing_found: Neniuj objektoj trovitaj error: 'Eraro dum komunikado kun %{server}: %{error}' timeout: Atingis tempolimon dum kontakto kun %{server} + context: + directions_from: Direktoj el ĉi tie + directions_to: Direktoj al ĉi tie + add_note: Aldoni rimarkon ĉi tien + show_address: Montri adreson + query_features: Informoj pri objektoj + centre_map: Centrigi mapon ĉi tien redaction: edit: description: Priskribo diff --git a/config/locales/es.yml b/config/locales/es.yml index 2a982c93b..672756395 100644 --- a/config/locales/es.yml +++ b/config/locales/es.yml @@ -7,6 +7,7 @@ # Author: Carlosz22 # Author: Crazymadlover # Author: Csbotero +# Author: Dgstranz # Author: Egofer # Author: Fitoschido # Author: Fortega @@ -988,7 +989,6 @@ es: partners_ic: Imperial College de Londres partners_bytemark: Bytemark Hosting partners_partners: socios - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: La base de datos de OpenStreetMap no está disponible en estos momentos debido a trabajos de mantenimiento. osm_read_only: La base de datos de OpenStreetMap se encuentra en modo de sólo @@ -1697,6 +1697,8 @@ es: require_moderator: not_a_moderator: Tienes que ser un moderador para ejecutar esa acción. setup_user_auth: + blocked_zero_hour: Tienes un mensaje urgente en el sitio web de OpenStreetMap. + Debes leer el mensaje antes de que puedas guardar tus ediciones. blocked: Su acceso a la API ha sido bloqueado. Por favor, inicie sesión en la interfaz web para obtener más información. need_to_see_terms: Su acceso a la API está temporalmente suspendido. Por favor, @@ -2453,6 +2455,12 @@ es: nothing_found: No se encontraron características error: 'Error al contactar a %{server}: %{error}' timeout: Tiempo de espera agotado al contactar a %{server} + context: + directions_from: Indicaciones desde aquí + directions_to: Indicaciones hasta aquí + add_note: Añadir una nota aquí + show_address: Mostrar dirección + centre_map: Centrar el mapa aquí redaction: edit: description: Descripción diff --git a/config/locales/fa.yml b/config/locales/fa.yml index 9ba591beb..29852f3fc 100644 --- a/config/locales/fa.yml +++ b/config/locales/fa.yml @@ -2,6 +2,7 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Alirezaaa +# Author: Arash.pt # Author: Armin1392 # Author: BMRG14 # Author: Baqeri @@ -2385,6 +2386,8 @@ fa: nothing_found: ویژگی‌ای یافت نشد error: 'خطار در ارتباط %{server}: %{error}' timeout: اتمام زمان %{server} + context: + show_address: نمایش آدرس redaction: edit: description: شرح diff --git a/config/locales/fi.yml b/config/locales/fi.yml index d2a4e5912..c2e072a21 100644 --- a/config/locales/fi.yml +++ b/config/locales/fi.yml @@ -280,6 +280,7 @@ fi: kauan. rss: title_all: Keskustelu OpenStreetMapin muutoskokoelmasta + title_particular: 'OpenStreetMap muutoskokoelma #%{changeset_id} keskustelu' comment: 'Käyttäjä %{author} kommentoi muutoskokoelmaa #%{changeset_id}' commented_at_html: Päivitetty %{when} sitten commented_at_by_html: '%{user} päivittänyt %{when} sitten' @@ -1196,6 +1197,8 @@ fi: aiheita koskevilla tai alueellisilla sähköpostilistoilla. forums: title: Keskustelupalsta + description: Kysymykset ja keskustelut niille, jotka haluavat mielummin ilmoitustaulutyylisen + käyttöliittymän. irc: title: IRC description: Interaktiivinen chat monilla eri kielillä ja monista eri aiheista. @@ -1337,8 +1340,16 @@ fi: hi: Hei %{to_user}, greeting: Hei, commented: + subject_own: '[OpenStreetMap] %{commenter} on kommentoinut yhtä muutoskokoelmaasi' + subject_other: '[OpenStreetMap] %{commenter} on kommentoinut muutoskokoelmaa + josta olet kiinnostunut' + your_changeset: '%{commenter} on jättänyt kommentin yhteen muutoskokoelmistasi + joka on luotu %{time}' + partial_changeset_with_comment: kommentin kanssa '%{changeset_comment}' partial_changeset_without_comment: ei kommenttia details: 'Lisätietoja muutoskokoelmasta: %{url}' + unsubscribe: Peruaksesi tilauksen päivityksistä tähän muutoskokoelmaan, vieraile + sivulla %{url} ja klikkaa "Unsubscribe". message: inbox: title: Saapuneet @@ -2000,6 +2011,7 @@ fi: gravatar: Käytä Gravataria link text: mikä tämä on? disabled: Gravatar on poistettu käytöstä. + enabled: Gravatarisi näyttäminen on otettu käyttöön. new image: Lisää kuva keep image: Säilytä nykyinen kuva delete image: Poista nykyinen kuva @@ -2258,6 +2270,7 @@ fi: link: Linkki tai HTML-koodi long_link: Linkki short_link: Lyhyt linkki + geo_uri: Geo URI embed: HTML-koodi custom_dimensions: Rajaa alue itse format: 'Tiedostomuoto:' diff --git a/config/locales/fr.yml b/config/locales/fr.yml index c088db13f..50054c3a8 100644 --- a/config/locales/fr.yml +++ b/config/locales/fr.yml @@ -1011,7 +1011,6 @@ fr: partners_ic: le Collège impérial de Londres partners_bytemark: Hébergement Bytemark partners_partners: partenaires - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: La base de données OpenStreetMap est actuellement hors ligne ; une maintenance essentielle à son bon fonctionnement est en cours. osm_read_only: La base de données OpenStreetMap est actuellement en mode lecture @@ -1732,6 +1731,8 @@ fr: require_moderator: not_a_moderator: Vous devez être modérateur pour effectuer cette action. setup_user_auth: + blocked_zero_hour: Vous avez un message urgent sur le site web OpenStreetMap. + Vous devez lire le message avant de pouvoir enregistrer vos modifications. blocked: Votre accès à l’API a été bloqué. Connectez-vous sur l’interface web pour plus d’informations. need_to_see_terms: Votre accès à l’API est temporairement suspendu. Veuillez @@ -2294,6 +2295,8 @@ fr: helper: time_future: Prends fin dans %{time}. until_login: Actif jusqu’à ce que l’utilisateur se connecte. + time_future_and_until_login: Finit dans %{time} et une fois que l’utilisateur + s’est connecté. time_past: Terminé il y a %{time}. blocks_on: title: Blocages de « %{name} » @@ -2494,6 +2497,13 @@ fr: nothing_found: Aucun objet trouvé error: 'Erreur en contactant %{server} : %{error}' timeout: Délai dépassé en contactant %{server} + context: + directions_from: Directions depuis ici + directions_to: Directions vers ici + add_note: Ajouter une note ici + show_address: Afficher l’adresse + query_features: Requêter sur les fonctionnalités + centre_map: Centrer la carte ici redaction: edit: description: Description diff --git a/config/locales/gd.yml b/config/locales/gd.yml index 261bee3eb..4b25790c2 100644 --- a/config/locales/gd.yml +++ b/config/locales/gd.yml @@ -168,6 +168,7 @@ gd: way: an t-slighe relation: an dàimh changeset: seata atharraichean + note: an aire timeout: sorry: Duilich ach thug e ro fhada an dàta airson %{type} air a bheil an id %{id} fhaighinn. @@ -176,6 +177,7 @@ gd: way: an t-slighe relation: an dàimh changeset: seata atharraichean + note: an aire redacted: redaction: Ath-sgrùdadh %{id} message_html: Chan urrainn dhuinn an tionndadh %{version} %{type} a shealltainn @@ -269,6 +271,7 @@ gd: diary_entry: new: title: Clàr ùr an leabhair-latha + publish_button: Foillsich list: title: Leabhraichean-latha title_friends: Leabhraichean-latha do charaidean @@ -974,7 +977,6 @@ gd: partners_ic: Imperial College London partners_bytemark: Bytemark Hosting partners_partners: com-pàirtichean eile - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: Tha an stòr-dàta aig OpenStreetMap far loidhńe an-dràsta on a tha sinn a' dèanamh obair-charaidh riatanach air. osm_read_only: Tha an stòr-dàta aig OpenStreetMap sa mhodh leughaidh a-mhàin an-dràsta @@ -1144,6 +1146,8 @@ gd: loch no togalach.' tag_html: '''S e beagan dàta mu nòd no slighe a tha ann an taga, can ainm taighe-bhìdh no crìoch astair rathaid.' + rules: + title: Riaghailtean! questions: title: A bheil ceist sam bith agad? paragraph_1_html: |- @@ -1191,11 +1195,19 @@ gd: title: Fàilte gu OSM description: Faigh toiseach tòiseachaidh air OpenStreetMap leis an stiùireadh luath seo. + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide + title: Treòir an luchd-tòiseachaidh + description: Treòir leis a’ choimhearsnachd do luchd-tòiseachaidh help: url: https://help.openstreetmap.org/ title: help.openstreetmap.org description: Faighnich ceist no rùraich na freagairtean air làrach nan ceistean àbhaisteach aig OSM. + mailing_lists: + title: Liostaichean-puist + switch2osm: + title: switch2osm wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1222,13 +1234,14 @@ gd: open_data_html: |- 'S e dàta fosgailte a tha san OpenStreetMap: faodaidh tu a chleachdadh a chum adhbhair sam bith cho fad 's a bheir thu urram air OpenStreetMap agus na co-thabhartaichean aige. Ma nì thu atharrachadh air an dàta againn no ma thogas tu rudeigin eile leis, faodaidh tu an toradh a sgaoileadh fon aon cheadachas. Thoir sùil air Duilleag na còrach-lethbhreac agus a' cheadachais airson barrachd fiosrachaidh. + legal_title: Nòtaichean laghail partners_title: Com-pàirtichean notifier: diary_comment_notification: - subject: '[OpenStreetMap] Thug %{user} beachd air an leabhar-latha agad' + subject: '[OpenStreetMap] Thug %{user} seachad beachd air leabhar-latha' hi: Shin thu, %{to_user}, - header: 'Thug %{from_user} beachd air clàr leabhar-latha OpenStreetMap agad - a rinn thu o chionn goirid air a bheil an cuspair "%{subject}":' + header: 'Thug %{from_user} seachad beachd air innteart leabhar-latha OpenStreetMap + a rinn thu o chionn goirid air a bheil an cuspair “%{subject}”:' footer: '''S urrainn dhut am beachd a leughadh air %{readurl} cuideachd agus beachd agad fhèin a chur ris air %{commenturl} no freagairt a sgrìobhadh air %{replyurl}' @@ -1333,6 +1346,7 @@ gd: a thug thu beachd air. Tha an nòta faisg air %{place}.' details: Gheibh thu barrachd fiosrachaidh air an nòta air %{url}. changeset_comment_notification: + hi: Shin thu, %{to_user}, greeting: Shin thu, commented: subject_own: '[OpenStreetMap] Thug %{commenter} beachd air seata atharraichean @@ -1471,6 +1485,7 @@ gd: table: entry: motorway: Mòr-rathad + main_road: Prìomh-rathad trunk: Prìomh-rathad primary: Prìomh-rathad secondary: Rathad dàrnach @@ -1478,6 +1493,9 @@ gd: track: Slighe bridleway: Ceum marcachd cycleway: Slighe baidhseagail + cycleway_national: Slighe baidhseagail nàiseanta + cycleway_regional: Slighe baidhseagail roinneil + cycleway_local: Slighe baidhseagail ionadail footway: Àrainn-choisichean rail: Rèile subway: Meatro @@ -1530,6 +1548,9 @@ gd: private: Cead-inntrigidh prìobhaideach destination: Inntrigeadh a' chinn-uidhe construction: Rathaidean 'gan togail + bicycle_shop: Bùth bhaidhseagalan + bicycle_parking: Pàirceadh bhaidhseagalan + toilets: Taighean-beaga richtext_area: edit: Deasaich preview: Ro-sheall @@ -1665,7 +1686,10 @@ gd: title: Lorgaidhean GPS aig OpenStreetMap description: description_with_count: - other: faidhle GPX le %{count} phuing o %{user} + one: faidhle GPX le %{count} phuing o %{user} + two: faidhle GPX le %{count} phuing o %{user} + few: faidhle GPX le %{count} puingean o %{user} + other: faidhle GPX le %{count} puing o %{user} description_without_count: Faidhle GPX o %{user} application: require_cookies: @@ -1696,6 +1720,7 @@ gd: allow_read_gpx: na lorgaidhean GPS prìobhaideach agad a leughadh. allow_write_gpx: lorgaidhean GPS a luchdadh suas. allow_write_notes: nòtaichean atharrachadh. + grant_access: Thoir inntrigeadh oauthorize_success: title: Chaidh gabhail ri iarrtas a' chead allowed: Thug thu cead dha dh'aplacaid %{app_name} an cunntas agad inntrigeadh. @@ -1805,6 +1830,18 @@ gd: google: title: Clàraich a-steach le Google alt: Clàraich a-steach le OpenID Google + facebook: + title: Clàraich a-steach le Facebook + alt: Clàraich a-steach le cunntas Facebook + windowslive: + title: Clàraich a-steach le Windows Live + alt: Clàraich a-steach le cunntas Windows Live + github: + title: Clàraich a-steach le GitHub + alt: Clàraich a-steach le cunntas GitHub + wikipedia: + title: Clàraich a-steach leis an Uicipeid + alt: Clàraich a-steach le cunntas na h-Uicipeid yahoo: title: Clàraich a-steach le Yahoo alt: Clàraich a-steach le OpenID Yahoo @@ -1856,10 +1893,10 @@ gd: a' chom-pàirtiche. email address: 'Seòladh puist-d:' confirm email address: 'Dearbhaich an seòladh puist-d:' - not displayed publicly: Cha dèid a shealltainn gu poblach (thoir sùil air poileasaidh - na prìobhaideachd) + not displayed publicly: Cha dèid do sheòladh shealltainn gu poblach, thoir sùil + air poileasaidh + na prìobhaideachd airson barrachd fiosrachaidh display name: 'Ainm seallaidh:' display name description: An t-ainm-cleachdaiche agad a thèid a shealltainn gu poblach. 'S urrainn dhut seo atharrachadh uair sam bith sna roghainnean. @@ -1905,6 +1942,7 @@ gd: body: Duilich ach chan eil cleachdaiche ann air a bheil %{user}. Dearbhaich an litreachadh no 's dòcha nach eil an ceangal air an do rinn thu briogadh mar bu chòir. + deleted: air a sguabadh às view: my diary: An leabhar-latha agam new diary entry: clàr leabhair-latha ùr @@ -2305,8 +2343,7 @@ gd: key: title: Iuchair a' mhapa tooltip: Iuchair a' mhapa - tooltip_disabled: Chan eil iuchair a' mhapa ri fhaighinn ach airson na breatha - stannardaich + tooltip_disabled: Chan eil iuchair a’ mhapa ri fhaighinn airson na breath seo map: zoom: in: Sùm a-steach diff --git a/config/locales/he.yml b/config/locales/he.yml index cdf75890c..7628d710c 100644 --- a/config/locales/he.yml +++ b/config/locales/he.yml @@ -963,7 +963,6 @@ he: partners_ic: המכללה המלכותית של לונדון partners_bytemark: אירוח בייטמארק partners_partners: שותפים - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: מסד הנתונים של אתר OpenStreetMap אינו מקוון כעת בשל עבודות תחזוקה המבוצעות בו. osm_read_only: מסד הנתונים של אתר OpenStreetMap נתון כעת במצב קריאה בלבד בשל עבודות diff --git a/config/locales/hsb.yml b/config/locales/hsb.yml index 204819de0..4fd0ed828 100644 --- a/config/locales/hsb.yml +++ b/config/locales/hsb.yml @@ -954,7 +954,6 @@ hsb: partners_ic: Imperial College London partners_bytemark: Bytemark Hosting partners_partners: partnerow - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: Datowa banka OpenStreetMap je tuchwilu offline, dokelž so wažne wobhladowankse dźěła na datowej bance přewjedu. osm_read_only: Datowa banka OpenStreetMap je tuchwilu jenož čitajomna, dokelž diff --git a/config/locales/ia.yml b/config/locales/ia.yml index eebb71d02..644532690 100644 --- a/config/locales/ia.yml +++ b/config/locales/ia.yml @@ -956,7 +956,6 @@ ia: partners_ic: Imperial College London partners_bytemark: Bytemark Hosting partners_partners: partners - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: Le base de datos de OpenStreetMap non es disponibile al momento debite a operationes de mantenentia essential. osm_read_only: Le base de datos de OpenStreetMap es al momento in modo de solmente diff --git a/config/locales/is.yml b/config/locales/is.yml index a8d1323d0..34f38685c 100644 --- a/config/locales/is.yml +++ b/config/locales/is.yml @@ -200,7 +200,23 @@ is: title: 'Minnispunktur: %{id}' new_note: Nýr minnispunktur description: Lýsing + open_title: 'Minnispunktur án lausnar #%{note_name}' + closed_title: 'Minnispunktur með lausn #%{note_name}' hidden_title: 'Falinn minnispunktur #%{note_name}' + open_by: Búið til af %{user} fyrir %{when} síðan + open_by_anonymous: Búið til af nafnlausum notanda fyrir + %{when} síðan + commented_by: Umsögn frá %{user} fyrir %{when} síðan + commented_by_anonymous: Umsögn frá nafnlausum notanda fyrir + %{when} síðan + closed_by: Leyst af %{user} fyrir %{when} síðan + closed_by_anonymous: Leyst af nafnlausum notanda fyrir + %{when} síðan + reopened_by: Endurvirkjað af %{user} fyrir %{when} + síðan + reopened_by_anonymous: Endurvirkjað af nafnlausum notanda fyrir + %{when} síðan + hidden_by: Falið af %{user} fyrir %{when} síðan query: title: Rannsaka fitjur introduction: Smelltu á kortið til að finna fitjur í nágrenninu. @@ -224,6 +240,9 @@ is: list: title: Breytingasett title_user: Breytingar eftir %{user} + title_friend: Breytingar eftir vini þína + title_nearby: Breytingasett eftir nálæga notendur + empty: Engin breytingasett fundust. load_more: Hlaða inn fleiri rss: commented_at_html: Uppfært fyrir %{when} síðan @@ -286,7 +305,7 @@ is: location: location: 'Staðsetning:' view: kort - edit: breyta + edit: Breyta feed: user: title: OpenStreetMap bloggfærslur eftir %{user} @@ -321,6 +340,8 @@ is: body: Svæðið sem þú ert að reyna að flytja út á OpenStreetMap á XML-sniði er of stórt. Auktu aðdráttinn eða veldu smærra svæði, nú eða notaðu eina af eftirfarandi leiðum til að flytja inn mikið magn gagna. + planet: + title: OSM-plánetan geofabrik: title: Niðurhöl frá Geofabrik other: @@ -336,7 +357,7 @@ is: longitude: 'Breidd:' output: Úttak paste_html: Notaðu þennan HTML kóða til að bæta kortinu á vefsíðu - export_button: Niðurhala + export_button: Flytja út geocoder: search: title: @@ -407,7 +428,7 @@ is: fire_hydrant: Brunahani fire_station: Slökkvistöð fountain: Gosbrunnur - fuel: Bensínstöð + fuel: Eldsneyti gambling: Fjárhættuspil grave_yard: Kirkjugarður gym: Líkamsræktarstöð @@ -552,13 +573,17 @@ is: landuse: allotments: Úthlutuð svæði basin: Lægð + brownfield: Byggingarsvæði cemetery: Grafreitur commercial: Verslunarsvæði + conservation: Verndarsvæði + construction: Bygging farm: Býli - farmland: Akurlendi + farmland: Ræktarland forest: Skógur garages: Verkstæði grass: Gras + greenfield: Nýbyggingarsvæði industrial: Iðnaðarsvæði landfill: Landfylling meadow: Skógarlundur @@ -569,12 +594,14 @@ is: railway: Lestarteinar reservoir: Uppistöðulón residential: Íbúðasvæði + retail: Smásala vineyard: Vínekra "yes": Landnotkun leisure: bird_hide: Fuglaskoðunarhús club: Klúbbur common: Almenningur + dog_park: Hundagarður fitness_centre: Líkamsræktarstöð garden: Garður golf_course: Golfvöllur @@ -665,7 +692,9 @@ is: houses: Hús island: Eyja islet: Smáeyja + isolated_dwelling: Einangraður bústaður locality: Sveitarfélag + moor: Mýri municipality: Sveitarfélag neighbourhood: Nágrenni postcode: Póstnúmer @@ -678,12 +707,19 @@ is: village: Þorp "yes": Staður railway: + abandoned: Aflögð járnbraut + construction: Járnbraut í byggingu + historic_station: Söguleg lestarstöð + level_crossing: Þverun brautarteina light_rail: Smálest + monorail: Einteinungur station: Lestarstöð subway: Neðanjarðarlest + subway_entrance: Inngangur í neðanjarðarlest tram: Sporvagn tram_stop: Sporvagnastöð shop: + antiques: Antíkverslun art: Listmunaverslun bakery: Bakarí bicycle: Hjólaverslun @@ -744,6 +780,7 @@ is: alpine_hut: Fjallaskáli apartment: Íbúð artwork: Listaverk + attraction: Aðdráttarafl bed_and_breakfast: BB-gisting og veitingar cabin: Kofi camp_site: Tjaldstæði @@ -777,7 +814,10 @@ is: waterfall: Foss "yes": Siglingaleið admin_levels: + level2: Landamæri + level4: Fylkismörk level5: Héraðsmörk + level6: Sýslumörk level8: Borgarmörk description: title: @@ -805,8 +845,8 @@ is: start_mapping: Hefja kortlagningu sign_up_tooltip: Stofnaðu aðgang til að geta breytt kortinu edit: Breyta - history: Sagnfræði - export: Niðurhala + history: Breytingaskrá + export: Flytja út data: Gögn export_data: Flytja út gögn gps_traces: GPS ferlar @@ -817,14 +857,16 @@ is: tag_line: Frjálsa wiki heimskortið intro_header: Velkomin í OpenStreetMap! intro_2_create_account: Búa til notandaaðgang + partners_ucl: UCL VR Centre + partners_ic: Imperial College London + partners_bytemark: Bytemark Hosting partners_partners: samstarfsaðilar - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: OpenStreetMap gagnagrunnurinn er niðri vegna viðhalds. osm_read_only: Ekki er hægt að skrifa í OpenStreetMap gagnagrunninn í augnablikinu vegna viðhalds. donate: Hjálpaðu OpenStreetMap verkefninu með %{link} í vélbúnaðarsjóðinn. help: Hjálp - about: Um + about: Um hugbúnaðinn copyright: Höfundaréttur community: Samfélag community_blogs: Blogg félaga @@ -916,13 +958,14 @@ is: partners_title: Samstarfsaðilar notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} bætti við athugasemd á bloggfærslu þína' + subject: '[OpenStreetMap] %{user} bætti athugasemd við bloggfærslu þína' hi: Hæ %{to_user}, - header: '%{from_user} hefur bætt við athugasemd á OpenStreetMap bloggið þitt + header: '%{from_user} hefur bætt við athugasemd á OpenStreetMap bloggfærsluna með titlinum „%{subject}“:' footer: Þú getur einnig lesið athugasemdina á %{readurl} og skrifað athugasemd á %{commenturl} eða svarað á %{replyurl} message_notification: + subject_header: '[OpenStreetMap] %{subject}' hi: Hæ %{to_user}, header: '%{from_user} hefur send þér skilaboð á OpenStreetMap með titlinum „%{subject}“:' friend_notification: @@ -1144,6 +1187,7 @@ is: private: Einkaaðgangur destination: Umferð leyfileg á ákveðinn áfangastað construction: Vegir í byggingu + bicycle_parking: Reiðhjólastæði richtext_area: edit: Breyta preview: Forskoðun @@ -1227,7 +1271,7 @@ is: owner: 'Eigandi:' description: 'Lýsing:' tags: 'Merki:' - none: engin + none: Ekkert edit_track: Breyta delete_track: Eyða trace_not_found: Þessi ferill fannst ekki! @@ -1301,13 +1345,15 @@ is: oauth_clients: new: title: Skrá nýtt forrit - submit: Skrá + submit: Nýskrá edit: title: Breyta forritinu þínu - submit: Vista + submit: Breyta show: title: OAuth stillingar fyrir %{app_name} + authorize_url: 'Leyfa slóð (URL):' edit: Breyta þessari skráningu + delete: Eyða biðlara confirm: Ertu viss? requests: 'Óska eftir eftirfarandi leyfum frá notendum:' allow_read_prefs: Lesa notandastillingar þeirra. @@ -1315,8 +1361,9 @@ is: allow_write_diary: Búa til bloggfærslur, setja inn athugasemdir og bæta við vinum. allow_write_api: Breyta kortagögnunum. + allow_read_gpx: Lesa einka-GPS-ferlana þeirra. allow_write_gpx: Senda inn GPS ferla. - allow_write_notes: breyta minnispunktum. + allow_write_notes: Breyta minnispunktum. index: title: OAuth stillingar revoke: Eyða banninu @@ -1412,11 +1459,13 @@ is: vegna framlaga. email address: 'Netfang:' confirm email address: 'Staðfestu netfang:' - not displayed publicly: Ekki sýnt opinberlega (sjá meðferð persónuupplýsinga) + not displayed publicly: Netfangið þitt er ekki birt opinberlega, sjá kaflann + um meðferð persónuupplýsinga display name: 'Sýnilegt nafn:' display name description: Nafn þitt sem aðrir notendur sjá, þú getur breytt því síðar í stillingunum þínum. + external auth: 'Auðkenning með þriðja aðila:' password: 'Lykilorð:' confirm password: 'Staðfestu lykilorðið:' continue: Nýskrá @@ -1509,6 +1558,10 @@ is: unhide_user: Af-fela þennan notanda delete_user: Eyða þessum notanda confirm: Staðfesta + friends_changesets: breytingasett vina + friends_diaries: bloggfærslur vina + nearby_changesets: breytingasett vina í næsta nágrenni + nearby_diaries: bloggfærslur vina í næsta nágrenni popup: your location: Staðsetning þín nearby mapper: Nálægur notandi @@ -1553,9 +1606,11 @@ is: preferred editor: 'Uppáhaldsritill:' image: 'Mynd:' gravatar: - gravatar: Nota Gravatar-merki + gravatar: Nota Gravatar-auðkennismynd link: http://wiki.openstreetmap.org/wiki/Gravatar link text: Hvað er þetta? + disabled: Gravatar-auðkennismynd hefur verið gerð óvirk. + enabled: Birting Gravatar-auðkennismyndar hefur verið gerð virk. new image: Bæta við mynd keep image: Halda þessari mynd delete image: Eyða þessari mynd @@ -1575,9 +1630,11 @@ is: flash update success: Stillingarnar þínar voru uppfærðar. confirm: heading: Athuga með tölvupóstinn þinn! + introduction_1: Við höfum sent þér staðfestingartölvupóst. press confirm button: Hér getur þú staðfest að þú viljir búa til notanda.. button: Staðfesta success: Notandinn þinn hefur verið staðfestur. + already active: Þessi notandaaðgangur hefur þegar verið staðfestur. confirm_email: heading: Staðfesta breytingu á netfangi press confirm button: Hér getur þú staðfest breytingu á netfangi. @@ -1708,7 +1765,7 @@ is: ago: Fyrir %{time} síðan status: Staða show: Sýna - edit: Breyta banninu + edit: Breyta revoke: Eyða banninu confirm: Ertu viss? reason: 'Ástæða banns:' @@ -1767,6 +1824,7 @@ is: header: Lög á korti notes: Minnispunktar á korti data: Gögn korts + gps: Opinberir GPS-ferlar title: Lög copyright: © OpenStreetMap þátttakendur donate_link_text: @@ -1774,6 +1832,7 @@ is: edit_tooltip: Breyta kortinu edit_disabled_tooltip: Renndu að til að breyta kortinu createnote_tooltip: Bæta við minnispunkti á kortið + createnote_disabled_tooltip: Renndu að til að bæta minnispunkti á kortið map_notes_zoom_in_tooltip: Renndu að til að sjá minnispunkta á kortinu map_data_zoom_in_tooltip: Renndu að til að skoða gögn kortsins queryfeature_tooltip: Rannsaka fitjur @@ -1784,12 +1843,14 @@ is: subscribe: Gerast áskrifandi unsubscribe: Segja upp áskrift hide_comment: fela + unhide_comment: hætta að fela notes: new: add: Bæta við minnispunkti show: hide: Fela resolve: Leysa + reactivate: Virkja aftur comment: Athugasemd directions: engines: @@ -1802,17 +1863,22 @@ is: mapzen_bicycle: Reiðhjól (Mapzen) mapzen_car: Bíll (Mapzen) mapzen_foot: Fótgangandi (Mapzen) - directions: Stefnur + directions: Leiðir distance: Vegalengd errors: no_route: Gat ekki fundið leið á milli þessara tveggja staða. no_place: Því miður, gat ekki fundið þennan stað. + instructions: + continue_without_exit: Halda áfram á %{name} + unnamed: ónefnd gata time: Tími query: node: Hnútur way: Leið relation: Vensl nothing_found: Engar fitjur fundust + error: 'Villa við að tengjast %{server}: %{error}' + timeout: Rann út á tíma við að tengjast %{server} redaction: edit: description: Lýsing diff --git a/config/locales/it.yml b/config/locales/it.yml index e82a2bd1e..3491b37f9 100644 --- a/config/locales/it.yml +++ b/config/locales/it.yml @@ -2459,6 +2459,8 @@ it: nothing_found: Nessun elemento trovato error: Errore durante la connessione a %{server}, %{error} timeout: Tempo scaduto per la connessione a %{server} + context: + show_address: Mostra indirizzo redaction: edit: description: Descrizione diff --git a/config/locales/ka.yml b/config/locales/ka.yml index 06e40b852..34ba51a6a 100644 --- a/config/locales/ka.yml +++ b/config/locales/ka.yml @@ -772,7 +772,6 @@ ka: tag_line: თავისუფალი ვიკი-რუკა intro_2_create_account: მომხმარებლის ანგარიშის შექმნა partners_partners: პარტნიორები - partners_url: http://wiki.openstreetmap.org/wiki/Partners help: დახმარება copyright: საავტორო უფლები community: თანასაზოგადოება @@ -1252,6 +1251,8 @@ ka: show: hide: დამალვა comment: კომენტარი + context: + show_address: მისამართის ჩვენება redaction: edit: description: აღწერა diff --git a/config/locales/ko.yml b/config/locales/ko.yml index a8fb1cb3c..18310628b 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -35,7 +35,7 @@ ko: acl: 접근 제어 목록 changeset: 바뀜집합 changeset_tag: 바뀜집합 태그 - country: 국가 + country: 나라 diary_comment: 일기 댓글 diary_entry: 일기 항목 friend: 친구 @@ -63,7 +63,7 @@ ko: user_preference: 사용자 환경 설정 user_token: 사용자 토큰 way: 길 - way_node: 길 노드 + way_node: 길 교점 way_tag: 길 태그 attributes: diary_comment: @@ -94,7 +94,7 @@ ko: user: email: 이메일 active: 활성 - display_name: 표시할 이름 + display_name: 표시 이름 description: 설명 languages: 언어 pass_crypt: 비밀번호 @@ -133,13 +133,13 @@ ko: changeset: title: '바뀜집합: %{id}' belongs_to: 저자 - node: 노드 (%{count}) - node_paginated: 노드 (%{count} 중 %{x}-%{y}) - way: 길 (%{count}) - way_paginated: 길 (%{count} 중 %{x}-%{y}) - relation: 관계 (%{count}) - relation_paginated: 관계 (%{count} 중 %{x}-%{y}) - comment: 댓글 (%{count}) + node: 교점(%{count}) + node_paginated: 교점(%{count}개 중 %{x}-%{y}) + way: 길(%{count}) + way_paginated: 길(%{count}개 중 %{x}-%{y}) + relation: 관계(%{count}) + relation_paginated: 관계(%{count}개 중 %{x}-%{y}) + comment: 댓글(%{count}) hidden_commented_by: '%{user}님이 %{when} 전에 남긴 숨겨진 댓글' commented_by: '%{user}님이 %{when} 전에 댓글을 @@ -152,12 +152,12 @@ ko: join_discussion: 토론에 참여하려면 로그인 discussion: 토론 node: - title: '노드: %{name}' - history_title: '노드 역사: %{name}' + title: '교점: %{name}' + history_title: '교점 역사: %{name}' way: title: '길: %{name}' history_title: '길 역사: %{name}' - nodes: 노드 + nodes: 교점 also_part_of: one: '%{related_ways} 길의 일부' other: '%{related_ways} 길의 일부' @@ -168,7 +168,7 @@ ko: relation_member: entry_role: '%{type}에서 %{role}의 %{name}' type: - node: 노드 + node: 교점 way: 길 relation: 관계 containing_relation: @@ -177,7 +177,7 @@ ko: not_found: sorry: '죄송하지만, %{type} #%{id}을(를) 찾지 못했습니다.' type: - node: 노드 + node: 교점 way: 길 relation: 관계 changeset: 바뀜집합 @@ -185,7 +185,7 @@ ko: timeout: sorry: 죄송합니다, %{id} id인 %{type}에 대한 데이터를 얻는데 너무 오래 걸립니다. type: - node: 노드 + node: 교점 way: 길 relation: 관계 changeset: 바뀜집합 @@ -195,7 +195,7 @@ ko: message_html: 이 %{type}의 %{version}판은 비공개 처리되었기 때문에 볼 수 없습니다. 자세한 내용은 %{redaction_link}을(를) 참조하세요. type: - node: 노드 + node: 교점 way: 길 relation: 관계 start_rjs: @@ -308,7 +308,7 @@ ko: no_such_entry: title: 이러한 일기 항목이 없음 heading: 'id에 항목 없음: %{id}' - body: 죄송합니다, %{id} id로 된 일기 항목이나 댓글이 없습니다. 맞춤법이나 클릭한 링크가 잘못됐는지 확인하세요. + body: 죄송하지만, %{id} id로 된 일기 항목이나 댓글이 없습니다. 맞춤법이나 클릭한 링크가 잘못됐는지 확인하세요. diary_entry: posted_by: '%{link_user}님이 %{language_link}로 %{created}에 게시함' comment_link: 이 항목에 댓글 남기기 @@ -2329,6 +2329,10 @@ ko: nothing_found: 지물을 찾을 수 없습니다 error: '%{server} 연결에 오류: %{error}' timeout: '%{server} 연결에 시간 초과' + context: + add_note: 여기에 설명 추가 + show_address: 주소 보기 + query_features: 의문 지물 redaction: edit: description: 설명 diff --git a/config/locales/lb.yml b/config/locales/lb.yml index d301cc85c..b41974789 100644 --- a/config/locales/lb.yml +++ b/config/locales/lb.yml @@ -1243,6 +1243,12 @@ lb: query: way: Wee relation: Relatioun + context: + directions_from: Vun hei fort + directions_to: Heihinn + add_note: Eng Notiz hei dobäisetzen + show_address: Adress weisen + centre_map: Kaart hei zentréieren redaction: edit: description: Beschreiwung diff --git a/config/locales/lt.yml b/config/locales/lt.yml index 6aefd05b8..29ff2a56a 100644 --- a/config/locales/lt.yml +++ b/config/locales/lt.yml @@ -91,13 +91,13 @@ lt: default: Numatytasis (šiuo metu %{name}) potlatch: name: Potlatch 1 - description: Potlatch 1 (redaktorius naršyklėje) + description: Potlatch 1 (rengyklė naršyklėje) id: name: iD - description: iD (naršyklės redaktorius) + description: iD (rengyklė naršyklėje) potlatch2: name: Potlatch 2 - description: Potlatch 2 (redaktorius naršyklėje) + description: Potlatch 2 (rengyklė naršyklėje) remote: name: nuotoliniu valdymu description: nuotolinį valdymą (JOSM arba Merkaartor) @@ -953,7 +953,7 @@ lt: gps_traces_tooltip: Tvarkyti GPS pėdsakus user_diaries: Dienoraščiai user_diaries_tooltip: Peržiūrėti naudotojų dienoraščius - edit_with: Redaguoti per %{editor} + edit_with: Redaguoti su %{editor} tag_line: Atviras wiki žemėlapis intro_header: Sveiki atvykę į OpenStreetMap! intro_text: OpenStreetMap yra pasaulio žemėlapis, kuriamas žmonių, tokių kaip @@ -985,7 +985,7 @@ lt: license_page: foreign: title: Apie šį vertimą - text: Konfliktuojant tarp šio išversto puslapio ir %{english_original_link}, + text: Esant konfliktui tarp šio išversto puslapio ir %{english_original_link}, pirmenybė bus teikiama angliškajai versijai. english_link: anglų originalas native: @@ -1032,9 +1032,11 @@ lt: Sužinokite daugiau apie mūsų duomenų naudojimą, kaip pažymėti prisidėjusius OSMF licencijavimo puslapyje ir bendruomenės DUK dėl legalumo. more_2_html: |- - Nors OpenStreetMap duomenys yra atviri, mes negalime pateikti free-of-charge žemėlapių API trečiųjų šalių vystytojams. - - Peržiūrėkite mūsų API naudojimo politiką, bei Nominatim naudojimo politika. + Nors OpenStreetMap duomenys yra atviri, mes negalime pateikti + nemokamos žemėlapių API trečiosioms šalims. + Peržiūrėkite mūsų API naudojimo politiką, + Kaladėlių naudojimo politiką, + bei Nominatim naudojimo politiką. contributors_title_html: Mūsų autoriai contributors_intro_html: Mūsų autoriai yra tūkstančiai įvairių žmonių. Taip pat apimame ir laisvai prieinamą turinį iš valstybinių kartografijos agentūrų, @@ -1113,8 +1115,8 @@ lt: title: Pagrindiniai žymėjimo terminai paragraph_1_html: OpenStreetMap turi savo žodyną. Čia keli pagrindiniai naudojami terminai/žodžiai. - editor_html: Redaktorius - tai programa arba svetainė, kurios - pagalba galite redaguoti žemėlapį. + editor_html: Rengyklė - tai programa arba svetainė su kuria + galite redaguoti žemėlapį. node_html: node/taškas - taškas žemėlapyje, pavyzdžiui vienas restoranas ar medis. way_html: kelias/way - linija ar plotas, pavyzdžiui kelias, @@ -1224,15 +1226,18 @@ lt: legal_title: Teisės legal_html: "Šis puslapis ir daugelis kitų susijusių paslaugų yra formaliai valdomi \nOpenStreetMap fondo (OSMF) \nbendruomenės - vardu.\n
\nSusisiekite su OSMF, - \njei turite licencijavimo, autoriaus teisių ar kitų teisinių klausimų ar problemų." + vardu. Visų OSMF valdomų paslaugų naudojimas yra\npriklausomas nuo \nPriimtino + naudojimo politikos ir mūsų Privatumo + politikos.\n
\nSusisiekite + su OSMF, \njei turite licencijavimo, autoriaus teisių ar kitų teisinių klausimų + ar problemų." partners_title: Partneriai notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} pakomentavo jÅ«sų dienoraščio įrašą' + subject: '[OpenStreetMap] %{user} pakomentavo dienoraščio įrašą' hi: Sveiki, %{to_user}, - header: '%{from_user} pakomentavo jÅ«sų paskutinį OpenStreetMap dienoraščio įrašą - su tema %{subject}:' + header: '%{from_user} pakomentavo jÅ«sų OpenStreetMap dienoraščio įrašą su tema + %{subject}:' footer: Taip pat galite perskaityti komentarą adresu %{readurl}, komentuoti galite adresu %{commenturl}, o atsakyti - adresu %{replyurl} message_notification: @@ -1319,6 +1324,7 @@ lt: Pastaba yra netoli %{place}.' details: Daugiau informacijos apie pastabą galima rasti %{url}. changeset_comment_notification: + hi: Sveiki, %{to_user}, greeting: Labas, commented: subject_own: '[OpenStreetMap] %{commenter} pakomentavo vieną iÅ¡ jÅ«sų pakeitimų' @@ -1331,6 +1337,8 @@ lt: partial_changeset_with_comment: su komentaru '%{changeset_comment}' partial_changeset_without_comment: be komentaro details: Daugiau informacijos apie pakeitimą rasite čia %{url}. + unsubscribe: Jei norite atsisakyti Å¡io pakeitimo atnaujinimų, eikite į %{url} + ir spauskite „Atsisakyti“. message: inbox: title: Gautieji @@ -1421,11 +1429,11 @@ lt: edit: not_public: JÅ«s nenustatėte savo keitimų, kad bÅ«tų vieÅ¡i not_public_description: JÅ«s nebegalite keisti žemėlapio, jei jÅ«s tą darysite. - JÅ«s galite nustatyti keitimus,kaip vieÅ¡us iÅ¡ savo %{user_page}. + JÅ«s galite nustatyti keitimus, kaip vieÅ¡us, iÅ¡ savo %{user_page}. user_page_link: naudotojo puslapis anon_edits_link_text: Sužinokite, kodėl taip yra. - flash_player_required: Jums reikalingas Flash player norint redaguoti su Potlatch - (atvirojo žemėlapio Flash redagavimo įrankis). JÅ«s galite parsisiųsti + flash_player_required: Jums reikalingas Flash player norint redaguoti su Potlatch, + OpenStreetMap Flash rengykle. JÅ«s galite parsisiųsti Flash Player iÅ¡ Adobe.com. Taip pat yra daugybė kitų bÅ«dų, kuriais galėsite prisidėti prie OpenStreetMap žemėlapio redagavimo. @@ -1463,6 +1471,8 @@ lt: track: Pėdsakas bridleway: Takas galvijams varyti cycleway: Dviračių takas + cycleway_national: Nacionalinis dviračių takas + cycleway_regional: Regioninis dviračių takas cycleway_local: Vietinis dviračių takas footway: Pėsčiųjų takas rail: Geležinkelis @@ -1659,6 +1669,8 @@ lt: require_moderator: not_a_moderator: Norėdami atlikti šį veiksmą, turite bÅ«ti administratoriumi. setup_user_auth: + blocked_zero_hour: Turite skubų praneÅ¡imą OpenStreetMap puslapyje. Jums reikia + perskaityti šį praneÅ¡imą prieÅ¡ galint iÅ¡saugoti pakeitimus. blocked: JÅ«sų prieiga prie API užblokuota. Prisijunkite prie žiniatinklio sąsajos, kad sužinotumėte daugiau. need_to_see_terms: JÅ«sų priėjimas prie API laikinai pristabdytas. JÅ«s turite @@ -1843,8 +1855,9 @@ lt: sąlygomis. email address: 'E-paÅ¡to adresas:' confirm email address: 'Patvirtinkite e-paÅ¡to adresą:' - not displayed publicly: VieÅ¡ai nerodoma (skaitykite privatumo politiką) + not displayed publicly: JÅ«sų adresas nėra vieÅ¡ai rodomas, daugiau informacijos + rasite privatumo politikoje display name: 'Rodomas vardas:' display name description: JÅ«sų vieÅ¡ai rodomas naudotojo vardas. Jei norėsite, galėsite jį vėliau pakeisti savo nustatymuose. @@ -1978,11 +1991,11 @@ lt: text: Å iuo metu jÅ«sų keitimai yra anonimiÅ¡ki ir žmonės negali jums siųsti praneÅ¡imų ar matyti jÅ«sų vietovės. Parodymui ką jÅ«s keitėte ir galimybei kitiems žmonėms su jumis susisiekti per Å¡ią svetainę, spauskit nuorodą žemiau. - Nuo 0.6 API pakeitimo, tik vieÅ¡i naudotojai gali keisti duoemnis. - (dėl ko taip - padaryta). + Nuo 0.6 API pakeitimo, tik vieÅ¡i naudotojai gali keisti duomenis. + (sužinokite + kodėl). contributor terms: heading: 'Talkininkų sąlygos:' agreed: JÅ«s sutikote su naujomis talkininkų sąlygomis. @@ -1994,12 +2007,13 @@ lt: link text: kas tai? profile description: 'Profilio apraÅ¡ymas:' preferred languages: 'Pageidautinos kalbos:' - preferred editor: 'Pageidautinas redaktorius:' + preferred editor: 'Pageidautina rengyklė:' image: 'Nuotrauka:' gravatar: gravatar: Naudoti Gravatar link text: kas tai? disabled: Gravatar buvo iÅ¡jungtas. + enabled: JÅ«sų Gravatar rodymas įjungtas. new image: Pridėti nuotrauką keep image: Palikti dabartinę nuotrauką delete image: PaÅ¡alintį dabartinę nuotrauką @@ -2284,7 +2298,7 @@ lt: key: title: Sutartiniai ženklai tooltip: Sutartiniai ženklai - tooltip_disabled: Sutartiniai ženklai galimi tik standartiniame sluoksnyje + tooltip_disabled: Sutartiniai ženklai neprieinami Å¡iame sluoksnyje map: zoom: in: Priartinti @@ -2301,6 +2315,7 @@ lt: header: Žemėlapio sluoksniai notes: Žemėlapio pastabos data: Žemėlapio duomenys + gps: VieÅ¡i GPS pėdsakai overlays: Ä®jungti papildomus sluoksnius problemų praneÅ¡imui title: Sluoksniai copyright: © OpenStreetMap talkininkai @@ -2357,22 +2372,37 @@ lt: instructions: continue_without_exit: Tęskite kelionę %{name} slight_right_without_exit: DeÅ¡iniau į %{name} + offramp_right_without_exit: Pasirinkite rampą deÅ¡inėje į %{name} + onramp_right_without_exit: Sukite deÅ¡inėn ant rampos į %{name} + endofroad_right_without_exit: Kelio pabaigoje sukite deÅ¡inėn į %{name} + merge_right_without_exit: Ä®silieti deÅ¡inėn į %{name} + fork_right_without_exit: IÅ¡siÅ¡akojime sukite deÅ¡inėn į %{name} turn_right_without_exit: Sukite deÅ¡inėn į %{name} sharp_right_without_exit: Staigus posÅ«kis deÅ¡inėn į %{name} uturn_without_exit: Apsisukite ties %{name} sharp_left_without_exit: Staigus posÅ«kis kairėn į %{name} turn_left_without_exit: Sukite kairėn į %{name} + offramp_left_without_exit: Pasirinkite rampą kairėje į %{name} + onramp_left_without_exit: Sukite kairėn ant rampos į %{name} + endofroad_left_without_exit: Kelio pabaigoje sukite kairėn į %{name} + merge_left_without_exit: Ä®silieti kairėn į %{name} + fork_left_without_exit: IÅ¡siÅ¡akojime sukite kairėn į %{name} slight_left_without_exit: Kairiau į %{name} via_point_without_exit: (per taÅ¡ką) follow_without_exit: Sekite %{name} - roundabout_without_exit: Žiede iÅ¡važiuokite į %{name} + roundabout_without_exit: Žiede pasirinkite %{name} leave_roundabout_without_exit: IÅ¡važiuokite iÅ¡ žiedo - %{name} stay_roundabout_without_exit: Likite žiede - %{name} start_without_exit: Pradėkite %{name} pabaigoje destination_without_exit: Pasiekite tikslą against_oneway_without_exit: Važiuokite prieÅ¡ eismą %{name} end_oneway_without_exit: Vienpusio eismo pabaiga %{name} - roundabout_with_exit: Žiede iÅ¡važiuokite %{exit} iÅ¡važiavime į %{name} + roundabout_with_exit: Žiede pasirinkite iÅ¡važiavimą %{exit} į %{name} + turn_left_with_exit: Žiede sukite kairėn į %{name} + slight_left_with_exit: Žiede Å¡iek tiek kairėn į %{name} + turn_right_with_exit: Žiede sukite deÅ¡inėn į %{name} + slight_right_with_exit: Žiede Å¡iek tiek deÅ¡inėn į %{name} + continue_with_exit: Žiede tęskite tiesiai į %{name} unnamed: bevardis courtesy: Nuorodas pateikė %{link} time: Laikas @@ -2383,6 +2413,13 @@ lt: nothing_found: Nerasta objektų error: 'Klaida jungiantis prie %{server}: %{error}' timeout: Jungiantis prie %{server} baigėsi laikas + context: + directions_from: Nuorodos iÅ¡ čia + directions_to: Nuorodos į čia + add_note: Pridėti pastabą čia + show_address: Rodyti adresą + query_features: IeÅ¡koti objektų + centre_map: Centruoti žemėlapį čia redaction: edit: description: ApraÅ¡ymas diff --git a/config/locales/lv.yml b/config/locales/lv.yml index af6fc1dff..917c85d6e 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -957,7 +957,6 @@ lv: partners_ic: Londonas Imperiālā Koledža partners_bytemark: Bytemark Hosting partners_partners: partneri - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: OpenStreetMap datubāze Å¡obrÄ«d nav pieejama, tiek veikti svarÄ«gi datubāzes apkalpoÅ¡anas darbi. osm_read_only: OpenStreetMap datubāze Å¡obrÄ«d ir pieejama tikai-lasāmā režīmā, diff --git a/config/locales/mk.yml b/config/locales/mk.yml index d247d1891..e2f6cb35b 100644 --- a/config/locales/mk.yml +++ b/config/locales/mk.yml @@ -954,7 +954,6 @@ mk: partners_ic: Империјалниот колеџ - Лондон partners_bytemark: вдомителот „Bytemark“ partners_partners: партнери - partners_url: http://wiki.openstreetmap.org/wiki/Partners?uselang=mk osm_offline: Базата на податоци на OpenStreetMap моментално е исклучена додека работиме на неопходни одржувања. osm_read_only: Базата на податоци на OpenStreetMap моментално може само да се @@ -1000,7 +999,7 @@ mk: правен текст." intro_3_html: |- Картографијата во нашите полиња на картите и нашата документација - се нудат под лиценцата Криејтив комонс НаведиИзвор-СподелиПодИстиУслови 2.0 (CC-BY-SA). + се нудат под лиценцата Криејтив комонс Наведи извор-Сподели под исти услови 2.0 (CC-BY-SA). credit_title_html: Како да ја наведете OpenStreetMap credit_1_html: |- Задолжително наведувајте нè со “© Учесници на @@ -1676,6 +1675,8 @@ mk: require_moderator: not_a_moderator: За да го изведете тоа, треба да сте модератор. setup_user_auth: + blocked_zero_hour: Имате итна порака на OpenStreetMap. Ќе мора да ја прочитате + пораката пред да ги зачувате уредувањата. blocked: Пристапот кон API ви е блокиран. Најавете се на посредникот за да дознаете повеќе. need_to_see_terms: Вашиот пристап до извршничкиот програм е привремено запрен. @@ -2225,6 +2226,7 @@ mk: helper: time_future: Истекува за %{time}. until_login: Активно додека не се најави корисникот. + time_future_and_until_login: Завршува во %{time} и откако корисникот ќе се најави. time_past: Истечено пред %{time}. blocks_on: title: Блокови за %{name} @@ -2425,6 +2427,13 @@ mk: nothing_found: Не пронајдов ниеден елемент error: 'Грешка при поврзувањето со %{server}: %{error}' timeout: Истече времето за поврзување со %{server} + context: + directions_from: Насоки оттука + directions_to: Насоки дотука + add_note: Тука ставете белешка + show_address: Прикажи адреса + query_features: Можности за барања + centre_map: Тука сосредоточи ја картата redaction: edit: description: Опис diff --git a/config/locales/ne.yml b/config/locales/ne.yml index bc5d03db0..d2560a94b 100644 --- a/config/locales/ne.yml +++ b/config/locales/ne.yml @@ -2,18 +2,22 @@ # Exported from translatewiki.net # Export driver: phpyaml # Author: Krish Dulal +# Author: Nirjal stha # Author: Njsubedi # Author: RajeshPandey +# Author: राम प्रसाद जोशी # Author: सरोज कुमार ढकाल --- ne: + html: + dir: ltr time: formats: - friendly: '%e %B %Y at %H:%M' + friendly: '%e %B %Y मा %H:%M' activerecord: models: acl: अनुमति नियन्त्रण सूची - changeset: परिवर्तनहरु सूची + changeset: परिवर्तनहरू सूची changeset_tag: चेन्जसेट ट्याग country: देश diary_comment: डायरी टिप्पणी @@ -76,8 +80,11 @@ ne: active: सक्रिय display_name: देखाउने नाम description: वर्णन - languages: भाषाहरु + languages: भाषाहरू pass_crypt: पासवर्ड + printable_name: + with_version: '%{id}, v%{version}' + with_name_html: '%{name} (%{id})' editor: default: पूर्वस्थापित(अहिलेको %{name}) potlatch: @@ -122,11 +129,18 @@ ne: way_paginated: बाटोहरू (जम्मा %{count} मध्येबाट %{x}-%{y}) relation: सम्बन्धहरू (%{count}) relation_paginated: सम्बन्धहरू (जम्मा %{count} मध्येबाट %{x}-%{y}) + comment: टिप्पणीहरू (%{count}) + hidden_commented_by: ' %{user} द्वारा गरिएको लुकाइएको टिप्पणी %{when} + पहिले' + commented_by: '%{user}द्वारा %{when} अगाडि + गरिएको टिप्पणी' changesetxml: चेन्जसेट XML osmchangexml: osmChange XML feed: title: 'परिवर्तनहरू: %{id}' title_comment: परिवर्तनहरू %{id} - %{comment} + join_discussion: छलफलमा भाग लिन लग इन गर्नुहोस् + discussion: छलफल node: title: 'अंश: %{name}' history_title: 'अंशको इतिहास: %{name}' @@ -156,7 +170,8 @@ ne: node: नोड way: बाटो relation: सम्बन्ध - changeset: परिवर्तनसेट \ + changeset: परिवर्तनसेट + note: टिपोट timeout: sorry: माफ गर्नुहोला, %{id} अाइडि भएको %{type}को लागि तथ्याङ्क प्राप्त गर्न निक्कै समय लाग्यो । @@ -165,10 +180,11 @@ ne: way: बाटो relation: सम्बन्ध changeset: चेन्जसेट + note: टिपोट redacted: redaction: सम्पादन %{id} - message_html: '%{type}को संस्करण %{version} सम्पादित भएकाले देखाउन सकिएन । कृपया - विस्तृत जानकारीको लागि %{redaction_link} हेर्नुहोस् ।' + message_html: संस्करण %{version} यस प्रकारको %{type} देखाउन सकिँदैन किनभने + यो हटाइएको छ कृपया जानकारीखो लागि %{redaction_link} हेर्नुहोस् type: node: नोड way: बाटो @@ -180,11 +196,13 @@ ne: load_data: डेटा लोडगर्ने loading: लोड हुदैछ... tag_details: - tags: संकेतहरू + tags: ट्यागहरू wiki_link: key: '%{key} संकेतको लागि विकि विवरण पृष्ठ' tag: '%{key}=%{value} संकेतको लागि विकि विवरण पृष्ठ' + wikidata_link: '%{page} वस्तु Wikidata मा' wikipedia_link: '%{page}को बारेमा विकिपीडियामा भएको लेख' + telephone_link: '%{phone_number} मा फोन गर्नुहोस्' note: title: 'टिप्पणी: %{id}' new_note: नयाँ टिप्पणी @@ -210,6 +228,8 @@ ne: अगाडि पुनःसक्रिय गरिएको hidden_by: '%{user}द्वारा %{when} अगाडि लुकाइएको' + query: + title: क्वेरी गुणहरू changeset: changeset_paging_nav: showing_page: पृष्ठ %{page} @@ -243,6 +263,7 @@ ne: diary_entry: new: title: नयाँ दैनिकी + publish_button: प्रकाशन गर्नुहोस् list: title: प्रयोगकर्ताका डायरीहरू title_friends: साथीहरूका डायरीहरू @@ -264,7 +285,7 @@ ne: latitude: 'देशान्तर:' longitude: 'अक्षांश:' use_map_link: नक्सा प्रयोगर्ने - save_button: संग्रह गर्ने + save_button: सङ्ग्रह गर्नुहोस् marker_text: दैनिकी प्रविष्ठी स्थान view: title: '%{user}को डायरी | %{title}' @@ -272,7 +293,7 @@ ne: leave_a_comment: टिप्पणी छोड्ने login_to_leave_a_comment: '%{login_link} टिप्पणी छोड्नलाई' login: प्रवेश - save_button: संग्रह गर्ने + save_button: सङ्ग्रह गर्नुहोस् no_such_entry: title: त्यस्तो कुनै दैनिकी भेटिएन heading: '%{id} आइडी भएको कुनै अभिलेख भेटिएन' @@ -292,7 +313,7 @@ ne: diary_comment: comment_from: '%{link_user}द्वारा %{comment_created_at}मा गरिएको टिप्पणी' hide_link: यो टिप्पणी लुकाउनुहोस् - confirm: ' निश्चित गर्ने' + confirm: निश्चित गर्ने location: location: 'स्थान:' view: अवलोकन गर्ने @@ -350,7 +371,7 @@ ne: other: title: अन्य स्रोतहरू description: ओपनस्ट्रीटम्याप विकिमा सूचीत थप स्रोतहरू - options: विकल्पहरु + options: विकल्पहरू format: ढाँचा scale: स्केल max: अधिकतम @@ -379,8 +400,10 @@ ne: search_osm_nominatim: prefix: aerialway: + cable_car: केबल कार chair_lift: कुर्सी लिफ्ट drag_lift: तान्ने लिफ्ट + gondola: गोन्डोला लिफ्ट station: हवाई मार्ग स्टेशन aeroway: aerodrome: हवाईड्रोम @@ -391,11 +414,9 @@ ne: taxiway: ट्याक्सीको बाटो terminal: टर्मिनल amenity: - airport: विमानस्थल + animal_shelter: पशु आश्रय arts_centre: कला केन्द्र - artwork: कला atm: एटिएम् मेसिन - auditorium: प्रेक्षालय bank: बैँक bar: बार bbq: बारबिक्यू @@ -403,6 +424,7 @@ ne: bicycle_parking: साइकिल पार्किङ् bicycle_rental: साइकिल भाडामा biergarten: बियर पिउने ठाउँ + boat_rental: ढुङ्गा भाडा सेवा brothel: वेश्यालय bureau_de_change: परिवर्तन व्यूरो bus_station: बस स्टेसन् @@ -412,11 +434,12 @@ ne: car_wash: कार धुने ठाउँ casino: क्यासिनो charging_station: चार्ज गर्ने स्टेसन + childcare: बालबालिका हेरचाह cinema: सिनेमा घर clinic: क्लिनिक - club: क्लब + clock: घन्टाघर college: कलेज - community_centre: सामुदायीक केन्द्र + community_centre: सामुदायिक केन्द्र courthouse: अदालत crematorium: श्मशान dentist: दाँतको डाक्टर @@ -433,24 +456,246 @@ ne: food_court: खाजा घर fountain: पानीको फोहोरा fuel: इन्धन + gambling: जुवाघर grave_yard: श्मशान घाट gym: जिमखाना - hall: हल health_centre: स्वास्थ्य केन्द्र hospital: अस्पताल - hotel: होटेल hunting_stand: शिकार क्षेत्र ice_cream: बरफ kindergarten: बाल आश्रम library: पुस्तकालय market: बजार marketplace: बजार क्षेत्र + monastery: चैत्य + motorcycle_parking: मोटर साइकल पार्किङ + nightclub: रात्री क्लब + nursery: नर्सरी + nursing_home: नर्सिङ होम + office: कार्यलय + parking: पार्किङ + parking_entrance: पार्किङ प्रवेश + pharmacy: औषधी पसल + place_of_worship: पूजा गर्ने स्थान + police: प्रहरी + post_box: हुलाक बाक्सा + post_office: हुलाक + prison: कारागार + pub: पब + public_building: सार्वजनिक भवन + reception_area: रिसेप्सन क्षे्त्र + recycling: पुनः प्रयोग विन्दु + restaurant: रेस्टुरेन्ट + retirement_home: बृद्ध आश्रम + sauna: सौना + school: विद्यालय + shelter: आश्रय + shop: पसल + shower: स्नानघर + social_centre: सामाजिक केन्द्र + social_club: सामाजिक क्लब + social_facility: सामाजिक सेवा + studio: स्टुडियो + swimming_pool: पौली पोखरी + taxi: ट्याक्सी + telephone: सार्वजनिक टेलिफोन + theatre: हल + toilets: शौचालय + townhall: सभा गृह + university: विश्वविद्यालय + vending_machine: भेन्डिङ मेसिन + veterinary: भेटेरिनरी शल्यक्रिया + village_hall: सभा गृह + waste_basket: फोहर टोकरी + waste_disposal: फोहर फाल्ने ठाउँ + youth_centre: युवा केन्द्र + boundary: + administrative: प्रशासनिक सिमाना + census: जनगणना सिमाना + national_park: राष्ट्रिय निकुञ्ज + protected_area: संरक्षित क्षेत्र + bridge: + aqueduct: नहर + suspension: झोलुङ्गे पुल + swing: झोलुङ्गे पुल + "yes": पुल + building: + "yes": भवन + craft: + brewery: ब्रुएरी + carpenter: सिकर्मी + electrician: विद्युतकर्मी + gardener: माली + painter: पेन्टर + photographer: फोटोग्रा + plumber: प्लमर + shoemaker: जुत्ताबनाउने + tailor: सुचीकार + "yes": कला पसल + emergency: + ambulance_station: एम्बुलेन्स पार्क + phone: आकस्मिक फोन + highway: + path: पथ + primary: प्राथमिक सडक + primary_link: प्राथमिक सडक + proposed: प्रस्तावित सडक + raceway: रेसवे + residential: आवासीय सडक + road: सडक + secondary: माध्यमिक सडक + secondary_link: माध्यमिक सडक + service: सर्भिस सडक + speed_camera: गति क्यामेरा + steps: खुट्किलाहरू + street_lamp: सडक बत्ती + track: ट्रयाक + "yes": सडक + historic: + house: घर + icon: प्रतिमा + stone: पत्थर + tower: टावर + landuse: + farm: खेती + forest: वन + leisure: + club: कल्ब + sauna: सौना + swimming_pool: पौली पोखरी + man_made: + tower: टावर + natural: + forest: वन + point: बिन्दु + rock: रक + spring: स्प्रिङ + stone: पत्थर + water: पानी + office: + company: कम्पनी + "yes": कार्यलय + place: + block: खण्ड + city: शहर + country: देश + farm: खेती + house: घर + state: राज्य + "yes": स्थानहरू + shop: + gallery: सङ्ग्रहालय + market: बजार + pharmacy: औषधी पसल + tailor: सुचीकार + "yes": पसल + tourism: + gallery: सङ्ग्रहालय + information: सूचना + waterway: + dock: डक गर्नुहोस् + stream: प्रवाह + description: + types: + places: स्थानहरू + results: + no_results: कुनै नतिजाहरू भेटिएनन् + layouts: + edit: सम्पादन + history: इतिहास + export: निर्यात गर्नुहोस् + data: डेटा + help: सहायता + about: बारेमा + copyright: प्रतिलिपि अधिकार + learn_more: थप जान्नुहोस् + more: थप + help_page: + beginners_guide: + url: http://wiki.openstreetmap.org/wiki/Beginners%27_guide + title: शिकारूको लागी मार्गदर्शन + description: शिकारूको लागी समुदायले मार्गदर्शन कायम गरेकोछ + mailing_lists: + title: मेलिङ्ग सूचीहरू + forums: + title: मञ्च + irc: + title: आईआरसि + switch2osm: + title: स्विचटु‍ओएसएम + about_page: + next: अर्को + legal_title: कानूनी + notifier: + gpx_notification: + greeting: हाय, + email_confirm_plain: + greeting: हाय, + email_confirm_html: + greeting: हाय, + lost_password_plain: + greeting: हाय, + lost_password_html: + greeting: हाय, + note_comment_notification: + anonymous: एक अज्ञात प्रयोगकर्ता + greeting: हाय, + changeset_comment_notification: + greeting: हाय, + message: + inbox: + from: बाट + subject: विषय + date: मिति + message_summary: + delete_button: हटाउनुहोस् + new: + title: सान्देस पठाउ + subject: विषय + body: बडी + send_button: पठाउनुहोस् + outbox: + to: लाई + subject: विषय + date: मिति + read: + from: बाट + subject: विषय + date: मिति + back: पछाडि + to: लाई + sent_message_summary: + delete_button: हटाउनुहोस् site: + sidebar: + close: बन्द गर्नुहोस् search: - search: खोज + search: खोज्नुहोस् + get_directions: दिशानिर्देशन प्राप्त गर्नुहोस् + from: बाट + to: लाई + key: + table: + entry: + track: ट्रयाक + forest: वन + farm: खेती + school: + - विद्यालय + toilets: शौचालय + richtext_area: + edit: सम्पादन + preview: पूर्वावलोकन + markdown_help: + headings: शीर्षकहरू + heading: शीर्षक + first: पहिलो वस्तु + link: लिङ्क + text: पाठ + image: छवि trace: create: - upload_trace: ' GPS Trace अपलोड गर्ने' + upload_trace: GPS Trace अपलोड गर्ने edit: title: ट्रेस सम्पादन गर्दै %{name} heading: ट्रेस सम्पादन गर्दै %{name} @@ -463,15 +708,15 @@ ne: edit: सम्पादन owner: 'मालिक:' description: विवरण - tags: 'ट्यागहरु:' + tags: ट्यागहरूः tags_help: अल्पविरामले छुट्याएको - save_button: परिवर्तनहरु संग्रह गर्ने + save_button: परिवर्तनहरू संग्रह गर्ने visibility: 'दृश्यक्षमता:' visibility_help: यसको मतलब के हो ? trace_form: upload_gpx: 'GPX फाइल अपलोड गर्ने:' description: 'विवरण:' - tags: 'ट्यागहरु:' + tags: ट्यागहरूः tags_help: अल्पविरामले छुट्याएको visibility: 'दृश्यक्षमता:' visibility_help: यसको मतलाब के हो ? @@ -479,9 +724,9 @@ ne: help: सहायता trace_header: see_all_traces: सबै ट्रेसहरु हेर्ने - see_your_traces: तपाईको सबै ट्रेसहरु हेर्नुहोस \ + see_your_traces: तपाईंको सबै ट्रेसहरू हेर्नुहोस् trace_optionals: - tags: ट्यागहरु + tags: ट्यागहरू view: title: हेर्दै ट्रेस %{name} heading: हेर्दै ट्रेस %{name} @@ -495,12 +740,14 @@ ne: edit: सम्पादन owner: 'मालिक:' description: 'विवरण:' - tags: 'ट्यागहरु:' + tags: ट्यागहरूः none: कुनै पनि होइन edit_track: यो ट्रेस सम्पादन गर्ने delete_track: यो ट्रेस मेट्ने trace_not_found: ट्रेस भेटिएन! visibility: 'दृश्यक्षमता:' + trace_paging_nav: + showing_page: पृष्ठ %{page} trace: pending: बाँकी रहेको count_points: पोइन्टहरु %{count} @@ -516,27 +763,58 @@ ne: in: मा map: नक्सा list: - public_traces: सारवजनिक GPS ट्रेसहरु \ - your_traces: तपाईको GPS ट्रेसहरु + public_traces: सारवजनिक GPS ट्रेसहरु + your_traces: तपाईंको GPS ट्रेसहरू public_traces_from: '%{user}बाट सार्वकनिक GPS ट्रेसहरु' tagged_with: ' %{tags}हरूद्वारा ट्याग गरिएको' delete: scheduled_for_deletion: मेट्नको लागि तालिकावद्ध गरिएको ट्रेस make_public: made_public: सार्वजनिक बनाइएको ट्रेस + oauth_clients: + edit: + submit: सम्पादन + show: + confirm: निश्चित हुनुहुन्छ ? + form: + name: नाम + required: आवश्यक पर्दछ user: + login: + title: प्रवेश + heading: प्रवेश + password: 'पासवर्ड:' + login_button: प्रवेश + no account: खाता छैन? + lost_password: + new password button: प्रवेस शब्द परिवर्तन गर्ने reset_password: - title: प्रवेशशव्द परिवर्तन गर्ने - heading: ' %{user}को लागि प्रवेशशव्द परिवर्तन गर्ने \' - password: 'प्रवेशशव्द:' + title: प्रवेस शब्द परिवर्तन गर्ने + heading: '%{user}को लागि प्रवेस शब्द परिवर्तन गर्ने' + password: 'पासवर्ड:' + confirm password: 'प्रवेशशव्द निश्चित गर्ने:' + reset: नयाँ प्रवेशशव्द + flash changed: तपाईंको प्रवेश शब्द परिवर्तन गरिएको छ। + new: + password: 'पासवर्ड:' confirm password: 'प्रवेशशव्द निश्चित गर्ने:' - reset: नयाँ प्रवेशशव्द \ - flash changed: तपाईको प्रवेशशव्द परिवर्तन गरिएको छ। terms: consider_pd_why: यो के हो ? + legale_names: + france: फ्रान्स + italy: इटाली + no_such_user: + deleted: मेटाईएको + view: + traces: निशानहरू + status: 'स्थिति:' + description: वर्णन + comments: टिप्पणी + confirm: निश्चित गर्ने popup: - your location: तपाईको स्थान + your location: तपाईँको स्थान nearby mapper: नजिकको मानचित्रकर्मी + friend: साथी account: my settings: मेरो अनुकुलताहरु openid: @@ -549,47 +827,120 @@ ne: heading: सार्वजनिक सम्पादन contributor terms: link text: यो के हो ? - preferred languages: 'रुचाइएका भाषाहरु:' + preferred languages: 'रुचाइएका भाषाहरू:' + gravatar: + link text: यो के हो ? home location: 'गृह स्थान:' - no home location: तपाईले आफ्नो गृहस्थान प्रविष्ठ गर्नुभएको छैन। - save changes button: परिवर्तनहरु संग्रह गर्नुहोस \ - flash update success: प्रयोगकर्ताको जानकारीहरु सफलतापूर्वक अध्यावधिक गरियो। + no home location: तपाईंले आफ्नो गृहस्थान प्रविष्ठ गर्नुभएको छैन। + latitude: 'देशान्तर:' + longitude: 'अक्षांश:' + save changes button: परिवर्तनहरू संग्रह गर्नुहोस् + flash update success confirm needed: प्रयोगकर्ताको जानकारीहरू सफलतापूर्वक अध्यावधिक + गरियो। Check your email for a note to confirm your new email address. + flash update success: प्रयोगकर्ताको जानकारीहरू सफलतापूर्वक अध्यावधिक गरियो। + confirm: + button: निश्चित गर्ने confirm_email: - heading: इमेल परिवर्तन भएको निश्चित गर्नुहोस् \ + heading: इमेल परिवर्तन भएको निश्चित गर्नुहोस् press confirm button: इमेल निश्चित गर्नको लागि निश्चितमा क्लिक गर्नुहोस् । button: निश्चित - success: तपाईको इमेल निश्चित गर्नुहोस, ग्राह्याताको लागि धन्यवाद! + success: तपाईंको इमेल निश्चित गर्नुहोस्, ग्राह्याताको लागि धन्यवाद! failure: यो टोकन को साथम एक इमेल पहिले नै निश्चित गरिसकिएको छ। go_public: - flash success: तपाईको सबै सम्पादनहरु सार्वाजनिक छन् ,तपाई अब सम्पान लायक हुनु - भयो । + flash success: तपाईंका सबै सम्पादनहरू सार्वाजनिक छन् , तपाईं अब सम्पादन लायक + हुनु भयो । make_friend: - success: '%{name} अब तपाईको मित्र हुनुभएको छ!' + success: '%{name} अब तपाईंको मित्र हुनुभएको छ!' failed: माफ गर्नुहोला, %{name}लाई मित्रको रुपमा थप्न सकिएन। - already_a_friend: ' %{name} सँग तपाई पहिले नै मित्रता गरिसक्नु भएको छ ।' + already_a_friend: '%{name} सँग तपाईंले पहिले नै मित्रता गरिसक्नु भएको छ ।' filter: - not_an_administrator: यो कार्य गर्न तपाई प्रवन्धक हुनुपर्छ . + not_an_administrator: यो कार्य गर्न तपाईं प्रवन्धक हुनुपर्छ . user_role: filter: - not_an_administrator: प्रवन्धकहरुले भूमिका व्यवस्थापन गर्न सक्छन् र तपाई प्रवन्धक + not_an_administrator: प्रवन्धकहरूले भूमिका व्यवस्थापन गर्न सक्छन् र तपाईं प्रवन्धक हैन । - not_a_role: ' `%{role}'' मान्य भूमिका हैन ।' + not_a_role: '`%{role}'' मान्य भूमिका हैन ।' already_has_role: प्रयोगकर्ता सँग %{role} भूमिका पहिले देखि नै छ। - doesnt_have_role: ' प्रयोगर्ताको %{role}को भूमिका छैन' + doesnt_have_role: प्रयोगर्ताको %{role}को भूमिका छैन grant: - title: भूमिका प्रदान निश्चित गर्ने \ - heading: भूमिका प्रदान निश्चित गर्ने \ + title: भूमिका प्रदान निश्चित गर्ने + heading: भूमिका प्रदान निश्चित गर्ने are_you_sure: भूमिका `%{role}' प्रयोगकर्ता `%{name}'लाई प्रदान गर्न निश्चित हुनुहुन्छ? confirm: निश्चित गर्ने fail: भूमिका `%{role}' प्रयोगकर्ता `%{name}'लाई प्रदान गर्न सकिएन । कृपया प्रयोगकर्ता र भूमिका दुबै मान्य छन् भनि जाँच गर्नुहोस् । revoke: - title: Confirm role revoking + title: भूमिका फिर्ता निश्चित गर्ने heading: भूमिका फिर्ता निश्चित गर्ने - are_you_sure: तपाईँ भूमिका `%{role}' , `%{name} प्रोगकर्ताबाट फिर्ता लिने कुरामा + are_you_sure: तपाईं भूमिका `%{role}' , `%{name} प्रोगकर्ताबाट फिर्ता लिने कुरामा निश्चित हुनुहुन्छ'? confirm: निश्चित गर्ने fail: भूमिका `%{role}' ,`%{name}'बाट फिर्ता लिन सकिएन । प्रोगकर्ता नाम र भूमिका दुबै मान्य छन् भन्ने खुलाउनु होस् । + user_block: + partial: + show: देखाउनुहोस् + edit: सम्पादन + confirm: निश्चित हुनुहुन्छ ? + creator_name: सर्जक + status: वस्तुस्थिति + showing_page: पृष्ठ %{page} + next: अर्को » + previous: « अघिल्लो + show: + created: सृजना गरिएको + status: वस्तुस्थिति + show: देखाउनुहोस् + edit: सम्पादन + confirm: निश्चित हुनुहुन्छ ? + note: + entry: + comment: टिप्पणी + mine: + id: आईडी + creator: सर्जक + description: वर्णन + javascripts: + close: बन्द गर्नुहोस् + share: + title: आदान-प्रदान गर्नुहोस् + cancel: रद्द गर्नुहोस् + image: छवि + long_link: लिङ्क + embed: एचटीएमएल + format: 'ढाँचा:' + download: डाउनलोड + paste_html: वेबसाइट इम्बेड गर्न HTML पेस्ट गर्नुहोस् + map: + zoom: + in: ठुलो पार्नुहोस + out: सानो पार्नुहोस + base: + standard: मानक + changesets: + show: + comment: टिप्पणी + subscribe: सवस्क्रिप्ट + unsubscribe: सदस्यता खारेज गर्नुहोस् + hide_comment: लुकाउ + notes: + show: + hide: लुकाउनुहोस् + comment: टिप्पणी + directions: + time: समय + query: + node: नोड + way: बाटो + relation: रिलेशन + redaction: + edit: + description: वर्णन + new: + description: वर्णन + show: + description: विवरण + user: 'सर्जक:' + confirm: निश्चित हुनुहुन्छ ? ... diff --git a/config/locales/oc.yml b/config/locales/oc.yml index 158fc3140..389d3d8a6 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -703,6 +703,7 @@ oc: reef: Estèu ridge: Cresta rock: Ròca + saddle: Sèla sand: Sabla scree: Esbudèl scrub: Boissa @@ -1107,12 +1108,13 @@ oc: partners_title: Partenaris notifier: diary_comment_notification: - subject: '[OpenStreetMap] %{user} a apondut un comentari sus vòstra entrada - del jornal' + subject: '[OpenStreetMap] %{user} a postat un comentari sus un article de jornal' hi: Bonjorn %{to_user}, + footer: Tanben podètz legir lo comentari sus %{readurl}, lo comentar sus %{commenturl} + o respondre sus %{replyurl} message_notification: hi: Bonjorn %{to_user}, - footer_html: Podètz tanben legir lo messatge a %{readurl} e i podètz respondre + footer_html: Tanben podètz legir lo messatge a %{readurl} e i podètz respondre a %{replyurl} friend_notification: subject: '[OpenStreetMap] %{user} vos a apondut coma amic' @@ -1188,9 +1190,14 @@ oc: La nòta se tròba prèp de %{place}.' details: Mai de detalh sus la nòta pòt èsser obtengut a %{url}. changeset_comment_notification: + hi: Bonjorn %{to_user}, greeting: Bonjorn, commented: - partial_changeset_with_comment: amb lo comentari '%{changeset_comment}' + subject_own: '[OpenStreetMap] %{commenter} a comentat un de vòstres ensembles + de cambiaments' + subject_other: '[OpenStreetMap] %{commenter} a comentat un ensemble de cambiaments + al qual vos interessatz' + partial_changeset_with_comment: amb lo comentari « %{changeset_comment}' Â» partial_changeset_without_comment: sens comentari message: inbox: @@ -1609,6 +1616,9 @@ oc: github: title: Connexion amb GitHub alt: Connexion amb un Compte GitHub + wikipedia: + title: Se connectar amb Wikipèdia + alt: Se connectar amb un compte de Wikipèdia yahoo: title: Se connectar amb Yahoo alt: Se connectar amb l'OpenID de Yahoo @@ -2015,7 +2025,7 @@ oc: key: title: Legenda tooltip: Legenda - tooltip_disabled: La legenda es pas disponibla que pel jaç estandard + tooltip_disabled: La legenda es pas disponibla que per aqueste jaç map: zoom: in: Zoom avant @@ -2032,6 +2042,7 @@ oc: header: Jaces de mapa notes: Nòtas de la mapa data: Donadas de mapa + gps: Traças GPS publicas overlays: Autorizar las superposicions per reparar la mapa title: Jaces copyright: © Contributors d'OpenStreetMap @@ -2110,6 +2121,12 @@ oc: against_oneway_without_exit: Remontatz a contrasens sus %{name} end_oneway_without_exit: Fin del sens unic a %{name} roundabout_with_exit: A la rotonda, prene la sortida %{exit} sus %{name} + turn_left_with_exit: A la rotonda, viratz a esquèrra cap a %{name} + slight_left_with_exit: A la rotonda, viratz leugièrament a esquèrra cap a + %{name} + turn_right_with_exit: A la rotonda viratz a dreita cap a %{name} + slight_right_with_exit: A la rotonda viratz leugièrament a dreita cap a %{name} + continue_with_exit: A la rotonda, contunhatz tot dreit cap a %{name} unnamed: via sens nom courtesy: Itinerari peovesit per %{link} time: Temps @@ -2120,6 +2137,13 @@ oc: nothing_found: Cap d'objècte pas trobat error: 'Error en contactant %{server}: %{error}' timeout: Relambi depassat en contactant %{server} + context: + directions_from: Direccions dempuèi aicí + directions_to: Direccions cap a aicí + add_note: Apondre una nòta aicí + show_address: Afichar l’adreça + query_features: Requèsta sus las foncionalitats + centre_map: Centrar la mapa aicí redaction: edit: description: Descripcion diff --git a/config/locales/pl.yml b/config/locales/pl.yml index 262137999..2c702d0a7 100644 --- a/config/locales/pl.yml +++ b/config/locales/pl.yml @@ -1000,7 +1000,6 @@ pl: partners_ic: Imperial College London partners_bytemark: Hosting Bytemark partners_partners: partnerzy - partners_url: http://wiki.openstreetmap.org/wiki/partners osm_offline: Baza danych OpenStreetMap jest niedostępna na czas ważnych zadań administracyjnych, które są w tym momencie wykonywane. osm_read_only: Baza danych OpenStreetMap jest w trybie tylko-do-odczytu na czas @@ -1706,6 +1705,8 @@ pl: require_moderator: not_a_moderator: Musisz być moderatorem, aby wykonać tą czynność. setup_user_auth: + blocked_zero_hour: Masz pilną wiadomość na stronie OpenStreetMap. Musisz przeczytać + tę wiadomość, zanim będzie można zapisywać zmiany. blocked: Twój dostęp do API jest zablokowany. Zaloguj się do interfejsu sieciowego, aby dowiedzieć się więcej. need_to_see_terms: Twój dostęp do API został czasowo zawieszony. Zaloguj się @@ -2256,6 +2257,7 @@ pl: helper: time_future: Blokada wygasa za %{time}. until_login: Aktywne do momentu zalogowania użytkownika. + time_future_and_until_login: Kończy się %{time} i po zalogowaniu się użytkownika. time_past: Zakończono %{time} temu. blocks_on: title: Blokady na użytkownika %{name} @@ -2456,6 +2458,13 @@ pl: nothing_found: Nie znaleziono obiektów error: 'Błąd komunikacji z %{server}: %{error}' timeout: Przekroczono czas oczekiwania z:%{server} + context: + directions_from: Nawiguj stąd + directions_to: Nawiguj tutaj + add_note: Dodaj uwagę tutaj + show_address: Pokaż adres + query_features: Wyświetl dane obiektu + centre_map: Wycentruj mapę tutaj redaction: edit: description: Opis diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 0cf181d6b..9892de330 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -1713,6 +1713,8 @@ pt-BR: require_moderator: not_a_moderator: Você precisa ser um moderador para realizar essa ação. setup_user_auth: + blocked_zero_hour: Há uma mensagem urgente para você no site do OpenStreetMap. + Você deve lê-la para poder voltar a salvar suas edições. blocked: Seu acesso à API foi bloqueado. Acesse a interface web para mais detalhes. need_to_see_terms: O seu acesso à API está temporariamente suspenso. Faça o login na interface web para ler os Termos do Contribuidor. Você não precisa @@ -2457,6 +2459,13 @@ pt-BR: nothing_found: Nenhum elemento encontrado error: 'Erro ao contatar %{server}: %{error}' timeout: Tempo esgotado com %{server} + context: + directions_from: Início da Rota + directions_to: Destino da Rota + add_note: Adicionar uma nota aqui + show_address: Mostrar Endereço + query_features: Consultar elementos + centre_map: Centralizar o mapa aqui redaction: edit: description: Descrição diff --git a/config/locales/ru.yml b/config/locales/ru.yml index b84733ed2..5ffe46fea 100644 --- a/config/locales/ru.yml +++ b/config/locales/ru.yml @@ -32,6 +32,7 @@ # Author: Komzpa # Author: Lockal # Author: Macofe +# Author: Mavl # Author: MaxSem # Author: Mechano # Author: Mixaill @@ -52,6 +53,7 @@ # Author: Yuri Nazarov # Author: Zverik # Author: Александр Сигачёв +# Author: Владимир К # Author: Дмитрий # Author: Сrower --- @@ -146,7 +148,7 @@ ru: closed: Закрыто created_html: Создано %{time} назад closed_html: Закрыто %{time} назад - created_by_html: Создано %{time} назад пользовталем + created_by_html: Создано %{time} назад пользователем %{user} deleted_by_html: Удалено %{time} назад пользователем %{user} @@ -224,9 +226,9 @@ ru: changeset: пакета правок note: примечание redacted: - redaction: Редакция %{id} - message_html: Версия %{version} этого объекта вырезана и не может быть отображена. - Смотрите %{redaction_link} для дополнительной информации. + redaction: Исправление %{id} + message_html: Версия %{version} этого объекта (%{type}) скрыта и не может быть + отображена. Пожалуйста, смотрите %{redaction_link} для дополнительной информации. type: node: точка way: линия @@ -1369,6 +1371,7 @@ ru: Отметка недалеко от %{place}.' details: Подробнее о заметке %{url}. changeset_comment_notification: + hi: Привет, %{to_user}, greeting: Привет, commented: subject_own: '[OpenStreetMap] %{commenter} прокомментировал один из ваших @@ -1382,6 +1385,8 @@ ru: partial_changeset_with_comment: с комментарием '%{changeset_comment}' partial_changeset_without_comment: без комментария details: Дополнительные сведения о пакете правок можно найти на %{url}. + unsubscribe: Чтобы отписаться от обновлений этого пакета правок посетите %{url} + и нажмите кнопку "Отписаться". message: inbox: title: Входящие @@ -1723,6 +1728,8 @@ ru: require_moderator: not_a_moderator: Чтобы выполнить это действие, нужно быть модератором. setup_user_auth: + blocked_zero_hour: У вас есть срочное сообщение на сайте OpenStreetMap. Вам + нужно прочитать сообщение, прежде чем вы сможете сохранить ваши изменения. blocked: Ваш доступ к API заблокирован. Пожалуйста, войдите через веб-интерфейсе, чтобы узнать подробности. need_to_see_terms: Ваш доступ к API временно приостановлен. Пожалуйста войдите @@ -1739,8 +1746,7 @@ ru: allow_write_prefs: изменять ваши настройки на сайте allow_write_diary: создавать дневниковые записи, комментарии, заводить друзей allow_write_api: изменять данные - allow_read_gpx: читать ваши частные - GPS-треки + allow_read_gpx: читать ваши частные GPS-треки allow_write_gpx: передавать GPS-треки на сервер allow_write_notes: изменять заметки grant_access: Предоставить доступ @@ -2009,16 +2015,16 @@ ru: revoke: administrator: Отозвать права администратора moderator: Отозвать права модератора - block_history: Активные Блоки - moderator_history: созданные блокировки + block_history: Активные блокировки + moderator_history: Созданные блокировки comments: Комментарии - create_block: Блокировать участника - activate_user: активировать пользователя - deactivate_user: деактивировать пользователя - confirm_user: подтвердить пользователя - hide_user: скрыть пользователя - unhide_user: отобразить пользователя - delete_user: удалить пользователя + create_block: Блокировать этого пользователя + activate_user: Активировать этого пользователя + deactivate_user: Деактивировать этого пользователя + confirm_user: Подтвердить этого пользователя + hide_user: Скрыть этого пользователя + unhide_user: Отобразить этого пользователя + delete_user: Удалить этого пользователя confirm: Подтвердить friends_changesets: наборы правок друзей friends_diaries: дневники друзей @@ -2198,68 +2204,68 @@ ru: проверьте, что пользователь и роль являются допустимыми. user_block: model: - non_moderator_update: Нужно быть модератором, чтобы создать или изменить блокирование. - non_moderator_revoke: Нужно быть модератором, чтобы снять блокирование. + non_moderator_update: Нужно быть модератором, чтобы создать или изменить блокировку. + non_moderator_revoke: Нужно быть модератором, чтобы снять блокировку. not_found: - sorry: Извините, блокирование пользователя с ID %{id} не найдено. + sorry: Извините, блокировка пользователя с ID %{id} не найдена. back: Вернуться к индексу new: - title: Создание блокирования для пользователя %{name} - heading: Создание блокирования для пользователя %{name} - reason: Объясните, почему %{name} был заблокирован. Пожалуйста, будьте терпимы - и поступайте разумно, предоставляя пользователю, как можно больше информации - о причинах блокирования, помня, что сообщение будет видно всем. Помните, что - не все пользователи понимают жаргон, потому пользуйтесь при объяснении дилетантским - языком. + title: Создание блокировки для пользователя %{name} + heading: Создание блокировки для пользователя %{name} + reason: Причина, по которой блокируется пользователь %{name}. Пожалуйста, будьте + спокойны и разумны насколько это возможно. Предоставьте пользователю как можно + больше информации о причинах блокировки, помня, что сообщение будет видно + всем. Имейте в виду, что не все пользователи понимают жаргон сообщества, поэтому + попробуйте использовать дилетантские понятия. period: Как долго, начиная с этого момента, пользователь будет заблокирован от API. - submit: Создать блокирование + submit: Создать блокировку tried_contacting: Я связывался с пользователем и просил его остановиться. tried_waiting: Я дал достаточно времени пользователю, чтобы он отреагировал на те сообщения. - needs_view: Пользователю необходимо войти в систему до того, как это блокирование - будет очищено - back: Показать все блокирования + needs_view: Пользователю необходимо войти в систему до того, как эта блокировка + будет снята + back: Показать все блокировки edit: - title: Правка блокирования пользователя %{name} - heading: Правка блокирования пользователя %{name} + title: Правка блокировки пользователя %{name} + heading: Правка блокировки пользователя %{name} reason: Объясните, почему %{name} был заблокирован. Пожалуйста, будьте терпимы и поступайте разумно, предоставляя пользователю, как можно больше информации о ситуации. Помните, что не все пользователи понимают жаргон, потому пользуйтесь при объяснении дилетантским языком. period: На какой срок, начиная с этого момента, заблокировать пользователя от API. - submit: Обновить блокирование + submit: Обновить блокировку show: Просмотреть эту блокировку - back: Просмотреть все блокирования - needs_view: Позволить ли пользователю входить в систему, прежде, чем блокирование - будет снято? + back: Просмотреть все блокировки + needs_view: Позволить ли пользователю входить в систему, прежде, чем блокировка + будет снята? filter: - block_expired: Блокирование уже закончилось и не может быть отредактировано. - block_period: Время блокирования должно быть выбрано из значений, рвзворачивающегося - списка. + block_expired: Блокировка уже закончилась и не может быть отредактирована. + block_period: Период блокировки должен быть одним из значений, выбираемых из + выпадающего списка. create: try_contacting: Пожалуйста, перед блокировкой пользователя попробуйте связаться с ним и дать ему разумное время для ответа. - try_waiting: Пожалуйста, дайте пользователю разумное время для ответа, перед + try_waiting: Пожалуйста, дайте пользователю разумное время для ответа перед тем, как блокировать его. - flash: Заблокирован пользователь %{name}. + flash: Создана блокировка для пользователя %{name}. update: - only_creator_can_edit: Только модератор, который создал это блокирование, может - править его. - success: Блокирование обновлено. + only_creator_can_edit: Только модератор, который создал эту блокировку, может + править её. + success: Блокировка обновлена. index: - title: Блокировки участника - heading: Список блокирований пользователя - empty: Блокирования ещё не были созданы. + title: Блокировки пользователей + heading: Список блокировок пользователей + empty: Блокировки ещё не были созданы. revoke: - title: Снять блокирование для %{block_on} - heading: Отмена блокирования для пользователя %{block_on}, которое создал %{block_by} - time_future: Это блокирование закончится %{time}. - past: Это блокирование закончилось %{time} назад и уже не может быть отменено. - confirm: Вы уверены, что хотите снять это блокирование? - revoke: Снять блокирование! - flash: Это блокирование было снято. + title: Снять блокировку для %{block_on} + heading: Отмена блокировки для пользователя %{block_on}, которую создал %{block_by} + time_future: Эта блокировка закончится через %{time}. + past: Эта блокировка закончилась %{time} назад и уже не может быть отменена. + confirm: Вы уверены, что хотите снять эту блокировку? + revoke: Снять блокировку! + flash: Эта блокировка была снята. period: one: 1 час other: '%{count} час.' @@ -2270,7 +2276,7 @@ ru: confirm: Вы уверены? display_name: Заблокированный пользователь creator_name: Автор - reason: Причина блокирования + reason: Причина блокировки status: Состояние revoker_name: Разблокировал not_revoked: (не разблокирован) @@ -2278,21 +2284,23 @@ ru: next: Следующая → previous: ← Предыдущая helper: - time_future: Заканчивается в %{time}. + time_future: Заканчивается через %{time}. until_login: Активно до тех пор, пока пользователь не войдёт в систему. + time_future_and_until_login: Заканчивается через %{time} и после того, как пользователь + вошел в систему. time_past: Закончилось %{time} назад. blocks_on: - title: Блокирования для %{name} - heading: Список блокирований пользователя %{name} + title: Блокировки для %{name} + heading: Список блокировок пользователя %{name} empty: ' %{name} ни разу не был заблокирован.' blocks_by: - title: Блокирования, которые сделал - heading: Список блокирований, которые сделал + title: Блокировки, которые создал %{name} + heading: Список блокировок, которые создал %{name} empty: '%{name} ещё не делал никаких блокирований.' show: title: '%{block_on}, наложил блокировку: %{block_by}' heading: '%{block_on}, наложил блокировку: %{block_by}' - time_future: Заканчивается %{time} + time_future: Заканчивается через %{time} time_past: Закончилась %{time} назад created: Создано ago: '%{time} назад' @@ -2383,6 +2391,7 @@ ru: header: Слои карты notes: Заметки data: Просмотр данных карты + gps: Общедоступные GPS-треки overlays: Дополнительные слои для устранения неисправностей карты title: Слои copyright: © Участники OpenStreetMap @@ -2439,7 +2448,7 @@ ru: no_place: К сожалению, данное место не найдено. instructions: continue_without_exit: Продолжите по %{name} - slight_right_without_exit: Слегка направо на %{name} + slight_right_without_exit: Плавный поворот направо на %{name} offramp_right_without_exit: Используйте съезд вправо на %{name} onramp_right_without_exit: Поверните направо на съезде на %{name} endofroad_right_without_exit: В конце дороги поверните направо на %{name} @@ -2455,7 +2464,7 @@ ru: endofroad_left_without_exit: В конце дороги поверните налево на %{name} merge_left_without_exit: Перестройтесь налево на %{name} fork_left_without_exit: На развилке поверните налево на %{name} - slight_left_without_exit: Слегка влево на %{name} + slight_left_without_exit: Плавный поворот налево на %{name} via_point_without_exit: (через точку) follow_without_exit: Следуйте %{name} roundabout_without_exit: На развязке сверните к %{name} @@ -2467,7 +2476,9 @@ ru: end_oneway_without_exit: Конец одностороннего движения на %{name} roundabout_with_exit: На развязке выберите выход %{exit} на %{name} turn_left_with_exit: На круговой развязке поверните налево на %{name} + slight_left_with_exit: На круговой развязке плавный поворот налево на %{name} turn_right_with_exit: На круговой развязке поверните направо на %{name} + slight_right_with_exit: На круговой развязке плавный поворот направо на %{name} continue_with_exit: На круговой развязке продолжайте движение прямо на %{name} unnamed: без имени courtesy: Маршрут предоставлен %{link} @@ -2479,6 +2490,13 @@ ru: nothing_found: Объектов поблизости нет error: 'Ошибка связи с %{server}: %{error}' timeout: Тайм-аут обращения к %{server} + context: + directions_from: Маршрут отсюда + directions_to: Маршрут сюда + add_note: Добавить заметку сюда + show_address: Показать адрес + query_features: Информация об объектах + centre_map: Центрировать карту redaction: edit: description: Описание @@ -2499,16 +2517,16 @@ ru: heading: Отображение исправления «%{title}» title: Отображение исправления user: 'Создано:' - edit: Редактировать это исправление + edit: Править это исправление destroy: Удалить это исправление confirm: Вы уверены? create: - flash: Редакция создана. + flash: Исправление создано. update: flash: Изменения сохранены. destroy: - not_empty: Редакция не пуста. Пожалуйста, откатите все версии, принадлежащие - к этой редакции перед удалением. - flash: Редакция уничтожена. - error: Произошла ошибка при уничтожении этой редакции. + not_empty: Исправление не пусто. Пожалуйста, отмените скрытие всех версий объектов, + принадлежащих к этому исправлению перед удалением. + flash: Исправление уничтожено. + error: Произошла ошибка при уничтожении этого исправления. ... diff --git a/config/locales/sk.yml b/config/locales/sk.yml index 735effe7d..d3c751e7e 100644 --- a/config/locales/sk.yml +++ b/config/locales/sk.yml @@ -919,7 +919,6 @@ sk: partners_ic: Imperial College v Londýne partners_bytemark: Bytemark Hosting partners_partners: partneri - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: OpenStreetMap databáza je teraz offline, zatiaľ čo potrebná údržba databázy naďalej prebieha. osm_read_only: OpenStreetMap databáza je teraz len v móde čítania (bez možnosti diff --git a/config/locales/sl.yml b/config/locales/sl.yml index 352e3b940..16322debc 100644 --- a/config/locales/sl.yml +++ b/config/locales/sl.yml @@ -188,6 +188,9 @@ sl: way: pot relation: zveza start_rjs: + feature_warning: Nalaganje %{num_features}-ih značilnosti, kar lahko upočasni + brskalnik ali ga naredi neodzivnega. Ali ste prepričani, da želite prikazati + te podatke? load_data: Naloži podatke loading: Nalaganje ... tag_details: @@ -195,7 +198,8 @@ sl: wiki_link: key: Wiki stran z opisom oznake %{key} tag: Wiki stran z opisom oznake %{key}=%{value} - wikipedia_link: '%{page} članek na Wikipediji' + wikidata_link: Element %{page} na strani Wikidata + wikipedia_link: Članek %{page} na Wikipediji telephone_link: Pokliči %{phone_number} note: title: 'Opomba: %{id}' @@ -235,7 +239,7 @@ sl: saved_at: Shranjen user: Uporabnik comment: Komentar - area: Področje + area: Območje list: title: Paketi sprememb title_user: Paketi sprememb uporabnika %{user} @@ -349,9 +353,9 @@ sl: Data Commons Open Database License (ODbL). too_large: advice: 'Če zgornji izvoz spodleti, uporabite enega od spodnjih virov:' - body: 'To področje je preveliko za izvoz v OpenStreetMap XML. Prosimo, da - se približate ali izberete manjÅ¡e območje ali pa da uporabite enega od naslednjih - virov za obsežen prenos podatkov:' + body: 'To področje je preveliko za izvoz v XML OpenStreetMap. Prosimo, da + se približate ali izberete manjÅ¡e področje ali pa da uporabite enega od + naslednjih virov za obsežen prenos podatkov:' planet: title: Planet OSM description: Redno posodabljane kopije celotne podatkovne zbirke OpenStreetMap @@ -450,6 +454,7 @@ sl: ferry_terminal: Trajekt fire_hydrant: Hidrant fire_station: Gasilska postaja + food_court: Prehrambeni prostor fountain: Vodomet fuel: Bencinska črpalka gambling: Igre na srečo @@ -504,12 +509,13 @@ sl: veterinary: Veterinarska klinika village_hall: VaÅ¡ko središče waste_basket: KoÅ¡ za odpadke + waste_disposal: Zabojnik za odpadke youth_centre: Mladinski center boundary: administrative: Upravna meja census: Popisna meja national_park: Nacionalni Park - protected_area: Zavarovano območje + protected_area: Zavarovano področje bridge: aqueduct: Akvadukt suspension: Viseči most @@ -532,6 +538,7 @@ sl: emergency: ambulance_station: ReÅ¡evalna postaja defibrillator: Defibrilator + landing_site: Mesto za pristanek v sili phone: Klic v sili highway: abandoned: Opuščena cesta @@ -569,6 +576,7 @@ sl: tertiary: Lokalna cesta tertiary_link: Terciarna cesta track: Kolovoz + traffic_signals: Prometna signalizacija trail: Sled trunk: Hitra cesta trunk_link: Priključek na hitro cesto @@ -586,6 +594,7 @@ sl: city_gate: Mestna vrata citywalls: Mestno obzidje fort: Trdnjava + heritage: Kulturna dediščina house: HiÅ¡a icon: Ikona manor: Graščina @@ -608,28 +617,29 @@ sl: brownfield: Gradbišče cemetery: Pokopališče commercial: Poslovna cona - conservation: ZaÅ¡tićeno področje + conservation: Zaščiteno področje construction: Gradbišče farm: Kmetija farmland: Kmetijsko zemljišče farmyard: Vrt forest: Gozd garages: Garaže - grass: Travnik + grass: Trata greenfield: Pripravljeno za gradbišče industrial: Industrijsko podočje landfill: Smetišče meadow: Travnik - military: VojaÅ¡ko območje + military: VojaÅ¡ko področje mine: Minsko polje orchard: Sadovnjak - quarry: Dnevni kop + quarry: Kamnolom railway: Železnica - recreation_ground: Rekreacijsko območje + recreation_ground: Rekreacijsko področje reservoir: Zbiralnik - residential: Stanovanjska cona + reservoir_watershed: Vodno zajetje + residential: Stanovanjsko področje retail: Trgovine - road: Območje ceste + road: Področje ceste village_green: Zelenica vineyard: Vinograd "yes": Raba tal @@ -638,11 +648,12 @@ sl: bird_hide: Ptičja opazovalnica club: Klub common: Javno zemljišče - fishing: Ribolovno območje + dog_park: Pasji park + fishing: Ribolovno področje fitness_centre: Fitnes center fitness_station: Fitnes center garden: Vrt - golf_course: Igrišče za Golf + golf_course: Igrišče za golf horse_riding: Jahanje ice_rink: Drsališče marina: Marina @@ -651,7 +662,8 @@ sl: park: Park pitch: Å portno igrišče playground: OtroÅ¡ko igrišče - recreation_ground: Rekreacijsko območje + recreation_ground: Rekreacijsko področje + resort: Letovišče sauna: Savna slipway: Rampa sports_centre: Å portni center @@ -676,7 +688,7 @@ sl: beach: Obala cape: Rt cave_entrance: Vhod v jamo - cliff: Klif + cliff: Pečina crater: Krater dune: Peščina fell: Planina @@ -684,6 +696,7 @@ sl: forest: Gozd geyser: Gejzir glacier: Ledenik + grassland: PaÅ¡nik heath: Ravnina hill: Hrib island: Otok @@ -725,6 +738,7 @@ sl: "yes": Pisarne place: allotments: Vrtički + block: Blok airport: Letališče city: Mesto country: Država @@ -743,11 +757,11 @@ sl: postcode: PoÅ¡tna Å¡tevilka region: Regija sea: Morje - state: 'Država (ZDA):' + state: 'Zvezna država (ZDA):' subdivision: Pododdelek suburb: Predmestje town: Mesto - unincorporated_area: NikogarÅ¡nje območje + unincorporated_area: NikogarÅ¡nje področje village: Vas "yes": Kraj railway: @@ -840,7 +854,7 @@ sl: salon: Lepotilni salon second_hand: Trgovina z rabljeno opremo shoes: Trgovina s čevlji - shopping_centre: Nakupovalno središče + shopping_centre: Nakupovalni center sports: Å portna trgovina stationery: Papirnica supermarket: Supermarket @@ -939,7 +953,7 @@ sl: vi, brezplačen za uporabo z odprto licenco. intro_2_create_account: Ustvarite uporabniÅ¡ki račun partners_html: Gostovanje podpira %{ucl}, %{ic} in %{bytemark}, ter ostali %{partners}. - partners_ucl: UCL VR Center + partners_ucl: Center UCL VR partners_ic: Imperial College v Londonu partners_bytemark: Bytemark Hosting partners_partners: partnerji @@ -1008,9 +1022,11 @@ sl: node_html: Vozlišče je točka na zemljevidu, kot npr. restavracija ali drevo. way_html: Pot je črta ali področje, kot je npr. cesta, potok, - jezero ali stavba. + jezero ali zgradba. tag_html: Oznaka je podatek o vozlišču ali poti, kot je npr. ime restavracija ali omejitev hitrosti na cesti. + rules: + title: Pravila! questions: title: Imate kakÅ¡no vpraÅ¡anja? paragraph_1_html: |- @@ -1044,7 +1060,10 @@ sl: description: Začnite s tem hitrim vodičem, ki zajema osnove OpenStreetMap. beginners_guide: url: http://wiki.openstreetmap.org/wiki/Sl:Beginners%27_guide + title: Vodnik za začetnike + description: Vodnik za začetnike, ki ga vzdržuje skupnost. help: + url: https://help.openstreetmap.org/ description: Zastavite vpraÅ¡anje ali poiščete odgovore v OSM zbirki vpraÅ¡anj in odgovorov. wiki: @@ -1156,6 +1175,7 @@ sl: ki ste jo vi komentirali. Opomba je v bližini %{place}.' details: Več podrobnosti o opombi lahko najdete na %{url}. changeset_comment_notification: + hi: Pozdravljeni, %{to_user}, greeting: Pozdravljeni, commented: subject_own: '[OpenStreetMap] %{commenter} je komentiral enega izmed vaÅ¡ih @@ -1312,7 +1332,7 @@ sl: - Mestna železnica - tramvaj cable: - - Kabinska žičnica + - Nihalka - sedežnica runway: - Vzletno-pristajalna steza @@ -1323,15 +1343,15 @@ sl: admin: Upravna razmejitev forest: Gozd wood: Pragozd - golf: Igrišče za Golf + golf: Igrišče za golf park: Park resident: Naselje common: - Travniki - travnik - retail: Trgovsko območje + retail: Trgovsko področje industrial: Industrijsko področje - commercial: Poslovno območje + commercial: Poslovno področje heathland: Grmičevje lake: - Jezero @@ -1601,9 +1621,10 @@ sl: remember: 'Zapomni si me:' lost password link: Ste pozabili geslo? login_button: Prijava - register now: Registriraj se + register now: Registrirajte se with username: 'Že imate OpenStreetMap račun? Prosim, prijavite se s svojim uporabniÅ¡kim imenom in geslom:' + with external: 'Lahko pa uporabite prijavo tretje osebe:' new to osm: Ste novi na OpenStreetMap? to make changes: Če želite spreminjati podatke na OpenStreetMap, morate imeti račun. @@ -1679,6 +1700,7 @@ sl: kasneje v nastavitvah. password: 'Geslo:' confirm password: 'Potrdite geslo:' + use external auth: Lahko pa uporabite prijavo tretje osebe continue: Registracija terms accepted: Hvala za sprejem novih pogojev prispevanja! terms declined: Žal nam je, da ste se odločili, da ne sprejmete novih "contributor @@ -1708,6 +1730,7 @@ sl: heading: Uporabnik %{user} ne obstaja body: Oprostite, uporabnika z imenom %{user} ni. Prosimo, preverite črkovanje in povezavo, ki ste jo kliknili. + deleted: izbrisano view: my diary: Moj dnevnik new diary entry: nov vnos v dnevnik @@ -1904,6 +1927,15 @@ sl: auth_failure: connection_failed: Povezava do storitve za preverjanje pristnosti ni uspela invalid_credentials: Neveljavne poverilnice za preverjanje pristnosti + no_authorization_code: Ni pooblastitvene kode + unknown_signature_algorithm: Neznan algoritem podpisa + invalid_scope: Neveljaven obseg + auth_association: + heading: VaÅ¡ ID Å¡e ni povezan z računom OpenStreetMap. + option_1: Če ste novi v OpenStreetMapu, prosimo, ustvarite nov račun z uporabo + spodnjega obrazca. + option_2: Če že imate račun, se lahko v njega prijavite s svojim uporabniÅ¡kim + imenom in geslom in ga v nastavitvah povežete s svojim ID-jem. user_role: filter: not_an_administrator: Samo skrbniki lahko upravljajo vlogo uporabnika, vi pa @@ -1979,7 +2011,7 @@ sl: heading: Preklic blokade za %{block_on} od %{block_by} time_future: Ta blokada se bo končala v %{time}. past: Ta blokada se je končala pred %{time} in se ne more biti več preklicati. - confirm: Ste prepričani, da želite preklicati blokado? + confirm: Ali ste prepričani, da želite preklicati blokado? revoke: Prekliči! flash: Ta blokada je bila preklicana. period: @@ -2004,6 +2036,7 @@ sl: helper: time_future: Konča v %{time}. until_login: Aktivna dokler uporabnik se prijavi. + time_future_and_until_login: Konča se čez %{time} in ko se uporabnik prijavi. time_past: Je končala %{time} nazaj. blocks_on: title: Blokade uporabnika %{name} @@ -2018,6 +2051,8 @@ sl: heading: '%{block_on} je blokiral %{block_by}' time_future: Konča v %{time} time_past: Je končala %{time} nazaj + created: Ustvarjeno + ago: '%{time} nazaj' status: Stanje show: Prikaži edit: Uredi @@ -2080,6 +2115,9 @@ sl: center_marker: Centriraj zemljevid na oznako paste_html: Prilepi HTML za vdelavo v spletno mesto view_larger_map: Prikaži večji zemljevid + only_standard_layer: Samo standardno plast je mogoče izvoziti kot sliko + embed: + report_problem: Prijavi težavo key: title: Ključ zemljevida tooltip: Ključ zemljevida @@ -2156,14 +2194,57 @@ sl: no_route: Ni mogoče najti poti med tema dvema položajema. no_place: Žal tega kraja ni bilo mogoče najti. instructions: + continue_without_exit: Nadaljujte po %{name} + slight_right_without_exit: Rahlo desno na %{name} + offramp_right_without_exit: Zapeljite na priključek na desni in nato na %{name} + onramp_right_without_exit: Na priključku zavijte desno na %{name} + endofroad_right_without_exit: Na koncu ceste zavijte desno na %{name} + merge_right_without_exit: Zapeljite rahlo desno na %{name} + fork_right_without_exit: Na razcepu zavijte desno na %{name} + turn_right_without_exit: Zavijte desno na %{name} + sharp_right_without_exit: Ostro desno na %{name} + uturn_without_exit: Polkrožno obrnite po %{name} + sharp_left_without_exit: Ostro levo na %{name} + turn_left_without_exit: Zavijte levo na %{name} + offramp_left_without_exit: Zapeljite na priključek na levi in nato na %{name} + onramp_left_without_exit: Na priključku zavijte levo na %{name} + endofroad_left_without_exit: Na koncu ceste zavijete levo na %{name} + merge_left_without_exit: Zapeljite rahlo levo na %{name} + fork_left_without_exit: Na razcepu zavijte levo na %{name} + slight_left_without_exit: Rahlo levo na %{name} + via_point_without_exit: (prehodna točka) + follow_without_exit: Sledite %{name} + roundabout_without_exit: V krožišču uporabite %{name} + leave_roundabout_without_exit: Zapustite krožišče - %{name} + stay_roundabout_without_exit: Ostanite v krožišču - %{name} + start_without_exit: Začnite na koncu %{name} + destination_without_exit: Pojdite do cilja + against_oneway_without_exit: Pojdite po enosmerni cesti na %{name} + end_oneway_without_exit: Konec enosmerne ceste na %{name} + roundabout_with_exit: V krožišču uporabite %{exit}. izhod, da zapeljete na + %{name} + turn_left_with_exit: V krožišču zavijte levo na %{name} + slight_left_with_exit: V krožišču rahlo levo na %{name} + turn_right_with_exit: V krožišču zavijete desno na %{name} + slight_right_with_exit: V krožišču rahlo desno na %{name} + continue_with_exit: Na krožišču nadaljujte naravnost na %{name} unnamed: neimenovano - courtesy: Navodila je ponudil %{link} + courtesy: Navodila prispeva %{link} time: Čas query: node: Vozlišče way: Pot relation: Zveza nothing_found: Značilnosti ni bilo mogoče najti + error: 'Napaka pri povezovanju s strežnikom %{server}: %{error}' + timeout: Časovna omejitev povezovanja s strežnikom %{server} + context: + directions_from: Navodila za pot od tu + directions_to: Navodila za pot do tu + add_note: Tu dodaj opombo + show_address: Prikaži naslov + query_features: Poišči značilnosti + centre_map: Premakni na sredino redaction: edit: description: Opis @@ -2192,8 +2273,8 @@ sl: update: flash: Spremembe shranjene. destroy: - not_empty: Redakcija ni prazna. Prosim od-revidirajte vse različice, ki pripadajo - tej redakciji preden jo uničite. + not_empty: Redakcija ni prazna. Prosim odrevidirajte vse različice, ki pripadajo + tej redakciji, preden jo uničite. flash: Redakcija uničena. - error: PriÅ¡lo je do napake, ob uničevanju te redakcije. + error: PriÅ¡lo je do napake ob uničevanju te redakcije. ... diff --git a/config/locales/sv.yml b/config/locales/sv.yml index 4ab28ea6d..57ecd45ad 100644 --- a/config/locales/sv.yml +++ b/config/locales/sv.yml @@ -987,7 +987,6 @@ sv: partners_ic: Imperial College London partners_bytemark: Bytemark Hosting partners_partners: partners - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: OpenStreetMap-databasen är inte tillgänglig just nu, dÃ¥ nödvändigt databasunderhÃ¥ll pÃ¥gÃ¥r. osm_read_only: OpenStreetMap-databasen är skrivskyddad just nu, dÃ¥ nödvändigt @@ -1366,6 +1365,7 @@ sv: pÃ¥. Noteringen är nära %{place}.' details: Mer detaljer om anteckningen finns pÃ¥ %{url}. changeset_comment_notification: + hi: Hej %{to_user}, greeting: Hej, commented: subject_own: '[OpenStreetMap] %{commenter} har kommenterat pÃ¥ en av dina ändringsset' @@ -1378,6 +1378,8 @@ sv: partial_changeset_with_comment: med kommentar '%{changeset_comment}' partial_changeset_without_comment: utan kommentar details: Mer detaljer om ändringssetet finns pÃ¥ %{url}. + unsubscribe: För att avsluta prenumerationen frÃ¥n uppdatering i denna ändringsgrupp, + besök %{url} och klicka pÃ¥ "Avprenumerera". message: inbox: title: Inkorg @@ -2445,6 +2447,8 @@ sv: nothing_found: Inga sökresultat hittades error: 'Problem med att kontakta %{server}: %{error}' timeout: Timeout vid kontakt med %{server} + context: + show_address: Visa adress redaction: edit: description: Beskrivning diff --git a/config/locales/te.yml b/config/locales/te.yml index 01b684276..bfad7e408 100644 --- a/config/locales/te.yml +++ b/config/locales/te.yml @@ -95,6 +95,9 @@ te: discussion: చర్చ node: title: 'బిందువు: %{name}' + way: + title: 'దారి: %{name}' + history_title: 'దారి చరిత్ర: %{name}' relation: title: 'సంబంధం: %{name}' history_title: 'సంబంధపు చరిత్ర: %{name}' @@ -415,6 +418,8 @@ te: house: ఇల్లు houses: ఇళ్ళు island: దీవి + postcode: తపాలా సంకేతం + region: ప్రాంతం sea: సముద్రం state: రాష్ట్రం subdivision: ఉపవిభాగం @@ -494,11 +499,17 @@ te: title: ఈ పుట గురించి legal_babble: title_html: కాపీహక్కులు మరియు లైసెన్సు + attribution_example: + title: ఆపాదింపు ఉదాహరణ + more_title_html: మరింత తెలుసుకోవడం infringement_title_html: కాపీహక్కుల ఉల్లంఘన + trademarks_title_html: ట్రేడుమార్కులు welcome_page: title: స్వాగతం! whats_on_the_map: title: పటంలో ఏముంది + rules: + title: నియమాలు! questions: title: సందేహాలున్నాయా? add_a_note: @@ -532,6 +543,8 @@ te: click_the_link: అది మీరే అయితే, మార్పుని నిర్ధారించడానికి ఈ క్రింది లంకెను నొక్కండి. note_comment_notification: anonymous: అజ్ఞాత వాడుకరి + changeset_comment_notification: + hi: '%{to_user} గారూ,' message: inbox: my_inbox: నా ఇన్‌బాక్స్ @@ -869,16 +882,26 @@ te: changesets: show: comment: వ్యాఖ్య + subscribe: చందాచేరు + unsubscribe: చందావిరమించు + hide_comment: దాచు + unhide_comment: చూపించు notes: show: hide: దాచు comment_and_resolve: వ్యాఖ్యానించి పరిష్కరించండి comment: వ్యాఖ్యానించండి directions: + directions: దిశలు distance: దూరం time: సమయం query: relation: సంబంధం + context: + directions_from: ఇక్కడి నుండి దిశలు + directions_to: ఇక్కడికి దిశలు + show_address: చిరునామా చూపించు + centre_map: ఈచోటును పటానికి కేంద్రం చేయి redaction: edit: description: వివరణ diff --git a/config/locales/tl.yml b/config/locales/tl.yml index eb6915e4b..d3ac510dd 100644 --- a/config/locales/tl.yml +++ b/config/locales/tl.yml @@ -778,7 +778,6 @@ tl: partners_ic: Dalubhasaang Pang-imperyo Londres partners_bytemark: Pagpapasinaya ng Bytemark partners_partners: mga kawaksi - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: Ang kalipunan ng dato ng OpenStreetMap ay pangkasalukuyang nakapatay habang isinasagawa ang mahalagang gawain ng pagpapanatili ng kalipunan ng dato. osm_read_only: Ang kalipunan ng dato ng OpenStreetMap ay pangkasalukuyang nasa diff --git a/config/locales/tr.yml b/config/locales/tr.yml index 9b50f41be..63d2b3a2b 100644 --- a/config/locales/tr.yml +++ b/config/locales/tr.yml @@ -3,6 +3,7 @@ # Export driver: phpyaml # Author: Alerque # Author: Alpkant +# Author: Archaeodontosaurus # Author: Captantrips # Author: Emperyan # Author: Erdemaslancan @@ -1004,6 +1005,7 @@ tr: alt: Web sayfasıında OpenStreetMap atıf etmek için bir örnek title: Atıf örneği contributors_title_html: Katkıcılarımız + infringement_title_html: Telif hakkı ihlali welcome_page: title: Hoş geldiniz! introduction_html: Dünyanın düzenlenebilir ve ücretsiz haritası OpenStreetMap'e @@ -1071,6 +1073,8 @@ tr: title: Forumlar irc: title: IRC + switch2osm: + title: switch2osm wiki: url: http://wiki.openstreetmap.org/ title: wiki.openstreetmap.org @@ -1139,6 +1143,7 @@ tr: subject_own: '[OpenStreetMap] notlarından birisini %{commenter} tarafından yorumlandı' changeset_comment_notification: + hi: Merhaba %{to_user}, greeting: Merhaba, commented: partial_changeset_without_comment: yorumsuz @@ -1282,6 +1287,7 @@ tr: private: Özel giriş destination: Hedef noktası construction: yapım aşamasında yolu + toilets: Tuvaletler richtext_area: edit: Düzenle preview: Ön izle @@ -1801,6 +1807,13 @@ tr: comment: Yorum edit_help: Haritayı sürükleyip ve düzenleme yapmak istediğiniz konuma yakınlaştırdıktan sonra buraya tıklayın. + context: + directions_from: Buradan yönlendir + directions_to: Buraya yönlendir + add_note: Burada bir not ekle + show_address: Adresi göster + query_features: Özellikleri göster + centre_map: Haritayı buraya ortala redaction: edit: description: Açıklama diff --git a/config/locales/uk.yml b/config/locales/uk.yml index 1bb10997a..772a0cfe3 100644 --- a/config/locales/uk.yml +++ b/config/locales/uk.yml @@ -1337,6 +1337,7 @@ uk: біля %{place}.' details: Докладніше про нотатку %{url}. changeset_comment_notification: + hi: Привіт %{to_user}, greeting: Привіт, commented: subject_own: '[OpenStreetMap] %{commenter} прокоментував один з ваших наборів @@ -1352,6 +1353,8 @@ uk: details: |2- Більше деталей про зміни, які можуть бути знайдені в %{url}. + unsubscribe: Щоб відписатися від оновлень за цим набором змін, перейдіть за + посиланням %{url} й натисніть кнопку „Відписатись“. message: inbox: title: Вхідні @@ -1684,6 +1687,8 @@ uk: require_moderator: not_a_moderator: Ви повинні бути модератором для виконання цієї дії. setup_user_auth: + blocked_zero_hour: У вас є нагальне повідомлення на веб-сайті OpenStreetMap. + Вам потрібно прочитати повідомлення, перш ніж ви зможете зберегти ваші зміни. blocked: Ваш доступ до API заблоковано. Будь ласка, увійдіть через веб-інтерфейс, щоб дізнатися подробиці. need_to_see_terms: Ваш доступ до API тимчасово призупинено. Будь ласка, увійдіть @@ -2235,6 +2240,8 @@ uk: helper: time_future: До закінчення %{time}. until_login: Активне до тих пір, доки користувач не увійде в систему. + time_future_and_until_login: Закінчується через %{time} і після входу користувача + в систему. time_past: Закінчилось %{time} тому. blocks_on: title: Блокування для %{name} @@ -2440,6 +2447,13 @@ uk: nothing_found: Об’єкти не знайдені error: 'Помилка зв’язку %{server}: %{error}' timeout: Сервер не відповідає %{server} + context: + directions_from: Маршрут звідси + directions_to: Маршрут сюди + add_note: Додати тут нотатку + show_address: Показати адресу + query_features: Отримати об’єкти + centre_map: Центрувати мапу тут redaction: edit: description: Опис diff --git a/config/locales/vi.yml b/config/locales/vi.yml index b9281dc07..71d197d67 100644 --- a/config/locales/vi.yml +++ b/config/locales/vi.yml @@ -952,7 +952,6 @@ vi: partners_ic: Đại học Hoàng gia Luân Đôn partners_bytemark: Bytemark Hosting partners_partners: các công ty bảo trợ - partners_url: http://wiki.openstreetmap.org/wiki/Partners?uselang=vi osm_offline: CÆ¡ sở dữ liệu OpenStreetMap đang ngoại tuyến 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. osm_read_only: CÆ¡ sở dữ liệu OpenStreetMap đang bị khóa không được sá»­a đổi trong @@ -1643,6 +1642,8 @@ vi: require_moderator: not_a_moderator: Chỉ có các điều hành viên được phép thá»±c hiện tác vụ đó. setup_user_auth: + blocked_zero_hour: Bạn có tin nhắn mới rất quan trọng tại trang Web OpenStreetMap. + Bạn phải đọc tin nhắn này trước khi được phép lÆ°u thêm thay đổi. blocked: Bạn bị chặn không được truy cập qua API. Vui lòng đăng nhập vào giao diện Web để biết chi tiết. need_to_see_terms: Bạn tạm không có quyền truy cập API. Xin vui lòng đăng nhập @@ -2184,6 +2185,7 @@ vi: helper: time_future: Hết hạn %{time}. until_login: Có hiệu lá»±c cho đến khi người dùng đăng nhập. + time_future_and_until_login: Kết thúc %{time} nữa sau khi người dùng đăng nhập. time_past: Đã hết hạn cách đây %{time}. blocks_on: title: Các tác vụ cấm %{name} @@ -2383,6 +2385,13 @@ vi: nothing_found: Không tìm thấy yếu tố nào error: 'Lỗi khi kết nối với %{server}: %{error}' timeout: Hết thời gian kết nối với %{server} + context: + directions_from: Chỉ đường từ đây + directions_to: Chỉ đường tới đây + add_note: Thêm ghi chú tại đây + show_address: Xem địa chỉ + query_features: Thăm dò yếu tố + centre_map: Tập trung bản đồ tại đây redaction: edit: description: Miêu tả diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml index 3378c085b..55fc55421 100644 --- a/config/locales/zh-CN.yml +++ b/config/locales/zh-CN.yml @@ -960,12 +960,11 @@ zh-CN: intro_header: 欢迎访问 OpenStreetMap! intro_text: OpenStreetMap 是一个世界地图,由像您一样的人们所构筑,可依据开放许可协议自由使用。 intro_2_create_account: 创建用户账户 - partners_html: 主机由%{ucl}、%{ic}、%{bytemark}和其他%{partners}所支持。 + partners_html: 主机由%{ucl}、%{bytemark}和%{ic},以及其他%{partners}所支持。 partners_ucl: 伦敦大学学院虚拟现实中心 partners_ic: 伦敦帝国学院 partners_bytemark: Bytemark主机 partners_partners: 合作伙伴 - partners_url: http://wiki.openstreetmap.org/wiki/Partners osm_offline: 由于正在进行基本的数据库维护工作,OpenStreetMap 数据库目前处于脱机状态。 osm_read_only: 由于正在进行基本的数据库维护工作,OpenStreetMap 数据库目前处于只读模式。 donate: 通过给硬件升级基金%{link}支持 OpenStreetMap。 @@ -1539,6 +1538,7 @@ zh-CN: require_moderator: not_a_moderator: 必须为管理员才能执行该操作。 setup_user_auth: + blocked_zero_hour: 您在OpenStreetMap网站有一条紧急消息。在您可以保存您的编辑之前,您需要阅读这条消息。 blocked: 您对 API 的访问已经被阻挡了。请登录到网站以了解更多信息。 need_to_see_terms: 您对 API 的访问已暂时中止。请登录到网站以查看贡献者条款。您不需要同意,但必须查看它们。 oauth: @@ -2019,6 +2019,7 @@ zh-CN: helper: time_future: 结束于 %{time}。 until_login: 用户登录时激活。 + time_future_and_until_login: 结束于%{time},并在用户登录之后。 time_past: 结束于 %{time} 前。 blocks_on: title: 对 %{name} 的封禁 @@ -2213,6 +2214,13 @@ zh-CN: nothing_found: 没有找到特征 error: 连接 %{server} 时出错:%{error} timeout: 连接 %{server} 超时 + context: + directions_from: 从这里的指示 + directions_to: 到这里的指示 + add_note: 在此添加注释 + show_address: 显示地址 + query_features: 查询特征 + centre_map: 中心地图在此 redaction: edit: description: 说明 diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml index 29495539c..02de6645d 100644 --- a/config/locales/zh-TW.yml +++ b/config/locales/zh-TW.yml @@ -1559,6 +1559,7 @@ zh-TW: require_moderator: not_a_moderator: 您需要是管理人員,才可執行該動作。 setup_user_auth: + blocked_zero_hour: 您在OpenStreetMap網站有一個緊急訊息。在您儲存您的編輯內容前請先閱讀該訊息。 blocked: 您已經被封鎖使用 API。請登入網頁介面以瞭解更多資訊。 need_to_see_terms: 我們已暫時中止您使用 API 的權限,請登入網頁介面查閱貢獻者條款,您不需要同意有關條款,但必須查閱它們。 oauth: @@ -2031,6 +2032,7 @@ zh-TW: helper: time_future: 於 %{time} 結束。 until_login: 生效直至這個使用者登入為止。 + time_future_and_until_login: 在用戶已登入後結束於%{time}。 time_past: 於 %{time} 之前結束。 blocks_on: title: 對 %{name} 的封鎖 @@ -2224,6 +2226,13 @@ zh-TW: nothing_found: 找不到圖徵 error: '%{server} 連線錯誤:%{error}' timeout: '%{server} 連線逾時' + context: + directions_from: 從這裡的路線 + directions_to: 到這裡的路線 + add_note: 在此添加註釋 + show_address: 顯示地址 + query_features: 查詢圖徵 + centre_map: 中央地圖在此 redaction: edit: description: 說明 diff --git a/db/migrate/20170222134109_add_user_indexes.rb b/db/migrate/20170222134109_add_user_indexes.rb new file mode 100644 index 000000000..62330df9c --- /dev/null +++ b/db/migrate/20170222134109_add_user_indexes.rb @@ -0,0 +1,6 @@ +class AddUserIndexes < ActiveRecord::Migration + def change + add_index :oauth_tokens, [:user_id] + add_index :client_applications, [:user_id] + end +end diff --git a/db/structure.sql b/db/structure.sql index 63af3304d..020d5fb16 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -2,8 +2,8 @@ -- PostgreSQL database dump -- --- Dumped from database version 9.5.4 --- Dumped by pg_dump version 9.5.4 +-- Dumped from database version 9.5.6 +-- Dumped by pg_dump version 9.5.6 SET statement_timeout = 0; SET lock_timeout = 0; @@ -1846,6 +1846,13 @@ CREATE UNIQUE INDEX index_changesets_subscribers_on_subscriber_id_and_changeset_ CREATE UNIQUE INDEX index_client_applications_on_key ON client_applications USING btree (key); +-- +-- Name: index_client_applications_on_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_client_applications_on_user_id ON client_applications USING btree (user_id); + + -- -- Name: index_diary_entry_subscriptions_on_diary_entry_id; Type: INDEX; Schema: public; Owner: - -- @@ -1881,6 +1888,13 @@ CREATE UNIQUE INDEX index_oauth_nonces_on_nonce_and_timestamp ON oauth_nonces US CREATE UNIQUE INDEX index_oauth_tokens_on_token ON oauth_tokens USING btree (token); +-- +-- Name: index_oauth_tokens_on_user_id; Type: INDEX; Schema: public; Owner: - +-- + +CREATE INDEX index_oauth_tokens_on_user_id ON oauth_tokens USING btree (user_id); + + -- -- Name: index_user_blocks_on_user_id; Type: INDEX; Schema: public; Owner: - -- @@ -2599,6 +2613,8 @@ INSERT INTO schema_migrations (version) VALUES ('20161002153425'); INSERT INTO schema_migrations (version) VALUES ('20161011010929'); +INSERT INTO schema_migrations (version) VALUES ('20170222134109'); + INSERT INTO schema_migrations (version) VALUES ('21'); INSERT INTO schema_migrations (version) VALUES ('22'); diff --git a/test/controllers/amf_controller_test.rb b/test/controllers/amf_controller_test.rb index 6272f6fe2..605be4c8d 100644 --- a/test/controllers/amf_controller_test.rb +++ b/test/controllers/amf_controller_test.rb @@ -19,9 +19,9 @@ class AmfControllerTest < ActionController::TestCase end def test_getpresets - [:public_user, :german_user].each do |id| - user = users(id) - + user_en_de = create(:user, :languages => %w(en de)) + user_de = create(:user, :languages => %w(de)) + [user_en_de, user_de].each do |user| amf_content "getpresets", "/1", ["#{user.email}:test", ""] post :amf_read assert_response :success @@ -460,8 +460,9 @@ class AmfControllerTest < ActionController::TestCase assert_equal -1, result[0] assert_match /must be logged in/, result[1] - create(:user_block, :user => users(:blocked_user)) - amf_content "findgpx", "/1", [1, "blocked@openstreetmap.org:test"] + blocked_user = create(:user) + create(:user_block, :user => blocked_user) + amf_content "findgpx", "/1", [1, "#{blocked_user.email}:test"] post :amf_read assert_response :success amf_parse_response @@ -473,9 +474,10 @@ class AmfControllerTest < ActionController::TestCase end def test_findgpx_by_id - trace = create(:trace, :visibility => "private", :user => users(:public_user)) + user = create(:user) + trace = create(:trace, :visibility => "private", :user => user) - amf_content "findgpx", "/1", [trace.id, "test@example.com:test"] + amf_content "findgpx", "/1", [trace.id, "#{user.email}:test"] post :amf_read assert_response :success amf_parse_response diff --git a/test/controllers/api_controller_test.rb b/test/controllers/api_controller_test.rb index 540f303ed..1ad53145a 100644 --- a/test/controllers/api_controller_test.rb +++ b/test/controllers/api_controller_test.rb @@ -382,7 +382,7 @@ class ApiControllerTest < ActionController::TestCase end def test_permissions_basic_auth - basic_authorization(users(:normal_user).email, "test") + basic_authorization(create(:user).email, "test") get :permissions assert_response :success assert_select "osm > permissions", :count => 1 do diff --git a/test/controllers/diary_entry_controller_test.rb b/test/controllers/diary_entry_controller_test.rb index 268834019..49d56c4e4 100644 --- a/test/controllers/diary_entry_controller_test.rb +++ b/test/controllers/diary_entry_controller_test.rb @@ -1,8 +1,6 @@ require "test_helper" class DiaryEntryControllerTest < ActionController::TestCase - fixtures :users, :user_roles - include ActionView::Helpers::NumberHelper def setup @@ -111,7 +109,7 @@ class DiaryEntryControllerTest < ActionController::TestCase def test_new_form # Now try again when logged in - get :new, {}, { :user => users(:normal_user).id } + get :new, {}, { :user => create(:user) } assert_response :success assert_select "title", :text => /New Diary Entry/, :count => 1 assert_select "div.content-heading", :count => 1 do @@ -138,7 +136,7 @@ class DiaryEntryControllerTest < ActionController::TestCase get :new, { :commit => "save", :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1", :longitude => "2.2", :language_code => "en" } }, - { :user => users(:normal_user).id } + { :user => create(:user).id } end assert_response :success assert_template :edit @@ -146,30 +144,32 @@ class DiaryEntryControllerTest < ActionController::TestCase def test_new_no_body # Now try creating a invalid diary entry with an empty body + user = create(:user) assert_no_difference "DiaryEntry.count" do post :new, { :commit => "save", :diary_entry => { :title => "New Title", :body => "", :latitude => "1.1", :longitude => "2.2", :language_code => "en" } }, - { :user => users(:normal_user).id } + { :user => user.id } end assert_response :success assert_template :edit - assert_nil UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first + assert_nil UserPreference.where(:user_id => user.id, :k => "diary.default_language").first end def test_new_post # Now try creating a diary entry + user = create(:user) assert_difference "DiaryEntry.count", 1 do post :new, { :commit => "save", :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1", :longitude => "2.2", :language_code => "en" } }, - { :user => users(:normal_user).id } + { :user => user.id } end assert_response :redirect - assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name + assert_redirected_to :action => :list, :display_name => user.display_name entry = DiaryEntry.order(:id).last - assert_equal users(:normal_user).id, entry.user_id + assert_equal user.id, entry.user_id assert_equal "New Title", entry.title assert_equal "This is a new body for the diary entry", entry.body assert_equal "1.1".to_f, entry.latitude @@ -179,23 +179,24 @@ class DiaryEntryControllerTest < ActionController::TestCase # checks if user was subscribed assert_equal 1, entry.subscribers.length - assert_equal "en", UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first.v + assert_equal "en", UserPreference.where(:user_id => user.id, :k => "diary.default_language").first.v end def test_new_german create(:language, :code => "de") + user = create(:user) # Now try creating a diary entry in a different language assert_difference "DiaryEntry.count", 1 do post :new, { :commit => "save", :diary_entry => { :title => "New Title", :body => "This is a new body for the diary entry", :latitude => "1.1", :longitude => "2.2", :language_code => "de" } }, - { :user => users(:normal_user).id } + { :user => user.id } end assert_response :redirect - assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name + assert_redirected_to :action => :list, :display_name => user.display_name entry = DiaryEntry.order(:id).last - assert_equal users(:normal_user).id, entry.user_id + assert_equal user.id, entry.user_id assert_equal "New Title", entry.title assert_equal "This is a new body for the diary entry", entry.body assert_equal "1.1".to_f, entry.latitude @@ -205,10 +206,11 @@ class DiaryEntryControllerTest < ActionController::TestCase # checks if user was subscribed assert_equal 1, entry.subscribers.length - assert_equal "de", UserPreference.where(:user_id => users(:normal_user).id, :k => "diary.default_language").first.v + assert_equal "de", UserPreference.where(:user_id => user.id, :k => "diary.default_language").first.v end def test_new_spammy + user = create(:user) # Generate some spammy content spammy_title = "Spam Spam Spam Spam Spam" spammy_body = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ") @@ -217,34 +219,37 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_difference "DiaryEntry.count", 1 do post :new, { :commit => "save", :diary_entry => { :title => spammy_title, :body => spammy_body, :language_code => "en" } }, - { :user => users(:normal_user).id } + { :user => user.id } end assert_response :redirect - assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name + assert_redirected_to :action => :list, :display_name => user.display_name entry = DiaryEntry.order(:id).last - assert_equal users(:normal_user).id, entry.user_id + assert_equal user.id, entry.user_id assert_equal spammy_title, entry.title assert_equal spammy_body, entry.body assert_equal "en", entry.language_code - assert_equal "suspended", User.find(users(:normal_user).id).status + assert_equal "suspended", User.find(user.id).status # Follow the redirect - get :list, { :display_name => users(:normal_user).display_name }, { :user => users(:normal_user).id } + get :list, { :display_name => user.display_name }, { :user => user } assert_response :redirect assert_redirected_to :controller => :user, :action => :suspended end def test_edit - entry = create(:diary_entry, :user => users(:normal_user)) + user = create(:user) + other_user = create(:user) + + entry = create(:diary_entry, :user => user) # Make sure that you are redirected to the login page when you are # not logged in, without and with the id of the entry you want to edit get :edit, :display_name => entry.user.display_name, :id => entry.id assert_response :redirect - assert_redirected_to :controller => :user, :action => :login, :referer => "/user/#{entry.user.display_name}/diary/#{entry.id}/edit" + assert_redirected_to :controller => :user, :action => :login, :referer => "/user/#{URI.encode(entry.user.display_name)}/diary/#{entry.id}/edit" # Verify that you get a not found error, when you pass a bogus id - get :edit, { :display_name => entry.user.display_name, :id => 9999 }, { :user => entry.user.id } + get :edit, { :display_name => entry.user.display_name, :id => 9999 }, { :user => entry.user } assert_response :not_found assert_select "div.content-heading", :count => 1 do assert_select "h2", :text => "No entry with the id: 9999", :count => 1 @@ -252,20 +257,20 @@ class DiaryEntryControllerTest < ActionController::TestCase # Verify that you get redirected to view if you are not the user # that created the entry - get :edit, { :display_name => entry.user.display_name, :id => entry.id }, { :user => users(:public_user).id } + get :edit, { :display_name => entry.user.display_name, :id => entry.id }, { :user => other_user } assert_response :redirect assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id # Now pass the id, and check that you can edit it, when using the same # user as the person who created the entry - get :edit, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user.id } + get :edit, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user } assert_response :success assert_select "title", :text => /Edit diary entry/, :count => 1 assert_select "div.content-heading", :count => 1 do assert_select "h1", :text => /Edit diary entry/, :count => 1 end assert_select "div#content", :count => 1 do - assert_select "form[action='/user/#{entry.user.display_name}/diary/#{entry.id}/edit'][method=post]", :count => 1 do + assert_select "form[action='/user/#{URI.encode(entry.user.display_name)}/diary/#{entry.id}/edit'][method=post]", :count => 1 do assert_select "input#diary_entry_title[name='diary_entry[title]'][value='#{entry.title}']", :count => 1 assert_select "textarea#diary_entry_body[name='diary_entry[body]']", :text => entry.body, :count => 1 assert_select "select#diary_entry_language_code", :count => 1 @@ -292,7 +297,7 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id # Now check that the new data is rendered, when logged in - get :view, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user.id } + get :view, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user } assert_response :success assert_template "diary_entry/view" assert_select "title", :text => /Users' diaries | /, :count => 1 @@ -307,16 +312,16 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_select "abbr[class='geo'][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1 # As we're not logged in, check that you cannot edit # print @response.body - assert_select "a[href='/user/#{entry.user.display_name}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1 + assert_select "a[href='/user/#{URI.encode(entry.user.display_name)}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1 end # and when not logged in as the user who wrote the entry - get :view, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user.id } + get :view, { :display_name => entry.user.display_name, :id => entry.id }, { :user => entry.user } assert_response :success assert_template "diary_entry/view" assert_select "title", :text => /Users' diaries | /, :count => 1 assert_select "div.content-heading", :count => 1 do - assert_select "h2", :text => /#{users(:normal_user).display_name}'s diary/, :count => 1 + assert_select "h2", :text => /#{entry.user.display_name}'s diary/, :count => 1 end assert_select "div#content", :count => 1 do assert_select "div.post_heading", :text => /#{new_title}/, :count => 1 @@ -326,39 +331,42 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_select "abbr[class=geo][title='#{number_with_precision(new_latitude, :precision => 4)}; #{number_with_precision(new_longitude, :precision => 4)}']", :count => 1 # As we're not logged in, check that you cannot edit assert_select "li[class='hidden show_if_user_#{entry.user.id}']", :count => 1 do - assert_select "a[href='/user/#{entry.user.display_name}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1 + assert_select "a[href='/user/#{URI.encode(entry.user.display_name)}/diary/#{entry.id}/edit']", :text => "Edit this entry", :count => 1 end end end def test_edit_i18n - diary_entry = create(:diary_entry, :language_code => "en") - get :edit, { :display_name => users(:normal_user).display_name, :id => diary_entry.id }, { :user => users(:normal_user).id } + user = create(:user) + diary_entry = create(:diary_entry, :language_code => "en", :user => user) + get :edit, { :display_name => user.display_name, :id => diary_entry.id }, { :user => user } assert_response :success assert_select "span[class=translation_missing]", false, "Missing translation in edit diary entry" end def test_comment - entry = create(:diary_entry, :user => users(:normal_user)) + user = create(:user) + other_user = create(:user) + entry = create(:diary_entry, :user => user) # Make sure that you are denied when you are not logged in post :comment, :display_name => entry.user.display_name, :id => entry.id assert_response :forbidden # Verify that you get a not found error, when you pass a bogus id - post :comment, { :display_name => entry.user.display_name, :id => 9999 }, { :user => users(:public_user).id } + post :comment, { :display_name => entry.user.display_name, :id => 9999 }, { :user => other_user } assert_response :not_found assert_select "div.content-heading", :count => 1 do assert_select "h2", :text => "No entry with the id: 9999", :count => 1 end - post :subscribe, { :id => entry.id, :display_name => entry.user.display_name }, { :user => users(:normal_user).id } + post :subscribe, { :id => entry.id, :display_name => entry.user.display_name }, { :user => user } # Now try an invalid comment with an empty body assert_no_difference "ActionMailer::Base.deliveries.size" do assert_no_difference "DiaryComment.count" do assert_no_difference "entry.subscribers.count" do - post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "" } }, { :user => users(:public_user).id } + post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "" } }, { :user => other_user } end end end @@ -369,21 +377,21 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_difference "ActionMailer::Base.deliveries.size", entry.subscribers.count do assert_difference "DiaryComment.count", 1 do assert_difference "entry.subscribers.count", 1 do - post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "New comment" } }, { :user => users(:public_user).id } + post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => "New comment" } }, { :user => other_user } end end end assert_response :redirect assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id email = ActionMailer::Base.deliveries.first - assert_equal [users(:normal_user).email], email.to - assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on a diary entry", email.subject + assert_equal [user.email], email.to + assert_equal "[OpenStreetMap] #{other_user.display_name} commented on a diary entry", email.subject assert_match /New comment/, email.text_part.decoded assert_match /New comment/, email.html_part.decoded ActionMailer::Base.deliveries.clear comment = DiaryComment.order(:id).last assert_equal entry.id, comment.diary_entry_id - assert_equal users(:public_user).id, comment.user_id + assert_equal other_user.id, comment.user_id assert_equal "New comment", comment.body # Now view the diary entry, and check the new comment is present @@ -391,16 +399,19 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_response :success assert_select ".diary-comment", :count => 1 do assert_select "#comment#{comment.id}", :count => 1 do - assert_select "a[href='/user/#{users(:public_user).display_name}']", :text => users(:public_user).display_name, :count => 1 + assert_select "a[href='/user/#{URI.encode(other_user.display_name)}']", :text => other_user.display_name, :count => 1 end assert_select ".richtext", :text => /New comment/, :count => 1 end end def test_comment_spammy + user = create(:user) + other_user = create(:user) + # Find the entry to comment on - entry = create(:diary_entry, :user => users(:normal_user)) - post :subscribe, { :id => entry.id, :display_name => entry.user.display_name }, { :user => users(:normal_user).id } + entry = create(:diary_entry, :user => user) + post :subscribe, { :id => entry.id, :display_name => entry.user.display_name }, { :user => user } # Generate some spammy content spammy_text = 1.upto(50).map { |n| "http://example.com/spam#{n}" }.join(" ") @@ -408,25 +419,25 @@ class DiaryEntryControllerTest < ActionController::TestCase # Try creating a spammy comment assert_difference "ActionMailer::Base.deliveries.size", 1 do assert_difference "DiaryComment.count", 1 do - post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => spammy_text } }, { :user => users(:public_user).id } + post :comment, { :display_name => entry.user.display_name, :id => entry.id, :diary_comment => { :body => spammy_text } }, { :user => other_user } end end assert_response :redirect assert_redirected_to :action => :view, :display_name => entry.user.display_name, :id => entry.id email = ActionMailer::Base.deliveries.first - assert_equal [users(:normal_user).email], email.to - assert_equal "[OpenStreetMap] #{users(:public_user).display_name} commented on a diary entry", email.subject + assert_equal [user.email], email.to + assert_equal "[OpenStreetMap] #{other_user.display_name} commented on a diary entry", email.subject assert_match %r{http://example.com/spam}, email.text_part.decoded assert_match %r{http://example.com/spam}, email.html_part.decoded ActionMailer::Base.deliveries.clear comment = DiaryComment.order(:id).last assert_equal entry.id, comment.diary_entry_id - assert_equal users(:public_user).id, comment.user_id + assert_equal other_user.id, comment.user_id assert_equal spammy_text, comment.body - assert_equal "suspended", User.find(users(:public_user).id).status + assert_equal "suspended", User.find(other_user.id).status # Follow the redirect - get :list, { :display_name => users(:normal_user).display_name }, { :user => users(:public_user).id } + get :list, { :display_name => user.display_name }, { :user => other_user } assert_response :redirect assert_redirected_to :controller => :user, :action => :suspended @@ -439,7 +450,7 @@ class DiaryEntryControllerTest < ActionController::TestCase def test_list_all diary_entry = create(:diary_entry) geo_entry = create(:diary_entry, :latitude => 51.50763, :longitude => -0.10781) - public_entry = create(:diary_entry, :user => users(:public_user)) + public_entry = create(:diary_entry, :user => create(:user)) # Try a list of all diary entries get :list @@ -447,12 +458,15 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_list_user - diary_entry = create(:diary_entry, :user => users(:normal_user)) - geo_entry = create(:diary_entry, :user => users(:normal_user), :latitude => 51.50763, :longitude => -0.10781) - _other_entry = create(:diary_entry, :user => users(:public_user)) + user = create(:user) + other_user = create(:user) + + diary_entry = create(:diary_entry, :user => user) + geo_entry = create(:diary_entry, :user => user, :latitude => 51.50763, :longitude => -0.10781) + _other_entry = create(:diary_entry, :user => other_user) # Try a list of diary entries for a valid user - get :list, :display_name => users(:normal_user).display_name + get :list, :display_name => user.display_name check_diary_list diary_entry, geo_entry # Try a list of diary entries for an invalid user @@ -462,9 +476,11 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_list_friends - friend = create(:friend, :befriender => users(:normal_user)) + user = create(:user) + other_user = create(:user) + friend = create(:friend, :befriender => user) diary_entry = create(:diary_entry, :user => friend.befriendee) - _other_entry = create(:diary_entry, :user => users(:second_public_user)) + _other_entry = create(:diary_entry, :user => other_user) # Try a list of diary entries for your friends when not logged in get :list, :friends => true @@ -472,14 +488,17 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/friends" # Try a list of diary entries for your friends when logged in - get :list, { :friends => true }, { :user => users(:normal_user).id } + get :list, { :friends => true }, { :user => user } check_diary_list diary_entry - get :list, { :friends => true }, { :user => users(:public_user).id } + get :list, { :friends => true }, { :user => other_user } check_diary_list end def test_list_nearby - diary_entry = create(:diary_entry, :user => users(:public_user)) + user = create(:user, :home_lat => 12, :home_lon => 12) + nearby_user = create(:user, :home_lat => 11.9, :home_lon => 12.1) + + diary_entry = create(:diary_entry, :user => user) # Try a list of diary entries for nearby users when not logged in get :list, :nearby => true @@ -487,9 +506,9 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_redirected_to :controller => :user, :action => :login, :referer => "/diary/nearby" # Try a list of diary entries for nearby users when logged in - get :list, { :nearby => true }, { :user => users(:german_user).id } + get :list, { :nearby => true }, { :user => nearby_user } check_diary_list diary_entry - get :list, { :nearby => true }, { :user => users(:public_user).id } + get :list, { :nearby => true }, { :user => user } check_diary_list end @@ -556,11 +575,13 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_rss_user - create(:diary_entry, :user => users(:normal_user)) - create(:diary_entry, :user => users(:normal_user)) - create(:diary_entry, :user => users(:public_user)) + user = create(:user) + other_user = create(:user) + create(:diary_entry, :user => user) + create(:diary_entry, :user => user) + create(:diary_entry, :user => other_user) - get :rss, :display_name => users(:normal_user).display_name, :format => :rss + get :rss, :display_name => user.display_name, :format => :rss assert_response :success, "Should be able to get a specific users diary RSS" assert_select "rss>channel>item", :count => 2 # , "Diary entries should be filtered by user" end @@ -571,11 +592,11 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_response :not_found, "Should not be able to get a nonexisting users diary RSS" # Try a suspended user - get :rss, :display_name => users(:suspended_user).display_name, :format => :rss + get :rss, :display_name => create(:user, :suspended).display_name, :format => :rss assert_response :not_found, "Should not be able to get a suspended users diary RSS" # Try a deleted user - get :rss, :display_name => users(:deleted_user).display_name, :format => :rss + get :rss, :display_name => create(:user, :deleted).display_name, :format => :rss assert_response :not_found, "Should not be able to get a deleted users diary RSS" end @@ -587,37 +608,42 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_view + user = create(:user) + suspended_user = create(:user, :suspended) + deleted_user = create(:user, :deleted) + # Try a normal entry that should work - diary_entry = create(:diary_entry, :user => users(:normal_user)) - get :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + diary_entry = create(:diary_entry, :user => user) + get :view, :display_name => user.display_name, :id => diary_entry.id assert_response :success assert_template :view # Try a deleted entry - diary_entry_deleted = create(:diary_entry, :user => users(:normal_user), :visible => false) - get :view, :display_name => users(:normal_user).display_name, :id => diary_entry_deleted.id + diary_entry_deleted = create(:diary_entry, :user => user, :visible => false) + get :view, :display_name => user.display_name, :id => diary_entry_deleted.id assert_response :not_found # Try an entry by a suspended user - diary_entry_suspended = create(:diary_entry, :user => users(:suspended_user)) - get :view, :display_name => users(:suspended_user).display_name, :id => diary_entry_suspended.id + diary_entry_suspended = create(:diary_entry, :user => suspended_user) + get :view, :display_name => suspended_user.display_name, :id => diary_entry_suspended.id assert_response :not_found # Try an entry by a deleted user - diary_entry_deleted = create(:diary_entry, :user => users(:deleted_user)) - get :view, :display_name => users(:deleted_user).display_name, :id => diary_entry_deleted.id + diary_entry_deleted = create(:diary_entry, :user => deleted_user) + get :view, :display_name => deleted_user.display_name, :id => diary_entry_deleted.id assert_response :not_found end def test_view_hidden_comments # Get a diary entry that has hidden comments - diary_entry = create(:diary_entry) + user = create(:user) + diary_entry = create(:diary_entry, :user => user) visible_comment = create(:diary_comment, :diary_entry => diary_entry) - suspended_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => users(:suspended_user)) - deleted_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => users(:deleted_user)) + suspended_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => create(:user, :suspended)) + deleted_user_comment = create(:diary_comment, :diary_entry => diary_entry, :user => create(:user, :deleted)) hidden_comment = create(:diary_comment, :diary_entry => diary_entry, :visible => false) - get :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + get :view, :display_name => user.display_name, :id => diary_entry.id assert_response :success assert_template :view assert_select "div.comments" do @@ -629,49 +655,57 @@ class DiaryEntryControllerTest < ActionController::TestCase end def test_hide + user = create(:user) + # Try without logging in - diary_entry = create(:diary_entry) - post :hide, :display_name => users(:normal_user).display_name, :id => diary_entry.id + diary_entry = create(:diary_entry, :user => user) + post :hide, :display_name => user.display_name, :id => diary_entry.id assert_response :forbidden assert_equal true, DiaryEntry.find(diary_entry.id).visible # Now try as a normal user - post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entry.id }, { :user => users(:normal_user).id } + post :hide, { :display_name => user.display_name, :id => diary_entry.id }, { :user => user } assert_response :redirect - assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + assert_redirected_to :action => :view, :display_name => user.display_name, :id => diary_entry.id assert_equal true, DiaryEntry.find(diary_entry.id).visible # Finally try as an administrator - post :hide, { :display_name => users(:normal_user).display_name, :id => diary_entry.id }, { :user => users(:administrator_user).id } + post :hide, { :display_name => user.display_name, :id => diary_entry.id }, { :user => create(:administrator_user) } assert_response :redirect - assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name + assert_redirected_to :action => :list, :display_name => user.display_name assert_equal false, DiaryEntry.find(diary_entry.id).visible end def test_hidecomment - diary_entry = create(:diary_entry, :user => users(:normal_user)) + user = create(:user) + administrator_user = create(:administrator_user) + diary_entry = create(:diary_entry, :user => user) diary_comment = create(:diary_comment, :diary_entry => diary_entry) # Try without logging in - post :hidecomment, :display_name => users(:normal_user).display_name, :id => diary_entry.id, :comment => diary_comment.id + post :hidecomment, :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id assert_response :forbidden assert_equal true, DiaryComment.find(diary_comment.id).visible # Now try as a normal user - post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entry.id, :comment => diary_comment.id }, { :user => users(:normal_user).id } + post :hidecomment, { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id }, { :user => user } assert_response :redirect - assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + assert_redirected_to :action => :view, :display_name => user.display_name, :id => diary_entry.id assert_equal true, DiaryComment.find(diary_comment.id).visible # Finally try as an administrator - post :hidecomment, { :display_name => users(:normal_user).display_name, :id => diary_entry.id, :comment => diary_comment.id }, { :user => users(:administrator_user).id } + post :hidecomment, { :display_name => user.display_name, :id => diary_entry.id, :comment => diary_comment.id }, { :user => administrator_user } assert_response :redirect - assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name, :id => diary_entry.id + assert_redirected_to :action => :view, :display_name => user.display_name, :id => diary_entry.id assert_equal false, DiaryComment.find(diary_comment.id).visible end def test_comments + user = create(:user) + other_user = create(:user) + suspended_user = create(:user, :suspended) + deleted_user = create(:user, :deleted) # Test a user with no comments - get :comments, :display_name => users(:normal_user).display_name + get :comments, :display_name => user.display_name assert_response :success assert_template :comments assert_select "table.messages" do @@ -679,9 +713,9 @@ class DiaryEntryControllerTest < ActionController::TestCase end # Test a user with a comment - create(:diary_comment, :user => users(:public_user)) + create(:diary_comment, :user => other_user) - get :comments, :display_name => users(:public_user).display_name + get :comments, :display_name => other_user.display_name assert_response :success assert_template :comments assert_select "table.messages" do @@ -689,25 +723,30 @@ class DiaryEntryControllerTest < ActionController::TestCase end # Test a suspended user - get :comments, :display_name => users(:suspended_user).display_name + get :comments, :display_name => suspended_user.display_name assert_response :not_found # Test a deleted user - get :comments, :display_name => users(:deleted_user).display_name + get :comments, :display_name => deleted_user.display_name assert_response :not_found end def test_subscribe_success - diary_entry = create(:diary_entry, :user => users(:normal_user)) + user = create(:user) + other_user = create(:user) + diary_entry = create(:diary_entry, :user => user) assert_difference "diary_entry.subscribers.count", 1 do - post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => other_user } end assert_response :redirect end def test_subscribe_fail - diary_entry = create(:diary_entry, :user => users(:normal_user)) + user = create(:user) + other_user = create(:user) + + diary_entry = create(:diary_entry, :user => user) # not signed in assert_no_difference "diary_entry.subscribers.count" do @@ -716,28 +755,34 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_response :forbidden # bad diary id - post :subscribe, { :id => 999111, :display_name => "username" }, { :user => users(:public_user).id } + post :subscribe, { :id => 999111, :display_name => "username" }, { :user => other_user } assert_response :not_found # trying to subscribe when already subscribed - post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => other_user } assert_no_difference "diary_entry.subscribers.count" do - post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => other_user } end end def test_unsubscribe_success - diary_entry = create(:diary_entry, :user => users(:normal_user)) + user = create(:user) + other_user = create(:user) + + diary_entry = create(:diary_entry, :user => user) - post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + post :subscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => other_user } assert_difference "diary_entry.subscribers.count", -1 do - post :unsubscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + post :unsubscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => other_user } end assert_response :redirect end def test_unsubscribe_fail - diary_entry = create(:diary_entry, :user => users(:normal_user)) + user = create(:user) + other_user = create(:user) + + diary_entry = create(:diary_entry, :user => user) # not signed in assert_no_difference "diary_entry.subscribers.count" do @@ -746,12 +791,12 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_response :forbidden # bad diary id - post :unsubscribe, { :id => 999111, :display_name => "username" }, { :user => users(:public_user).id } + post :unsubscribe, { :id => 999111, :display_name => "username" }, { :user => other_user } assert_response :not_found # trying to unsubscribe when not subscribed assert_no_difference "diary_entry.subscribers.count" do - post :unsubscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => users(:public_user).id } + post :unsubscribe, { :id => diary_entry.id, :display_name => diary_entry.user.display_name }, { :user => other_user } end end @@ -764,7 +809,7 @@ class DiaryEntryControllerTest < ActionController::TestCase assert_select "div.diary_post", entries.count entries.each do |entry| - assert_select "a[href=?]", "/user/#{entry.user.display_name}/diary/#{entry.id}" + assert_select "a[href=?]", "/user/#{URI.encode(entry.user.display_name)}/diary/#{entry.id}" end end end diff --git a/test/controllers/notes_controller_test.rb b/test/controllers/notes_controller_test.rb index ab63bbca2..a16ff3477 100644 --- a/test/controllers/notes_controller_test.rb +++ b/test/controllers/notes_controller_test.rb @@ -1,8 +1,6 @@ require "test_helper" class NotesControllerTest < ActionController::TestCase - fixtures :users, :user_roles - def setup # Stub nominatim response for note locations stub_request(:get, %r{^http://nominatim\.openstreetmap\.org/reverse\?}) @@ -250,9 +248,13 @@ class NotesControllerTest < ActionController::TestCase assert_nil js["properties"]["comments"].last["user"] # Ensure that emails are sent to users + first_user = create(:user) + second_user = create(:user) + third_user = create(:user) + note_with_comments_by_users = create(:note) do |note| - create(:note_comment, :note => note, :author => users(:normal_user)) - create(:note_comment, :note => note, :author => users(:second_public_user)) + create(:note_comment, :note => note, :author => first_user) + create(:note_comment, :note => note, :author => second_user) end assert_difference "NoteComment.count", 1 do assert_difference "ActionMailer::Base.deliveries.size", 2 do @@ -270,12 +272,12 @@ class NotesControllerTest < ActionController::TestCase assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] assert_nil js["properties"]["comments"].last["user"] - email = ActionMailer::Base.deliveries.find { |e| e.to.first == "test@openstreetmap.org" } + email = ActionMailer::Base.deliveries.find { |e| e.to.first == first_user.email } assert_not_nil email assert_equal 1, email.to.length assert_equal "[OpenStreetMap] An anonymous user has commented on one of your notes", email.subject - email = ActionMailer::Base.deliveries.find { |e| e.to.first == "public@OpenStreetMap.org" } + email = ActionMailer::Base.deliveries.find { |e| e.to.first == second_user.email } assert_not_nil email assert_equal 1, email.to.length assert_equal "[OpenStreetMap] An anonymous user has commented on a note you are interested in", email.subject @@ -294,7 +296,7 @@ class NotesControllerTest < ActionController::TestCase ActionMailer::Base.deliveries.clear - basic_authorization(users(:public_user).email, "test") + basic_authorization(third_user.email, "test") assert_difference "NoteComment.count", 1 do assert_difference "ActionMailer::Base.deliveries.size", 2 do @@ -310,18 +312,18 @@ class NotesControllerTest < ActionController::TestCase assert_equal 4, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] - assert_equal "test2", js["properties"]["comments"].last["user"] + assert_equal third_user.display_name, js["properties"]["comments"].last["user"] - email = ActionMailer::Base.deliveries.find { |e| e.to.first == "test@openstreetmap.org" } + email = ActionMailer::Base.deliveries.find { |e| e.to.first == first_user.email } assert_not_nil email assert_equal 1, email.to.length - assert_equal "[OpenStreetMap] test2 has commented on one of your notes", email.subject - assert_equal "test@openstreetmap.org", email.to.first + assert_equal "[OpenStreetMap] #{third_user.display_name} has commented on one of your notes", email.subject + assert_equal first_user.email, email.to.first - email = ActionMailer::Base.deliveries.find { |e| e.to.first == "public@OpenStreetMap.org" } + email = ActionMailer::Base.deliveries.find { |e| e.to.first == second_user.email } assert_not_nil email assert_equal 1, email.to.length - assert_equal "[OpenStreetMap] test2 has commented on a note you are interested in", email.subject + assert_equal "[OpenStreetMap] #{third_user.display_name} has commented on a note you are interested in", email.subject get :show, :id => note_with_comments_by_users.id, :format => "json" assert_response :success @@ -333,7 +335,7 @@ class NotesControllerTest < ActionController::TestCase assert_equal 4, js["properties"]["comments"].count assert_equal "commented", js["properties"]["comments"].last["action"] assert_equal "This is an additional comment", js["properties"]["comments"].last["text"] - assert_equal "test2", js["properties"]["comments"].last["user"] + assert_equal third_user.display_name, js["properties"]["comments"].last["user"] ActionMailer::Base.deliveries.clear end @@ -378,11 +380,12 @@ class NotesControllerTest < ActionController::TestCase def test_close_success open_note_with_comment = create(:note_with_comments) + user = create(:user) post :close, :id => open_note_with_comment.id, :text => "This is a close comment", :format => "json" assert_response :unauthorized - basic_authorization(users(:public_user).email, "test") + basic_authorization(user.email, "test") post :close, :id => open_note_with_comment.id, :text => "This is a close comment", :format => "json" assert_response :success @@ -394,7 +397,7 @@ class NotesControllerTest < ActionController::TestCase assert_equal 2, js["properties"]["comments"].count assert_equal "closed", js["properties"]["comments"].last["action"] assert_equal "This is a close comment", js["properties"]["comments"].last["text"] - assert_equal "test2", js["properties"]["comments"].last["user"] + assert_equal user.display_name, js["properties"]["comments"].last["user"] get :show, :id => open_note_with_comment.id, :format => "json" assert_response :success @@ -406,14 +409,14 @@ class NotesControllerTest < ActionController::TestCase assert_equal 2, js["properties"]["comments"].count assert_equal "closed", js["properties"]["comments"].last["action"] assert_equal "This is a close comment", js["properties"]["comments"].last["text"] - assert_equal "test2", js["properties"]["comments"].last["user"] + assert_equal user.display_name, js["properties"]["comments"].last["user"] end def test_close_fail post :close assert_response :unauthorized - basic_authorization(users(:public_user).email, "test") + basic_authorization(create(:user).email, "test") post :close assert_response :bad_request @@ -434,11 +437,12 @@ class NotesControllerTest < ActionController::TestCase def test_reopen_success closed_note_with_comment = create(:note_with_comments, :status => "closed", :closed_at => Time.now) + user = create(:user) post :reopen, :id => closed_note_with_comment.id, :text => "This is a reopen comment", :format => "json" assert_response :unauthorized - basic_authorization(users(:public_user).email, "test") + basic_authorization(user.email, "test") post :reopen, :id => closed_note_with_comment.id, :text => "This is a reopen comment", :format => "json" assert_response :success @@ -450,7 +454,7 @@ class NotesControllerTest < ActionController::TestCase assert_equal 2, js["properties"]["comments"].count assert_equal "reopened", js["properties"]["comments"].last["action"] assert_equal "This is a reopen comment", js["properties"]["comments"].last["text"] - assert_equal "test2", js["properties"]["comments"].last["user"] + assert_equal user.display_name, js["properties"]["comments"].last["user"] get :show, :id => closed_note_with_comment.id, :format => "json" assert_response :success @@ -462,7 +466,7 @@ class NotesControllerTest < ActionController::TestCase assert_equal 2, js["properties"]["comments"].count assert_equal "reopened", js["properties"]["comments"].last["action"] assert_equal "This is a reopen comment", js["properties"]["comments"].last["text"] - assert_equal "test2", js["properties"]["comments"].last["user"] + assert_equal user.display_name, js["properties"]["comments"].last["user"] end def test_reopen_fail @@ -471,7 +475,7 @@ class NotesControllerTest < ActionController::TestCase post :reopen, :id => hidden_note_with_comment.id assert_response :unauthorized - basic_authorization(users(:public_user).email, "test") + basic_authorization(create(:user).email, "test") post :reopen, :id => 12345 assert_response :not_found @@ -584,16 +588,18 @@ class NotesControllerTest < ActionController::TestCase def test_destroy_success open_note_with_comment = create(:note_with_comments) + user = create(:user) + moderator_user = create(:moderator_user) delete :destroy, :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" assert_response :unauthorized - basic_authorization(users(:public_user).email, "test") + basic_authorization(user.email, "test") delete :destroy, :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" assert_response :forbidden - basic_authorization(users(:moderator_user).email, "test") + basic_authorization(moderator_user.email, "test") delete :destroy, :id => open_note_with_comment.id, :text => "This is a hide comment", :format => "json" assert_response :success @@ -605,22 +611,25 @@ class NotesControllerTest < ActionController::TestCase assert_equal 2, js["properties"]["comments"].count assert_equal "hidden", js["properties"]["comments"].last["action"] assert_equal "This is a hide comment", js["properties"]["comments"].last["text"] - assert_equal "moderator", js["properties"]["comments"].last["user"] + assert_equal moderator_user.display_name, js["properties"]["comments"].last["user"] get :show, :id => open_note_with_comment.id, :format => "json" assert_response :gone end def test_destroy_fail + user = create(:user) + moderator_user = create(:moderator_user) + delete :destroy, :id => 12345, :format => "json" assert_response :unauthorized - basic_authorization(users(:public_user).email, "test") + basic_authorization(user.email, "test") delete :destroy, :id => 12345, :format => "json" assert_response :forbidden - basic_authorization(users(:moderator_user).email, "test") + basic_authorization(moderator_user.email, "test") delete :destroy, :id => 12345, :format => "json" assert_response :not_found @@ -939,35 +948,39 @@ class NotesControllerTest < ActionController::TestCase end def test_mine_success + first_user = create(:user) + second_user = create(:user) + moderator_user = create(:moderator_user) + create(:note) do |note| - create(:note_comment, :note => note, :author => users(:normal_user)) + create(:note_comment, :note => note, :author => first_user) end create(:note) do |note| - create(:note_comment, :note => note, :author => users(:second_public_user)) + create(:note_comment, :note => note, :author => second_user) end create(:note, :status => "hidden") do |note| - create(:note_comment, :note => note, :author => users(:second_public_user)) + create(:note_comment, :note => note, :author => second_user) end # Note that the table rows include a header row - get :mine, :display_name => "test" + get :mine, :display_name => first_user.display_name assert_response :success assert_select "table.note_list tr", :count => 2 - get :mine, :display_name => "pulibc_test2" + get :mine, :display_name => second_user.display_name assert_response :success assert_select "table.note_list tr", :count => 2 get :mine, :display_name => "non-existent" assert_response :not_found - session[:user] = users(:moderator_user).id + session[:user] = moderator_user.id - get :mine, :display_name => "test" + get :mine, :display_name => first_user.display_name assert_response :success assert_select "table.note_list tr", :count => 2 - get :mine, :display_name => "pulibc_test2" + get :mine, :display_name => second_user.display_name assert_response :success assert_select "table.note_list tr", :count => 3 diff --git a/test/controllers/site_controller_test.rb b/test/controllers/site_controller_test.rb index e1eeac294..37f457523 100644 --- a/test/controllers/site_controller_test.rb +++ b/test/controllers/site_controller_test.rb @@ -172,7 +172,7 @@ class SiteControllerTest < ActionController::TestCase # Test the right editor gets used when the user hasn't set a preference def test_edit_without_preference - get :edit, nil, :user => users(:public_user).id + get :edit, nil, :user => users(:public_user) assert_response :success assert_template "edit" assert_template :partial => "_#{DEFAULT_EDITOR}", :count => 1 @@ -184,7 +184,7 @@ class SiteControllerTest < ActionController::TestCase user.preferred_editor = "id" user.save! - get :edit, nil, :user => user.id + get :edit, nil, :user => user assert_response :success assert_template "edit" assert_template :partial => "_id", :count => 1 @@ -193,7 +193,7 @@ class SiteControllerTest < ActionController::TestCase user.preferred_editor = "potlatch2" user.save! - get :edit, nil, :user => user.id + get :edit, nil, :user => user assert_response :success assert_template "edit" assert_template :partial => "_potlatch2", :count => 1 @@ -202,7 +202,7 @@ class SiteControllerTest < ActionController::TestCase user.preferred_editor = "potlatch" user.save! - get :edit, nil, :user => user.id + get :edit, nil, :user => user assert_response :success assert_template "edit" assert_template :partial => "_potlatch", :count => 1 @@ -211,29 +211,29 @@ class SiteControllerTest < ActionController::TestCase user.preferred_editor = "remote" user.save! - get :edit, nil, :user => user.id + get :edit, nil, :user => user assert_response :success assert_template "index" end # Test the right editor gets used when the URL has an override def test_edit_with_override - get :edit, { :editor => "id" }, { :user => users(:public_user).id } + get :edit, { :editor => "id" }, { :user => users(:public_user) } assert_response :success assert_template "edit" assert_template :partial => "_id", :count => 1 - get :edit, { :editor => "potlatch2" }, { :user => users(:public_user).id } + get :edit, { :editor => "potlatch2" }, { :user => users(:public_user) } assert_response :success assert_template "edit" assert_template :partial => "_potlatch2", :count => 1 - get :edit, { :editor => "potlatch" }, { :user => users(:public_user).id } + get :edit, { :editor => "potlatch" }, { :user => users(:public_user) } assert_response :success assert_template "edit" assert_template :partial => "_potlatch", :count => 1 - get :edit, { :editor => "remote" }, { :user => users(:public_user).id } + get :edit, { :editor => "remote" }, { :user => users(:public_user) } assert_response :success assert_template "index" end @@ -243,7 +243,7 @@ class SiteControllerTest < ActionController::TestCase user = users(:public_user) node = current_nodes(:visible_node) - get :edit, { :node => node.id }, { :user => user.id } + get :edit, { :node => node.id }, { :user => user } assert_response :success assert_template "edit" assert_equal 1.0, assigns(:lat) @@ -256,7 +256,7 @@ class SiteControllerTest < ActionController::TestCase user = users(:public_user) way = current_ways(:visible_way) - get :edit, { :way => way.id }, { :user => user.id } + get :edit, { :way => way.id }, { :user => user } assert_response :success assert_template "edit" assert_equal 3.0, assigns(:lat) @@ -271,7 +271,7 @@ class SiteControllerTest < ActionController::TestCase n.comments.create(:author_id => user.id) end - get :edit, { :note => note.id }, { :user => user.id } + get :edit, { :note => note.id }, { :user => user } assert_response :success assert_template "edit" assert_equal 1.0, assigns(:lat) @@ -284,7 +284,7 @@ class SiteControllerTest < ActionController::TestCase user = users(:public_user) gpx = create(:trace, :latitude => 1, :longitude => 1) - get :edit, { :gpx => gpx.id }, { :user => user.id } + get :edit, { :gpx => gpx.id }, { :user => user } assert_response :success assert_template "edit" assert_equal 1.0, assigns(:lat) @@ -317,7 +317,7 @@ class SiteControllerTest < ActionController::TestCase assert_response :redirect assert_redirected_to :controller => :user, :action => :login, :referer => "/welcome" - get :welcome, nil, :user => users(:public_user).id + get :welcome, nil, :user => users(:public_user) assert_response :success assert_template "welcome" end @@ -377,7 +377,7 @@ class SiteControllerTest < ActionController::TestCase # Test the id frame def test_id - get :id, nil, :user => users(:public_user).id + get :id, nil, :user => users(:public_user) assert_response :success assert_template "id" assert_template :layout => false diff --git a/test/controllers/trace_controller_test.rb b/test/controllers/trace_controller_test.rb index f27129b42..9ef79d1fa 100644 --- a/test/controllers/trace_controller_test.rb +++ b/test/controllers/trace_controller_test.rb @@ -194,11 +194,11 @@ class TraceControllerTest < ActionController::TestCase check_trace_list [trace_a] # Should see more when we are logged in - get :list, {}, { :user => users(:public_user).id } + get :list, {}, { :user => users(:public_user) } check_trace_list [trace_d, trace_c, trace_b, trace_a] # Again, we should see more when we are logged in - get :list, { :tag => "London" }, { :user => users(:public_user).id } + get :list, { :tag => "London" }, { :user => users(:public_user) } check_trace_list [trace_c, trace_a] end @@ -216,11 +216,11 @@ class TraceControllerTest < ActionController::TestCase assert_redirected_to :controller => "user", :action => "login", :referer => "/traces/mine" # Now try when logged in - get :mine, {}, { :user => users(:public_user).id } + get :mine, {}, { :user => users(:public_user) } assert_redirected_to :controller => "trace", :action => "list", :display_name => users(:public_user).display_name # Fetch the actual list - get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id } + get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user) } check_trace_list [trace_b] end @@ -241,15 +241,15 @@ class TraceControllerTest < ActionController::TestCase check_trace_list [trace_b] # Should still see only public ones when authenticated as another user - get :list, { :display_name => users(:public_user).display_name }, { :user => users(:normal_user).id } + get :list, { :display_name => users(:public_user).display_name }, { :user => users(:normal_user) } check_trace_list [trace_b] # Should see all traces when authenticated as the target user - get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user).id } + get :list, { :display_name => users(:public_user).display_name }, { :user => users(:public_user) } check_trace_list [trace_c, trace_b] # Should only see traces with the correct tag when a tag is specified - get :list, { :display_name => users(:public_user).display_name, :tag => "London" }, { :user => users(:public_user).id } + get :list, { :display_name => users(:public_user).display_name, :tag => "London" }, { :user => users(:public_user) } check_trace_list [trace_c] # Should get an error if the user does not exist @@ -286,11 +286,11 @@ class TraceControllerTest < ActionController::TestCase check_trace_view public_trace_file # Now with some other user, which should work since the trace is public - get :view, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + get :view, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user) } check_trace_view public_trace_file # And finally we should be able to do it with the owner of the trace - get :view, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + get :view, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user) } check_trace_view public_trace_file end @@ -304,12 +304,12 @@ class TraceControllerTest < ActionController::TestCase assert_redirected_to :action => :list # Now with some other user, which should not work since the trace is anon - get :view, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } + get :view, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user) } assert_response :redirect assert_redirected_to :action => :list # And finally we should be able to do it with the owner of the trace - get :view, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + get :view, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user) } check_trace_view anon_trace_file end @@ -323,12 +323,12 @@ class TraceControllerTest < ActionController::TestCase assert_redirected_to :action => :list # Now with some other user - get :view, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } + get :view, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user) } assert_response :redirect assert_redirected_to :action => :list # And finally we should not be able to view a deleted trace - get :view, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } + get :view, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user) } assert_response :redirect assert_redirected_to :action => :list end @@ -342,11 +342,11 @@ class TraceControllerTest < ActionController::TestCase check_trace_data public_trace_file # Now with some other user, which should work since the trace is public - get :data, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + get :data, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user) } check_trace_data public_trace_file # And finally we should be able to do it with the owner of the trace - get :data, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + get :data, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user) } check_trace_data public_trace_file end @@ -376,11 +376,11 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with some other user, which shouldn't work since the trace is anon - get :data, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } + get :data, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user) } assert_response :not_found # And finally we should be able to do it with the owner of the trace - get :data, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + get :data, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user) } check_trace_data anon_trace_file end @@ -393,11 +393,11 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with a trace that has never existed - get :data, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } + get :data, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user) } assert_response :not_found # Now with a trace that has been deleted - get :data, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } + get :data, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user) } assert_response :not_found end @@ -410,11 +410,11 @@ class TraceControllerTest < ActionController::TestCase check_trace_picture public_trace_file # Now with some other user, which should work since the trace is public - get :picture, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + get :picture, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user) } check_trace_picture public_trace_file # And finally we should be able to do it with the owner of the trace - get :picture, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + get :picture, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user) } check_trace_picture public_trace_file end @@ -427,11 +427,11 @@ class TraceControllerTest < ActionController::TestCase assert_response :forbidden # Now with some other user, which shouldn't work since the trace is anon - get :picture, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } + get :picture, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user) } assert_response :forbidden # And finally we should be able to do it with the owner of the trace - get :picture, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + get :picture, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user) } check_trace_picture anon_trace_file end @@ -442,12 +442,12 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with some other user, which should work since the trace is public - get :picture, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } + get :picture, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user) } assert_response :not_found # And finally we should not be able to do it with a deleted trace deleted_trace_file = create(:trace, :deleted) - get :picture, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } + get :picture, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user) } assert_response :not_found end @@ -460,11 +460,11 @@ class TraceControllerTest < ActionController::TestCase check_trace_icon public_trace_file # Now with some other user, which should work since the trace is public - get :icon, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + get :icon, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user) } check_trace_icon public_trace_file # And finally we should be able to do it with the owner of the trace - get :icon, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + get :icon, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user) } check_trace_icon public_trace_file end @@ -477,11 +477,11 @@ class TraceControllerTest < ActionController::TestCase assert_response :forbidden # Now with some other user, which shouldn't work since the trace is anon - get :icon, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user).id } + get :icon, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:normal_user) } assert_response :forbidden # And finally we should be able to do it with the owner of the trace - get :icon, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user).id } + get :icon, { :display_name => users(:public_user).display_name, :id => anon_trace_file.id }, { :user => users(:public_user) } check_trace_icon anon_trace_file end @@ -492,12 +492,12 @@ class TraceControllerTest < ActionController::TestCase assert_response :not_found # Now with some other user - get :icon, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } + get :icon, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user) } assert_response :not_found # And finally we should not be able to do it with a deleted trace deleted_trace_file = create(:trace, :deleted) - get :icon, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } + get :icon, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user) } assert_response :not_found end @@ -510,20 +510,20 @@ class TraceControllerTest < ActionController::TestCase # Now authenticated as a user with gps.trace.visibility set create(:user_preference, :user => users(:public_user), :k => "gps.trace.visibility", :v => "identifiable") - get :create, {}, { :user => users(:public_user).id } + get :create, {}, { :user => users(:public_user) } assert_response :success assert_template :create assert_select "select#trace_visibility option[value=identifiable][selected]", 1 # Now authenticated as a user with gps.trace.public set create(:user_preference, :user => users(:second_public_user), :k => "gps.trace.public", :v => "default") - get :create, {}, { :user => users(:second_public_user).id } + get :create, {}, { :user => users(:second_public_user) } assert_response :success assert_template :create assert_select "select#trace_visibility option[value=public][selected]", 1 # Now authenticated as a user with no preferences - get :create, {}, { :user => users(:normal_user).id } + get :create, {}, { :user => users(:normal_user) } assert_response :success assert_template :create assert_select "select#trace_visibility option[value=private][selected]", 1 @@ -542,7 +542,7 @@ class TraceControllerTest < ActionController::TestCase # Now authenticated create(:user_preference, :user => users(:public_user), :k => "gps.trace.visibility", :v => "identifiable") assert_not_equal "trackable", users(:public_user).preferences.where(:k => "gps.trace.visibility").first.v - post :create, { :trace => { :gpx_file => file, :description => "New Trace", :tagstring => "new,trace", :visibility => "trackable" } }, { :user => users(:public_user).id } + post :create, { :trace => { :gpx_file => file, :description => "New Trace", :tagstring => "new,trace", :visibility => "trackable" } }, { :user => users(:public_user) } assert_response :redirect assert_redirected_to :action => :list, :display_name => users(:public_user).display_name assert_match /file has been uploaded/, flash[:notice] @@ -557,7 +557,7 @@ class TraceControllerTest < ActionController::TestCase assert_equal "trackable", users(:public_user).preferences.where(:k => "gps.trace.visibility").first.v end - # Test fetching the edit page for a trace + # Test fetching the edit page for a trace using GET def test_edit_get public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) @@ -568,26 +568,53 @@ class TraceControllerTest < ActionController::TestCase assert_redirected_to :controller => :user, :action => :login, :referer => trace_edit_path(:display_name => users(:normal_user).display_name, :id => public_trace_file.id) # Now with some other user, which should fail - get :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + get :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user) } assert_response :forbidden # Now with a trace which doesn't exist - get :edit, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } + get :edit, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user) } assert_response :not_found # Now with a trace which has been deleted - get :edit, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } + get :edit, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user) } assert_response :not_found # Finally with a trace that we are allowed to edit - get :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + get :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user) } + assert_response :success + end + + # Test fetching the edit page for a trace using POST + def test_edit_post_no_details + public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) + deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) + + # First with no auth + post :edit, :display_name => users(:normal_user).display_name, :id => public_trace_file.id + assert_response :forbidden + + # Now with some other user, which should fail + post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user) } + assert_response :forbidden + + # Now with a trace which doesn't exist + post :edit, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user) } + assert_response :not_found + + # Now with a trace which has been deleted + post :edit, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user) } + assert_response :not_found + + # Finally with a trace that we are allowed to edit + post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user) } assert_response :success end # Test saving edits to a trace - def test_edit_post + def test_edit_post_with_details public_trace_file = create(:trace, :visibility => "public", :user => users(:normal_user)) deleted_trace_file = create(:trace, :deleted, :user => users(:public_user)) + # New details new_details = { :description => "Changed description", :tagstring => "new_tag", :visibility => "private" } @@ -596,19 +623,19 @@ class TraceControllerTest < ActionController::TestCase assert_response :forbidden # Now with some other user, which should fail - post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id, :trace => new_details }, { :user => users(:public_user).id } + post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id, :trace => new_details }, { :user => users(:public_user) } assert_response :forbidden # Now with a trace which doesn't exist - post :edit, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id, :trace => new_details } + post :edit, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user), :trace => new_details } assert_response :not_found # Now with a trace which has been deleted - post :edit, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id, :trace => new_details }, { :user => users(:public_user).id } + post :edit, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id, :trace => new_details }, { :user => users(:public_user) } assert_response :not_found # Finally with a trace that we are allowed to edit - post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id, :trace => new_details }, { :user => users(:normal_user).id } + post :edit, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id, :trace => new_details }, { :user => users(:normal_user) } assert_response :redirect assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name trace = Trace.find(public_trace_file.id) @@ -627,19 +654,19 @@ class TraceControllerTest < ActionController::TestCase assert_response :forbidden # Now with some other user, which should fail - post :delete, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user).id } + post :delete, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:public_user) } assert_response :forbidden # Now with a trace which doesn't exist - post :delete, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user).id } + post :delete, { :display_name => users(:public_user).display_name, :id => 0 }, { :user => users(:public_user) } assert_response :not_found # Now with a trace has already been deleted - post :delete, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user).id } + post :delete, { :display_name => users(:public_user).display_name, :id => deleted_trace_file.id }, { :user => users(:public_user) } assert_response :not_found # Finally with a trace that we are allowed to delete - post :delete, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user).id } + post :delete, { :display_name => users(:normal_user).display_name, :id => public_trace_file.id }, { :user => users(:normal_user) } assert_response :redirect assert_redirected_to :action => :list, :display_name => users(:normal_user).display_name trace = Trace.find(public_trace_file.id) diff --git a/test/controllers/user_controller_test.rb b/test/controllers/user_controller_test.rb index 027618631..87fb99a6f 100644 --- a/test/controllers/user_controller_test.rb +++ b/test/controllers/user_controller_test.rb @@ -768,7 +768,7 @@ class UserControllerTest < ActionController::TestCase assert_redirected_to :controller => :user, :action => "login", :referer => "/user/test/account" # Make sure that you are blocked when not logged in as the right user - get :account, { :display_name => user.display_name }, { :user => users(:public_user).id } + get :account, { :display_name => user.display_name }, { :user => users(:public_user) } assert_response :forbidden # Make sure we get the page when we are logged in as the right user @@ -778,7 +778,7 @@ class UserControllerTest < ActionController::TestCase # Updating the description should work user.description = "new description" - post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user } assert_response :success assert_template :account assert_select "div#errorExplanation", false @@ -787,7 +787,7 @@ class UserControllerTest < ActionController::TestCase # Changing to a invalid editor should fail user.preferred_editor = "unknown" - post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user } assert_response :success assert_template :account assert_select ".notice", false @@ -796,7 +796,7 @@ class UserControllerTest < ActionController::TestCase # Changing to a valid editor should work user.preferred_editor = "potlatch2" - post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user } assert_response :success assert_template :account assert_select "div#errorExplanation", false @@ -805,7 +805,7 @@ class UserControllerTest < ActionController::TestCase # Changing to the default editor should work user.preferred_editor = "default" - post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user } assert_response :success assert_template :account assert_select "div#errorExplanation", false @@ -814,7 +814,7 @@ class UserControllerTest < ActionController::TestCase # Changing to an uploaded image should work image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif") - post :account, { :display_name => user.display_name, :image_action => "new", :user => user.attributes.merge(:image => image) }, { :user => user.id } + post :account, { :display_name => user.display_name, :image_action => "new", :user => user.attributes.merge(:image => image) }, { :user => user } assert_response :success assert_template :account assert_select "div#errorExplanation", false @@ -822,7 +822,7 @@ class UserControllerTest < ActionController::TestCase assert_select "form#accountForm > fieldset > div.form-row.accountImage input[name=image_action][checked][value=?]", "keep" # Changing to a gravatar image should work - post :account, { :display_name => user.display_name, :image_action => "gravatar", :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :image_action => "gravatar", :user => user.attributes }, { :user => user } assert_response :success assert_template :account assert_select "div#errorExplanation", false @@ -830,7 +830,7 @@ class UserControllerTest < ActionController::TestCase assert_select "form#accountForm > fieldset > div.form-row.accountImage input[name=image_action][checked][value=?]", "gravatar" # Removing the image should work - post :account, { :display_name => user.display_name, :image_action => "delete", :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :image_action => "delete", :user => user.attributes }, { :user => user } assert_response :success assert_template :account assert_select "div#errorExplanation", false @@ -838,13 +838,13 @@ class UserControllerTest < ActionController::TestCase assert_select "form#accountForm > fieldset > div.form-row.accountImage input[name=image_action][checked]", false # Adding external authentication should redirect to the auth provider - post :account, { :display_name => user.display_name, :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }, { :user => user } assert_response :redirect assert_redirected_to auth_path(:provider => "openid", :openid_url => "https://www.google.com/accounts/o8/id", :origin => "/user/#{user.display_name}/account") # Changing name to one that exists should fail new_attributes = user.attributes.dup.merge(:display_name => users(:public_user).display_name) - post :account, { :display_name => user.display_name, :user => new_attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => new_attributes }, { :user => user } assert_response :success assert_template :account assert_select ".notice", false @@ -853,7 +853,7 @@ class UserControllerTest < ActionController::TestCase # Changing name to one that exists should fail, regardless of case new_attributes = user.attributes.dup.merge(:display_name => users(:public_user).display_name.upcase) - post :account, { :display_name => user.display_name, :user => new_attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => new_attributes }, { :user => user } assert_response :success assert_template :account assert_select ".notice", false @@ -862,7 +862,7 @@ class UserControllerTest < ActionController::TestCase # Changing name to one that doesn't exist should work new_attributes = user.attributes.dup.merge(:display_name => "new tester") - post :account, { :display_name => user.display_name, :user => new_attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => new_attributes }, { :user => user } assert_response :success assert_template :account assert_select "div#errorExplanation", false @@ -875,7 +875,7 @@ class UserControllerTest < ActionController::TestCase # Changing email to one that exists should fail user.new_email = users(:public_user).email assert_no_difference "ActionMailer::Base.deliveries.size" do - post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user } end assert_response :success assert_template :account @@ -886,7 +886,7 @@ class UserControllerTest < ActionController::TestCase # Changing email to one that exists should fail, regardless of case user.new_email = users(:public_user).email.upcase assert_no_difference "ActionMailer::Base.deliveries.size" do - post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user } end assert_response :success assert_template :account @@ -897,7 +897,7 @@ class UserControllerTest < ActionController::TestCase # Changing email to one that doesn't exist should work user.new_email = "new_tester@example.com" assert_difference "ActionMailer::Base.deliveries.size", 1 do - post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user.id } + post :account, { :display_name => user.display_name, :user => user.attributes }, { :user => user } end assert_response :success assert_template :account @@ -1045,6 +1045,7 @@ class UserControllerTest < ActionController::TestCase def test_api_details create(:message, :read, :recipient => users(:normal_user)) + create(:message, :sender => users(:normal_user)) # check that nothing is returned when not logged in get :api_details @@ -1137,7 +1138,7 @@ class UserControllerTest < ActionController::TestCase assert_nil Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # When logged in a GET should get a confirmation page - get :make_friend, { :display_name => friend.display_name }, { :user => user.id } + get :make_friend, { :display_name => friend.display_name }, { :user => user } assert_response :success assert_template :make_friend assert_select "form" do @@ -1148,7 +1149,7 @@ class UserControllerTest < ActionController::TestCase # When logged in a POST should add the friendship assert_difference "ActionMailer::Base.deliveries.size", 1 do - post :make_friend, { :display_name => friend.display_name }, { :user => user.id } + post :make_friend, { :display_name => friend.display_name }, { :user => user } end assert_redirected_to user_path(:display_name => friend.display_name) assert_match /is now your friend/, flash[:notice] @@ -1160,7 +1161,7 @@ class UserControllerTest < ActionController::TestCase # A second POST should report that the friendship already exists assert_no_difference "ActionMailer::Base.deliveries.size" do - post :make_friend, { :display_name => friend.display_name }, { :user => user.id } + post :make_friend, { :display_name => friend.display_name }, { :user => user } end assert_redirected_to user_path(:display_name => friend.display_name) assert_match /You are already friends with/, flash[:warning] @@ -1176,7 +1177,7 @@ class UserControllerTest < ActionController::TestCase assert_nil Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # The GET should preserve any referer - get :make_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user.id } + get :make_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user } assert_response :success assert_template :make_friend assert_select "form" do @@ -1187,7 +1188,7 @@ class UserControllerTest < ActionController::TestCase # When logged in a POST should add the friendship and refer us assert_difference "ActionMailer::Base.deliveries.size", 1 do - post :make_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user.id } + post :make_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user } end assert_redirected_to "/test" assert_match /is now your friend/, flash[:notice] @@ -1200,7 +1201,7 @@ class UserControllerTest < ActionController::TestCase def test_make_friend_unkown_user # Should error when a bogus user is specified - get :make_friend, { :display_name => "No Such User" }, { :user => users(:normal_user).id } + get :make_friend, { :display_name => "No Such User" }, { :user => users(:normal_user) } assert_response :not_found assert_template :no_such_user end @@ -1224,7 +1225,7 @@ class UserControllerTest < ActionController::TestCase assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # When logged in a GET should get a confirmation page - get :remove_friend, { :display_name => friend.display_name }, { :user => user.id } + get :remove_friend, { :display_name => friend.display_name }, { :user => user } assert_response :success assert_template :remove_friend assert_select "form" do @@ -1234,13 +1235,13 @@ class UserControllerTest < ActionController::TestCase assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # When logged in a POST should remove the friendship - post :remove_friend, { :display_name => friend.display_name }, { :user => user.id } + post :remove_friend, { :display_name => friend.display_name }, { :user => user } assert_redirected_to user_path(:display_name => friend.display_name) assert_match /was removed from your friends/, flash[:notice] assert_nil Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # A second POST should report that the friendship does not exist - post :remove_friend, { :display_name => friend.display_name }, { :user => user.id } + post :remove_friend, { :display_name => friend.display_name }, { :user => user } assert_redirected_to user_path(:display_name => friend.display_name) assert_match /is not one of your friends/, flash[:error] assert_nil Friend.where(:user_id => user.id, :friend_user_id => friend.id).first @@ -1256,7 +1257,7 @@ class UserControllerTest < ActionController::TestCase assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # The GET should preserve any referer - get :remove_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user.id } + get :remove_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user } assert_response :success assert_template :remove_friend assert_select "form" do @@ -1266,7 +1267,7 @@ class UserControllerTest < ActionController::TestCase assert Friend.where(:user_id => user.id, :friend_user_id => friend.id).first # When logged in a POST should remove the friendship and refer - post :remove_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user.id } + post :remove_friend, { :display_name => friend.display_name, :referer => "/test" }, { :user => user } assert_redirected_to "/test" assert_match /was removed from your friends/, flash[:notice] assert_nil Friend.where(:user_id => user.id, :friend_user_id => friend.id).first @@ -1274,7 +1275,7 @@ class UserControllerTest < ActionController::TestCase def test_remove_friend_unkown_user # Should error when a bogus user is specified - get :remove_friend, { :display_name => "No Such User" }, { :user => users(:normal_user).id } + get :remove_friend, { :display_name => "No Such User" }, { :user => users(:normal_user) } assert_response :not_found assert_template :no_such_user end @@ -1286,12 +1287,12 @@ class UserControllerTest < ActionController::TestCase assert_redirected_to :action => :login, :referer => set_status_user_path(:status => "suspended") # Now try as a normal user - get :set_status, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:normal_user).id } + get :set_status, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:normal_user) } assert_response :redirect assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name # Finally try as an administrator - get :set_status, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:administrator_user).id } + get :set_status, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:administrator_user) } assert_response :redirect assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name assert_equal "suspended", User.find(users(:normal_user).id).status @@ -1304,12 +1305,12 @@ class UserControllerTest < ActionController::TestCase assert_redirected_to :action => :login, :referer => delete_user_path(:status => "suspended") # Now try as a normal user - get :delete, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:normal_user).id } + get :delete, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:normal_user) } assert_response :redirect assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name # Finally try as an administrator - get :delete, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:administrator_user).id } + get :delete, { :display_name => users(:normal_user).display_name, :status => "suspended" }, { :user => users(:administrator_user) } assert_response :redirect assert_redirected_to :action => :view, :display_name => users(:normal_user).display_name diff --git a/test/factories/changeset_comments.rb b/test/factories/changeset_comments.rb index 5fb262184..d12c1b653 100644 --- a/test/factories/changeset_comments.rb +++ b/test/factories/changeset_comments.rb @@ -6,7 +6,6 @@ FactoryGirl.define do # FIXME: needs changeset factory changeset_id 3 - # FIXME: needs user factory - author_id 1 + association :author, :factory => :user end end diff --git a/test/factories/diary_comments.rb b/test/factories/diary_comments.rb index 810bd2f7a..2d54f273e 100644 --- a/test/factories/diary_comments.rb +++ b/test/factories/diary_comments.rb @@ -3,8 +3,6 @@ FactoryGirl.define do sequence(:body) { |n| "This is diary comment #{n}" } diary_entry - - # Fixme requires User Factory - user_id 1 + user end end diff --git a/test/factories/diary_entries.rb b/test/factories/diary_entries.rb index d00a97dc5..666a37ee8 100644 --- a/test/factories/diary_entries.rb +++ b/test/factories/diary_entries.rb @@ -3,7 +3,6 @@ FactoryGirl.define do sequence(:title) { |n| "Diary entry #{n}" } sequence(:body) { |n| "This is diary entry #{n}" } - # Fixme requires User Factory - user_id 1 + user end end diff --git a/test/factories/friends.rb b/test/factories/friends.rb index 46b14a39d..749846edb 100644 --- a/test/factories/friends.rb +++ b/test/factories/friends.rb @@ -1,7 +1,6 @@ FactoryGirl.define do factory :friend do - # Fixme requires User Factory - user_id 1 - friend_user_id 2 + association :befriender, :factory => :user + association :befriendee, :factory => :user end end diff --git a/test/factories/messages.rb b/test/factories/messages.rb index 75e65cdbf..9d9c30a48 100644 --- a/test/factories/messages.rb +++ b/test/factories/messages.rb @@ -4,11 +4,8 @@ FactoryGirl.define do sequence(:body) { |n| "Body text for message #{n}" } sent_on Time.now - # FIXME: needs user factory - from_user_id 1 - - # FIXME: needs user factory - to_user_id 2 + association :sender, :factory => :user + association :recipient, :factory => :user trait :unread do message_read false diff --git a/test/factories/traces.rb b/test/factories/traces.rb index 66f810468..76fd90590 100644 --- a/test/factories/traces.rb +++ b/test/factories/traces.rb @@ -3,8 +3,7 @@ FactoryGirl.define do sequence(:name) { |n| "Trace #{n}.gpx" } sequence(:description) { |n| "This is trace #{n}" } - # Fixme requires User Factory - user_id 1 + user timestamp Time.now inserted true diff --git a/test/factories/user.rb b/test/factories/user.rb index 9ec4e2030..802fedd91 100644 --- a/test/factories/user.rb +++ b/test/factories/user.rb @@ -4,6 +4,12 @@ FactoryGirl.define do sequence(:display_name) { |n| "User #{n}" } pass_crypt Digest::MD5.hexdigest("test") + # These attributes are not the defaults, but in most tests we want + # a 'normal' user who can log in without being redirected etc. + status "active" + terms_seen true + data_public true + trait :with_home_location do home_lat { rand(-90.0...90.0) } home_lon { rand(-180.0...180.0) } diff --git a/test/factories/user_blocks.rb b/test/factories/user_blocks.rb index b73e599b8..8f7edaf6e 100644 --- a/test/factories/user_blocks.rb +++ b/test/factories/user_blocks.rb @@ -3,11 +3,8 @@ FactoryGirl.define do sequence(:reason) { |n| "User Block #{n}" } ends_at Time.now + 1.day - # FIXME: requires User factory - user_id 13 - - # FIXME: requires User factory - creator_id 15 + user + association :creator, :factory => :moderator_user trait :needs_view do needs_view true diff --git a/test/factories/user_preferences.rb b/test/factories/user_preferences.rb index 552cfcd75..e6f0d6b87 100644 --- a/test/factories/user_preferences.rb +++ b/test/factories/user_preferences.rb @@ -3,7 +3,6 @@ FactoryGirl.define do sequence(:k) { |n| "Key #{n}" } sequence(:v) { |n| "Value #{n}" } - # FIXME: needs user factory - user_id 1 + user end end diff --git a/test/helpers/user_blocks_helper_test.rb b/test/helpers/user_blocks_helper_test.rb new file mode 100644 index 000000000..16f83ec89 --- /dev/null +++ b/test/helpers/user_blocks_helper_test.rb @@ -0,0 +1,16 @@ +require "test_helper" + +class UserBlocksHelperTest < ActionView::TestCase + include ApplicationHelper + + def test_block_status + block = create(:user_block, :needs_view, :ends_at => Time.now.getutc) + assert_equal "Active until the user logs in.", block_status(block) + + block = create(:user_block, :needs_view, :ends_at => Time.now.getutc + 1.hour) + assert_match %r{^Ends in about 1 hour and after the user has logged in\.$}, block_status(block) + + block = create(:user_block, :ends_at => Time.now.getutc + 1.hour) + assert_match %r{^Ends in about 1 hour\.$}, block_status(block) + end +end diff --git a/test/models/diary_comment_test.rb b/test/models/diary_comment_test.rb index 162cfa833..c40d5eb03 100644 --- a/test/models/diary_comment_test.rb +++ b/test/models/diary_comment_test.rb @@ -1,8 +1,6 @@ require "test_helper" class DiaryCommentTest < ActiveSupport::TestCase - fixtures :users - def setup # Create the default language for diary entries create(:language, :code => "en") diff --git a/test/models/diary_entry_test.rb b/test/models/diary_entry_test.rb index 6c9a75443..76e8bbbe0 100644 --- a/test/models/diary_entry_test.rb +++ b/test/models/diary_entry_test.rb @@ -1,8 +1,6 @@ require "test_helper" class DiaryEntryTest < ActiveSupport::TestCase - fixtures :users - def setup # Create the default language for diary entries create(:language, :code => "en") diff --git a/test/models/user_preference_test.rb b/test/models/user_preference_test.rb index c61bd607d..6f09d21c4 100644 --- a/test/models/user_preference_test.rb +++ b/test/models/user_preference_test.rb @@ -7,7 +7,7 @@ class UserPreferenceTest < ActiveSupport::TestCase def test_add_duplicate_preference up = create(:user_preference) new_up = UserPreference.new - new_up.user = users(:normal_user) + new_up.user = up.user new_up.k = up.k new_up.v = "some other value" assert_not_equal new_up.v, up.v diff --git a/vendor/assets/leaflet/leaflet.contextmenu.css b/vendor/assets/leaflet/leaflet.contextmenu.css new file mode 100644 index 000000000..0b5e2defc --- /dev/null +++ b/vendor/assets/leaflet/leaflet.contextmenu.css @@ -0,0 +1,54 @@ +.leaflet-contextmenu { + display: none; + box-shadow: 0 1px 7px rgba(0,0,0,0.4); + -webkit-border-radius: 4px; + border-radius: 4px; + padding: 4px 0; + background-color: #fff; + cursor: default; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item { + display: block; + color: #222; + font-size: 12px; + line-height: 20px; + text-decoration: none; + padding: 0 12px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + cursor: default; + outline: none; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item-disabled { + opacity: 0.5; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item.over { + background-color: #f4f4f4; + border-top: 1px solid #f0f0f0; + border-bottom: 1px solid #f0f0f0; +} + +.leaflet-contextmenu a.leaflet-contextmenu-item-disabled.over { + background-color: inherit; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; +} + +.leaflet-contextmenu-icon { + margin: 2px 8px 0 0; + width: 16px; + height: 16px; + float: left; + border: 0; +} + +.leaflet-contextmenu-separator { + border-bottom: 1px solid #ccc; + margin: 5px 0; +} diff --git a/vendor/assets/leaflet/leaflet.contextmenu.js b/vendor/assets/leaflet/leaflet.contextmenu.js new file mode 100644 index 000000000..a9b011d95 --- /dev/null +++ b/vendor/assets/leaflet/leaflet.contextmenu.js @@ -0,0 +1,580 @@ +/* + Leaflet.contextmenu, a context menu for Leaflet. + (c) 2015, Adam Ratcliffe, GeoSmart Maps Limited + + @preserve +*/ + +(function(factory) { + // Packaging/modules magic dance + var L; + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet'], factory); + } else if (typeof module === 'object' && typeof module.exports === 'object') { + // Node/CommonJS + L = require('leaflet'); + module.exports = factory(L); + } else { + // Browser globals + if (typeof window.L === 'undefined') { + throw new Error('Leaflet must be loaded first'); + } + factory(window.L); + } +})(function(L) { +L.Map.mergeOptions({ + contextmenuItems: [] +}); + +L.Map.ContextMenu = L.Handler.extend({ + _touchstart: L.Browser.msPointer ? 'MSPointerDown' : L.Browser.pointer ? 'pointerdown' : 'touchstart', + + statics: { + BASE_CLS: 'leaflet-contextmenu' + }, + + initialize: function (map) { + L.Handler.prototype.initialize.call(this, map); + + this._items = []; + this._visible = false; + + var container = this._container = L.DomUtil.create('div', L.Map.ContextMenu.BASE_CLS, map._container); + container.style.zIndex = 10000; + container.style.position = 'absolute'; + + if (map.options.contextmenuWidth) { + container.style.width = map.options.contextmenuWidth + 'px'; + } + + this._createItems(); + + L.DomEvent + .on(container, 'click', L.DomEvent.stop) + .on(container, 'mousedown', L.DomEvent.stop) + .on(container, 'dblclick', L.DomEvent.stop) + .on(container, 'contextmenu', L.DomEvent.stop); + }, + + addHooks: function () { + var container = this._map.getContainer(); + + L.DomEvent + .on(container, 'mouseleave', this._hide, this) + .on(document, 'keydown', this._onKeyDown, this); + + if (L.Browser.touch) { + L.DomEvent.on(document, this._touchstart, this._hide, this); + } + + this._map.on({ + contextmenu: this._show, + mousedown: this._hide, + movestart: this._hide, + zoomstart: this._hide + }, this); + }, + + removeHooks: function () { + var container = this._map.getContainer(); + + L.DomEvent + .off(container, 'mouseleave', this._hide, this) + .off(document, 'keydown', this._onKeyDown, this); + + if (L.Browser.touch) { + L.DomEvent.off(document, this._touchstart, this._hide, this); + } + + this._map.off({ + contextmenu: this._show, + mousedown: this._hide, + movestart: this._hide, + zoomstart: this._hide + }, this); + }, + + showAt: function (point, data) { + if (point instanceof L.LatLng) { + point = this._map.latLngToContainerPoint(point); + } + this._showAtPoint(point, data); + }, + + hide: function () { + this._hide(); + }, + + addItem: function (options) { + return this.insertItem(options); + }, + + insertItem: function (options, index) { + index = index !== undefined ? index: this._items.length; + + var item = this._createItem(this._container, options, index); + + this._items.push(item); + + this._sizeChanged = true; + + this._map.fire('contextmenu.additem', { + contextmenu: this, + el: item.el, + index: index + }); + + return item.el; + }, + + removeItem: function (item) { + var container = this._container; + + if (!isNaN(item)) { + item = container.children[item]; + } + + if (item) { + this._removeItem(L.Util.stamp(item)); + + this._sizeChanged = true; + + this._map.fire('contextmenu.removeitem', { + contextmenu: this, + el: item + }); + } + }, + + removeAllItems: function () { + var item; + + while (this._container.children.length) { + item = this._container.children[0]; + this._removeItem(L.Util.stamp(item)); + } + }, + + hideAllItems: function () { + var item, i, l; + + for (i = 0, l = this._items.length; i < l; i++) { + item = this._items[i]; + item.el.style.display = 'none'; + } + }, + + showAllItems: function () { + var item, i, l; + + for (i = 0, l = this._items.length; i < l; i++) { + item = this._items[i]; + item.el.style.display = ''; + } + }, + + setDisabled: function (item, disabled) { + var container = this._container, + itemCls = L.Map.ContextMenu.BASE_CLS + '-item'; + + if (!isNaN(item)) { + item = container.children[item]; + } + + if (item && L.DomUtil.hasClass(item, itemCls)) { + if (disabled) { + L.DomUtil.addClass(item, itemCls + '-disabled'); + this._map.fire('contextmenu.disableitem', { + contextmenu: this, + el: item + }); + } else { + L.DomUtil.removeClass(item, itemCls + '-disabled'); + this._map.fire('contextmenu.enableitem', { + contextmenu: this, + el: item + }); + } + } + }, + + isVisible: function () { + return this._visible; + }, + + _createItems: function () { + var itemOptions = this._map.options.contextmenuItems, + item, + i, l; + + for (i = 0, l = itemOptions.length; i < l; i++) { + this._items.push(this._createItem(this._container, itemOptions[i])); + } + }, + + _createItem: function (container, options, index) { + if (options.separator || options === '-') { + return this._createSeparator(container, index); + } + + var itemCls = L.Map.ContextMenu.BASE_CLS + '-item', + cls = options.disabled ? (itemCls + ' ' + itemCls + '-disabled') : itemCls, + el = this._insertElementAt('a', cls, container, index), + callback = this._createEventHandler(el, options.callback, options.context, options.hideOnSelect), + icon = this._getIcon(options), + iconCls = this._getIconCls(options), + html = ''; + + if (icon) { + html = ''; + } else if (iconCls) { + html = ''; + } + + el.innerHTML = html + options.text; + el.href = '#'; + + L.DomEvent + .on(el, 'mouseover', this._onItemMouseOver, this) + .on(el, 'mouseout', this._onItemMouseOut, this) + .on(el, 'mousedown', L.DomEvent.stopPropagation) + .on(el, 'click', callback); + + if (L.Browser.touch) { + L.DomEvent.on(el, this._touchstart, L.DomEvent.stopPropagation); + } + + // Devices without a mouse fire "mouseover" on tap, but never “mouseout" + if (!L.Browser.pointer) { + L.DomEvent.on(el, 'click', this._onItemMouseOut, this); + } + + return { + id: L.Util.stamp(el), + el: el, + callback: callback + }; + }, + + _removeItem: function (id) { + var item, + el, + i, l, callback; + + for (i = 0, l = this._items.length; i < l; i++) { + item = this._items[i]; + + if (item.id === id) { + el = item.el; + callback = item.callback; + + if (callback) { + L.DomEvent + .off(el, 'mouseover', this._onItemMouseOver, this) + .off(el, 'mouseover', this._onItemMouseOut, this) + .off(el, 'mousedown', L.DomEvent.stopPropagation) + .off(el, 'click', callback); + + if (L.Browser.touch) { + L.DomEvent.off(el, this._touchstart, L.DomEvent.stopPropagation); + } + + if (!L.Browser.pointer) { + L.DomEvent.on(el, 'click', this._onItemMouseOut, this); + } + } + + this._container.removeChild(el); + this._items.splice(i, 1); + + return item; + } + } + return null; + }, + + _createSeparator: function (container, index) { + var el = this._insertElementAt('div', L.Map.ContextMenu.BASE_CLS + '-separator', container, index); + + return { + id: L.Util.stamp(el), + el: el + }; + }, + + _createEventHandler: function (el, func, context, hideOnSelect) { + var me = this, + map = this._map, + disabledCls = L.Map.ContextMenu.BASE_CLS + '-item-disabled', + hideOnSelect = (hideOnSelect !== undefined) ? hideOnSelect : true; + + return function (e) { + if (L.DomUtil.hasClass(el, disabledCls)) { + return; + } + + if (hideOnSelect) { + me._hide(); + } + + if (func) { + func.call(context || map, me._showLocation); + } + + me._map.fire('contextmenu:select', { + contextmenu: me, + el: el + }); + }; + }, + + _insertElementAt: function (tagName, className, container, index) { + var refEl, + el = document.createElement(tagName); + + el.className = className; + + if (index !== undefined) { + refEl = container.children[index]; + } + + if (refEl) { + container.insertBefore(el, refEl); + } else { + container.appendChild(el); + } + + return el; + }, + + _show: function (e) { + this._showAtPoint(e.containerPoint, e); + }, + + _showAtPoint: function (pt, data) { + if (this._items.length) { + var map = this._map, + layerPoint = map.containerPointToLayerPoint(pt), + latlng = map.layerPointToLatLng(layerPoint), + event = L.extend(data || {}, {contextmenu: this}); + + this._showLocation = { + latlng: latlng, + layerPoint: layerPoint, + containerPoint: pt + }; + + if (data && data.relatedTarget){ + this._showLocation.relatedTarget = data.relatedTarget; + } + + this._setPosition(pt); + + if (!this._visible) { + this._container.style.display = 'block'; + this._visible = true; + } + + this._map.fire('contextmenu.show', event); + } + }, + + _hide: function () { + if (this._visible) { + this._visible = false; + this._container.style.display = 'none'; + this._map.fire('contextmenu.hide', {contextmenu: this}); + } + }, + + _getIcon: function (options) { + return L.Browser.retina && options.retinaIcon || options.icon; + }, + + _getIconCls: function (options) { + return L.Browser.retina && options.retinaIconCls || options.iconCls; + }, + + _setPosition: function (pt) { + var mapSize = this._map.getSize(), + container = this._container, + containerSize = this._getElementSize(container), + anchor; + + if (this._map.options.contextmenuAnchor) { + anchor = L.point(this._map.options.contextmenuAnchor); + pt = pt.add(anchor); + } + + container._leaflet_pos = pt; + + if (pt.x + containerSize.x > mapSize.x) { + container.style.left = 'auto'; + container.style.right = Math.min(Math.max(mapSize.x - pt.x, 0), mapSize.x - containerSize.x - 1) + 'px'; + } else { + container.style.left = Math.max(pt.x, 0) + 'px'; + container.style.right = 'auto'; + } + + if (pt.y + containerSize.y > mapSize.y) { + container.style.top = 'auto'; + container.style.bottom = Math.min(Math.max(mapSize.y - pt.y, 0), mapSize.y - containerSize.y - 1) + 'px'; + } else { + container.style.top = Math.max(pt.y, 0) + 'px'; + container.style.bottom = 'auto'; + } + }, + + _getElementSize: function (el) { + var size = this._size, + initialDisplay = el.style.display; + + if (!size || this._sizeChanged) { + size = {}; + + el.style.left = '-999999px'; + el.style.right = 'auto'; + el.style.display = 'block'; + + size.x = el.offsetWidth; + size.y = el.offsetHeight; + + el.style.left = 'auto'; + el.style.display = initialDisplay; + + this._sizeChanged = false; + } + + return size; + }, + + _onKeyDown: function (e) { + var key = e.keyCode; + + // If ESC pressed and context menu is visible hide it + if (key === 27) { + this._hide(); + } + }, + + _onItemMouseOver: function (e) { + L.DomUtil.addClass(e.target || e.srcElement, 'over'); + }, + + _onItemMouseOut: function (e) { + L.DomUtil.removeClass(e.target || e.srcElement, 'over'); + } +}); + +L.Map.addInitHook('addHandler', 'contextmenu', L.Map.ContextMenu); +L.Mixin.ContextMenu = { + bindContextMenu: function (options) { + L.setOptions(this, options); + this._initContextMenu(); + + return this; + }, + + unbindContextMenu: function (){ + this.off('contextmenu', this._showContextMenu, this); + + return this; + }, + + addContextMenuItem: function (item) { + this.options.contextmenuItems.push(item); + }, + + removeContextMenuItemWithIndex: function (index) { + var items = []; + for (var i = 0; i < this.options.contextmenuItems.length; i++) { + if (this.options.contextmenuItems[i].index == index){ + items.push(i); + } + } + var elem = items.pop(); + while (elem !== undefined) { + this.options.contextmenuItems.splice(elem,1); + elem = items.pop(); + } + }, + + replaceContextMenuItem: function (item) { + this.removeContextMenuItemWithIndex(item.index); + this.addContextMenuItem(item); + }, + + _initContextMenu: function () { + this._items = []; + + this.on('contextmenu', this._showContextMenu, this); + }, + + _showContextMenu: function (e) { + var itemOptions, + data, pt, i, l; + + if (this._map.contextmenu) { + data = L.extend({relatedTarget: this}, e); + + pt = this._map.mouseEventToContainerPoint(e.originalEvent); + + if (!this.options.contextmenuInheritItems) { + this._map.contextmenu.hideAllItems(); + } + + for (i = 0, l = this.options.contextmenuItems.length; i < l; i++) { + itemOptions = this.options.contextmenuItems[i]; + this._items.push(this._map.contextmenu.insertItem(itemOptions, itemOptions.index)); + } + + this._map.once('contextmenu.hide', this._hideContextMenu, this); + + this._map.contextmenu.showAt(pt, data); + } + }, + + _hideContextMenu: function () { + var i, l; + + for (i = 0, l = this._items.length; i < l; i++) { + this._map.contextmenu.removeItem(this._items[i]); + } + this._items.length = 0; + + if (!this.options.contextmenuInheritItems) { + this._map.contextmenu.showAllItems(); + } + } +}; + +var classes = [L.Marker, L.Path], + defaultOptions = { + contextmenu: false, + contextmenuItems: [], + contextmenuInheritItems: true + }, + cls, i, l; + +for (i = 0, l = classes.length; i < l; i++) { + cls = classes[i]; + + // L.Class should probably provide an empty options hash, as it does not test + // for it here and add if needed + if (!cls.prototype.options) { + cls.prototype.options = defaultOptions; + } else { + cls.mergeOptions(defaultOptions); + } + + cls.addInitHook(function () { + if (this.options.contextmenu) { + this._initContextMenu(); + } + }); + + cls.include(L.Mixin.ContextMenu); +} +return L.Map.ContextMenu; +});