Naming/UncommunicativeMethodParamName:
Enabled: false
-Rails/ApplicationRecord:
- Enabled: false
-
Rails/CreateTableWithTimestamps:
Enabled: false
source "https://rubygems.org"
# Require rails
-gem "rails", "5.2.3"
+gem "rails", "6.0.1"
# Require things which have moved to gems in ruby 1.9
gem "bigdecimal", "~> 1.1.0", :platforms => :ruby_19
# Use Uglifier as compressor for JavaScript assets
gem "uglifier", ">= 1.3.0"
-# Use CoffeeScript for .js.coffee assets and views
-gem "coffee-rails", "~> 4.2"
-
# Use jquery as the JavaScript library
gem "jquery-rails"
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
-# gem 'jbuilder', '~> 2.0'
-gem "jsonify-rails"
+gem "jbuilder", "~> 2.7"
# Reduces boot times through caching; required in config/boot.rb
-gem "bootsnap", ">= 1.1.0", :require => false
+gem "bootsnap", ">= 1.4.2", :require => false
# Use R2 for RTL conversion
gem "r2", "~> 0.2.7"
gem "image_optim_rails"
# Load rails plugins
-gem "actionpack-page_caching"
gem "active_record_union"
gem "activerecord-import"
gem "cancancan"
-gem "composite_primary_keys", "~> 11.1.0"
+gem "composite_primary_keys", "~> 12.0.0"
gem "config"
gem "delayed_job_active_record"
gem "dynamic_form"
gem "http_accept_language", "~> 2.0.0"
gem "i18n-js", ">= 3.0.0"
gem "oauth-plugin", ">= 0.5.1"
+gem "openstreetmap-actionpack-page_caching", ">= 1.1.2", :require => "actionpack/page_caching"
gem "openstreetmap-deadlock_retry", ">= 1.3.0", :require => "deadlock_retry"
gem "rack-cors"
gem "rails-i18n", "~> 4.0.0"
-gem "record_tag_helper"
gem "rinku", ">= 2.0.6", :require => "rails_rinku"
gem "strong_migrations"
gem "validates_email_format_of", ">= 1.5.1"
# Needed in development as well so rake can see konacha tasks
group :development, :test do
- gem "capybara", "~> 2.13"
+ gem "capybara", ">= 2.15"
gem "coveralls", :require => false
gem "erb_lint", :require => false
gem "factory_bot_rails"
gem "poltergeist"
- gem "puma", "~> 3.7"
+ gem "puma", "~> 3.11"
+ gem "selenium-webdriver"
end
SystemTimer (1.2.3)
aasm (5.0.6)
concurrent-ruby (~> 1.0)
- actioncable (5.2.3)
- actionpack (= 5.2.3)
+ actioncable (6.0.1)
+ actionpack (= 6.0.1)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailer (5.2.3)
- actionpack (= 5.2.3)
- actionview (= 5.2.3)
- activejob (= 5.2.3)
+ actionmailbox (6.0.1)
+ actionpack (= 6.0.1)
+ activejob (= 6.0.1)
+ activerecord (= 6.0.1)
+ activestorage (= 6.0.1)
+ activesupport (= 6.0.1)
+ mail (>= 2.7.1)
+ actionmailer (6.0.1)
+ actionpack (= 6.0.1)
+ actionview (= 6.0.1)
+ activejob (= 6.0.1)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (5.2.3)
- actionview (= 5.2.3)
- activesupport (= 5.2.3)
+ actionpack (6.0.1)
+ actionview (= 6.0.1)
+ activesupport (= 6.0.1)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
- actionpack-page_caching (1.1.1)
- actionpack (>= 4.0.0, < 6)
- actionview (5.2.3)
- activesupport (= 5.2.3)
+ rails-html-sanitizer (~> 1.0, >= 1.2.0)
+ actiontext (6.0.1)
+ actionpack (= 6.0.1)
+ activerecord (= 6.0.1)
+ activestorage (= 6.0.1)
+ activesupport (= 6.0.1)
+ nokogiri (>= 1.8.5)
+ actionview (6.0.1)
+ activesupport (= 6.0.1)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
+ rails-html-sanitizer (~> 1.1, >= 1.2.0)
active_record_union (1.3.0)
activerecord (>= 4.0)
- activejob (5.2.3)
- activesupport (= 5.2.3)
+ activejob (6.0.1)
+ activesupport (= 6.0.1)
globalid (>= 0.3.6)
- activemodel (5.2.3)
- activesupport (= 5.2.3)
- activerecord (5.2.3)
- activemodel (= 5.2.3)
- activesupport (= 5.2.3)
- arel (>= 9.0)
+ activemodel (6.0.1)
+ activesupport (= 6.0.1)
+ activerecord (6.0.1)
+ activemodel (= 6.0.1)
+ activesupport (= 6.0.1)
activerecord-import (1.0.3)
activerecord (>= 3.2)
- activestorage (5.2.3)
- actionpack (= 5.2.3)
- activerecord (= 5.2.3)
+ activestorage (6.0.1)
+ actionpack (= 6.0.1)
+ activejob (= 6.0.1)
+ activerecord (= 6.0.1)
marcel (~> 0.3.1)
- activesupport (5.2.3)
+ activesupport (6.0.1)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
tzinfo (~> 1.1)
+ zeitwerk (~> 2.2)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
- annotate (3.0.2)
+ annotate (3.0.3)
activerecord (>= 3.2, < 7.0)
- rake (>= 10.4, < 13.0)
- arel (9.0.0)
+ rake (>= 10.4, < 14.0)
ast (2.4.0)
autoprefixer-rails (8.6.5)
execjs
aws-eventstream (1.0.3)
- aws-partitions (1.232.0)
- aws-sdk-core (3.73.0)
+ aws-partitions (1.244.0)
+ aws-sdk-core (3.81.0)
aws-eventstream (~> 1.0, >= 1.0.2)
- aws-partitions (~> 1, >= 1.228.0)
+ aws-partitions (~> 1, >= 1.239.0)
aws-sigv4 (~> 1.1)
jmespath (~> 1.0)
aws-sdk-kms (1.25.0)
aws-sdk-core (~> 3, >= 3.71.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.53.0)
- aws-sdk-core (~> 3, >= 3.71.0)
+ aws-sdk-s3 (1.57.0)
+ aws-sdk-core (~> 3, >= 3.77.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.1)
aws-sigv4 (1.1.0)
debug_inspector (>= 0.0.1)
bootsnap (1.4.5)
msgpack (~> 1.0)
- browser (2.6.1)
+ browser (2.7.0)
builder (3.2.3)
bzip2-ffi (1.0.0)
ffi (~> 1.0)
cancancan (3.0.1)
canonical-rails (0.2.6)
rails (>= 4.1, < 6.1)
- capybara (2.18.0)
+ capybara (3.29.0)
addressable
mini_mime (>= 0.1.3)
- nokogiri (>= 1.3.3)
- rack (>= 1.0.0)
- rack-test (>= 0.5.4)
- xpath (>= 2.0, < 4.0)
+ nokogiri (~> 1.8)
+ rack (>= 1.6.0)
+ rack-test (>= 0.6.3)
+ regexp_parser (~> 1.5)
+ xpath (~> 3.2)
+ childprocess (3.0.0)
cliver (0.3.2)
coderay (1.1.2)
- coffee-rails (4.2.2)
- coffee-script (>= 2.2.0)
- railties (>= 4.0.0)
- coffee-script (2.4.1)
- coffee-script-source
- execjs
- coffee-script-source (1.12.2)
- composite_primary_keys (11.1.0)
- activerecord (~> 5.2.1)
+ composite_primary_keys (12.0.0)
+ activerecord (~> 6.0.0)
concurrent-ruby (1.1.5)
config (2.0.0)
activesupport (>= 4.2)
activerecord (>= 3.0, < 6.1)
delayed_job (>= 3.0, < 5)
docile (1.3.2)
- dry-configurable (0.8.3)
+ dry-configurable (0.9.0)
concurrent-ruby (~> 1.0)
dry-core (~> 0.4, >= 0.4.7)
dry-container (0.7.2)
dry-configurable (~> 0.1, >= 0.1.3)
dry-core (0.4.9)
concurrent-ruby (~> 1.0)
- dry-equalizer (0.2.2)
+ dry-equalizer (0.3.0)
dry-inflector (0.2.0)
- dry-initializer (3.0.1)
- dry-logic (1.0.3)
+ dry-initializer (3.0.2)
+ dry-logic (1.0.5)
concurrent-ruby (~> 1.0)
dry-core (~> 0.2)
dry-equalizer (~> 0.2)
dry-initializer (~> 3.0)
dry-logic (~> 1.0)
dry-types (~> 1.2)
- dry-types (1.2.0)
+ dry-types (1.2.1)
concurrent-ruby (~> 1.0)
dry-container (~> 0.3)
dry-core (~> 0.4, >= 0.4.4)
fakefs (0.20.1)
faraday (0.17.0)
multipart-post (>= 1.2, < 3)
- ffi (1.11.1)
+ ffi (1.11.2)
ffi-libarchive (0.4.10)
ffi (~> 1.0)
fspath (3.1.2)
http_accept_language (2.0.5)
i18n (0.9.5)
concurrent-ruby (~> 1.0)
- i18n-js (3.4.1)
+ i18n-js (3.5.0)
i18n (>= 0.6.6)
image_optim (0.26.5)
exifr (~> 1.2, >= 1.2.2)
image_size (2.0.2)
in_threads (1.5.3)
jaro_winkler (1.5.4)
+ jbuilder (2.9.1)
+ activesupport (>= 4.2.0)
jmespath (1.4.0)
jquery-rails (4.3.5)
rails-dom-testing (>= 1, < 3)
railties (>= 4.2.0)
thor (>= 0.14, < 2.0)
json (2.2.0)
- jsonify (0.3.1)
- multi_json (~> 1.0)
- jsonify-rails (0.3.2)
- actionpack
- jsonify (< 0.4.0)
jwt (2.2.1)
kgio (2.11.2)
kramdown (2.1.0)
nio4r (2.5.2)
nokogiri (1.10.5)
mini_portile2 (~> 2.4.0)
- nokogumbo (2.0.1)
+ nokogumbo (2.0.2)
nokogiri (~> 1.8, >= 1.8.4)
oauth (0.4.7)
oauth-plugin (0.5.1)
omniauth-windowslive (0.0.12)
multi_json (~> 1.12)
omniauth-oauth2 (~> 1.4)
+ openstreetmap-actionpack-page_caching (1.1.2)
+ actionpack (>= 5.0.0)
openstreetmap-deadlock_retry (1.3.0)
- parallel (1.18.0)
+ parallel (1.19.1)
parser (2.6.5.0)
ast (~> 2.4.0)
pg (1.1.4)
quad_tile (1.0.1)
r2 (0.2.7)
rack (2.0.7)
- rack-cors (1.0.3)
+ rack-cors (1.1.0)
+ rack (>= 2.0.0)
rack-openid (1.3.1)
rack (>= 1.1.0)
ruby-openid (>= 2.1.8)
rack-test (1.1.0)
rack (>= 1.0, < 3)
rack-uri_sanitizer (0.0.2)
- rails (5.2.3)
- actioncable (= 5.2.3)
- actionmailer (= 5.2.3)
- actionpack (= 5.2.3)
- actionview (= 5.2.3)
- activejob (= 5.2.3)
- activemodel (= 5.2.3)
- activerecord (= 5.2.3)
- activestorage (= 5.2.3)
- activesupport (= 5.2.3)
+ rails (6.0.1)
+ actioncable (= 6.0.1)
+ actionmailbox (= 6.0.1)
+ actionmailer (= 6.0.1)
+ actionpack (= 6.0.1)
+ actiontext (= 6.0.1)
+ actionview (= 6.0.1)
+ activejob (= 6.0.1)
+ activemodel (= 6.0.1)
+ activerecord (= 6.0.1)
+ activestorage (= 6.0.1)
+ activesupport (= 6.0.1)
bundler (>= 1.3.0)
- railties (= 5.2.3)
+ railties (= 6.0.1)
sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.4)
actionpack (>= 5.0.1.x)
rails-i18n (4.0.2)
i18n (~> 0.6)
rails (>= 4.0)
- railties (5.2.3)
- actionpack (= 5.2.3)
- activesupport (= 5.2.3)
+ railties (6.0.1)
+ actionpack (= 6.0.1)
+ activesupport (= 6.0.1)
method_source
rake (>= 0.8.7)
- thor (>= 0.19.0, < 2.0)
+ thor (>= 0.20.3, < 2.0)
rainbow (3.0.0)
- rake (12.3.3)
+ rake (13.0.1)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
- record_tag_helper (1.0.0)
- actionview (~> 5.x)
+ regexp_parser (1.6.0)
request_store (1.4.1)
rack (>= 1.4)
rinku (2.0.6)
rainbow (>= 2.2.2, < 4.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 1.4.0, < 1.7)
- rubocop-performance (1.5.0)
+ rubocop-performance (1.5.1)
rubocop (>= 0.71.0)
rubocop-rails (2.3.2)
rack (>= 1.1)
rubocop (>= 0.72.0)
ruby-openid (2.9.2)
ruby-progressbar (1.10.1)
+ rubyzip (2.0.0)
safe_yaml (1.0.5)
sanitize (5.1.0)
crass (~> 1.0.2)
sprockets-rails
tilt
secure_headers (6.1.1)
+ selenium-webdriver (3.142.6)
+ childprocess (>= 0.5, < 4.0)
+ rubyzip (>= 1.2.2)
simplecov (0.16.1)
docile (~> 1.1)
json (>= 1.8, < 3)
thor (0.20.3)
thread_safe (0.3.6)
tilt (2.0.10)
- tins (1.22.0)
+ tins (1.22.2)
tzinfo (1.2.5)
thread_safe (~> 0.1)
uglifier (4.2.0)
websocket-extensions (0.1.4)
xpath (3.2.0)
nokogiri (~> 1.8)
+ zeitwerk (2.2.1)
PLATFORMS
ruby
DEPENDENCIES
SystemTimer (>= 1.1.3)
aasm
- actionpack-page_caching
active_record_union
activerecord-import
annotate
better_errors
bigdecimal (~> 1.1.0)
binding_of_caller
- bootsnap (>= 1.1.0)
+ bootsnap (>= 1.4.2)
browser
bzip2-ffi
cancancan
canonical-rails
- capybara (~> 2.13)
- coffee-rails (~> 4.2)
- composite_primary_keys (~> 11.1.0)
+ capybara (>= 2.15)
+ composite_primary_keys (~> 12.0.0)
config
coveralls
dalli
http_accept_language (~> 2.0.0)
i18n-js (>= 3.0.0)
image_optim_rails
+ jbuilder (~> 2.7)
jquery-rails
json
- jsonify-rails
kgio
kramdown
libxml-ruby (>= 2.0.5)
omniauth-mediawiki (>= 0.0.4)
omniauth-openid
omniauth-windowslive
+ openstreetmap-actionpack-page_caching (>= 1.1.2)
openstreetmap-deadlock_retry (>= 1.3.0)
pg
poltergeist
psych
- puma (~> 3.7)
+ puma (~> 3.11)
quad_tile (~> 1.0.1)
r2 (~> 0.2.7)
rack-cors
rack-uri_sanitizer
- rails (= 5.2.3)
+ rails (= 6.0.1)
rails-controller-testing
rails-i18n (~> 4.0.0)
- record_tag_helper
rinku (>= 2.0.6)
rotp
rubocop
sanitize
sassc-rails
secure_headers
+ selenium-webdriver
strong_migrations
uglifier (>= 1.3.0)
validates_email_format_of (>= 1.5.1)
folder 'javascripts' do
file 'html5shiv.js', 'https://raw.githubusercontent.com/aFarkas/html5shiv/master/src/html5shiv.js'
- file 'bowser.js', 'https://github.com/lancedikson/bowser/releases/download/1.9.4/bowser.js'
end
folder 'swfobject' do
can [:new, :create, :reply, :show, :inbox, :outbox, :mark, :destroy], Message
can [:close, :reopen], Note
can [:new, :create], Report
- can [:mine, :new, :create, :edit, :update, :delete], Trace
+ can [:mine, :new, :create, :edit, :update, :destroy], Trace
can [:account, :go_public, :make_friend, :remove_friend], User
if user.moderator?
can [:new, :create], Report
can [:create, :show, :update, :destroy, :data], Trace
can [:details, :gpx_files], User
- can [:read, :read_one, :update, :update_one, :delete_one], UserPreference
+ can [:index, :show, :update, :update_all, :destroy], UserPreference
if user.terms_agreed?
can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset
can [:create, :update, :destroy], Trace if capability?(token, :allow_write_gpx)
can [:details], User if capability?(token, :allow_read_prefs)
can [:gpx_files], User if capability?(token, :allow_read_gpx)
- can [:read, :read_one], UserPreference if capability?(token, :allow_read_prefs)
- can [:update, :update_one, :delete_one], UserPreference if capability?(token, :allow_write_prefs)
+ can [:index, :show], UserPreference if capability?(token, :allow_read_prefs)
+ can [:update, :update_all, :destroy], UserPreference if capability?(token, :allow_write_prefs)
if token&.user&.terms_agreed?
can [:create, :update, :upload, :close, :subscribe, :unsubscribe], Changeset if capability?(token, :allow_write_api)
//= require index/changeset
//= require index/query
//= require router
-//= require bowser
//= require querystring
$(document).ready(function () {
bottom: bbox.getSouth() - 0.0001
};
- if (location.protocol === "http" ||
- bowser.check({ chrome: "53", firefox: "55" })) {
- url = "http://127.0.0.1:8111/load_and_zoom?";
- } else {
- url = "https://127.0.0.1:8112/load_and_zoom?";
- }
+ url = "http://127.0.0.1:8111/load_and_zoom?";
if (object) query.select = object.type + object.id;
.shop.shoes::before { content: image-url('browse/shop_shoes.16.png'); }
.shop.supermarket::before { content: image-url('browse/shop_supermarket.p.16.png'); }
- .tourism.alpine_hut::before { content: image-url('browse/alpinehut.p.16.png'); }
+ .tourism.alpine_hut::before { content: image-url('browse/tourism_alpine_hut.16.png'); }
.tourism.camp_site::before { content: image-url('browse/tourism_camp_site.16.png'); }
.tourism.caravan_site::before { content: image-url('browse/tourism_caravan_site.16.png'); }
.tourism.hostel::before { content: image-url('browse/tourism_hostel.16.png'); }
.tourism.museum::before { content: image-url('browse/tourism_museum.16.png'); }
.tourism.picnic_site::before { content: image-url('browse/tourism_picnic_site.16.png'); }
.tourism.viewpoint::before { content: image-url('browse/view_point.p.16.png'); }
+ .tourism.wilderness_hut::before { content: image-url('browse/tourism_wilderness_hut.16.png'); }
/* Ways */
.natural.grassland::before { content: image-url('browse/grassland.png'); }
.natural.heath::before { content: image-url('browse/heathland.png'); }
+ .natural.scrub::before { content: image-url('browse/scrub.png'); }
.natural.water::before { content: image-url('browse/lake.png'); }
.natural.wood::before { content: image-url('browse/wood.png'); }
##
# return all the preferences as an XML document
- def read
- doc = OSM::API.new.get_xml_doc
+ def index
+ @user_preferences = current_user.preferences
- prefs = current_user.preferences
-
- el1 = XML::Node.new "preferences"
-
- prefs.each do |pref|
- el1 << pref.to_xml_node
- end
-
- doc.root << el1
- render :xml => doc.to_s
+ render :formats => [:xml]
end
##
# return the value for a single preference
- def read_one
+ def show
pref = UserPreference.find([current_user.id, params[:preference_key]])
render :plain => pref.v.to_s
end
# update the entire set of preferences
- def update
+ def update_all
old_preferences = current_user.preferences.each_with_object({}) do |preference, preferences|
preferences[preference.k] = preference
end
##
# update the value of a single preference
- def update_one
+ def update
begin
pref = UserPreference.find([current_user.id, params[:preference_key]])
rescue ActiveRecord::RecordNotFound
##
# delete a single preference
- def delete_one
+ def destroy
UserPreference.find([current_user.id, params[:preference_key]]).delete
render :plain => ""
authorize_resource
- before_action :check_database_writable, :only => [:new, :create, :edit, :delete]
+ before_action :check_database_writable, :only => [:new, :create, :edit, :destroy]
before_action :offline_warning, :only => [:mine, :show]
- before_action :offline_redirect, :only => [:new, :create, :edit, :delete, :data]
+ before_action :offline_redirect, :only => [:new, :create, :edit, :destroy, :data]
# Counts and selects pages of GPX traces for various criteria (by user, tags, public etc.).
# target_user - if set, specifies the user to fetch traces for. if not set will fetch all traces
head :not_found
end
- def delete
+ def destroy
trace = Trace.find(params[:id])
if !trace.visible?
class Notifier < ActionMailer::Base
include ActionView::Helpers::AssetUrlHelper
+ self.delivery_job = ActionMailer::MailDeliveryJob
+
default :from => Settings.email_from,
:return_path => Settings.email_return_path,
:auto_submitted => "auto-generated"
# index_acls_on_mx (mx)
#
-class Acl < ActiveRecord::Base
+class Acl < ApplicationRecord
validates :k, :presence => true
def self.match(address, options = {})
--- /dev/null
+class ApplicationRecord < ActiveRecord::Base
+ self.abstract_class = true
+end
# changesets_user_id_fkey (user_id => users.id)
#
-class Changeset < ActiveRecord::Base
+class Changeset < ApplicationRecord
require "xml/libxml"
belongs_to :user, :counter_cache => true
# changeset_comments_changeset_id_fkey (changeset_id => changesets.id)
#
-class ChangesetComment < ActiveRecord::Base
+class ChangesetComment < ApplicationRecord
belongs_to :changeset
belongs_to :author, :class_name => "User"
# changeset_tags_id_fkey (changeset_id => changesets.id)
#
-class ChangesetTag < ActiveRecord::Base
+class ChangesetTag < ApplicationRecord
self.primary_keys = "changeset_id", "k"
belongs_to :changeset
# client_applications_user_id_fkey (user_id => users.id)
#
-class ClientApplication < ActiveRecord::Base
+class ClientApplication < ApplicationRecord
belongs_to :user
has_many :tokens, :class_name => "OauthToken", :dependent => :delete_all
has_many :access_tokens
# diary_comments_user_id_fkey (user_id => users.id)
#
-class DiaryComment < ActiveRecord::Base
+class DiaryComment < ApplicationRecord
belongs_to :user
belongs_to :diary_entry
# diary_entries_user_id_fkey (user_id => users.id)
#
-class DiaryEntry < ActiveRecord::Base
+class DiaryEntry < ApplicationRecord
belongs_to :user, :counter_cache => true
belongs_to :language, :foreign_key => "language_code"
# diary_entry_subscriptions_user_id_fkey (user_id => users.id)
#
-class DiaryEntrySubscription < ActiveRecord::Base
+class DiaryEntrySubscription < ApplicationRecord
self.primary_keys = "user_id", "diary_entry_id"
belongs_to :user
# friends_user_id_fkey (user_id => users.id)
#
-class Friendship < ActiveRecord::Base
+class Friendship < ApplicationRecord
self.table_name = "friends"
belongs_to :befriender, :class_name => "User", :foreign_key => :user_id
# issues_updated_by_fkey (updated_by => users.id)
#
-class Issue < ActiveRecord::Base
+class Issue < ApplicationRecord
belongs_to :reportable, :polymorphic => true
belongs_to :reported_user, :class_name => "User", :foreign_key => :reported_user_id
belongs_to :user_resolved, :class_name => "User", :foreign_key => :resolved_by
# issue_comments_user_id_fkey (user_id => users.id)
#
-class IssueComment < ActiveRecord::Base
+class IssueComment < ApplicationRecord
belongs_to :issue
belongs_to :user
# native_name :string
#
-class Language < ActiveRecord::Base
+class Language < ApplicationRecord
self.primary_key = "code"
has_many :diary_entries, :foreign_key => "language"
# messages_to_user_id_fkey (to_user_id => users.id)
#
-class Message < ActiveRecord::Base
+class Message < ApplicationRecord
belongs_to :sender, :class_name => "User", :foreign_key => :from_user_id
belongs_to :recipient, :class_name => "User", :foreign_key => :to_user_id
# current_nodes_changeset_id_fkey (changeset_id => changesets.id)
#
-class Node < ActiveRecord::Base
+class Node < ApplicationRecord
require "xml/libxml"
include GeoRecord
save_with_history!
end
- def to_xml
- doc = OSM::API.new.get_xml_doc
- doc.root << to_xml_node
- doc
- end
-
- def to_xml_node(changeset_cache = {}, user_display_name_cache = {})
- el = XML::Node.new "node"
- el["id"] = id.to_s
-
- add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache)
-
- if visible?
- el["lat"] = lat.to_s
- el["lon"] = lon.to_s
- end
-
- add_tags_to_xml_node(el, node_tags)
-
- el
- end
-
def tags_as_hash
tags
end
# current_node_tags_id_fkey (node_id => current_nodes.id)
#
-class NodeTag < ActiveRecord::Base
+class NodeTag < ApplicationRecord
self.table_name = "current_node_tags"
self.primary_keys = "node_id", "k"
# notes_updated_at_idx (updated_at)
#
-class Note < ActiveRecord::Base
+class Note < ApplicationRecord
include GeoRecord
has_many :comments, -> { left_joins(:author).where(:visible => true, :users => { :status => [nil, "active", "confirmed"] }).order(:created_at) }, :class_name => "NoteComment", :foreign_key => :note_id
# note_comments_note_id_fkey (note_id => notes.id)
#
-class NoteComment < ActiveRecord::Base
+class NoteComment < ApplicationRecord
belongs_to :note, :foreign_key => :note_id, :touch => true
belongs_to :author, :class_name => "User", :foreign_key => :author_id
# Simple store of nonces. The OAuth Spec requires that any given pair of nonce and timestamps are unique.
# Thus you can use the same nonce with a different timestamp and viceversa.
-class OauthNonce < ActiveRecord::Base
+class OauthNonce < ApplicationRecord
validates :timestamp, :presence => true
validates :nonce, :presence => true, :uniqueness => { :scope => :timestamp }
# oauth_tokens_user_id_fkey (user_id => users.id)
#
-class OauthToken < ActiveRecord::Base
+class OauthToken < ApplicationRecord
belongs_to :client_application
belongs_to :user
# nodes_redaction_id_fkey (redaction_id => redactions.id)
#
-class OldNode < ActiveRecord::Base
+class OldNode < ApplicationRecord
include GeoRecord
include ConsistencyValidations
include ObjectMetadata
# node_tags_id_fkey (node_id => nodes.node_id)
#
-class OldNodeTag < ActiveRecord::Base
+class OldNodeTag < ApplicationRecord
self.table_name = "node_tags"
self.primary_keys = "node_id", "version", "k"
# relations_redaction_id_fkey (redaction_id => redactions.id)
#
-class OldRelation < ActiveRecord::Base
+class OldRelation < ApplicationRecord
include ConsistencyValidations
include ObjectMetadata
# relation_members_id_fkey (relation_id => relations.relation_id)
#
-class OldRelationMember < ActiveRecord::Base
+class OldRelationMember < ApplicationRecord
self.table_name = "relation_members"
self.primary_keys = "relation_id", "version", "sequence_id"
# relation_tags_id_fkey (relation_id => relations.relation_id)
#
-class OldRelationTag < ActiveRecord::Base
+class OldRelationTag < ApplicationRecord
self.table_name = "relation_tags"
self.primary_keys = "relation_id", "version", "k"
# ways_redaction_id_fkey (redaction_id => redactions.id)
#
-class OldWay < ActiveRecord::Base
+class OldWay < ApplicationRecord
include ConsistencyValidations
include ObjectMetadata
# way_nodes_id_fkey (way_id => ways.way_id)
#
-class OldWayNode < ActiveRecord::Base
+class OldWayNode < ApplicationRecord
self.table_name = "way_nodes"
self.primary_keys = "way_id", "version", "sequence_id"
# way_tags_id_fkey (way_id => ways.way_id)
#
-class OldWayTag < ActiveRecord::Base
+class OldWayTag < ApplicationRecord
self.table_name = "way_tags"
self.primary_keys = "way_id", "version", "k"
# record's title and description fields, which can be
# displayed linked from the redacted records.
#
-class Redaction < ActiveRecord::Base
+class Redaction < ApplicationRecord
belongs_to :user
has_many :old_nodes
# current_relations_changeset_id_fkey (changeset_id => changesets.id)
#
-class Relation < ActiveRecord::Base
+class Relation < ApplicationRecord
require "xml/libxml"
include ConsistencyValidations
relation
end
- def to_xml
- doc = OSM::API.new.get_xml_doc
- doc.root << to_xml_node
- doc
- end
-
- def to_xml_node(changeset_cache = {}, user_display_name_cache = {})
- el = XML::Node.new "relation"
- el["id"] = id.to_s
-
- add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache)
-
- relation_members.each do |member|
- member_el = XML::Node.new "member"
- member_el["type"] = member.member_type.downcase
- member_el["ref"] = member.member_id.to_s
- member_el["role"] = member.member_role
- el << member_el
- end
-
- add_tags_to_xml_node(el, relation_tags)
-
- el
- end
-
# FIXME: is this really needed?
def members
@members ||= relation_members.map do |member|
# current_relation_members_id_fkey (relation_id => current_relations.id)
#
-class RelationMember < ActiveRecord::Base
+class RelationMember < ApplicationRecord
self.table_name = "current_relation_members"
self.primary_keys = "relation_id", "sequence_id"
# current_relation_tags_id_fkey (relation_id => current_relations.id)
#
-class RelationTag < ActiveRecord::Base
+class RelationTag < ApplicationRecord
self.table_name = "current_relation_tags"
self.primary_keys = "relation_id", "k"
# reports_user_id_fkey (user_id => users.id)
#
-class Report < ActiveRecord::Base
+class Report < ApplicationRecord
belongs_to :issue, :counter_cache => true
belongs_to :user
# gpx_files_user_id_fkey (user_id => users.id)
#
-class Trace < ActiveRecord::Base
+class Trace < ApplicationRecord
self.table_name = "gpx_files"
belongs_to :user, :counter_cache => true
# gps_points_gpx_id_fkey (gpx_id => gpx_files.id)
#
-class Tracepoint < ActiveRecord::Base
+class Tracepoint < ApplicationRecord
include GeoRecord
self.table_name = "gps_points"
# gpx_file_tags_gpx_id_fkey (gpx_id => gpx_files.id)
#
-class Tracetag < ActiveRecord::Base
+class Tracetag < ApplicationRecord
self.table_name = "gpx_file_tags"
belongs_to :trace, :foreign_key => "gpx_id"
# users_home_idx (home_tile)
#
-class User < ActiveRecord::Base
+class User < ApplicationRecord
require "xml/libxml"
+ self.ignored_columns = ["nearby"]
+
has_many :traces, -> { where(:visible => true) }
has_many :diary_entries, -> { order(:created_at => :desc) }
has_many :diary_comments, -> { order(:created_at => :desc) }
# user_blocks_user_id_fkey (user_id => users.id)
#
-class UserBlock < ActiveRecord::Base
+class UserBlock < ApplicationRecord
validate :moderator_permissions
validates :reason, :characters => true
# user_preferences_user_id_fkey (user_id => users.id)
#
-class UserPreference < ActiveRecord::Base
+class UserPreference < ApplicationRecord
self.primary_keys = "user_id", "k"
belongs_to :user
validates :user, :presence => true, :associated => true
validates :k, :v, :length => 1..255, :characters => true
-
- # Turn this Node in to an XML Node without the <osm> wrapper.
- def to_xml_node
- el1 = XML::Node.new "preference"
- el1["k"] = k
- el1["v"] = v
-
- el1
- end
end
# user_roles_user_id_fkey (user_id => users.id)
#
-class UserRole < ActiveRecord::Base
+class UserRole < ApplicationRecord
belongs_to :user
belongs_to :granter, :class_name => "User"
# user_tokens_user_id_fkey (user_id => users.id)
#
-class UserToken < ActiveRecord::Base
+class UserToken < ApplicationRecord
belongs_to :user
after_initialize :set_defaults
# current_ways_changeset_id_fkey (changeset_id => changesets.id)
#
-class Way < ActiveRecord::Base
+class Way < ApplicationRecord
require "xml/libxml"
include ConsistencyValidations
way
end
- # Find a way given it's ID, and in a single SQL call also grab its nodes and tags
- def to_xml
- doc = OSM::API.new.get_xml_doc
- doc.root << to_xml_node
- doc
- end
-
- def to_xml_node(visible_nodes = nil, changeset_cache = {}, user_display_name_cache = {})
- el = XML::Node.new "way"
- el["id"] = id.to_s
-
- add_metadata_to_xml_node(el, self, changeset_cache, user_display_name_cache)
-
- # make sure nodes are output in sequence_id order
- ordered_nodes = []
- way_nodes.each do |nd|
- if visible_nodes
- # if there is a list of visible nodes then use that to weed out deleted nodes
- ordered_nodes[nd.sequence_id] = nd.node_id.to_s if visible_nodes[nd.node_id]
- else
- # otherwise, manually go to the db to check things
- ordered_nodes[nd.sequence_id] = nd.node_id.to_s if nd.node&.visible?
- end
- end
-
- ordered_nodes.each do |nd_id|
- next unless nd_id && nd_id != "0"
-
- node_el = XML::Node.new "nd"
- node_el["ref"] = nd_id
- el << node_el
- end
-
- add_tags_to_xml_node(el, way_tags)
-
- el
- end
-
def nds
@nds ||= way_nodes.collect(&:node_id)
end
# current_way_nodes_node_id_fkey (node_id => current_nodes.id)
#
-class WayNode < ActiveRecord::Base
+class WayNode < ApplicationRecord
self.table_name = "current_way_nodes"
self.primary_keys = "way_id", "sequence_id"
# current_way_tags_id_fkey (way_id => current_ways.id)
#
-class WayTag < ActiveRecord::Base
+class WayTag < ApplicationRecord
self.table_name = "current_way_tags"
self.primary_keys = "way_id", "k"
json.geometry do
json.type "Point"
- json.coordinates [ note.lon.to_f, note.lat.to_f ]
+ json.coordinates [note.lon.to_f, note.lat.to_f]
end
json.properties do
json.close_url close_note_url(note, :format => params[:format])
end
- json.date_created note.created_at
+ json.date_created note.created_at.to_s
json.status note.status
- json.closed_at note.closed_at if note.closed?
+ json.closed_at note.closed_at.to_s if note.closed?
json.comments(note.comments) do |comment|
- json.date comment.created_at
+ json.date comment.created_at.to_s
if comment.author
json.uid comment.author.id
json.type "FeatureCollection"
json.features(@notes) do |note|
- json.ingest! render(note)
+ json.partial! note
end
--- /dev/null
+json.partial! @note
+++ /dev/null
-json.ingest! render(@note)
--- /dev/null
+attrs = {
+ "k" => user_preference.k,
+ "v" => user_preference.v
+}
+
+xml.preference(attrs)
--- /dev/null
+xml.instruct!
+
+xml.osm(OSM::API.new.xml_root_attributes) do |osm|
+ osm.preferences do |preferences|
+ preferences << (render(@user_preferences) || "")
+ end
+end
<h3><%= t ".my_tokens" %></h3>
<p><%= t ".list_tokens" %></p>
<table>
- <tr><th><%= t ".application" %></th>
- <th><%= t ".issued_at" %></th><th> </th></tr>
+ <tr>
+ <th><%= t ".application" %></th>
+ <th><%= t ".issued_at" %></th>
+ <th> </th>
+ </tr>
<% @tokens.each do |token| %>
- <%= content_tag_for :tr, token do %>
+ <tr>
<td><%= link_to token.client_application.name, token.client_application.url %></td>
<td><%= token.authorized_at %></td>
<td>
- <%= form_tag :controller => "oauth", :action => "revoke" do %>
- <%= hidden_field_tag "token", token.token %>
- <%= submit_tag t(".revoke") %>
- <% end %>
+ <%= form_tag :controller => "oauth", :action => "revoke" do %>
+ <%= hidden_field_tag "token", token.token %>
+ <%= submit_tag t(".revoke") %>
+ <% end %>
</td>
- <% end %>
+ </tr>
<% end %>
</table>
<% end %>
<% else %>
<p><%= t ".registered_apps" %></p>
<% @client_applications.each do |client| %>
- <%= div_for client do %>
+ <div class="client_application">
<%= link_to client.name, :action => :show, :id => client.id %>
- <% end %>
+ </div>
<% end %>
<% end %>
<h3><%= link_to t(".register_new"), :action => :new %></h3>
<% if current_user == @trace.user %>
<%= link_to t(".edit_trace"), edit_trace_path(@trace), :class => "button" %>
<% end %>
- <%= button_to t(".delete_trace"), { :controller => "traces", :action => "delete", :id => @trace.id }, { :data => { :confirm => t(".confirm_delete") } } %>
+ <%= button_to t(".delete_trace"), { :controller => "traces", :action => "destroy", :method => :delete, :id => @trace.id }, { :data => { :confirm => t(".confirm_delete") } } %>
</div>
<% end %>
#!/usr/bin/env ruby
require "fileutils"
-include FileUtils
# path to your application root.
APP_ROOT = File.expand_path("..", __dir__)
system(*args) || abort("\n== Command #{args} failed ==")
end
-chdir APP_ROOT do
- # This script is a starting point to setup your application.
+FileUtils.chdir APP_ROOT do
+ # This script is a way to setup or update your development environment automatically.
+ # This script is idempotent, so that you can run it at anytime and get an expectable outcome.
# Add necessary setup steps to this file.
puts "== Installing dependencies =="
system! "gem install bundler --conservative"
system("bundle check") || system!("bundle install")
- # Install JavaScript dependencies if using Yarn
+ # Install JavaScript dependencies
# system('bin/yarn')
# puts "\n== Copying sample files =="
# unless File.exist?('config/database.yml')
- # cp 'config/database.yml.sample', 'config/database.yml'
+ # FileUtils.cp 'config/database.yml.sample', 'config/database.yml'
# end
puts "\n== Preparing database =="
- system! "bin/rails db:setup"
+ system! "bin/rails db:prepare"
puts "\n== Removing old logs and tempfiles =="
system! "bin/rails log:clear tmp:clear"
-sotm_asia_2019:
- id: sotm_asia_2019
- alt: State of the Map Asia 2019
- link: https://stateofthemap.asia/
- img: banners/sotm_asia_2019.png
- enddate: 2019-nov-03
+sotm_africa_2019:
+ id: sotm_africa_2019
+ alt: State of the Map Africa 2019
+ link: https://2019.stateofthemap.africa/
+ img: banners/sotm_africa_2019.png
+ enddate: 2019-nov-24
# Run rails dev:cache to toggle caching.
if Rails.root.join("tmp", "caching-dev.txt").exist?
config.action_controller.perform_caching = true
+ config.action_controller.enable_fragment_cache_logging = true
config.cache_store = :memory_store
config.public_file_server.headers = {
config.cache_store = :null_store
end
- # Store uploaded files on the local file system (see config/storage.yml for options)
+ # Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = :local
# Don't care if the mailer can't send.
# Suppress logger output for asset requests.
config.assets.quiet = true
- # Export translations automatically
+ # Export translations automatically.
config.middleware.use I18n::JS::Middleware
- # Raises error for missing translations
+ # Raises error for missing translations.
# config.action_view.raise_on_missing_translations = true
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
config.file_watcher = ActiveSupport::EventedFileUpdateChecker
+
+ # Disable host validation.
+ config.hosts = []
end
# Apache or NGINX already handles this.
config.public_file_server.enabled = ENV["RAILS_SERVE_STATIC_FILES"].present?
- # Compress JavaScripts and CSS.
- config.assets.js_compressor = :uglifier
+ # Compress CSS using a preprocessor.
# config.assets.css_compressor = :sass
# Do not fallback to assets pipeline if a precompiled asset is missed.
config.assets.compile = false
- # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb
-
# Enable serving of images, stylesheets, and JavaScripts from an asset server.
# config.action_controller.asset_host = 'http://assets.example.com'
# config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
- # Store uploaded files on the local file system (see config/storage.yml for options)
+ # Store uploaded files on the local file system (see config/storage.yml for options).
config.active_storage.service = Settings.storage_service.to_sym
- # Mount Action Cable outside main process or domain
+ # Mount Action Cable outside main process or domain.
# config.action_cable.mount_path = nil
# config.action_cable.url = 'wss://example.com/cable'
# config.action_cable.allowed_request_origins = [ 'http://example.com', /http:\/\/example.*/ ]
# Use a different cache store in production.
# config.cache_store = :mem_cache_store
- # Use a real queuing backend for Active Job (and separate queues per environment)
+ # Use a real queuing backend for Active Job (and separate queues per environment).
# config.active_job.queue_adapter = :resque
- # config.active_job.queue_name_prefix = "openstreetmap_#{Rails.env}"
+ # config.active_job.queue_name_prefix = "openstreetmap_production"
+
config.action_mailer.perform_caching = false
# Configure caching of static assets
# Do not dump schema after migrations.
config.active_record.dump_schema_after_migration = false unless Settings.status == "database_offline"
+ # Inserts middleware to perform automatic connection switching.
+ # The `database_selector` hash is used to pass options to the DatabaseSelector
+ # middleware. The `delay` is used to determine how long to wait after a write
+ # to send a subsequent read to the primary.
+ #
+ # The `database_resolver` class is used by the middleware to determine which
+ # database is appropriate to use based on the time delay.
+ #
+ # The `database_resolver_context` class is used by the middleware to set
+ # timestamps for the last write to the primary. The resolver uses the context
+ # class timestamps to determine how long to wait before reading from the
+ # replica.
+ #
+ # By default Rails will store a last write timestamp in the session. The
+ # DatabaseSelector middleware is designed as such you can define your own
+ # strategy for connection switching and pass that into the middleware through
+ # these configuration options.
+ # config.active_record.database_selector = { delay: 2.seconds }
+ # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
+ # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
+
# Enable autoloading of dependencies.
config.enable_dependency_loading = true
+# The test environment is used exclusively to run your application's
+# test suite. You never need to work with it otherwise. Remember that
+# your test database is "scratch space" for the test suite and is wiped
+# and recreated between test runs. Don't rely on the data there!
+
Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
- # The test environment is used exclusively to run your application's
- # test suite. You never need to work with it otherwise. Remember that
- # your test database is "scratch space" for the test suite and is wiped
- # and recreated between test runs. Don't rely on the data there!
config.cache_classes = true
# Do not eager load code on boot. This avoids loading your whole application
# Show full error reports and disable caching.
config.consider_all_requests_local = true
config.action_controller.perform_caching = false
+ config.cache_store = :null_store
# Raise exceptions instead of rendering exception templates.
config.action_dispatch.show_exceptions = false
# Disable request forgery protection in test environment.
config.action_controller.allow_forgery_protection = false
- # Store uploaded files on the local file system in a temporary directory
+ # Store uploaded files on the local file system in a temporary directory.
config.active_storage.service = :test
config.action_mailer.perform_caching = false
# Print deprecation notices to the stderr.
config.active_support.deprecation = :stderr
- # Export translations automatically
+ # Export translations automatically.
config.middleware.use I18n::JS::Middleware
- # Raises error for missing translations
+ # Raises error for missing translations.
config.action_view.raise_on_missing_translations = true
- # Use the test adapter for ActiveJob during testing
+ # Use the test adapter for ActiveJob during testing.
config.active_job.queue_adapter = :test
end
"eslint:recommended"
],
"globals": {
- "bowser": "readonly",
"I18n": "readonly",
"L": "readonly",
"OSM": "writable",
-Rails.application.config.active_storage.queue = :storage
-Rails.application.config.active_storage.variable_content_types << "image/bmp"
+Rails.application.config.active_storage.queues.analysis = :storage
+Rails.application.config.active_storage.queues.purge = :storage
Rails.configuration.after_initialize do
require "active_storage/service/s3_service"
ActiveStorage::Variant.prepend(OpenStreetMap::ActiveStorage::Variant)
end
- ActiveStorage::Service.url_expires_in = 1.week
+ ActiveStorage.service_urls_expire_in = 1.week
end
# Add additional assets to the asset load path.
Rails.application.config.assets.paths << Rails.root.join("config")
-# Add additional assets to the asset load path.
-# Rails.application.config.assets.paths << Emoji.images_path
# Add Yarn node_modules folder to the asset load path.
Rails.application.config.assets.paths << Rails.root.join("node_modules")
# policy.object_src :none
# policy.script_src :self, :https
# policy.style_src :self, :https
+# # If you are using webpack-dev-server then specify webpack-dev-server host
+# policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?
# # Specify URI for violation reports
# # policy.report_uri "/csp-violation-report-endpoint"
# If you are using UJS then enable automatic nonce generation
# Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
+# Set the nonce only to specific directives
+# Rails.application.config.content_security_policy_nonce_directives = %w(script-src)
+
# Report CSP violations to a specified URI
# For further information see the following documentation:
# https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
-require "rack/cors"
+# Be sure to restart your server when you modify this file.
# Mark CORS responses as uncacheable as we don't want a browser to
# try and reuse a response that had a different origin, even with
# so browser-requests should be similarly permitted. (Though the API does not
# require any custom headers, Ajax frameworks may automatically add headers
# such as X-Requested-By to requests.)
-Rails.configuration.middleware.use OpenStreetMap::Cors do
+Rails.application.config.middleware.insert_before 0, OpenStreetMap::Cors do
allow do
origins "*"
resource "/oauth/*", :headers => :any, :methods => [:get, :post]
if class_attr_index
html_tag.insert class_attr_index + 7, "field_with_errors "
else
- html_tag.insert html_tag.index(%r{/?>}), ' class="field_with_errors"'
+ html_tag.insert html_tag.index(%r{/?>}), ' class="field_with_errors"'.html_safe
end
end
--- /dev/null
+# Be sure to restart your server when you modify this file.
+#
+# This file contains migration options to ease your Rails 5.2 upgrade.
+#
+# Once upgraded flip defaults one by one to migrate to the new default.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
+
+# Make Active Record use stable #cache_key alongside new #cache_version method.
+# This is needed for recyclable cache keys.
+# Rails.application.config.active_record.cache_versioning = true
+
+# Use AES-256-GCM authenticated encryption for encrypted cookies.
+# Also, embed cookie expiry in signed or encrypted cookies for increased security.
+#
+# This option is not backwards compatible with earlier Rails versions.
+# It's best enabled when your entire app is migrated and stable on 5.2.
+#
+# Existing cookies will be converted on read then written with the new scheme.
+# Rails.application.config.action_dispatch.use_authenticated_cookie_encryption = true
+
+# Use AES-256-GCM authenticated encryption as default cipher for encrypting messages
+# instead of AES-256-CBC, when use_authenticated_message_encryption is set to true.
+# Rails.application.config.active_support.use_authenticated_message_encryption = true
+
+# Add default protection from forgery to ActionController::Base instead of in
+# ApplicationController.
+# Rails.application.config.action_controller.default_protect_from_forgery = true
+
+# Store boolean values are in sqlite3 databases as 1 and 0 instead of 't' and
+# 'f' after migrating old data.
+# Rails.application.config.active_record.sqlite3.represent_boolean_as_integer = true
+
+# Use SHA-1 instead of MD5 to generate non-sensitive digests, such as the ETag header.
+# Rails.application.config.active_support.use_sha1_digests = true
+
+# Make `form_with` generate id attributes for any generated HTML tags.
+# Rails.application.config.action_view.form_with_generates_ids = true
--- /dev/null
+# Be sure to restart your server when you modify this file.
+#
+# This file contains migration options to ease your Rails 6.0 upgrade.
+#
+# Once upgraded flip defaults one by one to migrate to the new default.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
+
+# Don't force requests from old versions of IE to be UTF-8 encoded.
+# Rails.application.config.action_view.default_enforce_utf8 = false
+
+# Embed purpose and expiry metadata inside signed and encrypted
+# cookies for increased security.
+#
+# This option is not backwards compatible with earlier Rails versions.
+# It's best enabled when your entire app is migrated and stable on 6.0.
+# Rails.application.config.action_dispatch.use_cookies_with_metadata = true
+
+# Change the return value of `ActionDispatch::Response#content_type` to Content-Type header without modification.
+# Rails.application.config.action_dispatch.return_only_media_type_on_content_type = false
+
+# Return false instead of self when enqueuing is aborted from a callback.
+# Rails.application.config.active_job.return_false_on_aborted_enqueue = true
+
+# Send Active Storage analysis and purge jobs to dedicated queues.
+# Rails.application.config.active_storage.queues.analysis = :active_storage_analysis
+# Rails.application.config.active_storage.queues.purge = :active_storage_purge
+
+# When assigning to a collection of attachments declared via `has_many_attached`, replace existing
+# attachments instead of appending. Use #attach to add new attachments without replacing existing ones.
+# Rails.application.config.active_storage.replace_on_assign_to_many = true
+
+# Use ActionMailer::MailDeliveryJob for sending parameterized and normal mail.
+#
+# The default delivery jobs (ActionMailer::Parameterized::DeliveryJob, ActionMailer::DeliveryJob),
+# will be removed in Rails 6.1. This setting is not backwards compatible with earlier Rails versions.
+# If you send mail in the background, job workers need to have a copy of
+# MailDeliveryJob to ensure all delivery jobs are processed properly.
+# Make sure your entire app is migrated and stable on 6.0 before using this setting.
+# Rails.application.config.action_mailer.delivery_job = "ActionMailer::MailDeliveryJob"
+
+# Enable the same cache key to be reused when the object being cached of type
+# `ActiveRecord::Relation` changes by moving the volatile information (max updated at and count)
+# of the relation's cache key into the cache version to support recycling cache key.
+# Rails.application.config.active_record.collection_cache_versioning = true
# To enable root element in JSON for ActiveRecord objects.
# ActiveSupport.on_load(:active_record) do
-# self.include_root_in_json = true
+# self.include_root_in_json = true
# end
tag: صفحة وصف الويكي للوسم %{key}=%{value}
wikidata_link: العنصر %{page} على ويكي بيانات
wikipedia_link: مقالة %{page} على ويكيبيديا
+ wikimedia_commons_link: العنصر %{page} في ويكيميديا كومنز
telephone_link: اتصل بـ%{phone_number}
colour_preview: معاينة اللون %{colour_value}
note:
tag: La páxina wiki de descripción de la etiqueta %{key}=%{value}
wikidata_link: L'elementu %{page} en Wikidata
wikipedia_link: L'artículu %{page} en Wikipedia
+ wikimedia_commons_link: L'elementu %{page} en Wikimedia Commons
telephone_link: Llamar a %{phone_number}
colour_preview: Entever el color %{colour_value}
note:
de cambios'
subject_other: '[OpenStreetMap] %{commenter} comentó sobro un conxuntu de
cambios que t''interesa'
- your_changeset: '%{commenter} dexó un comentariu n''unu de los tos conxuntos
- de cambios creáu el %{time}'
- commented_changeset: '%{commenter} dexó un comentariu nun conxuntu de cambios
- del mapa que tas siguiendo creáu por %{changeset_author} el %{time}'
+ your_changeset: '%{commenter} dexó un comentariu a les %{time} n''unu de los
+ tos conxuntos de cambios'
+ commented_changeset: '%{commenter} dexó un comentariu a les %{time} nun conxuntu
+ de cambios del mapa que tas siguiendo creáu por %{changeset_author}'
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}
newer: Traces más nueves
trace:
pending: PENDIENTE
- count_points: '%{count} puntos'
+ count_points:
+ one: 1 puntu
+ other: '%{count} puntos'
more: más
trace_details: Amosar detalles de la traza
view_map: Ver el Mapa
submit:
diary_comment:
create: Захаваць
+ diary_entry:
+ create: Апублікаваць
+ update: Абнавіць
issue_comment:
create: Дадаць камэнтар
message:
client_application:
create: Рэгістрацыя
update: Рэдагаваць
+ redaction:
+ create: Стварыць рэдакцыю
+ update: Захаваць рэдакцыю
trace:
create: Загрузіць
update: Захаваць зьмены
activerecord:
errors:
messages:
+ invalid_email_address: не падобны на карэктны адрас э-пошты
email_address_not_routable: не маршрутызаваны
models:
acl: Сьпіс абмежаваньня доступу
description: Аддаленае кіраваньне (JOSM ці Merkaartor)
api:
notes:
+ comment:
+ opened_at_html: Створана %{when}
+ opened_at_by_html: Створана %{when} удзельнікам %{user}
+ commented_at_html: Абноўлена %{when}
+ commented_at_by_html: Абноўлена %{when} удзельнікам %{user}
+ closed_at_html: Разьвязана %{when}
+ closed_at_by_html: Разьвізана %{when} удзельнікам %{user}
+ reopened_at_html: Пераадкрыта %{when}
+ reopened_at_by_html: Пераадкрыта %{when} удзельнікам %{user}
entry:
full: Поўны тэкст
browse:
newer: По-нови следи
trace:
pending: Обработва се
- count_points: '%{count} точки'
+ count_points:
+ one: 1 точка
+ other: '%{count} точки'
view_map: Вижте на картата
edit: променяне
edit_map: Редактиране на картата
tag: La pàgina de descripció del wiki per a l'etiqueta %{key}=%{value}
wikidata_link: L'element %{page} a Wikidata
wikipedia_link: L'article %{page} a la Viquipèdia
+ wikimedia_commons_link: L'element %{page} a Wikimedia Commons
telephone_link: Telefona %{phone_number}
colour_preview: Previsualització de color %{colour_value}
note:
search: Cerca
search_guidance: 'Cerca incidències:'
user_not_found: El compte d’usuari no existeix
- issues_not_found: No s'ha trobat cap incidència
+ issues_not_found: No s'ha trobat cap incidència d'aquest tipus
status: Estat
reports: Informes
last_updated: Darrera actualització
vandal_label: Aquest usuari és un vàndal
other_label: Un altre
note:
- spam_label: Aquesta nota és spam
+ spam_label: Aquesta nota és brossa
personal_label: Aquesta nota conté dades personals
abusive_label: Aquesta nota és injuriosa
other_label: Un altre
log_in_tooltip: Inicia una sessió amb un compte existent
sign_up: Crea un compte
start_mapping: Comença a cartografiar
- sign_up_tooltip: Crea un usuari per editar
+ sign_up_tooltip: Crea un compte per a col·laborar
edit: Modifica
history: Historial
export: Exporta
hosting_partners_html: L'allotjament és a càrrec de %{ucl}, %{bytemark} i d'altres
%{partners}.
partners_ucl: UCL
- partners_bytemark: Allotjament Bytemark
+ partners_bytemark: Bytemark Hosting
partners_partners: socis
tou: Condicions d’ús
osm_offline: La base de dades OpenStreetMap és fora de línia mentre es fan les
destroy_button: Suprimeix
back: Enrere
to: Per a
- wrong_user: Heu iniciat la sessió com a "%{user}", però el missatge que voleu
- llegir no ha estat enviat per aquest usuari o a aquest usuari. Per a poder
- llegir-lo, inicieu la sessió amb l'usuari correcte.
+ wrong_user: Heu iniciat la sessió com a "%{user}", però aquest usuari no ha
+ escrit ni ha rebut el missatge que voleu llegir. Per a poder llegir-lo, inicieu
+ la sessió amb l'usuari correcte.
sent_message_summary:
destroy_button: Suprimeix
mark:
site:
about:
next: Següent
- copyright_html: Col·laboradors de<br><span>©</span>OpenStreetMap
+ copyright_html: <span>©</span>Col·laboradors d'<br>OpenStreetMap
used_by: '%{name} proporciona dades cartogràfiques a milers de llocs web, aplicacions
per a mòbils i dispositius'
lede_text: OpenStreetMap està fet per una comunitat de cartògrafs que aporten
Si voleu conèixer més sobre la comunitat, visiteu els <a href='%{diary_path}'>diaris d'usuari</a>, els <a href='http://blogs.openstreetmap.org/'>blogs de la comunitat</a>, i la pàgina web de la <a href='http://www.osmfoundation.org/'>Fundació OSM</a>.
open_data_title: Dades obertes
open_data_html: 'OpenStreetMap són <i>dades lliures</i>: sou lliures d''usar-lo
- per a qualsevol propòsit, sempre que doneu crèdit a OpenStreetMap i els seus
- contribuïdors. Si modifiqueu o construïu sobre les dades en alguna manera
- concreta, podeu distribuir el resultat només sota la mateixa llicència. Vegeu
+ per a qualsevol propòsit, sempre que especifiqueu que són obra d''OpenStreetMap
+ i els seus col·laboradors. Si modifiqueu o amplieu les dades de determinades
+ maneres, només podreu distribuir el resultat sota la mateixa llicència. Vegeu
la <a href=''%{copyright_path}''>pàgina de copyright i llicència</a> per a
més detalls.'
legal_title: Avisos legals
foreign:
title: Quant a la traducció
text: En cas de conflicte entre aquesta pàgina traduïda i %{english_original_link},
- la pàgina en anglès té prioritat
+ la pàgina en anglès té prevalènça
english_link: l'original en anglès
native:
title: Sobre aquesta pàgina
text: Esteu veient la versió anglesa de la pàgina de drets d'autor. Podeu
tornar a la %{native_link} d'aquesta pàgina o podeu deixar de llegir sobre
- el copyright i anar a %{mapping_link}.
- native_link: versió català
+ els drets d'autor i %{mapping_link}.
+ native_link: Versió en català
mapping_link: Comença a cartografiar
legal_babble:
title_html: Drets d'autor i llicència
intro_1_html: |-
- Les dades obertes d'OpenStreetMap<sup><a href="#trademarks">®</a></sup> estan publicades sota la <a
+ Les <i>open data</i> d'OpenStreetMap<sup><a href="#trademarks">®</a></sup> estan publicades sota la <a
href="http://opendatacommons.org/licenses/odbl/">llicència de base de dades oberta</a> (ODbL) per la <a
href="http://osmfoundation.org/">Fundació OpenStreetMap</a> (OSMF).
- intro_2_html: "Sou lliure de copiar, distribuir, comunicar públicament i fer-ne
- obres \nderivades de les nostres dades, sempre que atribuïu els crèdits
- a \nOpenStreetMap i els seus col·laboradors. Si modifiqueu o utilitzeu les\nnostres
- dades fer fer obres derivades, només podreu distribuir l'obra \nresultant
- amb la mateixa llicència. Aquest \n<a href=\"http://opendatacommons.org/licenses/odbl/1.0/\">text
- legal\ncode</a> sencer que explica detalladament els vostres drets i responsabbilitats."
- intro_3_html: |-
- La cartografia de les nostres tessel·les i la nostra documentació són ofertes
- sota llicència <a href="http://creativecommons.org/licenses/by-sa/2.0/">Text de la llicència de Creative Commons Reconeixement-Compartir Igual 2.0</a>(CC-BY-SA).
- credit_title_html: Com a crèdit OpenStreetMap
- credit_1_html: |-
- Exigim que l'atribució de drets d'autor sigui “© Col·laboradors d'OpenStreetMap
- ”.
+ intro_2_html: "Sou lliure de copiar, distribuir, comunicar públicament i fer
+ obres derivades de les nostres dades, sempre que especifiqueu que són obra
+ d'OpenStreetMap i els seus col·laboradors. Si modifiqueu o amplieu les\nnostres
+ dades, només podreu distribuir l'obra \nresultant amb la mateixa llicència.
+ El\n<a href=\"http://opendatacommons.org/licenses/odbl/1.0/\">codi legal</a>
+ complet explica detalladament els vostres drets i responsabilitats."
+ intro_3_html: La cartografia de les nostres tessel·les i la nostra documentació
+ són disponibles sota llicència <a href="http://creativecommons.org/licenses/by-sa/2.0/">Text
+ de la llicència de Creative Commons Reconeixement-Compartir Igual 2.0</a>(CC-BY-SA).
+ credit_title_html: Com atribuir autoria a OpenStreetMap
+ credit_1_html: Demanem que es reconegui “© Col·laboradors d'OpenStreetMap”
+ com a autors.
credit_2_html: També heu de deixar clar que les dades són disponibles sota
- llicència obereta, i si s'utilitzen les nostres tessel·les de mapes, que
- la cartografia és llicenciada com CC-BY-SA. Podeu fer això enllaçant a <a
- href="http://www.openstreetmap.org/copyright">aquest pàgina de copyright</a>.
- D'altra banda, i com a requisit obligatori si voleu distribuir OSM en forma
- de dades en brut, podeu citar i enllaçar directament a la llicència. En
- el cas d'utilitzar suports on els enllaços d'hipertext no són possibles
- (per exemple, obres impreses), us suggerim d'adreçar els lectors a openstreetmap.org
- (potser indicant l'adreça completa d'OpenStreetMap), a opendatacommons.org
- i si s'escau, a creativecommons.org.
+ llicència de base de dades oberta i, si utilitzeu els nostres mapes, que
+ la cartografia té llicència CC-BY-SA. Podeu fer-ho enllaçant a <a href="http://www.openstreetmap.org/copyright">aquesta
+ pàgina de copyright</a>. De manera alternativa, però com a requisit obligatori
+ si distribuïu OSM en forma de dades en brut, podeu citar i enllaçar directament
+ a la llicència. En el cas d'utilitzar suports on els enllaços d'hipertext
+ no són possibles (per exemple, obres impreses), us suggerim d'adreçar els
+ lectors a openstreetmap.org (potser indicant l'adreça completa d'OpenStreetMap),
+ a opendatacommons.org i, si s'escau, a creativecommons.org.
credit_3_html: |-
En el cas d'un mapa electrònic navegable, els crèdits han d'aparèixer a la cantonada del mapa.
Per exemple:
attribution_example:
- alt: Exemple de com atribuir OpenStreetMap a una pàgina web
- title: Exemple d'atribució
+ alt: Exemple de com atribuir l'autoria a OpenStreetMap en una pàgina web
+ title: Exemple d'atribució d'autoria
more_title_html: Saber-ne més
more_1_html: |-
- Llegiu més informació sobre com utilitzar les nostres dades, i com donar-ne crèdit, a la <a
- href="http://osmfoundation.org/Licence">pàgina de llicència OSMF</a> i a les <a
- href="http://wiki.openstreetmap.org/wiki/Legal_FAQ">Preguntes
- Freqüents sobre legalitat</a>.
+ Per a més informació sobre com utilitzar les nostres dades i com atribuir-ne l'autorita, visiteu la <a
+ href="http://osmfoundation.org/Licence">pàgina de llicència de la OSMF</a>.
more_2_html: Encara que les dades d'OpenStreetMap són dades obertes, no podem
- oferir una API gratuïta per als desenvolupadors de terceres parts. Vegeu
- la <a href="https://operations.osmfoundation.org/policies/api/">política
+ oferir una API gratuïta a tercers. Vegeu la <a href="https://operations.osmfoundation.org/policies/api/">política
d'ús de l'API</a>, la <a href="https://operations.osmfoundation.org/policies/tiles/">política
d'ús de les tessel·les</a> i la <a href="https://operations.osmfoundation.org/policies/nominatim/">política
d'ús de Nominatim</a>.
contributors_intro_html: 'Els nostres col·laboradors són milers de persones.
També incloem dades amb llicència oberta de les agències públiques de cartografia
i d''altres fonts, entre elles:'
- contributors_at_html: |-
- <strong>Àustria</strong>: conté dades de
- <a href="http://data.wien.gv.at/">Stadt Wien</a> sota
- <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>.
- contributors_au_html: |-
- <strong>Austràlia</strong>: conté dades suburbi basats
- en les dades d'Austràlia Oficina d'estadístiques.
- contributors_ca_html: |-
- <strong>Canadà</strong>: conté dades de
- GeoBase ®, GeoGratis (© Departament de Natural
- Recursos Canadà), CanVec (© Departament de Natural
- Recursos Canadà) i StatCan (Divisió de Geografia,
- Canadà de Estadístiques).
+ contributors_at_html: '<strong>Àustria</strong>: conté dades de <a href="http://data.wien.gv.at/">Stadt
+ Wien</a> (sota <a href="http://creativecommons.org/licenses/by/3.0/at/deed.de">CC
+ BY</a>), el <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">Land
+ Voralberg</a> i el Land Tirol (sota <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
+ BY AT amb correccions</a>.'
+ contributors_au_html: '<strong>Austràlia</strong>: Conté dades de <a href="https://www.psma.com.au/psma-data-copyright-and-disclaimer">PSMA
+ Autralia Limited</a> publicades per Commonwealth of Australia sota els termes
+ de <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.'
+ contributors_ca_html: '<strong>Canadà</strong>: conté dades de GeoBase ®,
+ GeoGratis (© Departament de Recursos Naturals de Canadà), CanVec (© Departament
+ de Recursos Naturals de Canadà) i StatCan (Divisió de Geografia, Institut
+ d''Estadística de Canadà).'
contributors_fi_html: '<strong>Finlàndia</strong>: Conté dades de la base
de dades topogràfica del National Land Survey of Finland i d''altres bases
- de dades, sota la <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">llicència
+ de dades sota la <a href="http://www.maanmittauslaitos.fi/en/NLS_open_data_licence_version1_20120501">llicència
NLSFI</a>.'
contributors_fr_html: |-
- <strong>França</strong>: conté dades d'origen de
- Direcció Générale des Impôts.
+ <strong>França</strong>: conté dades de la
+ Direction Générale des Impôts.
contributors_nl_html: '<strong>Països Baixos</strong>: Conté © dades
d''Automotive Navigation Data (AND), 2007 (<a href="http://www.and.com">www.and.com</a>)'
contributors_nz_html: '<strong>Nova Zelanda</strong>: Conté dades de <a href="https://data.linz.govt.nz/">
LINZ Data Service</a> amb permís per a reutilització sota <a href="https://creativecommons.org/licenses/by/4.0/"></a>.'
contributors_si_html: '<strong>Eslovènia</strong>: Conté dades de l''<a href="http://www.gu.gov.si/en/">Autoritat
- de Topografia i Cartografia</a> i el <a href="http://www.mkgp.gov.si/en/">Ministeri
+ de Topografia i Cartografia</a> i del <a href="http://www.mkgp.gov.si/en/">Ministeri
d''Agricultura, Silvicultura i Alimentació</a> (informació pública d''Eslovènia).'
contributors_es_html: |-
<strong>Spain</strong>: Conté dades de l'Institut Geogràfic Nacional espanyol(<a href="http://www.ign.es/">IGN</a>) i del Sistema Cartgràfic Nacional (<a href="http://www.scne.es/">SCNE</a>)
contributors_za_html: |-
<strong>Sud-àfrica</strong>: conté dades del
<a href="http://www.ngi.gov.za/">Chief Directorate:
- National Geo-Spatial Information</a>, drets d'autor reservat per l'estat.
+ National Geo-Spatial Information</a>, drets d'autor reservats per l'estat.
contributors_gb_html: '<strong>Regne Unit</strong>: Conté dades del Ordnance
Survey © Drets d''autor de la Corona i de la base de dades 2010-19.'
contributors_footer_1_html: |-
Per a més detalls sobre aquesta i d'altres fonts que han estat utilitzades per millorar els mapes de l'OpenStreetMap, visiteu la pàgina dedicada als <a
href="http://wiki.openstreetmap.org/wiki/Contributors">Col·laboradors</a> del wiki d'OSM.
- contributors_footer_2_html: |-
- Inclusió de dades en OpenStreetMap no implica que l'original
- el proveïdor de dades recolza OpenStreetMap, proporciona cap garantia, o
- accepta qualsevol responsabilitat.
+ contributors_footer_2_html: La inclusió de dades a l'OpenStreetMap no implica
+ que el proveïdor original de les dades dona suport a l'OpenStreetMap, proporciona
+ cap garantia o accepta cap responsabilitat.
infringement_title_html: Violació dels drets d'autor
infringement_1_html: Recordem als col·laboradors de l'OSM que mai no s'han
d'afegir dades de cap font amb drets d'autor registrats (com Google Maps
sobre l’ús de les marques, consulteu la <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">política
de marques registrades</a>.
index:
- js_1: Tampoc està utilitzant un navegador que no suporta JavaScript o té deshabilitat
- JavaScript.
+ js_1: O bé esteu utilitzant un navegador no compatible amb JavaScript o bé teniu
+ JavaScript deshabilitat.
js_2: L'OpenStreetMap utilitza JavaScript per al mapa lliscant.
permalink: Enllaç permanent
shortlink: Enllaç curt
license:
copyright: Copyright d'OpenStreetMap i els seus col·laboradors sota llicència
oberta
- remote_failed: L'edició ha fallat. Assegureu-vos que el JOSM, o el Merkaartor,
- esta executant-se i que l'opció de comandament a distància està habilitada
+ remote_failed: L'edició ha fallat. Assegureu-vos que el JOSM o el Merkaartor
+ està executant-se i que l'opció de comandament a distància està habilitada
edit:
- not_public: No heu fet les configuracions necessàries perquè les vostres modificacions
- siguin públiques.
+ not_public: No heu configurat les vostres modificacions perquè siguin públiques.
not_public_description: Ja no podeu modificar el mapa a menys que feu públics
els vostres canvis. Podeu configurar les modificacions com a públiques a la
vostra %{user_page}.
user_page_link: pàgina d'usuari
- anon_edits_link_text: Esbrina perquè aquest és el cas.
+ anon_edits_link_text: Llegeix aquí perquè.
flash_player_required: Necessiteu un reproductor de Flash per a usar el Potlatch,
l'editor Flash de l'OpenStreetMap. Podeu <a href="https://get.adobe.com/flashplayer/"></a>baixar
el reproductor Flash Player des del web Adobe.com</a>. També hi ha <a href="http://wiki.openstreetmap.org/wiki/Editing">altres
opcions</a> per a editar l'OpenStreetMap.
potlatch_unsaved_changes: Teniu canvis sense desar. (Per desar els canvis al
- Potlatch, heu de desseleccionar la via o el punt actual, si esteu en l'edicó
- en viu, o fer clic a "desa", si teniu un botó "desa".)
+ Potlatch, desseleccioneu la via o el punt actuals si esteu en mode d'edició
+ en viu o feu clic a "Desa" si teniu un botó "Desa".)
potlatch2_not_configured: No s'ha configurat el Potlatch 2 - mireu http://wiki.openstreetmap.org/wiki/The_Rails_Port#Potlatch_2
per a més informació
potlatch2_unsaved_changes: Teniu canvis sense desar. (Per desar els canvis al
- Potlatch 2, heu de fer clic a "desa".)
+ Potlatch 2, feu clic a "Desa".)
id_not_configured: iD no s'ha configurat
- no_iframe_support: El navegador no suporta iframes HTML, que són necessàries
- per a aquesta funcionalitat.
+ no_iframe_support: El vostre navegador no és compatible amb iframes HTML, que
+ són necessàries per a aquesta funcionalitat.
export:
- title: Exportar
+ title: Exporta
area_to_export: Àrea a exportar
manually_select: Selecciona manualment una àrea diferent
format_to_export: Format d'exportació
- osm_xml_data: OpenStreetMap XML Data
+ osm_xml_data: Dades XML d'OpenStreetMap
map_image: Imatge de mapa (mostra una capa estàndard)
- embeddable_html: HTML que es pot incloure
+ embeddable_html: HTML incrustable
licence: Llicència
export_details: Les dades d'OpenStreetMap són publicades sota el termes de la
- <a href="http://creativecommons.org/licenses/by-sa/2.0/">llicència Creative
- Commons Attribution-ShareAlike 2.0</a>.
+ <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open Data Commons
+ Open Database License</a> (ODbL).
too_large:
- advice: 'Si falla l''exportació anterior, si us plau, penseu a utilitzar una
- de les fonts llistades a continuació:'
- body: Aquesta zona és massa gran per ser exportada com a dades XML de OpenStreetMap.
- Si us plau seleccioneu una àrea més petita o bé una de les següents fonts
+ advice: 'Si l''exportació anterior falla, proveu-ho amb alguna de les fonts
+ incloses a la llista següent:'
+ body: Aquesta zona és massa gran per ser exportada com a dades XML d'OpenStreetMap.
+ Feu zoom, seleccioneu una àrea més petita o useu una de les següents fonts
per descarregar quantitats grans de dades.
planet:
title: Planeta OSM
description: Còpies actualitzades regularment de la base de dades d'OpenStreetMap
al complet
overpass:
- title: API Overpass
- description: Descarrega aquest requadre des d'una rèplica de la base de
- dades d'OpenStreetMap
+ title: Overpass API
+ description: Descarrega aquest requadre delimitador des d'una rèplica de
+ la base de dades d'OpenStreetMap
geofabrik:
title: Descàrregues de Geofabrik
description: Extractes actualitzats regularment de continents, països i
- de les ciutats seleccionades
+ ciutats seleccionades
metro:
title: Extractes de Metro
description: Extractes per a les ciutats més grans del món i les seves àrees
latitude: 'Lat:'
longitude: 'Lon:'
output: Sortida
- paste_html: Enganxa HTML per incloure'l al lloc web
+ paste_html: Enganxa HTML per incrustar-lo al lloc web
export_button: Exporta
fixthemap:
title: Informeu d'un problema / Corregiu el mapa
title: Com contribuir
join_the_community:
title: Afegiu-vos a la comunitat
- explanation_html: Si heu trobat un problema amb les nostres dades del mapa,
- com per exemple l'omissió d'una carretera o bé de la vostra adreça, la
- millor forma d'arreglar-ho és unint-se a la comunitat d'OpenStreetMap
- i afegir o bé corregir les dades vós mateix.
+ explanation_html: Si heu trobat un error en el mapa, com per exemple una
+ carretera que falta o bé la vostra adreça, la millor forma d'arreglar-ho
+ és unint-vos a la comunitat d'OpenStreetMap i afegir o bé corregir les
+ dades vós mateix.
add_a_note:
instructions_html: Feu clic a <a class='icon note'></a> o a la mateixa icona
sobre el mapa. Això afegirà un marcador al mapa, que podeu desplaçar arrossegant-lo.
Afegiu el vostre missatge, deseu-lo i els altres usuaris ho investigaran.
other_concerns:
- title: Altres aspectes
- explanation_html: Si us preocupa la utilització de les nostres dades o bé
- el contingut d'aquestes, consulteu la <a href='/copyright'>pàgina de drets
- d'autor</a> per a més informació, o bé contacteu el <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grup
+ title: Altres qüestions
+ explanation_html: Si us preocupa el contingut de les nostres dades o l'ús
+ que se'n fa, consulteu la <a href='/copyright'>pàgina de drets d'autor</a>
+ per a més informació, o bé contacteu amb el <a href='http://wiki.osmfoundation.org/wiki/Working_Groups'>grup
de treball d'OSMF</a> corresponent.
help:
- title: Obtenir ajuda
- introduction: OpenStreetMap té multitud de recursos per conèixer aquest projecte,
- per plantejar i respondre preguntes, i per participar en discussions col·laboratives
- i documentar temes de cartografia.
+ title: Com obtenir ajuda
+ introduction: OpenStreetMap té diversos recursos per conèixer el projecte, per
+ plantejar i respondre preguntes, i per discutir i documentar temes de cartografia
+ de manera col·laborativa.
welcome:
url: /welcome
title: Benvingut a OpenStreetMap
- description: Comença amb aquesta guia ràpida sobre els aspectes bàsics de
+ description: Comenceu amb aquesta guia ràpida sobre els aspectes bàsics de
l'OpenStreetMap.
beginners_guide:
url: http://wiki.openstreetmap.org/wiki/Ca:Beginners%27_guide
i respostes d'OpenStreetMap.
mailing_lists:
title: Llistes de correu
- description: Pregunta o debat sobre qüestions interessants en relació a una
- àmplia sèrie de llistes de correu tòpiques o regionals.
+ description: Pregunta o debat sobre qüestions interessants en un ampli ventall
+ de llistes de correu temàtiques i regionals.
forums:
title: Fòrums
- description: Preguntes i debats, per a aquells que prefereixen l'estil de
- la interfície d'un tauler d'anuncis.
+ description: Preguntes i debats per als que prefereixen un estil d'interfície
+ de tauler d'anuncis.
irc:
title: IRC
description: Xat interactiu en llengües diferents i sobre diferents temes.
switch2osm:
title: switch2osm
- description: Ajuda per a empreses i organitzacions que canviïn als mapes i
- altres serveis basats en OpenStreetMap.
+ description: Ajuda per a empreses i organitzacions que volen migrar als mapes
+ i altres serveis basats en OpenStreetMap.
welcomemat:
url: https://welcome.openstreetmap.org/
title: Per a organitzacions
description: Ets amb una organització que vol usar OpenStreetMap? Troba el
que et cal saber a la nostra estoreta de benviguda.
wiki:
- url: http://wiki.openstreetmap.org/
+ url: https://wiki.openstreetmap.org/
title: Wiki d'OpenStreetMap
description: Navegueu per la wiki per a trobar documentació detallada d'OpenStreetMap.
sidebar:
close: Tanca
search:
search: Cerca
- get_directions: Obtenir indicacions
+ get_directions: Obtén indicacions
get_directions_title: Trobeu indicacions entre dos punts
from: De
to: A
entry:
motorway: Autopista
main_road: Carretera principal
- trunk: Autovia de
+ trunk: Autovia
primary: Carretera principal
secondary: Carretera secundària
unclassified: Carretera sense classificar
track: Pista
bridleway: Camí de ferradura
cycleway: Carril bici
- cycleway_national: Via ciclista nacional
- cycleway_regional: Via ciclista regional
- cycleway_local: Via ciclista local
+ cycleway_national: Carril bici nacional
+ cycleway_regional: Carril bici regional
+ cycleway_local: Carril bici local
footway: Camí de vianants
rail: Ferrocarril
subway: Metro
- Tren lleuger
- tramvia
cable:
- - Cable car
+ - Telefèric
- telecadira
runway:
- Pista d'aeroport
- - carril de taxi
+ - carrer de rodada
apron:
- - Davantal de l'Aeroport
+ - Estacionament d'avions
- terminal
- admin: Límits administratius
+ admin: Límit administratiu
forest: Bosc
wood: Fusta
golf: Camp de golf
park: Parc
resident: Zona residencial
common:
- - Comú
- - Prat
- retail: Zona de venda al detall
+ - Àrea comunal
+ - prat
+ retail: Àrea comercial
industrial: Zona industrial
commercial: Zona comercial
heathland: Bruguerar
- Llac
- Embassament
farm: Granja
- brownfield: Lloc Brownfield
+ brownfield: Àrea industrial abandonada
cemetery: Cementiri
allotments: Horts
pitch: Camp d'esports
summit:
- Cim
- pic
- tunnel: Carcassa de guions = túnel
- bridge: Embolcall negre = bridge
+ tunnel: Línia discontínua = túnel
+ bridge: Línia negra = bridge
private: Accés privat
- destination: Accés de destinació
+ destination: Servitud de pas
construction: Carreteres en construcció
bicycle_shop: Botiga de bicicletes
- bicycle_parking: Aparcament de bicicleta
+ bicycle_parking: Aparcament de bicicletes
toilets: Lavabos
richtext_area:
edit: Modifica
title_html: Analitzat amb <a href="https://kramdown.gettalong.org/quickref.html">kramdown</a>
headings: Encapçalaments
heading: Encapçalament
- subheading: Subencapçalament
+ subheading: Subtítol
unordered: Llista sense ordenar
ordered: Llista ordenada
first: Primer element
alt: Text alternatiu
url: URL
welcome:
- title: Benvingut!
- introduction_html: Us donem la benvinguda a l'OpenStreetMap, el mapa lliure
- i editable del món. Ara que ja us heu registrat, ja ho teniu tot a punt per
- començar a editar el mapa. Aquí hi ha una guia ràpida amb les coses més importants
+ title: Us donem la benvinguda!
+ introduction_html: Us donem la benvinguda a l'OpenStreetMap, el mapamundi lliure
+ i editable. Ara que ja us heu registrat, ja ho teniu tot a punt per començar
+ a editar el mapa. Aquí hi ha una guia ràpida amb les coses més importants
que cal saber
whats_on_the_map:
title: Què hi ha al mapa
- on_html: L'OpenStreetMap és un lloc per incloure al mapa coses que són <em>reals
- i normals</em>- això inclou milions d'edificis, carreteres, i altres detalls
- sobre llocs. Pots cartografiar totes les característiques del món real que
- et semblin interessants.
+ on_html: L'OpenStreetMap cartografia coses que són <em>reals i actuals</em>-
+ això inclou milions d'edificis, carreteres i altres detalls sobre llocs.
+ Pots cartografiar totes els elements del món real que et semblin interessants.
off_html: El que <em>no</em> inclou són dades subjectives com ara puntuacions,
- característiques històriques o hipotètiques i dades de fonts subjectes a
- copyright. A no ser que posseeixis un permís especial no copiïs res de mapes
- de paper o en línia.
+ característiques històriques o hipotètiques i dades de fonts amb drets d'autor.
+ Tret que posseeixis un permís especial, no copiïs res de mapes de paper
+ o en línia.
basic_terms:
title: Condicions bàsiques per editar el mapa
- paragraph_1_html: l'OpenStreetMap té algunes paraules del seu propi argot.
- Aquí hi han unes quantes paraules clau que et poden venir bé.
+ paragraph_1_html: L'OpenStreetMap té un argot propi. Aquí tens unes quantes
+ paraules clau que et poden venir bé.
editor_html: Un <strong>editor</strong> és un programa o pàgina web que pots
utilitzar per editar el mapa.
node_html: Un <strong>node</strong> és un punt al mapa, com ara un restaurant
o un arbre.
way_html: Una <strong>via</strong> és una línia o àrea, com ara una carretera,
- sèquia, llac o edifici.
+ un rierol, un llac o un edifici.
tag_html: Una <strong>etiqueta</strong> és un recull de dades sobre un node
o una via, com ara el nom d'un restaurant o la velocitat màxima d'una carretera.
rules:
title: Regles
- paragraph_1_html: "OpenStreetMap té poques les regles formals, pel que esperem
+ paragraph_1_html: "L'OpenStreetMap té poques les regles formals però esperem
que tots els participants col·laborin i es comuniquin amb la comunitat.
- Si està considerant\naltres activitats que no sigui l'edició manual, si
- us plau, llegiu i seguiu les directrius d' \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Importació</a>
+ Si voler dur a terme\naltres activitats que no siguin l'edició manual, llegiu
+ i seguiu les directrius d' \n<a href=\"http://wiki.openstreetmap.org/wiki/Import/Guidelines\">Importació</a>
i \n<a href=\"http://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct\">Edició
Automàtica</a>."
questions:
- title: Alguna pregunta més?
+ title: Alguna pregunta?
paragraph_1_html: "OpenStreetMap té diversos recursos per a conèixer aquest
projecte, per a plantejar i respondre preguntes, i per a debatre i documentar
de forma col·laborativa qüestions de cartografia. \n<a href='%{help_url}'>Ajuda</a>.
un cop d'ull a la nostra estoreta de benviguda."
start_mapping: Comença a editar el mapa
add_a_note:
- title: No tens temps per editar? Afegeix una nota!
+ title: No tens temps per editar? Escriu una nota
paragraph_1_html: Si només voleu fer una petita modificació però no disposeu
- del temps per registrar-vos i aprendre com editar, deixeu una nota al mapa.
+ del temps per registrar-vos i aprendre a editar, deixeu una nota al mapa.
paragraph_2_html: 'Només cal que us dirigiu al<a href=''%{map_url}''>mapa</a>
- i cliqueu l''icona de la nota: <span class=''icon note''></span>. Això afegirà
+ i cliqueu la icona de la nota: <span class=''icon note''></span>. Això afegirà
un marcador al mapa que podeu moure arrossegant-lo. Afegiu el vostre missatge,
- cliqueu el botó de desat, i altres usuaris ho investigaran.'
+ cliqueu el botó de desar, i altres usuaris ho investigaran.'
traces:
visibility:
- private: Privat (només compartit com anònim, el punts són desordenats)
- public: Públic (mostrat en llista de traça i com anònims, desordenada punts)
- trackable: Seguiments (només compartit com punts anònims, ordenades amb timestamps)
- identifiable: Identifiable (mostrat en llista de traça i com a punts d'identificació,
- ordenades amb timestamps)
+ private: Privat (només compartit com a punts anònims no ordenats)
+ public: Públic (mostrat a la llista de traces i com a punts anònims no ordenats)
+ trackable: Traçable (només compartit com a punts anònims ordenats segons marques
+ temporals)
+ identifiable: Identificable (mostrat a la llista de traes i com a punts identificables
+ ordenats segons marques temporals)
new:
- upload_trace: Carrega una traça GPS
- upload_gpx: 'Carregui l''arxiu GPX:'
+ upload_trace: Puja una traça GPS
+ upload_gpx: 'Puja l''arxiu GPX:'
description: 'Descripció:'
tags: 'Etiquetes:'
tags_help: separat per comes
help: Ajuda
help_url: https://wiki.openstreetmap.org/wiki/Upload
create:
- upload_trace: Pujar traça de GPS
- trace_uploaded: El fitxer GPX s'ha pujat i està pendent d'inserció a la base
- de dades. Això passarà en general dins d'una mitja hora, i se us enviarà un
- correu electrònic en finalitzar.
+ upload_trace: Puja una traça de GPS
+ trace_uploaded: El fitxer GPX s'ha pujat i està pendent de ser inclòs a la base
+ de dades. Aquest procés triga generalment una mitja hora. Rebreu un correu
+ electrònic quan s'hagi completat.
upload_failed: No s'ha pogut carregar el GPX. Un administrador ha estat alertat
de l'error. Proveu-ho de nou
traces_waiting:
- one: Teniu %{count} traça esperant en cua per a pujar. Considereu esperar
- a que aquesta traça acabi abans de pujar-ne més, així no blocareu la cua
- per a altres usuaris.
- other: Teniu %{count} traces esperant en cua per a pujar. Considereu esperar
- a que aquestes traces acabin abans de pujar-ne més, així no blocareu la
- cua per a altres usuaris.
+ one: Teniu %{count} traça esperant en cua per a pujar. Espereu a que aquesta
+ traça acabi abans de pujar-ne més, per tal de no blocar la cua per a altres
+ usuaris.
+ other: Teniu %{count} traces esperant en cua per a pujar. Espereu a que aquestes
+ traces acabin abans de pujar-ne més, per tal de no blocar la cua per a altres
+ usuaris.
edit:
title: Editant traça %{name}
heading: Editant traça %{name}
download: descàrrega
uploaded_at: 'Pujat a:'
points: 'Punts:'
- start_coord: 'Coordenada d''inici:'
+ start_coord: 'Coordenades d''inici:'
map: mapa
edit: modificació
owner: 'Propietari:'
tags: 'Etiquetes:'
tags_help: separat per comes
visibility: 'Visibilitat:'
- visibility_help: Què vol dir això?
+ visibility_help: què vol dir això?
update:
updated: Traça actualitzada
trace_optionals:
download: baixada
uploaded: 'Pujat el:'
points: 'Punts:'
- start_coordinates: 'coordenada d''inici:'
+ start_coordinates: 'Coordenades d''inici:'
map: mapa
edit: modificació
owner: 'Propietari:'
description: 'Descripció:'
tags: 'Etiquetes:'
- none: Ningú
+ none: Cap
edit_trace: Edita aquesta traça
delete_trace: Suprimeix aquesta traça
trace_not_found: No s'ha trobat la traça!
trace_paging_nav:
showing_page: Pàgina %{page}
older: Traces més antigues
- newer: Tracks més recents
+ newer: Traces més recents
trace:
pending: PENDENT
count_points:
identifiable: IDENTIFICABLE
private: PRIVAT
trackable: RASTREJABLE
- by: en
- in: a
+ by: per
+ in: en
map: mapa
index:
public_traces: Traces GPS públiques
my_traces: Les meves traçes de GPS
- public_traces_from: Tracks GPS públics de %{user}
- description: Navega pels tracks pujats recentment
- tagged_with: ' etiquetat amb %{tags}'
- empty_html: Aquí encara no hi ha res. <a href='%{upload_link}'>Pujeu un nou
- track</a> o apreneu més sobre els tracks GPS a la <a href='http://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pàgina
+ public_traces_from: Traces GPS públiques de %{user}
+ description: Navega per les traces pujades recentment
+ tagged_with: etiquetat amb %{tags}
+ empty_html: Aquí encara no hi ha res. <a href='%{upload_link}'>Pugeu una nova
+ traça</a> o apreneu més sobre les traces GPS a la <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>pàgina
wiki</a>.
upload_trace: Puja una traça
see_all_traces: Mostra totes les traces
see_my_traces: Veure les meves traces
delete:
- scheduled_for_deletion: Track programat per a ser suprimit
+ scheduled_for_deletion: Traça programada per a ser suprimida
make_public:
made_public: Traça feta pública
offline_warning:
message: El sistema de càrrega de fitxers GPX no està disponible actualment
offline:
- heading: GPX emmagatzematge fora de línia
- message: L'emmagatzematge i el sistema de pujada de fitxers GPX no són operatius
+ heading: Emmagatzematge GPX fora de línia
+ message: El sistema d'emmagatzematge i pujada de fitxers GPX no està disponible
actualment.
georss:
title: Traces GPS d'OpenStreetMap
description:
description_with_count:
- one: fitxer GPX amb %{count} punt de %{user}
- other: fitxer GPX amb %{count} punts de %{user}
+ one: Fitxer GPX amb %{count} punt de %{user}
+ other: Fitxer GPX amb %{count} punts de %{user}
description_without_count: Fitxer GPX de %{user}
application:
permission_denied: No tens permís per a accedir aquesta acció
require_cookies:
- cookies_needed: Sembla que teniu les galetes inhabilitades - habiliteu les galetes
- al navegador abans de continuar.
+ cookies_needed: Sembla que teniu les galetes inhabilitades al navegador; habiliteu-les
+ abans de continuar.
require_admin:
not_an_admin: Cal que sigueu administrador per dur a terme aquesta acció.
setup_user_auth:
blocked_zero_hour: Teniu un missatge urgent en el lloc web d'OpenStreetMap.
Cal que el llegiu per a poder desar els vostres canvis.
- blocked: El vostre accés a l'API ha estat blocat. Si us plau, connecteu-vos
- a la interfície web per obtenir més informació.
- need_to_see_terms: L'accés a l'API és temporalment suspeses. Si us plau, log-in
- a la interfície de web per veure els termes de col. laborador. Vostè no necessita
- estar d'acord, però cal veure-les.
+ blocked: El vostre accés a l'API ha estat blocat. Inicieu sessió a la interfície
+ web per obtenir més informació.
+ need_to_see_terms: El vostre accés a l'API està suspès temporalment. Inicieu
+ sessió a la interfície web per veure les condicions de col·laboració. No cal
+ cal que les accepteu, però sí que les llegiu.
oauth:
authorize:
- title: Autoritzar l'accés al vostre compte
+ title: Autoritzeu l'accés al vostre compte
request_access: L'aplicació %{app_name} sol·licita accés al vostre compte, %{user}.
- Marqueu si voleu autoritzar l'aplicació amb les següents funcions. Podeu triar
- les que vulgueu.
- allow_to: 'Permet la sol·licitud de client per:'
- allow_read_prefs: llegiu les vostres preferències d'usuari.
- allow_write_prefs: modificar les preferències d'usuari.
+ Marqueu si voleu autoritzar l'aplicació a tenir les següents funcions. Podeu
+ triar les que vulgueu.
+ allow_to: 'Permeteu a l''aplicació client de:'
+ allow_read_prefs: llegir les vostres preferències d'usuari.
+ allow_write_prefs: modificar les vostres preferències d'usuari.
allow_write_diary: crear entrades de diari, comentaris i fer amics.
allow_write_api: modificar el mapa.
allow_read_gpx: llegir les vostres traces GPS privades.
allow_write_gpx: carregar traces GPS.
allow_write_notes: modificar les notes.
- grant_access: Concedeix accés
+ grant_access: Permet l'accés
authorize_success:
title: Sol·licitud d'autorització permesa
allowed: Heu permès que l'aplicació %{app_name} accedeixi al vostre compte.
verification: El codi de verificació és %{code}.
authorize_failure:
- title: Sol·licitud d'autorització errònia
+ title: La sol·licitud d'autorització ha fallat
denied: Heu denegat que l'aplicació %{app_name} accedeixi al vostre compte.
invalid: El testimoni d’autorització no és vàlid.
revoke:
- flash: He estat revocat el testimoni per %{application}
+ flash: Heu anul·lat el testimoni per %{application}
permissions:
missing: No heu permès l'accés de l'aplicació a aquesta característica
oauth_clients:
new:
- title: Registrar-se una nova aplicació
+ title: Registreu una nova aplicació
edit:
- title: Editar la vostra aplicació
+ title: Editeu la vostra aplicació
show:
- title: OAuth detalls per %{app_name}
- key: 'Clau de consum:'
- secret: 'Secret de consum:'
- url: 'URL del testimoni de la sol·licitud:'
- access_url: 'Accés Fitxa URL:'
- authorize_url: 'Autoritza URL:'
- support_notice: Suportem les signatures de tipus HMAC-SHA1 (recomanat) i RSA-SHA1.
+ title: Detalls OAuth per %{app_name}
+ key: 'Clau de consumidor:'
+ secret: 'Pregunta secret del consumidor:'
+ url: 'URL del testimoni de sol·licitud:'
+ access_url: 'URL del testimoni d''accés:'
+ authorize_url: 'Autoritzeu URL:'
+ support_notice: Som compatibles amb les signatures de tipus HMAC-SHA1 (recomanades)
+ i RSA-SHA1.
edit: Edita els detalls
- delete: Suprimeix el client
+ delete: Esborra el client
confirm: N'esteu segur?
- requests: 'Sol·licitar els permisos següents des de l''usuari:'
+ requests: 'Demana els permisos següents a l''usuari:'
allow_read_prefs: llegir les vostres preferències d'usuari.
allow_write_prefs: modificar les vostres preferències d'usuari.
allow_write_diary: crear entrades de diari, comentaris i fer amics.
allow_write_api: modificar el mapa.
- allow_read_gpx: llegir les seves traces GPS privats.
- allow_write_gpx: carregar traces GPS.
- allow_write_notes: modificar les notes
+ allow_read_gpx: llegir les vostres traces GPS privades.
+ allow_write_gpx: pujar traces GPS.
+ allow_write_notes: modificar notes.
index:
- title: Les meves dades OAuth
- my_tokens: Meves aplicacions autoritzada
- list_tokens: 'Les fitxes següents s''han emès per aplicacions en el vostre nom:'
- application: Nom d'aplicació
+ title: Els meus detalls OAuth
+ my_tokens: Les meves aplicacions autoritzades
+ list_tokens: 'Els testimonis següents han estat enviats a aplicacions en el
+ vostre nom:'
+ application: 'Nom de l’aplicació:'
issued_at: Emès A
revoke: Revoca!
- my_apps: Meves aplicacions de Client
+ my_apps: Les meves aplicacions client
no_apps: ¿Teniu cap aplicació que voldríeu inscriure per usar amb nosaltres
utilitzant l'estàndard %{oauth}? Heu de registrar la vostra aplicació web
abans que pugui fer peticions OAuth a aquest servei.
form:
name: Nom
required: Requerit
- url: Principal aplicació URL
- callback_url: Resposta d'URL
+ url: URL principal de l'aplicació
+ callback_url: URL de devolució de trucada
support_url: URL de suport
- requests: 'Sol·licitar els permisos següents des de l''usuari:'
- allow_read_prefs: llegir les seves preferències d'usuari.
- allow_write_prefs: modificar les seves preferències d'usuari.
+ requests: 'Sol·licitar els permisos següents a l''usuari:'
+ allow_read_prefs: llegir les vostres preferències d'usuari.
+ allow_write_prefs: modificar les vostres preferències d'usuari.
allow_write_diary: crear entrades de diari, comentaris i fer amics.
allow_write_api: modificar el mapa.
- allow_read_gpx: llegir les seves traces GPS privats.
+ allow_read_gpx: llegir les vostres traces GPS privades.
allow_write_gpx: carregar traces GPS.
- allow_write_notes: modifcar les notes.
+ allow_write_notes: modificar notes.
not_found:
- sorry: Ho sento, no s'ha pogut trobar el %{type}.
+ sorry: No s'ha pogut trobar aquest %{type}.
create:
flash: La informació s'ha enregistrat correctament
update:
- flash: La informació de client ha actualitzat correctament
+ flash: La informació del client s'ha actualitzat correctament
destroy:
flash: S'ha destruït el registre de l'aplicació client
users:
login:
title: Accés
heading: Accés
- email or username: 'Adreça de correu o usuari:'
+ email or username: 'Adreça de correu o nom d''usuari:'
password: 'Contrasenya:'
openid: '%{logo} OpenID:'
- remember: 'Recorda''m:'
+ remember: Recorda'm
lost password link: Heu perdut la contrasenya?
login_button: Accés
register now: Registreu-vos-hi ara
- with username: 'Ja teniu un compte de l''OpenStreetMap? Incieu sessió amb el
+ with username: 'Ja teniu un compte de l''OpenStreetMap? Inicieu sessió amb el
nom d''usuari i contrasenya:'
with external: Alternativament, inicieu una sessió mitjançant un tercer
new to osm: Nou a OpenStreetMap?
- to make changes: Per fer canvis a les dades de OpenStreetMap, ha de tenir un
- compte.
- create account minute: Crear un compte. Només es triga un minut.
+ to make changes: Per fer canvis a les dades de l'OpenStreetMap, heu de tenir
+ un compte.
+ create account minute: Creeu un compte. Només trigareu un minut.
no account: No teniu cap compte?
- account not active: Ho sentim, el vostre compte encara no és actiu.<br>Utilitzeu
- l'enllaç al correu de confirmació per activar el vostre compte, o <a href="%{reconfirm}">demanar
+ account not active: El vostre compte encara no és actiu.<br />Utilitzeu l'enllaç
+ al correu de confirmació per activar el vostre compte o <a href="%{reconfirm}">demaneu
un nou correu electrònic de confirmació</a>.
- account is suspended: Ho sentim, s'ha suspès el vostre compte per presentar
- una activitat sospitosa.<br />Contacteu amb el <a href="%{webmaster}">webmestre</a>
- si voleu parlar-ne.
- auth failure: Ho sentim, no podeu registrar-vos amb aquesta informació.
+ account is suspended: S'ha suspès el vostre compte a causa d'activitat sospitosa.<br
+ />Contacteu amb el <a href="%{webmaster}">l'administrador del web</a> per
+ parlar-ne.
+ auth failure: No podeu iniciar la sessió amb aquesta informació.
openid_logo_alt: Inicia sessió amb un compte OpenID
auth_providers:
openid:
title: Inicia sessió amb un compte OpenID
- alt: Inicia sessió amb un compte OpenID
+ alt: Inicia sessió amb una URL OpenID
google:
title: Inicieu la sessió amb Google
- alt: Inici de sessió amb un compte OpenID de Google
+ alt: Inicieu la sessió amb un compte OpenID de Google
facebook:
title: Inicieu la sessió amb Facebook
- alt: Entrar amb un Compte de Facebook
+ alt: Inicieu la sessió amb un compte de Facebook
windowslive:
- title: Inici de sessió amb Windows Live
- alt: Inici de sessió amb un Compte de Windows Live
+ title: Inicieu la sessió amb Windows Live
+ alt: Inicieu de sessió amb un compte de Windows Live
github:
- title: Inicia la sessió amb GitHub
- alt: Inicia la sessió amb un compte de GitHub
+ title: Inicieu la sessió amb GitHub
+ alt: Inicieu la sessió amb un compte de GitHub
wikipedia:
- title: Inicia la sessió amb Viquipèdia
- alt: Inicia la sessió amb un compte de Viquipèdia
+ title: Inicieu la sessió amb Viquipèdia
+ alt: Inicieu la sessió amb un compte de Viquipèdia
yahoo:
title: Inicieu la sessió amb Yahoo
- alt: Inici de sessió amb un compte OpenID de Yahoo
+ alt: Inicieu la sessió amb un compte OpenID de Yahoo
wordpress:
- title: Inicieu sessió amb Wordpress
- alt: Inici de sessió amb un compte OpenID de Wordpress
+ title: Inicieu la sessió amb Wordpress
+ alt: Inicieu la sessió amb un compte OpenID de Wordpress
aol:
- title: Inici de sessió amb AOL
- alt: Inici de sessió amb un compte OpenID d'AOL
+ title: Inicieu la sessió amb AOL
+ alt: Inicieu la sessió amb un compte OpenID d'AOL
logout:
title: Tanca la sessió
heading: Tanca la sessió d'OpenStreetMap
logout_button: Tanca la sessió
lost_password:
- title: contrasenya perduda
+ title: Contrasenya perduda
heading: Heu oblidat la contrasenya?
email address: 'Adreça de correu electrònic:'
new password button: Restableix la contrasenya
- help_text: Introduïu l'adreça de correu electrònic que va utilitzar per registrar-se,
- us enviarem un enllaç a ella que pot utilitzar per restablir la contrasenya.
- notice email on way: Lamentem que l'hàgiu perdut :-( però us hem enviat un correu,
- així podreu restaurar-la ràpidament.
- notice email cannot find: Podria no trobar aquesta adreça de correu.
+ help_text: Introduïu l'adreça de correu electrònic que vau utilitzar per registrar-vos;
+ us hi enviarem un enllaç per restablir la contrasenya.
+ notice email on way: Lamentem que l'hàgiu perdut :-( però ja us hem enviat un
+ correu i la podreu restablir ben aviat.
+ notice email cannot find: No s'ha trobat aquesta adreça de correu.
reset_password:
title: Restableix la contrasenya
- heading: Restableix la contrasenya per %{user}
+ heading: Restableix la contrasenya per a %{user}
password: 'Contrasenya:'
confirm password: 'Confirmeu la contrasenya:'
reset: Restableix la contrasenya
flash changed: S'ha canviat la contrasenya.
- flash token bad: No ha trobat que comproven token, l'URL potser?
+ flash token bad: No s'ha trobat el testimoni. Comproveu la URL.
new:
- title: Crear un compte
- no_auto_account_create: No us podem crear automàticament un compte.
+ title: Creeu un compte
+ no_auto_account_create: No us podem crear un compte automàticament.
contact_webmaster: Contacteu amb el <a href="%{webmaster}">webmestre</a> per
gestionar la creació d'un compte - intentarem tractar la sol·licitud tan aviat
com sigui possible.
# Author: Purodha
# Author: Raymond
# Author: Reneman
+# Author: Schmackes
# Author: SimonPoole
# Author: Snocker15
# Author: Str4nd
create: Registrieren
update: Bearbeiten
redaction:
- create: Publikation erstellen
- update: Publikation speichern
+ create: Redaction erstellen
+ update: Redaction speichern
trace:
create: Hochladen
update: Änderungen speichern
activerecord:
errors:
messages:
- invalid_email_address: Die eingegebene E-Mail-Adresse scheint nicht gültig
- zu sein.
- email_address_not_routable: ist nicht routbar
+ invalid_email_address: scheint keine gültige E-Mail-Adresse zu sein
+ email_address_not_routable: ist nicht routingfähig
models:
- acl: Zugangskontrollliste
+ acl: Zugriffssteuerungsliste
changeset: Änderungssatz
changeset_tag: Änderungssatz-Attribut
country: Staat
node_tag: Knoten-Attribut
notifier: Benachrichtiger
old_node: Alter Knoten
- old_node_tag: Altes Knoten-Attribut
+ old_node_tag: Alter-Knoten-Attribut
old_relation: Alte Relation
- old_relation_member: Altes Relations-Mitglied
- old_relation_tag: Altes Relations-Attribut
+ old_relation_member: Alte-Relation-Mitglied
+ old_relation_tag: Alte-Relation-Attribut
old_way: Alte Linie
- old_way_node: Alter Linien-Knoten
- old_way_tag: Altes Linien-Attribut
+ old_way_node: Alte-Linie-Knoten
+ old_way_tag: Alte-Linie-Attribut
relation: Relation
relation_member: Relations-Mitglied
- relation_tag: Relations-Attribut
+ relation_tag: Relation-Attribut
session: Sitzung
trace: Track
tracepoint: Trackpunkt
user_token: Benutzer-Token
way: Linie
way_node: Linienknoten
- way_tag: Linienattribut
+ way_tag: Linie-Attribut
attributes:
diary_comment:
- body: Text
+ body: Textkörper
diary_entry:
user: Benutzer
title: Betreff
message:
sender: Absender
title: Betreff
- body: Text
+ body: Textkörper
recipient: Empfänger
user:
email: E-Mail
tag: Die Wiki-Erläuterungsseite für das Attribut %{key}=%{value}
wikidata_link: Das Objekt %{page} auf Wikidata
wikipedia_link: Der Artikel zu %{page} in der Wikipedia
+ wikimedia_commons_link: Das %{page} Element auf Wikimedia Commons
telephone_link: '%{phone_number} anrufen'
colour_preview: Farbe %{colour_value} Vorschau
note:
pass_crypt: Κωδικός
datetime:
distance_in_words_ago:
+ about_x_hours:
+ one: περίπου μία ώρα πριν
+ other: περίπου %{count} ώρες πριν
+ about_x_months:
+ one: περίπου έναν μήνα πριν
+ other: περίπου %{count} μήνες πριν
+ about_x_years:
+ one: περίπου έναν χρόνο πριν
+ other: περίπου %{count} χρόνια πριν
+ almost_x_years:
+ one: σχεδόν ένα χρόνο πριν
+ other: σχεδόν %{count} χρόνια πριν
half_a_minute: μισό λεπτό πριν
+ less_than_x_seconds:
+ one: λιγότερο από ένα δευτερόλεπτο πριν
+ other: λιγότερο από %{count} δευτερόλεπτα πριν
+ less_than_x_minutes:
+ one: λιγότερο από ένα λεπτό πριν
+ other: λιγότερο από %{count} λεπτά πριν
+ over_x_years:
+ one: πάνω από έναν χρόνο πριν
+ other: πάνω από %{count} χρόνια πριν
+ x_seconds:
+ one: ένα δευτερόλεπτο πριν
+ other: '%{count} δευτερόλεπτα πριν'
+ x_minutes:
+ one: ένα λεπτό πριν
+ other: '%{count} λεπτά πριν'
+ x_days:
+ one: μία ημέρα πριν
+ other: '%{count} ημέρες πριν'
+ x_months:
+ one: έναν μήνα πριν
+ other: '%{count} μήνες πριν'
+ x_years:
+ one: ένα χρόνο πριν
+ other: '%{count} χρόνια πριν'
printable_name:
with_version: '%{id}, v%{version}'
editor:
# Author: IknowJoseph
# Author: Jagwar
# Author: Jguthrie100
+# Author: Jlrb+
# Author: Kosovastar
# Author: Macofe
# Author: Meno25
will be sent to you on completion.
traces_waiting:
one: You have %{count} trace waiting for upload. Please consider waiting for
- these to finish before uploading any more, so as not to block the queue
- for other users.
+ this to finish before uploading any more, so as not to block the queue for
+ other users.
other: You have %{count} traces waiting for upload. Please consider waiting
for these to finish before uploading any more, so as not to block the queue
for other users.
title_comment: Ŝanĝaro %{id} - %{comment}
join_discussion: Ensalutu por aliĝi al la diskuto
discussion: Diskuto
- still_open: Ŝanĝaro plue malfermita - diskuto estos malfermita ekde kiam ĝi
- estos malfermita.
+ still_open: Ŝanĝaro plue malfermita - diskuto estos malfermita ekde kiam la
+ ŝanĝaro estos fermita.
node:
title: 'Nodo: %{name}'
history_title: 'Historio de nodo: %{name}'
tag: La viki-paĝo priskribanta la etikedon '%{key}=%{value}'
wikidata_link: La %{page} elemento en Vikidatumoj
wikipedia_link: La artikolo %{page} en Vikipedio
+ wikimedia_commons_link: Objekto %{page} ĉe Vikimedia Komunejo
telephone_link: Telefoni %{phone_number}
colour_preview: Antaŭvido de koloro “%{colour_value}”
note:
clothes: فروشگاه پوشاک
computer: فروشگاه رایانه
confectionery: فروشگاه قنادی
- convenience: فروشگاه زنجیره ای
+ convenience: سوپرمارکت
copyshop: مغازه فتوکپی
cosmetics: فروشگاه لوازم آرایشی
deli: اغذیه فروشی
shoes: فروشگاه کفش
sports: فروشگاه ورزشی
stationery: فروشگاه نوشتافزار
- supermarket: سوپرمارکت
+ supermarket: فروشگاه بزرگ
tailor: خیاطی
ticket: فروشگاه بلیط
tobacco: فروشگاه توتون و تنباکو
description: دریافت این محدوده از یکی از آینههای پایگاهدادهٔ OpenStreetMap
geofabrik:
title: دانلودهای Geofabrik
- description: گزیدهٔ اطلاعات قارهها، کشورها، و شهرهای منتخب که بهطور منظم
+ description: استخراج اطلاعات قارهها، کشورها، و شهرهای منتخب که بهطور منظم
روزآمد میشود
metro:
title: خلاصه های مترو
- description: Ø®Ù\84اصÙ\87 هایی برای شهرهای بزرگ جهان و مناطق اطرافشان
+ description: استخراجâ\80\8cهایی برای شهرهای بزرگ جهان و مناطق اطرافشان
other:
title: سایر منابع
description: منابع بیشتر در ویکی OpenStreetMap ذکر شده است
tracetag: Jäljen tagi
user: Käyttäjä
user_preference: Käyttäjän asetus
+ user_token: Käyttäjän poletti
way: Viiva
way_node: Viivan piste
way_tag: Viivan tagi
geonames_reverse: Hakuresyltaatit <a href="http://www.geonames.org/">GeoNamesista</a>
search_osm_nominatim:
prefix:
+ aerialway:
+ cable_car: Köysirata
+ chair_lift: Tuolihissi
+ drag_lift: Vetohissi
+ gondola: Gondolihissi
+ platter: Hiihtohissi
+ pylon: Pylväs
amenity:
cafe: Kahvila
hospital: Siukhuusi
sauna: Sauna
school: Skoulu
toilets: Tualetit
+ university: Yniversiteetti
leisure:
sauna: Sauna
office:
states:
open: Avvaa
resolved: Ratkaistu
+ update:
+ new_report: Ilmianto on vastaanotettu
+ successful_update: Ilmianto on päivitetty
+ provide_details: Täyennä tarvittavat tiot
show:
+ title: '%{status} Tapaus #%{issue_id}'
+ reports:
+ zero: Ei ilmiantoa
+ one: Yksi ilmianto
+ other: '%{count} ilmiantoa'
report_created_at: Ilmotettu ensimmäisen kerran %{datetime}
last_resolved_at: Ratkastu %{datetime}
last_updated_at: Viimeisin käsittelijä %{displayname} %{datetime}
other_issues_against_this_user: Muut tähän käyttäjään kohistetut ilmiannot
no_other_issues: Ei muita tähän käyttäjään kohistuvia ilmiantoja.
comments_on_this_issue: Tapauksen kommentit
+ resolve:
+ resolved: Tapaus on markeerattu ratkaistuksi
+ ignore:
+ ignored: Tapaus on markeerattu aiheettomaksi
+ reopen:
+ reopened: Tapaus on markeerattu käsittelyssä olevaksi
comments:
created_at: '%{datetime}'
+ reassign_param: Haluatko määrittää tapauksen tilan uuelleen?
reports:
updated_at: '%{datetime}'
reported_by_html: Käyttäjä %{user} ilmiantanut merkinnällä %{category}
+ helper:
+ reportable_title:
+ diary_comment: '%{entry_title}, kommenttitunnus %{comment_id}'
+ note: Karttailmoitustunnus %{note_id}
+ issue_comments:
+ create:
+ comment_created: Kommentti jätetty
reports:
new:
title_html: Ilmianna %{link}
changeset_comment_notification:
hi: Hei %{to_user},
greeting: Hei,
+ commented:
+ partial_changeset_with_comment: kommentin kanssa '%{changeset_comment}'
+ partial_changeset_without_comment: ei kommenttia
+ details: 'Lisätioja muutoskokoelmasta: %{url}'
+ unsubscribe: Peruaksesi tilauksen päivityksistä tähän muutoskokoelmaan, vieraile
+ sivula %{url} ja klikkaa "Unsubscribe".
messages:
inbox:
+ title: Saapuneet
my_inbox: Saapuneet
outbox: Lähetetyt
+ messages: Kansiossa on %{new_messages} ja %{old_messages}.
+ new_messages:
+ one: '%{count} lukematon viesti'
+ other: '%{count} lukematonta viestiä'
+ old_messages:
+ one: '%{count} luettu viesti'
+ other: '%{count} luettua viestiä'
from: Lähättäjä
subject: Otsikko
date: Taatumi
+ no_messages_yet: Ei viestejä. %{people_mapping_nearby_link}
+ people_mapping_nearby: Lähiseudun kartoittajat
message_summary:
unread_button: Markeeraa lukemattomaksi
read_button: Markeeraa luetuksi
back_to_inbox: Takashiin saapuneisiin
create:
message_sent: Viesti on lähätetty.
+ limit_exceeded: Olet lähettänyt runsaasti viestejä lyhyessä ajassa. Odota hetki
+ ennen kuin yrität lähettää lisää.
+ no_such_message:
+ title: Ei sellaista viestiä
+ heading: Ei sellaista viestiä
outbox:
+ title: Lähätetyt
my_inbox: Minun %{inbox_link}
+ inbox: Saapuneet
+ outbox: Lähätetyt
+ messages:
+ one: Kansiossa on %{count} lähätetty viesti.
+ other: Kansiossa on %{count} lähätettyä viestiä.
+ to: Vastaanottaja
+ subject: Otsikko
date: Taatumi
+ no_sent_messages: Et ole lähettänyt vielä viestejä. Miksi et ottaisi yhteyttä
+ joihinkin %{people_mapping_nearby_link}?
+ people_mapping_nearby: lähellä kartoittaviin käyttäjiin
+ reply:
+ wrong_user: Olet lokannu sisäle konttulla `%{user}' mutta viestiä, johon tahot
+ vastata, ei ole lähätetty kyseiselle käyttäjälle. Ole hyvä ja lokkaa sisäle
+ oikealla käyttäjäkonttulla vastataksesi.
show:
+ title: Lue viesti
+ from: 'Lähettäjä:'
+ subject: Otsikko
date: Taatumi
+ reply_button: Vastaa
unread_button: Markeeraa lukemattomaksi
destroy_button: Ota poies
back: Takashiin
+ to: 'Vastaanottaja:'
sent_message_summary:
destroy_button: Ota poies
mark:
site:
about:
next: Seuraava
+ copyright_html: <span>©</span>OpenStreetMapin<br>tekijät
+ used_by: Tuhannet verkkosivustot, mupiilisovellukset ja laitteistot käyttävät
+ %{name}-karttaa
+ lede_text: OpenStreetMapia rakentavat vapaaehtoiset yhteisön jäsenet, jotka
+ tuottavat ja ylläpitävät karttatietoja teistä, rautateistä, kahviloista, rautatieasemista
+ ja monista muista kohteista kaikkialla maailmassa.
+ local_knowledge_title: Paikallistuntemus
+ local_knowledge_html: OpenStreetMapissa korostuu paikallistuntemus. Kartoittajat
+ käyttävät ilmakuvia, GPS-paikantamia ja jalkautumista pitääkseen OpenStreetMap-kartan
+ ajan tasalla.
+ community_driven_title: Yhteisön voima
+ community_driven_html: |-
+ OpenStreetMap-yhteisö on monipuolinen, intohimoinen ja kasvaa joka päivä. Yhteisöön kuuluu harrastajakartoittajia, GIS-ammattilaisia, järjestelmää ylläpitäviä insinöörejä, humanitaarisia auttajia, jotka kartoittavat katastrofin kärsineitä alueita sekä monia muita. Lisätietoja yhteisöstä saa lukemalla <a href='https://blog.openstreetmap.org'>OpenStreetMap-blogia</a>, <a href='%{diary_path}'>käyttäjien päiväkirjoja</a>,
+ <a href='https://blogs.openstreetmap.org/'>yhteisöblogeja</a> ja
+ <a href='https://www.osmfoundation.org/'>OSM-säätiön</a> verkkosivua.
open_data_title: Avoin taatta
+ open_data_html: 'OpenStreetMap on <i>avointa taattaa</i>: palvelua saa käyttää
+ vapaasti mihin tahansa, kunhan OpenStreetMap tekijöineen mainitaan. Jos palvelua
+ kehitetään tai muuunnellaan, sitä saa levittää eteenpäin vain samala lisensillä.
+ Lisätietoja on <a href=''%{copyright_path}''>Tekijänoikeus ja lisensi</a>
+ -sivula.'
+ legal_title: Lakitekninen jako
+ legal_html: "Tämä ja monet muut OSM-sivustot ovat muodollisesti <a href='https://osmfoundation.org/'>OpenStreetMap-säätiön</a>
+ (OSMF) hallinnoimia OSM-yhteisön puolesta. Kaikkien näiden sivustojen käyttöön
+ sovelletaan <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nsallitun
+ käytön käytäntöjä</a>, <a href=\"https://wiki.osmfoundation.org/wiki/Terms_of_Use\">käyttöehtoja</a>
+ ja <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\">tietosuojakäytäntöä</a>
+ (molemmat sisällöt saatavilla vain englanniksi).\n<br> \n<a href='https://osmfoundation.org/Contact'>Ota
+ yhteys OSMF:ään</a> lisensointi-, tekijänoikeus- ja muissa lakiteknisissä
+ kysymyksissä.\n<br>\nNimi OpenStreetMap, suurennuslasilogo ja slogan State
+ of the Map ovat <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">säätiön
+ rekisteröimiä tavaramerkkejä</a>."
+ partners_title: Kumppanit
copyright:
foreign:
title: Tietoja tästä käänöksestä
- english_link: englanninenkielisen alkuperäisversuunin
+ text: Jos tämän käänätyn sivun ja %{english_original_link} välillä on eroja,
+ englantinkielinen sivu on aina etusijalla.
+ english_link: englantinkielisen alkuperäisversuunin
native:
title: Tästä sivusta
text: Tällä sivula on alkuperänen englanninkielinen versuuni tekijäoikeuksista.
Kartta-aineisto ja dokumentaatio on lisensoitu <a href="https://creativecommons.org/licenses/by-sa/2.0/deed.fi">Creative
Commons Nimeä-Jaa samoin 2.0</a> -lisensillä (CC-BY-SA).
credit_title_html: OpenStreetMapin mainitseminen
+ credit_1_html: OpenStreetMapin sisältöä levitettäessä on mainittava teksti
+ "© OpenStreetMapin tekijät" tai sen englantinkielinen vastine
+ "© OpenStreetMap contributors".
+ credit_2_html: "Levittäjän tulee tehdä selväksi, että aineisto on saatavilla
+ Open Database -lisenssillä\nja kartta-aineisto CC-BY-SA-lisenssillä. Tämä
+ voidaan tehdä sijoittamalla sivulle linkki\n<a href=\"https://www.openstreetmap.org/copyright\">tälle
+ tekijänoikeussivulle</a>. \nJos linkkien käyttö ei ole mahdollista (esimerkiksi
+ paperille tulostettu aineisto),\nsuosittelemme ohjaamaan lukijat osoitteisiin
+ www.openstreetmap.org, opendatacommons.org ja tarvittaessa myös creativecommons.org."
+ credit_3_html: 'Sivustolle upotetun interaktiivisen karttaikkunan tulee sisältää
+ tekijän nimi kartan alaosassa:'
+ attribution_example:
+ alt: Esimerkki siitä, miten nimetä OpenStreetMap nettisivulla
+ title: Nimeämisesimerkki
+ more_title_html: Lisätietoja
contributors_title_html: Meän tekijät
index:
permalink: Ikunen länkki
format_to_export: Eksporteerausmuoto
osm_xml_data: OpenStreetMap XML-taatta
licence: Lisensi
+ too_large:
+ other:
+ title: Muut läheet
+ description: Muut läheet ovat esillä OpenStreetMap-wikissä
options: Inställninkit
format: 'Fiilimuoto:'
+ scale: Mittakaava
+ max: eninthään
+ image_size: Kuvan koko
+ zoom: Suurennostaso
+ add_marker: Lissää vietävään kartaan kohemerkki
+ latitude: 'Lev:'
+ longitude: 'Pit:'
output: Tulos
+ paste_html: Kopioi ja liitä tämä HTML-kooti verkkosivulesi
export_button: Eksporteeraa
fixthemap:
+ title: Ilmota ongelmasta / Korjaa karttaa
how_to_help:
+ title: Kuinka voin auttaa
join_the_community:
title: Liity föreeninkhiin
help:
search:
search: Haku
submit_text: Hae
+ key:
+ table:
+ entry:
+ school:
+ 1: yniversiteetti
richtext_area:
edit: Mookkaa
preview: Etukattelu
description: 'Kuvvaus:'
help: Apua
edit:
- title: Mookataan jälkeä %{name}
+ title: Mookathaan jälkeä %{name}
filename: 'Fiilinimi:'
uploaded_at: 'Ylösladattu:'
edit: mookkaa
trace:
edit: mookkaa
edit_map: Mookkaa karttaa
+ public: JULKINEN
+ identifiable: TUNNISTETTAVA
+ private: YKSITYINEN
+ trackable: SEURATTAVA
+ by: käyttäjältä
+ in: avainsanoilla
+ map: sijainti kartalla
+ index:
+ public_traces: Julkiset GPS-jäljet
+ my_traces: Minun GPS-jäljet
oauth_clients:
edit:
title: Mookkaa sovellustasi
comment: Kommentoi
directions:
instructions:
+ unnamed: nimetön tie
courtesy: Reittiohjeet tarjoaa %{link}
exit_counts:
first: ensimmäisestä
title_comment: Groupe de modifications %{id} — %{comment}
join_discussion: Se connecter pour rejoindre la discussion
discussion: Discussion
- still_open: Ensemble de modifications toujours ouvert â\80\94 la discussion s’ouvrira
+ still_open: Ensemble de modifications toujours ouvert â\80\93 la discussion s’ouvrira
une fois que l’ensemble de modifications sera fermé.
node:
title: 'Nœud : %{name}'
tag: La description de l’attribut %{key}=%{value} sur le wiki
wikidata_link: L’élément %{page} sur Wikidata
wikipedia_link: L’article « %{page} » sur Wikipédia
+ wikimedia_commons_link: L’élément %{page} sur Wikimedia Commons
telephone_link: Appeler %{phone_number}
colour_preview: Aperçu de la couleur %{colour_value}
note:
hidden_title: Note masquée nº %{note_name}
open_by: Créée par %{user}, <abbr title="%{exact_time}">%{when}</abbr>
open_by_anonymous: Créée par un utilisateur anonyme, <abbr title="%{exact_time}">%{when}</abbr>
- commented_by: Commenté par %{user} <abbr title='%{exact_time}'>%{when}</abbr>
- commented_by_anonymous: Commenté par un utilisateur anonyme <abbr title='%{exact_time}'>%{when}</abbr>
- closed_by: Résolu par %{user} <abbr title='%{exact_time}'>%{when}</abbr>
- closed_by_anonymous: Résolu par un utilisateur anonyme le <abbr title='%{exact_time}'>%{when}</abbr>
+ commented_by: Commenté par %{user} <abbr title="%{exact_time}">%{when}</abbr>
+ commented_by_anonymous: Commenté par un utilisateur anonyme <abbr title="%{exact_time}">%{when}</abbr>
+ closed_by: Résolu par %{user} <abbr title="%{exact_time}">%{when}</abbr>
+ closed_by_anonymous: Résolu par un utilisateur anonyme le <abbr title="%{exact_time}">%{when}</abbr>
reopened_by: Réactivée par %{user}, <abbr title="%{exact_time}">%{when}</abbr>
- reopened_by_anonymous: Réactivé par un utilisateur anonyme <abbr title='%{exact_time}'>%{when}</abbr>
- hidden_by: Masqué par %{user} <abbr title='%{exact_time}'>%{when}</abbr>
+ reopened_by_anonymous: Réactivé par un utilisateur anonyme <abbr title="%{exact_time}">%{when}</abbr>
+ hidden_by: Masqué par %{user} <abbr title="%{exact_time}">%{when}</abbr>
report: Signaler cette note
query:
title: Requête sur les objets
changesets:
changeset_paging_nav:
showing_page: Page %{page}
- next: Suivant »
- previous: « Précédent
+ next: Suivant ››
+ previous: ‹‹ Précédent
changeset:
anonymous: Anonyme
no_edits: (aucune modification)
met trop de temps pour être chargée.
changeset_comments:
comment:
- comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
+ comment: Nouveau commentaire sur le groupe de modifications nº %{changeset_id}
par %{author}
commented_at_by_html: Mis à jour le %{when} par %{user}
comments:
- comment: Nouveau commentaire sur le groupe de modifications n° %{changeset_id}
+ comment: Nouveau commentaire sur le groupe de modifications nºâ\80¯%{changeset_id}
par %{author}
index:
title_all: Discussion sur le groupe de modifications OpenStreetMap
- title_particular: Discussion sur le groupe de modifications OpenStreetMap nº
- %{changeset_id}
+ title_particular: Discussion sur le groupe de modifications OpenStreetMap nº %{changeset_id}
timeout:
sorry: Désolé, la liste des commentaires d’ensembles de modifications que vous
avez demandée est trop longue à récupérer.
new:
title: Nouvelle entrée du journal
form:
- subject: 'Sujet :'
- body: 'Corps :'
- language: 'Langue :'
- location: 'Lieu :'
- latitude: 'Latitude :'
- longitude: 'Longitude :'
+ subject: 'Sujet :'
+ body: 'Corps :'
+ language: 'Langue :'
+ location: 'Lieu :'
+ latitude: 'Latitude :'
+ longitude: 'Longitude :'
use_map_link: utiliser la carte
index:
title: Journaux des utilisateurs
login_to_leave_a_comment: '%{login_link} pour laisser un commentaire'
login: Se connecter
no_such_entry:
- title: Pas d’entrée du journal correspondante
- heading: 'Aucune entrée avec l’id : %{id}'
+ title: Aucune entrée du journal correspondante
+ heading: 'Aucune entrée avec l’id : %{id}'
body: Désolé, il n’y a aucune entrée ou commentaire dans le journal avec l’id
%{id}. Veuillez vérifier votre orthographe ou la validité du lien que vous
avez cliqué.
reply_link: Répondre à cette entrée
comment_count:
zero: Aucun commentaire
- one: '%{count} commentaire'
+ one: Un commentaire
other: '%{count} commentaires'
edit_link: Modifier cette entrée
hide_link: Masquer cette entrée
confirm: Confirmer
report: Signaler ce commentaire
location:
- location: 'Lieu :'
+ location: 'Lieu :'
view: Afficher
edit: Modifier
feed:
description: Entrées récentes des journaux d’utilisateurs de OpenStreetMap
comments:
has_commented_on: '%{display_name} a commenté les entrées de journal suivantes'
- post: Article
+ post: Billet
when: Quand
comment: Commentaire
newer_comments: Commentaires plus récents
osm_nominatim: Résultats de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
Nominatim</a>
geonames: Résultats depuis <a href="http://www.geonames.org/">GeoNames</a>
- osm_nominatim_reverse: Résultats de <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
- Nominatim</a>
+ osm_nominatim_reverse: Résultats de <a href="https://nominatim.openstreetmap.org/">Nominatim
+ sur OpenStreetMap</a>
geonames_reverse: Résultats de <a href="http://www.geonames.org/">GeoNames</a>
search_osm_nominatim:
prefix:
emergency_access_point: Point d’accès d’urgence
footway: Chemin piéton
ford: Gué
- give_way: Panneau cédez le passage
+ give_way: Panneau « Cédez le passage »
living_street: Rue en zone de rencontre
milestone: Borne kilométrique
motorway: Autoroute
services: Services autoroutiers
speed_camera: Radar de vitesse
steps: Escalier
- stop: Signe d'arrêt
+ stop: Panneau « Stop / Arrêt »
street_lamp: Lampadaire
tertiary: Route tertiaire
tertiary_link: Route tertiaire
bunker: Bunker
castle: Château
church: Église
- city_gate: Porte de ville / porte de fortifications
+ city_gate: Porte de ville / porte fortifiée
citywalls: Remparts / murailles
fort: Fort
heritage: Site / objet du patrimoine
basin: Bassin
brownfield: Friche industrielle
cemetery: Cimetière
- commercial: Zone tertiaire / Zone d'activités
+ commercial: Zone tertiaire / Zone d’activités
conservation: Zone préservée
construction: Zone en construction
farm: Ferme
country: Pays
county: Comté
farm: Ferme
- hamlet: Hameau ou lieu-dit habité
+ hamlet: Hameau habité
house: Maison
houses: Maisons
island: Île
islet: Îlot
- isolated_dwelling: Lieu-dit habité
+ isolated_dwelling: Lieu-dit habité isolé
locality: Lieu-dit inhabité
municipality: Municipalité
neighbourhood: Quartier
kiosk: Kiosque
kitchen: Magasin de cuisine
laundry: Blanchisserie
- lottery: Loto
+ lottery: Loterie
mall: Centre commercial
market: Marché
massage: Massage
travel_agency: Agence de voyage
tyres: Magasin de pneus
vacant: Commerce vacant
- variety_store: Magasin à prix unique ou à bas prix
+ variety_store: Magasin à prix unique ou réduit
video: Magasin de vidéos
wine: Caviste
"yes": Boutique
level10: Limite de quartier
description:
title:
- osm_nominatim: Localisation depuis <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
- Nominatim</a>
+ osm_nominatim: Localisation depuis <a href="https://nominatim.openstreetmap.org/">Nominatim
+ sur OpenStreetMap</a>
geonames: Localisation depuis <a href="http://www.geonames.org/">GeoNames</a>
types:
cities: Villes
reported_user: Utilisateur signalé
not_updated: Non mis à jour
search: Rechercher
- search_guidance: 'Problèmes de recherche :'
+ search_guidance: 'Problèmes de recherche :'
user_not_found: L’utilisateur n’existe pas
- issues_not_found: Pas trouvé de tel problème
+ issues_not_found: Aucun problème trouvé de ce type
status: État
reports: Rapports
last_updated: Dernière mise à jour
- last_updated_time_html: <abbr title='%{title}'>%{time}</abbr>
- last_updated_time_user_html: à <abbr title='%{title}'>%{time}</abbr> par %{user}
+ last_updated_time_html: <abbr title="%{title}">%{time}</abbr>
+ last_updated_time_user_html: à <abbr title="%{title}">%{time}</abbr> par %{user}
link_to_reports: Afficher les rapports
reports_count:
- one: 1 rapport
+ zero: Aucun rapport
+ one: Un rapport
other: '%{count} rapports'
reported_item: Élément signalé
states:
successful_update: Votre rapport a bien été mis à jour
provide_details: Veuillez fournir les détails demandés
show:
- title: '%{status} Problème #%{issue_id}'
+ title: Problème %{status} nº %{issue_id}
reports:
zero: Aucun rapport
one: 1 rapport
last_updated_at: Dernière mise à jour à %{datetime} par %{displayname}
resolve: Résoudre
ignore: Ignorer
- reopen: Réouvrir
+ reopen: Rouvrir
reports_of_this_issue: Rapports de ce problème
read_reports: Lire les rapports
new_reports: Nouveaux rapports
no_other_issues: Aucun autre problème avec cet utilisateur.
comments_on_this_issue: Commentaires sur ce problème
resolve:
- resolved: L’état du problème a été mis à 'Résolu'
+ resolved: L’état du problème a été mis à « Résolu »
ignore:
- ignored: L’état du problème a été mis à 'Ignoré'
+ ignored: L’état du problème a été mis à « Ignoré »
reopen:
- reopened: L’état du problème a été mis à 'Ouvert'
+ reopened: L’état du problème a été mis à « Ouvert »
comments:
created_at: Le %{datetime}
reassign_param: Réaffecter le problème ?
reported_by_html: Signalé comme %{category} par %{user}
helper:
reportable_title:
- diary_comment: '%{entry_title}, commentaire #%{comment_id}'
- note: 'Note #%{note_id}'
+ diary_comment: '%{entry_title}, commentaire nº %{comment_id}'
+ note: Note nº %{note_id}
issue_comments:
create:
comment_created: Votre commentaire a bien été créé
title_html: Rapport %{link}
missing_params: Impossible de créer un nouveau rapport
details: Veuillez fournir plus de détails sur le problème (obligatoire).
- select: 'Sélectionner un motif pour votre rapport :'
+ select: 'Sélectionnez un motif pour votre rapport :'
disclaimer:
intro: 'Avant d’envoyer votre rapport aux modérateurs du site, veuillez vous
- assurer que :'
- not_just_mistake: Vous êtes certain que le problème n’est pas juste une erreur
- unable_to_fix: Vous êtes incapable de régler le problème par vous-même ou
- avec l’aide des membres de votre communauté
- resolve_with_user: Vous avez déjà essayé de résoudre le problème avec l’utilisateur
- concerné
+ assurer que :'
+ not_just_mistake: vous êtes certain que le problème n’est pas juste une erreur ;
+ unable_to_fix: vous êtes incapable de régler le problème par vous-même ou
+ avec l’aide des membres de votre proche communauté ;
+ resolve_with_user: vous avez déjà essayé de résoudre le problème avec l’utilisateur
+ concerné.
categories:
diary_entry:
spam_label: Cette entrée de l’agenda est/contient du pourriel
intro_2_create_account: Créez un compte d’utilisateur
hosting_partners_html: L’hébergement est pris en charge par %{ucl}, %{bytemark},
et d’autres %{partners}.
- partners_ucl: L’University College de Londres
- partners_bytemark: l'hébergeur Bytemark
+ partners_ucl: l’University College de Londres
+ partners_bytemark: l'Hébergeur Bytemark
partners_partners: partenaires
tou: Conditions d’utilisation
osm_offline: La base de données OpenStreetMap est actuellement hors ligne ; une
outbox: boîte d’envoi
messages: Vous avez %{new_messages} et %{old_messages}
new_messages:
- one: '%{count} nouveau message'
+ zero: zéro nouveau message
+ one: un nouveau message
other: '%{count} nouveaux messages'
old_messages:
- one: '%{count} ancien message'
+ zero: aucun ancien message
+ one: un ancien message
other: '%{count} anciens messages'
from: De
subject: Objet
date: Date
no_messages_yet: Vous n’avez actuellement aucun message. Pourquoi ne pas entrer
- en contact avec quelques %{people_mapping_nearby_link} ?
+ en contact avec quelques %{people_mapping_nearby_link} ?
people_mapping_nearby: personnes qui cartographient aux alentours
message_summary:
unread_button: Marquer comme non lu
inbox: boîte de réception
outbox: boîte d’envoi
messages:
- one: Vous avez %{count} message envoyé
+ one: Vous n’avez aucun message envoyé
other: Vous avez %{count} messages envoyés
to: À
subject: Objet
date: Date
no_sent_messages: Vous n’avez encore envoyé aucun message. Pourquoi ne pas entrez
- en contact avec quelques %{people_mapping_nearby_link} ?
+ en contact avec quelques %{people_mapping_nearby_link} ?
people_mapping_nearby: personnes proche de vous
reply:
- wrong_user: Vous êtes identifié(e) comme « %{user} » mais le message auquel
+ wrong_user: Vous êtes identifié(e) comme « %{user} » mais le message auquel
vous souhaitez répondre n’a pas été envoyé à cet utilisateur. Veuillez vous
connecter avec l’identifiant correct pour pouvoir répondre.
show:
destroy_button: Supprimer
back: Retour
to: À
- wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
+ wrong_user: Vous êtes identifié comme « %{user} » mais le message que vous essayez
de lire n’a pas été envoyé par cet utilisateur, ni ne lui a été destiné. Veuillez
vous connecter avec l’identifiant correct pour pouvoir le lire.
sent_message_summary:
destroy_button: Supprimer
mark:
as_read: Message marqué comme lu
- as_unread: Message marqué comme non-lu
+ as_unread: Message marqué comme non lu
destroy:
destroyed: Message supprimé
site:
about:
next: Suivant
- copyright_html: <span>©</span>Contributeurs<br /> d’OpenStreetMap
+ copyright_html: © Contributeurs<br /> d’OpenStreetMap
used_by: '%{name} fournit des données cartographiques sur des milliers de sites
web, applications mobiles et appareils'
lede_text: OpenStreetMap est bâti par une communauté de cartographes bénévoles
et grossit chaque jour. Nos contributeurs incluent des cartographes enthousiastes,
des professionnels du SIG, des ingénieurs qui font fonctionner les serveurs
d’OSM, des humanitaires cartographiant les zones dévastées par une catastrophe
- et beaucoup d’autres.\nPour en savoir plus sur la communauté, consultez \n<a
- href='https://blog.openstreetmap.org'>le blogue OpenStreetMap</a>,\n<a href='%{diary_path}'>les
- annuaires d’utilisateurs</a>, \n<a href='https://blogs.openstreetmap.org/'>les
- blogues communautaires</a> et \nle site web de la <a href='https://www.osmfoundation.org/'>Fondation
+ et beaucoup d’autres.\nPour en savoir plus sur la communauté, consultez \nle
+ <a href=\"https://blog.openstreetmap.org/\">blogue OpenStreetMap</a>,\nles
+ <a href=\"%{diary_path}\">journaux d’utilisateurs</a>, \nles <a href=\"https://blogs.openstreetmap.org/\">blogues
+ communautaires</a> et \nle site web de la <a href=\"https://www.osmfoundation.org/\">Fondation
OSM</a>."
- open_data_title: Données libres
- open_data_html: 'OpenStreetMap est en <i>données ouvertes</i> : vous êtes libre
- de l’utiliser pour n’importe quel but tant que vous créditez OpenStreetMap
+ open_data_title: Données ouvertes
+ open_data_html: 'OpenStreetMap est en <i>données ouvertes</i> : vous êtes libre
+ de l’utiliser dans n’importe quel but tant que vous créditez OpenStreetMap
et ses contributeurs. Si vous modifiez ou vous appuyez sur les données d’une
façon quelconque, vous pouvez distribuer le résultat seulement suivant la
- même licence. Consultez la page sur les <a href=''%{copyright_path}''>droits
+ même licence. Consultez la page sur les <a href="%{copyright_path}">droits
d’auteur et licence</a> pour plus de détails.'
- legal_title: Juridique
- legal_html: "Ce site et de nombreux autres services connexes sont formellement
- exploités par la \n<a href=\"https://osmfoundation.org/\">Fondation OpenStreetMap</a>
- (OSMF) \nau nom de la communauté. L’utilisation de tous les services offerts
- par l’OSMF est sujette\nà nos <a href=\"https://wiki.osmfoundation.org/wiki/Terms_of_Use\">Conditions
- d’utilisation</a>, à notre <a href=\"https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy\">\nPolitique
- des usages acceptés</a> et à notre <a href=\"http://wiki.osmfoundation.org/wiki/Privacy_Policy\">Politique
- de confidentialité</a>.\n<br> \nVeuillez <a href=\"https://osmfoundation.org/Contact\">contacter
- l’OSMF</a> \nsi vous avez des questions ou problèmes concernant les licences,
- les droits d’auteur ou d’autres aspects juridiques.\n<br>\nOpenStreetMap,
- le logo avec la loupe et ''State of the Map'' sont <a href=\"https://wiki.osmfoundation.org/wiki/Trademark_Policy\">des
- marques déposées de OSMF</a>."
+ legal_title: Informations juridiques
+ legal_html: |-
+ Ce site et de nombreux autres services connexes sont formellement exploités par la
+ <a href="https://osmfoundation.org/">Fondation OpenStreetMap</a> (OSMF) au nom de la communauté. L’utilisation de tous les services offerts par l’OSMF est sujette
+ à nos <a href="https://wiki.osmfoundation.org/wiki/Terms_of_Use">Conditions d’utilisation</a>, à notre <a href="https://wiki.openstreetmap.org/wiki/Acceptable_Use_Policy">Politique des usages acceptés</a> et à notre <a href="http://wiki.osmfoundation.org/wiki/Privacy_Policy">Politique de confidentialité</a>.
+ <br />
+ Veuillez <a href="https://osmfoundation.org/Contact">contacter l’OSMF</a>
+ si vous avez des questions ou problèmes concernant les licences, les droits d’auteur ou d’autres aspects juridiques.
+ <br />
+ OpenStreetMap, le logo avec la loupe et ''State of the Map'' sont <a href="https://wiki.osmfoundation.org/wiki/Trademark_Policy">des marques déposées de l’OSMF</a>.
partners_title: Partenaires
copyright:
foreign:
legal_babble:
title_html: Droits d’auteur et licence
intro_1_html: |-
- OpenStreetMap<sup><a href="#trademarks">®</a></sup> est un ensemble de <i>données ouvertes</i>, disponibles sous licence libre <a
- href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) auprès de la <a
+ OpenStreetMap<sup><a href="#trademarks">®</a></sup> est un ensemble de <i>données ouvertes</i>, disponibles sous la licence libre <a
+ href="https://opendatacommons.org/licenses/odbl/">Open Data Commons Open Database License</a> (ODbL) accordée par la <a
href="https://osmfoundation.org/">Fondation OpenStreetMap</a> (OSMF).
- intro_2_html: Vous êtes libre de copier, distribuer, transmettre et adapter
- nos données, à condition que vous créditiez, OpenStreetMap et ses contributeurs.
- Si vous modifiez ou utilisez nos données dans d’autres œuvres dérivées,
- vous ne pouvez distribuer celles-ci que sous la même licence. Le <a href="https://opendatacommons.org/licenses/odbl/1.0/">texte
+ intro_2_html: |-
+ Vous êtes libre de copier, distribuer, transmettre et adapter nos données,
+ à condition que vous créditiez OpenStreetMap et ses
+ contributeurs. Si vous modifiez ou utilisez nos données dans d’autres œuvres dérivées, vous
+ ne pouvez distribuer celles-ci que sous la même licence. Le <a href="https://opendatacommons.org/licenses/odbl/1.0/">texte
légal</a> complet détaille vos droits et responsabilités.
- intro_3_html: Nos carreaux de rendu cartographiques, ainsi que notre documentation,
- sont disponibles sous la licence <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
+ intro_3_html: |-
+ Nos carreaux de rendu cartographiques, ainsi que notre documentation, sont disponibles sous
+ la licence <a href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
Commons paternité – partage à l’identique 2.0</a> (CC-BY-SA).
credit_title_html: Comment créditer OpenStreetMap
- credit_1_html: Nous demandons que votre crédit comporte la mention « © les
- contributeurs d’OpenStreetMap ».
+ credit_1_html: Nous demandons que votre crédit comporte la mention « © les
+ contributeurs d’OpenStreetMap ».
credit_2_html: |-
- Vous devez également préciser clairement que les données sont disponibles sous la licence ODbL et, si vous utilisez les tuiles de notre carte, que la carte est sous la licence CC-BY-SA. Vous pouvez mentionner ceci avec un lien hypertexte vers
+ Vous devez également préciser clairement que les données sont disponibles sous la licence
+ ODbL (Open Database License) et, si vous utilisez les tuiles de notre carte, que la carte est sous la
+ licence CC BY-SA. Vous pouvez mentionner ceci avec un lien hypertexte vers
<a href="https://www.openstreetmap.org/copyright">cette page de mentions légales</a>.
- Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en l’adresse openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org.
+ Alternativement, et obligatoirement si vous distribuez OpenStreetMap sous forme de données brutes, vous pouvez directement nommer et fournir un lien vers la ou les licences. Sur les supports où les liens hypertexte sont impossibles (par exemple sur un support papier), nous vous suggérons de rediriger vos lecteurs vers le site openstreetmap.org (éventuellement en développant « OpenStreetMap » en son adresse complète openstreetmap.org), vers opendatacommons.org et, si c’est pertinent, vers creativecommons.org.
credit_3_html: |-
- Pour une carte électronique navigable, le crédit devrait apparaître dans le coin de la carte.
+ Pour une carte électronique navigable, le crédit devrait apparaître dans un coin de la carte.
Par exemple :
attribution_example:
- alt: Exemple d’attribution d’OpenStreetMap sur une page internet
+ alt: Exemple d’attribution d’OpenStreetMap sur une page Internet
title: Exemple d’attribution
more_title_html: Pour trouver plus d’informations
more_1_html: |-
Pour obtenir plus d’informations sur la façon de réutiliser nos données et de nous créditer, veuillez lire la <a
href="https://osmfoundation.org/Licence"> Licence OSMF</a> et le <a
href="https://wiki.openstreetmap.org/wiki/Legal_FAQ">FAQ Légal</a>.
- more_2_html: "Bien qu’OpenStreetMap soit un jeu de données libres et ouvertes,
- nous ne pouvons pas fournir une API gratuite et en libre accès pour les
- tierces personnes.\nVeuillez vous référer à notre <a href=\"https://operations.osmfoundation.org/policies/api/\">politique
- d’utilisation de l’API</a>, \n à notre <a href=\"https://operations.osmfoundation.org/policies/tiles/\">politique
- d’utilisation des tuiles</a>, \net à la <a href=\"https://operations.osmfoundation.org/policies/nominatim/\">politique
- d’utilisation de Nominatim</a>."
+ more_2_html: |-
+ Bien qu’OpenStreetMap soit un jeu de données libres et ouvertes, nous ne pouvons pas fournir une
+ API gratuite et en libre accès pour les tierces personnes.
+ Veuillez vous référer à notre <a href="https://operations.osmfoundation.org/policies/api/">politique d’utilisation de l’API</a>,
+ à notre <a href="https://operations.osmfoundation.org/policies/tiles/">politique d’utilisation des tuiles</a>
+ et à la <a href="https://operations.osmfoundation.org/policies/nominatim/">politique d’utilisation de Nominatim</a>.
contributors_title_html: Nos contributeurs
contributors_intro_html: 'Nos contributeurs sont des milliers de personnes.
Nous incluons également des données publiées sous licence ouverte par des
agences nationales de cartographie et par d’autres sources, notamment :'
- contributors_at_html: '<strong>Autriche</strong> : contient des données sur
- la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous licence
- <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>),
- la <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région
- du Vorarlberg</a> et la région du Tyrol (sous licence <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC
- BY AT avec amendements</a>).'
- contributors_au_html: "<strong>Australie</strong> : contient des données source
- de \n<a href=\"https://www.psma.com.au/psma-data-copyright-and-disclaimer\">PSMA
- Australia Limited</a>\ndont la licence appartient au Commonwealth d'Australie
- sous \n<a href=\"https://creativecommons.org/licenses/by/4.0/\">CC BY 4.0</a>."
+ contributors_at_html: |-
+ <strong>Autriche</strong> : contient des données sur la <a href="https://data.wien.gv.at/">ville de Vienne</a> (sous
+ licence <a href="https://creativecommons.org/licenses/by/3.0/at/deed.de">CC BY</a>), la
+ <a href="https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm">région du Vorarlberg</a> et la
+ région du Tyrol (sous licence <a href="https://www.tirol.gv.at/applikationen/e-government/data/nutzungsbedingungen/">CC BY AT avec amendements</a>).
+ contributors_au_html: |-
+ <strong>Australie</strong> : contient des données sourcées de
+ <a href="https://www.psma.com.au/psma-data-copyright-and-disclaimer">PSMA Australia Limited</a> publiées sous la licence
+ <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a> accordée par le Commonwealth d’Australie.
contributors_ca_html: '<strong>Canada</strong> : contient des données de <em>GeoBase</em>®,
- <em>GeoGratis</em> (© Département des Ressources naturelles du Canada),
- <em>CanVec</em> (© Département des Ressources naturelles du Canada) et <em>StatCan</em>
+ <em>GeoGratis</em> (© Département des Ressources naturelles du Canada),
+ <em>CanVec</em> (© Département des Ressources naturelles du Canada) et <em>StatCan</em>
(Division Géographie, Statistiques du Canada).'
contributors_fi_html: '<strong>Finlande</strong> : contient des données de
la Base de données topographique de l’Inspection nationale du territoire
contributors_fr_html: '<strong>France</strong> : contient des données de la
<em>Direction générale des finances publiques</em> (anciennement la <em>Direction
générale des impôts</em>).'
- contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données ©
- <abbr title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="https://www.and.com">www.and.com</a>).'
+ contributors_nl_html: '<strong>Pays-Bas</strong> : contient des données © <abbr
+ title="Automotive Navigation Data">AND</abbr>, 2007 (<a href="https://www.and.com/">www.and.com</a>).'
contributors_nz_html: "<strong>Nouvelle-Zélande</strong> : contient des données
provenant du <a href=\"https://data.linz.govt.nz/\">service de données LINZ</a>
et pour la réutilisation, sous licence \n<a href=\"https://creativecommons.org/licenses/by/4.0/\">CC
contributors_za_html: |-
<strong>Afrique du Sud</strong> : contient des données issues de la <a href="http://www.ngi.gov.za/">Direction principale des
Informations Géospatiales Nationales</a>, copyright de l’État réservé.
- contributors_gb_html: '<strong>Royaume-Uni</strong> : contient des données
- issues de l’<em>Ordnance Survey</em> © 2010-2019 Droits d’auteurs et
- de la base de données de la Couronne.'
+ contributors_gb_html: |-
+ <strong>Royaume-Uni</strong> : contient des données issues de
+ l’<em>Ordnance Survey</em> © 2010–2019 Droits d’auteurs et de la
+ base de données de la Couronne.
contributors_footer_1_html: Pour plus de détails sur celles-ci et sur les
autres sources utilisées pour aider à améliorer OpenStreetMap, consultez
la page des <a href="https://wiki.openstreetmap.org/wiki/Contributors">contributeurs</a>
et sur de nombreux sujets.
switch2osm:
title: switch2osm
- description: Aide pour les entreprises et les organisations de commutation
- à OpenStreetMap, en fonction des cartes et d’autres services.
+ description: Aide pour les entreprises et les organisations qui veulent migrer
+ à des cartes et d’autres services basés sur OpenStreetMap.
welcomemat:
url: https://wiki.openstreetmap.org/wiki/FR:Page_principale
title: Pour les organisations
# Author: Abijeet Patro
# Author: Athena in Wonderland
# Author: Banjo
+# Author: Breogan2008
# Author: Elisardojm
# Author: Gallaecio
# Author: Iváns
old_relation: Relación vella
old_relation_member: Membro da relación vella
old_relation_tag: Etiqueta da relación vella
- old_way: Camiño vello
- old_way_node: Nó do camiño vello
- old_way_tag: Etiqueta do camiño vello
+ old_way: Vía vella
+ old_way_node: Nó da vía vella
+ old_way_tag: Etiqueta da vía vella
relation: Relación
relation_member: Membro da relación
relation_tag: Etiqueta da relación
tag: A páxina de descrición da etiqueta %{key}=%{value}
wikidata_link: O elemento %{page} no Wikidata
wikipedia_link: O artigo sobre %{page} na Wikipedia
+ wikimedia_commons_link: O elemento %{page} en Wikimedia Comúns
telephone_link: Chamar a %{phone_number}
- colour_preview: Previsualización %{colour_value} da cor
+ colour_preview: Previsualización da cor %{colour_value}
note:
title: 'Nota: %{id}'
new_note: Nova nota
tag: עמוד התיאור עבור התג %{key}=%{value}
wikidata_link: פריט %{page} בוויקינתונים
wikipedia_link: הערך %{page} בוויקיפדיה
+ wikimedia_commons_link: הפריט %{page} בוויקישיתוף
telephone_link: להתקשר למספר %{phone_number}
colour_preview: תצוגה מקדימה של הצבע %{colour_value}
note:
one: kevesebb, mint 1 másodperce
other: kevesebb, mint %{count} másodperce
less_than_x_minutes:
- one: kevesebb, mint 1 perce
- other: kevesebb, mint %{count} perce
+ one: kevesebb mint 1 perce
+ other: kevesebb mint %{count} perce
over_x_years:
- one: több, mint 1 éve
- other: több, mint %{count} éve
+ one: több mint 1 éve
+ other: több mint %{count} éve
x_seconds:
one: 1 másodperccel ezelőtt
other: '%{count} másodperccel ezelőtt'
report: Jegyzet jelentése
query:
title: Funkciók lekérdezése
- introduction: Kattintson a térképen, a közeli funkciók kereséséhez.
+ introduction: Kattintson a térképen a közeli funkciók kereséséhez.
nearby: Közeli funkciók
enclosing: Bentfoglalt funkciók
changesets:
commented_note: '%{commenter} hozzászólt az egyik jegyzethez, amelyhez te
is, %{place} közelében.'
closed:
- subject_own: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyztetedet'
+ subject_own: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyzetedet'
subject_other: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyzetet,
amelyet te is figyelsz'
your_note: '[OpenStreetMap] %{commenter} megoldotta az egyik jegyzetedet %{place}
közelében.'
- commented_note: '%{commenter} megoldotta az egyik jegyzetet amelyhez hozzászóltál,
+ commented_note: '%{commenter} megoldotta az egyik jegyzetet, amelyhez hozzászóltál,
%{place} közelében.'
reopened:
subject_own: '[OpenStreetMap] %{commenter} újra megnyitotta az egyik jegyzetedet'
subject_own: '[OpenStreetMap] %{commenter} hozzászólt az egyik változtatáscsomagodhoz'
subject_other: '[OpenStreetMap] %{commenter} hozzászólt az egyik, általad
érdekesnek vélt változtatáscsomaghoz'
- your_changeset: '%{commenter} egy megjegyzést fűzött a %{time}-i módosításcsomagodhoz.'
+ your_changeset: '%{commenter} megjegyzést fűzött a %{time}-i módosításcsomagodhoz.'
commented_changeset: '%{commenter} egy megjegyzést fűzött %{changeset_author}
%{time}-i módosításcsomagjához, amit figyelsz.'
partial_changeset_with_comment: „%{changeset_comment}” megjegyzéssel
messages:
inbox:
title: Beérkezett üzenetek
- my_inbox: Beérkezett üzenetek
+ my_inbox: Beérkezett üzeneteim
outbox: Elküldött üzenetek
messages: '%{new_messages} és %{old_messages} van'
new_messages:
english_link: az eredeti angol nyelvű
native:
title: Erről az oldalról
- text: Jelenleg a szerzői jogi oldal angol nyelvű változatát látod. Visszaléphetsz
- ezen oldal %{native_link}, vagy befejezheted a szerzői jogról szóló oldal
- olvasását, és %{mapping_link}.
+ text: 'Jelenleg a szerzői jogi oldal angol nyelvű változatát látod. Visszaléphetsz
+ ezen oldalra: %{native_link}, vagy befejezheted a szerzői jogról szóló oldal
+ és %{mapping_link} olvasását.'
native_link: magyar nyelvű változatára
mapping_link: kezdheted a térképezést
legal_babble:
href="https://opendatacommons.org/licenses/odbl/1.0/">jogi
szabályzat</a> ismerteti a jogaidat és kötelezettségeidet.
intro_3_html: |2-
- Az OpenStreetMap <i>térképeire</i> a <a
+ Az OpenStreetMap <i>térképeire</i> és dokumentumaira a <a
href="https://creativecommons.org/licenses/by-sa/2.0/">Creative
Commons Nevezd meg! - Így add tovább! 2.0</a> licenc (CC BY-SA) vonatkozik.
credit_title_html: Hogyan kell feltüntetned az OpenStreetMapot?
credit_1_html: Kérjük, hogy forrásként a “© OpenStreetMap közreműködők”
szöveget tüntesd fel.
credit_2_html: Azt is egyértelművé kell tenned, hogy az adatok az Open Database
- Licenc alatt elérhetőek, illetve ha a mi térkép csempéinket használod akkor
+ Licenc alatt elérhetőek, illetve ha a mi térkép csempéinket használod, akkor
azt, hogy a grafikai megjelenítés a CC BY-SA licenc feltételeivel használható.
Ezt megteheted egy erre a <a href="https://www.openstreetmap.org/copyright">copyright
oldalra</a> való hivatkozással. Alternatívaként, ha az OSM-et adatokként
Lásd az <a href="https://operations.osmfoundation.org/policies/tiles/">API Felhasználási Irányelveinket</a>, a <a href="http://wiki.openstreetmap.org/wiki/Tile_usage_policy">Csempe Felhasználási Irányelveinket</a> és a <a href="https://operations.osmfoundation.org/policies/nominatim/">Nominatim Felhasználási Irányelveinket</a>.
contributors_title_html: Közreműködőink
- contributors_intro_html: 'Többszáz egyéni közreműködőnk van. További, szabadon
+ contributors_intro_html: 'Több ezer egyéni közreműködőnk van. További, szabadon
elérhető adatokat is felhasználunk nemzeti térkép intézetektől és más forrásokból,
többek között:'
contributors_at_html: |-
overpass:
title: Overpass API
description: A megjelenített befoglaló keret letöltése egy OpenStreetMap
- tükörserverről
+ tükörszerverről
geofabrik:
title: Geofabrik letöltések
description: Kontinensek, országok és kiválasztott városok rendszeresen
- frissített kivonata
+ frissített kivonatai
metro:
title: Metro Extracts
description: A főbb városok, valamint a környező területek kivonatai
welcome:
url: /welcome
title: Üdvözlünk az OpenStreetMapen
- description: Eza gyors útmutató megismertet az OpenStreetMap alapjaival.
+ description: Ez a gyors útmutató megismertet az OpenStreetMap alapjaival.
beginners_guide:
url: https://wiki.openstreetmap.org/wiki/Hu:Beginners%27_guide
title: Kezdők kézikönyve
tracetag: Etiquetta de tracia
user: Usator
user_preference: Preferentias de usator
- user_token: Indicio de usator
+ user_token: Token del usator
way: Via
way_node: Nodo de via
way_tag: Etiquetta de via
tag: Le pagina wiki que describe le etiquetta %{key}=%{value}
wikidata_link: Le elemento %{page} in Wikidata
wikipedia_link: Le articulo %{page} in Wikipedia
+ wikimedia_commons_link: Le objecto %{page} sur Wikimedia Commons
telephone_link: Telephonar %{phone_number}
colour_preview: Previsualisation del color %{colour_value}
note:
authorize_failure:
title: Requesta de autorisation fallite
denied: Tu ha refusate al application %{app_name} le accesso a tu conto.
- invalid: Le indicio de autorisation non es valide.
+ invalid: Le token de autorisation non es valide.
revoke:
- flash: Tu ha revocate le indicio pro %{application}
+ flash: Tu ha revocate le token pro %{application}
permissions:
missing: Tu non ha permittite al application le accesso a iste facilitate
oauth_clients:
title: Detalios OAuth pro %{app_name}
key: 'Clave de consumitor:'
secret: 'Secreto de consumitor:'
- url: 'URL del indicio de requesta:'
- access_url: 'URL del indicio de accesso:'
+ url: 'URL del token de requesta:'
+ access_url: 'URL del token de accesso:'
authorize_url: 'URL de autorisation:'
support_notice: Nos supporta le signaturas HMAC-SHA1 (recommendate) e RSA-SHA1.
edit: Modificar detalios
index:
title: Mi detalios OAuth
my_tokens: Mi applicationes autorisate
- list_tokens: 'Le sequente indicios ha essite emittite a applicationes in tu
- nomine:'
+ list_tokens: 'Le sequente tokens ha essite emittite a applicationes in tu nomine:'
application: Nomine del application
issued_at: Emittite le
revoke: Revocar!
confirm password: 'Confirma contrasigno:'
reset: Reinitialisar contrasigno
flash changed: Tu contrasigno ha essite cambiate.
- flash token bad: Indicio non trovate. Verifica le URL.
+ flash token bad: Token non trovate. Verifica le URL.
new:
title: Crear conto
no_auto_account_create: Infortunatemente in iste momento non es possibile crear
adresse de e-mail.
button: Confirmar
success: Le cambio del adresse de e-mail ha essite confirmate.
- failure: Un adresse de e-mail ha ja essite confirmate con iste indicio.
+ failure: Un adresse de e-mail ha ja essite confirmate con iste token.
unknown_token: Iste codice de confirmation ha expirate o non existe.
set_home:
flash success: Position de origine confirmate con successo
api:
notes:
comment:
- opened_at_html: Búið til fyrir %{when} síðan
- opened_at_by_html: Búið til fyrir %{when} síðan af %{user}
- commented_at_html: Uppfært fyrir %{when} síðan
- commented_at_by_html: Uppfært fyrir %{when} síðan af %{user}
- closed_at_html: Leyst fyrir %{when} síðan
- closed_at_by_html: Leyst fyrir %{when} síðan af %{user}
- reopened_at_html: Endurvirkjað fyrir %{when} síðan
- reopened_at_by_html: Endurvirkjað fyrir %{when} síðan af %{user}
+ opened_at_html: Búið til %{when}
+ opened_at_by_html: Búið til %{when} af %{user}
+ commented_at_html: Uppfært %{when}
+ commented_at_by_html: Uppfært %{when} af %{user}
+ closed_at_html: Leyst %{when}
+ closed_at_by_html: Leyst %{when} af %{user}
+ reopened_at_html: Endurvirkjað %{when}
+ reopened_at_by_html: Endurvirkjað %{when} af %{user}
rss:
title: Minnispunktar OpenStreetMap
description_area: Listi yfir minnispunkta sem hafa verið tilkynntir, gerðar
browse:
created: Búið til
closed: Lokað
- created_html: Bjó til <abbr title='%{title}'>%{time} síðan</abbr>
- closed_html: Lokað <abbr title='%{title}'> fyrir %{time} síðan</abbr>
- created_by_html: Búið til <abbr title='%{title}'> fyrir %{time} síðan</abbr> af
- %{user}
- deleted_by_html: Eytt <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user}
- edited_by_html: Breytt <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user}
- closed_by_html: Lokað <abbr title='%{title}'> fyrir %{time} síðan</abbr> af %{user}
+ created_html: Bjó til <abbr title='%{title}'>%{time}</abbr>
+ closed_html: Lokaði <abbr title='%{title}'> %{time}</abbr>
+ created_by_html: '%{user} bjó til <abbr title=''%{title}''> %{time}</abbr>'
+ deleted_by_html: '%{user} eyddi <abbr title=''%{title}''> %{time}</abbr>'
+ edited_by_html: '%{user} breytti <abbr title=''%{title}''> %{time}</abbr>'
+ closed_by_html: '%{user} lokaði <abbr title=''%{title}''> %{time}</abbr>'
version: Útgáfa
in_changeset: Breytingasett
anonymous: nafnlaus
relation: Vensl (%{count})
relation_paginated: Vensl (%{x}-%{y} af %{count})
comment: Athugasemdir (%{count})
- hidden_commented_by: Falin umsögn frá %{user} <abbr title='%{exact_time}'>%{when}
- síðan</abbr>
- commented_by: Umsögn frá %{user} <abbr title='%{exact_time}'>%{when} síðan</abbr>
+ hidden_commented_by: Falin umsögn frá %{user} <abbr title='%{exact_time}'>%{when}</abbr>
+ commented_by: Umsögn frá %{user} <abbr title='%{exact_time}'>%{when}</abbr>
changesetxml: Breytingasetts XML sniði
osmchangexml: osmChange XML sniði
feed:
tag: Wiki-síðan fyrir merkið %{key}=%{value}
wikidata_link: Atriðið %{page} á Wikidata
wikipedia_link: „%{page}“ greinin á Wikipedia
+ wikimedia_commons_link: '%{page} atriðið á Wikimedia Commons'
telephone_link: Hringja í %{phone_number}
+ colour_preview: Forskoðun á litnum %{colour_value}
note:
title: 'Minnispunktur: %{id}'
new_note: Nýr minnispunktur
sem þú hefur áhuga á'
your_changeset: '%{commenter} hefur sett athugasemd við eitt af breytingasettunum
þínum sem búið var til %{time}'
- commented_changeset: '%{commenter} hefur sett athugasemd við breytingasett
- á korti sem þú fylgist með og var búið til af %{changeset_author} - %{time}'
+ commented_changeset: '%{commenter} hefur sett athugasemd %{time} við breytingasett
+ á korti sem þú fylgist með og var búið til af %{changeset_author}'
partial_changeset_with_comment: með umsögninni '%{changeset_comment}'
partial_changeset_without_comment: án athugasemdar
details: Nánari upplýsingar um breytingasettið er að finna á %{url}.
spurningum, og ræða í hópum um málefni tengd kortagerð.
welcome:
url: /velkomin
- title: Velkomin í OSM
+ title: Velkomin í OpenStreetMap
description: Byrjaðu með þessum fljótlega leiðarvísi með helstu grunnatriðum
varðandi OpenStreetMap.
beginners_guide:
description: Leiðarvísir fyrir byrjendur sem haldið er við af samfélaginu.
help:
url: https://help.openstreetmap.org/
- title: help.openstreetmap.org
- description: Spyrðu spurninga eða flettu upp svörum á spyrja/svara hluta OSM-vefsvæðisins.
+ title: Hjálparvefur
+ description: Spyrðu spurninga eða flettu upp svörum á spyrja/svara hluta OpenStreetMap-vefsvæðisins.
mailing_lists:
title: Póstlistar
description: Spyrðu spurninga eða spjallaðu um áhugaverð málefni á einhverjum
Finndu það sem þú þarft að vita á kynningarsíðunni</a>.
wiki:
url: https://wiki.openstreetmap.org/
- title: wiki.openstreetmap.org
+ title: Wiki-vefur OpenStreetMap
description: Vafraðu um wiki/kvikuna til að sjá greinargóðar leiðbeiningar
- varðandi OSM.
+ varðandi OpenStreetMap.
sidebar:
search_results: Leitarniðurstöður
close: Loka
newer: Nýrri ferlar
trace:
pending: Í BIÐ
- count_points: '%{count} punktar'
+ count_points:
+ one: 1 punktur punktar
+ other: '%{count} punktar punktar'
more: upplýsingar
trace_details: Sýna upplýsingar um ferilinn
view_map: Skoða kort
title: Eyði banni á %{block_on}
heading: Eyði banni á %{block_on} eftir %{block_by}
time_future: Bannið endar eftir %{time}.
- past: Bannið endaði fyrir %{time} síðan, ekki er hægt að eyða því núna.
+ past: Bannið endaði fyrir %{time} síðan og er ekki hægt að afturkalla það núna.
confirm: Staðfestu að þú viljir eyða þessu banni.
revoke: Eyða banninu
flash: Banninu var eytt.
until_login: Virkt þangað til notandinn skráir sig inn.
time_future_and_until_login: Endar eftir %{time} og eftir að notandinn skráir
sig inn.
- time_past: Endaði fyrir %{time} síðan
+ time_past: Endaði %{time}.
block_duration:
hours:
one: 1 stund
# Author: Frubino
# Author: Gianfranco
# Author: Isiond
+# Author: Jlrb+
# Author: Kaitu
# Author: Karika
# Author: Lollo
geofabrik:
title: Geofabrik Downloads
description: Estratti aggiornati regolarmente di continenti, paesi, e città
- selezionata
+ selezionate
metro:
title: Metro Extracts
description: Estratti per le principali città del mondo e le loro aree circostanti
# Author: Wrightbus
# Author: Yusuke1109
# Author: ネイ
+# Author: 沈澄心
# Author: 神樂坂秀吉
# Author: 青子守歌
# Author: 아라
newer: 以降のトレース
trace:
pending: 処理中
- count_points: '%{count} 個の点'
+ count_points:
+ one: 1個の点
+ other: '%{count}個の点'
more: 詳細
trace_details: トレースの詳細表示
view_map: 地図で表示
tag: Вики-страницата за ознаката %{key}=%{value}
wikidata_link: Предметот за %{page} на Википодатоци
wikipedia_link: Статијата %{page} на Википедија
+ wikimedia_commons_link: Ставката %{page} на Ризницата
telephone_link: Јави се на %{phone_number}
colour_preview: Преглед на бојата %{colour_value}
note:
create: Lagre
diary_entry:
create: Publiser
+ update: Oppdater
+ issue_comment:
+ create: Legg til kommentar
message:
create: Send
client_application:
description: Beskrivelse
languages: Språk
pass_crypt: Passord
+ datetime:
+ distance_in_words_ago:
+ about_x_hours:
+ one: 'omkring #1 timer siden'
+ other: omkring %{count} timer siden
+ about_x_months:
+ one: omkring en måned siden
+ other: omkring %{count} måneder siden
+ about_x_years:
+ one: omkring et år siden
+ other: omkring %{count} år siden
editor:
default: Standard (nåværende %{name})
potlatch:
gps: Offentlige GPS-sporinger
overlays: Aktiver overlag for å feilsøke kartet
title: Lag
- copyright: © <a href='%{copyright_url}'>OpenStreetMap bidragsytere</a>
+ copyright: © <a href='%{copyright_url}'>OpenStreetMaps bidragsytere</a>
donate_link_text: <a class='donate-attr' href='%{donate_url}'>Gi en donasjon</a>
site:
edit_tooltip: Rediger kartet
tag: Strona wiki dla znacznika %{key}=%{value}
wikidata_link: '%{page} element na Wikidata'
wikipedia_link: Artykuł %{page} w Wikipedii
+ wikimedia_commons_link: Plik %{page} na Wikimedia Commons
telephone_link: Zadzwoń pod %{phone_number}
colour_preview: Podgląd koloru %{colour_value}
note:
tag: A página no wiki com a descrição da etiqueta %{key}=%{value}
wikidata_link: O item %{page} no Wikidata
wikipedia_link: O artigo %{page} na Wikipédia
+ wikimedia_commons_link: A %{page} de item mo Wikimedia Commons
telephone_link: Ligar para %{phone_number}
colour_preview: Pré-visualização da cor %{colour_value}
note:
tag: A página wiki com a descrição da etiqueta %{key}=%{value}
wikidata_link: O item %{page} como Wikidata
wikipedia_link: A página %{page} na Wikipédia
+ wikimedia_commons_link: O elemento %{page} na wiki Wikimedia Commons
telephone_link: Telefonar %{phone_number}
colour_preview: Antevisão da cor %{colour_value}
note:
tag: Wiki-beskrivningssidan för %{key}=%{value}-taggen
wikidata_link: Objektet %{page} på Wikidata
wikipedia_link: Artikeln om %{page} på Wikipedia
+ wikimedia_commons_link: Sidan %{page} finner du på Wikimedia Commons
telephone_link: Ring %{phone_number}
colour_preview: Förhandsgranskning av färgen %{colour_value}
note:
subject_own: '[OpenStreetMap] %{commenter} har kommenterat på en av dina ändringsset'
subject_other: '[OpenStreetMap] %{commenter} har kommenterat på ett ändringsset
du är intresserad av'
- your_changeset: '%{commenter} har lämnat en kommentar på ett av dina ändringsset
- skapas den %{time}'
+ your_changeset: '%{commenter} har lämnat en kommentar på ett av dina ändringsmängder
+ skapt den %{time}'
commented_changeset: '%{commenter} har lämnat en kommentar på ändringarna
på en karta du bevakar, skapad av %{changeset_author} %{time}'
partial_changeset_with_comment: med kommentar '%{changeset_comment}'
tag: '%{key}=%{value} parametresi için Viki açıklaması'
wikidata_link: Vikidata'da bulunan %{page} öğesi
wikipedia_link: Vikipedi'deki %{page} makalesi
+ wikimedia_commons_link: Wikimedia Commons'daki %{page} maddesi
telephone_link: '%{phone_number} ara'
colour_preview: Renk %{colour_value} önizleme
note:
one: 1 ел элек
other: '%{count} ел элек'
editor:
+ potlatch:
+ name: Potlatch 1
+ id:
+ name: iD
remote:
name: Дистанцион идарә
description: Дистанционн идарә (JOSM яки Merkaartor)
preview: Алдан карау
markdown_help:
headings: Башлыклар
- heading: Башлык
+ heading: Бүлек башы
link: Сылтама
text: Текст
image: Сурәт
tag: Сторінка вікі, що описує теґ %{key}=%{value}
wikidata_link: '%{page} елемент на Вікіданих'
wikipedia_link: Стаття %{page} у Вікіпедії
+ wikimedia_commons_link: Сторінка %{page} у Вікісховищі
telephone_link: Зателефонуйте на %{phone_number}
colour_preview: Перегляд кольору %{colour_value}
note:
змін'
subject_other: '[OpenStreetMap] %{commenter} прокоментував набір змін, до
якого ви залишали свій коментар'
- your_changeset: '%{commenter} залишив коментар до одного з ваших наборів змін,
- створених %{time}'
- commented_changeset: '%{commenter} залишив коментар до набору змін, що ви
- переглядаєте, створений %{changeset_author} – %{time}'
+ your_changeset: '%{commenter} залишив коментар у %{time} до одного з ваших
+ наборів змін'
+ commented_changeset: '%{commenter} залишив коментар у %{time} до набору змін,
+ що ви переглядаєте, створений %{changeset_author}'
partial_changeset_with_comment: з коментарем '%{changeset_comment}'
partial_changeset_without_comment: без коментарів
details: |2-
# Author: 予弦
# Author: 夢蝶葬花
# Author: 水獭很懒
+# Author: 沈澄心
# Author: 神樂坂秀吉
# Author: 阿pp
# Author: 아라
tag: '%{key}=%{value} 标签的 wiki 说明页面'
wikidata_link: 维基数据上的%{page}项
wikipedia_link: 维基百科上的 %{page} 条目
+ wikimedia_commons_link: 在维基共享资源上的%{page}项目
telephone_link: 请拨打 %{phone_number}
colour_preview: '%{colour_value}的颜色预览'
note:
commented:
subject_own: '[OpenStreetMap] %{commenter}在您的一个修改集合中做出了评论'
subject_other: '[OpenStreetMap] %{commenter} 评论了您感兴趣的一个修改集合'
- your_changeset: '%{commenter} 在您于 %{time} 创建的一个修改集合留了言'
- commented_changeset: '%{commenter} 在您监视的由 %{changeset_author} 于 %{time} 创建的一个地图修改集合中留了言'
+ your_changeset: '%{commenter} 于 %{time} 在您创建的一个修改集合留了言'
+ commented_changeset: '%{commenter} 于 %{time} 在您监视的由 %{changeset_author} 创建的一个地图修改集合中留了言'
partial_changeset_with_comment: 带评论“%{changeset_comment}”
partial_changeset_without_comment: 没有评论
details: 更多关于修改集合的详细信息可以在 %{url} 找到。
newer: 较新轨迹
trace:
pending: 挂起
- count_points: '%{count} 个点'
+ count_points:
+ one: 1个点
+ other: '%{count}个点'
more: 更多
trace_details: 查看轨迹详情
view_map: 查看地图
read_ct: 我已了解并同意贡献者条款
tou_explain_html: 这些%{tou_link}适用于网站方面的使用,与其它由OSMF提供的基础内容。请点击链接,阅读并同意该条款。
read_tou: 我已阅读并同意使用条款
- consider_pd: 除了上述协议,我同意将我的贡献授权为公共领域
+ consider_pd: 除了上述协议,我同意将我的贡献释于公有领域
consider_pd_why: 这是什么?
consider_pd_why_url: http://www.osmfoundation.org/wiki/License/Why_would_I_want_my_contributions_to_be_public_domain
guidance: 帮助理解这些条款的信息:一个<a href="%{summary}">可读的摘要</a>和一些<a href="%{translations}">非正式翻译</a>
agreed: 您已同意新的贡献者条款。
not yet agreed: 您还没有同意新的贡献者条款。
review link text: 请跟随此链接,方便您查看并接受新的贡献者条款。
- agreed_with_pd: 您也将您的编辑释于公共领域。
+ agreed_with_pd: 您也将您的编辑释于公有领域。
link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
link text: 这是什么?
profile description: 基本信息说明:
# Author: Cwlin0416
# Author: EagerLin
# Author: Foothsu
+# Author: HTan (WMF)
# Author: Hlaw
# Author: Impersonator 1
# Author: Jiazheng0609
body: 內文
recipient: 收件者
user:
- email: Email
+ email: 電子郵件
active: 開啟中
display_name: 顯示名稱
description: 說明
almost_x_years:
one: 近1年
other: 近%{count}年前
- half_a_minute: 30秒前
+ half_a_minute: 半分鐘前
less_than_x_seconds:
one: 小於 1 秒前
other: 小於 %{count} 秒前
tag: '%{key}=%{value} 標籤的 Wiki 說明頁面'
wikidata_link: 維基數據上的 %{page} 項目
wikipedia_link: 維基百科上的 %{page} 條目
+ wikimedia_commons_link: 在維基共享資源上的%{page}項目
telephone_link: 致電 %{phone_number}
colour_preview: 色彩%{colour_value}預覽
note:
commented:
subject_own: '[OpenStreetMap] %{commenter}% 在您的變更集評論'
subject_other: '[OpenStreetMap] %{commenter} 就您感興趣的變更集評論'
- your_changeset: '%{commenter} å\9c¨æ\82¨æ\96¼ %{time} 建ç«\8bç\9a\84è®\8aæ\9b´é\9b\86è©\95è«\96'
- commented_changeset: '%{commenter} å\9c¨æ\82¨ç\9b£è¦\96ï¼\8cç\94± %{changeset_author} æ\96¼ %{time} 建ç«\8bç\9a\84è®\8aæ\9b´é\9b\86è©\95è«\96'
+ your_changeset: '%{commenter}æ\96¼ %{time} å\9c¨æ\82¨ç\9a\84è®\8aæ\9b´é\9b\86ä¹\8bä¸\80裡ç\95\99ä¸\8bäº\86è©\95è«\96'
+ commented_changeset: '%{commenter}æ\96¼ %{time} å\9c¨æ\82¨ç\9b£è¦\96ç\9a\84ç\94±%{changeset_author}æ\89\80建ç«\8bè®\8aæ\9b´é\9b\86裡ç\95\99ä¸\8bäº\86è©\95è«\96'
partial_changeset_with_comment: 評論 "%{changeset_comment}"
partial_changeset_without_comment: 沒有評論
details: 關於變更集的詳情可在 %{url} 找到。
# the maximum value specified for Puma. Default is set to 5 threads for minimum
# and maximum; this matches the default thread size of Active Record.
#
-threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
-threads threads_count, threads_count
+max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
+min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
+threads min_threads_count, max_threads_count
# Specifies the `port` that Puma will listen on to receive requests; default is 3000.
#
#
environment ENV.fetch("RAILS_ENV") { "development" }
+# Specifies the `pidfile` that Puma will use.
+pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
+
# Specifies the number of `workers` to boot in clustered mode.
-# Workers are forked webserver processes. If using threads and workers together
+# Workers are forked web server processes. If using threads and workers together
# the concurrency of the application would be max `threads` * `workers`.
# Workers do not work on JRuby or Windows (both of which do not support
# processes).
get "user/gpx_files" => "api/users#gpx_files"
get "users" => "api/users#index", :as => :api_users
- get "user/preferences" => "api/user_preferences#read"
- get "user/preferences/:preference_key" => "api/user_preferences#read_one"
- put "user/preferences" => "api/user_preferences#update"
- put "user/preferences/:preference_key" => "api/user_preferences#update_one"
- delete "user/preferences/:preference_key" => "api/user_preferences#delete_one"
+ get "user/preferences" => "api/user_preferences#index"
+ get "user/preferences/:preference_key" => "api/user_preferences#show"
+ put "user/preferences" => "api/user_preferences#update_all"
+ put "user/preferences/:preference_key" => "api/user_preferences#update"
+ delete "user/preferences/:preference_key" => "api/user_preferences#destroy"
post "gpx/create" => "api/traces#create"
get "gpx/:id" => "api/traces#show", :id => /\d+/
get "/trace/create", :to => redirect(:path => "/traces/new")
get "/trace/:id/data" => "traces#data", :id => /\d+/, :as => "trace_data"
get "/trace/:id/edit", :to => redirect(:path => "/traces/%{id}/edit")
- post "/trace/:id/delete" => "traces#delete", :id => /\d+/
# diary pages
resources :diary_entries, :path => "diary", :only => [:new, :create, :index] do
require "migrate"
class TileTracepoints < ActiveRecord::Migration[4.2]
- class Tracepoint < ActiveRecord::Base
+ class Tracepoint < ApplicationRecord
self.table_name = "gps_points"
end
require "migrate"
class TileNodes < ActiveRecord::Migration[4.2]
- class Node < ActiveRecord::Base
+ class Node < ApplicationRecord
self.table_name = "current_nodes"
end
- class OldNode < ActiveRecord::Base
+ class OldNode < ApplicationRecord
self.table_name = "nodes"
end
"#{src} -o #{cmd}") || raise
end
- conn_opts = ActiveRecord::Base.connection
- .instance_eval { @connection_options }
+ conn_opts = ApplicationRecord.connection
+ .instance_eval { @connection_options }
args = conn_opts.map(&:to_s) + [prefix]
raise "#{cmd} failed" unless system cmd, *args
class AddEmailValid < ActiveRecord::Migration[4.2]
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
def self.up
"#{src} -o #{cmd}") || raise
end
- conn_opts = ActiveRecord::Base.connection.instance_eval { @connection_options }
+ conn_opts = ApplicationRecord.connection.instance_eval { @connection_options }
args = conn_opts.map(&:to_s) + [prefix]
raise "#{cmd} failed" unless system cmd, *args
require "migrate"
class AddMoreControlsToGpxFiles < ActiveRecord::Migration[4.2]
- class Trace < ActiveRecord::Base
+ class Trace < ApplicationRecord
self.table_name = "gpx_files"
end
require "migrate"
class CreateUserRoles < ActiveRecord::Migration[4.2]
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
- class UserRole < ActiveRecord::Base
+ class UserRole < ApplicationRecord
end
def self.up
require "migrate"
class AlterUserRolesAndBlocks < ActiveRecord::Migration[4.2]
- class UserRole < ActiveRecord::Base
+ class UserRole < ApplicationRecord
end
def self.up
require "migrate"
class AddStatusToUser < ActiveRecord::Migration[4.2]
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
def self.up
class AddTermsSeenToUser < ActiveRecord::Migration[4.2]
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
def self.up
end
class MergeAclAddressAndMask < ActiveRecord::Migration[4.2]
- class Acl < ActiveRecord::Base
+ class Acl < ApplicationRecord
end
def up
class AddCounterCaches < ActiveRecord::Migration[4.2]
- class Changeset < ActiveRecord::Base
+ class Changeset < ApplicationRecord
end
- class Trace < ActiveRecord::Base
+ class Trace < ApplicationRecord
self.table_name = "gpx_files"
end
class AddDiaryEntryCounterCaches < ActiveRecord::Migration[4.2]
- class DiaryEntry < ActiveRecord::Base
+ class DiaryEntry < ApplicationRecord
end
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
def self.up
class AddImageUseGravatarToUsers < ActiveRecord::Migration[4.2]
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
def self.up
class RenameOpenidUrl < ActiveRecord::Migration[4.2]
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
def change
class TileUsers < ActiveRecord::Migration[5.1]
- class User < ActiveRecord::Base
+ class User < ApplicationRecord
end
def up
--- /dev/null
+class RemoveNearbyFromUsers < ActiveRecord::Migration[5.2]
+ def change
+ # We've already ignored this column in the model, so it is safe to remove
+ safety_assured { remove_column :users, :nearby, :integer, :default => 50 }
+ end
+end
CREATE TABLE public.ar_internal_metadata (
key character varying NOT NULL,
value character varying,
- created_at timestamp without time zone NOT NULL,
- updated_at timestamp without time zone NOT NULL
+ created_at timestamp(6) without time zone NOT NULL,
+ updated_at timestamp(6) without time zone NOT NULL
);
home_lat double precision,
home_lon double precision,
home_zoom smallint DEFAULT 3,
- nearby integer DEFAULT 50,
pass_salt character varying,
email_valid boolean DEFAULT false NOT NULL,
new_email character varying,
('20190623093642'),
('20190702193519'),
('20190716173946'),
+('20191120140058'),
('21'),
('22'),
('23'),
def self.included(base)
# this is used to extend activerecord bases, as these aren't
# in scope for the module itself.
- base.scope :unredacted, -> { base.where(:redaction_id => nil) }
+ base.scope :unredacted, -> { where(:redaction_id => nil) }
end
def redacted?
test "user preferences" do
# a user with no tokens
capability = ApiCapability.new nil
- [:read, :read_one, :update, :update_one, :delete_one].each do |act|
+ [:index, :show, :update_all, :update, :destroy].each do |act|
assert capability.cannot? act, UserPreference
end
# A user with empty tokens
capability = ApiCapability.new tokens
- [:read, :read_one, :update, :update_one, :delete_one].each do |act|
+ [:index, :show, :update_all, :update, :destroy].each do |act|
assert capability.cannot? act, UserPreference
end
capability = ApiCapability.new tokens(:allow_read_prefs)
- [:update, :update_one, :delete_one].each do |act|
+ [:update_all, :update, :destroy].each do |act|
assert capability.cannot? act, UserPreference
end
- [:read, :read_one].each do |act|
+ [:index, :show].each do |act|
assert capability.can? act, UserPreference
end
capability = ApiCapability.new tokens(:allow_write_prefs)
- [:read, :read_one].each do |act|
+ [:index, :show].each do |act|
assert capability.cannot? act, UserPreference
end
- [:update, :update_one, :delete_one].each do |act|
+ [:update_all, :update, :destroy].each do |act|
assert capability.can? act, UserPreference
end
end
diff.root = XML::Node.new "osmChange"
delete = XML::Node.new "delete"
diff.root << delete
- delete << super_relation.to_xml_node
- delete << used_relation.to_xml_node
- delete << used_way.to_xml_node
- delete << used_node.to_xml_node
+ delete << xml_node_for_relation(super_relation)
+ delete << xml_node_for_relation(used_relation)
+ delete << xml_node_for_way(used_way)
+ delete << xml_node_for_node(used_node)
# update the changeset to one that this user owns
%w[node way relation].each do |type|
diff.root = XML::Node.new "osmChange"
delete = XML::Node.new "delete"
diff.root << delete
- delete << other_relation.to_xml_node
- delete << used_way.to_xml_node
- delete << used_node.to_xml_node
+ delete << xml_node_for_relation(other_relation)
+ delete << xml_node_for_way(used_way)
+ delete << xml_node_for_node(used_node)
# update the changeset to one that this user owns
%w[node way relation].each do |type|
delete = XML::Node.new "delete"
diff.root << delete
delete["if-unused"] = ""
- delete << used_relation.to_xml_node
- delete << used_way.to_xml_node
- delete << used_node.to_xml_node
+ delete << xml_node_for_relation(used_relation)
+ delete << xml_node_for_way(used_way)
+ delete << xml_node_for_node(used_node)
# update the changeset to one that this user owns
%w[node way relation].each do |type|
diff = XML::Document.new
diff.root = XML::Node.new "osmChange"
modify = XML::Node.new "modify"
- xml_old_node = old_node.to_xml_node
+ xml_old_node = xml_node_for_node(old_node)
xml_old_node["lat"] = 2.0.to_s
xml_old_node["lon"] = 2.0.to_s
xml_old_node["changeset"] = changeset_id.to_s
diff = XML::Document.new
diff.root = XML::Node.new "osmChange"
modify = XML::Node.new "modify"
- xml_old_way = old_way.to_xml_node
+ xml_old_way = xml_node_for_way(old_way)
nd_ref = XML::Node.new "nd"
nd_ref["ref"] = create(:node, :lat => 3, :lon => 3).id.to_s
xml_old_way << nd_ref
diff.root = XML::Node.new "osmChange"
delete = XML::Node.new "delete"
diff.root << delete
- delete << node.to_xml_node
+ delete << xml_node_for_node(node)
# upload it
error_format "xml"
# add (delete) a way to it, which contains a point at (3,3)
with_controller(WaysController.new) do
- xml = update_changeset(way.to_xml, changeset_id)
+ xml = update_changeset(xml_for_way(way), changeset_id)
put :delete, :params => { :id => way.id }, :body => xml.to_s
assert_response :success, "Couldn't delete a way."
end
assert_response :not_found
end
+ # Ensure the lat/lon is formatted as a decimal e.g. not 4.0e-05
+ def test_lat_lon_xml_format
+ node = create(:node, :latitude => (0.00004 * OldNode::SCALE).to_i, :longitude => (0.00008 * OldNode::SCALE).to_i)
+
+ get :show, :params => { :id => node.id }
+ assert_match(/lat="0.0000400"/, response.body)
+ assert_match(/lon="0.0000800"/, response.body)
+ end
+
# this tests deletion restrictions - basic deletion is tested in the unit
# tests for node!
def test_delete
basic_authorization private_user.email, "test"
# try to delete with an invalid (closed) changeset
- xml = update_changeset(private_node.to_xml, private_user_closed_changeset.id)
+ xml = update_changeset(xml_for_node(private_node), private_user_closed_changeset.id)
delete :delete, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data("non-public user shouldn't be able to delete node")
# try to delete with an invalid (non-existent) changeset
- xml = update_changeset(private_node.to_xml, 0)
+ xml = update_changeset(xml_for_node(private_node), 0)
delete :delete, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data("shouldn't be able to delete node, when user's data is private")
# valid delete now takes a payload
- xml = private_node.to_xml
+ xml = xml_for_node(private_node)
delete :delete, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data("shouldn't be able to delete node when user's data isn't public'")
# this won't work since the node is already deleted
- xml = private_deleted_node.to_xml
+ xml = xml_for_node(private_deleted_node)
delete :delete, :params => { :id => private_deleted_node.id }, :body => xml.to_s
assert_require_public_data
private_used_node = create(:node, :changeset => private_user_changeset)
create(:way_node, :node => private_used_node)
- xml = private_used_node.to_xml
+ xml = xml_for_node(private_used_node)
delete :delete, :params => { :id => private_used_node.id }, :body => xml.to_s
assert_require_public_data "shouldn't be able to delete a node used in a way (#{@response.body})"
private_used_node2 = create(:node, :changeset => private_user_changeset)
create(:relation_member, :member => private_used_node2)
- xml = private_used_node2.to_xml
+ xml = xml_for_node(private_used_node2)
delete :delete, :params => { :id => private_used_node2.id }, :body => xml.to_s
assert_require_public_data "shouldn't be able to delete a node used in a relation (#{@response.body})"
basic_authorization user.email, "test"
# try to delete with an invalid (closed) changeset
- xml = update_changeset(node.to_xml, closed_changeset.id)
+ xml = update_changeset(xml_for_node(node), closed_changeset.id)
delete :delete, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict
# try to delete with an invalid (non-existent) changeset
- xml = update_changeset(node.to_xml, 0)
+ xml = update_changeset(xml_for_node(node), 0)
delete :delete, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict
# try to delete a node with a different ID
other_node = create(:node)
- xml = other_node.to_xml
+ xml = xml_for_node(other_node)
delete :delete, :params => { :id => node.id }, :body => xml.to_s
assert_response :bad_request,
"should not be able to delete a node with a different ID from the XML"
"should not be able to delete a node without a valid XML payload"
# valid delete now takes a payload
- xml = node.to_xml
+ xml = xml_for_node(node)
delete :delete, :params => { :id => node.id }, :body => xml.to_s
assert_response :success
"delete request should return a new version number for node"
# deleting the same node twice doesn't work
- xml = node.to_xml
+ xml = xml_for_node(node)
delete :delete, :params => { :id => node.id }, :body => xml.to_s
assert_response :gone
way_node = create(:way_node, :node => used_node)
way_node2 = create(:way_node, :node => used_node)
- xml = used_node.to_xml
+ xml = xml_for_node(used_node)
delete :delete, :params => { :id => used_node.id }, :body => xml.to_s
assert_response :precondition_failed,
"shouldn't be able to delete a node used in a way (#{@response.body})"
relation_member = create(:relation_member, :member => used_node2)
relation_member2 = create(:relation_member, :member => used_node2)
- xml = used_node2.to_xml
+ xml = xml_for_node(used_node2)
delete :delete, :params => { :id => used_node2.id }, :body => xml.to_s
assert_response :precondition_failed,
"shouldn't be able to delete a node used in a relation (#{@response.body})"
user = create(:user)
node = create(:node, :changeset => create(:changeset, :user => user))
- xml = node.to_xml
+ xml = xml_for_node(node)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :unauthorized
## trying to break changesets
# try and update in someone else's changeset
- xml = update_changeset(private_node.to_xml,
+ xml = update_changeset(xml_for_node(private_node),
create(:changeset).id)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "update with other user's changeset should be forbidden when data isn't public"
# try and update in a closed changeset
- xml = update_changeset(private_node.to_xml,
+ xml = update_changeset(xml_for_node(private_node),
create(:changeset, :closed, :user => private_user).id)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "update with closed changeset should be forbidden, when data isn't public"
# try and update in a non-existant changeset
- xml = update_changeset(private_node.to_xml, 0)
+ xml = update_changeset(xml_for_node(private_node), 0)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "update with changeset=0 should be forbidden, when data isn't public"
## try and submit invalid updates
- xml = xml_attr_rewrite(private_node.to_xml, "lat", 91.0)
+ xml = xml_attr_rewrite(xml_for_node(private_node), "lat", 91.0)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "node at lat=91 should be forbidden, when data isn't public"
- xml = xml_attr_rewrite(private_node.to_xml, "lat", -91.0)
+ xml = xml_attr_rewrite(xml_for_node(private_node), "lat", -91.0)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "node at lat=-91 should be forbidden, when data isn't public"
- xml = xml_attr_rewrite(private_node.to_xml, "lon", 181.0)
+ xml = xml_attr_rewrite(xml_for_node(private_node), "lon", 181.0)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "node at lon=181 should be forbidden, when data isn't public"
- xml = xml_attr_rewrite(private_node.to_xml, "lon", -181.0)
+ xml = xml_attr_rewrite(xml_for_node(private_node), "lon", -181.0)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "node at lon=-181 should be forbidden, when data isn't public"
## finally, produce a good request which still won't work
- xml = private_node.to_xml
+ xml = xml_for_node(private_node)
put :update, :params => { :id => private_node.id }, :body => xml.to_s
assert_require_public_data "should have failed with a forbidden when data isn't public"
# try and update a node without authorisation
# first try to update node without auth
- xml = node.to_xml
+ xml = xml_for_node(node)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :forbidden
## trying to break changesets
# try and update in someone else's changeset
- xml = update_changeset(node.to_xml,
+ xml = update_changeset(xml_for_node(node),
create(:changeset).id)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict, "update with other user's changeset should be rejected"
# try and update in a closed changeset
- xml = update_changeset(node.to_xml,
+ xml = update_changeset(xml_for_node(node),
create(:changeset, :closed, :user => user).id)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict, "update with closed changeset should be rejected"
# try and update in a non-existant changeset
- xml = update_changeset(node.to_xml, 0)
+ xml = update_changeset(xml_for_node(node), 0)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict, "update with changeset=0 should be rejected"
## try and submit invalid updates
- xml = xml_attr_rewrite(node.to_xml, "lat", 91.0)
+ xml = xml_attr_rewrite(xml_for_node(node), "lat", 91.0)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :bad_request, "node at lat=91 should be rejected"
- xml = xml_attr_rewrite(node.to_xml, "lat", -91.0)
+ xml = xml_attr_rewrite(xml_for_node(node), "lat", -91.0)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :bad_request, "node at lat=-91 should be rejected"
- xml = xml_attr_rewrite(node.to_xml, "lon", 181.0)
+ xml = xml_attr_rewrite(xml_for_node(node), "lon", 181.0)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :bad_request, "node at lon=181 should be rejected"
- xml = xml_attr_rewrite(node.to_xml, "lon", -181.0)
+ xml = xml_attr_rewrite(xml_for_node(node), "lon", -181.0)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :bad_request, "node at lon=-181 should be rejected"
current_node_version = node.version
# try and submit a version behind
- xml = xml_attr_rewrite(node.to_xml,
+ xml = xml_attr_rewrite(xml_for_node(node),
"version", current_node_version - 1)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict, "should have failed on old version number"
# try and submit a version ahead
- xml = xml_attr_rewrite(node.to_xml,
+ xml = xml_attr_rewrite(xml_for_node(node),
"version", current_node_version + 1)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict, "should have failed on skipped version number"
# try and submit total crap in the version field
- xml = xml_attr_rewrite(node.to_xml,
+ xml = xml_attr_rewrite(xml_for_node(node),
"version", "p1r4t3s!")
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :conflict,
"should not be able to put 'p1r4at3s!' in the version field"
## try an update with the wrong ID
- xml = create(:node).to_xml
+ xml = xml_for_node(create(:node))
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :bad_request,
"should not be able to update a node with a different ID from the XML"
"should not be able to update a node with non-OSM XML doc."
## finally, produce a good request which should work
- xml = node.to_xml
+ xml = xml_for_node(node)
put :update, :params => { :id => node.id }, :body => xml.to_s
assert_response :success, "a valid update request failed"
end
tag_xml["v"] = existing_tag.v
# add the tag into the existing xml
- node_xml = existing_tag.node.to_xml
+ node_xml = xml_for_node(existing_tag.node)
node_xml.find("//osm/node").first << tag_xml
# try and upload it
get :show, :params => { :id => open_note.id, :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do
assert_select "id", open_note.id.to_s
get :show, :params => { :id => open_note.id, :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 1 do
get :show, :params => { :id => open_note.id, :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "Feature", js["type"]
get :show, :params => { :id => open_note.id, :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt[lat='#{open_note.lat}'][lon='#{open_note.lon}']", :count => 1 do
assert_select "time", :count => 1
get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 2
get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 2
end
get :index, :params => { :bbox => "1,1,1.2,1.2", :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 2
end
get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 1
get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 1
end
get :index, :params => { :bbox => "1,1,1.2,1.2", :limit => 1, :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 1
end
def test_index_empty_area
get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 0
get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 0
end
get :index, :params => { :bbox => "5,5,5.1,5.1", :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 0
end
def test_index_large_area
get :index, :params => { :bbox => "-2.5,-2.5,2.5,2.5", :format => :json }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
get :index, :params => { :l => "-2.5", :b => "-2.5", :r => "2.5", :t => "2.5", :format => :json }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
get :index, :params => { :bbox => "-10,-10,12,12", :format => :json }
assert_response :bad_request
- assert_equal "application/json", @response.content_type
+ assert_equal "text/plain", @response.media_type
get :index, :params => { :l => "-10", :b => "-10", :r => "12", :t => "12", :format => :json }
assert_response :bad_request
- assert_equal "application/json", @response.content_type
+ assert_equal "text/plain", @response.media_type
end
def test_index_closed
# Open notes + closed in last 7 days
get :index, :params => { :bbox => "1,1,1.7,1.7", :closed => "7", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
# Only open notes
get :index, :params => { :bbox => "1,1,1.7,1.7", :closed => "0", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
# Open notes + all closed notes
get :index, :params => { :bbox => "1,1,1.7,1.7", :closed => "-1", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :search, :params => { :q => "note comment", :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 1
end
get :search, :params => { :q => "note comment", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :search, :params => { :q => "note comment", :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 1
get :search, :params => { :q => "note comment", :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 1
end
get :search, :params => { :display_name => user.display_name, :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 1
end
get :search, :params => { :display_name => user.display_name, :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :search, :params => { :display_name => user.display_name, :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 1
get :search, :params => { :display_name => user.display_name, :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 1
end
get :search, :params => { :user => user.id, :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 1
end
get :search, :params => { :user => user.id, :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :search, :params => { :user => user.id, :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 1
get :search, :params => { :user => user.id, :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 1
end
get :search, :params => { :q => "no match", :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 0
end
get :search, :params => { :q => "no match", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :search, :params => { :q => "no match", :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 0
get :search, :params => { :q => "no match", :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 0
end
get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "xml" }
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm", :count => 1 do
assert_select "note", :count => 0
end
get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "json" }
assert_response :success
- assert_equal "application/json", @response.content_type
+ assert_equal "application/json", @response.media_type
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal "FeatureCollection", js["type"]
get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 0
get :search, :params => { :from => "01.01.2010", :to => "01.10.2010", :format => "gpx" }
assert_response :success
- assert_equal "application/gpx+xml", @response.content_type
+ assert_equal "application/gpx+xml", @response.media_type
assert_select "gpx", :count => 1 do
assert_select "wpt", :count => 0
end
get :feed, :params => { :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 4
get :feed, :params => { :bbox => "1,1,1.2,1.2", :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 2
basic_authorization private_user.email, "test"
# setup a simple XML node
- xml_doc = private_node.to_xml
+ xml_doc = xml_for_node(private_node)
xml_node = xml_doc.find("//osm/node").first
nodeid = private_node.id
# setup a simple XML node
- xml_doc = node.to_xml
+ xml_doc = xml_for_node(node)
xml_node = xml_doc.find("//osm/node").first
nodeid = node.id
assert_response :forbidden
# try to delete with an invalid (closed) changeset
- xml = update_changeset(relation.to_xml,
+ xml = update_changeset(xml_for_relation(relation),
private_user_closed_changeset.id)
delete :delete, :params => { :id => relation.id }, :body => xml.to_s
assert_response :forbidden
# try to delete with an invalid (non-existent) changeset
- xml = update_changeset(relation.to_xml, 0)
+ xml = update_changeset(xml_for_relation(relation), 0)
delete :delete, :params => { :id => relation.id }, :body => xml.to_s
assert_response :forbidden
# this won't work because the relation is in-use by another relation
- xml = used_relation.to_xml
+ xml = xml_for_relation(used_relation)
delete :delete, :params => { :id => used_relation.id }, :body => xml.to_s
assert_response :forbidden
# this should work when we provide the appropriate payload...
- xml = relation.to_xml
+ xml = xml_for_relation(relation)
delete :delete, :params => { :id => relation.id }, :body => xml.to_s
assert_response :forbidden
# this won't work since the relation is already deleted
- xml = deleted_relation.to_xml
+ xml = xml_for_relation(deleted_relation)
delete :delete, :params => { :id => deleted_relation.id }, :body => xml.to_s
assert_response :forbidden
assert_match(/Changeset id is missing/, @response.body)
# try to delete with an invalid (closed) changeset
- xml = update_changeset(relation.to_xml,
+ xml = update_changeset(xml_for_relation(relation),
closed_changeset.id)
delete :delete, :params => { :id => relation.id }, :body => xml.to_s
assert_response :conflict
# try to delete with an invalid (non-existent) changeset
- xml = update_changeset(relation.to_xml, 0)
+ xml = update_changeset(xml_for_relation(relation), 0)
delete :delete, :params => { :id => relation.id }, :body => xml.to_s
assert_response :conflict
# this won't work because the relation is in a changeset owned by someone else
- xml = update_changeset(relation.to_xml, create(:changeset).id)
+ xml = update_changeset(xml_for_relation(relation), create(:changeset).id)
delete :delete, :params => { :id => relation.id }, :body => xml.to_s
assert_response :conflict,
"shouldn't be able to delete a relation in a changeset owned by someone else (#{@response.body})"
# this won't work because the relation in the payload is different to that passed
- xml = update_changeset(relation.to_xml, changeset.id)
+ xml = update_changeset(xml_for_relation(relation), changeset.id)
delete :delete, :params => { :id => create(:relation).id }, :body => xml.to_s
assert_response :bad_request, "shouldn't be able to delete a relation when payload is different to the url"
# this won't work because the relation is in-use by another relation
- xml = update_changeset(used_relation.to_xml, changeset.id)
+ xml = update_changeset(xml_for_relation(used_relation), changeset.id)
delete :delete, :params => { :id => used_relation.id }, :body => xml.to_s
assert_response :precondition_failed,
"shouldn't be able to delete a relation used in a relation (#{@response.body})"
assert_equal "Precondition failed: The relation #{used_relation.id} is used in relation #{super_relation.id}.", @response.body
# this should work when we provide the appropriate payload...
- xml = update_changeset(multi_tag_relation.to_xml, changeset.id)
+ xml = update_changeset(xml_for_relation(multi_tag_relation), changeset.id)
delete :delete, :params => { :id => multi_tag_relation.id }, :body => xml.to_s
assert_response :success
"delete request should return a new version number for relation"
# this won't work since the relation is already deleted
- xml = update_changeset(deleted_relation.to_xml, changeset.id)
+ xml = update_changeset(xml_for_relation(deleted_relation), changeset.id)
delete :delete, :params => { :id => deleted_relation.id }, :body => xml.to_s
assert_response :gone
# Public visible relation needs to be deleted
- xml = update_changeset(super_relation.to_xml, changeset.id)
+ xml = update_changeset(xml_for_relation(super_relation), changeset.id)
delete :delete, :params => { :id => super_relation.id }, :body => xml.to_s
assert_response :success
# this works now because the relation which was using this one
# has been deleted.
- xml = update_changeset(used_relation.to_xml, changeset.id)
+ xml = update_changeset(xml_for_relation(used_relation), changeset.id)
delete :delete, :params => { :id => used_relation.id }, :body => xml.to_s
assert_response :success,
"should be able to delete a relation used in an old relation (#{@response.body})"
# indirectly via the way), so the bbox should be [3,3,5,5].
check_changeset_modify(BoundingBox.new(3, 3, 5, 5)) do |changeset_id|
# add a tag to an existing relation
- relation_xml = relation.to_xml
+ relation_xml = xml_for_relation(relation)
relation_element = relation_xml.find("//osm/relation").first
new_tag = XML::Node.new("tag")
new_tag["k"] = "some_new_tag"
[node1, node2, way1, way2].each do |element|
bbox = element.bbox.to_unscaled
check_changeset_modify(bbox) do |changeset_id|
- relation_xml = Relation.find(relation.id).to_xml
+ relation_xml = xml_for_relation(Relation.find(relation.id))
relation_element = relation_xml.find("//osm/relation").first
new_member = XML::Node.new("member")
new_member["ref"] = element.id.to_s
check_changeset_modify(BoundingBox.new(5, 5, 5, 5)) do |changeset_id|
# remove node 5 (5,5) from an existing relation
- relation_xml = relation.to_xml
+ relation_xml = xml_for_relation(relation)
relation_xml
.find("//osm/relation/member[@type='node'][@ref='#{node2.id}']")
.first.remove!
create(:relation_member, :relation => relation, :member => node2)
check_changeset_modify(BoundingBox.new(3, 3, 5, 5)) do |changeset_id|
- relation_xml = relation.to_xml
+ relation_xml = xml_for_relation(relation)
relation_xml
.find("//osm/relation/member")
.each(&:remove!)
def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx")
assert_response :success
assert_equal digest, Digest::MD5.hexdigest(response.body)
- assert_equal content_type, response.content_type
- assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"", @response.header["Content-Disposition"]
+ assert_equal content_type, response.media_type
+ assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"]
end
##
def test_routes
assert_routing(
{ :path => "/api/0.6/user/preferences", :method => :get },
- { :controller => "api/user_preferences", :action => "read" }
+ { :controller => "api/user_preferences", :action => "index" }
)
assert_routing(
{ :path => "/api/0.6/user/preferences", :method => :put },
- { :controller => "api/user_preferences", :action => "update" }
+ { :controller => "api/user_preferences", :action => "update_all" }
)
assert_routing(
{ :path => "/api/0.6/user/preferences/key", :method => :get },
- { :controller => "api/user_preferences", :action => "read_one", :preference_key => "key" }
+ { :controller => "api/user_preferences", :action => "show", :preference_key => "key" }
)
assert_routing(
{ :path => "/api/0.6/user/preferences/key", :method => :put },
- { :controller => "api/user_preferences", :action => "update_one", :preference_key => "key" }
+ { :controller => "api/user_preferences", :action => "update", :preference_key => "key" }
)
assert_routing(
{ :path => "/api/0.6/user/preferences/key", :method => :delete },
- { :controller => "api/user_preferences", :action => "delete_one", :preference_key => "key" }
+ { :controller => "api/user_preferences", :action => "destroy", :preference_key => "key" }
)
end
##
- # test read action
- def test_read
+ # test showing all preferences
+ def test_index
# first try without auth
- get :read
+ get :index
assert_response :unauthorized, "should be authenticated"
# authenticate as a user with no preferences
basic_authorization create(:user).email, "test"
# try the read again
- get :read
+ get :index
assert_select "osm" do
assert_select "preferences", :count => 1 do
assert_select "preference", :count => 0
basic_authorization user.email, "test"
# try the read again
- get :read
+ get :index
assert_response :success
- assert_equal "application/xml", @response.content_type
+ assert_equal "application/xml", @response.media_type
assert_select "osm" do
assert_select "preferences", :count => 1 do
assert_select "preference", :count => 2
end
##
- # test read_one action
- def test_read_one
+ # test showing one preference
+ def test_show
user = create(:user)
create(:user_preference, :user => user, :k => "key", :v => "value")
# try a read without auth
- get :read_one, :params => { :preference_key => "key" }
+ get :show, :params => { :preference_key => "key" }
assert_response :unauthorized, "should be authenticated"
# authenticate as a user with preferences
basic_authorization user.email, "test"
# try the read again
- get :read_one, :params => { :preference_key => "key" }
+ get :show, :params => { :preference_key => "key" }
assert_response :success
- assert_equal "text/plain", @response.content_type
+ assert_equal "text/plain", @response.media_type
assert_equal "value", @response.body
# try the read again for a non-existent key
- get :read_one, :params => { :preference_key => "unknown_key" }
+ get :show, :params => { :preference_key => "unknown_key" }
assert_response :not_found
end
##
- # test update action
- def test_update
+ # test bulk update action
+ def test_update_all
user = create(:user)
create(:user_preference, :user => user, :k => "key", :v => "value")
create(:user_preference, :user => user, :k => "some_key", :v => "some_value")
# try a put without auth
assert_no_difference "UserPreference.count" do
- put :update, :body => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
+ put :update_all, :body => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
end
assert_response :unauthorized, "should be authenticated"
assert_equal "value", UserPreference.find([user.id, "key"]).v
# try the put again
assert_no_difference "UserPreference.count" do
- put :update, :body => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
+ put :update_all, :body => "<osm><preferences><preference k='key' v='new_value'/><preference k='new_key' v='value'/></preferences></osm>"
end
assert_response :success
- assert_equal "text/plain", @response.content_type
+ assert_equal "text/plain", @response.media_type
assert_equal "", @response.body
assert_equal "new_value", UserPreference.find([user.id, "key"]).v
assert_equal "value", UserPreference.find([user.id, "new_key"]).v
# try a put with duplicate keys
assert_no_difference "UserPreference.count" do
- put :update, :body => "<osm><preferences><preference k='key' v='value'/><preference k='key' v='newer_value'/></preferences></osm>"
+ put :update_all, :body => "<osm><preferences><preference k='key' v='value'/><preference k='key' v='newer_value'/></preferences></osm>"
end
assert_response :bad_request
- assert_equal "text/plain", @response.content_type
+ assert_equal "text/plain", @response.media_type
assert_equal "Duplicate preferences with key key", @response.body
assert_equal "new_value", UserPreference.find([user.id, "key"]).v
# try a put with invalid content
assert_no_difference "UserPreference.count" do
- put :update, :body => "nonsense"
+ put :update_all, :body => "nonsense"
end
assert_response :bad_request
end
##
- # test update_one action
- def test_update_one
+ # test update action
+ def test_update
user = create(:user)
create(:user_preference, :user => user)
# try a put without auth
assert_no_difference "UserPreference.count" do
- put :update_one, :params => { :preference_key => "new_key" }, :body => "new_value"
+ put :update, :params => { :preference_key => "new_key" }, :body => "new_value"
end
assert_response :unauthorized, "should be authenticated"
assert_raises ActiveRecord::RecordNotFound do
# try adding a new preference
assert_difference "UserPreference.count", 1 do
- put :update_one, :params => { :preference_key => "new_key" }, :body => "new_value"
+ put :update, :params => { :preference_key => "new_key" }, :body => "new_value"
end
assert_response :success
- assert_equal "text/plain", @response.content_type
+ assert_equal "text/plain", @response.media_type
assert_equal "", @response.body
assert_equal "new_value", UserPreference.find([user.id, "new_key"]).v
# try changing the value of a preference
assert_no_difference "UserPreference.count" do
- put :update_one, :params => { :preference_key => "new_key" }, :body => "newer_value"
+ put :update, :params => { :preference_key => "new_key" }, :body => "newer_value"
end
assert_response :success
- assert_equal "text/plain", @response.content_type
+ assert_equal "text/plain", @response.media_type
assert_equal "", @response.body
assert_equal "newer_value", UserPreference.find([user.id, "new_key"]).v
end
##
- # test delete_one action
- def test_delete_one
+ # test destroy action
+ def test_destroy
user = create(:user)
create(:user_preference, :user => user, :k => "key", :v => "value")
# try a delete without auth
assert_no_difference "UserPreference.count" do
- delete :delete_one, :params => { :preference_key => "key" }
+ delete :destroy, :params => { :preference_key => "key" }
end
assert_response :unauthorized, "should be authenticated"
assert_equal "value", UserPreference.find([user.id, "key"]).v
# try the delete again
assert_difference "UserPreference.count", -1 do
- get :delete_one, :params => { :preference_key => "key" }
+ get :destroy, :params => { :preference_key => "key" }
end
assert_response :success
- assert_equal "text/plain", @response.content_type
+ assert_equal "text/plain", @response.media_type
assert_equal "", @response.body
assert_raises ActiveRecord::RecordNotFound do
UserPreference.find([user.id, "key"])
# try the delete again for the same key
assert_no_difference "UserPreference.count" do
- get :delete_one, :params => { :preference_key => "key" }
+ get :destroy, :params => { :preference_key => "key" }
end
assert_response :not_found
assert_raises ActiveRecord::RecordNotFound do
# Ensure that a valid access token with correct capabilities can be used to
# read preferences
- def test_read_one_using_token
+ def test_show_using_token
user = create(:user)
token = create(:access_token, :user => user, :allow_read_prefs => true)
create(:user_preference, :user => user, :k => "key", :v => "value")
@request.env["oauth.strategies"] = [:token]
@request.env["oauth.token"] = token
- get :read_one, :params => { :preference_key => "key" }
+ get :show, :params => { :preference_key => "key" }
assert_response :success
end
# Ensure that a valid access token with incorrect capabilities can't be used
# to read preferences even, though the owner of that token could read them
# by other methods.
- def test_read_one_using_token_fail
+ def test_show_using_token_fail
user = create(:user)
token = create(:access_token, :user => user, :allow_read_prefs => false)
create(:user_preference, :user => user, :k => "key", :v => "value")
@request.env["oauth.strategies"] = [:token]
@request.env["oauth.token"] = token
- get :read_one, :params => { :preference_key => "key" }
+ get :show, :params => { :preference_key => "key" }
assert_response :forbidden
end
end
# check that a visible user is returned properly
get :show, :params => { :id => user.id }
assert_response :success
- assert_equal "text/xml", response.content_type
+ assert_equal "text/xml", response.media_type
# check the data that is returned
assert_select "description", :count => 1, :text => "test"
basic_authorization user.email, "test"
get :details
assert_response :success
- assert_equal "text/xml", response.content_type
+ assert_equal "text/xml", response.media_type
# check the data that is returned
assert_select "description", :count => 1, :text => "test"
get :index, :params => { :users => user1.id }
assert_response :success
- assert_equal "text/xml", response.content_type
+ assert_equal "text/xml", response.media_type
assert_select "user", :count => 1 do
assert_select "user[id='#{user1.id}']", :count => 1
assert_select "user[id='#{user2.id}']", :count => 0
get :index, :params => { :users => user2.id }
assert_response :success
- assert_equal "text/xml", response.content_type
+ assert_equal "text/xml", response.media_type
assert_select "user", :count => 1 do
assert_select "user[id='#{user1.id}']", :count => 0
assert_select "user[id='#{user2.id}']", :count => 1
get :index, :params => { :users => "#{user1.id},#{user3.id}" }
assert_response :success
- assert_equal "text/xml", response.content_type
+ assert_equal "text/xml", response.media_type
assert_select "user", :count => 2 do
assert_select "user[id='#{user1.id}']", :count => 1
assert_select "user[id='#{user2.id}']", :count => 0
basic_authorization user.email, "test"
get :gpx_files
assert_response :success
- assert_equal "application/xml", response.content_type
+ assert_equal "application/xml", response.media_type
# check the data that is returned
assert_select "gpx_file[id='#{trace1.id}']", 1 do
assert_response :forbidden
# try to delete with an invalid (closed) changeset
- xml = update_changeset(private_way.to_xml, private_closed_changeset.id)
+ xml = update_changeset(xml_for_way(private_way), private_closed_changeset.id)
delete :delete, :params => { :id => private_way.id }, :body => xml.to_s
assert_response :forbidden
# try to delete with an invalid (non-existent) changeset
- xml = update_changeset(private_way.to_xml, 0)
+ xml = update_changeset(xml_for_way(private_way), 0)
delete :delete, :params => { :id => private_way.id }, :body => xml.to_s
assert_response :forbidden
# Now try with a valid changeset
- xml = private_way.to_xml
+ xml = xml_for_way(private_way)
delete :delete, :params => { :id => private_way.id }, :body => xml.to_s
assert_response :forbidden
# "delete request should return a new version number for way"
# this won't work since the way is already deleted
- xml = private_deleted_way.to_xml
+ xml = xml_for_way(private_deleted_way)
delete :delete, :params => { :id => private_deleted_way.id }, :body => xml.to_s
assert_response :forbidden
# this shouldn't work as the way is used in a relation
- xml = private_used_way.to_xml
+ xml = xml_for_way(private_used_way)
delete :delete, :params => { :id => private_used_way.id }, :body => xml.to_s
assert_response :forbidden,
"shouldn't be able to delete a way used in a relation (#{@response.body}), when done by a private user"
assert_response :bad_request
# try to delete with an invalid (closed) changeset
- xml = update_changeset(way.to_xml, closed_changeset.id)
+ xml = update_changeset(xml_for_way(way), closed_changeset.id)
delete :delete, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict
# try to delete with an invalid (non-existent) changeset
- xml = update_changeset(way.to_xml, 0)
+ xml = update_changeset(xml_for_way(way), 0)
delete :delete, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict
# Now try with a valid changeset
- xml = way.to_xml
+ xml = xml_for_way(way)
delete :delete, :params => { :id => way.id }, :body => xml.to_s
assert_response :success
"delete request should return a new version number for way"
# this won't work since the way is already deleted
- xml = deleted_way.to_xml
+ xml = xml_for_way(deleted_way)
delete :delete, :params => { :id => deleted_way.id }, :body => xml.to_s
assert_response :gone
# this shouldn't work as the way is used in a relation
- xml = used_way.to_xml
+ xml = xml_for_way(used_way)
delete :delete, :params => { :id => used_way.id }, :body => xml.to_s
assert_response :precondition_failed,
"shouldn't be able to delete a way used in a relation (#{@response.body})"
## First test with no user credentials
# try and update a way without authorisation
- xml = way.to_xml
+ xml = xml_for_way(way)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :unauthorized
## trying to break changesets
# try and update in someone else's changeset
- xml = update_changeset(private_way.to_xml,
+ xml = update_changeset(xml_for_way(private_way),
create(:changeset).id)
put :update, :params => { :id => private_way.id }, :body => xml.to_s
assert_require_public_data "update with other user's changeset should be forbidden when date isn't public"
# try and update in a closed changeset
- xml = update_changeset(private_way.to_xml,
+ xml = update_changeset(xml_for_way(private_way),
create(:changeset, :closed, :user => private_user).id)
put :update, :params => { :id => private_way.id }, :body => xml.to_s
assert_require_public_data "update with closed changeset should be forbidden, when data isn't public"
# try and update in a non-existant changeset
- xml = update_changeset(private_way.to_xml, 0)
+ xml = update_changeset(xml_for_way(private_way), 0)
put :update, :params => { :id => private_way.id }, :body => xml.to_s
assert_require_public_data("update with changeset=0 should be forbidden, when data isn't public")
## try and submit invalid updates
- xml = xml_replace_node(private_way.to_xml, node.id, 9999)
+ xml = xml_replace_node(xml_for_way(private_way), node.id, 9999)
put :update, :params => { :id => private_way.id }, :body => xml.to_s
assert_require_public_data "way with non-existent node should be forbidden, when data isn't public"
- xml = xml_replace_node(private_way.to_xml, node.id, create(:node, :deleted).id)
+ xml = xml_replace_node(xml_for_way(private_way), node.id, create(:node, :deleted).id)
put :update, :params => { :id => private_way.id }, :body => xml.to_s
assert_require_public_data "way with deleted node should be forbidden, when data isn't public"
## finally, produce a good request which will still not work
- xml = private_way.to_xml
+ xml = xml_for_way(private_way)
put :update, :params => { :id => private_way.id }, :body => xml.to_s
assert_require_public_data "should have failed with a forbidden when data isn't public"
## trying to break changesets
# try and update in someone else's changeset
- xml = update_changeset(way.to_xml,
+ xml = update_changeset(xml_for_way(way),
create(:changeset).id)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict, "update with other user's changeset should be rejected"
# try and update in a closed changeset
- xml = update_changeset(way.to_xml,
+ xml = update_changeset(xml_for_way(way),
create(:changeset, :closed, :user => user).id)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict, "update with closed changeset should be rejected"
# try and update in a non-existant changeset
- xml = update_changeset(way.to_xml, 0)
+ xml = update_changeset(xml_for_way(way), 0)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict, "update with changeset=0 should be rejected"
## try and submit invalid updates
- xml = xml_replace_node(way.to_xml, node.id, 9999)
+ xml = xml_replace_node(xml_for_way(way), node.id, 9999)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :precondition_failed, "way with non-existent node should be rejected"
- xml = xml_replace_node(way.to_xml, node.id, create(:node, :deleted).id)
+ xml = xml_replace_node(xml_for_way(way), node.id, create(:node, :deleted).id)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :precondition_failed, "way with deleted node should be rejected"
current_way_version = way.version
# try and submit a version behind
- xml = xml_attr_rewrite(way.to_xml,
+ xml = xml_attr_rewrite(xml_for_way(way),
"version", current_way_version - 1)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict, "should have failed on old version number"
# try and submit a version ahead
- xml = xml_attr_rewrite(way.to_xml,
+ xml = xml_attr_rewrite(xml_for_way(way),
"version", current_way_version + 1)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict, "should have failed on skipped version number"
# try and submit total crap in the version field
- xml = xml_attr_rewrite(way.to_xml,
+ xml = xml_attr_rewrite(xml_for_way(way),
"version", "p1r4t3s!")
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :conflict,
"should not be able to put 'p1r4at3s!' in the version field"
## try an update with the wrong ID
- xml = create(:way).to_xml
+ xml = xml_for_way(create(:way))
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :bad_request,
"should not be able to update a way with a different ID from the XML"
"should not be able to update a way with non-OSM XML doc."
## finally, produce a good request which should work
- xml = way.to_xml
+ xml = xml_for_way(way)
put :update, :params => { :id => way.id }, :body => xml.to_s
assert_response :success, "a valid update request failed"
end
tag_xml["v"] = "yes"
# add the tag into the existing xml
- way_xml = private_way.to_xml
+ way_xml = xml_for_way(private_way)
way_xml.find("//osm/way").first << tag_xml
# try and upload it
tag_xml["v"] = "yes"
# add the tag into the existing xml
- way_xml = way.to_xml
+ way_xml = xml_for_way(way)
way_xml.find("//osm/way").first << tag_xml
# try and upload it
tag_xml["v"] = private_existing_tag.v
# add the tag into the existing xml
- way_xml = private_way.to_xml
+ way_xml = xml_for_way(private_way)
way_xml.find("//osm/way").first << tag_xml
# try and upload it
tag_xml["v"] = existing_tag.v
# add the tag into the existing xml
- way_xml = way.to_xml
+ way_xml = xml_for_way(way)
way_xml.find("//osm/way").first << tag_xml
# try and upload it
tag_xml["v"] = "foobar"
# add the tag into the existing xml
- way_xml = private_way.to_xml
+ way_xml = xml_for_way(private_way)
# add two copies of the tag
way_xml.find("//osm/way").first << tag_xml.copy(true) << tag_xml
tag_xml["v"] = "foobar"
# add the tag into the existing xml
- way_xml = way.to_xml
+ way_xml = xml_for_way(way)
# add two copies of the tag
way_xml.find("//osm/way").first << tag_xml.copy(true) << tag_xml
get :index, :params => { :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 3
get :index, :params => { :format => "rss", :limit => 2 }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 2
get :index, :params => { :id => changeset.id, :format => "rss" }
assert_response :success
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "item", :count => 3
get :feed, :params => { :format => :atom }
assert_response :success
assert_template "index"
- assert_equal "application/atom+xml", response.content_type
+ assert_equal "application/atom+xml", response.media_type
check_feed_result([changeset, closed_changeset])
end
get :feed, :params => { :format => :atom, :bbox => "4.5,4.5,5.5,5.5" }
assert_response :success
assert_template "index"
- assert_equal "application/atom+xml", response.content_type
+ assert_equal "application/atom+xml", response.media_type
check_feed_result([changeset, closed_changeset])
end
assert_response :success
assert_template "index"
- assert_equal "application/atom+xml", response.content_type
+ assert_equal "application/atom+xml", response.media_type
check_feed_result(changesets)
end
def test_index
user = create(:user)
create_list(:client_application, 2, :user => user)
+ create_list(:access_token, 2, :user => user)
get :index,
:params => { :display_name => user.display_name }
{ :controller => "traces", :action => "update", :id => "1" }
)
assert_routing(
- { :path => "/trace/1/delete", :method => :post },
- { :controller => "traces", :action => "delete", :id => "1" }
+ { :path => "/traces/1", :method => :delete },
+ { :controller => "traces", :action => "destroy", :id => "1" }
)
end
assert_equal new_details[:visibility], trace.visibility
end
- # Test deleting a trace
- def test_delete
+ # Test destroying a trace
+ def test_destroy
public_trace_file = create(:trace, :visibility => "public")
deleted_trace_file = create(:trace, :deleted)
# First with no auth
- post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }
+ delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }
assert_response :forbidden
# Now with some other user, which should fail
- post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => create(:user) }
+ delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => create(:user) }
assert_response :forbidden
# Now with a trace which doesn't exist
- post :delete, :params => { :display_name => create(:user).display_name, :id => 0 }, :session => { :user => create(:user) }
+ delete :destroy, :params => { :display_name => create(:user).display_name, :id => 0 }, :session => { :user => create(:user) }
assert_response :not_found
# Now with a trace has already been deleted
- post :delete, :params => { :display_name => deleted_trace_file.user.display_name, :id => deleted_trace_file.id }, :session => { :user => deleted_trace_file.user }
+ delete :destroy, :params => { :display_name => deleted_trace_file.user.display_name, :id => deleted_trace_file.id }, :session => { :user => deleted_trace_file.user }
assert_response :not_found
# Now with a trace that we are allowed to delete
- post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => public_trace_file.user }
+ delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => public_trace_file.user }
assert_response :redirect
assert_redirected_to :action => :index, :display_name => public_trace_file.user.display_name
trace = Trace.find(public_trace_file.id)
assert_equal false, trace.visible
- # Finally with a trace that is deleted by an admin
+ # Finally with a trace that is destroyed by an admin
public_trace_file = create(:trace, :visibility => "public")
admin = create(:administrator_user)
- post :delete, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => admin }
+ delete :destroy, :params => { :display_name => public_trace_file.user.display_name, :id => public_trace_file.id }, :session => { :user => admin }
assert_response :redirect
assert_redirected_to :action => :index, :display_name => public_trace_file.user.display_name
trace = Trace.find(public_trace_file.id)
def check_trace_feed(traces)
assert_response :success
assert_template "georss"
- assert_equal "application/rss+xml", @response.content_type
+ assert_equal "application/rss+xml", @response.media_type
assert_select "rss", :count => 1 do
assert_select "channel", :count => 1 do
assert_select "title"
def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx")
assert_response :success
assert_equal digest, Digest::MD5.hexdigest(response.body)
- assert_equal content_type, response.content_type
- assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"", @response.header["Content-Disposition"]
+ assert_equal content_type, response.media_type
+ assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"]
end
def check_trace_picture(trace)
assert_response :success
- assert_equal "image/gif", response.content_type
+ assert_equal "image/gif", response.media_type
assert_equal trace.large_picture, response.body
end
def check_trace_icon(trace)
assert_response :success
- assert_equal "image/gif", response.content_type
+ assert_equal "image/gif", response.media_type
assert_equal trace.icon_picture, response.body
end
end
assert_response :success
assert_equal "*", response.headers["Access-Control-Allow-Origin"]
- assert_nil response.content_type
+ assert_nil response.media_type
assert_equal "", response.body
end
assert_response :success
assert_nil response.headers["Access-Control-Allow-Origin"]
- assert_nil response.content_type
+ assert_nil response.media_type
assert_equal "", response.body
end
end
assert_in_delta 76.543 * OldNode::SCALE, node.longitude, 0.000001
end
- # Ensure the lat/lon is formatted as a decimal e.g. not 4.0e-05
- def test_lat_lon_xml_format
- node = build(:node, :latitude => 0.00004 * OldNode::SCALE, :longitude => 0.00008 * OldNode::SCALE)
-
- assert_match(/lat="0.0000400"/, node.to_xml.to_s)
- assert_match(/lon="0.0000800"/, node.to_xml.to_s)
- end
-
# Check that you can create a node and store it
def test_create
changeset = create(:changeset)
fill_in "password", :with => "test"
click_on "Login", :match => :first
end
+
+ def xml_for_node(node)
+ doc = OSM::API.new.get_xml_doc
+ doc.root << xml_node_for_node(node)
+ doc
+ end
+
+ def xml_node_for_node(node)
+ el = XML::Node.new "node"
+ el["id"] = node.id.to_s
+
+ OMHelper.add_metadata_to_xml_node(el, node, {}, {})
+
+ if node.visible?
+ el["lat"] = node.lat.to_s
+ el["lon"] = node.lon.to_s
+ end
+
+ OMHelper.add_tags_to_xml_node(el, node.node_tags)
+
+ el
+ end
+
+ def xml_for_way(way)
+ doc = OSM::API.new.get_xml_doc
+ doc.root << xml_node_for_way(way)
+ doc
+ end
+
+ def xml_node_for_way(way)
+ el = XML::Node.new "way"
+ el["id"] = way.id.to_s
+
+ OMHelper.add_metadata_to_xml_node(el, way, {}, {})
+
+ # make sure nodes are output in sequence_id order
+ ordered_nodes = []
+ way.way_nodes.each do |nd|
+ ordered_nodes[nd.sequence_id] = nd.node_id.to_s if nd.node&.visible?
+ end
+
+ ordered_nodes.each do |nd_id|
+ next unless nd_id && nd_id != "0"
+
+ node_el = XML::Node.new "nd"
+ node_el["ref"] = nd_id
+ el << node_el
+ end
+
+ OMHelper.add_tags_to_xml_node(el, way.way_tags)
+
+ el
+ end
+
+ def xml_for_relation(relation)
+ doc = OSM::API.new.get_xml_doc
+ doc.root << xml_node_for_relation(relation)
+ doc
+ end
+
+ def xml_node_for_relation(relation)
+ el = XML::Node.new "relation"
+ el["id"] = relation.id.to_s
+
+ OMHelper.add_metadata_to_xml_node(el, relation, {}, {})
+
+ relation.relation_members.each do |member|
+ member_el = XML::Node.new "member"
+ member_el["type"] = member.member_type.downcase
+ member_el["ref"] = member.member_id.to_s
+ member_el["role"] = member.member_role
+ el << member_el
+ end
+
+ OMHelper.add_tags_to_xml_node(el, relation.relation_tags)
+
+ el
+ end
+
+ class OMHelper
+ extend ObjectMetadata
+ end
end
end
+++ /dev/null
-/*!
- * Bowser - a browser detector
- * https://github.com/ded/bowser
- * MIT License | (c) Dustin Diaz 2015
- */
-
-!function (root, name, definition) {
- if (typeof module != 'undefined' && module.exports) module.exports = definition()
- else if (typeof define == 'function' && define.amd) define(name, definition)
- else root[name] = definition()
-}(this, 'bowser', function () {
- /**
- * See useragents.js for examples of navigator.userAgent
- */
-
- var t = true
-
- function detect(ua) {
-
- function getFirstMatch(regex) {
- var match = ua.match(regex);
- return (match && match.length > 1 && match[1]) || '';
- }
-
- function getSecondMatch(regex) {
- var match = ua.match(regex);
- return (match && match.length > 1 && match[2]) || '';
- }
-
- var iosdevice = getFirstMatch(/(ipod|iphone|ipad)/i).toLowerCase()
- , likeAndroid = /like android/i.test(ua)
- , android = !likeAndroid && /android/i.test(ua)
- , nexusMobile = /nexus\s*[0-6]\s*/i.test(ua)
- , nexusTablet = !nexusMobile && /nexus\s*[0-9]+/i.test(ua)
- , chromeos = /CrOS/.test(ua)
- , silk = /silk/i.test(ua)
- , sailfish = /sailfish/i.test(ua)
- , tizen = /tizen/i.test(ua)
- , webos = /(web|hpw)(o|0)s/i.test(ua)
- , windowsphone = /windows phone/i.test(ua)
- , samsungBrowser = /SamsungBrowser/i.test(ua)
- , windows = !windowsphone && /windows/i.test(ua)
- , mac = !iosdevice && !silk && /macintosh/i.test(ua)
- , linux = !android && !sailfish && !tizen && !webos && /linux/i.test(ua)
- , edgeVersion = getSecondMatch(/edg([ea]|ios)\/(\d+(\.\d+)?)/i)
- , versionIdentifier = getFirstMatch(/version\/(\d+(\.\d+)?)/i)
- , tablet = /tablet/i.test(ua) && !/tablet pc/i.test(ua)
- , mobile = !tablet && /[^-]mobi/i.test(ua)
- , xbox = /xbox/i.test(ua)
- , result
-
- if (/opera/i.test(ua)) {
- // an old Opera
- result = {
- name: 'Opera'
- , opera: t
- , version: versionIdentifier || getFirstMatch(/(?:opera|opr|opios)[\s\/](\d+(\.\d+)?)/i)
- }
- } else if (/opr\/|opios/i.test(ua)) {
- // a new Opera
- result = {
- name: 'Opera'
- , opera: t
- , version: getFirstMatch(/(?:opr|opios)[\s\/](\d+(\.\d+)?)/i) || versionIdentifier
- }
- }
- else if (/SamsungBrowser/i.test(ua)) {
- result = {
- name: 'Samsung Internet for Android'
- , samsungBrowser: t
- , version: versionIdentifier || getFirstMatch(/(?:SamsungBrowser)[\s\/](\d+(\.\d+)?)/i)
- }
- }
- else if (/Whale/i.test(ua)) {
- result = {
- name: 'NAVER Whale browser'
- , whale: t
- , version: getFirstMatch(/(?:whale)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (/MZBrowser/i.test(ua)) {
- result = {
- name: 'MZ Browser'
- , mzbrowser: t
- , version: getFirstMatch(/(?:MZBrowser)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (/coast/i.test(ua)) {
- result = {
- name: 'Opera Coast'
- , coast: t
- , version: versionIdentifier || getFirstMatch(/(?:coast)[\s\/](\d+(\.\d+)?)/i)
- }
- }
- else if (/focus/i.test(ua)) {
- result = {
- name: 'Focus'
- , focus: t
- , version: getFirstMatch(/(?:focus)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (/yabrowser/i.test(ua)) {
- result = {
- name: 'Yandex Browser'
- , yandexbrowser: t
- , version: versionIdentifier || getFirstMatch(/(?:yabrowser)[\s\/](\d+(\.\d+)?)/i)
- }
- }
- else if (/ucbrowser/i.test(ua)) {
- result = {
- name: 'UC Browser'
- , ucbrowser: t
- , version: getFirstMatch(/(?:ucbrowser)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (/mxios/i.test(ua)) {
- result = {
- name: 'Maxthon'
- , maxthon: t
- , version: getFirstMatch(/(?:mxios)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (/epiphany/i.test(ua)) {
- result = {
- name: 'Epiphany'
- , epiphany: t
- , version: getFirstMatch(/(?:epiphany)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (/puffin/i.test(ua)) {
- result = {
- name: 'Puffin'
- , puffin: t
- , version: getFirstMatch(/(?:puffin)[\s\/](\d+(?:\.\d+)?)/i)
- }
- }
- else if (/sleipnir/i.test(ua)) {
- result = {
- name: 'Sleipnir'
- , sleipnir: t
- , version: getFirstMatch(/(?:sleipnir)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (/k-meleon/i.test(ua)) {
- result = {
- name: 'K-Meleon'
- , kMeleon: t
- , version: getFirstMatch(/(?:k-meleon)[\s\/](\d+(?:\.\d+)+)/i)
- }
- }
- else if (windowsphone) {
- result = {
- name: 'Windows Phone'
- , osname: 'Windows Phone'
- , windowsphone: t
- }
- if (edgeVersion) {
- result.msedge = t
- result.version = edgeVersion
- }
- else {
- result.msie = t
- result.version = getFirstMatch(/iemobile\/(\d+(\.\d+)?)/i)
- }
- }
- else if (/msie|trident/i.test(ua)) {
- result = {
- name: 'Internet Explorer'
- , msie: t
- , version: getFirstMatch(/(?:msie |rv:)(\d+(\.\d+)?)/i)
- }
- } else if (chromeos) {
- result = {
- name: 'Chrome'
- , osname: 'Chrome OS'
- , chromeos: t
- , chromeBook: t
- , chrome: t
- , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
- }
- } else if (/edg([ea]|ios)/i.test(ua)) {
- result = {
- name: 'Microsoft Edge'
- , msedge: t
- , version: edgeVersion
- }
- }
- else if (/vivaldi/i.test(ua)) {
- result = {
- name: 'Vivaldi'
- , vivaldi: t
- , version: getFirstMatch(/vivaldi\/(\d+(\.\d+)?)/i) || versionIdentifier
- }
- }
- else if (sailfish) {
- result = {
- name: 'Sailfish'
- , osname: 'Sailfish OS'
- , sailfish: t
- , version: getFirstMatch(/sailfish\s?browser\/(\d+(\.\d+)?)/i)
- }
- }
- else if (/seamonkey\//i.test(ua)) {
- result = {
- name: 'SeaMonkey'
- , seamonkey: t
- , version: getFirstMatch(/seamonkey\/(\d+(\.\d+)?)/i)
- }
- }
- else if (/firefox|iceweasel|fxios/i.test(ua)) {
- result = {
- name: 'Firefox'
- , firefox: t
- , version: getFirstMatch(/(?:firefox|iceweasel|fxios)[ \/](\d+(\.\d+)?)/i)
- }
- if (/\((mobile|tablet);[^\)]*rv:[\d\.]+\)/i.test(ua)) {
- result.firefoxos = t
- result.osname = 'Firefox OS'
- }
- }
- else if (silk) {
- result = {
- name: 'Amazon Silk'
- , silk: t
- , version : getFirstMatch(/silk\/(\d+(\.\d+)?)/i)
- }
- }
- else if (/phantom/i.test(ua)) {
- result = {
- name: 'PhantomJS'
- , phantom: t
- , version: getFirstMatch(/phantomjs\/(\d+(\.\d+)?)/i)
- }
- }
- else if (/slimerjs/i.test(ua)) {
- result = {
- name: 'SlimerJS'
- , slimer: t
- , version: getFirstMatch(/slimerjs\/(\d+(\.\d+)?)/i)
- }
- }
- else if (/blackberry|\bbb\d+/i.test(ua) || /rim\stablet/i.test(ua)) {
- result = {
- name: 'BlackBerry'
- , osname: 'BlackBerry OS'
- , blackberry: t
- , version: versionIdentifier || getFirstMatch(/blackberry[\d]+\/(\d+(\.\d+)?)/i)
- }
- }
- else if (webos) {
- result = {
- name: 'WebOS'
- , osname: 'WebOS'
- , webos: t
- , version: versionIdentifier || getFirstMatch(/w(?:eb)?osbrowser\/(\d+(\.\d+)?)/i)
- };
- /touchpad\//i.test(ua) && (result.touchpad = t)
- }
- else if (/bada/i.test(ua)) {
- result = {
- name: 'Bada'
- , osname: 'Bada'
- , bada: t
- , version: getFirstMatch(/dolfin\/(\d+(\.\d+)?)/i)
- };
- }
- else if (tizen) {
- result = {
- name: 'Tizen'
- , osname: 'Tizen'
- , tizen: t
- , version: getFirstMatch(/(?:tizen\s?)?browser\/(\d+(\.\d+)?)/i) || versionIdentifier
- };
- }
- else if (/qupzilla/i.test(ua)) {
- result = {
- name: 'QupZilla'
- , qupzilla: t
- , version: getFirstMatch(/(?:qupzilla)[\s\/](\d+(?:\.\d+)+)/i) || versionIdentifier
- }
- }
- else if (/chromium/i.test(ua)) {
- result = {
- name: 'Chromium'
- , chromium: t
- , version: getFirstMatch(/(?:chromium)[\s\/](\d+(?:\.\d+)?)/i) || versionIdentifier
- }
- }
- else if (/chrome|crios|crmo/i.test(ua)) {
- result = {
- name: 'Chrome'
- , chrome: t
- , version: getFirstMatch(/(?:chrome|crios|crmo)\/(\d+(\.\d+)?)/i)
- }
- }
- else if (android) {
- result = {
- name: 'Android'
- , version: versionIdentifier
- }
- }
- else if (/safari|applewebkit/i.test(ua)) {
- result = {
- name: 'Safari'
- , safari: t
- }
- if (versionIdentifier) {
- result.version = versionIdentifier
- }
- }
- else if (iosdevice) {
- result = {
- name : iosdevice == 'iphone' ? 'iPhone' : iosdevice == 'ipad' ? 'iPad' : 'iPod'
- }
- // WTF: version is not part of user agent in web apps
- if (versionIdentifier) {
- result.version = versionIdentifier
- }
- }
- else if(/googlebot/i.test(ua)) {
- result = {
- name: 'Googlebot'
- , googlebot: t
- , version: getFirstMatch(/googlebot\/(\d+(\.\d+))/i) || versionIdentifier
- }
- }
- else {
- result = {
- name: getFirstMatch(/^(.*)\/(.*) /),
- version: getSecondMatch(/^(.*)\/(.*) /)
- };
- }
-
- // set webkit or gecko flag for browsers based on these engines
- if (!result.msedge && /(apple)?webkit/i.test(ua)) {
- if (/(apple)?webkit\/537\.36/i.test(ua)) {
- result.name = result.name || "Blink"
- result.blink = t
- } else {
- result.name = result.name || "Webkit"
- result.webkit = t
- }
- if (!result.version && versionIdentifier) {
- result.version = versionIdentifier
- }
- } else if (!result.opera && /gecko\//i.test(ua)) {
- result.name = result.name || "Gecko"
- result.gecko = t
- result.version = result.version || getFirstMatch(/gecko\/(\d+(\.\d+)?)/i)
- }
-
- // set OS flags for platforms that have multiple browsers
- if (!result.windowsphone && (android || result.silk)) {
- result.android = t
- result.osname = 'Android'
- } else if (!result.windowsphone && iosdevice) {
- result[iosdevice] = t
- result.ios = t
- result.osname = 'iOS'
- } else if (mac) {
- result.mac = t
- result.osname = 'macOS'
- } else if (xbox) {
- result.xbox = t
- result.osname = 'Xbox'
- } else if (windows) {
- result.windows = t
- result.osname = 'Windows'
- } else if (linux) {
- result.linux = t
- result.osname = 'Linux'
- }
-
- function getWindowsVersion (s) {
- switch (s) {
- case 'NT': return 'NT'
- case 'XP': return 'XP'
- case 'NT 5.0': return '2000'
- case 'NT 5.1': return 'XP'
- case 'NT 5.2': return '2003'
- case 'NT 6.0': return 'Vista'
- case 'NT 6.1': return '7'
- case 'NT 6.2': return '8'
- case 'NT 6.3': return '8.1'
- case 'NT 10.0': return '10'
- default: return undefined
- }
- }
-
- // OS version extraction
- var osVersion = '';
- if (result.windows) {
- osVersion = getWindowsVersion(getFirstMatch(/Windows ((NT|XP)( \d\d?.\d)?)/i))
- } else if (result.windowsphone) {
- osVersion = getFirstMatch(/windows phone (?:os)?\s?(\d+(\.\d+)*)/i);
- } else if (result.mac) {
- osVersion = getFirstMatch(/Mac OS X (\d+([_\.\s]\d+)*)/i);
- osVersion = osVersion.replace(/[_\s]/g, '.');
- } else if (iosdevice) {
- osVersion = getFirstMatch(/os (\d+([_\s]\d+)*) like mac os x/i);
- osVersion = osVersion.replace(/[_\s]/g, '.');
- } else if (android) {
- osVersion = getFirstMatch(/android[ \/-](\d+(\.\d+)*)/i);
- } else if (result.webos) {
- osVersion = getFirstMatch(/(?:web|hpw)os\/(\d+(\.\d+)*)/i);
- } else if (result.blackberry) {
- osVersion = getFirstMatch(/rim\stablet\sos\s(\d+(\.\d+)*)/i);
- } else if (result.bada) {
- osVersion = getFirstMatch(/bada\/(\d+(\.\d+)*)/i);
- } else if (result.tizen) {
- osVersion = getFirstMatch(/tizen[\/\s](\d+(\.\d+)*)/i);
- }
- if (osVersion) {
- result.osversion = osVersion;
- }
-
- // device type extraction
- var osMajorVersion = !result.windows && osVersion.split('.')[0];
- if (
- tablet
- || nexusTablet
- || iosdevice == 'ipad'
- || (android && (osMajorVersion == 3 || (osMajorVersion >= 4 && !mobile)))
- || result.silk
- ) {
- result.tablet = t
- } else if (
- mobile
- || iosdevice == 'iphone'
- || iosdevice == 'ipod'
- || android
- || nexusMobile
- || result.blackberry
- || result.webos
- || result.bada
- ) {
- result.mobile = t
- }
-
- // Graded Browser Support
- // http://developer.yahoo.com/yui/articles/gbs
- if (result.msedge ||
- (result.msie && result.version >= 10) ||
- (result.yandexbrowser && result.version >= 15) ||
- (result.vivaldi && result.version >= 1.0) ||
- (result.chrome && result.version >= 20) ||
- (result.samsungBrowser && result.version >= 4) ||
- (result.whale && compareVersions([result.version, '1.0']) === 1) ||
- (result.mzbrowser && compareVersions([result.version, '6.0']) === 1) ||
- (result.focus && compareVersions([result.version, '1.0']) === 1) ||
- (result.firefox && result.version >= 20.0) ||
- (result.safari && result.version >= 6) ||
- (result.opera && result.version >= 10.0) ||
- (result.ios && result.osversion && result.osversion.split(".")[0] >= 6) ||
- (result.blackberry && result.version >= 10.1)
- || (result.chromium && result.version >= 20)
- ) {
- result.a = t;
- }
- else if ((result.msie && result.version < 10) ||
- (result.chrome && result.version < 20) ||
- (result.firefox && result.version < 20.0) ||
- (result.safari && result.version < 6) ||
- (result.opera && result.version < 10.0) ||
- (result.ios && result.osversion && result.osversion.split(".")[0] < 6)
- || (result.chromium && result.version < 20)
- ) {
- result.c = t
- } else result.x = t
-
- return result
- }
-
- var bowser = detect(typeof navigator !== 'undefined' ? navigator.userAgent || '' : '')
-
- bowser.test = function (browserList) {
- for (var i = 0; i < browserList.length; ++i) {
- var browserItem = browserList[i];
- if (typeof browserItem=== 'string') {
- if (browserItem in bowser) {
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Get version precisions count
- *
- * @example
- * getVersionPrecision("1.10.3") // 3
- *
- * @param {string} version
- * @return {number}
- */
- function getVersionPrecision(version) {
- return version.split(".").length;
- }
-
- /**
- * Array::map polyfill
- *
- * @param {Array} arr
- * @param {Function} iterator
- * @return {Array}
- */
- function map(arr, iterator) {
- var result = [], i;
- if (Array.prototype.map) {
- return Array.prototype.map.call(arr, iterator);
- }
- for (i = 0; i < arr.length; i++) {
- result.push(iterator(arr[i]));
- }
- return result;
- }
-
- /**
- * Calculate browser version weight
- *
- * @example
- * compareVersions(['1.10.2.1', '1.8.2.1.90']) // 1
- * compareVersions(['1.010.2.1', '1.09.2.1.90']); // 1
- * compareVersions(['1.10.2.1', '1.10.2.1']); // 0
- * compareVersions(['1.10.2.1', '1.0800.2']); // -1
- *
- * @param {Array<String>} versions versions to compare
- * @return {Number} comparison result
- */
- function compareVersions(versions) {
- // 1) get common precision for both versions, for example for "10.0" and "9" it should be 2
- var precision = Math.max(getVersionPrecision(versions[0]), getVersionPrecision(versions[1]));
- var chunks = map(versions, function (version) {
- var delta = precision - getVersionPrecision(version);
-
- // 2) "9" -> "9.0" (for precision = 2)
- version = version + new Array(delta + 1).join(".0");
-
- // 3) "9.0" -> ["000000000"", "000000009"]
- return map(version.split("."), function (chunk) {
- return new Array(20 - chunk.length).join("0") + chunk;
- }).reverse();
- });
-
- // iterate in reverse order by reversed chunks array
- while (--precision >= 0) {
- // 4) compare: "000000009" > "000000010" = false (but "9" > "10" = true)
- if (chunks[0][precision] > chunks[1][precision]) {
- return 1;
- }
- else if (chunks[0][precision] === chunks[1][precision]) {
- if (precision === 0) {
- // all version chunks are same
- return 0;
- }
- }
- else {
- return -1;
- }
- }
- }
-
- /**
- * Check if browser is unsupported
- *
- * @example
- * bowser.isUnsupportedBrowser({
- * msie: "10",
- * firefox: "23",
- * chrome: "29",
- * safari: "5.1",
- * opera: "16",
- * phantom: "534"
- * });
- *
- * @param {Object} minVersions map of minimal version to browser
- * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
- * @param {String} [ua] user agent string
- * @return {Boolean}
- */
- function isUnsupportedBrowser(minVersions, strictMode, ua) {
- var _bowser = bowser;
-
- // make strictMode param optional with ua param usage
- if (typeof strictMode === 'string') {
- ua = strictMode;
- strictMode = void(0);
- }
-
- if (strictMode === void(0)) {
- strictMode = false;
- }
- if (ua) {
- _bowser = detect(ua);
- }
-
- var version = "" + _bowser.version;
- for (var browser in minVersions) {
- if (minVersions.hasOwnProperty(browser)) {
- if (_bowser[browser]) {
- if (typeof minVersions[browser] !== 'string') {
- throw new Error('Browser version in the minVersion map should be a string: ' + browser + ': ' + String(minVersions));
- }
-
- // browser version and min supported version.
- return compareVersions([version, minVersions[browser]]) < 0;
- }
- }
- }
-
- return strictMode; // not found
- }
-
- /**
- * Check if browser is supported
- *
- * @param {Object} minVersions map of minimal version to browser
- * @param {Boolean} [strictMode = false] flag to return false if browser wasn't found in map
- * @param {String} [ua] user agent string
- * @return {Boolean}
- */
- function check(minVersions, strictMode, ua) {
- return !isUnsupportedBrowser(minVersions, strictMode, ua);
- }
-
- bowser.isUnsupportedBrowser = isUnsupportedBrowser;
- bowser.compareVersions = compareVersions;
- bowser.check = check;
-
- /*
- * Set our detect method to the main bowser object so we can
- * reuse it to test other user agents.
- * This is needed to implement future tests.
- */
- bowser._detect = detect;
-
- /*
- * Set our detect public method to the main bowser object
- * This is needed to implement bowser in server side
- */
- bowser.detect = detect;
- return bowser
-});