]> git.openstreetmap.org Git - rails.git/commitdiff
Merge remote-tracking branch 'upstream/pull/3398'
authorTom Hughes <tom@compton.nu>
Wed, 16 Feb 2022 18:13:16 +0000 (18:13 +0000)
committerTom Hughes <tom@compton.nu>
Wed, 16 Feb 2022 18:13:16 +0000 (18:13 +0000)
56 files changed:
CONFIGURE.md
CONTRIBUTING.md
Gemfile
Gemfile.lock
INSTALL.md
app/controllers/api/traces_controller.rb
app/controllers/traces_controller.rb
app/models/relation.rb
app/models/trace.rb
app/models/user.rb
app/views/api/capabilities/show.builder
bin/setup
config/environments/development.rb
config/environments/production.rb
config/environments/test.rb
config/initializers/config.rb
config/initializers/content_security_policy.rb
config/initializers/inflections.rb
config/initializers/new_framework_defaults_7_0.rb [new file with mode: 0644]
config/initializers/permissions_policy.rb [new file with mode: 0644]
config/initializers/secure_headers.rb
config/locales/br.yml
config/locales/ca.yml
config/locales/de.yml
config/locales/es.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/fy.yml
config/locales/ia.yml
config/locales/kk-cyrl.yml
config/locales/nl.yml
config/locales/oc.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/ru.yml
config/locales/sat.yml
config/locales/sk.yml
config/locales/te.yml
config/locales/uk.yml
config/settings.yml
config/settings/test.yml
db/migrate/20201004105659_create_doorkeeper_tables.rb
db/migrate/20210510083028_create_active_storage_variant_records.active_storage.rb
db/migrate/20211216185316_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb [new file with mode: 0644]
db/structure.sql
lib/gpx.rb
lib/osm.rb
lib/tasks/migrate_traces_to_storage.rake [new file with mode: 0644]
script/vagrant/setup/provision.sh
test/controllers/api/capabilities_controller_test.rb
test/controllers/api/traces_controller_test.rb
test/controllers/traces_controller_test.rb
test/factories/traces.rb
test/models/relation_test.rb
test/models/trace_test.rb
yarn.lock

index f7638a49a61c09c2b9ca5516eb1420cb75d37bd0..9bf5e16bb41be3e7e4a56408107180753ca2807b 100644 (file)
@@ -30,9 +30,7 @@ If you create a user by signing up to your local website, you need to confirm th
 $ bundle exec rails console
 >> user = User.find_by(:display_name => "My New User Name")
 => #[ ... ]
->> user.status = "active"
-=> "active"
->> user.save!
+>> user.activate!
 => true
 >> quit
 ```
index 474c80b4f6eb3f6c6f293b8f47902f703ae7b3bc..aaa1b5d4b555b960d3d5a258e660c78f0ff6afe3 100644 (file)
@@ -38,8 +38,8 @@ bundle exec rails test:all
 
 You can view test coverage statistics by browsing the `coverage` directory.
 
-The tests are automatically run on Pull Requests and other commits with the
-results shown on [Travis CI](https://travis-ci.org/openstreetmap/openstreetmap-website).
+The tests are automatically run on Pull Requests and other commits via github
+actions. The results shown are within the PR display on github.
 
 ## Static Analysis
 
@@ -79,14 +79,6 @@ database, and update the list of available keys manually.
 Adding or removing keys to this list is therefore discouraged, but contributions
 to the descriptive texts are welcome.
 
-## Code Documentation
-
-To generate the HTML documentation of the API/rails code, run the command
-
-```
-rake doc:app
-```
-
 ## Committing
 
 When you submit patches, the project maintainer has to read them and
diff --git a/Gemfile b/Gemfile
index 7bb5d705452c52e8fdbc0d062e6d7bef4ef1cce2..8782fdfeffd47aef046f2f1db90366ffb6c8012d 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
 source "https://rubygems.org"
 
 # Require rails
-gem "rails", "6.1.4.4"
+gem "rails", "7.0.2.2"
 
 # Require json for multi_json
 gem "json"
@@ -43,7 +43,7 @@ gem "active_record_union"
 gem "bootstrap", "~> 4.5.0"
 gem "bootstrap_form", "~> 4.0"
 gem "cancancan"
-gem "composite_primary_keys", "~> 13.0.0"
+gem "composite_primary_keys", "~> 14.0.0"
 gem "config"
 gem "delayed_job_active_record"
 gem "http_accept_language", "~> 2.1.1"
@@ -51,7 +51,7 @@ gem "i18n-js", ">= 3.0.0"
 gem "oauth-plugin", ">= 0.5.1"
 gem "openstreetmap-deadlock_retry", ">= 1.3.1", :require => "deadlock_retry"
 gem "rack-cors"
-gem "rails-i18n", "~> 6.0.0"
+gem "rails-i18n", "~> 7.0.0"
 gem "rinku", ">= 2.0.6", :require => "rails_rinku"
 gem "strong_migrations"
 gem "validates_email_format_of", ">= 1.5.1"
@@ -151,7 +151,7 @@ group :test do
   gem "rubocop-performance"
   gem "rubocop-rails"
   gem "rubocop-rake"
-  gem "selenium-webdriver", "~> 3.142.7"
+  gem "selenium-webdriver"
   gem "simplecov", :require => false
   gem "simplecov-lcov", :require => false
   gem "webmock"
index d86a7cf9f95418e47a66548b862c2875e2ea736a..0c8b03bda03805271f95f9d35d25e28851f24ef5 100644 (file)
@@ -3,75 +3,81 @@ GEM
   specs:
     aasm (5.2.0)
       concurrent-ruby (~> 1.0)
-    actioncable (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actioncable (7.0.2.2)
+      actionpack (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
       nio4r (~> 2.0)
       websocket-driver (>= 0.6.1)
-    actionmailbox (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activestorage (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actionmailbox (7.0.2.2)
+      actionpack (= 7.0.2.2)
+      activejob (= 7.0.2.2)
+      activerecord (= 7.0.2.2)
+      activestorage (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
       mail (>= 2.7.1)
-    actionmailer (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      actionview (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+      net-imap
+      net-pop
+      net-smtp
+    actionmailer (7.0.2.2)
+      actionpack (= 7.0.2.2)
+      actionview (= 7.0.2.2)
+      activejob (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
       mail (~> 2.5, >= 2.5.4)
+      net-imap
+      net-pop
+      net-smtp
       rails-dom-testing (~> 2.0)
-    actionpack (6.1.4.4)
-      actionview (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
-      rack (~> 2.0, >= 2.0.9)
+    actionpack (7.0.2.2)
+      actionview (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
+      rack (~> 2.0, >= 2.2.0)
       rack-test (>= 0.6.3)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.0, >= 1.2.0)
     actionpack-page_caching (1.2.4)
       actionpack (>= 4.0.0)
-    actiontext (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activestorage (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actiontext (7.0.2.2)
+      actionpack (= 7.0.2.2)
+      activerecord (= 7.0.2.2)
+      activestorage (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
+      globalid (>= 0.6.0)
       nokogiri (>= 1.8.5)
-    actionview (6.1.4.4)
-      activesupport (= 6.1.4.4)
+    actionview (7.0.2.2)
+      activesupport (= 7.0.2.2)
       builder (~> 3.1)
       erubi (~> 1.4)
       rails-dom-testing (~> 2.0)
       rails-html-sanitizer (~> 1.1, >= 1.2.0)
     active_record_union (1.3.0)
       activerecord (>= 4.0)
-    activejob (6.1.4.4)
-      activesupport (= 6.1.4.4)
+    activejob (7.0.2.2)
+      activesupport (= 7.0.2.2)
       globalid (>= 0.3.6)
-    activemodel (6.1.4.4)
-      activesupport (= 6.1.4.4)
-    activerecord (6.1.4.4)
-      activemodel (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    activemodel (7.0.2.2)
+      activesupport (= 7.0.2.2)
+    activerecord (7.0.2.2)
+      activemodel (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
     activerecord-import (1.3.0)
       activerecord (>= 4.2)
-    activestorage (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
-      marcel (~> 1.0.0)
+    activestorage (7.0.2.2)
+      actionpack (= 7.0.2.2)
+      activejob (= 7.0.2.2)
+      activerecord (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
+      marcel (~> 1.0)
       mini_mime (>= 1.1.0)
-    activesupport (6.1.4.4)
+    activesupport (7.0.2.2)
       concurrent-ruby (~> 1.0, >= 1.0.2)
       i18n (>= 1.6, < 2)
       minitest (>= 5.1)
       tzinfo (~> 2.0)
-      zeitwerk (~> 2.3)
     addressable (2.8.0)
       public_suffix (>= 2.0.2, < 5.0)
-    annotate (3.1.1)
-      activerecord (>= 3.2, < 7.0)
+    annotate (3.2.0)
+      activerecord (>= 3.2, < 8.0)
       rake (>= 10.4, < 14.0)
     argon2 (2.1.1)
       ffi (~> 1.14)
@@ -80,8 +86,8 @@ GEM
     autoprefixer-rails (10.4.2.0)
       execjs (~> 2)
     aws-eventstream (1.2.0)
-    aws-partitions (1.553.0)
-    aws-sdk-core (3.126.0)
+    aws-partitions (1.554.0)
+    aws-sdk-core (3.126.1)
       aws-eventstream (~> 1, >= 1.0.2)
       aws-partitions (~> 1, >= 1.525.0)
       aws-sigv4 (~> 1.1)
@@ -124,8 +130,8 @@ GEM
     bzip2-ffi (1.1.0)
       ffi (~> 1.0)
     cancancan (3.3.0)
-    canonical-rails (0.2.13)
-      rails (>= 4.1, <= 7.0)
+    canonical-rails (0.2.14)
+      rails (>= 4.1, <= 7.1)
     capybara (3.36.0)
       addressable
       matrix
@@ -135,19 +141,19 @@ GEM
       rack-test (>= 0.6.3)
       regexp_parser (>= 1.5, < 3.0)
       xpath (~> 3.2)
-    childprocess (3.0.0)
+    childprocess (4.1.0)
     coderay (1.1.3)
-    composite_primary_keys (13.0.3)
-      activerecord (~> 6.1.0)
+    composite_primary_keys (14.0.4)
+      activerecord (~> 7.0.2)
     concurrent-ruby (1.1.9)
-    config (3.1.1)
+    config (4.0.0)
       deep_merge (~> 1.2, >= 1.2.1)
       dry-validation (~> 1.0, >= 1.0.0)
     connection_pool (2.2.5)
     crack (0.4.5)
       rexml
     crass (1.0.6)
-    dalli (3.2.0)
+    dalli (3.2.1)
     debug_inspector (1.1.0)
     deep_merge (1.2.2)
     delayed_job (4.1.10)
@@ -155,6 +161,7 @@ GEM
     delayed_job_active_record (4.1.7)
       activerecord (>= 3.0, < 8.0)
       delayed_job (>= 3.0, < 5)
+    digest (3.1.0)
     docile (1.4.0)
     doorkeeper (5.5.4)
       railties (>= 5)
@@ -173,7 +180,7 @@ GEM
     dry-logic (1.2.0)
       concurrent-ruby (~> 1.0)
       dry-core (~> 0.5, >= 0.5)
-    dry-schema (1.8.0)
+    dry-schema (1.9.0)
       concurrent-ruby (~> 1.0)
       dry-configurable (~> 0.13, >= 0.13.0)
       dry-core (~> 0.5, >= 0.5)
@@ -247,7 +254,7 @@ GEM
     html_tokenizer (0.0.7)
     htmlentities (4.3.4)
     http_accept_language (2.1.1)
-    i18n (1.9.1)
+    i18n (1.10.0)
       concurrent-ruby (~> 1.0)
     i18n-js (3.9.1)
       i18n (>= 0.6.6)
@@ -266,10 +273,11 @@ GEM
       ruby-vips (>= 2.0.17, < 3)
     image_size (3.0.1)
     in_threads (1.6.0)
+    io-wait (0.2.1)
     jbuilder (2.11.5)
       actionview (>= 5.0.0)
       activesupport (>= 5.0.0)
-    jmespath (1.5.0)
+    jmespath (1.6.0)
     jquery-rails (4.4.0)
       rails-dom-testing (>= 1, < 3)
       railties (>= 4.2.0)
@@ -286,7 +294,7 @@ GEM
     logstasher (2.1.5)
       activesupport (>= 5.2)
       request_store
-    loofah (2.13.0)
+    loofah (2.14.0)
       crass (~> 1.0.2)
       nokogiri (>= 1.5.9)
     mail (2.7.1)
@@ -299,10 +307,25 @@ GEM
     mini_mime (1.1.2)
     mini_portile2 (2.7.1)
     minitest (5.15.0)
-    msgpack (1.4.4)
+    msgpack (1.4.5)
     multi_json (1.15.0)
     multi_xml (0.6.0)
     multipart-post (2.1.1)
+    net-imap (0.2.3)
+      digest
+      net-protocol
+      strscan
+    net-pop (0.1.1)
+      digest
+      net-protocol
+      timeout
+    net-protocol (0.1.2)
+      io-wait
+      timeout
+    net-smtp (0.3.1)
+      digest
+      net-protocol
+      timeout
     nio4r (2.5.8)
     nokogiri (1.13.1)
       mini_portile2 (~> 2.7.0)
@@ -355,11 +378,11 @@ GEM
     parallel (1.21.0)
     parser (3.1.0.0)
       ast (~> 2.4.1)
-    pg (1.3.1)
+    pg (1.3.2)
     popper_js (1.16.0)
     progress (3.6.0)
     public_suffix (4.0.6)
-    puma (5.6.1)
+    puma (5.6.2)
       nio4r (~> 2.0)
     quad_tile (1.0.1)
     r2 (0.2.7)
@@ -370,26 +393,25 @@ GEM
     rack-openid (1.4.2)
       rack (>= 1.1.0)
       ruby-openid (>= 2.1.8)
-    rack-protection (2.1.0)
+    rack-protection (2.2.0)
       rack
     rack-test (1.1.0)
       rack (>= 1.0, < 3)
     rack-uri_sanitizer (0.0.2)
-    rails (6.1.4.4)
-      actioncable (= 6.1.4.4)
-      actionmailbox (= 6.1.4.4)
-      actionmailer (= 6.1.4.4)
-      actionpack (= 6.1.4.4)
-      actiontext (= 6.1.4.4)
-      actionview (= 6.1.4.4)
-      activejob (= 6.1.4.4)
-      activemodel (= 6.1.4.4)
-      activerecord (= 6.1.4.4)
-      activestorage (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+    rails (7.0.2.2)
+      actioncable (= 7.0.2.2)
+      actionmailbox (= 7.0.2.2)
+      actionmailer (= 7.0.2.2)
+      actionpack (= 7.0.2.2)
+      actiontext (= 7.0.2.2)
+      actionview (= 7.0.2.2)
+      activejob (= 7.0.2.2)
+      activemodel (= 7.0.2.2)
+      activerecord (= 7.0.2.2)
+      activestorage (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
       bundler (>= 1.15.0)
-      railties (= 6.1.4.4)
-      sprockets-rails (>= 2.0.0)
+      railties (= 7.0.2.2)
     rails-controller-testing (1.0.5)
       actionpack (>= 5.0.1.rc1)
       actionview (>= 5.0.1.rc1)
@@ -399,21 +421,22 @@ GEM
       nokogiri (>= 1.6)
     rails-html-sanitizer (1.4.2)
       loofah (~> 2.3)
-    rails-i18n (6.0.0)
+    rails-i18n (7.0.2)
       i18n (>= 0.7, < 2)
-      railties (>= 6.0.0, < 7)
-    railties (6.1.4.4)
-      actionpack (= 6.1.4.4)
-      activesupport (= 6.1.4.4)
+      railties (>= 6.0.0, < 8)
+    railties (7.0.2.2)
+      actionpack (= 7.0.2.2)
+      activesupport (= 7.0.2.2)
       method_source
-      rake (>= 0.13)
+      rake (>= 12.2)
       thor (~> 1.0)
+      zeitwerk (~> 2.5)
     rainbow (3.1.1)
     rake (13.0.6)
     rb-fsevent (0.11.1)
     rb-inotify (0.10.1)
       ffi (~> 1.0)
-    regexp_parser (2.2.0)
+    regexp_parser (2.2.1)
     request_store (1.5.1)
       rack (>= 1.4)
     rexml (3.2.5)
@@ -428,9 +451,9 @@ GEM
       rubocop-ast (>= 1.15.1, < 2.0)
       ruby-progressbar (~> 1.7)
       unicode-display_width (>= 1.4.0, < 3.0)
-    rubocop-ast (1.15.1)
+    rubocop-ast (1.15.2)
       parser (>= 3.0.1.1)
-    rubocop-minitest (0.17.1)
+    rubocop-minitest (0.17.2)
       rubocop (>= 0.90, < 2.0)
     rubocop-performance (1.13.2)
       rubocop (>= 1.7.0, < 2.0)
@@ -459,8 +482,9 @@ GEM
       sprockets-rails
       tilt
     secure_headers (6.3.3)
-    selenium-webdriver (3.142.7)
-      childprocess (>= 0.5, < 4.0)
+    selenium-webdriver (4.1.0)
+      childprocess (>= 0.5, < 5.0)
+      rexml (~> 3.2, >= 3.2.5)
       rubyzip (>= 1.2.2)
     simplecov (0.21.2)
       docile (~> 1.1)
@@ -468,7 +492,7 @@ GEM
       simplecov_json_formatter (~> 0.1)
     simplecov-html (0.12.3)
     simplecov-lcov (0.8.0)
-    simplecov_json_formatter (0.1.3)
+    simplecov_json_formatter (0.1.4)
     smart_properties (1.17.0)
     sprockets (4.0.2)
       concurrent-ruby (~> 1.0)
@@ -477,12 +501,14 @@ GEM
       actionpack (>= 5.2)
       activesupport (>= 5.2)
       sprockets (>= 3.0.0)
-    strong_migrations (0.7.9)
-      activerecord (>= 5)
+    strong_migrations (0.8.0)
+      activerecord (>= 5.2)
+    strscan (3.0.1)
     terser (1.1.8)
       execjs (>= 0.3.0, < 3)
     thor (1.2.1)
     tilt (2.0.10)
+    timeout (0.2.0)
     tzinfo (2.0.4)
       concurrent-ruby (~> 1.0)
     unicode-display_width (2.1.0)
@@ -523,7 +549,7 @@ DEPENDENCIES
   cancancan
   canonical-rails
   capybara (>= 2.15)
-  composite_primary_keys (~> 13.0.0)
+  composite_primary_keys (~> 14.0.0)
   config
   connection_pool
   dalli
@@ -568,9 +594,9 @@ DEPENDENCIES
   r2 (~> 0.2.7)
   rack-cors
   rack-uri_sanitizer
-  rails (= 6.1.4.4)
+  rails (= 7.0.2.2)
   rails-controller-testing
-  rails-i18n (~> 6.0.0)
+  rails-i18n (~> 7.0.0)
   rinku (>= 2.0.6)
   rotp
   rubocop
@@ -581,7 +607,7 @@ DEPENDENCIES
   sanitize
   sassc-rails
   secure_headers
-  selenium-webdriver (~> 3.142.7)
+  selenium-webdriver
   simplecov
   simplecov-lcov
   strong_migrations
index 1faf4bf2232a1fead17b43029eb52fd98c1392e7..68b0d120eed37af098e356d3b4b08fe8fa8cfa6e 100644 (file)
@@ -90,7 +90,7 @@ Installing other dependencies:
 
 * Install Homebrew from https://brew.sh/
 * Install the latest version of Ruby: `brew install ruby`
-* Install other dependencies: `brew install imagemagick libxml2 gd yarn pngcrush optipng pngquant jhead jpegoptim gifsicle svgo`
+* Install other dependencies: `brew install imagemagick libxml2 gd yarn pngcrush optipng pngquant jhead jpegoptim gifsicle svgo advancecomp`
 * Install Bundler: `gem install bundler` (you might need to `sudo gem install bundler` if you get an error about permissions - or see note below about [developer Ruby setup](#rbenv))
 
 You will need to tell `bundler` that `libxml2` is installed in a Homebrew location. If it uses the system-installed one then you will get errors installing the `libxml-ruby` gem later on<a name="macosx-bundle-config"></a>.
@@ -102,8 +102,7 @@ bundle config build.libxml-ruby --with-xml2-config=/usr/local/opt/libxml2/bin/xm
 If you want to run the tests, you need `geckodriver` as well:
 
 ```
-brew tap homebrew/cask
-brew cask install geckodriver
+brew install geckodriver
 ```
 
 Note that OS X does not have a /home directory by default, so if you are using the GPX functions, you will need to change the directories specified in config/application.yml.
index 9894441ff53d525703f13a8a39bb4e302a0b81e2..aa8a0600071c9c59546091011f568552f51d4767 100644 (file)
@@ -54,6 +54,8 @@ module Api
           send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
         elsif request.format == Mime[:gpx]
           send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
+        elsif trace.file.attached?
+          redirect_to rails_blob_path(trace.file, :disposition => "attachment")
         else
           send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
         end
@@ -97,12 +99,6 @@ module Api
       # Sanitise the user's filename
       name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, "_")
 
-      # Get a temporary filename...
-      filename = "/tmp/#{rand}"
-
-      # ...and save the uploaded file to that location
-      File.binwrite(filename, file.read)
-
       # Create the trace object, falsely marked as already
       # inserted to stop the import daemon trying to load it
       trace = Trace.new(
@@ -110,40 +106,14 @@ module Api
         :tagstring => tags,
         :description => description,
         :visibility => visibility,
-        :inserted => true,
+        :inserted => false,
         :user => current_user,
-        :timestamp => Time.now.getutc
+        :timestamp => Time.now.getutc,
+        :file => file
       )
 
-      if trace.valid?
-        Trace.transaction do
-          begin
-            # Save the trace object
-            trace.save!
-
-            # Rename the temporary file to the final name
-            FileUtils.mv(filename, trace.trace_name)
-          rescue StandardError
-            # Remove the file as we have failed to update the database
-            FileUtils.rm_f(filename)
-
-            # Pass the exception on
-            raise
-          end
-
-          begin
-            # Clear the inserted flag to make the import daemon load the trace
-            trace.inserted = false
-            trace.save!
-          rescue StandardError
-            # Remove the file as we have failed to update the database
-            FileUtils.rm_f(trace.trace_name)
-
-            # Pass the exception on
-            raise
-          end
-        end
-      end
+      # Save the trace object
+      trace.save!
 
       # Finally save the user's preferred privacy level
       if pref = current_user.preferences.where(:k => "gps.trace.visibility").first
index 43977c3ce09b570d8f3cf6c351b181c16be4c936..a9dbc85396cb675381b074c88cfe8503e020fbe1 100644 (file)
@@ -99,12 +99,8 @@ class TracesController < ApplicationController
     logger.info(params[:trace][:gpx_file].class.name)
 
     if params[:trace][:gpx_file].respond_to?(:read)
-      begin
-        @trace = do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
-                           params[:trace][:description], params[:trace][:visibility])
-      rescue StandardError => e
-        logger.debug e
-      end
+      @trace = do_create(params[:trace][:gpx_file], params[:trace][:tagstring],
+                         params[:trace][:description], params[:trace][:visibility])
 
       if @trace.id
         flash[:notice] = t ".trace_uploaded"
@@ -141,6 +137,8 @@ class TracesController < ApplicationController
         send_data(trace.xml_file.read, :filename => "#{trace.id}.xml", :type => request.format.to_s, :disposition => "attachment")
       elsif request.format == Mime[:gpx]
         send_data(trace.xml_file.read, :filename => "#{trace.id}.gpx", :type => request.format.to_s, :disposition => "attachment")
+      elsif trace.file.attached?
+        redirect_to rails_blob_path(trace.file, :disposition => "attachment")
       else
         send_file(trace.trace_name, :filename => "#{trace.id}#{trace.extension_name}", :type => trace.mime_type, :disposition => "attachment")
       end
@@ -217,8 +215,12 @@ class TracesController < ApplicationController
 
     if trace.visible? && trace.inserted?
       if trace.public? || (current_user && current_user == trace.user)
-        expires_in 7.days, :private => !trace.public?, :public => trace.public?
-        send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => "image/gif", :disposition => "inline")
+        if trace.icon.attached?
+          redirect_to rails_blob_path(trace.image, :disposition => "inline")
+        else
+          expires_in 7.days, :private => !trace.public?, :public => trace.public?
+          send_file(trace.large_picture_name, :filename => "#{trace.id}.gif", :type => "image/gif", :disposition => "inline")
+        end
       else
         head :forbidden
       end
@@ -234,8 +236,12 @@ class TracesController < ApplicationController
 
     if trace.visible? && trace.inserted?
       if trace.public? || (current_user && current_user == trace.user)
-        expires_in 7.days, :private => !trace.public?, :public => trace.public?
-        send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => "image/gif", :disposition => "inline")
+        if trace.icon.attached?
+          redirect_to rails_blob_path(trace.icon, :disposition => "inline")
+        else
+          expires_in 7.days, :private => !trace.public?, :public => trace.public?
+          send_file(trace.icon_picture_name, :filename => "#{trace.id}_icon.gif", :type => "image/gif", :disposition => "inline")
+        end
       else
         head :forbidden
       end
@@ -252,62 +258,29 @@ class TracesController < ApplicationController
     # Sanitise the user's filename
     name = file.original_filename.gsub(/[^a-zA-Z0-9.]/, "_")
 
-    # Get a temporary filename...
-    filename = "/tmp/#{rand}"
-
-    # ...and save the uploaded file to that location
-    File.binwrite(filename, file.read)
-
-    # Create the trace object, falsely marked as already
-    # inserted to stop the import daemon trying to load it
+    # Create the trace object
     trace = Trace.new(
       :name => name,
       :tagstring => tags,
       :description => description,
       :visibility => visibility,
-      :inserted => true,
+      :inserted => false,
       :user => current_user,
-      :timestamp => Time.now.getutc
+      :timestamp => Time.now.getutc,
+      :file => file
     )
 
-    if trace.valid?
-      Trace.transaction do
-        begin
-          # Save the trace object
-          trace.save!
-
-          # Rename the temporary file to the final name
-          FileUtils.mv(filename, trace.trace_name)
-        rescue StandardError
-          # Remove the file as we have failed to update the database
-          FileUtils.rm_f(filename)
-
-          # Pass the exception on
-          raise
-        end
-
-        begin
-          # Clear the inserted flag to make the import daemon load the trace
-          trace.inserted = false
-          trace.save!
-        rescue StandardError
-          # Remove the file as we have failed to update the database
-          FileUtils.rm_f(trace.trace_name)
-
-          # Pass the exception on
-          raise
-        end
+    # Save the trace object
+    if trace.save
+      # Finally save the user's preferred privacy level
+      if pref = current_user.preferences.where(:k => "gps.trace.visibility").first
+        pref.v = visibility
+        pref.save
+      else
+        current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
       end
     end
 
-    # Finally save the user's preferred privacy level
-    if pref = current_user.preferences.where(:k => "gps.trace.visibility").first
-      pref.v = visibility
-      pref.save
-    else
-      current_user.preferences.create(:k => "gps.trace.visibility", :v => visibility)
-    end
-
     trace
   end
 
index a231feddb7fe45427ab5039a1b453e6adce393f6..4200a08dd7c709da827e405759c7d5df968a5672 100644 (file)
@@ -206,6 +206,8 @@ class Relation < ApplicationRecord
   end
 
   def preconditions_ok?(good_members = [])
+    raise OSM::APITooManyRelationMembersError.new(id, members.length, Settings.max_number_of_relation_members) if members.length > Settings.max_number_of_relation_members
+
     # These are hastables that store an id in the index of all
     # the nodes/way/relations that have already been added.
     # If the member is valid and visible then we add it to the
index b3d87fc0947be767264db9300b5426b909375415..bdafdd9d5c9116f4340ddd0af108fa86abbf549a 100644 (file)
@@ -39,6 +39,10 @@ class Trace < ApplicationRecord
   scope :visible_to_all, -> { where(:visibility => %w[public identifiable]) }
   scope :tagged, ->(t) { joins(:tags).where(:gpx_file_tags => { :tag => t }) }
 
+  has_one_attached :file, :service => Settings.trace_file_storage
+  has_one_attached :image, :service => Settings.trace_image_storage
+  has_one_attached :icon, :service => Settings.trace_icon_storage
+
   validates :user, :presence => true, :associated => true
   validates :name, :presence => true, :length => 1..255, :characters => true
   validates :description, :presence => { :on => :create }, :length => 1..255, :characters => true
@@ -46,6 +50,7 @@ class Trace < ApplicationRecord
   validates :visibility, :inclusion => %w[private public trackable identifiable]
 
   after_destroy :remove_files
+  after_save :set_filename
 
   def tagstring
     tags.collect(&:tag).join(", ")
@@ -68,6 +73,18 @@ class Trace < ApplicationRecord
                 end
   end
 
+  def file=(attachable)
+    case attachable
+    when ActionDispatch::Http::UploadedFile, Rack::Test::UploadedFile
+      super(:io => attachable,
+            :filename => attachable.original_filename,
+            :content_type => content_type(attachable.path),
+            :identify => false)
+    else
+      super(attachable)
+    end
+  end
+
   def public?
     visibility == "public" || visibility == "identifiable"
   end
@@ -80,29 +97,27 @@ class Trace < ApplicationRecord
     visibility == "identifiable"
   end
 
-  def large_picture=(data)
-    f = File.new(large_picture_name, "wb")
-    f.syswrite(data)
-    f.close
-  end
-
-  def icon_picture=(data)
-    f = File.new(icon_picture_name, "wb")
-    f.syswrite(data)
-    f.close
-  end
-
   def large_picture
-    f = File.new(large_picture_name, "rb")
-    data = f.sysread(File.size(f.path))
-    f.close
+    if image.attached?
+      data = image.blob.download
+    else
+      f = File.new(large_picture_name, "rb")
+      data = f.sysread(File.size(f.path))
+      f.close
+    end
+
     data
   end
 
   def icon_picture
-    f = File.new(icon_picture_name, "rb")
-    data = f.sysread(File.size(f.path))
-    f.close
+    if icon.attached?
+      data = icon.blob.download
+    else
+      f = File.new(icon_picture_name, "rb")
+      data = f.sysread(File.size(f.path))
+      f.close
+    end
+
     data
   end
 
@@ -119,46 +134,22 @@ class Trace < ApplicationRecord
   end
 
   def mime_type
-    filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
-    gzipped = filetype.include?("gzip compressed")
-    bzipped = filetype.include?("bzip2 compressed")
-    zipped = filetype.include?("Zip archive")
-    tarred = filetype.include?("tar archive")
-
-    if gzipped
-      "application/x-gzip"
-    elsif bzipped
-      "application/x-bzip2"
-    elsif zipped
-      "application/x-zip"
-    elsif tarred
-      "application/x-tar"
+    if file.attached?
+      file.content_type
     else
-      "application/gpx+xml"
+      content_type(trace_name)
     end
   end
 
   def extension_name
-    filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
-    gzipped = filetype.include?("gzip compressed")
-    bzipped = filetype.include?("bzip2 compressed")
-    zipped = filetype.include?("Zip archive")
-    tarred = filetype.include?("tar archive")
-
-    if tarred && gzipped
-      ".tar.gz"
-    elsif tarred && bzipped
-      ".tar.bz2"
-    elsif tarred
-      ".tar"
-    elsif gzipped
-      ".gpx.gz"
-    elsif bzipped
-      ".gpx.bz2"
-    elsif zipped
-      ".zip"
-    else
-      ".gpx"
+    case mime_type
+    when "application/x-tar+gzip" then ".tar.gz"
+    when "application/x-tar+x-bzip2" then ".tar.bz2"
+    when "application/x-tar" then ".tar"
+    when "application/zip" then ".zip"
+    when "application/gzip" then ".gpx.gz"
+    when "application/x-bzip2" then ".gpx.bz2"
+    else ".gpx"
     end
   end
 
@@ -207,106 +198,156 @@ class Trace < ApplicationRecord
   end
 
   def xml_file
-    filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
-    gzipped = filetype.include?("gzip compressed")
-    bzipped = filetype.include?("bzip2 compressed")
-    zipped = filetype.include?("Zip archive")
-    tarred = filetype.include?("tar archive")
-
-    if gzipped || bzipped || zipped || tarred
-      file = Tempfile.new("trace.#{id}")
-
-      if tarred && gzipped
-        system("tar", "-zxOf", trace_name, :out => file.path)
-      elsif tarred && bzipped
-        system("tar", "-jxOf", trace_name, :out => file.path)
-      elsif tarred
-        system("tar", "-xOf", trace_name, :out => file.path)
-      elsif gzipped
-        system("gunzip", "-c", trace_name, :out => file.path)
-      elsif bzipped
-        system("bunzip2", "-c", trace_name, :out => file.path)
-      elsif zipped
-        system("unzip", "-p", trace_name, "-x", "__MACOSX/*", :out => file.path, :err => "/dev/null")
+    with_trace_file do |trace_name|
+      filetype = Open3.capture2("/usr/bin/file", "-Lbz", trace_name).first.chomp
+      gzipped = filetype.include?("gzip compressed")
+      bzipped = filetype.include?("bzip2 compressed")
+      zipped = filetype.include?("Zip archive")
+      tarred = filetype.include?("tar archive")
+
+      if gzipped || bzipped || zipped || tarred
+        file = Tempfile.new("trace.#{id}")
+
+        if tarred && gzipped
+          system("tar", "-zxOf", trace_name, :out => file.path)
+        elsif tarred && bzipped
+          system("tar", "-jxOf", trace_name, :out => file.path)
+        elsif tarred
+          system("tar", "-xOf", trace_name, :out => file.path)
+        elsif gzipped
+          system("gunzip", "-c", trace_name, :out => file.path)
+        elsif bzipped
+          system("bunzip2", "-c", trace_name, :out => file.path)
+        elsif zipped
+          system("unzip", "-p", trace_name, "-x", "__MACOSX/*", :out => file.path, :err => "/dev/null")
+        end
+
+        file.unlink
+      else
+        file = File.open(trace_name)
       end
 
-      file.unlink
-    else
-      file = File.open(trace_name)
+      file
     end
-
-    file
   end
 
   def import
     logger.info("GPX Import importing #{name} (#{id}) from #{user.email}")
 
-    gpx = GPX::File.new(trace_name)
-
-    f_lat = 0
-    f_lon = 0
-    first = true
-
-    # If there are any existing points for this trace then delete them
-    Tracepoint.where(:gpx_id => id).delete_all
-
-    gpx.points.each_slice(1_000) do |points|
-      # Gather the trace points together for a bulk import
-      tracepoints = []
+    with_trace_file do |trace_name|
+      gpx = GPX::File.new(trace_name)
+
+      f_lat = 0
+      f_lon = 0
+      first = true
+
+      # If there are any existing points for this trace then delete them
+      Tracepoint.where(:gpx_id => id).delete_all
+
+      gpx.points.each_slice(1_000) do |points|
+        # Gather the trace points together for a bulk import
+        tracepoints = []
+
+        points.each do |point|
+          if first
+            f_lat = point.latitude
+            f_lon = point.longitude
+            first = false
+          end
+
+          tp = Tracepoint.new
+          tp.lat = point.latitude
+          tp.lon = point.longitude
+          tp.altitude = point.altitude
+          tp.timestamp = point.timestamp
+          tp.gpx_id = id
+          tp.trackid = point.segment
+          tracepoints << tp
+        end
 
-      points.each do |point|
-        if first
-          f_lat = point.latitude
-          f_lon = point.longitude
-          first = false
+        # Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import
+        tracepoints.each do |tp|
+          tp.run_callbacks(:save) { false }
+          tp.run_callbacks(:create) { false }
         end
 
-        tp = Tracepoint.new
-        tp.lat = point.latitude
-        tp.lon = point.longitude
-        tp.altitude = point.altitude
-        tp.timestamp = point.timestamp
-        tp.gpx_id = id
-        tp.trackid = point.segment
-        tracepoints << tp
+        Tracepoint.import!(tracepoints)
       end
 
-      # Run the before_save and before_create callbacks, and then import them in bulk with activerecord-import
-      tracepoints.each do |tp|
-        tp.run_callbacks(:save) { false }
-        tp.run_callbacks(:create) { false }
+      if gpx.actual_points.positive?
+        max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude)
+        min_lat = Tracepoint.where(:gpx_id => id).minimum(:latitude)
+        max_lon = Tracepoint.where(:gpx_id => id).maximum(:longitude)
+        min_lon = Tracepoint.where(:gpx_id => id).minimum(:longitude)
+
+        max_lat = max_lat.to_f / 10000000
+        min_lat = min_lat.to_f / 10000000
+        max_lon = max_lon.to_f / 10000000
+        min_lon = min_lon.to_f / 10000000
+
+        self.latitude = f_lat
+        self.longitude = f_lon
+        image.attach(:io => gpx.picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points), :filename => "#{id}.gif", :content_type => "image/gif")
+        icon.attach(:io => gpx.icon(min_lat, min_lon, max_lat, max_lon), :filename => "#{id}_icon.gif", :content_type => "image/gif")
+        self.size = gpx.actual_points
+        self.inserted = true
+        save!
       end
 
-      Tracepoint.import!(tracepoints)
+      logger.info "done trace #{id}"
+
+      gpx
     end
+  end
 
-    if gpx.actual_points.positive?
-      max_lat = Tracepoint.where(:gpx_id => id).maximum(:latitude)
-      min_lat = Tracepoint.where(:gpx_id => id).minimum(:latitude)
-      max_lon = Tracepoint.where(:gpx_id => id).maximum(:longitude)
-      min_lon = Tracepoint.where(:gpx_id => id).minimum(:longitude)
-
-      max_lat = max_lat.to_f / 10000000
-      min_lat = min_lat.to_f / 10000000
-      max_lon = max_lon.to_f / 10000000
-      min_lon = min_lon.to_f / 10000000
-
-      self.latitude = f_lat
-      self.longitude = f_lon
-      self.large_picture = gpx.picture(min_lat, min_lon, max_lat, max_lon, gpx.actual_points)
-      self.icon_picture = gpx.icon(min_lat, min_lon, max_lat, max_lon)
-      self.size = gpx.actual_points
-      self.inserted = true
-      save!
+  def migrate_to_storage!
+    file.attach(:io => File.open(trace_name),
+                :filename => name,
+                :content_type => content_type(trace_name),
+                :identify => false)
+
+    if inserted
+      image.attach(:io => File.open(large_picture_name),
+                   :filename => "#{id}.gif",
+                   :content_type => "image/gif")
+      icon.attach(:io => File.open(icon_picture_name),
+                  :filename => "#{id}_icon.gif",
+                  :content_type => "image/gif")
     end
 
-    logger.info "done trace #{id}"
+    save!
 
-    gpx
+    remove_files
   end
 
   private
 
+  def content_type(file)
+    case Open3.capture2("/usr/bin/file", "-Lbz", file).first.chomp
+    when /.*\btar archive\b.*\bgzip\b/ then "application/x-tar+gzip"
+    when /.*\btar archive\b.*\bbzip2\b/ then "application/x-tar+x-bzip2"
+    when /.*\btar archive\b/ then "application/x-tar"
+    when /.*\bZip archive\b/ then "application/zip"
+    when /.*\bXML\b.*\bgzip\b/ then "application/gzip"
+    when /.*\bXML\b.*\bbzip2\b/ then "application/x-bzip2"
+    else "application/gpx+xml"
+    end
+  end
+
+  def with_trace_file
+    if file.attached?
+      file.open do |file|
+        yield file.path
+      end
+    else
+      yield trace_name
+    end
+  end
+
+  def set_filename
+    file.blob.update(:filename => "#{id}#{extension_name}") if file.attached?
+  end
+
   def remove_files
     FileUtils.rm_f(trace_name)
     FileUtils.rm_f(icon_picture_name)
index 722d65302a3f155a1770cf3391413ee7ad12e8df..7a0d069927fa5da20e6aeecee4a52a841d76b1e2 100644 (file)
@@ -87,7 +87,7 @@ class User < ApplicationRecord
   scope :active, -> { where(:status => %w[active confirmed]) }
   scope :identifiable, -> { where(:data_public => true) }
 
-  has_one_attached :avatar
+  has_one_attached :avatar, :service => Settings.avatar_storage
 
   validates :display_name, :presence => true, :length => 3..255,
                            :exclusion => %w[new terms save confirm confirm-email go_public reset-password forgot-password suspended]
index 682373898be4398a2402a7668b620e12a946aa0a..b6a38723db2d37870c702d6d0119d5313df94c40 100644 (file)
@@ -6,6 +6,7 @@ xml.osm(OSM::API.new.xml_root_attributes) do |osm|
     api.note_area(:maximum => Settings.max_note_request_area)
     api.tracepoints(:per_page => Settings.tracepoints_per_page)
     api.waynodes(:maximum => Settings.max_number_of_way_nodes)
+    api.relationmembers(:maximum => Settings.max_number_of_relation_members)
     api.changesets(:maximum_elements => Changeset::MAX_ELEMENTS)
     api.timeout(:seconds => Settings.api_timeout)
     api.status(:database => @database_status,
index d0b0fbd57ea1321a55db21a46fad765497108248..ec47b79b3b3a002be18adafe9a5fcd070bcd808d 100755 (executable)
--- a/bin/setup
+++ b/bin/setup
@@ -17,12 +17,9 @@ FileUtils.chdir APP_ROOT do
   system! "gem install bundler --conservative"
   system("bundle check") || system!("bundle install")
 
-  # Install JavaScript dependencies
-  system! "bin/yarn"
-
   # puts "\n== Copying sample files =="
-  # unless File.exist?('config/database.yml')
-  #   FileUtils.cp 'config/database.yml.sample', 'config/database.yml'
+  # unless File.exist?("config/database.yml")
+  #   FileUtils.cp "config/database.yml.sample", "config/database.yml"
   # end
 
   puts "\n== Preparing database =="
index ab4f002200d2bfecbb4da6ec1895caf2f3956773..750a596b4378007829ed71ea9e9b961e6e97d72c 100644 (file)
@@ -14,6 +14,9 @@ Rails.application.configure do
   # Show full error reports.
   config.consider_all_requests_local = true
 
+  # Enable server timing
+  config.server_timing = true
+
   # Enable/disable caching. By default caching is disabled.
   # Run rails dev:cache to toggle caching.
   if Rails.root.join("tmp/caching-dev.txt").exist?
@@ -53,11 +56,6 @@ Rails.application.configure do
   # Highlight code that triggered database queries in logs.
   config.active_record.verbose_query_logs = true unless Settings.status == "database_offline"
 
-  # Debug mode disables concatenation and preprocessing of assets.
-  # This option may cause significant delays in view rendering with a large
-  # number of complex assets.
-  config.assets.debug = true
-
   # Suppress logger output for asset requests.
   config.assets.quiet = true
 
@@ -70,10 +68,6 @@ Rails.application.configure do
   # Annotate rendered view with file names.
   # config.action_view.annotate_rendered_view_with_filenames = 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
-
   # Uncomment if you wish to allow Action Cable access from any origin.
   # config.action_cable.disable_request_forgery_protection = true
 
index 5c72d449c9482b0ced37d6af054f9e6aab125f16..7dd3922a127e663485761be3d4118a887480be92 100644 (file)
@@ -32,19 +32,19 @@ Rails.application.configure do
   config.assets.compile = false
 
   # Enable serving of images, stylesheets, and JavaScripts from an asset server.
-  # config.asset_host = 'http://assets.example.com'
+  # config.asset_host = "http://assets.example.com"
 
   # Specifies the header that your server uses for sending files.
-  # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache
-  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX
+  # 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).
-  config.active_storage.service = Settings.storage_service.to_sym
+  config.active_storage.service = :local
 
   # 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.*/ ]
+  # config.action_cable.url = "wss://example.com/cable"
+  # config.action_cable.allowed_request_origins = [ "http://example.com", /http:\/\/example.*/ ]
 
   # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
   # config.force_ssl = true
@@ -79,21 +79,15 @@ Rails.application.configure do
   # the I18n.default_locale when a translation cannot be found).
   config.i18n.fallbacks = true
 
-  # Send deprecation notices to registered listeners.
-  config.active_support.deprecation = :notify
-
-  # Log disallowed deprecations.
-  config.active_support.disallowed_deprecation = :log
-
-  # Tell Active Support which deprecation messages to disallow.
-  config.active_support.disallowed_deprecation_warnings = []
+  # Don't log any deprecations.
+  config.active_support.report_deprecations = false
 
   # Use default logging formatter so that PID and timestamp are not suppressed.
   config.log_formatter = ::Logger::Formatter.new
 
   # Use a different logger for distributed setups.
-  # require 'syslog/logger'
-  # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new 'app-name')
+  # require "syslog/logger"
+  # config.logger = ActiveSupport::TaggedLogging.new(Syslog::Logger.new "app-name")
 
   if ENV["RAILS_LOG_TO_STDOUT"].present?
     logger           = ActiveSupport::Logger.new($stdout)
@@ -104,27 +98,6 @@ Rails.application.configure do
   # 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
 
index 007f2a3b4f539be8216ded62748d18fbc05f96d4..875716e507d5730a977668a2494ac1a587731311 100644 (file)
@@ -8,12 +8,13 @@ require "active_support/core_ext/integer/time"
 Rails.application.configure do
   # Settings specified here will take precedence over those in config/application.rb.
 
+  # Turn false under Spring and add config.action_view.cache_template_loading = true
   config.cache_classes = true
 
-  # Do not eager load code on boot. This avoids loading your whole application
-  # just for the purpose of running a single test. If you are using a tool that
-  # preloads Rails for running tests, you may have to set it to true.
-  config.eager_load = false
+  # Eager loading loads your whole application. When running a single test locally,
+  # this probably isn't necessary. It's a good idea to do in a continuous integration
+  # system, or in some way before deploying your code.
+  config.eager_load = ENV["CI"].present?
 
   # Configure public file server for tests with Cache-Control for performance.
   config.public_file_server.enabled = true
index d0f8c26fc31b7f5aef6877959006d3ea9b3c9125..e51281e11e034499b26e9ccba6b2bb795ee3456d 100644 (file)
@@ -74,9 +74,13 @@ Config.setup do |config|
     required(:max_note_request_area).filled(:number?)
     required(:tracepoints_per_page).filled(:int?)
     required(:max_number_of_way_nodes).filled(:int?)
+    required(:max_number_of_relation_members).filled(:int?)
     required(:api_timeout).filled(:int?)
     required(:imagery_blacklist).maybe(:array?)
     required(:status).filled(:str?, :included_in? => ALLOWED_STATUS)
-    required(:storage_service).filled(:str?)
+    required(:avatar_storage).filled(:str?)
+    required(:trace_file_storage).filled(:str?)
+    required(:trace_image_storage).filled(:str?)
+    required(:trace_icon_storage).filled(:str?)
   end
 end
index 35d0f26fcdc9416ca1e1ae6501393c7154853250..3621f97f8e9ff84ec7bbb50f0b0c619532b9de0e 100644 (file)
@@ -4,27 +4,23 @@
 # For further information see the following documentation
 # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy
 
-# Rails.application.config.content_security_policy do |policy|
-#   policy.default_src :self, :https
-#   policy.font_src    :self, :https, :data
-#   policy.img_src     :self, :https, :data
-#   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"
+# Rails.application.configure do
+#   config.content_security_policy do |policy|
+#     policy.default_src :self, :https
+#     policy.font_src    :self, :https, :data
+#     policy.img_src     :self, :https, :data
+#     policy.object_src  :none
+#     policy.script_src  :self, :https
+#     policy.style_src   :self, :https
+#     # Specify URI for violation reports
+#     # policy.report_uri "/csp-violation-report-endpoint"
+#   end
+#
+#   # Generate session nonces for permitted importmap and inline scripts
+#   config.content_security_policy_nonce_generator = ->(request) { request.session.id.to_s }
+#   config.content_security_policy_nonce_directives = %w(script-src)
+#
+#   # Report CSP violations to a specified URI. See:
+#   # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only
+#   # config.content_security_policy_report_only = true
 # end
-
-# 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
-# Rails.application.config.content_security_policy_report_only = true
index ac033bf9dc846101320c96a5ce8aceb8c96ec098..3860f659ead02224f524351d612cd92aefcd5d8b 100644 (file)
@@ -4,13 +4,13 @@
 # are locale specific, and you may define rules for as many different
 # locales as you wish. All of these examples are active by default:
 # ActiveSupport::Inflector.inflections(:en) do |inflect|
-#   inflect.plural /^(ox)$/i, '\1en'
-#   inflect.singular /^(ox)en/i, '\1'
-#   inflect.irregular 'person', 'people'
+#   inflect.plural /^(ox)$/i, "\\1en"
+#   inflect.singular /^(ox)en/i, "\\1"
+#   inflect.irregular "person", "people"
 #   inflect.uncountable %w( fish sheep )
 # end
 
 # These inflection rules are supported but not enabled by default:
 # ActiveSupport::Inflector.inflections(:en) do |inflect|
-#   inflect.acronym 'RESTful'
+#   inflect.acronym "RESTful"
 # end
diff --git a/config/initializers/new_framework_defaults_7_0.rb b/config/initializers/new_framework_defaults_7_0.rb
new file mode 100644 (file)
index 0000000..a579326
--- /dev/null
@@ -0,0 +1,117 @@
+# Be sure to restart your server when you modify this file.
+#
+# This file eases your Rails 7.0 framework defaults upgrade.
+#
+# Uncomment each configuration one by one to switch to the new default.
+# Once your application is ready to run with all new defaults, you can remove
+# this file and set the `config.load_defaults` to `7.0`.
+#
+# Read the Guide for Upgrading Ruby on Rails for more info on each option.
+# https://guides.rubyonrails.org/upgrading_ruby_on_rails.html
+
+# `button_to` view helper will render `<button>` element, regardless of whether
+# or not the content is passed as the first argument or as a block.
+# Rails.application.config.action_view.button_to_generates_button_tag = true
+
+# `stylesheet_link_tag` view helper will not render the media attribute by default.
+# Rails.application.config.action_view.apply_stylesheet_media_default = false
+
+# Change the digest class for the key generators to `OpenSSL::Digest::SHA256`.
+# Changing this default means invalidate all encrypted messages generated by
+# your application and, all the encrypted cookies. Only change this after you
+# rotated all the messages using the key rotator.
+#
+# See upgrading guide for more information on how to build a rotator.
+# https://guides.rubyonrails.org/v7.0/upgrading_ruby_on_rails.html
+# Rails.application.config.active_support.key_generator_hash_digest_class = OpenSSL::Digest::SHA256
+
+# Change the digest class for ActiveSupport::Digest.
+# Changing this default means that for example Etags change and
+# various cache keys leading to cache invalidation.
+# Rails.application.config.active_support.hash_digest_class = OpenSSL::Digest::SHA256
+
+# Don't override ActiveSupport::TimeWithZone.name and use the default Ruby
+# implementation.
+# Rails.application.config.active_support.remove_deprecated_time_with_zone_name = true
+
+# Change the format of the cache entry.
+# Changing this default means that all new cache entries added to the cache
+# will have a different format that is not supported by Rails 6.1 applications.
+# Only change this value after your application is fully deployed to Rails 7.0
+# and you have no plans to rollback.
+# Rails.application.config.active_support.cache_format_version = 7.0
+
+# Calls `Rails.application.executor.wrap` around test cases.
+# This makes test cases behave closer to an actual request or job.
+# Several features that are normally disabled in test, such as Active Record query cache
+# and asynchronous queries will then be enabled.
+# Rails.application.config.active_support.executor_around_test_case = true
+
+# Define the isolation level of most of Rails internal state.
+# If you use a fiber based server or job processor, you should set it to `:fiber`.
+# Otherwise the default of `:thread` if preferable.
+# Rails.application.config.active_support.isolation_level = :thread
+
+# Set both the `:open_timeout` and `:read_timeout` values for `:smtp` delivery method.
+# Rails.application.config.action_mailer.smtp_timeout = 5
+
+# The ActiveStorage video previewer will now use scene change detection to generate
+# better preview images (rather than the previous default of using the first frame
+# of the video).
+# Rails.application.config.active_storage.video_preview_arguments =
+#   "-vf 'select=eq(n\\,0)+eq(key\\,1)+gt(scene\\,0.015),loop=loop=-1:size=2,trim=start_frame=1' -frames:v 1 -f image2"
+
+# Automatically infer `inverse_of` for associations with a scope.
+# Rails.application.config.active_record.automatic_scope_inversing = true
+
+# Raise when running tests if fixtures contained foreign key violations
+# Rails.application.config.active_record.verify_foreign_keys_for_fixtures = true
+
+# Disable partial inserts.
+# This default means that all columns will be referenced in INSERT queries
+# regardless of whether they have a default or not.
+# Rails.application.config.active_record.partial_inserts = false
+#
+# Protect from open redirect attacks in `redirect_back_or_to` and `redirect_to`.
+# Rails.application.config.action_controller.raise_on_open_redirects = true
+
+# Change the variant processor for Active Storage.
+# Changing this default means updating all places in your code that
+# generate variants to use image processing macros and ruby-vips
+# operations. See the upgrading guide for detail on the changes required.
+# The `:mini_magick` option is not deprecated; it's fine to keep using it.
+# Rails.application.config.active_storage.variant_processor = :vips
+
+# If you're upgrading and haven't set `cookies_serializer` previously, your cookie serializer
+# was `:marshal`. Convert all cookies to JSON, using the `:hybrid` formatter.
+#
+# If you're confident all your cookies are JSON formatted, you can switch to the `:json` formatter.
+#
+# Continue to use `:marshal` for backward-compatibility with old cookies.
+#
+# If you have configured the serializer elsewhere, you can remove this.
+#
+# See https://guides.rubyonrails.org/action_controller_overview.html#cookies for more information.
+# Rails.application.config.action_dispatch.cookies_serializer = :hybrid
+
+# Enable parameter wrapping for JSON.
+# Previously this was set in an initializer. It's fine to keep using that initializer if you've customized it.
+# To disable parameter wrapping entirely, set this config to `false`.
+# Rails.application.config.action_controller.wrap_parameters_by_default = true
+
+# Specifies whether generated namespaced UUIDs follow the RFC 4122 standard for namespace IDs provided as a
+# `String` to `Digest::UUID.uuid_v3` or `Digest::UUID.uuid_v5` method calls.
+#
+# See https://guides.rubyonrails.org/configuring.html#config-active-support-use-rfc4122-namespaced-uuids for
+# more information.
+# Rails.application.config.active_support.use_rfc4122_namespaced_uuids = true
+
+# Change the default headers to disable browsers' flawed legacy XSS protection.
+# Rails.application.config.action_dispatch.default_headers = {
+#   "X-Frame-Options" => "SAMEORIGIN",
+#   "X-XSS-Protection" => "0",
+#   "X-Content-Type-Options" => "nosniff",
+#   "X-Download-Options" => "noopen",
+#   "X-Permitted-Cross-Domain-Policies" => "none",
+#   "Referrer-Policy" => "strict-origin-when-cross-origin"
+# }
diff --git a/config/initializers/permissions_policy.rb b/config/initializers/permissions_policy.rb
new file mode 100644 (file)
index 0000000..00f64d7
--- /dev/null
@@ -0,0 +1,11 @@
+# Define an application-wide HTTP permissions policy. For further
+# information see https://developers.google.com/web/updates/2018/06/feature-policy
+#
+# Rails.application.config.permissions_policy do |f|
+#   f.camera      :none
+#   f.gyroscope   :none
+#   f.microphone  :none
+#   f.usb         :none
+#   f.fullscreen  :self
+#   f.payment     :self, "https://secure.example.com"
+# end
index f09759fa6f40b06077676258f704d64378d67de7..97952f7cbc08c80f8f97f294018f5a9fc016554c 100644 (file)
@@ -22,7 +22,8 @@ csp_policy[:connect_src] << PIWIK["location"] if defined?(PIWIK)
 csp_policy[:img_src] << PIWIK["location"] if defined?(PIWIK)
 csp_policy[:script_src] << PIWIK["location"] if defined?(PIWIK)
 
-csp_policy[:img_src] << Settings.storage_url if Settings.key?(:storage_url)
+csp_policy[:img_src] << Settings.avatar_storage_url if Settings.key?(:avatar_storage_url)
+csp_policy[:img_src] << Settings.trace_image_storage_url if Settings.key?(:trace_image_storage_url)
 
 csp_policy[:report_uri] << Settings.csp_report_url if Settings.key?(:csp_report_url)
 
index 936eafb6350e536748c590fa3adbe3b786b63842..b31d488c011e8a8f00e59efe9d5f216ff1518445 100644 (file)
@@ -1494,7 +1494,7 @@ br:
     hosting_partners_html: Kemeret eo an herberc'hiañ e karg gant %{ucl}, %{fastly},
       %{bytemark}, ha %{partners} all.
     partners_ucl: ↓"Universiy College" Londrez
-    partners_fastly: Buan
+    partners_fastly: Fastly
     partners_bytemark: ↓Herberc'hiañ Bytemark
     partners_partners: Kevelourien
     tou: Termenoù implijout
index 5cb0fa29b45444ddc93e2e087072d00212196cfa..5f0fc6978c1102a0b5d6a301f02fc8b02f37a8d2 100644 (file)
@@ -1550,7 +1550,7 @@ ca:
     hosting_partners_html: L'allotjament és a càrrec de %{ucl}, %{fastly}, %{bytemark}
       i d'altres %{partners}.
     partners_ucl: UCL
-    partners_fastly: Ràpid
+    partners_fastly: Fastly
     partners_bytemark: Bytemark Hosting
     partners_partners: socis
     tou: Condicions d’ús
index 2c15897e0f8c5b6566ff1499941f711de903593b..67ce88fbbe41110f43ec2e225dad89bd5f8ae8f2 100644 (file)
@@ -1255,6 +1255,7 @@ de:
           "yes": Ort
         railway:
           abandoned: Aufgegebene Bahnstrecke
+          buffer_stop: Prellbock
           construction: Bahnstrecke im Bau
           disused: Aufgelassene Bahnstrecke
           funicular: Standseilbahn
@@ -1268,6 +1269,7 @@ de:
           platform: Bahnsteig
           preserved: Museumsbahn
           proposed: Geplante Bahnstrecke
+          rail: Bahn
           spur: Anschlussgleis
           station: Bahnhof
           stop: Haltepunkt
@@ -1276,6 +1278,7 @@ de:
           switch: Weiche
           tram: Straßenbahn
           tram_stop: Haltestelle
+          turntable: Drehschreibe
           yard: Rangierbahnhof
         shop:
           agrarian: Agrargeschäft
@@ -2827,6 +2830,8 @@ de:
       activate_user: Benutzer aktivieren
       deactivate_user: Benutzer deaktivieren
       confirm_user: Benutzer bestätigen
+      unconfirm_user: Diesen Benutzer nicht bestätigen
+      unsuspend_user: Diesen Benutzer freischalten
       hide_user: Benutzer verstecken
       unhide_user: Benutzer nicht mehr verstecken
       delete_user: Benutzer löschen
index c01437b9789ea064fbc79d588e8fd9b9cbcc5ad6..bb9a401d4d0edc6da4c5923717c49e425931a7c8 100644 (file)
@@ -73,6 +73,7 @@
 # Author: Ruila
 # Author: Sim6
 # Author: Sukanya121
+# Author: TehFrog
 # Author: Tiberius1701
 # Author: Toliño
 # Author: Translationista
@@ -102,7 +103,7 @@ es:
         create: Registrar
         update: Actualizar
       doorkeeper_application:
-        create: Registrarse
+        create: Registrar
         update: Actualizar
       redaction:
         create: Crear redacción
@@ -641,6 +642,9 @@ es:
         title: Entradas en el diario de OpenStreetMap
         description: Entradas recientes en los diarios de los usuarios de OpenStreetMap
     comments:
+      title: Comentarios diarios añadidos por %{user}
+      heading: Comentarios diarios de %{user}
+      subheading_html: Comentarios diarios añadidos por %{user}
       no_comments: Ningún comentario diario
       post: Publicación
       when: Cuando
@@ -965,6 +969,7 @@ es:
           trailhead: Inicio del sendero
           trunk: Vía rápida
           trunk_link: Enlace de vía rápida
+          turning_circle: Radio de giro
           turning_loop: Bucle de giro
           unclassified: Carretera sin clasificar
           "yes": Camino
@@ -1246,6 +1251,7 @@ es:
           "yes": Lugar
         railway:
           abandoned: Ferrocarril abandonado
+          buffer_stop: Parada de búfer
           construction: Vía ferroviaria en construcción
           disused: Ferrocarril en desuso
           funicular: Vía de funicular
@@ -1259,6 +1265,7 @@ es:
           platform: Andén
           preserved: Ferrocarril preservado
           proposed: Vía de tren proyectada
+          rail: Raíl
           spur: Ramal ferroviario
           station: Estación de trenes
           stop: Parada de tren
@@ -1267,6 +1274,7 @@ es:
           switch: Aguja de ferrocarril
           tram: Ruta de tranvía
           tram_stop: Parada de tranvía
+          turntable: Placa giratoria
           yard: Estación de clasificación
         shop:
           agrarian: Tienda agraria
@@ -1583,7 +1591,7 @@ es:
     hosting_partners_html: El alojamiento es apoyado por %{ucl}, %{fastly}, %{bytemark},
       y otros %{partners}.
     partners_ucl: UCL
-    partners_fastly: Rápido
+    partners_fastly: Fastly
     partners_bytemark: Bytemark Hosting
     partners_partners: socios
     tou: Términos de uso
@@ -1766,11 +1774,11 @@ es:
         de autenticación.
       unknown_token: Ese código de confirmación ha caducado o no existe.
     resend_success_flash:
-      confirmation_sent: Hemos enviado una nueva nota de confirmación a %{email} y
-        tan pronto como confirmes tu cuenta podrás obtener el mapeo.
-      whitelist: Si  utilizas un antispam sistema qué envía peticiones de confirmación
-        entonces complacen marca seguro tú whitelist %{sender} cuando  somos incapaces
-        de responder a cualesquier peticiones de confirmación.
+      confirmation_sent: Hemos enviado una nueva nota a %{email} y tan pronto como
+        confirmes tu cuenta podrás obtener mapeo.
+      whitelist: Si usas un sistema antispam que envía solicitudes de confirmación
+        entonces por favor asegúrate de incluir en la lista blanca %{sender}, ya que
+        no podemos responder ninguna solicitud de confirmación.
   messages:
     inbox:
       title: Buzón de entrada
@@ -2500,9 +2508,9 @@ es:
         traza</a> o aprende más sobre trazas GPS en la <a href='https://wiki.openstreetmap.org/wiki/ES:Gu%C3%ADa_del_principiante_1.2'>página
         wiki</a>.
       upload_trace: Subir una traza
-      all_traces: Todas las trazas
-      traces_from: Seguimientos públicos de %{user}
-      remove_tag_filter: Saca Filtro de Etiqueta
+      all_traces: Todos los trazos
+      traces_from: Trazos Públicos de %{user}
+      remove_tag_filter: Eliminar Filtro de Etiquetas
     destroy:
       scheduled_for_deletion: Traza programada para eliminación
     make_public:
@@ -2569,13 +2577,13 @@ es:
     permissions:
       missing: No ha permitido que la aplicación acceda a esta instalación.
     scopes:
-      read_prefs: Leer las preferencias del usuario
+      read_prefs: Leer preferiencias de usuario
       write_prefs: modificar sus preferencias de usuario.
-      write_diary: crear entradas en el diario, comentarios y hacer amigos.
+      write_diary: Crea entradas diarias, comentarios y haz amigos
       write_api: modificar el mapa.
       read_gpx: leer sus trazas de GPS privadas
       write_gpx: subir trazas de GPS
-      write_notes: Modificar notas
+      write_notes: Modifica notas
       read_email: Leer dirección de correo electrónico del usuario
       skip_authorization: Auto aprobar aplicación
   oauth_clients:
@@ -2621,21 +2629,21 @@ es:
       flash: Destruido el registro de aplicación del cliente
   oauth2_applications:
     index:
-      title: Mis aplicaciones cliente
+      title: Mis Aplicaciones de Cliente
       no_applications_html: ¿Tiene una aplicación que le gustaría registrar para usar
-        con nosotros usando el estándar% {oauth2}? Debe registrar su aplicación antes
-        de que pueda realizar solicitudes OAuth a este servicio.
+        con nosotros utilizando el estándar %{oauth2}? Debe registrar su aplicación
+        antes de que pueda hacer solicitudes OAuth a este servicio.
       new: Registre su aplicación
       name: Nombre
       permissions: Permisos
     application:
       edit: Ediciones
-      delete: Borrar
+      delete: Eliminar
       confirm_delete: Ver esta aplicación
     new:
       title: Registrar una nueva aplicación
     edit:
-      title: Registre su aplicación
+      title: Editar tu aplicación
     show:
       edit: Editar
       delete: Eliminar
@@ -2654,7 +2662,7 @@ es:
       introduction: ¿Autorizar a %{application} a acceder a su cuenta con los siguientes
         permisos?
       authorize: Autorizar →
-      deny: Negar
+      deny: Denegar
     error:
       title: Se produjo un error.
     show:
@@ -2666,7 +2674,7 @@ es:
       permissions: 'Permisos:'
       no_applications_html: Aún no ha autorizado ninguna aplicación %{oauth2}.
     application:
-      revoke: revocar el acceso
+      revoke: Revocar el acceso
       confirm_revoke: ¿Revocar el acceso a esta aplicación?
   users:
     new:
@@ -2781,6 +2789,8 @@ es:
       activate_user: Activar este usuario
       deactivate_user: Desactivar este usuario
       confirm_user: Confirmar este usuario
+      unconfirm_user: Desconfirmar este usuario
+      unsuspend_user: Desuspender este usuario
       hide_user: Ocultar este usuario
       unhide_user: Mostrar este usuario
       delete_user: Eliminar este usuario
index da8cf73d5df0d972a233c5a728459770f41d8b8b..628318744aab91c695917607a3c9c6fe1dc94505 100644 (file)
@@ -1512,7 +1512,7 @@ fi:
     hosting_partners_html: Palvelinkapasiteettia meille tarjoaa %{ucl}, %{fastly},
       %{bytemark} ja muut %{partners}.
     partners_ucl: UCL
-    partners_fastly: Nopeasti
+    partners_fastly: Fastly
     partners_bytemark: Bytemark Hosting
     partners_partners: kumppanimme
     tou: Käyttöehdot
index 23e0404a5f127814fa9a11271af1e670978aabb7..c67909394866d944b219f8694c1279a490138813 100644 (file)
@@ -386,7 +386,7 @@ fr:
     created_html: Créé à <abbr title="%{title}">%{time}</abbr>
     closed_html: Fermé <abbr title="%{title}">%{time}</abbr>
     created_by_html: Créé à <abbr title="%{title}">%{time}</abbr> par %{user}
-    deleted_by_html: Supprimé <abbr title='%{title}'>%{time}</abbr> par %{user}
+    deleted_by_html: Supprimé <abbr title="%{title}">%{time}</abbr> par %{user}
     edited_by_html: Modifié <abbr title="%{title}">%{time}</abbr> par %{user}
     closed_by_html: Fermé <abbr title="%{title}">%{time}</abbr> par %{user}
     version: Version
@@ -581,7 +581,7 @@ fr:
         votre domicile pour voir les utilisateurs à proximité.'
       edit_your_profile: Modifier votre profil
       my friends: Mes amis
-      no friends: Vous n’avez pas encore ajouté d’ami.
+      no friends: Vous n’avez encore ajouté aucun ami.
       nearby users: Autres utilisateurs à proximité
       no nearby users: Aucun utilisateur n’a encore signalé qu’il cartographiait à
         proximité.
@@ -660,10 +660,10 @@ fr:
         title: Entrées des journaux OpenStreetMap
         description: Entrées récentes des journaux d’utilisateurs de OpenStreetMap
     comments:
-      title: Commentaires d’agenda ajoutés par %{user}
-      heading: Commentaires d’agenda de %{user}
-      subheading_html: Commentaires d’agenda ajoutés par %{user}
-      no_comments: Aucun commentaire d’agenda
+      title: Commentaires de journal ajoutés par %{user}
+      heading: Commentaires de journal de %{user}
+      subheading_html: Commentaires de journal ajoutés par %{user}
+      no_comments: Aucun commentaire de journal
       post: Billet
       when: Quand
       comment: Commentaire
@@ -1960,8 +1960,8 @@ fr:
         cliquer sur le lien dans le courriel de confirmation pour activer votre compte,
         sinon <a href="%{reconfirm}">demandez un nouveau courriel de confirmation</a>.
       account is suspended: Désolé, votre compte a été suspendu en raison d’une activité
-        suspecte.<br /> Veuillez contacter le <a href="%{webmaster}">support</a> si
-        vous voulez en discuter.
+        suspecte.<br /> Veuillez contacter l’<a href="%{webmaster}">assistance en
+        ligne</a> si vous voulez en discuter.
       auth failure: Désolé, mais les informations fournies n’ont pas permis de vous
         identifier.
       openid_logo_alt: Se connecter avec un OpenID
@@ -2121,7 +2121,7 @@ fr:
           <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> : incorpore ou développé en utilissant Limites administratives &copy;
+          <strong>Australie</strong> : incorpore ou développé en utilisant les Limites administratives ©
           <a href="https://geoscape.com.au/legal/data-copyright-and-disclaimer/">Geoscape Australia</a> publiées sous la licence
           <a href="https://creativecommons.org/licenses/by/4.0/">Creative licence internationale Commons Attribution 4.0 (CC BY 4.0)</a>.
         contributors_ca_html: '<strong>Canada</strong> : contient des données de <em>GeoBase</em>®,
@@ -2190,7 +2190,7 @@ fr:
       license:
         copyright: Copyright OpenStreetMap et ses contributeurs, sous une licence
           ouverte
-      remote_failed: Échec de la modification – Vérifiez que l’éditeur externe JOSM
+      remote_failed: Échec de la modification — vérifiez que l’éditeur externe JOSM
         ou Merkaartor est ouvert et que l’option de contrôle à distance de l’application
         est activée.
     edit:
@@ -2440,10 +2440,12 @@ fr:
           de vitesse d’une route.
       rules:
         title: Règles !
-        paragraph_1_html: |-
-          OpenStreetMap a quelques règles formelles, mais nous attendons de tous les participants une collaboration et une communication avec la communauté. Si vous envisagez d’autres activités que la modification à la main, veuillez lire et suivre les directives sur
-          <a href="https://wiki.openstreetmap.org/wiki/Import/Guidelines">les importations</a> et
-          <a href="https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">les modifications automatiques</a>.
+        paragraph_1_html: OpenStreetMap a quelques règles formelles, mais nous attendons
+          de tous les participants une collaboration et une communication avec la
+          communauté. Si vous envisagez d’autres activités que la modification à la
+          main, veuillez lire et suivre les directives sur les <a href="https://wiki.openstreetmap.org/wiki/Import/Guidelines">importations</a>
+          et les <a href="https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct">modifications
+          automatiques</a>.
       questions:
         title: Des questions ?
         paragraph_1_html: |-
@@ -2599,7 +2601,7 @@ fr:
       allow_write_prefs: modifier vos préférences utilisateur ;
       allow_write_diary: créer pour vous des entrées dans votre journal, faire des
         commentaires et ajouter des amis ;
-      allow_write_api: modifier la carte ;
+      allow_write_api: modifier la carte.
       allow_read_gpx: lire vos traces GPS privées ;
       allow_write_gpx: envoyer des traces GPS en votre nom ;
       allow_write_notes: modifier des notes.
@@ -2620,13 +2622,14 @@ fr:
     scopes:
       read_prefs: Lire les préférences de l’utilisateur
       write_prefs: Modifier les préférences de l’utilisateur
-      write_diary: Créer les entrées d’agenda, les commentaires, et faire des amis
+      write_diary: Créer des entrées de journal, des commentaires et se faire des
+        amis
       write_api: Modifier la carte
       read_gpx: Lire les traces GPC privées
       write_gpx: Mettre à jour les traces GPC
       write_notes: Modifier les notes
-      read_email: Lire l'adresse e-mail de l'utilisateur
-      skip_authorization: Demande d'approbation automatique
+      read_email: Lire l’adresse courriel de l’utilisateur
+      skip_authorization: Demande dapprobation automatique
   oauth_clients:
     new:
       title: Enregistrer une nouvelle application
@@ -2648,11 +2651,10 @@ fr:
     index:
       title: Mes détails OAuth
       my_tokens: Mes applications enregistrées
-      list_tokens: 'Les jetons suivants ont été émis aux applications en votre nom
-        :'
+      list_tokens: 'Les jetons suivants ont été émis aux applications en votre nom :'
       application: Nom de l’application
-      issued_at: Ã©mis le
-      revoke: Révoquer !
+      issued_at: Ã\89mis le
+      revoke: Révoquer!
       my_apps: Mes applications clientes
       no_apps_html: Avez-vous une application qui aimerait s’enregistrer pour utiliser
         le standard %{oauth} ? Vous devez enregistrer votre application web avant
@@ -2695,7 +2697,7 @@ fr:
       confirm_delete: Supprimer cette application ?
       client_id: ID client
       client_secret: Secret du client
-      client_secret_warning: Assurez-vous de sauvegarder ce secret — il ne sera plus
+      client_secret_warning: Assurez-vous de sauvegarder ce secret — il ne sera plus
         accessible
       permissions: Autorisations
       redirect_uris: Rediriger les URIs
@@ -2717,7 +2719,7 @@ fr:
       title: Mes applications autorisées
       application: Application
       permissions: Droits
-      no_applications_html: Vous n’avez pas encore autorisé d’application %{oauth2}.
+      no_applications_html: Vous n’avez encore autorisé aucune application %{oauth2}.
     application:
       revoke: Révoquer l’accès
       confirm_revoke: Révoquer l’accès pour cette application ?
@@ -2727,7 +2729,7 @@ fr:
       no_auto_account_create: Malheureusement, nous sommes actuellement dans l’impossibilité
         de vous créer un compte automatiquement.
       contact_support_html: Veuillez contacter le <a href="%{support}">support</a>
-        pour qu’il vous crée un compte – nous essaierons de traiter votre demande
+        pour qu’il vous crée un compte — nous essaierons de traiter votre demande
         le plus rapidement possible.
       about:
         header: Libre et modifiable
@@ -2864,7 +2866,7 @@ fr:
     suspended:
       title: Compte suspendu
       heading: Compte suspendu
-      support: support
+      support: assistance
       body_html: |-
         <p>
           Désolé, votre compte a été suspendu en raison d’une
@@ -2991,9 +2993,9 @@ fr:
     show:
       title: « %{block_on} » bloqué par « %{block_by} »
       heading_html: « %{block_on} » bloqué par « %{block_by} »
-      created: 'Créé :'
-      duration: 'Durée :'
-      status: 'État :'
+      created: 'Créé:'
+      duration: 'Durée:'
+      status: 'État:'
       show: Afficher
       edit: Modifier
       revoke: Révoquer !
index 200e25b03a01f2d56d62a49f5de030f2d0e6cbd9..a5c397d5448a5c66537d37a97167ad42908f53e8 100644 (file)
@@ -24,8 +24,10 @@ fy:
       message:
         create: Ferstjoere
       client_application:
+        create: Registrearje
         update: Bywurkje
       doorkeeper_application:
+        create: Registrearje
         update: Bywurkje
       redaction:
         create: Redigearring oanmeitsje
@@ -68,10 +70,13 @@ fy:
       tracetag: Trajektlebel
       user: Meidogger
       user_preference: Meidoggerfoarkar
+      user_token: Meidoggerkaai
       way: Line
       way_node: Linepunt
       way_tag: Linelebel
     attributes:
+      client_application:
+        name: Namme (ferplichte)
       diary_comment:
         body: Ynhâld
       diary_entry:
@@ -82,6 +87,7 @@ fy:
         language: Taal
       doorkeeper/application:
         name: Namme
+        scopes: Rjochten
       friend:
         user: Meidogger
         friend: Freon
@@ -522,6 +528,11 @@ fy:
       comment: Reäksje
       newer_comments: Nijere reäksjes
       older_comments: Aldere reäksjes
+  doorkeeper:
+    flash:
+      applications:
+        create:
+          notice: Applikaasje registrearre.
   friendships:
     make_friend:
       heading: '%{user} as freon tafoegje?'
@@ -529,6 +540,8 @@ fy:
       success: '%{name} is no jo freon(dinne)!'
       failed: Spitich, %{name} as freon tafoegjen mislearre.
       already_a_friend: Jo binne al freonen mei %{name}.
+      limit_exceeded: Jo hawwe de lêste tiid in soad meidoggers freon makke. Wachtsje
+        in skoftke mei noch mear te meitsjen.
     remove_friend:
       heading: '%{user} as freon ôffiere?'
       button: Offiere
@@ -1599,6 +1612,8 @@ fy:
       back_to_inbox: Werom nei ynfek
     create:
       message_sent: Berjocht ferstjoerd
+      limit_exceeded: Jo hawwe de lêste tiid in soad berjochten ferstjoerd. Wachtsje
+        in skoftke mei noch mear te ferstjoeren.
     no_such_message:
       title: Berjocht ûnbekend
       heading: Berjocht ûnbekend
@@ -1859,29 +1874,54 @@ fy:
       longitude: 'Lgr.:'
       output: Utfier
       export_button: Eksportearje
+    fixthemap:
+      how_to_help:
+        add_a_note:
+          instructions_html: |-
+            Klik gewoan op <a class='icon note'></a> of itselde ikoan yn 'e kaartwerjefte.
+            Der komt in markearder op 'e kaart dy't jo
+            ferslepe kinne. Heakje jo berjocht ta, klik bewarje, en oare kaartmakkers sille it dan besjen.
     help:
       title: Help krije
+      introduction: |-
+        OpenStreetMap hat ferskate middels om oer it projekt te learen, foar it stellen en beäntwurdzjen fan fragen,
+        en yn gearwurking bepraten en fêstlizzen fan kartearringssaken.
       welcome:
         url: /welcome
         title: Wolkom by OpenStreetMap
+        description: Begjin mei dizze koarte útlis oer OpenStreetMap-basisdingen.
       beginners_guide:
         url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
         title: Paadwizer foar begjinners
+        description: Troch de mienskip byholden paadwizer foar begjinners.
       help:
         url: https://help.openstreetmap.org/
         title: Help-foarum
+        description: Stel in fraach of besjoch antwurden op OpenStreetMaps fraach-en-antwurdside.
       mailing_lists:
         title: Mailinglisten
+        description: Stel in fraach of bepraat nijsgjirrige saken op útienrinnende
+          tematyske as regionale mailinglisten.
       forums:
         title: Foarums
+        description: Fragen en oerlis foar dejingen dy't leaver yn pripboerd-styl
+          wurkje.
       irc:
         title: IRC
+        description: Ynteraktyf tsjetten yn ferskate talen en op alderlei mêd.
+      switch2osm:
+        title: switch2osm
+        description: Help foar bedriuwen en organisaasjes dy't oergeane op kaarten
+          en oare tsjinsten fan OpenStreetMap.
       welcomemat:
         url: https://welcome.openstreetmap.org/
         title: Foar organisaasjes
+        description: Mei in organisaasje plannen meitsje foar OpenStreetMap? Fyn wat
+          jo witte wolle op 'e Wolkom-matte.
       wiki:
         url: https://wiki.openstreetmap.org/
         title: OpenStreetMap-wiki
+        description: De wiki trochsjen foar wiidweidige dokumintaasje oer OpenStreetMap.
     sidebar:
       search_results: Sykresultaten
       close: Slute
@@ -1967,10 +2007,24 @@ fy:
           toilets: Húskes
     welcome:
       title: Wolkom!
+      introduction_html: |-
+        Wolkom by OpenStreetMap, de frije en bewurkbere wrâldkaart. No't jo ynskreaun binne,
+        binne jo hielendal klear foar jo earste bewurking. Hjir is in koarte útlis mei de wichtichste
+        dingen dy't jo witte moatte.
       whats_on_the_map:
         title: Wat stiet der op 'e kaart
+        on_html: |-
+          OpenStreetMap is in plak foar it ynkaartsjen fan dingen dy't <em>konkreet én aktueel</em> binne -
+          it befettet miljoenen gebouwen, diken en oare bysûnderheden oer plakken. Jo kinne
+          alle besteande skaaimerken dy't jo nijsgjirrich talykje op 'e kaart sette.
+        off_html: |-
+          Wat it <em>net</em> befettet is subjektive data lykas beoardielings, histoaryske as
+          ûnderstelde skaaimerken, en data út boarnen mei auteursrjocht.
+          Kopiearje net fan digitale as papieren kaarten sûnder spesjale tastimming dêrta.
       basic_terms:
         title: Basisbegripen foar it kaartmeitsjen
+        paragraph_1_html: OpenStreetMap hat in eigen taaltsje. Hjir binne in pear
+          kaaiwurden dy't fan pas komme sille.
         editor_html: In <strong>bewurker</strong> is in programma of webstee dat jo
           brûke kinne om 'e kaart te bewurkjen.
         node_html: In <strong>punt</strong> is in plak op 'e kaart, lykas in inkel
@@ -1981,11 +2035,28 @@ fy:
           lykas in restaurantnamme of de maksimum faasje fan in strjitte.
       rules:
         title: Regels!
+        paragraph_1_html: |-
+          OpenStreetMap hat net folle formele regels, mar wy ferwachtsje fan alle dielnimmers dat hja gearwurkje
+          en kommunisearje mei de mienskip. At jo faaks
+          wat oars dwaan wolle as mei de hân bewurkjen, lês en folgje dan de rjochtlinen foar
+          <a href='https://wiki.openstreetmap.org/wiki/Import/Guidelines'>Ymports</a> en
+          <a href='https://wiki.openstreetmap.org/wiki/Automated_Edits_code_of_conduct'>Automatisearre bewurkings</a>.
       questions:
         title: Noch fragen?
+        paragraph_1_html: |-
+          OpenStreetMap hat ferskate middels om oer it projekt te learen, foar it stellen en beäntwurdzjen
+          fan fragen, en yn gearwurking bepraten en fêstlizzen fan kartearringssaken.
+          <a href='%{help_url}'>Krij hjir help</a>. Mei in organisaasje plannen meitsje foar OpenStreetMap? <a href='https://welcome.openstreetmap.org/'>Besjoch de Wolkom-matte</a>.
       start_mapping: Set útein mei kaartmeitsjen
       add_a_note:
         title: Gjin tiid te bewurkjen? Meitsje in notysje!
+        paragraph_1_html: |-
+          At jo allinnich wat lyts oanpasse wolle, en gjin tiid hawwe yn te skriuwen en bewurkjen te learen, is
+          in notysje taheakjen noflik.
+        paragraph_2_html: |-
+          Gean gewoan nei <a href='%{map_url}'>de kaart</a>, en klik op it notysje-ikoan:
+          <span class='icon note'></span>. Der komt in markearder op 'e kaart dy't jo
+          ferslepe kinne. Heakje jo berjocht ta, klik bewarje, en oare kaartmakkers sille it dan besjen.
   traces:
     visibility:
       private: Privee (inkeld dield as anonime, net-oardere punten)
@@ -2080,28 +2151,88 @@ fy:
   application:
     settings_menu:
       account_settings: Akkountynstellings
-      oauth1_settings: OAuth 1-ynstellings
-      oauth2_applications: OAuth 2-applikaasjes
-      oauth2_authorizations: OAuth 2-autorisaasjes
+      oauth1_settings: Ynstellings OAuth 1
+      oauth2_applications: Applikaasjes OAuth 2
+      oauth2_authorizations: Autorisaasjes OAuth 2
   oauth:
+    authorize_failure:
+      invalid: De autorisaasjekaai is net jildich.
+    revoke:
+      flash: Jo hawwe de kaai foar %{application} ynlutsen
     scopes:
+      read_prefs: Meidoggerfoarkarren lêzen
+      write_prefs: Meidoggerfoarkarren wizigjen
+      write_diary: Deiboekstikken, reäksjes en freonen meitsjen
       write_api: Kaart wizigjen
+      read_gpx: Privee-GPS-trajekten lêzen
+      write_gpx: GPS-trajekten opladen
       write_notes: Notysjes wizigjen
+      read_email: Meidogger-e-mailadres lêzen
+      skip_authorization: Applikaasje automatysk goedkarren
+  oauth_clients:
+    show:
+      support_notice: Wy stypje ûndertekeningen mei HMAC-SHA1 (oanret) en RSA-SHA1.
+    index:
+      title: Myn OAuth-gegevens
+      my_tokens: Myn autorisearre applikaasjes
+      list_tokens: 'De neikommende kaaien binne ôfjûn oan applikaasjes op jo namme:'
+      application: Applikaasjenamme
+      issued_at: Ofjûn op
+      revoke: Ynlûke!
+      my_apps: Myn kliïnt-applikaasjes
+      no_apps_html: Hawwe jo in applikaasje dy't jo registrearje wolle foar gebrûk
+        by ús mei de %{oauth}-standert? Dan moatte jo jo webapplikaasje registrearje
+        foardat er OAuth-fersiken foar dy tsjinst dwaan kin.
+      oauth: OAuth
+      registered_apps: 'Jo hawwe de neikommende kliïnt-applikaasjes registrearre:'
+      register_new: Jo applikaasje registrearje
   oauth2_applications:
     index:
+      title: Myn kliïnt-applikaasjes
+      no_applications_html: Hawwe jo in applikaasje dy't jo registrearje wolle foar
+        gebrûk by ús mei de %{oauth2}-standert? Dan moatte jo jo applikaasje registrearje
+        foardat er OAuth-fersiken foar dy tsjinst dwaan kin.
+      oauth_2: OAuth 2
+      new: Nije applikaasje registrearje
       name: Namme
+      permissions: Rjochten
     application:
       edit: Bewurkje
       delete: Wiskje
+      confirm_delete: Dizze applikaasje wiskje?
+    new:
+      title: In nije applikaasje registrearje
+    edit:
+      title: Jo applikaasje bewurkje
     show:
       edit: Bewurkje
       delete: Wiskje
+      confirm_delete: Dizze applikaasje wiskje?
+      client_id: Kliïnt-ID
+      client_secret: Kliïnt-geheim
+      permissions: Rjochten
+    not_found:
+      sorry: Spitich, dy applikaasje koe net fûn wurde.
+  oauth2_authorizations:
+    new:
+      title: Autorisaasje frege
+      introduction: '%{application} autorisearje foar tagong ta jo akkount mei de
+        neikommende rjochten?'
+      authorize: Autorisearje
+      deny: Wegerje
+    error:
+      title: In flater die him foar
+    show:
+      title: Autorisaasjekoade
   oauth2_authorized_applications:
     index:
+      title: Myn autorisearre applikaasjes
       application: Applikaasje
       permissions: Rjochten
+      no_applications_html: Jo hawwe noch gjin %{oauth2}-applikaasjes autorisearre.
     application:
       revoke: Tagong ynlûke
+      confirm_revoke: Tagong foar dizze applikaasje ynlûke?
   users:
     new:
       title: Ynskriuwe
@@ -2219,7 +2350,23 @@ fy:
       heading: Meidoggers
     auth_failure:
       connection_failed: Ferbining mei de autentifikaasje-oanbieder mislearre
+      invalid_credentials: Unjildige autentifikaasjegegevens
+      no_authorization_code: Gjin autorisaasjekoade
+      unknown_signature_algorithm: Unbekend ûndertekeningsalgoritme
+      invalid_scope: Unjildich rjochtenberik
+      unknown_error: Autentifikaasje mislearre
+    auth_association:
+      heading: Jo ID is noch net ferbûn oan in OpenStreetMap-akkount.
+      option_1: |-
+        At jo nij binne op OpenStreetMap, meitsje dan graach in nij akkount
+        mei it formulier hjirûnder.
+      option_2: |-
+        At jo al in akkount hawwe, kinne jo jo oanmelde op jo akkount
+        mei jo meidochnamme en wachtwurd, en dan it akkount ferbine
+        oan jo ID yn jo meidoggerynstellings.
   user_blocks:
+    revoke:
+      revoke: Ynlûke!
     helper:
       block_duration:
         hours:
@@ -2240,8 +2387,10 @@ fy:
     show:
       status: 'Status:'
       edit: Bewurkje
+      revoke: Ynlûke!
     block:
       edit: Bewurkje
+      revoke: Ynlûke!
     blocks:
       status: Status
       showing_page: Side %{page}
index 0674097615fc718d7d961cf4b934388b907b17ce..1e9f29d3a681f50957a250eb460663a9b89707a4 100644 (file)
@@ -1184,6 +1184,7 @@ ia:
           platform: Platteforma ferroviari
           preserved: Ferrovia preservate
           proposed: Ferrovia proponite
+          rail: Rail
           spur: Ramification de ferrovia
           station: Station ferroviari
           stop: Halto ferroviari
@@ -1192,6 +1193,7 @@ ia:
           switch: Agulia
           tram: Tramvia
           tram_stop: Halto de tram
+          turntable: Placa tornante
           yard: Station de manovras
         shop:
           agrarian: Magazin agricole
@@ -2708,6 +2710,8 @@ ia:
       activate_user: Activar iste usator
       deactivate_user: Disactivar iste usator
       confirm_user: Confirmar iste usator
+      unconfirm_user: Disconfirmar iste usator
+      unsuspend_user: Non plus suspender iste usator
       hide_user: Celar iste usator
       unhide_user: Revelar iste usator
       delete_user: Deler iste usator
@@ -2742,6 +2746,7 @@ ia:
       no_authorization_code: Nulle codice de autorisation
       unknown_signature_algorithm: Algorithmo de signatura non cognoscite
       invalid_scope: Ambito non valide
+      unknown_error: Authentication fallite
     auth_association:
       heading: Tu ID non es ancora associate a un conto de OpenStreetMap.
       option_1: Si tu es nove in OpenStreetMap, per favor crea un conto per medio
index da7e998b2785f3e2fa628e098ae11b9766988264..a410df4b5428bf796f06c0c627120dd1c48ca458 100644 (file)
@@ -40,6 +40,7 @@ kk-cyrl:
     attributes:
       diary_entry:
         user: Қолданушы
+        title: Тақырып
         language: Тіл
       friend:
         user: Қолданушы
@@ -49,7 +50,14 @@ kk-cyrl:
         name: Файл атауы
         description: Сипаттама
         tagstring: Тегтер
+      message:
+        sender: Жіберуші
+        title: Тақырып
+        body: Мәтін
+        recipient: Алушы
       user:
+        email: Е-пошта
+        new_email: Жаңа е-пошта мекенжайы
         active: Белсенді
         description: Бейін сипаттамасы
         languages: Қолайлы тілдер
@@ -83,6 +91,7 @@ kk-cyrl:
         one: 1 жыл бұрын
         other: '%{count} жыл бұрын'
   editor:
+    default: Әдепкі (қазіргі уақытта %{name})
     id:
       name: iD
       description: iD (браузердегі редактор)
@@ -114,6 +123,7 @@ kk-cyrl:
         link text: бұл не?
       public editing:
         enabled link text: бұл не?
+        disabled link text: Неге өзгерістер енгізе алмаймын?
       contributor terms:
         link text: бұл не?
       save changes button: Өзгерістерді сақтау
@@ -126,6 +136,8 @@ kk-cyrl:
     download_xml: XML жүктеп алу
     location: 'Географиялық орны:'
     changeset:
+      comment: Пікірлер (%{count})
+      osmchangexml: osmChange XML
       discussion: Талқылау
     not_found:
       title: Табылмады
@@ -140,20 +152,28 @@ kk-cyrl:
       opened_by_html: <abbr title='%{exact_time}'>%{when}</abbr> %{user} жасаған
   changesets:
     changeset_paging_nav:
+      showing_page: '%{page}-беті'
       next: Келесі »
       previous: « Алдыңғы
     changeset:
       anonymous: Аноним
+    changesets:
+      id: ID
+      user: Қолданушы
     index:
       load_more: Көбірек жүктеу
   dashboards:
     popup:
       friend: Дос
+    show:
+      my friends: Достарым
+      friends_diaries: Достардың күнделік жазбалары
   diary_entries:
     new:
       title: Жаңа күнделік жазбасы
     index:
       title: Қолданушылардың күнделіктері
+      title_friends: Достардың күнделіктері
       in_language_title: '%{language} тіліндегі күнделік жазбалары'
       new: Жаңа күнделік жазбасы
       my_diary: Күнделігім
@@ -389,6 +409,7 @@ kk-cyrl:
           pitch: Спорт алаңы
           resort: Шипажай
           sauna: Сауна
+          sports_centre: Спорт орталығы
           stadium: Стадион
           water_park: Аквапарк
           "yes": Бос уақыт
@@ -615,18 +636,26 @@ kk-cyrl:
     history: Тарих
     export: Экспорттау
     intro_header: OpenStreetMap-ке қош келдіңіз!
+    partners_ucl: UCL
+    partners_fastly: Fastly
     partners_bytemark: Bytemark Hosting
     help: Анықтама
     about: Жоба туралы
     foundation_title: OpenStreetMap қоры
     learn_more: Көбірек білу
   user_mailer:
+    message_notification:
+      subject: '[OpenStreetMap] %{message_title}'
     gpx_success:
       subject: '[OpenStreetMap] GPX сәтті импортталды'
     signup_confirm:
       subject: '[OpenStreetMap] OpenStreetMap-ке қош келдіңіз'
   messages:
+    inbox:
+      subject: Тақырып
     message_summary:
+      unread_button: Оқылмаған деп белгілеу
+      read_button: Оқылды деп белгілеу
       reply_button: Жауап беру
       destroy_button: Жою
     show:
@@ -640,6 +669,10 @@ kk-cyrl:
     reset_password:
       flash changed: Құпия сөзіңіз өзгертілді.
   preferences:
+    show:
+      title: Қалауларым
+      preferred_editor: Қалаған редактор
+      preferred_languages: Қалаған тілдер
     edit:
       cancel: Болдырмау
   profiles:
@@ -648,9 +681,11 @@ kk-cyrl:
       cancel: Болдырмау
       image: Сурет
       gravatar:
+        gravatar: Gravatar қолдану
         what_is_gravatar: Gravatar деген не?
       new image: Сурет қосу
       keep image: Ағымдағы суретті сақтап қалу
+      delete image: Ағымдағы суретті жою
       replace image: Ағымдағы суретті алмастыру
     update:
       success: Бейін жаңартылды.
@@ -696,6 +731,8 @@ kk-cyrl:
         title: switch2osm
       welcomemat:
         title: Ұйымдар үшін
+      wiki:
+        title: OpenStreetMap Уики
     sidebar:
       search_results: Іздеу нәтижелері
       close: Жабу
@@ -716,10 +753,14 @@ kk-cyrl:
           - Көл
           farm: Ферма
           cemetery: Зират
+          pitch: Спорт алаңы
+          centre: Спорт орталығы
           school:
           - Мектеп
           - университет
           station: Темір жол бекеті
+          summit:
+            1: шың
           bicycle_shop: Велосипед дүкені
           toilets: Дәретхана
     welcome:
@@ -734,7 +775,12 @@ kk-cyrl:
     show:
       filename: 'Файл атауы:'
       download: жүктеп алу
+  oauth_clients:
+    index:
+      oauth: OAuth
   users:
+    new:
+      email address: 'Е-пошта мекенжайы:'
     terms:
       consider_pd_why: бұл не?
       continue: Жалғастыру
@@ -742,6 +788,14 @@ kk-cyrl:
         france: Франция
         italy: Италия
         rest_of_world: Қалған әлем
+    show:
+      my diary: Күнделігім
+      my settings: Баптауларым
+      my_preferences: Қалауларым
+      diary: Күнделік
+    index:
+      title: Қолданушылар
+      heading: Қолданушылар
   user_blocks:
     blocks:
       next: Келесі »
@@ -753,6 +807,7 @@ kk-cyrl:
       cancel: Болдырмау
       image: Сурет
       link: Сілтеме немесе HTML
+      long_link: Сілтеме
       geo_uri: Geo URI
       embed: HTML
       format: 'Форматы:'
@@ -765,11 +820,14 @@ kk-cyrl:
         title: Қабаттар
     changesets:
       show:
+        subscribe: Жазылу
         hide_comment: жасыру
     notes:
       show:
         hide: Жасыру
     directions:
+      engines:
+        fossgis_osrm_bike: Велосипед (OSRM)
       instructions:
         exit_counts:
           first: 1-ші
index 98b909a2888020b066f95307793ea8b861d91689..1f1f5bec3fdc540c8ccd628b4f2a402b0a4d2ab4 100644 (file)
@@ -42,6 +42,7 @@
 # Author: Nickthijssen1994
 # Author: NthnH
 # Author: Optilete
+# Author: P24
 # Author: Peb-kac
 # Author: Pje335
 # Author: Robin van der Linde
@@ -1436,7 +1437,7 @@ nl:
       title: Problemen
       select_status: Selecteer Status
       select_type: Selecteer Type
-      select_last_updated_by: Selecteer Laats Bijgewerkt Door
+      select_last_updated_by: Selecteer Laatst Bijgewerkt Door
       reported_user: Gerapporteerde Gebruiker
       not_updated: Niet Bijgewerkt
       search: Zoeken
@@ -1463,7 +1464,10 @@ nl:
       provide_details: Verschaf de vereiste details
     show:
       title: '%{status} Probleem #%{issue_id}'
-      reports: '{{PLURAL | zero = Geen rapporten | één = 1 rapport |%{count} rapporten}}'
+      reports:
+        one: 1 rapport
+        zero: Geen rapporten
+        other: '%{count} rapporten'
       report_created_at: Voor het eerst vermeld op %{datetime}
       last_resolved_at: Laatst opgelost op %{datetime}
       last_updated_at: Laatst bijgewerkt op %{datetime} door %{displayname}
index a08bd201110281bcf2875304089d7220f8c671dd..658aa712260d5f85e43f1544bab5f4b0ef58a89e 100644 (file)
@@ -1501,7 +1501,7 @@ oc:
     hosting_partners_html: L'aubergament es pres en carga per %{ucl}, %{fastly}, %{bytemark},
       e d'autres %{partners}.
     partners_ucl: UCL
-    partners_fastly: Lèu
+    partners_fastly: Fastly
     partners_bytemark: Albergament Bytemark
     partners_partners: partenaris
     tou: Condicions d'utilizacion
index 56889c378f91ec4ac0c84494bfc7a9375289f1bc..4efef4ce51e68f6d93e122dc6199dec9f5b135f4 100644 (file)
@@ -1264,9 +1264,9 @@ pl:
           village: Wieś
           "yes": Miejsce
         railway:
-          abandoned: Dawna linia kolejowa
+          abandoned: Rozebrany tor
           buffer_stop: Kozioł oporowy
-          construction: Budowana linia kolejowa
+          construction: Kolej w budowie
           disused: Nieużywany tor
           funicular: Kolej linowo-terenowa
           halt: Przystanek kolejowy
@@ -1279,7 +1279,7 @@ pl:
           platform: Peron
           preserved: Tor kolei zabytkowej
           proposed: Planowana linia kolejowa
-          rail: Linia kolejowa
+          rail: Tor kolejowy
           spur: Bocznica kolejowa
           station: Stacja kolejowa
           stop: Przystanek kolejowy
index eaef8e8f75bbb72c6b78151743f1d2e7f30eb3bb..57521534bc1c0a4ca5d1486fa071e7fbb249aa04 100644 (file)
@@ -1563,7 +1563,7 @@ pt-BR:
     hosting_partners_html: O hospedagem é suportada por %{ucl}, %{fastly}, %{bytemark}
       e outros %{partners}.
     partners_ucl: UCL
-    partners_fastly: Rapidamente
+    partners_fastly: Fastly
     partners_bytemark: Hospedagem Bytemark
     partners_partners: parceiros
     tou: Termo de uso
index 04eeb10ee46cdf7342a01ece17eb61465119af58..b588ea5fad2a6633a895f2905882f0d2e2d31ace 100644 (file)
@@ -992,6 +992,7 @@ ru:
           tertiary: Дорога третьего класса
           tertiary_link: Дорога третьего класса
           track: Просёлочная дорога
+          traffic_mirror: Зеркало дорожного движения
           traffic_signals: Светофор
           trunk: Трасса
           trunk_link: Развязка
@@ -1014,6 +1015,7 @@ ru:
           house: Дом
           manor: Поместье
           memorial: Памятник
+          milestone: Историческая веха
           mine: Рудник
           mine_shaft: Шахтный ствол
           monument: Монумент
@@ -1068,6 +1070,7 @@ ru:
           beach_resort: Пляж с насаждениями
           bird_hide: Засидка (пункт скрытого наблюдения за птицами)
           common: Общественно-доступная земля
+          dance: Танцевальный зал
           dog_park: Площадка для собак
           firepit: Место для костра
           fishing: Рыбалка
index 1659a8f3de74442db2bea782dab2c7d997159c8b..4b692b53eab5ff36a9089dc1a48b2e34a8929c2b 100644 (file)
@@ -70,6 +70,8 @@ sat:
         latitude: ᱚᱠᱷᱟᱝᱥᱚ
         longitude: ᱫᱨᱟᱜᱷᱤᱢᱟᱝᱥᱚ
         language: ᱯᱟᱹᱨᱥᱤ
+      doorkeeper/application:
+        name: ᱧᱩᱛᱩᱢ
       friend:
         user: ᱵᱮᱵᱦᱟᱨᱤᱡ
         friend: ᱜᱟᱛᱮ
index 421dd80aee88b923747299f88b39331de9af103b..bf2b75cc83c8481bf8246d9d656418dd9d43ea23 100644 (file)
@@ -44,6 +44,9 @@ sk:
       client_application:
         create: Registrovať
         update: Aktualizovať
+      doorkeeper_application:
+        create: Registrácia
+        update: Aktualizovať
       redaction:
         create: Vytvoriť revíziu
         update: Uložiť revíziu
@@ -57,6 +60,7 @@ sk:
     errors:
       messages:
         invalid_email_address: nevyzerá ako platná e-mailová adresa
+        email_address_not_routable: nie je routovateľná
     models:
       acl: Zoznam prístupových práv
       changeset: Sada zmien
@@ -96,8 +100,16 @@ sk:
     attributes:
       client_application:
         name: Meno (povinné)
+        url: URL adresa hlavnej aplikácie (vyžaduje sa)
         callback_url: URL pre spätné volanie (callback)
         support_url: URL s podporou
+        allow_read_prefs: čítať ich používateľské nastavenia
+        allow_write_prefs: upraviť ich používateľské nastavenia
+        allow_write_diary: vytvoriť položky denníka, komentovať a nadväzovať priateľstvá
+        allow_write_api: upravovať mapu
+        allow_read_gpx: čítať ich súkromné GPS stopy
+        allow_write_gpx: nahrávať GPS stopy
+        allow_write_notes: meniť poznámky
       diary_comment:
         body: Text
       diary_entry:
@@ -106,6 +118,11 @@ sk:
         latitude: Zem. šírka
         longitude: Zem. dĺžka
         language: Jazyk
+      doorkeeper/application:
+        name: Názov
+        redirect_uri: URI pre presmerovanie
+        confidential: Dôveryhodná aplikácia?
+        scopes: Oprávnenia
       friend:
         user: Používateľ
         friend: Priateľ
@@ -130,9 +147,13 @@ sk:
         title: Názov
         description: Popis
       report:
+        category: Uveďte dôvod nahlásenia
         details: Prosím uveďte bližšie informácie o probléme (potrebné).
       user:
+        auth_provider: Poskytovateľ overenia
+        auth_uid: UID overenia
         email: E-mail
+        email_confirmation: Potvrdenie e-mailu
         new_email: Nová e-mailová adresa
         active: Aktívny
         display_name: Zobrazované meno
@@ -140,6 +161,7 @@ sk:
         home_lat: Zemepisná šírka
         home_lon: Zemepisná dĺžka
         languages: Preferované jazyky
+        preferred_editor: Preferovaný editor
         pass_crypt: Heslo
         pass_crypt_confirmation: Potvrdenie hesla (ešte raz)
     help:
@@ -152,7 +174,57 @@ sk:
         new_email: (nikde se verejne nezobrazuje)
   datetime:
     distance_in_words_ago:
+      about_x_hours:
+        one: pred približne hodinou
+        few: pred približne %{count} hodinami
+        many: pred približne %{count} hodinami
+        other: pred približne %{count} hodinami
+      about_x_months:
+        one: pred približne mesiacom
+        few: pred približne %{count} mesiacmi
+        many: pred približne %{count} mesiacmi
+        other: pred približne %{count} mesiacmi
+      about_x_years:
+        one: pred približne rokom
+        few: pred približne %{count} rokmi
+        many: pred približne %{count} rokmi
+        other: pred približne %{count} rokmi
+      almost_x_years:
+        one: pred takmer rokom
+        few: pred takmer %{count} rokmi
+        many: pred takmer %{count} rokmi
+        other: pred takmer %{count} rokmi
       half_a_minute: pred pol minútou
+      less_than_x_seconds:
+        one: pred menej ako sekundou
+        few: pred menej ako %{count} sekundami
+        many: pred menej ako %{count} sekundami
+        other: pred menej ako %{count} sekundami
+      over_x_years:
+        one: pred viac ako rokom
+        few: pred viac ako %{count} rokmi
+        many: pred viac ako %{count} rokmi
+        other: pred viac ako %{count} rokmi
+      x_seconds:
+        one: pred sekundou
+        few: pred %{count} sekundami
+        many: pred %{count} sekundami
+        other: pred %{count} sekundami
+      x_minutes:
+        one: pred minútou
+        few: pred %{count} minútami
+        many: pred %{count} minútami
+        other: pred %{count} minútami
+      x_months:
+        one: pred mesiacom
+        few: pred %{count} mesiacmi
+        many: pred %{count} mesiacmi
+        other: pred %{count} mesiacmi
+      x_years:
+        one: pred rokom
+        few: pred %{count} rokmi
+        many: pred %{count} rokmi
+        other: pred %{count} rokmi
   editor:
     default: Predvolený (v súčasnosti %{name})
     id:
@@ -272,6 +344,11 @@ sk:
       title_html: 'Relácia: %{name}'
       history_title_html: 'História relácie: %{name}'
       members: Prvky
+      members_count:
+        one: 1 prvok
+        few: '%{count} prvky'
+        many: '%{count} prvkov'
+        other: '%{count} prvkov'
     relation_member:
       entry_role_html: '%{type} %{name} ako %{role}'
       type:
@@ -688,6 +765,7 @@ sk:
           traffic_signals: Semafor
           trunk: Cesta pre motorové vozidlá
           trunk_link: Privádzač k ceste pre motorové vozidlá
+          turning_circle: Miesto na otočenie
           unclassified: Neklasifikovaná cesta
           "yes": Cesta
         historic:
@@ -1103,7 +1181,7 @@ sk:
     logout: Odhlásiť sa
     log_in: Prihlásiť sa
     log_in_tooltip: Prihlásiť sa k existujúcemu kontu
-    sign_up: Zaregistrovať sa
+    sign_up: Zaregistrujte sa
     start_mapping: Začať mapovať
     sign_up_tooltip: Vytvoriť si používateľské konto pre úpravy
     edit: Upraviť
@@ -1122,6 +1200,8 @@ sk:
     intro_text: OpenStreetMap je mapa sveta, vytvorené ľuďmi ako vy, voľne využiteľná
       pod slobodnou licenciou.
     intro_2_create_account: Založte si konto
+    hosting_partners_html: Hosting podporuje %{ucl}, %{fastly}, %{bytemark} a ďalší
+      %{partners}.
     partners_ucl: UCL
     partners_bytemark: Bytemark Hosting
     partners_partners: partneri
@@ -1194,8 +1274,14 @@ sk:
       anonymous: Anonymný používateľ
       greeting: Ahoj,
       details: Viac podrobností o poznámke môžete nájsť nájsť na %{url}.
+      details_html: Viac podrobností o poznámke môžete nájsť na adrese %{url}.
     changeset_comment_notification:
       greeting: Ahoj,
+      details: Viac podrobností o sade zmien môžete nájsť na adrese %{url}.
+      unsubscribe: Ak už nechcete dostávať upozornenia pri zmenách v tejto sade zmien,
+        navštívte %{url} a kliknite na "Zrušiť odoberanie".
+      unsubscribe_html: Ak už nechcete dostávať upozornenia pri zmenách v tejto sade
+        zmien, navštívte %{url} a kliknite na "Zrušiť odoberanie".
   confirmations:
     confirm:
       heading: Skontrolujte vašu emailovú adresu!
@@ -1312,8 +1398,13 @@ sk:
   preferences:
     show:
       title: Moje predvoľby
+      preferred_editor: Preferovaný editor
+      edit_preferences: Upraviť preferencie
+    edit:
+      save: Aktualizovať preferencie
   profiles:
     edit:
+      title: Upraviť profil
       image: Obrázok
       gravatar:
         gravatar: Používať Gravatar
@@ -1378,6 +1469,11 @@ sk:
       logout_button: Odhlásenie
   shared:
     markdown_help:
+      title_html: Spracováva sa <a href="https://kramdown.gettalong.org/quickref.html">kramdown</a>om
+      headings: Nadpisy
+      unordered: Neusporiadaný zoznam
+      ordered: Číslovaný zoznam
+      link: Odkaz
       image: Obrázok
       alt: Alternatívny text
       url: URL
@@ -1387,11 +1483,16 @@ sk:
   site:
     about:
       next: Ďalej
+      used_by_html: '%{name} poskytuje mapové dáta pre tisícky webových stránok, mobilných
+        aplikácií a hardvérových zariadení'
+      lede_text: OpenStreetMap tvorí komunita používateľov, ktorí pridávajú a udržiavajú
+        údaje o cestách, turistických trasách, kaviarňach, železničných staniciach
+        a mnohých ďalších miestach na celom svete.
       partners_title: Partneri
     copyright:
       foreign:
         title: O tomto preklade
-        html: V prípade rozporu mezi touto preloženou verziou a %{english_original_link}
+        html: V prípade rozporu medzi touto preloženou verziou a %{english_original_link}
           má anglická stránka prednosť
         english_link: anglickým originálom
       native:
@@ -1486,7 +1587,7 @@ sk:
         copyright: Chránené autorskými právami OpenStreetMap a prispievateľov pod
           slobodnou licenciou
       remote_failed: Editácia sa nepodarila – skontrolujte, či je JOSM alebo Merkaartor
-        spustený a je v ňom povolená funkcia Diaľkové ovládanie (Remote control)
+        spustený a je v ňom zapnutá funkcia Diaľkové ovládanie (Remote control)
     edit:
       not_public: Nemáte nastavené úpravy na verejné.
       not_public_description_html: Kým tak neurobíte, nemôžete ďalej editovať mapu.
@@ -1548,6 +1649,9 @@ sk:
           title: Pripojte sa ku komunite
     help:
       title: Získanie pomoci
+      introduction: OpenStreetMap ponúka niekoľko zdrojov, kde je možné získať informácie
+        o projekte, spýtať sa rôzne otázky a spoločne diskutovať a dokumentovať témy
+        týkajúce sa mapovania.
       welcome:
         url: /welcome
         title: Vitajte na OSM
@@ -1656,7 +1760,7 @@ sk:
     welcome:
       title: Vitajte!
       introduction_html: Vitajte na OpenStreetMap, slobodnej a upravovateľnej mape
-        sveta. Teraz, keÄ\8f ste zaregistrovaní, môžete začať mapovať. Tu je stručný
+        sveta. Teraz, keÄ\8f ste zaregistrovaný, môžete začať mapovať. Tu je stručný
         prehľad najdôležitejších, ktoré potrebujete vedieť.
       whats_on_the_map:
         title: Čo patrí do mapy
@@ -1672,19 +1776,19 @@ sk:
           slov, ktoré vám prídu vhod.
         editor_html: <strong>Editor</strong> je program alebo webovej stránky pomocou
           ktorej upravujete mapu.
-        node_html: <Strong>uzol</strong> je bod na mape, napr. jedna reštaurácia alebo
+        node_html: <Strong>Uzol</strong> je bod na mape, napr. jedna reštaurácia alebo
           strom.
         way_html: <strong>Cesta</strong> je čiara alebo oblasť, ako cesty, vodné toky,
           jazerá alebo budovy.
-        tag_html: <strong>Značka</strong> je trochu údajov o uzle alebo ceste, napr.
-          názov reštaurácie alebo rýchlostný limit cesty.
+        tag_html: <strong>Značka</strong> je zopár údajov o uzle alebo ceste, napr.
+          názov reštaurácie alebo najvyššia povolená rýchlosť na ceste.
       rules:
         title: Pravidlá!
       questions:
         title: Akékoľvek otázky?
-        paragraph_1_html: Potrebujete pomoc s mapovaním alebo vám nie je jasné, ako
-          OpenStreetMap používať? Odpovede na svoje otázky môžete získať na <a href='http://help.openstreetmap.org/'>webe
-          s nápovedou</a>.
+        paragraph_1_html: |-
+          OpenStreetMap ponúka niekoľko zdrojov, kde je možné získať informácie o projekte, spýtať sa rôzne otázky a spoločne diskutovať a dokumentovať témy týkajúce sa mapovania.
+          <a href='%{help_url}'>Tu získajte pomoc</a>. Ste organizácia, ktorá má plány s OpenStreetMap? <a href='https://welcome.openstreetmap.org/'>Pozrite sa na sprievodcu privítaním.</a>.
       start_mapping: Začať mapovať
       add_a_note:
         title: Nie je čas upravovať? Pridajte poznámku!
@@ -1783,6 +1887,8 @@ sk:
         ich odsúhlasiť, musíte si ich ale zobraziť.
     settings_menu:
       account_settings: Nastavenia účtu
+      oauth1_settings: Nastavenia OAuth 1
+      oauth2_applications: Aplikácie OAuth 2
   oauth:
     authorize:
       request_access_html: Aplikácia %{app_name} požaduje prístup k vášmu kontu (%{user}).
@@ -1822,7 +1928,7 @@ sk:
       list_tokens: 'Nasledovné tokeny boli vo vašom mene vydané aplikáciám:'
       application: Názov aplikácie
       issued_at: Vydané
-      revoke: Zrušiť!
+      revoke: Odvolať!
       my_apps: Moje klientské aplikácie
       no_apps_html: Máte nejakú aplikáciu, využívajúcu štandard %{oauth}, ktorá by
         s nami mala spolupracovať? Aplikáciu je potrebné najprv zaregistrovať, až
@@ -1840,6 +1946,16 @@ sk:
       flash: Úspešne aktualizované informácie o klientovi
     destroy:
       flash: Registrácia klientskej aplikácie bola zrušená
+  oauth2_applications:
+    index:
+      permissions: Povolenia
+    show:
+      permissions: Povolenia
+  oauth2_authorized_applications:
+    index:
+      title: Moje autorizované aplikácie
+    application:
+      revoke: Odobrať prístup
   users:
     new:
       title: Zaregistrovať sa
@@ -1848,6 +1964,11 @@ sk:
       contact_support_html: Kontaktujte prosím <a href="%{support}">webmastera</a>
         so žiadosťou o založenie konta – budeme sa snažiť vašu požiadavku vybaviť
         čo najrýchlejšie.
+      about:
+        header: Slobodné a upravovateľné
+        html: |-
+          <p>Na rozdiel od iných máp sú mapy OpenStreetMap vytvárané ľuďmi ako ste vy a ktokoľvek ich môže slobodne upravovať, aktualizovať, stiahnuť a používať.</p>
+          <p>Zaregistrujte sa a môžete začať prispievať. Na potvrdenie vytvorenia vášho účtu vám pošleme e-mail.</p>
       email address: 'Emailová adresa:'
       confirm email address: 'Potvrdiť emailovú adresu:'
       display name: 'Zobrazované meno:'
@@ -1894,6 +2015,7 @@ sk:
       my_dashboard: Moja nástenka
       blocks on me: Moje zablokovania
       blocks by me: Mnou udelené bloky
+      edit_profile: Upraviť profil
       send message: Poslať správu
       diary: Denník
       edits: Úpravy
@@ -1905,7 +2027,7 @@ sk:
       ct status: 'Podmienky prispievania:'
       ct undecided: Nerozhodnuté
       ct declined: Odmietnuté
-      latest edit: 'Posledné úpravy pred %{ago}:'
+      latest edit: 'Posledné úpravy %{ago}:'
       email address: 'Emailová adresa:'
       created from: 'Vytvorené od:'
       status: 'Stav:'
@@ -1965,6 +2087,8 @@ sk:
       not_a_role: Reťazec `%{role}' nemá platnú úlohu.
       already_has_role: Používateľ už má úlohu %{role}.
       doesnt_have_role: Požívateľ nemá úlohu %{role}.
+      not_revoke_admin_current_user: Rolu administrátora nie je možné odobrať aktuálne
+        prihlásenému používateľovi.
     grant:
       title: Potvrdiť pridelenie funkcie
       heading: Potvrdiť pridelenie funkcie
@@ -2024,7 +2148,7 @@ sk:
       time_future: Tento blok skončí v %{time}.
       past: Tento blok už skončil pred %{time} a nemože byť zrušený.
       confirm: Ste si istí, že chcete zrušiť tento blok?
-      revoke: Zrušiť!
+      revoke: Odvolať!
       flash: Tento blok bol zrušený.
     helper:
       time_future_html: Končí o %{time}.
@@ -2060,7 +2184,7 @@ sk:
       not_revoked: (nezrušený)
       show: Zobraziť
       edit: Upraviť
-      revoke: Zrušiť!
+      revoke: Odvolať!
     blocks:
       display_name: Blokovaný používateľ
       creator_name: Tvorca
@@ -2072,6 +2196,8 @@ sk:
       previous: « Predchádzajúca stránka
   notes:
     index:
+      title: Poznámky vytvorené alebo komentované používateľom %{user}
+      subheading_html: Poznámky vytvorené alebo komentované používateľom %{user}
       id: ID
       creator: Autor
       description: Popis
@@ -2136,6 +2262,7 @@ sk:
       queryfeature_disabled_tooltip: Pre prieskum prvkov priblížte
     changesets:
       show:
+        comment: Okomentovať
         subscribe: Odoberať
         unsubscribe: Zrušiť odoberanie
         hide_comment: skryť
@@ -2150,8 +2277,11 @@ sk:
           právami.
         add: Pridať poznámku
       show:
+        anonymous_warning: Táto poznámka zahŕňa komentáre anonymných používateľov,
+          ktoré by sa mali nezávisle preveriť.
         hide: Skryť
         resolve: Vyriešiť
+        comment_and_resolve: Okomentovať a vyriešiť
     directions:
       ascend: Stúpanie
       engines:
@@ -2168,6 +2298,24 @@ sk:
         no_route: Nepodarilo sa nájsť trasu medzi týmito miestami.
         no_place: Ospravedlňujeme sa - nepodarilo sa nájsť toto miesto.
       instructions:
+        continue_without_exit: Pokračujte na %{name}
+        onramp_right_without_exit: Odbočte vpravo na nájazd na %{name}
+        onramp_right_with_name_directions: Odbočte vpravo na nájazd na %{name}, smerom
+          na %{directions}
+        onramp_right: Odbočte vpravo na nájazd
+        endofroad_right_without_exit: Na konci cesty odbočte vpravo na %{name}
+        fork_right_without_exit: Na rázcestí odbočte vpravo na %{name}
+        sharp_right_without_exit: Ostro doprava na %{name}
+        sharp_left_without_exit: Ostro doľava na %{name}
+        turn_left_without_exit: Odbočte vľavo na %{name}
+        onramp_left_without_exit: Odbočte vľavo na nájazd na %{name}
+        onramp_left_with_name_directions: Odbočte vľavo na nájazd na %{name}, smerom
+          na %{directions}
+        onramp_left: Odbočte vľavo na nájazd
+        endofroad_left_without_exit: Na konci cesty odbočte vľavo na %{name}
+        fork_left_without_exit: Na rázcestí odbočte vľavo na %{name}
+        start_without_exit: Začnite na %{name}
+        destination_without_exit: Ste v cieli
         unnamed: nepomenované
         courtesy: Trasa získaná vďaka %{link}
         exit_counts:
index b3f875093365131bf608b785612d3b0d86ea311f..200e426c6665902b3937d2d31b5b425f26842ca8 100644 (file)
 te:
   time:
     formats:
-      friendly: '%B %e, %Y నాడు %H:%M కి'
+      friendly: '%Y %B %e న %H:%M కి'
   helpers:
+    file:
+      prompt: దస్త్రాన్ని ఎంచుకోండి
     submit:
       diary_comment:
         create: భద్రపరుచు
       diary_entry:
         create: ప్రచురించు
+        update: తాజాకరించు
+      issue_comment:
+        create: వ్యాఖ్య చేర్చండి
       message:
         create: పంపించు
       client_application:
+        create: నమోదవ్వండి
+        update: తాజాకరించు
+      doorkeeper_application:
+        create: నమోదవ్వండి
         update: తాజాకరించు
+      redaction:
+        create: సంస్కరణను సృష్టించండి
+        update: సంస్కరణను భద్రపరచు
       trace:
         create: ఎక్కించు
         update: మార్పులను భద్రపరచు
+      user_block:
+        create: నిరోధాన్ని సృష్టించండి
+        update: నిరోధాన్ని తాజాకరించండి
   activerecord:
+    errors:
+      messages:
+        invalid_email_address: సరైన ఈ-మెయిలు చిరునామాగా అనిపించడం లేదు
+        email_address_not_routable: రూటు చెయ్యలేనిది
     models:
       acl: అనుమతి నియంత్రణ జాబితా
-      changeset: మార్పుల సమితి
+      changeset: మార్పులసమితి
+      changeset_tag: మార్పులసమితి ట్యాగు
       country: దేశం
       diary_comment: డైరీ వ్యాఖ్య
-      diary_entry: దినచర్య పద్దు
-      friend: స్నేహితుడు
+      diary_entry: డైరీ పద్దు
+      friend: మిత్రుడు
+      issue: అంశం
       language: భాష
       message: సందేశం
-      node: à°\85à°\82à°¶à°\82
-      node_tag: à°\85à°\82శపà±\81 ట్యాగ్
+      node: à°¬à±\81à°¡à°¿à°ªà±\86
+      node_tag: à°¬à±\81à°¡à°¿à°ªà±\86 ట్యాగ్
       notifier: సూచిక
-      old_node: à°ªà°¾à°¤ à°\85à°\82à°¶à°\82
-      old_node_tag: à°ªà°¾à°¤ à°\85à°\82à°¶à°\82 à°¯à±\8aà°\95à±\8dà°\95 à°\9fà±\8dయాà°\97à±\8d
+      old_node: à°ªà°¾à°¤ à°¬à±\81à°¡à°¿à°ªà±\86
+      old_node_tag: à°ªà°¾à°¤ à°¬à±\81à°¡à°¿à°ªà±\86 à°\9fà±\8dయాà°\97à±\81
       old_relation: పాత సంబంధం
+      old_relation_member: పాత సంబంధం సభ్యులు
+      old_relation_tag: పాత సంబంధం ట్యాగు
       old_way: పాత పద్ధతి
+      old_way_node: పాత దారి బుడిపె
+      old_way_tag: పాత దారి ట్యాగు
       relation: సంబంధం
+      relation_member: సంబంధం సభ్యులు
+      relation_tag: సంబంధం ట్యాగు
       session: సెషన్
+      trace: అనుసరించు
+      tracepoint: అనుసరణ బిందువు
+      tracetag: అనుసరణ ట్యాగు
       user: వాడుకరి
       user_preference: వాడుకరి అభిరుచి
+      user_token: వాడుకరి టోకెన్
       way: దారి
+      way_node: దారి గమనిక
+      way_tag: దారి ట్యాగు
     attributes:
+      client_application:
+        name: పేరు (ఆవశ్యకం)
+        url: ప్రధాన అనువర్తనం URL (ఆవశ్యకం)
+        callback_url: కాల్‌బ్యాక్ URL
+        support_url: సపోర్ట్ URL
+        allow_read_prefs: వారి వాడుకరి అభిరుచులను చదవండి
+        allow_write_prefs: వారి వాడుకరి అభిరుచులను మార్చు
+        allow_write_diary: డైరీ ఎంట్రీలు, వ్యాఖ్యలు సృష్టించండి, మిత్రులను చేసుకోండి
+        allow_write_api: మ్యాపును సవరించండి
+        allow_read_gpx: వారు గోప్య GPS అనుసరణలను చదవండి
+        allow_write_gpx: GPS అనుసరణలను ఎక్కించండి
+        allow_write_notes: గమనికలను సవరించు
       diary_comment:
         body: వివరణ
       diary_entry:
@@ -59,6 +104,11 @@ te:
         latitude: అక్షాంశం
         longitude: రేఖాంశం
         language: భాష
+      doorkeeper/application:
+        name: పేరు
+        redirect_uri: దారిమార్పు URI లు
+        confidential: రహస్యమైన అనువర్తనా?
+        scopes: అనుమతులు
       friend:
         user: వాడుకరి
         friend: స్నేహితుడు
@@ -71,32 +121,133 @@ te:
         longitude: రేఖాంశం
         public: బహిరంగం
         description: వివరణ
+        gpx_file: GPX దస్త్రాన్ని ఎక్కించండి
+        visibility: దృశ్యత
+        tagstring: ట్యాగులు
       message:
         sender: పంపేవారు
         title: విషయం
         body: వివరణ
         recipient: అందుకునేవారు
       redaction:
+        title: శీర్షిక
         description: వివరణ
+      report:
+        category: మీ ఫిర్యాదుకు కారణాన్ని ఎంచుకోండి
+        details: సమస్య గురించి మరిన్ని వివరాలు ఇవ్వండి (ఆవశ్యకం).
       user:
+        auth_provider: ఆథెంటికేషను ఇచ్చేవారు
+        auth_uid: ఆథెంటికేషను UID
         email: ఈ-మెయిల్
-        new_email: 'కొత్త ఈమెయిల్ చిరునామా:'
+        email_confirmation: ఈమెయిలు నిర్థారణ
+        new_email: కొత్త ఈమెయిలు చిరునామా
         active: క్రియాశీలం
         display_name: కనిపించే పేరు
-        description: వివరణ
-        home_lat: 'అక్షాంశం:'
-        home_lon: 'రేఖాంశం:'
-        languages: భాషలు
+        description: ప్రొఫైలు వివరణ
+        home_lat: అక్షాంశం
+        home_lon: రేఖాంశం
+        languages: అభీష్టమైన భాషలు
+        preferred_editor: అభీష్టమైన ఎడిటరు
         pass_crypt: సంకేతపదం
+        pass_crypt_confirmation: సంకేతపదాన్ని నిర్ధారించండి
     help:
+      doorkeeper/application:
+        confidential: క్లయంటు రహస్యాన్ని కాపాడగలిగే చోట్ల ఈ అప్లికేషన్ను వాడతాం (మొబైలు
+          యాప్‌లు, ఒకే పేజీ యాప్‌లూ గోప్యంగా ఉండవు)
+        redirect_uri: లైనుకో URI చొప్పున వాడండి
       trace:
         tagstring: కామాలతో వేరుపరచినవి
+      user_block:
+        reason: వాడుకరిని నిరోధిస్తున్న కారణం. వీలైనంత ప్రశాంతంగా, హేతుబద్ధంగా ఉండండి.
+          సందేశం బహిరంగంగా అందరూ చూడగలిగేలా ఉంటుందని గుర్తుంచుకుని, పరిస్థితి గురించి
+          వీలైనన్ని వివరాలనివ్వండి. సముదాయంలో వాడే పరిభాష వాడుకరులందరికీ అర్థం కాదని
+          మనసులో ఉంచుకుని సామాన్యులకు కూడా అర్థమయ్యే పదాలను రాయండి.
+        needs_view: ఈ నిరోధం తొలగాలంటే వాడుకరి లాగినవ్వాలా?
       user:
+        email_confirmation: మీ చిరునామాను బహిరంగంగా చూపించం. మరింత సమాచారం కోసం మా
+          <a href="https://wiki.osmfoundation.org/wiki/Privacy_Policy" title="OSMF
+          privacy policy including section on email addresses">గోప్యతా సమాచారం</a>
+          చూడండి.
         new_email: (బహిరంగంగా ఎన్నటికీ చూపించబడదు)
+  datetime:
+    distance_in_words_ago:
+      about_x_hours:
+        one: సుమారు 1 గంట క్రితం
+        other: సుమారు %{count} గంటల క్రితం
+      about_x_months:
+        one: సుమారు 1 నెల క్రితం
+        other: సుమారు %{count} నెలల క్రితం
+      about_x_years:
+        one: సుమారు 1 సంవత్సరం క్రితం
+        other: సుమారు %{count} సంవత్సరాల క్రితం
+      almost_x_years:
+        one: దాదాపు 1 సంవత్సరం క్రితం
+        other: దాదాపు %{count} సంవత్సరాల క్రితం
+      half_a_minute: అర నిమిషం క్రితం
+      less_than_x_seconds:
+        one: 1 సెకండు లోపు సమయం క్రితం
+        other: '%{count} సెకండ్ల లోపు సమయం క్రితం'
+      less_than_x_minutes:
+        one: ఒక నిమిషం లోపు సమయం క్రితం
+        other: '%{count} నిమిషాల లోపు సమయం క్రితం'
+      over_x_years:
+        one: '1 సంవత్సరానికి పైబడిన సమయం క్రితం '
+        other: '%{count} సంవత్సరాలకు పైబడిన సమయం క్రితం'
+      x_seconds:
+        one: 1 సెకండు క్రితం
+        other: '%{count} సెకండ్ల క్రితం'
+      x_minutes:
+        one: 1 నిమిషం క్రితం
+        other: '%{count} నిమిషాల క్రితం'
+      x_days:
+        one: 1 రోజు క్రితం
+        other: '%{count} రోజుల క్రితం'
+      x_months:
+        one: 1 నెల క్రితం
+        other: '%{count} నెలల క్రితం'
+      x_years:
+        one: 1 సంవత్సరం క్రితం
+        other: '%{count} సంవత్సరాల క్రితం'
+  printable_name:
+    with_version: '%{id}, v%{version}'
+    with_name_html: '%{name} (%{id})'
   editor:
     default: అప్రమేయం (ప్రస్తుతం %{name})
+    id:
+      name: ఐడీ
+      description: ఐడీ (బ్రౌజర్లోని ఎడిటరు)
+    remote:
+      name: రిమోట్ కంట్రోలు
+      description: రిమోట్ కంట్రోలు (JOSM, Potlatch, Merkaartor)
+  auth:
+    providers:
+      none: ఏదీకాదు
+      openid: ఓపెన్‌ఐడీ
+      google: Google
+      facebook: Facebook
+      windowslive: Windows Live
+      github: GitHub
+      wikipedia: వికీపీడియా
   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} పునరుజ్జీవింపజేసారు'
+      rss:
+        title: OpenStreetMap గమనికలు
+        description_area: మీ ప్రాంత [(%{min_lat}|%{min_lon}) -- (%{max_lat}|%{max_lon})]
+          నుండి వచ్చిన గమనికలు, ఫిర్యాదులు, వ్యాఖ్యల జాబితా
+        description_item: '%{id} గమనికకు rss వడ్డన'
+        opened: కొత్త గమనిక (%{place} సమీపాన)
+        commented: కొత్త వ్యాఖ్య (%{place} సమీపాన)
+        closed: మూసేసిన గమనిక (%{place} సమీపాన)
+        reopened: పునరుజ్జీవిత గమనిక (%{place} సమీపాన)
       entry:
         comment: వ్యాఖ్య
         full: పూర్తి గమనిక
@@ -104,83 +255,187 @@ te:
     edit:
       title: ఖాతా మార్పు
       my settings: నా అమరికలు
-      current email address: 'ప్రస్తుత ఈ-మెయిలు చిరునామా:'
+      current email address: ప్రస్తుత ఈమెయిలు చిరునామా
+      external auth: బయటి ఆథెంటికేషను
       openid:
         link: https://wiki.openstreetmap.org/wiki/OpenID
         link text: ఇది ఏమిటి?
       public editing:
+        heading: బహిరంగ ఎడిటింగు
+        enabled: చేతనం. అజ్ఞాతగా లేరు, అంచేత దిద్దుబాట్లు చెయ్యవచ్చు.
         enabled link: https://wiki.openstreetmap.org/wiki/Anonymous_edits
         enabled link text: ఇది ఏమిటి?
+        disabled: అచేతనంగా ఉంది, అంచేత దిద్దుబాట్లు చెయ్యలేరు. ఇంతకుముందు చేసిన దిద్దుబాట్లన్నీ
+          అజ్ఞాతగా చేసినవే.
         disabled link text: నేను ఎందుకు మార్చలేను?
+      public editing note:
+        heading: బహిరంగ ఎడిటింగు
+        html: ప్రస్తుతం మీ దిద్దుబాట్లు అజ్ఞాతగా చేస్తున్నారు. ఇతరులు మీ కు సందేశాలు
+          పంపలేరు, మీ స్థానాన్ని చూడలేరు. మీ దిద్దుబాట్లను వాళ్ళకు చూపించేందుకు, ఈ
+          వెబ్‌సైటు ద్వారా వాళ్ళు మిమ్మల్ని సంప్రదించే వీలు కలిగించేందుకూ కింది బొత్తాన్ని
+          నొక్కండి. <b>0.6 API మార్పు తరువాత, మ్యాపుల డేటాను బహిరంగ వాడుకరులు మాత్రమే
+          దిద్దుబాటు చేసే వీలుంది</b>. (<a href="https://wiki.openstreetmap.org/wiki/Anonymous_edits">ఎందుకో
+          తెలుసు కోండి</a>).<ul><li>మిమ్మల్ని మీరు బహిరంగ పరచినంత మాత్రాన మీ ఈమెయిలు
+          చిరునామాను బహిరంగపరచం.</li><li>ఇది తిరగ్గొట్టలేని చర్య, కొత్త వాడుకరులంతా
+          డిఫాల్టుగా బహిరంగంగా ఉంటారు.</li></ul>
       contributor terms:
+        heading: తోడ్పాటు నియమాలు
+        agreed: మీరు కొత్త తోడ్పాటు నియమాలకు అంగీకరించారు.
+        not yet agreed: మీరు కొత్త తోడ్పాటు నియమాలకు అంగీకరించలేదు.
+        review link text: మీ వీలును బట్టి ఈ లింకుకు వెళ్ళి కొత్త తోడ్పాటు నియమాలను
+          చూసి, అంగీకరించండి.
+        agreed_with_pd: మీరు చేసే దిద్దుబాట్లు బహిరంగ డొమెయిన్‌లో ఉంటాయని భావిస్తున్నట్లుగా
+          కూడా ప్రకటించారు.
+        link: https://www.osmfoundation.org/wiki/License/Contributor_Terms
         link text: ఇది ఏమిటి?
       save changes button: మార్పులను భద్రపరచు
       make edits public button: నా దిద్దుబాట్లన్నింటినీ బహిరంగం చేయి
     update:
+      success_confirm_needed: వాడుకరి సమాచారాన్ని జయప్రదంగా తాజాకరించాం. మీ కొత్త
+        ఈమెయిలు చిరునామాను ధ్రువీకరించేందుకు మెయిల్లో వచ్చిన గమనింపును చూడండి.
       success: వాడుకరి సమాచారం విజయవంతంగా తాజాకరించబడింది.
   browse:
     created: 'సృష్టించబడినది:'
     closed: ముగించబడింది
-    created_html: <abbr title='%{title}'>%{time}</abbr> à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aబడిà°\82ది
-    closed_html: <abbr title='%{title}'>%{time}</abbr> à°®à±\82సివà±\87యబడిà°\82ది
-    created_by_html: <abbr title='%{title}'>%{time}</abbr>, %{user} à°\9aà±\87 à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aబడిà°\82ది
+    created_html: <abbr title='%{title}'>%{time}</abbr> à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aారà±\81
+    closed_html: <abbr title='%{title}'>%{time}</abbr> à°®à±\82సివà±\87సారà±\81
+    created_by_html: <abbr title='%{title}'>%{time}</abbr>, %{user} à°¸à±\83à°·à±\8dà°\9fà°¿à°\82à°\9aారà±\81
     deleted_by_html: <abbr title='%{title}'>%{time}</abbr>, %{user} చే తొలగించబడింది
     edited_by_html: <abbr title='%{title}'>%{time}</abbr>, %{user} చే సరిదిద్దబడింది
-    closed_by_html: <abbr title='%{title}'>%{time}</abbr>, %{user} à°\9aà±\87 à°®à±\82సివà±\87యబడిà°\82ది
+    closed_by_html: <abbr title='%{title}'>%{time}</abbr>, %{user} à°®à±\82సివà±\87సారà±\81
     version: సంచిక
+    in_changeset: మార్పులసమితి
     anonymous: అజ్ఞాత
     no_comment: (వ్యాఖ్య లేదు)
     part_of: ఇందులో భాగం
+    part_of_relations:
+      one: 1 సంబంధం
+      other: '%{count} సంబంధాలు'
+    part_of_ways:
+      one: 1 దారి
+      other: '%{count} దారులు'
+    download_xml: XML ను దించుకోండి
     view_history: చరిత్రను చూడండి
     view_details: వివరాలను చూడండి
     location: 'ప్రాంతం:'
+    common_details:
+      coordinates_html: '%{latitude}, %{longitude}'
     changeset:
+      title: 'మార్పులసమితి: %{id}'
       belongs_to: రచయిత
+      node: బుడిపెలు (%{count})
+      node_paginated: బుడిపెలు (%{count} లో %{x}-%{y})
       way: మార్గాలు (%{count})
+      way_paginated: దారులు (%{count} లో %{x}-%{y})
       relation: సంబంధాలు (%{count})
       relation_paginated: '%{count} లో %{x}-%{y} యొక్క సంబంధాలు'
       comment: వ్యాఖ్యలు (%{count})
+      hidden_commented_by_html: <abbr title='%{exact_time}'>%{when}</abbr> %{user}
+        గారి దాచిన వ్యాఖ్య
       commented_by_html: '%{user} నుండి వ్యాఖ్య <abbr title=''%{exact_time}''>%{when}
         క్రితం</abbr>'
+      changesetxml: మార్పులసమితి XML
+      osmchangexml: osmChange XML
+      feed:
+        title: మార్పులసమితి %{id}
+        title_comment: మార్పులసమితి %{id} - %{comment}
+      join_discussion: చర్చలో పాల్గొనేందుకు లాగినవండి
       discussion: చర్చ
+      still_open: మార్పులసమితి ఇంకా తెరిచే ఉంది - దాన్ని మూసివేయగానే చర్చ తెరుచుకుంటుంది.
     node:
       title_html: 'బిందువు: %{name}'
+      history_title_html: 'బుడిపె చరిత్ర: %{name}'
     way:
       title_html: 'దారి: %{name}'
       history_title_html: 'దారి చరిత్ర: %{name}'
+      nodes: బుడిపెలు
+      also_part_of_html:
+        one: '%{related_ways} దారిలో భాగం'
+        other: '%{related_ways} దారుల్లో భాగం'
     relation:
       title_html: 'సంబంధం: %{name}'
       history_title_html: 'సంబంధపు చరిత్ర: %{name}'
       members: సభ్యులు
+      members_count:
+        one: 1 సభ్యుడు/సభ్యురాలు
+        other: '%{count} సభ్యులు'
     relation_member:
+      entry_html: '%{type} %{name}'
+      entry_role_html: '%{type} %{name}, %{role} లాగా'
       type:
+        node: బుడిపె
         way: దారి
         relation: సంబంధం
     containing_relation:
       entry_html: '%{relation_name} సంబంధం'
+      entry_role_html: '%{relation_name} సంబంధం (%{relation_role} లాగా)'
     not_found:
+      title: కనబడలేదు
       sorry: 'క్షమించండి, %{type} #%{id} కనబడలేదు.'
       type:
+        node: బుడిపె
         way: దారి
         relation: సంబంధం
+        changeset: మార్పులసమితి
+        note: గమనిక
     timeout:
+      title: టైమౌట్ లోపం
+      sorry: సారీ, %{type} రకంలో, %{id} ఐడీకి డేటాను తేవడానికి బాగా ఎక్కువ సమయం పట్టింది.
       type:
+        node: బుడిపె
         way: దారి
         relation: సంబంధం
+        changeset: మార్పులసమితి
+        note: బుడిపె
     redacted:
+      redaction: సంస్కరణ %{id}
+      message_html: ఈ %{type} రకపు కూర్పు %{version} ను సంస్కరించినట్లుగా చూపించలేం.
+        వివరాలకు %{redaction_link} చూడండి.
       type:
+        node: బుడిపె
         way: దారి
         relation: సంబంధం
     start_rjs:
+      feature_warning: '%{num_features} విశేషాలను లోడు చేస్తున్నాం. దీనివలన మీ బ్రౌజరు
+        నెమ్మదించడం గానీ, స్పందించకపోవడం గానీ జరగవచ్చు. ఈ డేటాను చూపించమనే మీ నిశ్చయమా?'
+      load_data: డేటాను లోడు చెయ్యి
       loading: లోడవుతోంది...
     tag_details:
       tags: ట్యాగులు
+      wiki_link:
+        key: '%{key} ట్యాగుకు వికీ వివరణ పేజీ'
+        tag: '%{key}=%{value} ట్యాగుకు వికీ వివరణ పేజీ'
+      wikidata_link: వికీడేటాలో %{page} అంశం
       wikipedia_link: వికీపీడియాలో %{page} వ్యాసం
+      wikimedia_commons_link: వికీమీడియా కామన్స్‌లో %{page} అంశం
+      telephone_link: '%{phone_number} కు కాల్ చెయ్యి'
+      colour_preview: '%{colour_value} రంగు మునుజూపు'
     note:
       title: 'గమనిక: %{id}'
       new_note: కొత్త గమనిక
       description: వివరణ
+      open_title: 'పరిష్కరించని గమనిక #%{note_name}'
+      closed_title: 'పరిష్కారమైన గమనిక #%{note_name}'
+      hidden_title: 'దాచిన గమనిక #%{note_name}'
+      opened_by_html: <abbr title='%{exact_time}'>%{when}</abbr> %{user} సృష్టించారు
+      opened_by_anonymous_html: <abbr title='%{exact_time}'>%{when}</abbr> అజ్ఞాత
+        సృష్టించారు
+      commented_by_html: <abbr title='%{exact_time}'>%{when}</abbr> %{user} చేసిన
+        వ్యాఖ్య
+      commented_by_anonymous_html: <abbr title='%{exact_time}'>%{when}</abbr> అజ్ఞాత
+        చేసిన వ్యాఖ్య
+      closed_by_html: <abbr title='%{exact_time}'>%{when}</abbr> %{user} పరిష్కరించారు
+      closed_by_anonymous_html: <abbr title='%{exact_time}'>%{when}</abbr> అజ్ఞాత
+        పరిష్కరించారు
+      reopened_by_html: <abbr title='%{exact_time}'>%{when}</abbr> %{user} పునరుజ్జీవింపజేసారు
+      reopened_by_anonymous_html: <abbr title='%{exact_time}'>%{when}</abbr> అజ్ఞాత
+        పునరుజ్జీవింపజేసారు
+      hidden_by_html: <abbr title='%{exact_time}'>%{when}</abbr> %{user} దాచారు
+      report: ఈ గమనికపై ఫిర్యాదు చెయ్యండి
+      coordinates_html: '%{latitude}, %{longitude}'
     query:
+      title: క్వెరీ విశేషాలు
+      introduction: సమీపం లోని అంశాలను చూసేందుకు మ్యాపుపై నొక్కండి.
       nearby: దగ్గర్లోని విశేషాలు
   changesets:
     changeset_paging_nav:
@@ -190,6 +445,7 @@ te:
     changeset:
       anonymous: అనామకం
       no_edits: (మార్పులు లేవు)
+      view_changeset_details: మార్పులసమితి వివరాలు చూడండి
     changesets:
       id: ఐడీ
       saved_at: భద్రపరచిన సమయం
@@ -199,16 +455,49 @@ te:
     index:
       title: మార్పుల సమితులు
       title_user: '%{user} చేసిన మార్పులసమితులు'
+      title_friend: నా మిత్రుల మార్పులసమితులు
+      title_nearby: దగ్గర్లోని వాడుకరుల మార్పులసమితులు
+      empty: మార్పులసమితులేమీ కనబడలేదు.
+      empty_area: ఈ ప్రాంతంలో మార్పులసమితులేమీ లేవు.
+      empty_user: ఈ వాడుకరి చేసిన మార్పులసమితులేమీ లేవు.
+      no_more: మరిన్ని మార్పులసమితులు కనబడలేదు.
+      no_more_area: ఈ ప్రాంతంలో మార్పులసమితులు మరి లేవు.
+      no_more_user: ఈ వాడుకరి మార్పులసమితులు ఇక లేవు.
       load_more: మరిన్ని చూపించు
+    timeout:
+      sorry: సారీ, మీరడిగిన మార్పులసమితుల జాబితాను తేవడంలో చాలా సమయం పట్టింది.
+  changeset_comments:
+    comment:
+      comment: '#%{changeset_id} మార్పులసమితిపై %{author} వ్యాఖ్య ఏమీ చెయ్యలేదు'
+      commented_at_by_html: '%{when} %{user} తాజాకరించారు'
+    comments:
+      comment: '#%{changeset_id} మార్పులసమితిపై %{author} గారి కొత్త వ్యాఖ్య'
+    index:
+      title_all: OpenStreetMap మార్పులసమితి చర్చ
+      title_particular: 'OpenStreetMap మార్పులసమితి #%{changeset_id} చర్చ'
+    timeout:
+      sorry: సారీ, మీరడిగిన మార్పులసమితి వ్యాఖ్యలు తేవడానికి చాలా సమయం పట్టింది.
   dashboards:
     contact:
       km away: '%{count}కిమీ దూరంలో'
       m away: '%{count}మీ దూరంలో'
     popup:
       your location: మీ ప్రాంతం
+      nearby mapper: సమీపం లోని మ్యాపరు
+      friend: మిత్రుడు
     show:
+      title: నా డ్యాష్‌బోర్డు
+      no_home_location_html: మీ సమీపం లోని వాడూకరులను చూసేందుకు %{edit_profile_link}
+        కు వెళ్ళి మీ స్థానాన్ని సెట్ చేసుకోండి.
+      edit_your_profile: మీ  ప్రొఫైలును సవరించండి
+      my friends: నా మిత్రులు
       no friends: మీరు ఇంకా స్నేహితులెవరినీ చేర్చలేదు.
       nearby users: 'దగ్గరలోని వాడుకరులు:'
+      no nearby users: మ్యాపింగు చేస్తామని చెబుతున్న వాడుకరులు సమీపంలో ఇంకా ఎవరూ లేరు.
+      friends_changesets: మిత్రుల మార్పులసమితులు
+      friends_diaries: మిత్రుల డైరీ పద్దులు
+      nearby_changesets: దగ్గర్లోని వాడుకరుల మార్పులసమితులు
+      nearby_diaries: సమీపం లోని వాడుకరుల డైరీ పద్దులు
   diary_entries:
     new:
       title: కొత్త దినచర్య పద్దు
@@ -222,68 +511,134 @@ te:
       user_title: '%{user} దినచర్య'
       in_language_title: '%{language}లో ఉన్న డైరీ పద్దులు'
       new: కొత్త దినచర్య పద్దు
+      new_title: నా వాడుకరి డైరీలో ఓ కొత్త పద్దు రాయండి
+      my_diary: నా డైరీ
       no_entries: డైరీ పద్దులు లేవు
       recent_entries: ఇటీవలి డైరీ పద్దులు
       older_entries: పాత పద్దులు
       newer_entries: కొత్త పద్దులు
     edit:
       title: డైరీ పద్దును మార్చు
+      marker_text: డైరీ పద్దు స్థానం
     show:
       title: '%{user} డైరీ | %{title}'
       user_title: '%{user} డైరీ'
       leave_a_comment: వ్యాఖ్యానించండి
       login_to_leave_a_comment_html: వ్యాఖ్యానించడానికి %{login_link}
       login: ప్రవేశించండి
+    no_such_entry:
+      title: అలాంటి డైరీ పద్దు ఏదీ లేదు
+      heading: 'ఈ ఐడీతో పద్దు లేదు: %{id}'
+      body: సారీ, %{id} అనే ఐడీతో డైరీ పద్దు గాని, వ్యాఖ్య గానీ లేదు. లేదా మీరు నొక్కిన
+        లింకు తప్పై ఉండవచ్చు.
     diary_entry:
+      posted_by_html: '%{link_user}, %{created} న %{language_link} లో పోస్టు చేసారు'
+      updated_at_html: చివరిగా %{updated} న తాజాకరించారు.
       comment_link: ఈ పద్దుపై వ్యాఖ్యానించండి
-      reply_link: à°\88 à°ªà°¦à±\8dà°¦à±\81à°ªà±\88 à°¸à±\8dà°ªà°\82దిà°\82à°\9aండి
+      reply_link: à°\95à°°à±\8dà°¤à°\95à±\81 à°¸à°\82à°¦à±\87à°¶à°\82 à°ªà°\82à°ªండి
       comment_count:
         zero: వ్యాఖ్యలు లేవు
         one: '%{count} వ్యాఖ్య'
         other: '%{count} వ్యాఖ్యలు'
       edit_link: ఈ పద్దును సవరించు
       hide_link: ఈ పద్దును దాచు
-      confirm: నిర్ధారించు
+      unhide_link: ఈ పద్దును చూపు
+      confirm: నిర్థారించండి
+      report: ఈ పద్దుపై ఫిర్యాదు చెయ్యండి
     diary_comment:
+      comment_from_html: '%{comment_created_at} %{link_user} చేసిన వ్యాఖ్య'
       hide_link: ఈ వ్యాఖ్యను దాచు
+      unhide_link: ఈ వ్యాఖ్యను చూపు
       confirm: నిర్ధారించు
+      report: ఈ వ్యాఖ్యపై ఫిర్యాదు చెయ్యి
     location:
       location: 'ప్రాంతం:'
       view: చూడండి
       edit: మార్చు
+      coordinates: '%{latitude}; %{longitude}'
+    feed:
+      user:
+        title: '%{user} చేర్చిన OpenStreetMap డైరీ పద్దులు'
+        description: '%{user} చేర్చిన ఇటీవలి OpenStreetMap డైరీ పద్దులు'
+      language:
+        title: '%{language_name} లో చేర్చిన OpenStreetMap డైరీ పద్దులు'
+        description: OpenStreetMap వాడుకరులు %{language_name} లో చేర్చిన ఇటీవలి డైరీ
+          పద్దులు
+      all:
+        title: OpenStreetMap డైరీ పద్దులు
+        description: OpenStreetMap వాడుకరులు ఇటీవల చేర్చిన డైరీ పద్దులు
     comments:
+      title: '%{user} చేర్చిన డైరీ వ్యాఖ్యలు'
+      heading: '%{user} గారి డైరీ వ్యాఖ్యలు'
+      subheading_html: '%{user} డైరీ వ్యాఖ్యలను చేర్చారు'
+      no_comments: డైరీ వ్యాఖ్యలేమీ లేవు
       post: పంపించు
       when: ఎప్పుడు
       comment: వ్యాఖ్య
       newer_comments: కొత్త వ్యాఖ్యలు
       older_comments: పాత వ్యాఖ్యలు
+  doorkeeper:
+    flash:
+      applications:
+        create:
+          notice: అనువర్తనం నమోదైంది.
   friendships:
     make_friend:
+      heading: '%{user} ను మిత్రులుగా చేర్చాలా?'
+      button: మిత్రులుగా చేర్చు
       success: '%{name} ఇప్పుడు మీ మిత్రులు!'
+      failed: సారీ, %{name} ను మిత్రులుగా చేర్చలేకపోయాం.
       already_a_friend: '%{name} మీకు ఇప్పటికే స్నేహితులు.'
+      limit_exceeded: మీరు ఈ మధ్య చాలామందితో మైత్రి కలుపుకున్నారు. మరింత మందితో మైత్రి
+        కలుపుకునే ముందు కాస్త ఆగండి.
+    remove_friend:
+      heading: '%{user} తో మైత్రి ఆపేస్తారా?'
+      button: మైత్రిని ఆపు
+      success: '%{name} ను మీ మిత్రుల జాబితా నుండి తీసేసాం.'
+      not_a_friend: '%{name} మీ మిత్రులు కాదు.'
   geocoder:
     search:
       title:
         latlon_html: <a href="http://openstreetmap.org/">అంతర్గత</a> ఫలితాలు
         ca_postcode_html: <a href="http://geocoder.ca/">Geocoder.CA</a> నుండి ఫలితాలు
+        osm_nominatim_html: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a> నుండి ఫలితాలు
         geonames_html: <a href="http://www.geonames.org/">GeoNames</a> నుండి ఫలితాలు
+        osm_nominatim_reverse_html: <a href="https://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a> నుండి ఫలితాలు
+        geonames_reverse_html: <a href="http://www.geonames.org/">GeoNames</a> నుండి
+          ఫలితాలు
     search_osm_nominatim:
+      prefix_format: '%{name}'
       prefix:
         aerialway:
           cable_car: కేబుల్ కారు
           chair_lift: చెయిర్ లిఫ్ట్
           drag_lift: డ్రాగ్ లిఫ్ట్
           gondola: గొండోలా లిఫ్ట్
+          magic_carpet: మాయ దుప్పటిపై లేవడం
+          platter: ప్లాటర్ లిఫ్టు
+          pylon: పైలాన్
           station: ఆకాశమార్గ స్టేషను
+          t-bar: T-బార్ లిఫ్టు
+          "yes": వాయు మార్గం
         aeroway:
           aerodrome: విమానాశ్రయం
+          airstrip: ఎయిర్‌స్ట్రిప్
           apron: విమానాశ్రయ విమానరహదారి
           gate: గేటు
+          hangar: హ్యంగర్
           helipad: హెలిప్యాడ్
+          holding_position: హోల్డింగ్ పొజిషన్
+          navigationaid: వైమానిక వేవిగేషను సహాయకం
+          parking_position: పార్కింగు పొజిషన్
           runway: రన్‍వే
+          taxilane: ట్యాక్సీ లేన్
           taxiway: ట్యాక్సీదారి
           terminal: ఆఖరి స్టేషను
+          windsock: విండ్‌సాక్
         amenity:
+          animal_boarding: జంతువుల హాస్టలు
           animal_shelter: పశుగృహం
           arts_centre: కళాకేంద్రం
           atm: ఏటీఎం
@@ -293,7 +648,9 @@ te:
           bench: బెంచీ
           bicycle_parking: సైకిళ్ళు నిలుపు స్థలం
           bicycle_rental: సైకిల్ అద్దెకిచ్చు స్థలం
+          bicycle_repair_station: సైకిలు రిపేరు స్థలం
           biergarten: బీరు తోట
+          blood_bank: రక్త నిధి
           boat_rental: బోట్ అద్దెకు
           brothel: వేశ్యావాటిక
           bus_station: బస్సలు ఆగు చోటు
@@ -302,11 +659,14 @@ te:
           car_sharing: కార్లు పంచుకునే స్థలం
           car_wash: కార్లు శుభ్రం చేసే స్థలం
           casino: జూదగృహం
+          charging_station: ఛార్జింగు స్టేషన్
+          childcare: శిశుకేంద్రం
           cinema: సినిమా
           clinic: ఆసుపత్రి
           clock: గడియారం
           college: కళాశాల
           community_centre: సామాజిక కేంద్రం
+          conference_centre: సమావేశ కేంద్రం
           courthouse: న్యాయస్థానం
           crematorium: శ్మశానవాటిక
           dentist: దంతవైద్యుడు
@@ -314,76 +674,271 @@ te:
           drinking_water: త్రాగు నీరు
           driving_school: డ్రైవింగ్ పాఠశాల
           embassy: దౌత్య కార్యాలయం
+          events_venue: ఘటనా వేదిక
           fast_food: అల్పాహారం
+          ferry_terminal: ఫెర్రీ టర్మినల్
+          fire_station: అగ్నిమాపక కేంద్రం
+          food_court: ఆహార శాల
+          fountain: ఫౌంటెన్
           fuel: ఇంధనం
+          gambling: జూదం
           grave_yard: స్మశానం
           hospital: ఆసుపత్రి
+          hunting_stand: వేట మంచె
           ice_cream: ఐస్ క్రీం
+          internet_cafe: ఇంటర్నెట్ కేఫ్
+          kindergarten: కిండర్‌గార్టెన్
+          language_school: భాషా పాఠశాల
           library: గ్రంథాలయం
+          loading_dock: లోడు చేసే రేవు
+          love_hotel: ప్రేమ హాస్టలు
           marketplace: సంత
+          mobile_money_agent: మొబైల్ మనీ ఏజంటు
+          monastery: ఆశ్రమం
+          money_transfer: డబ్బు బదిలీ
+          motorcycle_parking: మోటార్ సైకిలు పార్కింగు
+          music_school: సంగీత పాఠశాల
+          nightclub: నైట్ క్లబ్బు
+          nursing_home: నర్సింగ్ హోమ్
           parking: పార్కింగు
+          parking_entrance: పార్కింగు ప్రవేశం
+          parking_space: పార్కింగు ప్రదేశం
+          payment_terminal: చెల్లింపుల కేంద్రం
           pharmacy: మందుల దుకాణం
           place_of_worship: పూజా స్థలం
           police: పోలీసు
           post_box: తపాలా పెట్టె
           post_office: తపాలా కార్యాలయం
           prison: జైలు
+          pub: పబ్
+          public_bath: బహిరంగ స్నానఘట్టం
+          public_bookcase: బహిరంగ పుస్తకాల అలమర
+          public_building: బహిరంగ భవనం
+          ranger_station: రేంజర్ స్టేషను
+          recycling: రీసైక్లింగ్ పాయింటు
+          restaurant: రెస్టారెంటు
+          sanitary_dump_station: శానిటరీ డంపు స్టేషను
           school: బడి
+          shelter: ఆశ్రయం
+          shower: షవరు
+          social_centre: సామాజిక కేంద్రం
+          social_facility: సమాజిక సౌకర్యం
+          studio: స్టూడియో
           swimming_pool: ఈత కొలను
           taxi: టాక్సీ
           telephone: ప్రజా టెలీఫోను
           theatre: థియేటరు
           toilets: మరుగుదొడ్లు
+          townhall: గ్రామ కచేరి
+          training: శిక్షణ కేంద్రం
           university: విశ్వవిద్యాలయం
+          vehicle_inspection: వాహన తనిఖీ
+          vending_machine: వెండింగ్ యంత్రం
+          veterinary: పశు శస్త్రచికిత్స
+          village_hall: రచ్చబండ
           waste_basket: చెత్త బుట్ట
+          waste_disposal: వ్యర్థ పదార్థాల పారవేత
+          waste_dump_site: వ్యర్థాల డంపు స్థలం
+          watering_place: నీటి మడుగు
+          water_point: నీటి స్థలం
+          weighbridge: వే బ్రిడ్జి
+          "yes": సదుపాయం
         boundary:
+          aboriginal_lands: మూలవాసుల భూములు
           administrative: పరిపాలనా సరిహద్దు
+          census: జనగణన సరిహద్దు
           national_park: జాతీయ ఉద్యానవనం
+          political: నియోజకవర్గ సరిహద్దు
           protected_area: రక్షిత ప్రదేశం
+          "yes": సరిహద్దు
         bridge:
+          aqueduct: యాక్విడక్టు
+          boardwalk: బోర్డ్‌వాక్
+          suspension: వేలాడే వంతెన
+          swing: ఉయ్యాల వంతెన
+          viaduct: వయాడక్టు
           "yes": వంతెన
         building:
+          apartment: అపార్ట్‌మెంటు
+          apartments: అపార్ట్‌మెంట్లు
+          barn: బార్నీ
+          bungalow: బంగళా
+          cabin: పూరిల్లు
+          chapel: చాపెల్
           church: చర్చి కట్టడం
+          civic: పౌర సదుపాయ భవనం
+          college: కాలేజీ భవనం
+          commercial: వాణిజ్య భవనం
+          construction: నిర్మాణంలో ఉన్న భవనం
+          detached: విడిగా ఉన్న ఇల్లు
+          dormitory: డార్మిటరీ
+          duplex: డూప్లెక్స్ ఇల్లు
+          farm: ఫార్మ్ హౌస్
+          farm_auxiliary: ఆక్జిలరీ ఫార్మ్ హౌస్
+          garage: గ్యారేజీ
+          garages: గ్యారేజీలు
+          greenhouse: గ్రీన్‌హౌస్
+          hangar: హ్యాంగర్
+          hospital: ఆసుపత్రి భవనం
+          hotel: హోటలు భవనం
+          house: ఇల్లు
+          houseboat: హౌస్‌బోట్
+          hut: గుడిసె
+          industrial: పరిశ్రమ భవనం
+          kindergarten: కిండర్‌గార్టెన్ భవనం
+          manufacture: తయారీ భవనం
+          office: కార్యాలయ భవనం
+          public: పబ్లిక్ భవనం
+          residential: నివాస భవనం
+          retail: రీటెయిల్ భవనం
+          roof: కప్పు
+          ruins: శిథిల భవనం
+          school: పాఠశాల భవనం
+          semidetached_house: కొంత విడిగా ఉన్న భవనం
+          service: సేవా భవనం
+          shed: షెడ్డు
+          stable: గుర్రపు శాల
+          static_caravan: క్యారవాన్
+          temple: ఆలయ భవనం
+          terrace: టెర్రేస్ భవనం
+          train_station: రైల్వే స్టేషను భవనం
+          university: విశ్వవిద్యాలయ భవనం
+          warehouse: గిడ్డంగి
           "yes": భవనం
+        club:
+          scout: స్కౌట్ గ్రూపు స్థావరం
+          sport: క్రీడా క్లబ్బు
+          "yes": క్లబ్బు
         craft:
+          blacksmith: కమ్మరి
+          brewery: బ్రూవరీ
+          carpenter: వడ్రంగి
+          caterer: క్యాటరర్
+          confectionery: కాన్ఫెక్షనరీ
+          dressmaker: టైలరు
+          electrician: ఎలక్ట్రీషియన్
+          electronics_repair: ఎలక్ట్రానిక్స్ రిపేరు
+          gardener: తోటమాలి
+          handicraft: హస్తకళ
+          metal_construction: లోహాల పనివారు
           painter: పెయింటర్
           photographer: చాయాగ్రాహకుడు
+          plumber: ప్లంబరు
+          roofer: కప్పునేత పనివాడు
+          sawmill: కోతమిల్లు
+          shoemaker: చెప్పుల తయారీదారు
+          stonemason: కట్టుబడీ మేస్త్రీ
           tailor: దర్జీ
+          window_construction: కిటికీ తయారీ
+          winery: వైనరీ
+          "yes": క్రాఫ్టు దుకాణం
+        crossing: క్రాసింగు
+        emergency:
+          ambulance_station: అంబులెన్సు కేంద్రం
+          assembly_point: కూటమి స్థలం
+          defibrillator: డీఫైబ్రిలేటర్
+          fire_extinguisher: అగ్నిమాపకం
+          fire_water_pond: అగ్ని మాపక నీటి దొరువు
+          landing_site: అత్యవసర ల్యాండీంగు స్థలం
+          life_ring: అత్యవసర లైఫ్ రింగు
+          phone: అత్యవసర ఫోను
+          siren: అత్యవసర సైరను
+          suction_point: అత్యవసర సక్షన్ స్థానం
+          water_tank: అత్యవసర నీటి ట్యాంకు
         highway:
+          abandoned: విసర్జిత హైవే
+          bus_guideway: బస్ లేన్
+          bus_stop: బస్ స్టాపు
+          construction: నిర్మాణంలో ఉన్న హైవే
+          corridor: నడవా
+          cycleway: సైకిలు దారి
+          elevator: లిఫ్టు
+          emergency_access_point: అత్యవసర యాక్సెస్ స్థానం
+          emergency_bay: అత్యవసర బే
           footway: కాలినడక దారి
+          ford: చప్టా
+          give_way: దారి ఇవ్వు సూచిక
+          living_street: నివాసాల దారి
           milestone: మైలురాయి
+          motorway: మోటార్‌వే
+          motorway_junction: మోటార్‌వే కూడలి
+          motorway_link: మోటార్‌వే రోడ్డు
           path: దారి
           pedestrian: కాలిబాట
+          platform: ప్లాట్‌ఫారం
           primary: ప్రధాన రహదారి
           primary_link: ప్రధాన రహదారి
+          proposed: ప్రతిపాదిత రోడ్డు
+          raceway: పరుగు పందెపు దారి
           residential: నివాసప్రాంత దారి
           rest_area: విశ్రాంతి స్థలమ
           road: దారి
           secondary: ద్వితీయ శ్రేణి రహదారి
           secondary_link: ద్వితీయ శ్రేణి రహదారి
+          service: సర్వీసు రోడ్డు
+          services: మోటార్‌వే సర్వీసులు
+          speed_camera: స్పీడ్ కెమెరా
           steps: మెట్లు
+          stop: ఆగుము సూచిక
           street_lamp: వీధి దీపం
+          tertiary: తృతీయ రోడ్డు
+          tertiary_link: తృతీయ రోడ్డు
+          track: ట్రాకు
+          traffic_mirror: ట్రాఫిక్ అద్దం
+          traffic_signals: ట్రాఫిక్ సిగ్నళ్ళు
+          trailhead: ట్రెయిల్‌హెడ్
+          trunk: ట్రంక్ రోడ్డు
+          trunk_link: ట్రంక్ రోడ్డు
+          turning_circle: టర్నింగ్ వృత్తం
+          turning_loop: టర్నింగ్ లూపు
+          unclassified: వర్గీకరించని రోడ్డు
           "yes": దారి
         historic:
+          aircraft: చారిత్రిక విమానం
+          archaeological_site: పురాతత్వ స్థలం
+          bomb_crater: చారిత్రిక బాంబు బిలం
           battlefield: యుద్ధరంగం
           boundary_stone: సరిహద్దు రాయి
           building: చారిత్రక కట్టడం
+          bunker: బంకరు
+          cannon: చారిత్రిక శతఘ్ని
           castle: కోట
+          charcoal_pile: చారిత్రిక చార్‌కోల్ గుట్ట
           church: చర్చి
+          city_gate: నగర ద్వారం
           citywalls: నగర గోడలు
           fort: కోట
+          heritage: వారసత్వ స్థలం
+          hollow_way: పల్లపు దారి
           house: ఇల్లు
+          manor: మహల్
           memorial: జ్ఞాపిక
+          milestone: చారిత్రిక మైలురాయి
           mine: గని
+          mine_shaft: గని షాఫ్టు
           monument: స్మారకం
+          railway: చారిత్రిక రైలుమార్గం
+          roman_road: రోమన్ రోడ్డు
           ruins: శిథిలాలు
+          rune_stone: చారిత్రిక శిల
+          stone: శిల
           tomb: సమాధి
           tower: గోపురం
+          wayside_chapel: దారిపక్క చాపెల్
+          wayside_cross: దారిపక్క క్రాస్
+          wayside_shrine: దారిపక్క ఆలయం
+          wreck: శిథిలాలు
+          "yes": చారిత్రిక స్థలం
         junction:
           "yes": కూడలి
         landuse:
+          allotments: సామూహిక పొలాలు
+          aquaculture: చేపల పెంపకం
+          basin: బేసిన్
+          brownfield: విసర్జిత భూమి
           cemetery: శ్మశానం
           commercial: వాణిజ్య ప్రదేశం
+          conservation: సంరక్షణ
           construction: నిర్మాణం
           farm: పొలం
           farmland: పంటపొలం
@@ -391,102 +946,427 @@ te:
           forest: అడవి
           garages: మరమ్మత్తు శాలలు
           grass: పచ్చిక
+          greenfield: గ్రీన్‌ఫీల్డ్ భూమి
           industrial: పారిశ్రామిక ప్రదేశం
+          landfill: ల్యాండ్‌ఫిల్
           meadow: పచ్చిక బయలు
           military: సైనిక ప్రాంతం
           mine: గని
           orchard: పళ్ళతోట
+          plant_nursery: మొక్కల నర్సరీ
           quarry: క్వారీ
           railway: రైల్వే
+          recreation_ground: వినోద మైదానం
+          religious: మతపరమైన మైదానం
           reservoir: జలాశయం
           reservoir_watershed: జలాశయం
           residential: నివాస ప్రాంతం
+          retail: రిటెయిల్
+          vineyard: వైన్‌యార్డు
           "yes": భూఉపయోగం
         leisure:
+          adult_gaming_centre: వయోజన క్రీడా కేంద్రం
+          amusement_arcade: అమ్యూస్‌మెంటు కేంద్రం
+          bandstand: బ్యాండ్‌స్టాండ్
           beach_resort: బీచి రిసార్టు
           bird_hide: పక్షులకు ఆవాసం
+          bleachers: బ్లీచర్లు
+          bowling_alley: బౌలింగ్ అల్లీ
+          common: కామన్ భూమి
+          dance: నాట్యాంగణం
+          dog_park: కుక్కల పార్కు
+          firepit: ఫైర్ పిట్
           fishing: చేపలు పట్టే స్థలం
+          fitness_centre: వ్యాయామ కేంద్రం
+          fitness_station: వ్యాయామ స్థలం
           garden: తోట
+          golf_course: గోల్ఫ్ కోర్సు
+          horse_riding: గుర్రపు స్వారీ
+          ice_rink: ఐస్ రింక్
+          marina: మెరీనా
+          miniature_golf: చిన్నపాటి గోల్ఫ్
+          nature_reserve: ప్రకృతి సంరక్షణ కేంద్రం
+          outdoor_seating: బయటి సీటింగు
           park: పార్కు
+          picnic_table: పిక్నిక్ టేబులు
+          pitch: క్రీడల పిచ్
           playground: ఆటస్థలం
+          recreation_ground: క్రీడా మైదానం
+          resort: రిసార్టు
+          sauna: సౌనా
+          slipway: స్లిప్‌వే
+          sports_centre: క్రీడా కేంద్రం
+          stadium: స్టేడియమ్
           swimming_pool: ఈత కొలను
+          track: రన్నింగ్ ట్రాకు
+          water_park: వాటర్ పార్కు
+          "yes": లీజరు
         man_made:
+          adit: ఆడిట్
+          advertising: అడ్వర్టైజింగు
+          antenna: యాంటెన్నా
+          avalanche_protection: అవలాంచి సంరక్షణ కేంద్రం
+          beacon: బీకన్
+          beam: పుంజం
+          beehive: తేనెపట్టు
+          breakwater: బ్రేక్‌వాటర్
+          bridge: వంతెన
+          bunker_silo: బంకరు
+          cairn: కెయిర్న్
+          chimney: పొగగొట్టం
+          clearcut: నరికిన అడవి
+          communications_tower: కమ్యూనికేషను టవరు
+          crane: క్రేను
+          cross: క్రాస్
+          dolphin: కట్టుగుంజ
+          dyke: డైక్
+          embankment: కరకట్ట
+          flagpole: జండా కొయ్య
+          gasometer: గ్యాసోమీటర్
+          groyne: గ్రోయ్నె
+          kiln: బట్టీ
+          lighthouse: దీపస్థంభం
+          manhole: మ్యాన్‌హోల్
+          mast: మాస్ట్
+          mine: గని
+          mineshaft: గని షాఫ్టు
+          monitoring_station: మానిటరింగ్ స్టేషను
+          petroleum_well: పెట్రోలియం బావి
+          pier: పయర్
+          pipeline: పైప్‌లైను
+          pumping_station: పంపింగు స్టేషను
+          reservoir_covered: మూతవేసిన జలాశయం
+          silo: సైలో
+          snow_cannon: మంచు శతఘ్ని
+          snow_fence: మంచు కంచె
+          storage_tank: నిల్వ ట్యాంకు
+          street_cabinet: వీధి క్యాబినెట్
+          surveillance: నిఘా
+          telescope: టెలిస్కోపు
+          tower: టవరు
+          utility_pole: సదుపాయ స్థంభం
+          wastewater_plant: వ్యర్థజలాల ప్లాంటు
+          watermill: నీటి మర
+          water_tap: నీటి కుళాయి
+          water_tower: నీళ్ళ టవరు
           water_well: బావి
+          water_works: నీటి సరఫరా కేంద్రం
+          windmill: గాలి మర
           works: కర్మాగారం
+          "yes": మానవ నిర్మిత
+        military:
+          airfield: సైనిక వైమానిక క్షేత్రం
+          barracks: బ్యారక్‌లు
+          bunker: బంకరు
+          checkpoint: చెక్‌పాయింటు
+          trench: కందకం
+          "yes": సైనిక
+        mountain_pass:
+          "yes": కనుమదారి
         natural:
+          atoll: అటాల్
+          bare_rock: రాతి ప్రదేశం
+          bay: అఖాతం
           beach: బీచి
+          cape: అగ్రం
           cave_entrance: గుహ ద్వారం
+          cliff: కొండకొన
+          coastline: తీరరేఖ
+          crater: బిలం
+          dune: తిన్నె
+          fell: ఫెల్
+          fjord: ఫ్యోర్డ్
           forest: అడవి
+          geyser: గీసర్
           glacier: హిమానీనదం
+          grassland: పచికబయలు
           heath: ఆరోగ్యం
           hill: గుట్ట
+          hot_spring: వేడినీటి బుగ్గ
           island: దీవి
+          isthmus: భూసంధి
           land: నేల
+          marsh: బురద
+          moor: బంజరు
           mud: బురద
           peak: శిఖరం
+          peninsula: ద్వీపకల్పం
+          point: బిందువు
+          reef: భిత్తిక
+          ridge: కొండ
           rock: రాయి
           sand: ఇసుక
+          scree: స్క్రీ
+          scrub: పొద
+          shingle: గులకరాళ్ళు
           spring: ఊట
           stone: రాయి
           strait: జలసంధి
           tree: చెట్టు
+          tree_row: చెట్ల వరుస
+          tundra: టండ్రా
           valley: లోయ
           volcano: అగ్ని పర్వతం
           water: నీరు
           wetland: చిత్తడి నేల
           wood: అడవి
+          "yes": ప్రాకృతిక విశేషం
         office:
+          accountant: ఎకౌంటెంటు
+          administrative: పరిపాలన
+          advertising_agency: అడ్వర్టైజింగు ఏజన్సీ
           architect: వాస్తుశిల్పి
+          association: అసోసియేషను
           company: సంస్థ
+          diplomatic: దౌత్య కార్యాలయం
+          educational_institution: విద్యా సంస్థ
+          employment_agency: ఉపాధి కేంద్రం
+          energy_supplier: విద్యుత్తు సరఫరా కార్యాలయం
+          estate_agent: ఎస్టేటు ఏజంటు
+          financial: ఫైనాన్షియల్ కార్యాలయం
           government: ప్రభుత్వ కార్యాలయం
           insurance: బీమా కార్యాలయం
+          it: ఐటీ కార్యాలయం
           lawyer: న్యాయవాది
+          logistics: లాజిస్టిక్స్ కార్యాలయం
+          newspaper: వార్తాసంస్థ కార్యాలయం
+          ngo: NGO కార్యాలయం
+          notary: నోటరీ
+          religion: మతపరమైన కార్యాలయం
+          research: పరిశోధన కార్యాలయం
+          tax_advisor: పన్ను సలహాదారు
+          telecommunication: టెలికమ్యూనికేషను కార్యాలయం
+          travel_agent: ట్రావెల్ ఏజన్సీ
           "yes": కార్యాలయం
         place:
+          allotments: కేటాయింపులు
+          archipelago: ద్వీపసమూహం
           city: నగరం
+          city_block: నగరంలో పేట
           country: దేశం
+          county: జిల్లా
+          farm: పొలం
           hamlet: కుగ్రామం
           house: ఇల్లు
           houses: ఇళ్ళు
           island: దీవి
+          islet: దీవి
+          isolated_dwelling: ఒంటరి నివాసం
+          locality: ప్రదేశం
+          municipality: మునిసిపాలిటీ
+          neighbourhood: పేట
+          plot: స్థలం
           postcode: తపాలా సంకేతం
+          quarter: క్వార్టరు
           region: ప్రాంతం
           sea: సముద్రం
+          square: స్క్వేర్
           state: రాష్ట్రం
           subdivision: ఉపవిభాగం
+          suburb: శివారు
           town: పట్టణం
           village: గ్రామం
+          "yes": స్థలం
         railway:
+          abandoned: విసర్జిత రైల్వే
+          buffer_stop: బఫర్ స్టాప్
+          construction: నిర్మాణంలో ఉన్న రైలుమార్గం
+          disused: వాడని రైలుమార్గం
+          funicular: ఎత్తుకు వెళ్ళే రైలుమార్గం
+          halt: రైలు స్టేషను
+          junction: రైల్వే జంక్షను
+          level_crossing: లెవెల్ క్రాసింగు
+          light_rail: లైట్ రైల్
+          miniature: ఆట రైల్వే
+          monorail: మోనోరైల్
+          narrow_gauge: న్యారో గేజ్ రైలు మార్గం
           platform: రైల్వే ప్లాట్‌ఫారం
+          preserved: సంరక్షిత్య రైలుమార్గం
+          proposed: ప్రతిపాదిత రైలుమార్గం
+          rail: రైలు పట్టా
+          spur: రైల్వే స్పర్
           station: రైల్వే స్టేషన్
+          stop: రైల్వే స్టాప్
+          subway: సబ్‌వే
+          subway_entrance: సబ్‌వే ప్రవేశం
+          switch: రైలుమార్గపు పాయింట్లు
+          tram: ట్రామ్‌వే
+          tram_stop: ట్రామ్ స్టాపు
+          turntable: టర్న్‌టేబులు
+          yard: రైల్వే యార్డు
         shop:
+          agrarian: వ్యవసాయ ఉత్పత్తుల దుకాణం
+          alcohol: ఆఫ్ లైసెన్సు
+          antiques: ప్రాచీన వస్తువులు
+          appliance: అప్లయన్సుల దుకాణం
+          art: కళా దుకాణం
+          baby_goods: శిశువుల వస్తువులు
+          bag: సంచుల దుకాణం
+          bakery: బేకరీ
+          bathroom_furnishing: బాత్‌రూము అలంకరణ
+          beauty: సౌందర్య దుకాణం
+          bed: బెడ్డీంగు సామాగ్రి
+          bicycle: సైకిలు దుకాణం
+          bookmaker: బుక్‌మేకరు
+          books: పుస్తకాల దుకాణం
+          boutique: బొటీక్
           butcher: కసాయి
+          car: కారు దుకాణం
+          car_parts: కారు పార్టులు
+          car_repair: కారు రిపేరు
+          carpet: కార్పెట్ దుకాణం
+          charity: చారిటీ దుకాణం
+          cheese: వెన్న దుకాణం
+          chemist: కెమిస్టు
+          chocolate: చాకొలేట్
+          clothes: బట్టల దుకాణం
+          coffee: కాఫీ దుకాణం
+          computer: కంప్యూటరు దుకాణం
+          confectionery: కాన్ఫెక్షనరీ దుకాణం
+          convenience: కన్వీనియెన్స్ దుకాణం
+          copyshop: కాపీ దుకాణం
+          cosmetics: కాస్మెటిక్స్ దుకాణం
+          craft: బొమ్మల సరఫరా దుకాణం
+          curtain: కర్టెన్ల దుకాణం
+          dairy: పాల దుకాణం
+          deli: డేలి
+          department_store: డిపార్ట్‌మెంటు దుకాణం
+          discount: డిస్కౌంటు వస్తువుల దుకాణం
+          doityourself: డ్రై క్లీనింగు
+          dry_cleaning: డ్రై క్లీనింగు
+          e-cigarette: ఇ-సిగరెట్ల దుకాణం
+          electronics: ఎలక్ట్రానిక్స్ దుకాణం
+          erotic: శృంగార దుకాణం
+          estate_agent: ఎస్టేటు ఏజంటు
+          fabric: వస్త్రాల దుకాణం
+          farm: వ్యవసాయ దుకాణం
+          fashion: ఫ్యాషన్ దుకాణం
+          fishing: ఫిషింగు వస్తువుల దుకాణం
+          florist: పూల దుకాణం
+          food: ఆహార దుకాణం
+          frame: ఫ్రేమ్ దుకాణం
+          funeral_directors: ఖనన కర్మల స్థానం
+          furniture: ఫర్నిచర్
+          garden_centre: తోట దుకాణం
+          gas: గ్యాసు దుకాణం
+          general: జనరల్ దుకాణం
+          gift: బహుమతుల దుకాణం
+          greengrocer: కూరగాయల దుకాణం
+          grocery: కిరాణా దుకాణం
+          hairdresser: క్షౌరశాల
+          hardware: హార్డ్‌వేర్ దుకాణం
+          health_food: హెల్త్ ఫుడ్ దుకాణం
+          hearing_aids: చెవిటి మిషన్లు
+          hifi: హై-ఫై
+          ice_cream: ఐస్ క్రీము దుకాణం
+          interior_decoration: ఇంటీరియర్ డెకొరేషను
           jewelry: నగల దుకాణం
+          kiosk: బడ్డీ కొట్టు
+          kitchen: వంటగది దుకాణం
           laundry: చాకలి
+          locksmith: తాళాల పనివారు
+          lottery: లాటరీ
+          mall: మాల్
+          massage: మాలీషు
+          medical_supply: మందుల సరఫరా దుకాణం
+          mobile_phone: మొబైల్ ఫోను దుకాణం
+          money_lender: వడ్డీ వ్యాపారి
+          motorcycle: మోటార్‌సైకిలు దుకాణం
+          motorcycle_repair: మోటార్‌సైకిలు రిపేరు దుకాణం
+          music: సంగీతం దుకాణం
+          musical_instrument: సంగీత వాయిద్యాలు
+          newsagent: న్యూస్ ఏజంటు
+          nutrition_supplements: పౌష్టికాహారం
+          optician: కళ్ళజోళ్ళు
+          organic: ఆర్గానిక్ ఆహారం దుకాణం
+          outdoor: ఔట్‌డోర్ దుకాణం
+          paint: రంగుల దుకాణం
+          pastry: పేస్ట్రీ దుకాణం
+          pawnbroker: తాకట్టు వ్యాపారి
+          perfumery: సెంటు వ్యాపారి
+          pet: పెంపుడు జంతువుల దుకాణం
+          pet_grooming: పెంపుడు జంతువుల అలంకరణ
+          photo: ఫొటో స్టూడియో
+          seafood: సముద్రపు ఆహారం
+          second_hand: సెకండ్ హ్యాండ్ దుకాణం
+          sewing: కుట్టుపని దుకాణం
+          shoes: చెప్పుల దుకాణం
+          sports: క్రీడల దుకాణం
+          stationery: స్టేషనరీ దుకాణం
+          storage_rental: అద్దె గిడ్డంగి
+          supermarket: సూపర్ మార్కెట్
           tailor: దర్జీ
+          tattoo: పచ్చబొట్ల దుకాణం
+          tea: టీ కొట్టు
+          ticket: టిక్కెట్ల దుకాణం
+          tobacco: పొగాకు దుకాణం
           toys: బొమ్మల అంగడి
+          travel_agency: ట్రావెల్ ఏజన్సీ
+          tyres: టైర్ల దుకాణం
+          vacant: ఖాళీ దుకాణం
+          variety_store: వెరైటీ దుకాణం
+          video: వీడియో దుకాణం
+          video_games: వీడియో గేమ్ దుకాణం
+          wholesale: టోకు దుకాణం
+          wine: వైన్ దుకాణం
           "yes": దుకాణం
         tourism:
-          apartment: అపార్టుమెంట్
+          alpine_hut: ఆల్పైన్ గుడిసె
+          apartment: సెలవు కాలపు అపార్టుమెంట్
+          artwork: కళాకృతి
+          attraction: ఆకర్షణ
+          bed_and_breakfast: బస, బ్రేక్‌ఫాస్టు
+          cabin: పూరిల్లు
+          camp_pitch: శిబిరం పిచ్
+          camp_site: శిబిరాల స్థలం
+          caravan_site: క్యారవాన్ స్థలం
+          chalet: చాలెట్
+          gallery: చిత్ర ప్రదర్శన
+          guest_house: అతిథి గృహం
+          hostel: హాస్టలు
           hotel: హోటెల్
           information: సమాచారం
+          motel: మోటెల్
           museum: ప్రదర్శన శాల
+          picnic_site: పిక్నిక్ స్థలం
+          theme_park: థీమ్ పార్కు
+          viewpoint: వ్యూ పాయింటు
+          wilderness_hut: అడవి గుడిసె
           zoo: జంతుప్రదర్శనశాల
         tunnel:
+          building_passage: బిల్డింగ్ పాసేజీ
           culvert: చప్టా
           "yes": సొరంగం
         waterway:
+          artificial: కృత్రిమ జలమార్గం
+          boatyard: పడవల రేవు
           canal: కాలువ
           dam: ఆనకట్ట
+          derelict_canal: పూడిపోయిన కాలువ
+          ditch: గుంట
+          dock: డాక్
           drain: మురిక్కాలువ
+          lock: లాకులు
+          lock_gate: లాకు తలుపు
+          mooring: పడవను కట్టేసే కొయ్య
+          rapids: వడివాగు
           river: నది
+          stream: వాగు
+          wadi: వాడి
           waterfall: జలపాతం
+          weir: కట్ట
+          "yes": జలమార్గం
       admin_levels:
         level2: దేశ సరిహద్దు
+        level3: ప్రాంతపు సరిహద్దు
         level4: రాష్ట్ర సరిహద్దు
         level5: ప్రాంతపు సరిహద్దు
+        level6: దేశ సరిహద్దు
+        level7: మునిసిపాలిటీ సరిహద్దు
         level8: నగర సరిహద్దు
         level9: గ్రామ పొలిమెర
+        level10: శివారు సరిహద్దు
+        level11: పేట సరిహద్దు
       types:
         cities: నగరాలు
         towns: పట్టణాలు
@@ -496,8 +1376,101 @@ te:
       more_results: మరిన్ని ఫలితాలు
   issues:
     index:
+      title: అంశాలు
+      select_status: స్థితిని ఎంచుకోండి
+      select_type: రకాన్ని ఎంచుకోండి
+      select_last_updated_by: చివరిగా తాజాకరించినది ఎవరో ఎంచుకోండి
+      reported_user: నివేదించిన వాడుకరి
+      not_updated: తాజాకరించలేదు
+      search: వెతుకు
+      search_guidance: 'అంశాల్లో వెతుకు:'
+      user_not_found: వాడుకరి ఉనికిలో లేరు
+      issues_not_found: అలాంటి అంశాలేమీ కనబడలేదు
       status: స్థితి
       reports: నివేదికలు
+      last_updated: చివరిగా తాజాకరించినది
+      last_updated_time_html: <abbr title='%{title}'>%{time}</abbr>
+      last_updated_time_user_html: <abbr title='%{title}'>%{time}</abbr>, %{user}
+      link_to_reports: నివేదికలను చూడండి
+      reports_count:
+        one: 1 ఫిర్యాదు
+        other: '%{count} ఫిర్యాదులు'
+      reported_item: అంశంపై ఫిర్యాదు చేసారు
+      states:
+        ignored: పట్టించుకోలేదు
+        open: తెరిచి ఉన్నవి
+        resolved: పరిష్కరించినవి
+    update:
+      new_report: మీ ఫిర్యాదు జయప్రదంగా నమోదైంది.
+      successful_update: మీ ఫిర్యాదును జయ[ప్రదంగా తాజాకరించాం
+      provide_details: ఆవశ్యకమైన వివరాలను ఇవ్వండి
+    show:
+      title: '%{status} అంశం #%{issue_id}'
+      report_created_at: '%{datetime} న మొదటిసారి ఫిర్యాదు చేసారు'
+      last_resolved_at: '%{datetime} న చివరిగా పరిష్కరించారు'
+      last_updated_at: చివరిగా %{displayname} గారు %{datetime} కు తాజాకరించారు
+      resolve: పరిష్కరించు
+      ignore: పట్టించుకోవద్దు
+      reopen: మళ్ళీ తెరువు
+      reports_of_this_issue: ఈ అంశంపై ఫిర్యాదులు
+      read_reports: చదివిన ఫిర్యాదులు
+      new_reports: కొత్త ఫిర్యాదులు
+      other_issues_against_this_user: ఈ వాడుకరికి వ్యతిరేకంగా ఉన్న ఇతర అంశాలు
+      no_other_issues: ఈ వాడుకరిపై ఇక వేరే అంశాలేమీ లేవు.
+      comments_on_this_issue: ఈ అంశంపై వ్యాఖ్యలు
+    resolve:
+      resolved: అంశం స్థితిని 'పరిష్కారమైంది' అని మార్చాం
+    ignore:
+      ignored: అంశం స్థితిని 'విస్మరించాం' అని మార్చాం
+    reopen:
+      reopened: అంశం స్థితిని 'తెరిచి ఉన్న' అని పెట్టాం
+    comments:
+      comment_from_html: '%{comment_created_at} %{user_link} చేసిన వ్యాఖ్య'
+      reassign_param: అంశాన్ని తిరిగి కేటాయించాలా?
+    reports:
+      reported_by_html: '%{user} %{updated_at} న %{category} అని ఫిర్యాదు చేసారు'
+    helper:
+      reportable_title:
+        diary_comment: '%{entry_title}, వ్యాఖ్య #%{comment_id}'
+        note: 'గమనిక #%{note_id}'
+  issue_comments:
+    create:
+      comment_created: మీ వ్యాఖ్యను జయప్రదంగా చేర్చాం
+  reports:
+    new:
+      title_html: '%{link} పై ఫిర్యాదు చెయ్యండి'
+      missing_params: కొత్త ఫిర్యాదును సృష్టించలేం
+      disclaimer:
+        intro: 'మీ ఫిర్యాదును మోడరేటర్లకు పంపించేముందు, దీన్ని నిశ్చయపరచుకోండి:'
+        not_just_mistake: సమస్య కేవలం పొరపాటు కాదని మీకు నిశ్చయంగా తెలుసు
+        unable_to_fix: మీరే స్వయంగా గానీ, మీ తోటి సముదాయ సభ్యులతో కలిసి గానీ సమస్యను
+          పరిష్కరించలేకపోయారు
+        resolve_with_user: సంబంధిత వాడుకరితో కలిసి సమస్యను పరిష్కరించే ప్రయత్నం చేసారు
+      categories:
+        diary_entry:
+          spam_label: ఈ డైరీ పద్దులో స్పాము ఉంది/అసలు అదే ఒక స్పాము
+          offensive_label: ఈ డైరీ పద్దు అసహ్యంగా/వికారంగా ఉంది
+          threat_label: ఈ డైరీ పద్దులో బెదిరింపు ఉంది
+          other_label: ఇతర
+        diary_comment:
+          spam_label: ఈ డైరీ వ్యాఖ్యలో స్పాము ఉంది/అసలు అదే ఒక స్పాము
+          offensive_label: ఈ డైరీ వ్యాఖ్య అసహ్యంగా/వికారంగా ఉంది
+          threat_label: ఈ డైరీ వ్యాఖ్యలో బెదిరింపు ఉంది
+          other_label: ఇతర
+        user:
+          spam_label: వాడుకరి ప్రొఫైలులో స్పాము ఉంది/అదే ఒక స్పాము
+          offensive_label: వాడుకరి ప్రొఫైలు అసహ్యంగా/వికారంగా ఉంది
+          threat_label: వాడూకరి ప్రొఫైల్లో వెదిరింపు ఉంది
+          vandal_label: ఈ వాడుకరి దుశ్చర్యలు చేస్తారు
+          other_label: ఇతర
+        note:
+          spam_label: ఈ గమనిక స్పాము
+          personal_label: ఈ గమనికలో వ్యక్తిగత డేటా ఉంది
+          abusive_label: ఈ గమనికలో తిట్లున్నాయి
+          other_label: ఇతర
+    create:
+      successful_report: మీ ఫిర్యాదు జయప్రదంగా నమోదైంది
+      provide_details: ఆవశ్యకమైన వివరాలను ఇవ్వండి
   layouts:
     logo:
       alt_text: ఓపెన్&zwnj;స్ట్రీట్&zwnj;మాప్ చిహ్నం
@@ -506,49 +1479,191 @@ te:
     log_in: ప్రవేశించండి
     log_in_tooltip: ఇప్పటికే ఉన్న ఖాతాతో ప్రవేశించండి
     sign_up: నమోదవ్వండి
+    start_mapping: మ్యాపింగు మొదలుపెట్టండి
     sign_up_tooltip: సవరించడానికి ఓ ఖాతా సృష్టించుకోండి
     edit: మార్చు
     history: చరిత్ర
     export: ఎగుమతి
+    issues: అంశాలు
     data: డేటా
+    export_data: డేటాను ఎగుమతి చెయ్యి
+    gps_traces: GPS జాడలు
+    gps_traces_tooltip: GPS జాడలను నిర్వహించు
     user_diaries: వాడుకరి డైరీలు
+    user_diaries_tooltip: వాడుకరి డైరీలను చూడండి
     edit_with: '%{editor} తో సవరించండి'
     tag_line: స్వేచ్ఛా వికీ ప్రపంచ పటం
     intro_header: ఓపెన్‌స్ట్రీట్‌మ్యాప్‌కి స్వాగతం!
+    intro_text: OpenStreetMap, ఓ ప్రపంచ మ్యాపు. మీలాంటి వారే దీన్ని తయారు చేసారు.
+      స్వేచ్ఛా లైసెన్సు ద్వారా స్వేచ్ఛగా దీన్ని వాడుకోవచ్చు.
     intro_2_create_account: వాడుకరి ఖాతాను సృష్టించుకోండి
+    hosting_partners_html: '%{ucl}, %{fastly}, %{bytemark}, ఇతర %{partners} హోస్టింగుకు
+      మద్దతు నిస్తున్నారు.'
+    partners_ucl: UCL
+    partners_fastly: Fastly
+    partners_bytemark: Bytemark Hosting
     partners_partners: భాగస్వాములు
     tou: వాడుక నియమాలు
+    osm_offline: OpenStreetMap డేటాబేసులో అత్యావశ్యకమైన నిర్వహణ పనులు జరుగుతున్నందున
+      అది ప్రస్తుతం ఆఫ్‌లైనులో ఉంది.
+    osm_read_only: OpenStreetMap డేటాబేసులో అత్యావశ్యకమైన నిర్వహణ పనులు జరుగుతున్నందున
+      అది ప్రస్తుతం రీడ్-ఓన్లీ స్థితిలో ఉంది.
+    donate: హార్డ్‌వేర్ అప్‌గ్రేడ్ నిధికి %{link} ఇచ్చి, OpenStreetMap కు మద్దతివ్వండి.
     help: సహాయం
     about: గురించి
     copyright: నకలుహక్కులు
     community: కమ్యూనిటీ
     community_blogs: కమ్యూనిటీ బ్లాగులు
+    community_blogs_title: OpenStreetMap సముదాయ సభ్యుల బ్లాగులు
     foundation: ఫౌండేషన్
+    foundation_title: OpenStreetMap ఫౌండేషను
     make_a_donation:
+      title: OpenStreetMap కు ధనసహాయం చేసి మద్దతివ్వండి
       text: విరాళమివ్వండి
     learn_more: మరింత తెలుసుకోండి
     more: మరిన్ని
   user_mailer:
     diary_comment_notification:
+      subject: '[OpenStreetMap] %{user} ఒక డైరీ పద్దుపై వ్యాఖ్యానించారు'
       hi: హలో %{to_user},
+      header: '%{from_user}, %{subject} అనే సబ్జెక్టుతో OpenStreetMap డైరీ పద్దుపై
+        వ్యాఖ్యానించారు:'
+      header_html: '%{from_user}, %{subject} అనే సబ్జెక్టుతో OpenStreetMap డైరీ పద్దుపై
+        వ్యాఖ్యానించారు:'
+      footer: '%{readurl} వద్ద కూడా మీరు ఈ వ్యాఖ్యను చదవవచ్చు, %{commenturl} వద్ద
+        వ్యాఖ్యానించవచ్చు, %{replyurl} వద్ద వారికి సందేశం పంపించవచ్చు.'
+      footer_html: '%{readurl} వద్ద కూడా మీరు ఈ వ్యాఖ్యను చదవవచ్చు, %{commenturl}
+        వద్ద వ్యాఖ్యానించవచ్చు, %{replyurl} వద్ద వారికి సందేశం పంపించవచ్చు.'
     message_notification:
+      subject: '[OpenStreetMap] %{message_title}'
       hi: హలో %{to_user},
+      header: '%{from_user}, %{subject} అనే సబ్జెక్టుతో OpenStreetMap ద్వారా మీకొక
+        సందేశం పంపించారు:'
+      header_html: '%{from_user}, %{subject} అనే సబ్జెక్టుతో OpenStreetMap ద్వారా
+        మీకొక సందేశం పంపించారు:'
+      footer: ఆ సందేశాన్ని %{readurl} వద్ద కూడా చదవవచ్చు, %{replyurl} వద్ద వారికి
+        సందేశం పంపించవచ్చు
+      footer_html: ఆ సందేశాన్ని %{readurl} వద్ద కూడా చదవవచ్చు, %{replyurl} వద్ద వారికి
+        సందేశం పంపించవచ్చు
+    friendship_notification:
+      hi: నమస్కారం %{to_user} గారూ,
+      subject: '[OpenStreetMap] %{user} మిమ్మల్ని మిత్రులుగా చేర్చుకున్నారు'
+      had_added_you: '%{user} మిమ్మల్ని OpenStreetMap లో మిత్రులుగా చేర్చుకున్నారు.'
+      see_their_profile: '%{userurl} వద్ద వారి ప్రొఫైలును చూడవచ్చు.'
+      see_their_profile_html: '%{userurl} వద్ద వారి ప్రొఫైలును చూడవచ్చు.'
+      befriend_them: '%{befriendurl} వద్ద వారిని మీరు కూడా మిత్రులుగా చేసుకోవచ్చు.'
+      befriend_them_html: అలాగే, %{befriendurl} వద్ద వారిని మీ మిత్రులుగా చేర్చుకోవచ్చు.
+    gpx_description:
+      description_with_tags_html: 'మీ GPX ఫైలుకు %{trace_name}, %{trace_description}
+        వివరణ, కింది ట్యాగులూ ఉన్నట్లున్నాయి: %{tags}'
+      description_with_no_tags_html: మీ GPX ఫైలు %{trace_name}, %{trace_description}
+        వివరణతో ట్యాగులేమీ లేకుండా ఉన్నట్లుంది
+    gpx_failure:
+      hi: నమస్కారం %{to_user} గారూ,
+      failed_to_import: 'దిగుమతి విఫలమైంది. లోపం ఇది:'
+      more_info_html: GPX దిగుమతి వైఫల్యాల గురించి, వాటిని ఎలా నివారించాలనేదాని గురించీ
+        మరింత సమాచారాన్ని %{url} వద్ద చూడవచ్చు.
+      import_failures_url: https://wiki.openstreetmap.org/wiki/GPX_Import_Failures
+      subject: '[OpenStreetMap] GPX దిగుమతి వైఫల్యం'
+    gpx_success:
+      hi: నమస్కారం %{to_user} గారూ,
+      loaded_successfully:
+        one: సంభావ్యమైన 1 పాయింటులో %{trace_points} తో జయప్రదంగా లోడు చేసాం.
+        other: సంభావ్యమైన %{possible_points} పాయింట్లలో %{trace_points} తో జయప్రదంగా
+          లోడు చేసాం.
+      subject: '[OpenStreetMap] GPX దిగుమతి జయప్రదం'
     signup_confirm:
       subject: '[ఓపెన్‌స్ట్రీట్‌మ్యాప్] ఓపెన్‌స్ట్రీట్‌మ్యాప్‌కి స్వాగతం'
+      greeting: హలో!
       created: ఎవరో (మీరే కావచ్చు) %{site_url} లో ఖాతాను సృష్టించారు.
+      confirm: 'ఇంకేదైనా చెయ్యబోయే ముందు, ఈ అభ్యర్థన మీనుండే వచ్చిందని మేం నిర్థారించుకోవాలి.
+        అంచేత, ఆ అభ్యర్థన మీరే చేసి ఉంటే, కింది లింకును నొక్కి మీ ఖాతాను నిర్థారించండి:'
+      welcome: మీరు మీ ఖాతాను నిర్థారించాక, మీరు పని మొదలుపెట్టేందుకు గాను, మేం మీకు
+        మరికొంత సమాచారాన్ని ఇస్తాం.
     email_confirm:
       subject: '[ఓపెన్‌స్ట్రీట్‌మాప్] మీ ఈమెయిలు చిరునామాని నిర్ధారించండి'
+      greeting: హలో,
+      hopefully_you: ఎవరో (మీరే అయి ఉండవచ్చు) %{server_url} వద్ద ఉన్న తమ ఈమెయిలు చిరునామాను
+        %{new_address} కు మార్చాలని అనుకుంటున్నారు.
       click_the_link: అది మీరే అయితే, మార్పుని నిర్ధారించడానికి ఈ క్రింది లంకెను నొక్కండి.
+    lost_password:
+      subject: '[OpenStreetMap] సంకేతపదం మార్పు అభ్యర్థన'
+      greeting: హలో,
+      hopefully_you: ఈ ఈమెయిలు చిరునామాకు చెందిన openstreetmap.org ఖాతా లోని సంకేతపదాన్ని
+        మార్చమని ఎవరో (బహుశా మీరే) అడిగారు.
+      click_the_link: అది మీరే అయితే, కింది లింకును నొక్కి సంకేతపదం మార్చుకోండి.
     note_comment_notification:
       anonymous: అజ్ఞాత వాడుకరి
+      greeting: హలో,
+      commented:
+        subject_own: '[OpenStreetMap] %{commenter} మీ గమనికలపై వ్యాఖ్యానించారు'
+        subject_other: మీకు ఆసక్తి ఉన్న ఒక గమనికపై [OpenStreetMap] %{commenter} వ్యాఖ్యానించారు
+        your_note: '%{place} సమీపం లోని మీ మ్యాపు గమనికలపై %{commenter} ఒక వ్యాఖ్య
+          రాసారు.'
+        your_note_html: '%{place} సమీపం లోని మీ మ్యాపు గమనికలపై %{commenter} ఒక వ్యాఖ్య
+          రాసారు.'
+        commented_note: మీరు వ్యాఖ్యానించిన మ్యాపు గమనికపై %{commenter} ఒక వ్యాఖ్య
+          రాసారు. ఆ గమనిక %{place} సమీపంలో ఉంది.
+        commented_note_html: మీరు వ్యాఖ్యానించిన మ్యాపు గమనికపై %{commenter} ఒక వ్యాఖ్య
+          రాసారు. ఆ గమనిక %{place} సమీపంలో ఉంది.
+      closed:
+        subject_own: '[OpenStreetMap] మీ గమనికల్లో ఒకదాన్ని %{commenter} పరిష్కరించారు'
+        subject_other: '[OpenStreetMap] మీకు ఆసక్తి ఉన్న గమనికల్లో ఒకదాన్ని %{commenter}
+          పరిష్కరించారు'
+        your_note: '%{place} సమీపంలో మీ మ్యాప్ గమనికల్లో ఒకదాన్ని %{commenter} పరిష్కరించారు.'
+        your_note_html: '%{place} సమీపంలో మీ మ్యాప్ గమనికల్లో ఒకదాన్ని %{commenter}
+          పరిష్కరించారు.'
+        commented_note: మీరు వ్యాఖ్యానించిన మ్యాప్ గమనికల్లో ఒకదాన్ని %{commenter}
+          పరిష్కరించారు. ఆ గమనిక %{place} సమీపంలో ఉంది.
+        commented_note_html: మీరు వ్యాఖ్యానించిన మ్యాప్ గమనికల్లో ఒకదాన్ని %{commenter}
+          పరిష్కరించారు. ఆ గమనిక %{place} సమీపంలో ఉంది.
+      reopened:
+        subject_own: '[OpenStreetMap] %{commenter}, మీ గమనికల్లో ఒకదాన్ని పునరుజ్జీవింపజేసారు'
+        subject_other: '[OpenStreetMap] మీకు ఆసక్తి ఉన్న ఒక గమనికను %{commenter} పునరుజ్జీవింపజేసారు'
+        your_note: '%{place} సమీపం లోని మీ మ్యాపు గమనికల్లో ఒకదాన్ని %{commenter}
+          పునరుజ్జీవింపజేసారు.'
+        your_note_html: '%{place} సమీపం లోని మీ మ్యాపు గమనికల్లో ఒకదాన్ని %{commenter}
+          పునరుజ్జీవింపజేసారు.'
+        commented_note: మీరు వ్యాఖ్యానించిన మ్యాపు గమనికల్లో ఒకదాన్ని %{commenter}
+          పునరుజ్జీవింపజేసారు. అది %{place} సమీపంలో ఉంది.
+        commented_note_html: మీరు వ్యాఖ్యానించిన మ్యాపు గమనికల్లో ఒకదాన్ని %{commenter}
+          పునరుజ్జీవింపజేసారు. అది %{place} సమీపంలో ఉంది.
+      details: ఈ గమనిక గురించి మరిన్ని వివరాలను %{url} వద్ద చూడవచ్చు.
+      details_html: ఈ గమనిక గురించి మరిన్ని వివరాలను %{url} వద్ద చూడవచ్చు.
     changeset_comment_notification:
       hi: '%{to_user} గారూ,'
+      greeting: హలో,
+      commented:
+        subject_own: మీ మార్పులసమితుల్లో ఒకదానిపై [OpenStreetMap] %{commenter} వ్యాఖ్యానించారు
+        subject_other: '[OpenStreetMap] మీకు ఆసక్తి ఉన్న మార్పులసమితిపై %{commenter}
+          వ్యాఖ్యానించారు'
+        your_changeset: మీ మార్పులసమితుల్లో ఒకదానిపై %{commenter}, %{time} ఒక వ్యాఖ్య
+          పెట్టారు
+        your_changeset_html: '%{commenter}, మీ మార్పులసమితుల్లో ఒకదానిపై %{time} ఒక
+          వ్యాఖ్య రాసారు'
+        commented_changeset: '%{changeset_author} సృష్టించిన, మీరు గమనిస్తూ ఉన్న ఒక
+          మార్పులసమితిపై %{commenter}, %{time} ఒక వ్యాఖ్య పెట్టారు'
+        commented_changeset_html: '%{changeset_author} సృష్టించిన, మీరు గమనిస్తూ ఉన్న
+          ఒక మార్పులసమితిపై %{commenter}, %{time} ఒక వ్యాఖ్య పెట్టారు'
+        partial_changeset_with_comment: '''%{changeset_comment}'' వ్యాఖ్యతో'
+        partial_changeset_with_comment_html: '''%{changeset_comment}'' వ్యాఖ్యతో'
+        partial_changeset_without_comment: వ్యాఖ్యేమీ లేకుండా
+      details: ఈ మార్పులసమితికి సంబంధించిన మరిన్ని వివరాలను %{url} వద్ద చూడవచ్చు.
+      details_html: మార్పులసమితి గురించి మరిన్ని వివరాలను %{url} వద్ద చూడవచ్చు.
+      unsubscribe: ఈ మార్పులసమితి తాజాకరణల నుండి చందా విరమించుకోడానికి, %{url} కు
+        వెళ్ళి, "చందా విరమణ" నొక్కండి.
   confirmations:
     confirm:
       heading: మీ ఈమెయిల్ చూడండి!
       introduction_1: మీకు నిర్ధారణ ఈమెయిలును పంపించాం.
+      press confirm button: మీ ఖాతాను చేతనపరచేందుకు కింది ధ్రువీకరించు బొత్తాన్ని
+        నొక్కండి.
       button: నిర్ధారించు
+      success: మీ ఖాతాను ధ్రువీరించారు. నమోదైనందుకు ధన్యవాదాలు!
       already active: ఈ ఖాతాని ఇప్పటికే నిర్ధారించారు.
+      unknown token: ఆ ధ్రువీకరణ కోడ్ మురిగిపోయింది. లేదా అసలు ఉనికిలోనే లేదు.
+      reconfirm_html: ధ్రువీకరణ మెయిలు మళ్ళీ పంపించమనేట్లైతే, <a href="%{reconfirm}">ఇక్కడ
+        నొక్కండి</a>.
     confirm_resend:
       failure: వాడుకరి %{name} కనబడలేదు.
     confirm_email:
@@ -557,59 +1672,191 @@ te:
         బొత్తాన్ని నొక్కండి.
       button: నిర్ధారించు
       success: మీ ఈమెయిలు చిరునామా నిర్ధారణ అయింది!
+      failure: ఈ టోకెనుతో ఒక ఈమెయిలు చిరునామాను ఈసరికే ధ్రువీకరించారు.
+      unknown_token: ధ్రువీకరణ కోడు మురిగిపోయింది లేదా అదసలు లేనే లేదు.
+    resend_success_flash:
+      confirmation_sent: మేం మరొక ధ్రువీకరణ గమనికను %{email} కు పంపించాం. మీ ఖాతాను
+        ధ్రువీకరించగానే మీరు మ్యాపింగు మొదలుపెట్టవచ్చు.
+      whitelist: మీకు స్పాము వ్యతిరేక వ్యవస్థ ఏదైనా ఉంటే, బహుశా అది ధ్రువీకరణ మెయిళ్ళను
+        స్పాము ఫోల్డరు లోకి పంపిస్తుంది. అంచేత ఈ ఈ %{sender} ను వైట్‌లిస్టులో పెట్టండి.
+        లేదంటే ధ్రువీకరణ అభ్యర్థనలకు మేమిచ్చే జవాబులు అందవు.
   messages:
     inbox:
+      title: ఇన్‌బాక్సు
       my_inbox: నా ఇన్‌బాక్స్
+      my_outbox: నా ఔట్‌బాక్సు
+      messages: మీకు %{new_messages}, %{old_messages} ఉన్నాయి
+      new_messages:
+        one: '%{count} కొత్త సందేశం'
+        other: '%{count} కొత్త సందేశాలు'
+      old_messages:
+        one: '%{count} పాత సందేశం'
+        other: '%{count} పాత సందేశాలు'
+      from: నుండి
       subject: విషయం
       date: తేదీ
+      no_messages_yet_html: మీకింకా సందేశాలేమీ లేవు. %{people_mapping_nearby_link}
+        ఎవరినైనా ఎందుకు సంప్రదించకూడదూ?
+      people_mapping_nearby: సమీపంలో మ్యాపింగు చేస్తున్నవారు
     message_summary:
+      unread_button: చదవనట్లుగా గుర్తుపెట్టు
+      read_button: చదివినట్లుగా గుర్తుపెట్టు
       reply_button: జవాబివ్వు
       destroy_button: తొలగించు
     new:
+      title: సందేశాన్ని పంపించు
       send_message_to_html: '%{name}కి ఒక సందేశాన్ని పంపండి'
       subject: విషయం
+      body: దేహం
+      back_to_inbox: తిరిగి ఇన్‌బాక్సుకు
+    create:
+      message_sent: సందేశాన్ని పంపించాం
+      limit_exceeded: ఈమధ్య మీరు చాలా సందేశాలు పంపించారు. మరిన్ని పంపేముందు కాస్త
+        ఆగండి.
+    no_such_message:
+      title: అలాంటి సందేశమేమీ లేదు
+      heading: అలాంటి సందేశమేమీ లేదు
+      body: సారీ, ఆ ఐడీతో సందేశమేమీ లేదు.
     outbox:
+      title: ఔట్‌బాక్సు
+      my_inbox: నా ఇన్‌బాక్సు
+      my_outbox: నా ఔట్‌బాక్సు
+      messages:
+        one: మీకు %{count} పంపిన సందేశం ఉంది
+        other: మీకు %{count} పంపిన సందేశాలు ఉన్నాయి
+      to: కు
       subject: విషయం
       date: తేదీ
+      no_sent_messages_html: మీకింకా పంపిన సందేశాలు లేవు. %{people_mapping_nearby_link}
+        ఎవరినైనా ఎందుకు సంప్రదించకూడదూ?
+      people_mapping_nearby: సమీపంలో మ్యాపింగు చేస్తున్నవారు
+    reply:
+      wrong_user: మీరు `%{user}' గా లాగినై ఉన్నారు. కానీ మీ సందేశం, మీరు జవాబు ఇవ్వాలని
+        చెప్పిన వాడుకరికి పంపలేదు. సరైన వాడుకరిగా లాగినై జవాబివ్వండి.
     show:
+      title: సందేశం చదవండి
+      from: నుండి
       subject: విషయం
       date: తేదీ
       reply_button: జవాబివ్వు
+      unread_button: చదివినట్లుగా గుర్తుపెట్టు
+      destroy_button: తొలగించు
       back: వెనుకకు
+      to: కు
+      wrong_user: మీరు `%{user}' గా లాగినై ఉన్నారు. కానీ మీరు చదవదలచిన సందేశం ఆ వాడుకరి
+        పంపలేదు, ఆ వాడుకరికి రాలేదు. సరైన వాడుకరిగా లాగినై చదవండి.
     sent_message_summary:
       destroy_button: తొలగించు
+    mark:
+      as_read: సందేశాన్ని చదివినట్లుగా గుర్తుపెట్టాం
+      as_unread: సందేశాన్ని చదవనట్లుగా గుర్తుపెట్టాం
+    destroy:
+      destroyed: సందేశాన్ని తొలగించాం
   passwords:
     lost_password:
       title: సంకేతపదం పోయింది
       heading: సంకేతపదం మర్చిపోయారా?
       email address: 'ఈమెయిల్ చిరునామా:'
+      new password button: సంకేతపదాన్ని మార్చు
+      help_text: నమోదైనపుడు మీరిచ్చిన ఈమెయిలు చిరునామాను ఇవ్వండి. సంకేతపదాన్ని మార్చుకునే
+        లింకును ఆ చిరునామాకు పంపిస్తాం.
+      notice email on way: అయ్యో.. పోయిందా :-( పోన్లెండి, దాన్ని మార్చుకునేందుకు ఒక
+        ఈమెయిలు వచ్చేస్తోంది.
       notice email cannot find: క్షమించండి, ఆ ఈమెయిలు చిరునామా దొరకలేదు.
     reset_password:
+      title: సంకేతపదం మార్పు
+      heading: '%{user} సంకేతపదాన్ని మార్చు'
+      reset: సంకేతపదాన్ని మార్చు
       flash changed: మీ సంకేతపదాన్ని మార్చాం.
+      flash token bad: ఆ టోకెను కనబడలేదు, ఓసారి URL సరిచూస్తారా?
+  preferences:
+    show:
+      title: నా అభీష్టాలు
+      preferred_editor: ఇష్టమైన ఎడిటరు
+      preferred_languages: అభీష్టమైన భాషలు
+      edit_preferences: అభీష్టాలను మార్చు
+    edit:
+      title: అభీష్టాలను మార్చు
+      save: అభీష్టాలను తాజాకరించిఉ
+      cancel: రద్దుచేయి
+    update:
+      failure: అభీష్టాలను తాజాకరించలేక పోయాం.
+    update_success_flash:
+      message: అభీష్టాలను తాజాకరించాం.
   profiles:
     edit:
-      image: 'బొమ్మ:'
+      title: ప్రొఫైలును సవరించండి
+      save: ప్రొఫైలును తాజాకరించండి
+      cancel: రద్దుచేయి
+      image: బొమ్మ
       gravatar:
         gravatar: గ్రావతార్‌ని వాడు
+        link: https://wiki.openstreetmap.org/wiki/Gravatar
+        what_is_gravatar: గ్రావతార్ అంటే ఏంటి?
+        disabled: గ్రావతార్‌ను అచేతనం చేసాం.
+        enabled: మీ గ్రావతార్‌ను చూపించడం చేత్యనం చేసాం.
+      new image: ఓ బొమ్మను చేర్చండి
       keep image: ప్రస్తుత చిత్రాన్ని ఉంచు
       delete image: ప్రస్తుత చిత్రాన్ని తొలగించు
       replace image: ప్రస్తుత చిత్రాన్ని మార్చు
       image size hint: (కనీసం 100x100 ఉండే చదరపు చిత్రం అయితే మేలు)
-      home location: 'నివాస ప్రాంతం:'
+      home location: ఇంటి స్థానం
       no home location: మీరు మీ నివాస ప్రాంతాన్ని పేర్కొనలేదు.
+      update home location on click: మ్యాపుపై నొక్కినపుడు ఇంటి స్థానాన్ని తాజాకరించాలా?
+    update:
+      success: ప్రొఫైలును తాజాకరించాం.
+      failure: ప్రొఫైలును తాజాకరించలేక పోయాం.
   sessions:
     new:
       title: ప్రవేశం
       heading: ప్రవేశం
       email or username: 'ఈమెయిల్ చిరునామా లేదా వాడుకరిపేరు:'
       password: 'సంకేతపదం:'
+      openid_html: '%{logo} OpenID:'
       remember: నన్ను గుర్తుంచుకో
       lost password link: మీ సంకేతపదం పోయిందా?
       login_button: ప్రవేశించు
       register now: ఇప్పుడే నమోదవ్వండి
+      with username: 'ఈసరికే OpenStreetMap ఖాతా ఉందా? అయితే మీ వాడుకరిపేరు, సంకేతపదాలతో
+        లాగినవండి:'
+      with external: 'లేదా, ఏదైనా థర్డ్ పార్టీతో లాగినవండి:'
       new to osm: ఓపెన్‌స్ట్రీట్‌మ్యాప్‌కి కొత్తా?
+      to make changes: OpenStreetMap డేటాలో మార్పులు చెయ్యాలంటే, మీకు ఖాతా ఉండడం తప్పనిసరి.
       create account minute: ఒక ఖాతాను సృష్టించుకోండి. కేవలం నిమిషంలో అయిపోతుంది.
       no account: మీకు ఖాతా లేదా?
+      account not active: సారీ, మీ ఖాతా ఇంకా చేతనం కాలేదు.<br />ఖాతా ధ్రువీకరణ ఈమెయిల్లో
+        ఉన్న లింకును వాడి మీ ఖాతాను చేతనం చెయ్యండి. లేదా <a href="%{reconfirm}">కొత్త
+        ధ్రువీకరణ ఈమెయిలు పంపమని అడగండి</a>.
+      account is suspended: సారీ, అనుమానాస్పద కార్యకలాపాల కారణంగా మీ ఖాతాను సస్పెండు
+        చేసారు.<br />దీని గురించి చర్చించాలంటే <a href="%{webmaster}">సహాయం</a> ను
+        సంప్రదించండి.
+      auth failure: సారీ, ఈ వివరాలతో లాగిన్ చెయ్యలేకపోయాం.
+      openid_logo_alt: ఏదైనా OpenID తో లాగినవండి
+      auth_providers:
+        openid:
+          title: OpenID తో లాగినవండి
+          alt: ఏదైనా OpenID URL తో లాగినవండి
+        google:
+          title: Google తో లాగినవండి
+          alt: Google OpenID తో లాగినవండి
+        facebook:
+          title: Facebook తో లాగినవండి
+          alt: Facebook ఖాతాతో లాగినవండి
+        windowslive:
+          title: Windows Live తో లాగినవండి
+          alt: Windows Live ఖాతాతో లాగినవండి
+        github:
+          title: GitHub తో లాగినవండి
+          alt: GitHub ఖాతాతో లాగినవండి
+        wikipedia:
+          title: వికీపీడియాతో లాగినవండి
+          alt: వికీపీడియా ఖాతాతో లాగినవండి
+        wordpress:
+          title: వర్డ్‌ప్రెస్‌తో లాగినవండి
+          alt: వర్డ్‌ప్రెస్ OpenID తో లాగినవండి
+        aol:
+          title: AOL తో లాగినవండి
+          alt: AOL OpenID తో లాగినవండి
     destroy:
       title: నిష్క్రమించు
       heading: ఓపెన్‌స్ట్రీట్‌మ్యాప్‌ నుండి నిష్క్రమించండి
@@ -617,6 +1864,7 @@ te:
   shared:
     markdown_help:
       headings: శీర్షికలు
+      heading: శీర్షిక
       subheading: ఉప శీర్షిక
       unordered: క్రమం లేని జాబితా
       ordered: సక్రమ జాబితా
@@ -633,18 +1881,58 @@ te:
   site:
     about:
       next: తదుపరి
+      copyright_html: <span>&copy;</span>OpenStreetMap<br> తోడ్పాటుదార్లు
+      used_by_html: '%{name} వేలాది వెబ్‌సైట్లకు, మొబైలు యాప్‌లకు, హార్డ్‌వేరు డివైసులకూ
+        మ్యాప్ డేటాను అందిస్తుంది'
+      lede_text: OpenStreetMap ను మ్యాపర్ల సముదాయం నిర్మిస్తోంది. ఈ సముదాయ సభ్యులు
+        ప్రపంచ వ్యాప్తంగా రోడ్లు, రెస్టారెంట్లు, రైల్వే స్టేషన్లు లాంటి ఎన్నో అంశాల
+        గురించి డేటాను చేర్చడం, నిర్వహించడం చేస్తున్నారు.
       local_knowledge_title: స్థానిక పరిజ్ఞానం
+      local_knowledge_html: OpenStreetMap స్థానిక పరిజ్ఞానానికి ప్రాముఖ్యత నిస్తుంది.
+        ఇక్కడ తోడ్పాటునందించేవారు విహంగ చిత్రాలను, GPS డివైసులను, లో టెక్ క్షేత్య్ర
+        స్థాయి మ్యాపులనూ వాడి OSM కచ్చితత్వంతో ఉందని, తాజా సమాచారంతో ఉందనీ నిర్థారిస్తారు.
+      community_driven_title: సాముదాయిక కృషితో కూడినది
       partners_title: భాగస్వాములు
     copyright:
       foreign:
         title: ఈ అనువాదం గురించి
+        html: అనువదించిన పేజీకీ %{english_original_link} కూ మధ్య ఘర్షణ ఏర్పడినపుడు
+          ఇంగ్లీషు పేజీదే ప్రాధాన్యత
+        english_link: ఒరిజినలు ఇంగ్లీషు కూర్పు
       native:
         title: ఈ పుట గురించి
+        html: మీరు కాపీహక్కుల పేజీ ఇంగ్లీషు కూర్పును చూస్తున్నారు. తిరిగి ఈ పేజీ %{native_link}
+          కు వెళ్ళవచ్చు, లేదా కాపీహక్కు గురించి %{mapping_link} గురించీ చదవడం ఆపేయవచ్చు.
+        native_link: THIS_LANGUAGE_NAME_HERE కూర్పు
+        mapping_link: మ్యాపింగు మొదలుపెట్టండి
       legal_babble:
-        title_html: కాపీహక్కులు మరియు లైసెన్సు
+        title_html: కాపీహక్కు, లైసెన్సు
+        intro_1_html: |-
+          OpenStreetMap<sup><a href="#trademarks">&reg;</a></sup> అనేది <i>ఓపెన్ డేట్</i>. దీన్ని <a
+          href="https://opendatacommons.org/licenses/odbl/">ఓపెన్ డేటా కామన్స్ ఓపెన్ డేటాబేస్ లైసెన్సు </a> (ODbL) కు లోబడి <a
+          href="https://osmfoundation.org/">OpenStreetMap ఫౌండేషను</a> (OSMF) అందిస్తోంది.
+        intro_2_html: |-
+          You are free to copy, distribute, transmit and adapt our data,
+          as long as you credit OpenStreetMap కు శ్రేయస్సును ఆపాదించినంతవరకు మా డేటాను కాపీ చేసుకోవచ్చు, పంపిణీ చేసుకోవచ్చు, ప్రసారం చేసుకోనూ వచ్చు. మా డేటాను మార్చినా, దానిపైన మరింగ్త అభిఉవృద్ధి చేసినా దాని ఫలితాన్ని కూడా అదే లైసెన్సు కింద మాత్రమే పంపిణీ చెయ్యాలి. ఈ పూర్తి <a href="https://opendatacommons.org/licenses/odbl/1.0/">లీగల్ కోడ్</a> మీ హక్కులు, బాధ్యతలను వివరిస్తుంది.
+        intro_3_1_html: మా డాక్యుమెంటేషను <a href="https://creativecommons.org/licenses/by-sa/2.0/">క్రియేటివ్
+          కామన్స్ యాట్రిబ్యూషను షేర్‌అలైక్ 2.0</a> లైసెన్సు (CC BY-SA 2.0) కింద లభ్యమౌతుంది.
+        credit_title_html: OpenStreetMap కు శ్రేయస్సు నివ్వడం ఎలా
+        credit_1_html: |-
+          మీరు &ldquo;&copy; OpenStreetMap
+          contributors&rdquo; అనే క్రిడిట్ వాడాలి.
         attribution_example:
+          alt: వెబ్‌పేజీలో OpenStreetMap కు శ్రేయస్సును ఎలా ఆపాదించాలో చెప్పే ఉదాహరణ
           title: ఆపాదింపు ఉదాహరణ
         more_title_html: మరింత తెలుసుకోవడం
+        more_1_html: |-
+          మా డేటాను ఎలా వాడుకోవచ్చో, మాకు శ్రేయస్సును ఎలా ఆపాదించాలో <a
+          href="https://osmfoundation.org/Licence">OSMF Licence page</a> లో మరింత చదవొచ్చు.
+        more_2_html: "OpenStreetMap అందరికీ లభించే డేటా అయినప్పటికీ, థర్డు పార్టీలకు
+          మ్యాపు API లను ఉచితంగా ఇవ్వం.\nమా <a href=\"https://operations.osmfoundation.org/policies/api/\">API
+          Usage Policy</a>,\n<a href=\"https://operations.osmfoundation.org/policies/tiles/\">Tile
+          Usage Policy</a>, \n<a href=\"https://operations.osmfoundation.org/policies/nominatim/\">Nominatim
+          Usage Policy</a> లను చూడండి."
+        contributors_title_html: మా కాంట్రిబ్యూటర్లు
         infringement_title_html: కాపీహక్కుల ఉల్లంఘన
         trademarks_title_html: <span id="trademarks"></span>ట్రేడుమార్కులు
     index:
@@ -652,100 +1940,361 @@ te:
       shortlink: చిన్నలింకు
     edit:
       user_page_link: వాడుకరి పేజీ
+      anon_edits_html: (%{link})
+      anon_edits_link_text: ఇది ఇలా ఎందుకుందో తెలుసుకోండి.
+      no_iframe_support: మీ బ్రౌజరులో HTML iframes కు మద్దతు లేదు. ఈ అంశం పనిచేసేందుకు
+        అది అవసరం.
     export:
       title: ఎగుమతి
+      area_to_export: ఎగిమతి చెయ్యాల్సిన ప్రాంతం
+      manually_select: వేరే ప్రాంతాన్ని మానవికంగా ఎంచుకోండి
+      format_to_export: ఎగిమతి చెయ్యాల్సిన ఆకృతి
+      osm_xml_data: OpenStreetMap XML డేటా
+      map_image: మ్యాపు బొమ్మ (ప్రామాణిక పొరను చూపిస్తుంది)
       embeddable_html: ఇముడ్చగలిగే HTML
       licence: లైసెన్సు
+      export_details_html: OpenStreetMap డేటా <a href="https://opendatacommons.org/licenses/odbl/1.0/">Open
+        Data Commons Open Database License</a> (ODbL) కు లోబడి ఉంటుంది.
       too_large:
+        advice: 'పై ఎగుమతి విఫలమైతే, కింది జాబితా లోంచి ఒక మూలాన్ని వాడండి:'
+        body: ఈ ప్రాంతాన్ని OpenStreetMap XML డేటాగా ఎగుమతి చెయ్యగలిగిన దాని కంటే
+          పెద్దదిగా ఉంది. జూమిన్ చెయ్యండి, లేదా మరింత చిన్న ప్రాంతాన్ని ఎంచుకోండి,
+          లేదా కింద ఉన్న, టోకున దించుకునేందుకు వీలైన మూలాల జాబితా నుండి ఒకదాన్ని వాడండి.
+        planet:
+          title: Planet OSM
+          description: ఎప్పటికప్పుడూ తాజాకరిస్తూ ఉన్న OpenStreetMap సంపూర్ణ డేటాబేసుకు
+            చెందిన కాపీలు
+        overpass:
+          title: Overpass API
         other:
           title: ఇతర మూలాలు
+          description: Additional sources listed on the OpenStreetMap వికీలోని జాబితాలో
+            ఉన్న అదనపు మూలాలు
       options: ఎంపికలు
       format: ఫార్మాటు
       scale: కొలబద్ద
       max: గరిష్టం
       image_size: బొమ్మ పరిమాణం
       zoom: పెద్దది
+      add_marker: మ్యాపుకు ఒక మార్కరును చేర్చండి
       latitude: 'అక్షాం:'
       longitude: 'రేఖాం:'
+      output: ఔట్‌పుట్
+      paste_html: వెబ్‌సైటులో ఇమిడ్చే HTML ను అతికించండి
+      export_button: ఎగుమతించు
     fixthemap:
+      title: సమస్యను నివేదించండి / మ్యాపును సరిచెయ్యండి
       how_to_help:
         title: ఎలా తోడ్పడాలి
+        join_the_community:
+          title: సముదాయంలో చేరండి
+          explanation_html: మా మ్యాపు డేటాలో మీకేదైనా సమస్య కనిపిస్తే - ఉదాహరణకు మీ
+            అడ్రసు లేకపోవడమో, ఏదైనా రోడ్డు లేకపోవడమో లాంటివి - OpenStreetMap సముదాయంలో
+            చేరి ఆ డేటాను మీరే బాగుచెయ్యడమో లేదా అవసరమైన చేర్పులు చెయ్యడమో ఉత్తమమైన
+            పద్ధతి.
+      other_concerns:
+        title: ఇతర ఆందోళనలు
+        explanation_html: "మా డేటాను ఎలా వినియోగిస్తున్నారో నన్న ఆందోళనలు మీకు ఉంటే,
+          మరింత చట్టపరమైన సమాచారాన్ని ఇచ్చే మా \n<a href='/copyright'>కాపీహక్కు పేజీని</a>
+          చూడండి. లేదా సరైన\n<a href='https://wiki.osmfoundation.org/wiki/Working_Groups'>OSMF
+          కార్య సమూహాన్ని</a> సంప్రదించండి."
     help:
       title: సహాయం పొందడం
       welcome:
+        url: /welcome
         title: ఓపెన్‌స్ట్రీట్‌మ్యాప్‌కి స్వాగతం
+        description: OpenStreetMap ప్రాథమికాంశాలను వివరించే ఈ సత్వర మార్గదర్శినితో
+          మొదలు పెట్టండి.
+      beginners_guide:
+        url: https://wiki.openstreetmap.org/wiki/Beginners%27_guide
+        title: కొత్తవారికి మార్గదర్శిని
+        description: కొత్తవారి కోసం సముదాయం నిర్వహించే మార్గదర్శిని.
+      help:
+        url: https://help.openstreetmap.org/
+        title: సహాయ వేదిక
+        description: OpenStreetMap వారి ప్రశ్న-జవాబుల సైట్లో మీ ప్రశ్నలు అడగండి, లేదా
+          సమాధానాల కోసం చూడండి.
+      mailing_lists:
+        title: మెయిలింగు జాబితాలు
+      forums:
+        title: వేదికలు
+        description: బులెటిన్ బోర్డు శైలిలో ఉండే ఇంటేర్‌ఫేసును ఇష్టపడేవారి కోసం ప్రశ్నలు
+          చర్చలూ.
+      irc:
+        title: IRC
+        description: అనేక అంశాలపై అనేక భాషల్లో ఉన్న పరస్పర సంభాషణలు.
+      switch2osm:
+        title: switch2osm
+        description: OpenStreetMap ఆధారిత మ్యాపులు, ఇతర సేవలకు మారిపోయే సంస్థల కోసం.
+      welcomemat:
+        url: https://welcome.openstreetmap.org/
+        title: సంస్థల కోసం
+        description: OpenStreetMap వాడేందుకు ఆలోచిస్తున్న సంస్థలో పనిచేస్తున్నారా?
+          స్వాగత ద్వారం వద్ద మీరు తెలుసుకోవాల్సినవి ఏమిటో తెలుసుకోండి.
+      wiki:
+        url: https://wiki.openstreetmap.org/
+        title: OpenStreetMap వికీ
+        description: లోతైన OpenStreetMap డాక్యుమెంటేషను కోసం వికీలో శోధించండి
+    potlatch:
+      desktop_html: మీరు <a href="https://www.systemed.net/potlatch/">మాక్, విండోస్
+        ల్లో పనిచేసే డెస్క్‌టాప్ అనువర్తనాన్ని దించుకుని</a> Potlatch వాడుకోవచ్చు.
+      id_html: లేదా, మీ డీఫాల్టు ఎడిటరుగా iD ను పెట్టుకోవచ్చు. గతంలో Potlatch పనిచేసిన
+        విధం గానే ఇది కూడా బ్రౌజరులో పనిచేస్తుంది. <a href="%{settings_url}">మీ అభీష్టాలను
+        ఇక్కడ మార్చుకోండి</a>.
     sidebar:
       search_results: అన్వేషణ ఫలితాలు
       close: మూసివేయి
     search:
       search: వెతుకు
+      get_directions: మార్గసూచనలను పొందండి
+      get_directions_title: రెండూ బిందువుల మధ్య మార్గసూచనలను తెలుసుకోండి
+      from: నుండి
+      to: కు
       where_am_i: ఇది ఎక్కడ ఉంది?
+      where_am_i_title: సెర్చి ఇంజను వాడీ ప్రస్తుత స్థానాన్ని వివరించండి
       submit_text: వెళ్ళు
+      reverse_directions_text: మార్గసూచనలను తిరగవెయ్యి
     key:
       table:
         entry:
+          motorway: మోటార్‌వే
+          main_road: మెయిన్ రోడ్డు
+          trunk: ట్రంకు రోడ్డు
           primary: ప్రధాన రహదారి
           secondary: ద్వితీయ శ్రేణి రహదారి
+          unclassified: వర్గీకరించని రోడ్డు
+          track: ట్రాకు
+          cycleway: సైకిలు దారి
+          cycleway_national: జాతీయ సైకిలు దారి
+          cycleway_regional: ప్రాంతీయ సైకిలు దారి
+          cycleway_local: స్థానిక సైకిలు దారి
           footway: కాల్దారి
+          rail: రైలుమార్గం
           subway: కిందారి
+          tram:
+          - లైట్ రైల్
+          - ట్రాము
+          cable:
+          - కేబుల్ కారు
+          - చెయిర్ లిఫ్ట్
+          runway:
+          - విమానాశ్రయం రన్‌వే
+          - టాక్సీ వే
+          apron:
+          - విమానాశ్రయం ఏప్రాన్
+          - టర్మినల్
           admin: పరిపాలనా సరిహద్దు
           forest: అడవి
           wood: కలప
+          golf: గోల్ఫ్ కోర్సు
           park: పార్కు
           resident: నివాస ప్రాంతం
           common:
           - పచ్చికబయలు
           - పచ్చికబయలు
+          retail: రిటెయిల్ ప్రదేశం
           industrial: పారిశ్రామిక ప్రదేశం
           commercial: వాణిజ్య ప్రదేశం
           lake:
           - సరస్సు
           - జలాశయం
           farm: పొలాలు
+          brownfield: బ్రౌన్‌ఫీల్డ్ స్థలం
           cemetery: స్మశానం
+          pitch: క్రీడల పిచ్
+          centre: క్రీడా కేంద్రం
+          reserve: ప్రకృతి సంరక్షణ కేంద్రం
           military: మిలిటరీ ప్రదేశం
           school:
           - పాఠశాల
           - విశ్వవిద్యాలయం
           building: ప్రముఖ కట్టడము
           station: రైల్వే స్టేషన్
+          summit:
+            1: శిఖరం
+          bridge: Black casing = వంతెన
           construction: నిర్మాణంలో ఉన్న రహదార్లు
+          bicycle_shop: సైకిలు దుకాణం
+          bicycle_parking: సైకిలు పార్కింగు
           toilets: మరుగుదొడ్లు
     welcome:
       title: స్వాగతం!
       whats_on_the_map:
-        title: పటంలో ఏముంది
+        title: పటంలో ఏముంటాయి
+      basic_terms:
+        title: మ్యాపులకు సంబంధించిన ప్రాథమిక పదాలు
+        paragraph_1_html: OpenStreetMap కు స్వంత పరిభాష ఉంది. మీకు పనికొచ్చే కొన్ని
+          కీలకమైన పదాలు ఇక్కడున్నాయి చూడండి.
+        editor_html: <strong>ఎడిటరు</strong> అంటే మ్యాపును సవరించే ప్రోగ్రాము లేదా
+          వెబ్‌సైటు.
+        node_html: 'A <strong>బుడిపె</strong> అంటే మ్యాపులో ఉండే ఒక బిందువు. ఉదా:
+          ఒక రెస్టారెంటు, చెట్టు మొదలైనవి'
+        way_html: 'A <strong>దారి</strong> అనేది ఒక గీత గానీ, ప్రదేశం గానీ. ఉదా: రోడ్డు,
+          వాగు, చెరువు, భవనం.'
+        tag_html: <strong>ట్యాగు</strong> అనేది బుడిపె లేదా దారికి సంబంధించిన డేటా
+          ఐటము. ఉదాహరణకు రెస్టారెంటుకు పేరు, రోడ్డుకు వేగ పరిమితి.
       rules:
         title: నియమాలు!
       questions:
         title: సందేహాలున్నాయా?
+      start_mapping: మ్యాపింగు మొదలుపెట్టండి
       add_a_note:
         title: సరిదిద్దేంత సమయం లేదా? ఒక గమనికను చేర్చండి!
+        paragraph_1_html: ఏదో చిన్న మార్పు చెయ్యాల్సిన అవసరాన్ని మీరు గమనించారనుకోండి.
+          కానీ ఇక్కడ నమోదు చేసుకుని, దిద్దుబాట్లు ఎలా చెయ్యాలో నేర్చుకుని పనిచేసేందుకు
+          తగినంత సమయం లేదు. అలాంటపుడు ఒక గమనిక చేరిస్తే సరిపోతుంది.
   traces:
+    visibility:
+      private: ప్రైవేటు (అజ్ఞాత పేరిట మాత్రమే కనిపిస్తుంది, ఆర్డరు చేయని పాయింట్లతో)
+      public: బహిరంగం (అనుసరణ జాబితాలో అజ్ఞాతగా చూపిస్తుంది, ఆర్డరు చేయని పాయింట్లతో)
+      trackable: ట్రాకబుల్ (అజ్ఞాత పేరిట మాత్రమే కనిపిస్తుంది, ఆర్డరు చేసిన పాయింట్లు,
+        టైమ్‌స్టాంపులతో)
+      identifiable: ఐడెంటిఫయబుల్ (ట్రేస్ జాబితాలో ఐడెంటిఫయబుల్ అని చూపిస్తుంది, ఆర్డరు
+        చేసిన పాయింట్లు, టైమ్‌స్టాంపులతో)
     new:
+      upload_trace: GPS ట్రేస్‌ను ఎక్కించండి
       visibility_help: దీని అర్థమేమిటి?
+      visibility_help_url: https://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces
       help: సహాయం
+      help_url: https://wiki.openstreetmap.org/wiki/Upload
+    create:
+      upload_trace: GPS ట్రేస్‌ను ఎక్కించండి
+      trace_uploaded: మీ GPX ఫైలును ఎక్కించాం. డేటాబేసులో చేర్చేందుకోసం వేచి ఉంది.
+        సాధారణంగా దీనికి ఒక అరగంట పడుతుంది. పూర్తవగానే మీకు ఈమెయిలు వస్తుంది.
+      upload_failed: సారీ, GPX ఎక్కింపు విఫలమైంది. లోపం గురించి ఒక నిర్వాహకునికి తెలియబరచాం.
+        మళ్ళీ ప్రయత్నించండి
     edit:
       cancel: రద్దుచేయి
+      title: '%{name} ట్రేసును సవరిస్తున్నారు'
+      heading: '%{name} ట్రేసు సవరణ'
       visibility_help: దీని అర్థం ఏమిటి?
+    update:
+      updated: ట్రేసును తాజాకరించారు
+    trace_optionals:
+      tags: ట్యాగులు
     show:
+      title: '%{name} ట్రేసు సవరణ'
+      heading: '%{name} ట్రేసు సవరణ'
+      pending: పెండింగు
       filename: 'ఫైలుపేరు:'
       download: దింపుకోలు
+      uploaded: 'ఎక్కించబడింది:'
       points: 'బిందువులు:'
+      start_coordinates: 'ఆరంభ నిర్దేశాంకాలు:'
+      coordinates_html: '%{latitude}; %{longitude}'
+      map: మ్యాపు
       edit: మార్చు
       owner: 'యజమాని:'
       description: 'వివరణ:'
+      tags: 'ట్యాగులు:'
+      none: ఏమీలేవు
+      edit_trace: ఈ ట్రేసును సవరించండి
+      delete_trace: ఈ ట్రేసును తొలగించండి
+      trace_not_found: ట్రేసు కనబడలేదు!
+      visibility: 'దృశ్యత:'
+      confirm_delete: ఈ ట్రేసును తొలగించాలా?
+    trace_paging_nav:
+      showing_page: '%{page} పేజీ'
+      older: పాత ట్రేసులు
+      newer: కొత్త ట్రేసులు
     trace:
+      pending: పెండింగు
       count_points:
         one: 1 బిందువు
         other: '%{count} బిందువులు'
       more: మరిన్ని
+      trace_details: ట్రేసు వివరాలను చూడండి
+      view_map: మ్యాపు చూడండి
+      edit_map: మ్యాపును సవరించండి
+      public: బహిరంగం
+      identifiable: ఐడెంటిఫయబుల్
+      private: ప్రైవేటు
+      trackable: ట్రాకబుల్
+    index:
+      public_traces: బహిరంగ GPS ట్రేసులు
+      my_traces: నా ట్రేసులు
+      public_traces_from: '%{user} గారి బహిరంగ GPS ట్రేసులు'
+      description: ఇటీవల ఎక్కించిన GPS ట్రేసులను శోధించండి
+      tagged_with: '%{tags} ట్యాగు తగిలించినవి'
+      empty_html: ఇక్కడ అప్పుడే ఏమీ లేవు. <a href='%{upload_link}'>ఓ కొత ట్రేసును
+        ఎక్కించండి</a> లేదా GPS ట్రేసింగు గురించి <a href='https://wiki.openstreetmap.org/wiki/Beginners_Guide_1.2'>wiki
+        page</a> వద్ద మరింత తెలుసుకోండి.
+      upload_trace: ఓ ట్రేసును ఎక్కించండి
+      all_traces: ట్రేసులన్నీ
+      traces_from: '%{user} గారి బహిరంగ ట్రేసులు'
+      remove_tag_filter: ట్యాగు వడపోతను తీసెయ్యి
+    destroy:
+      scheduled_for_deletion: ఈ ట్రేసు తొలగింపు కోసం వేచి ఉంది
+    make_public:
+      made_public: ట్రేసును బహిరంగ పరచాం
+    offline_warning:
+      message: GPX ఫైలు ఎక్కింపు వ్యవస్థ ప్రస్తుతం అందుబాటులో లేదు
+    offline:
+      heading: GPX స్టోరేజీ ఆఫ్‌లైను లోకి పోయింది
+      message: ఫైలు స్టోరేజీ, ఎక్కింపు వ్యవస్థ ప్రస్తుతం అందుబాటులో లేదు.
+    georss:
+      title: OpenStreetMap GPS ట్రేసులు
+    description:
+      description_with_count:
+        one: '%{count} బిందువుతో %{user} గారి GPX ఫైలు'
+        other: '%{count} బిందువులతో %{user} గారి GPX ఫైలు'
+      description_without_count: '%{user} గారి GPX ఫైలు'
+  application:
+    permission_denied: ఈ చర్య చేసేందుకు మీకు అనుమతి లేదు
+    require_cookies:
+      cookies_needed: మీ కూకీలను అచేతనం చేసినట్లున్నారు - ముందు మీ బ్రౌజరులో కూకీలను
+        చేతనం చేసుకుని, ఆపై ముందుకు సాగండి.
+    require_admin:
+      not_an_admin: ఆ పని చెయ్యాలంటే మీరు నిర్వాహకులై ఉండాలి.
+    setup_user_auth:
+      blocked_zero_hour: OpenStreetMap వెబ్‌సైట్లో మీకు ఒక అర్జెంటు సందేశం ఉంది. మీ
+        దిద్దుబాట్లను భద్రపరచాలంటే, ముందు మీరు ఆ సందేశాన్ని చదవాల్సి ఉంటుంది.
+      blocked: మీరు API ని అందుకోకుండా నిరోధించాం. వెబ్ ఇంటర్‌ఫేసు లోకి లాగినై, దాని
+        గురించి మరింత తెలుసుకోండి.
+      need_to_see_terms: మీరు API ని అందుకోకుండా తాత్కాలికంగా సస్పెండు చేసారు. వెబ్
+        ఇంటర్‌ఫేసు లోకి లాగినై, కాంట్రిబ్యూటరు నిబంధనల గురించి తెలుసుకోండి. వాటిని
+        మీరు ఒప్పుకోవాల్సిన అవసరం లేదు, కానీ వాటిని చూసి తీరాలి.
+    settings_menu:
+      account_settings: ఖాతా అమరికలు
+      oauth1_settings: OAuth 1 అమరికలు
+      oauth2_applications: OAuth 2 అనువర్తనాలు
+      oauth2_authorizations: OAuth 2 ఆథరైజేషన్లు
+  oauth:
+    authorize:
+      title: మీ ఖాతాను అందుకునేందుకు ఆథరైజు చెయ్యండి
+      allow_read_prefs: మీ వాడుకరి అభీష్టాలను చదవడం.
+      allow_write_prefs: మీ వాడుకరి అభీష్టాలను మార్చుకోవడం.
+      allow_write_diary: డైరీ ఎంట్రీలు, వ్యాఖ్యలు సృష్టించడం, మిత్రులను చేసుకోవడం.
+      allow_write_api: మ్యాపును సవరించడం.
+      allow_read_gpx: మీ ప్రైవేటు GPS ట్రేసులను చదవడం.
+      allow_write_gpx: GPS ట్రేసులను ఎక్కించడం.
+      allow_write_notes: గమనికలను సవరించడం.
+    authorize_success:
+      title: ఆథరైజేషను అభ్యర్థనను అనుమతించాం
+    scopes:
+      read_prefs: వాడుకరి అభీష్టాలను చదువు
+      write_prefs: వాడుకరి అభీష్టాలను మార్చు
+      write_diary: డైరీ ఎంట్రీలు, వ్యాఖ్యలు సృష్టించండి, మిత్రులను చేసుకోండి
+      write_api: మ్యాపు సవరించండి
+      read_gpx: ప్రైవేటు GPS ట్రేసులను చదవండి
+      write_gpx: GPS ట్రేసులను ఎక్కించండి
   oauth_clients:
     show:
       edit: వివరాలను మార్చు
       confirm: నిశ్చయంగానే ఉన్నారా?
     index:
       application: ఉపకరణపు పేరు
+  oauth2_applications:
+    index:
+      new: కొత్త అనువర్తనాన్ని నమోదు చెయ్యండి
+      name: పేరు
+      permissions: అనుమతులు
+    application:
+      edit: మార్చు
+      delete: తొలగించు
+      confirm_delete: ఈ అనువర్తనాన్ని తొలగించాలా?
+    new:
+      title: కొత్త అనువర్తనాన్ని నమోదు చెయ్యి
   users:
     new:
       title: నమోదవ్వండి
@@ -767,83 +2316,223 @@ te:
       heading: '%{user} వాడుకరి లేనే లేరు'
     show:
       my diary: నా డైరీ
+      new diary entry: కొత్త డైరీ పద్దు
       my edits: నా మార్పులు
+      my traces: నా ట్రేసులు
       my notes: నా గమనికలు
       my messages: నా సందేశాలు
       my profile: నా ప్రొఫైలు
       my settings: నా అమరికలు
       my comments: నా వ్యాఖ్యలు
+      my_preferences: నా అభీష్టాలు
+      my_dashboard: నా డ్యాష్‌బోర్డు
       blocks on me: నా మీద నిరోధాలు
       blocks by me: నా నిరోధాలు
+      edit_profile: ప్రొఫైలును సవరించండి
       send message: సందేశాన్ని పంపించు
       diary: డైరీ
       edits: మార్పులు
+      traces: ట్రేసులు
       notes: పటపు గమనికలు
       remove as friend: స్నేహితునిగా తొలగించు
       add as friend: స్నేహితునిగా చేర్చు
+      mapper since: 'ఇప్పటినుండి మ్యాపరు:'
+      ct status: 'తోడ్పాటు నియమాలు:'
       ct undecided: నిర్ణయించుకోలేదు
       ct declined: తిరస్కరించారు
       latest edit: 'చివరి మార్పు (%{ago}):'
       email address: 'ఈమెయిలు చిరునామా:'
       status: 'స్థితి:'
+      spam score: 'స్పామ్ స్కోరు:'
       description: వివరణ
       user location: వాడుకరి ప్రాంతం
       role:
         administrator: ఈ వాడుకరి ఒక నిర్వాహకులు
+        moderator: ఈ వాడుకరి ఒక మోడరేటరు
+        grant:
+          administrator: నిర్వాహక హోదాను ఇవ్వండి
+          moderator: నిర్వాహక హోదాను ఇవ్వండి
+        revoke:
+          administrator: నిర్వాహక హోదాను తీసెయ్యండి
+          moderator: నిర్వాహక హోదాను తీసెయ్యండి
+      block_history: క్రియాశీల నిరోధాలు
       comments: వ్యాఖ్యలు
       create_block: ఈ వాడుకరిని నిరోధించు
+      activate_user: ఈ వాడుకరిని చేతనం చెయ్యి
+      deactivate_user: ఈ వాడుకరిని అచేతనం చెయ్యి
+      confirm_user: ఈ వాడుకరిని ధ్రువీకరించు
+      unconfirm_user: ఈ వాడుకరి ధ్రువీకరణను రద్దుచెయ్యి
+      unsuspend_user: ఈ వాడుకరి సస్పెన్షన్ను రద్దుచెయ్యి
+      hide_user: ఈ వాడుకరిని దాచు
+      unhide_user: ఈ వాడుకరిని చూపు
       delete_user: ఈ వాడుకరిని తొలగించు
       confirm: నిర్ధారించు
+      report: ఈ వాడుకరిపై ఫిర్యాదు చెయ్యి
+    set_home:
+      flash success: ఇంటీ స్థానాన్ని జయప్రదం భద్రపరచాం
     go_public:
       flash success: ఇప్పుడు మీ మార్పుచేర్పులన్నీ బహిరంగం, మీరు ఇక నుండి దిద్దుబాట్లు
         చేయవచ్చు.
     index:
       title: వాడుకరులు
       heading: వాడుకరులు
+      showing:
+        one: పేజీ %{page} (%{items} లో %{first_item})
+        other: పేజీ %{page} (%{items} లో %{first_item}-%{last_item})
+      summary_html: '%{name}, %{date} న %{ip_address} నుండి సృష్టించారు'
+      summary_no_ip_html: '%{name} %{date} న సృష్టించారు'
+      confirm: ఎంచుకున్న వాడూకరులను ధ్రువీకరించు
+      hide: ఎంచుకున్న వాడుకరులను దాచు
+      empty: సరిపోలే వాడుకరులు కనబడలేదు
+    suspended:
+      title: ఖాతాను సస్పెండు చేసారు
+      heading: సస్పెండు చేసిన ఖాతా
+      support: సహాయం
+      body_html: "<p>\n  సారీ, అనుమానాస్పద కార్యకలాపాల కారణంగా మీ ఖాతాను \n  ఆటోమాటిగ్గా
+        సస్పెండు చేసారు.\n</p>\n<p>\n  త్వరలోనే నిర్వాహకులు ఈ నిర్ణయాన్ని సమీక్షిస్తారు,
+        లేదా\n  మీరు దీనిపై చర్చించాలనుకుంటే %{webmaster} ను సంప్రదించవచ్చు.\n</p>"
+    auth_failure:
+      connection_failed: ఆథెంటికేషను చేసేవారితో కనెక్టవడం విఫలమైంది
+      invalid_credentials: చెల్లని ఆథెంటికేషను వివరాలు
+      no_authorization_code: ఆథెంటికేషను కోడేమీ లేదు
+      unknown_signature_algorithm: తెలియని సంతకం అల్గారిథమ్
+      unknown_error: ఆథెంటికేషను విఫలమైంది
+    auth_association:
+      heading: మీ ID ఇంకా ఏ OpenStreetMap ఖాతాకూ అనుబంధించి లేదు.
+      option_1: మీరు OpenStreetMap కు కొత్తైతే, కింది ఫారమును వాడి కొత్త ఖాతాను సృష్టించుకోండి.
+      option_2: మీకి ఈసరికే ఖాతా ఉంటే, మీ వాడుకరిపేరు, సంకేతపదాలను వాడి దాన్లోకి లాగినవండి.
+        ఆ తరువాత ఆ ఖాతాను మీ ID తో అనుబంధించండి.
   user_role:
+    filter:
+      not_a_role: '`%{role}'' అనేది సరైన పాత్ర కాదు.'
+      already_has_role: ఈ వాడూకరికి ఈసరికే %{role} అనే పాత్ర ఉంది.
+      doesnt_have_role: ఈ వాడుకరికి %{role} అనే పాత్ర లేదు.
+      not_revoke_admin_current_user: ప్రస్తుత వాడుకరి నుండి నిర్వాహక హోదాను తీసెయ్యడం
+        విఫలమైంది.
     grant:
+      title: పాత్ర అనుమతిని నిర్థారించండి
+      heading: పాత్ర అనుమతి నిర్థారణ
+      are_you_sure: వాడుకరి `%{name}' కి `%{role}' పాత్ర ఇవ్వాలని మీరు నిశ్చయించుకున్నారా?
       confirm: నిర్ధారించు
+      fail: వాడుకరి `%{name}' కు `%{role}' పాత్రను ఇవ్వలేకపోయాం. వాడుకరి, పాత్ర రెండూ
+        సరైనవేనని నిర్థారించుకోండి.
     revoke:
+      title: పాత్ర ఉపసంహరణను నిర్థారించండి
+      heading: పాత్ర ఉపసంహరణ నిర్థారణ
+      are_you_sure: వాడుకరి `%{name}' నుండి `%{role}' ను ఉపసంహరించాలని మీరు నిశ్చయించుకున్నారా?
       confirm: నిర్ధారించు
+      fail: వాడుకరి `%{name}' నుండి `%{role}' ను ఉపసంహరించలేఖ పోయాం. వాడుకరి, పాత్ర
+        రెండూ సరైనవేనని నిర్థారించుకోండి.
   user_blocks:
+    model:
+      non_moderator_update: నిరోధాన్ని విధించాలన్నా, తాజాకరించాలన్నా మోడరేటరై ఉండాలి.
+      non_moderator_revoke: నిరోధాన్ని ఎతివేయాలంటే మోడరేటరై ఉండాలి.
+    not_found:
+      sorry: సారీ, %{id} ID తో వాడుకరి నిరోధమేదీ కనబడలేదు.
+      back: తిరిగి ఇండెక్సుకు
     new:
+      title: '%{name} పై నిరోధం విధిస్తున్నాం'
+      heading_html: '%{name} పై నిరోధం విధిస్తున్నాం'
+      period: ఇప్పుడు మొదలుపెట్టి, ఎంత కాలం పాటు వాడుకరి API వాడకుండా నిరోధంలో ఉంటారు.
+      tried_contacting: నేను వాడుకరిని సంప్రదించి, ఆపమని చెప్పాను.
+      tried_waiting: ఈ సంప్రదింపులకు స్పందించేందుకు గాను ఈ వాడుకరికి తగినంత సమయం ఇచ్చాను.
       back: అన్ని నిరోధాలను చూడండి
     edit:
+      title: '%{name} పై ఉన్న నిరోధాన్ని సవరిస్తున్నారు'
+      heading_html: '%{name} పై ఉన్న నిరోధాన్ని సవరిస్తున్నారు'
+      period: ఇప్పుడు మొదలుపెట్టి, ఎంత కాలం పాటు వాడుకరి API వాడకుండా నిరోధంలో ఉంటారు.
       show: ఈ నిరోధాన్ని చూడండి
+      back: అన్ని నిరోధాలను చూడండి
+    filter:
+      block_expired: నిరోధం ఈసరికే ముగిసిపోయింది. దాన్ని సవరించలేరు.
+      block_period: నిరోధ కాలం డ్రాప్ డౌన్ జాబితా లోంచి ఎంచుకునే విలువల్లో ఒకటై ఉండాలి.
+    create:
+      try_contacting: నిరోధం విధించే ముందు, వారిని సంప్రదించి, ప్రతిస్పందించేందుకు
+        వారికి తగినంత సమయం ఇవ్వండి.
+      try_waiting: నిరోధం విధించే ముందు, ప్రతిస్పందించేందుకు వారికి తగినంత సమయం ఇవ్వండి.
+      flash: వాడుకరి %{name} పై నిరోధం సృష్టించారు.
+    update:
+      only_creator_can_edit: నిరోధాన్ని సృష్టించిన మోడరేటరే దాన్ని సవరించగలరు.
+      success: నిరోధాన్ని తాజాకరించారు.
     index:
       title: వాడుకరి నిరోధాలు
       heading: వాడుకరి నిరోధాల జాబితా
+      empty: ఇంకా నిరోధాలేమీ విధించలేదు.
     revoke:
+      title: '%{block_on} పై ఉన్న నిరోధాన్ని ఎత్తేస్తున్నారు.'
+      heading_html: '%{block_on} పై %{block_by} విధించిన నిరోధాన్ని ఎత్తేస్తున్నారు.'
+      time_future: '%{time} కు నిరోధం ముగుస్తుంది.'
+      past: '%{time} కు నిరోధం ముగిసిపోయింది. ఇప్పుడు దాన్ని ఎత్తివేయలేరు.'
       confirm: మీరు నిజంగానే ఈ నిరోధాన్ని ఎత్తివేయాలనుకుంటున్నారా?
+      revoke: ఎత్తివేయండి!
+      flash: నిరోధాన్ని ఎత్తివేసారు.
     helper:
       time_future_html: '%{time}లో ముగుస్తుంది.'
+      until_login: వాడుకరి లాగిన్ అయ్యేదాకా చేతనంగా ఉంటుంది.
+      time_future_and_until_login_html: '%{time} కు, వాడుకరి లాగిన్ అయ్యాక ముగుస్తుంది.'
       time_past_html: '%{time} క్రితం ముగిసింది.'
       block_duration:
         hours:
           one: 1 గంట
           other: '%{count} గంటలు'
+        days:
+          one: 1 రోజు
+          other: '%{count} రోజులు'
+        weeks:
+          one: 1 వారం
+          other: '%{count} వారాలు'
+        months:
+          one: 1 నెల
+          other: '%{count} నెలలు'
+        years:
+          one: 1 సంవత్సరం
+          other: '%{count} సంవత్సరాలు'
     blocks_on:
       title: '%{name} పై నిరోధాలు'
       heading_html: '%{name}పై ఉన్న నిరోధాల జాబితా'
+      empty: '%{name} ను ఇంకా నిరోధించలేదు.'
+    blocks_by:
+      title: '%{name} విధించిన నిరోధాలు'
+      heading_html: '%{name} విధించిన నిరోధాల జాబితా'
+      empty: '%{name} ఇంకా నిరోధాలేమీ విధించలేదు.'
     show:
-      status: స్థితి
+      title: '%{block_on} ను %{block_by} నిరోధించారు'
+      heading_html: '%{block_on} ను %{block_by} నిరోధించారు'
+      created: 'సృష్టించినది:'
+      duration: 'నిడివి:'
+      status: 'స్థితి:'
       show: చూపించు
       edit: మార్చు
+      revoke: ఎత్తివేయండి!
       confirm: నిశ్చయించుకున్నారా?
       reason: 'నిరోధానికి కారణం:'
       back: అన్ని నిరోధాలను చూడండి
+      revoker: 'ఎత్తివేసేవారు:'
+      needs_view: ఈ నిరోధం తొలగిపోవాలంటే ఈ వాడుకరి లాగినవ్వాలి.
     block:
+      not_revoked: (ఎత్తివేయలేదు)
       show: చూపించు
       edit: మార్చు
+      revoke: ఎత్తివేయండి!
     blocks:
+      display_name: నిరోధిత వాడుకరి
+      creator_name: సృష్టికర్త
       reason: నిరోధానికి కారణం
       status: స్థితి
+      revoker_name: ఎత్తివేసినవారు
+      showing_page: పేజీ %{page}
       next: తదుపరి »
       previous: « మునుపటి
   notes:
     index:
+      title: గమనికలు సమర్పించినది లేదా వ్యాఖ్యానించినది %{user}
       heading: '%{user} గమనికలు'
+      subheading_html: గమనికలు సమర్పించినది లేదా వ్యాఖ్యానించినది %{user}
+      no_notes: గమనికలేమీ లేవు
+      id: ఐడీ
+      creator: సృష్టికర్త
       description: వివరణ
+      created_at: సృష్టించిన తేదీ
       last_changed: చివరి మార్పు
   javascripts:
     close: మూసివేయి
@@ -851,22 +2540,55 @@ te:
       title: పంచుకోండి
       cancel: రద్దుచేయి
       image: బొమ్మ
+      link: లింకు లేదా HTML
       long_link: లంకె
       short_link: పొట్టి లంకె
+      geo_uri: Geo URI
+      embed: HTML
+      format: 'ఆకృతి:'
+      scale: 'స్కేలు:'
+      download: దించుకోండి
+      short_url: పొట్టి URL
     key:
       title: పటం సూచిక
       tooltip: పటం సూచిక
     map:
+      zoom:
+        in: జూమ్ ఇన్
+        out: జూమ్ ఔట్
       locate:
         title: నేనున్న ప్రాంతాన్ని చూపించు
+        metersPopup:
+          one: మీరు ఈ బిందువు నుండి ఒక మీటరు దూరం లోపే ఉన్నారు
+          other: మీరు ఈ బిందువు నుండి %{count} మీటర్ల దూరం లోపే ఉన్నారు
+        feetPopup:
+          one: మీరు ఈ బిందువు నుండి ఒక అడుగు దూరం లోపే ఉన్నారు
+          other: మీరు ఈ బిందువు నుండి %{count} అడుగుల దూరం లోపే ఉన్నారు
       base:
         standard: ప్రామాణికం
+        cyclosm: CyclOSM
+        cycle_map: సైకిలు మ్యాపు
         transport_map: రవాణా పటం
+        hot: మానవత్వ
+        opnvkarte: ÖPNVKarte
       layers:
+        header: మ్యాపు పొరలు
         notes: పటపు గమనికలు
         data: పటం భోగట్టా
+        gps: బహిరంగ GPS ట్రేసులు
+        title: పొరలు
       copyright: © <a href='%{copyright_url}'>ఓపెన్‌స్ట్రీట్‌మాప్ తోడ్పాటుదార్లు</a>
       donate_link_text: <a class='donate-attr' href='%{donate_url}'>విరాళం ఇవ్వండి</a>
+      terms: <a href='%{terms_url}' target='_blank'>వెబ్‌సైటు, API నియమాలు</a>
+    site:
+      edit_tooltip: మ్యాపును సరిదిద్దు
+      edit_disabled_tooltip: మ్యాపును సరిదిద్దేందుకు జూమిన్ చెయ్యి
+      createnote_tooltip: మ్యాపుకు ఒక గమనికను చేర్చండి
+      createnote_disabled_tooltip: మ్యాపులో ఒక గమనిక చేర్చేందుకు జూమిన్ చెయ్యి
+      map_notes_zoom_in_tooltip: మ్యాపు గమనికలు చూసేందుకు జూమిన్ చెయ్యి
+      map_data_zoom_in_tooltip: మ్యాపు డేటాను చూసేందుకు జూమిన్ చెయ్యి
+      queryfeature_tooltip: క్వెరీ విశేషాలు
+      queryfeature_disabled_tooltip: క్వెరీ చిశేషాల కోసం జూమిన్ చెయ్యండి
     changesets:
       show:
         comment: వ్యాఖ్య
@@ -875,22 +2597,164 @@ te:
         hide_comment: దాచు
         unhide_comment: చూపించు
     notes:
+      new:
+        intro: పొరపాట్లేమైనా కనిపించాయా? వటిని సరిచేసేందుకు గాను, ఇతర మ్యాపర్లకు కూడా
+          తెలియజేయండి. మార్కరును సరిన స్థానాంలో పెట్టి, సమస్యను వివరిస్తూ ఒక గమనికను
+          రాయండి.
+        advice: మీ గమనిక బహిరంగంగా కనిపిస్తుంది. దాన్ని బట్టి మ్యాపును తాజాకరిస్తారు.
+          అంచేత వ్యక్తిగత సమాచారాన్ని గానీ, కాపీహక్కులున్న మ్యాపుల సమాచారాన్ని గానీ,
+          డైరెక్టరీల లోని సమాచారాన్ని గానీ చేర్చకండి.
+        add: గమనికను చేర్చు
       show:
+        anonymous_warning: ఈ గమనికలో అజ్ఞాతలు చేసిన వ్యాఖ్యలు కూడా ఉన్నాయి. వాటిని
+          విడిగా ధ్రువీకరించుకోవాలి.
         hide: దాచు
+        resolve: పరిష్కరించు
+        reactivate: పునరుజ్జీవింపజేయి
         comment_and_resolve: వ్యాఖ్యానించి పరిష్కరించండి
         comment: వ్యాఖ్యానించండి
+    edit_help: మ్యాపును జరిపి, మీరు సరిదిద్దాలనుకున్న స్థలంపై జూమిన్ చేసి, అప్పుడు
+      ఇక్కడ నొక్కండి.
     directions:
+      ascend: ఎగుడు
+      engines:
+        fossgis_osrm_bike: సైకిలు (OSRM)
+        fossgis_osrm_car: కారు (OSRM)
+        fossgis_osrm_foot: నడక (OSRM)
+        graphhopper_bicycle: సైకిలు (GraphHopper)
+        graphhopper_car: కారు (GraphHopper)
+        graphhopper_foot: నడక (GraphHopper)
+      descend: దిగుడు
       directions: దిశలు
       distance: దూరం
+      errors:
+        no_route: ఆ రెండు స్థలాల మధ్య దారి కనబడలేదు.
+        no_place: సారీ - '%{place}' కనబడలేదు.
+      instructions:
+        continue_without_exit: '%{name} పై కొనసాగండి'
+        slight_right_without_exit: '%{name} వైపుగా కొద్దిగా కుడికి'
+        offramp_right: కుడి వైపున ఉన్న ర్యాంపును తీసుకోండి
+        offramp_right_with_exit: కుడి వైపున ఉన్న %{exit} నిష్క్రమణను తీసుకోండి
+        offramp_right_with_exit_name: '%{name} పైకి, %{exit} నిష్క్రమణను తీసుకోండి'
+        offramp_right_with_exit_directions: '%{directions} వైపు వెళ్ళే కుడి పక్క %{exit}
+          నిష్క్రమణను తీసుకోండి'
+        offramp_right_with_exit_name_directions: '%{name} పైకి, %{directions} కు వెళ్ళే
+          కుడి పక్క %{exit} నిష్క్రమణను తీసుకోండి'
+        offramp_right_with_name: '%{name} పైకి, కుడి పక్కనున్న ర్యాంపును తీసుకోండి'
+        offramp_right_with_directions: '%{directions} వైపు వెళ్ళే కుడి పక్క ర్యాంపును
+          తీసుకోండి'
+        offramp_right_with_name_directions: '%{name} పైకి, %{directions} వైపు వెళ్ళే
+          కుడి పక్క ర్యాంపును తీసుకోండి'
+        onramp_right_without_exit: ర్యాంపులో కుడి పక్కకు, %{name} పైకి తిరగండి
+        onramp_right_with_directions: ర్యాంపులో కుడి పక్కకు, %{directions} వైపుగా
+          తిరగండి
+        onramp_right_with_name_directions: ర్యాంపులో కుడి పక్కకు, %{name} పైకి, %{directions}
+          వైపుగా తిరగండి
+        onramp_right_without_directions: కుడి పక్కకు, ర్యాంపు మీదకి తిరగండి
+        onramp_right: కుడి పక్కకు, ర్యాంపు మీదకి తిరగండి
+        endofroad_right_without_exit: రోడ్డు చివరన, కుడి పక్కకు %{name} పైకి తిరగండి
+        merge_right_without_exit: కుడివైపున %{name} తో కలవండి
+        fork_right_without_exit: వై జంక్షను వద్ద కుడి వైపుకు %{name} పైకి తిరగండి
+        turn_right_without_exit: కుడి వైపుకు %{name} పైకి తిరగండి
+        sharp_right_without_exit: బాగా కుడి వైపుకు %{name} పైకి
+        uturn_without_exit: '%{name} వెంట యు-మలుపు'
+        sharp_left_without_exit: బాగా ఎడమ వైపుకు %{name} మీదకు
+        turn_left_without_exit: ఎడమ వైపుకు %{name} మీదకు తిరగండి
+        offramp_left: ఎడమ వైపున ర్యాంపు తీసుకోండి
+        offramp_left_with_exit: ఎడమ వైపున %{exit} నిష్క్రమణ తీసుకోండి
+        offramp_left_with_exit_name: ఎడమ వైపున %{name} పైకి %{exit} నిష్క్రమణ తీసుకోండి
+        offramp_left_with_exit_directions: '%{directions} వైపు వెళ్ళే ఎడమ పక్క %{exit}
+          నిష్క్రమణను తీసుకోండి'
+        offramp_left_with_exit_name_directions: '%{name} పైకి, %{directions} కు వెళ్ళే
+          ఎడమ పక్క %{exit} నిష్క్రమణను తీసుకోండి'
+        offramp_left_with_name: '%{name} పైకి, ఎడమ పక్కనున్న ర్యాంపును తీసుకోండి'
+        offramp_left_with_directions: '%{directions} వైపు వెళ్ళే ఎడమ పక్క ర్యాంపును
+          తీసుకోండి'
+        offramp_left_with_name_directions: '%{name} పైకి, %{directions} వైపు వెళ్ళే
+          ఎడమ పక్క ర్యాంపును తీసుకోండి'
+        onramp_left_without_exit: ర్యాంపులో ఎడమ పక్కకు, %{name} పైకి తిరగండి
+        onramp_left_with_directions: ర్యాంపులో ఎడమ పక్కకు, %{directions} వైపుగా తిరగండి
+        onramp_left_with_name_directions: ర్యాంపులో ఎడమ పక్కకు, %{name} పైకి, %{directions}
+          వైపుగా తిరగండి
+        onramp_left_without_directions: ఎడమ పక్కకు, ర్యాంపు మీదకి తిరగండి
+        onramp_left: ఎడమ పక్కకు, ర్యాంపు మీదకి తిరగండి
+        endofroad_left_without_exit: రోడ్డు చివరన, ఎడమ పక్కకు %{name} పైకి తిరగండి
+        merge_left_without_exit: ఎడమ వైపున %{name} తో కలవండి
+        fork_left_without_exit: వై జంక్షను వద్ద ఎడమ వైపుకు %{name} పైకి తిరగండి
+        slight_left_without_exit: '%{name} వైపుగా కొద్దిగా ఎడమకు'
+        via_point_without_exit: (దారి మధ్య బిందువు)
+        follow_without_exit: '%{name} అనుసరించండి'
+        roundabout_without_exit: చుట్టు మలుపు వద్ద %{name} పైకి నిష్క్రమణ తీసుకోండి
+        leave_roundabout_without_exit: చుట్టు మలుపుని వీడండి - %{name}
+        stay_roundabout_without_exit: చుట్టు మలుపు పైననే ఉండండి - %{name}
+        start_without_exit: '%{name} పైన బయలుదేరండి'
+        destination_without_exit: గమ్యాన్ని చేరుకోండి
+        against_oneway_without_exit: Go against one-way on %{name} పై వన్-వేకి ఎదురుగా
+          వెళ్ళండి
+        end_oneway_without_exit: '%{name} పై వన్-వే చివర'
+        roundabout_with_exit: చుట్టు మలుపు వద్ద %{name} పైకి %{exit} నిష్క్రమణ తీసుకోండి
+        roundabout_with_exit_ordinal: చుట్టు మలుపు వద్ద %{name} పైకి %{exit} నిష్క్రమణ
+          తీసుకోండి
+        exit_roundabout: చుట్టు మలుపును వీడి %{name} పైకి వెళ్ళండి
+        unnamed: పేరులేని రోడ్డు
+        courtesy: దిశాసూచీలు %{link} వారి సౌజన్యంతో
+        exit_counts:
+          first: 1 వ
+          second: 2 వ
+          third: 3 వ
+          fourth: 4 వ
+          fifth: 5 వ
+          sixth: 6 వ
+          seventh: 7 వ
+          eighth: 8 వ
+          ninth: 9 వ
+          tenth: 10 వ
       time: సమయం
     query:
+      node: బుడిపె
+      way: దారి
       relation: సంబంధం
+      nothing_found: విశేషాలేమీ కనబడలేదు
+      error: '%{server} ను సంప్రదించడంలో లోపం: %{error}'
+      timeout: '%{server} ను సంప్రదించడంలో టైమౌట్ అయిపోయింది'
     context:
       directions_from: ఇక్కడి నుండి దిశలు
       directions_to: ఇక్కడికి దిశలు
+      add_note: ఇక్కడొక గమనికను చేర్చండి
       show_address: చిరునామా చూపించు
+      query_features: క్వెరీ విశేషాలు
       centre_map: ఈచోటును పటానికి కేంద్రం చేయి
   redactions:
+    edit:
+      heading: సంస్కరణను సవరించండి
+      title: సంస్కరణను సవరించండి
+    index:
+      empty: చూపించడానికి సంస్కరణలేమీ లేవు
+      heading: సంస్కరణల జాబితా
+      title: సంస్కరణల జాబితా
+    new:
+      heading: కొత్త సంస్కరణ సమాచారాన్ని ఇవ్వండి
+      title: కొత్త సంస్కరణను సృష్టిస్తున్నారు
     show:
       description: 'వివరణ:'
+      heading: '"%{title}" సంస్కరణను చూపిస్తున్నాం'
+      title: సంస్కరణను చూపిస్తున్నాం
+      user: 'సృష్టికర్త:'
+      edit: ఈ సంస్కరణను సవరించండి
+      destroy: ఈ సంస్కరణను తీసివెయ్యి
+      confirm: అలా అని నిశ్చయించుకున్నారా?
+    create:
+      flash: సంస్కరణను సృష్టించాం.
+    update:
+      flash: మార్పులను భద్రపరచాం.
+    destroy:
+      not_empty: సంస్కరణ ఖాళీగా ఉంది. ఈ సంస్కరణకు సంబంధించిన కూర్పులన్నిటినీ రద్దు
+        చేసి, ఆ తరువాత సంస్కరణను నిర్మూలించండి.
+      flash: సంస్కరణను నిర్మూలించాం.
+      error: ఈ సంస్కరణను నిర్మూలించడంలో లోపం ఎదురైంది.
+  validations:
+    leading_whitespace: ముందు వైట్‌స్పేసు ఉంది
+    trailing_whitespace: వెనక వైట్‌స్పేసు ఉంది
+    invalid_characters: చెల్లని కారెక్టర్లు ఉన్నాయి
+    url_characters: (%{characters}) URL కారెక్టర్లు ఉన్నాయి
 ...
index 262390cce003b8149284312bbbd43bc4200371de..09b935e952f49d83fb6a748d39709ef2040dc712 100644 (file)
@@ -1249,6 +1249,7 @@ uk:
           "yes": Місцевість
         railway:
           abandoned: Занедбані колії
+          buffer_stop: Буферна зупинка
           construction: Будівництво колії
           disused: Покинута колія
           funicular: Фунікулер
@@ -1262,6 +1263,7 @@ uk:
           platform: Залізнична платформа
           preserved: Законсервовані колії
           proposed: Запроектовані залізничні колії
+          rail: Колія
           spur: Залізнична гілка
           station: Залізнична станція
           stop: Залізнична зупинка
@@ -1270,6 +1272,7 @@ uk:
           switch: Стрілка
           tram: Трамвайні колії
           tram_stop: Трамвайна зупинка
+          turntable: Поворотний стіл
           yard: Депо
         shop:
           agrarian: Аграрний магазин
@@ -2792,6 +2795,8 @@ uk:
       activate_user: Активувати цього учасника
       deactivate_user: Де-активувати цього учасника
       confirm_user: Підтвердити цього учасника
+      unconfirm_user: Скасувати підтвердження цього користувача
+      unsuspend_user: Скасувати призупинення цього користувача
       hide_user: Приховати цього учасника
       unhide_user: Показати цього учасника
       delete_user: Вилучити цього учасника
index 801e8f2d1328045a0629870cd385aaf4afbc526a..639910f4a001c5ef7b0e56d57767edf9312e2d64 100644 (file)
@@ -31,6 +31,8 @@ tracepoints_per_page: 5000
 max_number_of_nodes: 50000
 # Maximum number of nodes that can be in a way (checked on save)
 max_number_of_way_nodes: 2000
+# Maximum number of members that can be in a relation (checked on save)
+max_number_of_relation_members: 32000
 # The maximum area you're allowed to request notes from, in square degrees
 max_note_request_area: 25
 # Zoom level to use for postcode results from the geocoder
@@ -118,10 +120,15 @@ fossgis_osrm_url: "https://routing.openstreetmap.de/"
 csp_enforce: false
 # URL for reporting Content-Security-Policy violations
 #csp_report_url: ""
-# Storage service to use in production mode
-storage_service: "local"
-# Root URL for storage service
-# storage_url:
+# Storage services to use in production mode
+avatar_storage: "local"
+trace_file_storage: "local"
+trace_image_storage: "local"
+trace_icon_storage: "local"
+# Root URL for storage services
+# avatar_storage_url:
+# trace_image_storage_url:
+# trace_icon_storage_url:
 # URL for tile CDN
 #tile_cdn_url: ""
 # SMTP settings for outbound mail
index d3952e27bba028b91657916af8b10073103fc0be..3d940aec9a4e1886150c5a85e69b34c655f4fe5e 100644 (file)
@@ -19,3 +19,8 @@ wikipedia_auth_id: "dummy"
 wikipedia_auth_secret: "dummy"
 # Server URL for testing
 server_url: "test.host"
+# Storage services for testing
+avatar_storage: "test"
+trace_file_storage: "test"
+trace_image_storage: "test"
+trace_icon_storage: "test"
index 66456bc2c5d7ec26da4470e195649059c2486e94..d9a6435548f56ea21e87bdb179a7791a2ab2cab3 100644 (file)
@@ -18,7 +18,7 @@ class CreateDoorkeeperTables < ActiveRecord::Migration[6.0]
 
     create_table :oauth_access_grants do |t|
       t.references :resource_owner, :null => false, :type => :bigint
-      t.references :application, :null => false
+      t.references :application, :null => false, :type => :bigint
       t.string :token, :null => false
       t.integer :expires_in, :null => false
       t.text :redirect_uri, :null => false
@@ -35,7 +35,7 @@ class CreateDoorkeeperTables < ActiveRecord::Migration[6.0]
 
     create_table :oauth_access_tokens do |t|
       t.references :resource_owner, :index => true, :type => :bigint
-      t.references :application, :null => false
+      t.references :application, :null => false, :type => :bigint
       t.string :token, :null => false
       t.string :refresh_token
       t.integer :expires_in
index 07b2cd5ebf29e2726f575b54f5106297acf84dd4..1b013386a208ebbd6dcf519e917d344694f3e4ca 100644 (file)
@@ -2,7 +2,7 @@
 class CreateActiveStorageVariantRecords < ActiveRecord::Migration[6.0]
   def change
     create_table :active_storage_variant_records do |t|
-      t.belongs_to :blob, :null => false, :index => false
+      t.belongs_to :blob, :null => false, :type => :bigint, :index => false
       t.string :variation_digest, :null => false
 
       t.index [:blob_id, :variation_digest], :name => "index_active_storage_variant_records_uniqueness", :unique => true
diff --git a/db/migrate/20211216185316_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb b/db/migrate/20211216185316_remove_not_null_on_active_storage_blobs_checksum.active_storage.rb
new file mode 100644 (file)
index 0000000..da8f3f1
--- /dev/null
@@ -0,0 +1,6 @@
+# This migration comes from active_storage (originally 20211119233751)
+class RemoveNotNullOnActiveStorageBlobsChecksum < ActiveRecord::Migration[6.0]
+  def change
+    change_column_null(:active_storage_blobs, :checksum, true)
+  end
+end
index 7c182189c2de3b9de55ecea84601bf42e4bd2d33..63aa17353a7071df5c0ed8efc1e10e8d15879bb7 100644 (file)
@@ -16,13 +16,6 @@ SET row_security = off;
 CREATE EXTENSION IF NOT EXISTS btree_gist WITH SCHEMA public;
 
 
---
--- Name: EXTENSION btree_gist; Type: COMMENT; Schema: -; Owner: -
---
-
-COMMENT ON EXTENSION btree_gist IS 'support for indexing common datatypes in GiST';
-
-
 --
 -- Name: format_enum; Type: TYPE; Schema: public; Owner: -
 --
@@ -228,7 +221,7 @@ CREATE TABLE public.active_storage_blobs (
     content_type character varying,
     metadata text,
     byte_size bigint NOT NULL,
-    checksum character varying NOT NULL,
+    checksum character varying,
     created_at timestamp without time zone NOT NULL,
     service_name character varying NOT NULL
 );
@@ -3432,6 +3425,7 @@ INSERT INTO "schema_migrations" (version) VALUES
 ('20210510083027'),
 ('20210510083028'),
 ('20210511104518'),
+('20211216185316'),
 ('20220201183346'),
 ('21'),
 ('22'),
index 71b2823b85c16a38689987de8fd01a2c97533b1f..3dc448e4632cd85c9221d701f1c8386eca2b8151 100644 (file)
@@ -121,7 +121,7 @@ module GPX
 
       output = StringIO.new
       image.export(output)
-      output.read
+      output
     end
 
     def icon(min_lat, min_lon, max_lat, max_lon)
@@ -161,7 +161,7 @@ module GPX
         end
       end
 
-      image.gif
+      StringIO.new(image.gif)
     end
   end
 
index 005d3ebb848fcd5c109fac687872b2a6d704ba76..ee0b8d9030ee719c769cdb0039edef17d8631e01 100644 (file)
@@ -237,6 +237,24 @@ module OSM
     end
   end
 
+  # Raised when a relation has more than the configured number of relation members.
+  # This prevents relations from being too complex and difficult to work with
+  class APITooManyRelationMembersError < APIError
+    def initialize(id, provided, max)
+      super "You tried to add #{provided} members to relation #{id}, however only #{max} are allowed"
+
+      @id = id
+      @provided = provided
+      @max = max
+    end
+
+    attr_reader :id, :provided, :max
+
+    def status
+      :bad_request
+    end
+  end
+
   ##
   # raised when user input couldn't be parsed
   class APIBadUserInput < APIError
diff --git a/lib/tasks/migrate_traces_to_storage.rake b/lib/tasks/migrate_traces_to_storage.rake
new file mode 100644 (file)
index 0000000..11909ff
--- /dev/null
@@ -0,0 +1,9 @@
+namespace :traces do
+  desc "Migrate trace files to ActiveStorage"
+  task :migrate_to_storage => :environment do
+    Trace
+      .with_attached_file
+      .where(:file_attachment => { :id => nil })
+      .find_each(&:migrate_to_storage!)
+  end
+end
index 680c17bc85263bb476f853f85fc5d05d487b95d2..6d7e51d6a0527b91f697c2a52d0849b42c5482cc 100644 (file)
@@ -60,6 +60,9 @@ sudo -u vagrant psql -d openstreetmap -f db/functions/functions.sql
 if [ ! -f config/database.yml ]; then
     sudo -u vagrant cp config/example.database.yml config/database.yml
 fi
+if [ ! -f config/storage.yml ]; then
+    cp config/example.storage.yml config/storage.yml
+fi
 touch config/settings.local.yml
 # migrate the database to the latest version
 sudo -u vagrant bundle exec rake db:migrate
index 1cae8f02cf134fa1cb3452ac8c86a80c533ae22e..9d6de4a6fafbc7ec6eb35a1adbd0700ecabf2b34 100644 (file)
@@ -25,6 +25,7 @@ module Api
           assert_select "note_area[maximum='#{Settings.max_note_request_area}']", :count => 1
           assert_select "tracepoints[per_page='#{Settings.tracepoints_per_page}']", :count => 1
           assert_select "changesets[maximum_elements='#{Changeset::MAX_ELEMENTS}']", :count => 1
+          assert_select "relationmembers[maximum='#{Settings.max_number_of_relation_members}']", :count => 1
           assert_select "status[database='online']", :count => 1
           assert_select "status[api='online']", :count => 1
           assert_select "status[gpx='online']", :count => 1
index 52df899ba0778e8f2b600ddf14d6272827aa66da..9719c7c921020b93f3f930d8c2564bd78cbd57f7 100644 (file)
@@ -119,11 +119,15 @@ module Api
       # Now with some other user, which should work since the trace is public
       auth_header = basic_authorization_header create(:user).display_name, "test"
       get api_trace_data_path(public_trace_file), :headers => auth_header
+      follow_redirect!
+      follow_redirect!
       check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
 
       # And finally we should be able to do it with the owner of the trace
       auth_header = basic_authorization_header public_trace_file.user.display_name, "test"
       get api_trace_data_path(public_trace_file), :headers => auth_header
+      follow_redirect!
+      follow_redirect!
       check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
     end
 
@@ -136,7 +140,9 @@ module Api
 
       # First get the data as is
       get api_trace_data_path(identifiable_trace_file), :headers => auth_header
-      check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/x-gzip", "gpx.gz"
+      follow_redirect!
+      follow_redirect!
+      check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/gzip", "gpx.gz"
 
       # Now ask explicitly for XML format
       get api_trace_data_path(identifiable_trace_file, :format => "xml"), :headers => auth_header
@@ -163,6 +169,8 @@ module Api
       # And finally we should be able to do it with the owner of the trace
       auth_header = basic_authorization_header anon_trace_file.user.display_name, "test"
       get api_trace_data_path(anon_trace_file), :headers => auth_header
+      follow_redirect!
+      follow_redirect!
       check_trace_data anon_trace_file, "db4cb5ed2d7d2b627b3b504296c4f701"
     end
 
@@ -211,7 +219,7 @@ module Api
       assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
       assert_equal "trackable", trace.visibility
       assert_not trace.inserted
-      assert_equal File.new(fixture).read, File.new(trace.trace_name).read
+      assert_equal File.new(fixture).read, trace.file.blob.download
       trace.destroy
       assert_equal "trackable", user.preferences.where(:k => "gps.trace.visibility").first.v
 
@@ -229,7 +237,7 @@ module Api
       assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
       assert_equal "public", trace.visibility
       assert_not trace.inserted
-      assert_equal File.new(fixture).read, File.new(trace.trace_name).read
+      assert_equal File.new(fixture).read, trace.file.blob.download
       trace.destroy
       assert_equal "public", user.preferences.where(:k => "gps.trace.visibility").first.v
 
@@ -248,7 +256,7 @@ module Api
       assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
       assert_equal "private", trace.visibility
       assert_not trace.inserted
-      assert_equal File.new(fixture).read, File.new(trace.trace_name).read
+      assert_equal File.new(fixture).read, trace.file.blob.download
       trace.destroy
       assert_equal "private", second_user.preferences.where(:k => "gps.trace.visibility").first.v
     end
index 1c3dc2d31def9fc85db02a1d437d5593ea1143b4..48b5c457f7fe98b2f024d09ba9db0894897a3a7b 100644 (file)
@@ -369,16 +369,22 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
 
     # First with no auth, which should work since the trace is public
     get trace_data_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    follow_redirect!
+    follow_redirect!
     check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
 
     # Now with some other user, which should work since the trace is public
     session_for(create(:user))
     get trace_data_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    follow_redirect!
+    follow_redirect!
     check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
 
     # And finally we should be able to do it with the owner of the trace
     session_for(public_trace_file.user)
     get trace_data_path(:display_name => public_trace_file.user.display_name, :id => public_trace_file)
+    follow_redirect!
+    follow_redirect!
     check_trace_data public_trace_file, "848caa72f2f456d1bd6a0fdf228aa1b9"
   end
 
@@ -388,7 +394,9 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
 
     # First get the data as is
     get trace_data_path(:display_name => identifiable_trace_file.user.display_name, :id => identifiable_trace_file)
-    check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/x-gzip", "gpx.gz"
+    follow_redirect!
+    follow_redirect!
+    check_trace_data identifiable_trace_file, "c6422a3d8750faae49ed70e7e8a51b93", "application/gzip", "gpx.gz"
 
     # Now ask explicitly for XML format
     get trace_data_path(:display_name => identifiable_trace_file.user.display_name, :id => identifiable_trace_file.id, :format => "xml")
@@ -415,6 +423,8 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     # And finally we should be able to do it with the owner of the trace
     session_for(anon_trace_file.user)
     get trace_data_path(:display_name => anon_trace_file.user.display_name, :id => anon_trace_file)
+    follow_redirect!
+    follow_redirect!
     check_trace_data anon_trace_file, "db4cb5ed2d7d2b627b3b504296c4f701"
   end
 
@@ -598,7 +608,7 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
     assert_equal %w[new trace], trace.tags.order(:tag).collect(&:tag)
     assert_equal "trackable", trace.visibility
     assert_not trace.inserted
-    assert_equal File.new(fixture).read, File.new(trace.trace_name).read
+    assert_equal File.new(fixture).read, trace.file.blob.download
     trace.destroy
     assert_equal "trackable", user.preferences.where(:k => "gps.trace.visibility").first.v
   end
@@ -789,19 +799,22 @@ class TracesControllerTest < ActionDispatch::IntegrationTest
   end
 
   def check_trace_data(trace, digest, content_type = "application/gpx+xml", extension = "gpx")
-    assert_response :success
     assert_equal digest, Digest::MD5.hexdigest(response.body)
     assert_equal content_type, response.media_type
     assert_equal "attachment; filename=\"#{trace.id}.#{extension}\"; filename*=UTF-8''#{trace.id}.#{extension}", @response.header["Content-Disposition"]
   end
 
   def check_trace_picture(trace)
+    follow_redirect!
+    follow_redirect!
     assert_response :success
     assert_equal "image/gif", response.media_type
     assert_equal trace.large_picture, response.body
   end
 
   def check_trace_icon(trace)
+    follow_redirect!
+    follow_redirect!
     assert_response :success
     assert_equal "image/gif", response.media_type
     assert_equal trace.icon_picture, response.body
index 961d52988fc0595c841e9464e9f4028b23447ef6..687339e7f49a5ae1ce9212ba626b94ea51b78979 100644 (file)
@@ -17,14 +17,14 @@ FactoryBot.define do
       fixture { nil }
     end
 
-    after(:create) do |trace, evaluator|
+    after(:build) do |user, evaluator|
       if evaluator.fixture
-        FileUtils.copy(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gpx"),
-                       File.join(Settings.gpx_trace_dir, "#{trace.id}.gpx"))
-        FileUtils.copy(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif"),
-                       File.join(Settings.gpx_image_dir, "#{trace.id}.gif"))
-        FileUtils.copy(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}_icon.gif"),
-                       File.join(Settings.gpx_image_dir, "#{trace.id}_icon.gif"))
+        user.file.attach(Rack::Test::UploadedFile.new(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gpx")))
+
+        if evaluator.inserted
+          user.image.attach(Rack::Test::UploadedFile.new(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}.gif")))
+          user.icon.attach(Rack::Test::UploadedFile.new(Rails.root.join("test", "gpx", "fixtures", "#{evaluator.fixture}_icon.gif")))
+        end
       end
     end
   end
index 2aaaaed8aedd22ddb512e11e52956eaea51630cd..193126df14408e69a0ec3666eab10b8c2d4b5165 100644 (file)
@@ -230,4 +230,27 @@ class RelationTest < ActiveSupport::TestCase
     assert_equal 39, changeset.min_lat
     assert_equal 116, changeset.max_lat
   end
+
+  # Check that the preconditions fail when you are over the defined limit of
+  # the maximum number of members in a relation.
+  def test_max_members_per_relation_limit
+    # Speed up unit test by using a small relation member limit
+    default_limit = Settings.max_number_of_relation_members
+    Settings.max_number_of_relation_members = 20
+
+    user = create(:user)
+    changeset = create(:changeset, :user => user)
+    relation = create(:relation, :changeset => changeset)
+    node = create(:node, :longitude => 116, :latitude => 39)
+    # Create relation which exceeds the relation member limit by one
+    0.upto(Settings.max_number_of_relation_members) do |i|
+      create(:relation_member, :relation => relation, :member_type => "Node", :member_id => node.id, :sequence_id => i)
+    end
+
+    assert_raise OSM::APITooManyRelationMembersError do
+      relation.create_with_history user
+    end
+
+    Settings.max_number_of_relation_members = default_limit
+  end
 end
index 9682d6b288a0a3958f5bfa15e0daab3c68dd12c7..1322964c2734da4e5b907945c14a093970cc5497 100644 (file)
@@ -136,11 +136,11 @@ class TraceTest < ActiveSupport::TestCase
     check_mime_type("a", "application/gpx+xml")
     check_mime_type("b", "application/gpx+xml")
     check_mime_type("c", "application/x-bzip2")
-    check_mime_type("d", "application/x-gzip")
-    check_mime_type("f", "application/x-zip")
+    check_mime_type("d", "application/gzip")
+    check_mime_type("f", "application/zip")
     check_mime_type("g", "application/x-tar")
-    check_mime_type("h", "application/x-gzip")
-    check_mime_type("i", "application/x-bzip2")
+    check_mime_type("h", "application/x-tar+gzip")
+    check_mime_type("i", "application/x-tar+x-bzip2")
   end
 
   def test_extension_name
@@ -168,24 +168,16 @@ class TraceTest < ActiveSupport::TestCase
 
   def test_large_picture
     picture = File.read(Rails.root.join("test/gpx/fixtures/a.gif"), :mode => "rb")
+    trace = create(:trace, :fixture => "a")
 
-    trace = Trace.create
-    trace.large_picture = picture
-    assert_equal "7c841749e084ee4a5d13f12cd3bef456", md5sum(File.new(trace.large_picture_name))
     assert_equal picture, trace.large_picture
-
-    trace.destroy
   end
 
   def test_icon_picture
     picture = File.read(Rails.root.join("test/gpx/fixtures/a_icon.gif"), :mode => "rb")
+    trace = create(:trace, :fixture => "a")
 
-    trace = Trace.create
-    trace.icon_picture = picture
-    assert_equal "b47baf22ed0e85d77e808694fad0ee27", md5sum(File.new(trace.icon_picture_name))
     assert_equal picture, trace.icon_picture
-
-    trace.destroy
   end
 
   def test_import_removes_previous_tracepoints
@@ -215,29 +207,27 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_creates_icon
-    trace = create(:trace, :fixture => "a")
-    icon_path = File.join(Settings.gpx_image_dir, "#{trace.id}_icon.gif")
-    FileUtils.rm(icon_path)
-    assert_not File.exist?(icon_path)
+    trace = create(:trace, :inserted => false, :fixture => "a")
+
+    assert_not trace.icon.attached?
 
     trace.import
 
-    assert_path_exists(icon_path)
+    assert trace.icon.attached?
   end
 
   def test_import_creates_large_picture
-    trace = create(:trace, :fixture => "a")
-    large_picture_path = File.join(Settings.gpx_image_dir, "#{trace.id}.gif")
-    FileUtils.rm(large_picture_path)
-    assert_not File.exist?(large_picture_path)
+    trace = create(:trace, :inserted => false, :fixture => "a")
+
+    assert_not trace.image.attached?
 
     trace.import
 
-    assert_path_exists(large_picture_path)
+    assert trace.image.attached?
   end
 
   def test_import_handles_bz2
-    trace = create(:trace, :fixture => "c")
+    trace = create(:trace, :inserted => false, :fixture => "c")
 
     trace.import
 
@@ -245,7 +235,7 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_handles_plain
-    trace = create(:trace, :fixture => "a")
+    trace = create(:trace, :inserted => false, :fixture => "a")
 
     trace.import
 
@@ -253,7 +243,7 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_handles_plain_with_bom
-    trace = create(:trace, :fixture => "b")
+    trace = create(:trace, :inserted => false, :fixture => "b")
 
     trace.import
 
@@ -261,7 +251,7 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_handles_gz
-    trace = create(:trace, :fixture => "d")
+    trace = create(:trace, :inserted => false, :fixture => "d")
 
     trace.import
 
@@ -269,7 +259,7 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_handles_zip
-    trace = create(:trace, :fixture => "f")
+    trace = create(:trace, :inserted => false, :fixture => "f")
 
     trace.import
 
@@ -277,7 +267,7 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_handles_tar
-    trace = create(:trace, :fixture => "g")
+    trace = create(:trace, :inserted => false, :fixture => "g")
 
     trace.import
 
@@ -285,7 +275,7 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_handles_tar_gz
-    trace = create(:trace, :fixture => "h")
+    trace = create(:trace, :inserted => false, :fixture => "h")
 
     trace.import
 
@@ -293,7 +283,7 @@ class TraceTest < ActiveSupport::TestCase
   end
 
   def test_import_handles_tar_bz2
-    trace = create(:trace, :fixture => "i")
+    trace = create(:trace, :inserted => false, :fixture => "i")
 
     trace.import
 
index 422ebef8e25ba88332a172449e9252ce5c929963..d76a2c4ace3d567baea812b1c9414be5026203d1 100644 (file)
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,14 +2,14 @@
 # yarn lockfile v1
 
 
-"@eslint/eslintrc@^1.0.5":
-  version "1.0.5"
-  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.0.5.tgz#33f1b838dbf1f923bfa517e008362b78ddbbf318"
-  integrity sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==
+"@eslint/eslintrc@^1.1.0":
+  version "1.1.0"
+  resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.1.0.tgz#583d12dbec5d4f22f333f9669f7d0b7c7815b4d3"
+  integrity sha512-C1DfL7XX4nPqGd6jcP01W9pVM1HYCuUkFk1432D7F0v3JSlUIeOYn9oCoi3eoLZ+iwBSb29BMFxxny0YrrEZqg==
   dependencies:
     ajv "^6.12.4"
     debug "^4.3.2"
-    espree "^9.2.0"
+    espree "^9.3.1"
     globals "^13.9.0"
     ignore "^4.0.6"
     import-fresh "^3.2.1"
@@ -163,10 +163,10 @@ escape-string-regexp@^4.0.0:
   resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
   integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
 
-eslint-scope@^7.1.0:
-  version "7.1.0"
-  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.0.tgz#c1f6ea30ac583031f203d65c73e723b01298f153"
-  integrity sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==
+eslint-scope@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642"
+  integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==
   dependencies:
     esrecurse "^4.3.0"
     estraverse "^5.2.0"
@@ -183,17 +183,17 @@ eslint-visitor-keys@^2.0.0:
   resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8"
   integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==
 
-eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.2.0:
-  version "3.2.0"
-  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz#6fbb166a6798ee5991358bc2daa1ba76cc1254a1"
-  integrity sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==
+eslint-visitor-keys@^3.3.0:
+  version "3.3.0"
+  resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
+  integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
 
 eslint@^8.0.0:
-  version "8.8.0"
-  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.8.0.tgz#9762b49abad0cb4952539ffdb0a046392e571a2d"
-  integrity sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==
+  version "8.9.0"
+  resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.9.0.tgz#a2a8227a99599adc4342fd9b854cb8d8d6412fdb"
+  integrity sha512-PB09IGwv4F4b0/atrbcMFboF/giawbBLVC7fyDamk5Wtey4Jh2K+rYaBhCAbUyEI4QzB1ly09Uglc9iCtFaG2Q==
   dependencies:
-    "@eslint/eslintrc" "^1.0.5"
+    "@eslint/eslintrc" "^1.1.0"
     "@humanwhocodes/config-array" "^0.9.2"
     ajv "^6.10.0"
     chalk "^4.0.0"
@@ -201,10 +201,10 @@ eslint@^8.0.0:
     debug "^4.3.2"
     doctrine "^3.0.0"
     escape-string-regexp "^4.0.0"
-    eslint-scope "^7.1.0"
+    eslint-scope "^7.1.1"
     eslint-utils "^3.0.0"
-    eslint-visitor-keys "^3.2.0"
-    espree "^9.3.0"
+    eslint-visitor-keys "^3.3.0"
+    espree "^9.3.1"
     esquery "^1.4.0"
     esutils "^2.0.2"
     fast-deep-equal "^3.1.3"
@@ -229,14 +229,14 @@ eslint@^8.0.0:
     text-table "^0.2.0"
     v8-compile-cache "^2.0.3"
 
-espree@^9.2.0, espree@^9.3.0:
-  version "9.3.0"
-  resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.0.tgz#c1240d79183b72aaee6ccfa5a90bc9111df085a8"
-  integrity sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==
+espree@^9.3.1:
+  version "9.3.1"
+  resolved "https://registry.yarnpkg.com/espree/-/espree-9.3.1.tgz#8793b4bc27ea4c778c19908e0719e7b8f4115bcd"
+  integrity sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==
   dependencies:
     acorn "^8.7.0"
     acorn-jsx "^5.3.1"
-    eslint-visitor-keys "^3.1.0"
+    eslint-visitor-keys "^3.3.0"
 
 esquery@^1.4.0:
   version "1.4.0"