Merge pull request #24 from zerebubuth/routing-merge
authorRichard Fairhurst <richard@systemeD.net>
Mon, 3 Nov 2014 11:33:08 +0000 (11:33 +0000)
committerRichard Fairhurst <richard@systemeD.net>
Mon, 3 Nov 2014 11:33:08 +0000 (11:33 +0000)
Routing merge

350 files changed:
.gitignore
CONFIGURE.md
Gemfile
Gemfile.lock
INSTALL.md
VAGRANT.md [new file with mode: 0644]
Vagrantfile [new file with mode: 0644]
Vendorfile
app/assets/images/browse/caravan_park.n.16.png [new file with mode: 0644]
app/assets/images/browse/caravan_park.p.24.png [deleted file]
app/assets/images/browse/parking.p.16.png
app/assets/images/sotm.png [new file with mode: 0644]
app/assets/javascripts/application.js
app/assets/javascripts/index.js
app/assets/javascripts/index/changeset.js [new file with mode: 0644]
app/assets/javascripts/index/export.js
app/assets/javascripts/index/history.js
app/assets/javascripts/index/note.js.erb
app/assets/javascripts/index/notes.js.erb
app/assets/javascripts/index/search.js
app/assets/javascripts/leaflet.map.js.erb
app/assets/javascripts/router.js
app/assets/stylesheets/common.css.scss
app/controllers/amf_controller.rb
app/controllers/api_controller.rb
app/controllers/application_controller.rb
app/controllers/browse_controller.rb
app/controllers/changeset_controller.rb
app/controllers/geocoder_controller.rb
app/controllers/notes_controller.rb
app/controllers/site_controller.rb
app/controllers/trace_controller.rb
app/controllers/user_preference_controller.rb
app/helpers/browse_helper.rb
app/helpers/title_helper.rb
app/models/acl.rb
app/models/changeset.rb
app/models/changeset_comment.rb [new file with mode: 0644]
app/models/note_comment.rb
app/models/notifier.rb
app/models/relation_member.rb
app/models/trace.rb
app/models/user.rb
app/models/way.rb
app/views/api/map.xml.builder [deleted file]
app/views/browse/_common_details.html.erb
app/views/browse/_node.html.erb
app/views/browse/_relation_member.html.erb
app/views/browse/_way.html.erb
app/views/browse/changeset.html.erb
app/views/browse/feature.html.erb
app/views/browse/history.html.erb
app/views/changeset/_comment.html.erb [new file with mode: 0644]
app/views/changeset/_comments.rss.builder [new file with mode: 0644]
app/views/changeset/comments_feed.rss.builder [new file with mode: 0644]
app/views/diary_entry/_location.html.erb
app/views/layouts/_head.html.erb
app/views/layouts/map.html.erb
app/views/message/new.html.erb
app/views/notifier/changeset_comment_notification.html.erb [new file with mode: 0644]
app/views/notifier/changeset_comment_notification.text.erb [new file with mode: 0644]
app/views/site/_id.html.erb
app/views/site/export.html.erb
app/views/trace/_trace.html.erb
app/views/trace/edit.html.erb
app/views/trace/view.html.erb
app/views/user/login.html.erb
config.ru
config/application.rb
config/boot.rb
config/environment.rb
config/environments/development.rb
config/environments/production.rb
config/environments/test.rb
config/example.application.yml
config/initializers/assets.rb [new file with mode: 0644]
config/initializers/cookies_serializer.rb [new file with mode: 0644]
config/initializers/postgresql_adapter.rb
config/initializers/router.rb [new file with mode: 0644]
config/initializers/secret_token.rb [deleted file]
config/initializers/session_store.rb
config/locales/af.yml
config/locales/aln.yml
config/locales/ar.yml
config/locales/arz.yml
config/locales/ast.yml
config/locales/az.yml
config/locales/be-Tarask.yml
config/locales/be.yml
config/locales/bg.yml
config/locales/br.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/da.yml
config/locales/de.yml
config/locales/diq.yml
config/locales/dsb.yml
config/locales/el.yml
config/locales/en.yml
config/locales/eo.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/fur.yml
config/locales/gcf.yml
config/locales/gl.yml
config/locales/gsw.yml
config/locales/he.yml
config/locales/hi.yml
config/locales/hr.yml
config/locales/hsb.yml
config/locales/hu.yml
config/locales/ia.yml
config/locales/id.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ka.yml
config/locales/km.yml
config/locales/ko.yml
config/locales/ksh.yml
config/locales/lb.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/mr.yml
config/locales/ms.yml
config/locales/nb.yml
config/locales/nds.yml
config/locales/ne.yml
config/locales/nl.yml
config/locales/nn.yml
config/locales/oc.yml
config/locales/pa.yml
config/locales/pl.yml
config/locales/ps.yml
config/locales/pt-BR.yml
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sco.yml [new file with mode: 0644]
config/locales/sk.yml
config/locales/sl.yml
config/locales/sq.yml
config/locales/sr-Latn.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/ta.yml
config/locales/te.yml
config/locales/tl.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/yi.yml
config/locales/yo.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/routes.rb
config/secrets.yml [new file with mode: 0644]
config/wiki_pages.yml
db/migrate/004_user_enhancements.rb
db/migrate/005_tile_tracepoints.rb
db/migrate/006_tile_nodes.rb
db/migrate/028_add_more_changeset_indexes.rb
db/migrate/039_add_more_controls_to_gpx_files.rb
db/migrate/044_create_user_roles.rb
db/migrate/051_add_status_to_user.rb
db/migrate/20140507110937_create_changeset_comments.rb [new file with mode: 0644]
db/migrate/20140519141742_add_join_table_between_users_and_changesets.rb [new file with mode: 0644]
db/structure.sql
doc/README_FOR_APP [deleted file]
lib/migrate.rb
lib/osm.rb
lib/potlatch2.rb
public/robots.txt
script/misc/update-wiki-pages
script/statistics
script/vagrant/setup/provision.sh [new file with mode: 0644]
test/controllers/amf_controller_test.rb
test/controllers/changeset_controller_test.rb
test/controllers/site_controller_test.rb
test/controllers/trace_controller_test.rb
test/controllers/user_blocks_controller_test.rb
test/controllers/user_controller_test.rb
test/controllers/user_preference_controller_test.rb
test/fixtures/changeset_comments.yml [new file with mode: 0644]
test/fixtures/changesets.yml
test/fixtures/changesets_subscribers.yml [new file with mode: 0644]
test/fixtures/note_comments.yml
test/helpers/application_helper_test.rb
test/helpers/browse_helper_test.rb
test/helpers/note_helper_test.rb
test/helpers/title_helper_test.rb
test/integration/short_links_test.rb
test/integration/user_changeset_comments_test.rb [new file with mode: 0644]
test/integration/user_creation_test.rb
test/models/changeset_comment_test.rb [new file with mode: 0644]
test/models/changeset_test.rb
test/models/node_test.rb
test/models/note_comment_test.rb [new file with mode: 0644]
test/models/note_test.rb [new file with mode: 0644]
test/models/old_node_test.rb
test/models/relation_test.rb
test/models/trace_test.rb
test/models/user_test.rb
test/models/way_test.rb
test/test_helper.rb
vendor/assets/iD/iD.css.erb
vendor/assets/iD/iD.js
vendor/assets/iD/iD/img/arrow-icon.png [new file with mode: 0644]
vendor/assets/iD/iD/img/cursor-select-mapillary.png [new file with mode: 0644]
vendor/assets/iD/iD/img/cursor-select-mapillary2x.png [new file with mode: 0644]
vendor/assets/iD/iD/img/maki-sprite.png
vendor/assets/iD/iD/img/relation-presets.png
vendor/assets/iD/iD/img/sprite.svg
vendor/assets/iD/iD/locales/af.json
vendor/assets/iD/iD/locales/ar-AA.json
vendor/assets/iD/iD/locales/ar.json
vendor/assets/iD/iD/locales/ast.json
vendor/assets/iD/iD/locales/bg-BG.json
vendor/assets/iD/iD/locales/bn.json
vendor/assets/iD/iD/locales/bs.json
vendor/assets/iD/iD/locales/ca.json
vendor/assets/iD/iD/locales/cs.json
vendor/assets/iD/iD/locales/da.json
vendor/assets/iD/iD/locales/de.json
vendor/assets/iD/iD/locales/el.json
vendor/assets/iD/iD/locales/en-GB.json
vendor/assets/iD/iD/locales/en.json
vendor/assets/iD/iD/locales/eo.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/es.json
vendor/assets/iD/iD/locales/et.json
vendor/assets/iD/iD/locales/fa.json
vendor/assets/iD/iD/locales/fi.json
vendor/assets/iD/iD/locales/fil.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/fr.json
vendor/assets/iD/iD/locales/gan.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/gl.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/hr.json
vendor/assets/iD/iD/locales/hu.json
vendor/assets/iD/iD/locales/hy.json
vendor/assets/iD/iD/locales/id.json
vendor/assets/iD/iD/locales/is.json
vendor/assets/iD/iD/locales/it.json
vendor/assets/iD/iD/locales/ja.json
vendor/assets/iD/iD/locales/km-KH.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/km.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/kn.json
vendor/assets/iD/iD/locales/ko-KR.json
vendor/assets/iD/iD/locales/ko.json
vendor/assets/iD/iD/locales/lt.json
vendor/assets/iD/iD/locales/lv.json
vendor/assets/iD/iD/locales/nl.json
vendor/assets/iD/iD/locales/no.json
vendor/assets/iD/iD/locales/pl.json
vendor/assets/iD/iD/locales/pt-BR.json
vendor/assets/iD/iD/locales/pt.json
vendor/assets/iD/iD/locales/ro-RO.json
vendor/assets/iD/iD/locales/ru.json
vendor/assets/iD/iD/locales/sc.json
vendor/assets/iD/iD/locales/si.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/sk.json
vendor/assets/iD/iD/locales/sl.json
vendor/assets/iD/iD/locales/sq-AL.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/sr.json
vendor/assets/iD/iD/locales/sv.json
vendor/assets/iD/iD/locales/ta.json
vendor/assets/iD/iD/locales/te.json
vendor/assets/iD/iD/locales/tl.json [new file with mode: 0644]
vendor/assets/iD/iD/locales/tr.json
vendor/assets/iD/iD/locales/uk.json
vendor/assets/iD/iD/locales/vi.json
vendor/assets/iD/iD/locales/yue.json
vendor/assets/iD/iD/locales/zh-CN.json
vendor/assets/iD/iD/locales/zh-HK.json
vendor/assets/iD/iD/locales/zh-TW.json
vendor/assets/iD/iD/locales/zh.json
vendor/assets/leaflet/leaflet.js
vendor/assets/leaflet/leaflet.locate.js
vendor/assets/leaflet/leaflet.locationfilter.js
vendor/assets/leaflet/leaflet.osm.js
vendor/assets/potlatch2/potlatch2.swf
vendor/assets/potlatch2/potlatch2/assets.zip
vendor/assets/potlatch2/potlatch2/locales/af.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ar.swf
vendor/assets/potlatch2/potlatch2/locales/arc.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ba.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/be.swf
vendor/assets/potlatch2/potlatch2/locales/bn.swf
vendor/assets/potlatch2/potlatch2/locales/ce.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/cs_CZ.swf
vendor/assets/potlatch2/potlatch2/locales/de-formal.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/diq.swf
vendor/assets/potlatch2/potlatch2/locales/dsb.swf
vendor/assets/potlatch2/potlatch2/locales/el.swf
vendor/assets/potlatch2/potlatch2/locales/en_GB.swf
vendor/assets/potlatch2/potlatch2/locales/eo.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/es_ES.swf
vendor/assets/potlatch2/potlatch2/locales/et.swf
vendor/assets/potlatch2/potlatch2/locales/eu.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/fa.swf
vendor/assets/potlatch2/potlatch2/locales/fr_FR.swf
vendor/assets/potlatch2/potlatch2/locales/fur.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ga.swf
vendor/assets/potlatch2/potlatch2/locales/grc.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/hr.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/hsb.swf
vendor/assets/potlatch2/potlatch2/locales/ia.swf
vendor/assets/potlatch2/potlatch2/locales/id.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/it_IT.swf
vendor/assets/potlatch2/potlatch2/locales/ja_JP.swf
vendor/assets/potlatch2/potlatch2/locales/km.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/kn.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ko.swf
vendor/assets/potlatch2/potlatch2/locales/krc.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ku-latn.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ky.swf
vendor/assets/potlatch2/potlatch2/locales/lb.swf
vendor/assets/potlatch2/potlatch2/locales/lez.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/lzz.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/mk.swf
vendor/assets/potlatch2/potlatch2/locales/mr.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ms.swf
vendor/assets/potlatch2/potlatch2/locales/nn_NO.swf
vendor/assets/potlatch2/potlatch2/locales/oc.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/pa.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/ps.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/pt_BR.swf
vendor/assets/potlatch2/potlatch2/locales/pt_PT.swf
vendor/assets/potlatch2/potlatch2/locales/ru.swf
vendor/assets/potlatch2/potlatch2/locales/sah.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/sk.swf
vendor/assets/potlatch2/potlatch2/locales/sl.swf
vendor/assets/potlatch2/potlatch2/locales/sq.swf
vendor/assets/potlatch2/potlatch2/locales/sr-ec.swf
vendor/assets/potlatch2/potlatch2/locales/sv_SE.swf
vendor/assets/potlatch2/potlatch2/locales/ta.swf
vendor/assets/potlatch2/potlatch2/locales/te.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/tly.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/tr.swf
vendor/assets/potlatch2/potlatch2/locales/tyv.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/tzm.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/vo.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/yi.swf [new file with mode: 0644]
vendor/assets/potlatch2/potlatch2/locales/zh_CN.swf
vendor/assets/potlatch2/potlatch2/locales/zh_TW.swf [new file with mode: 0644]

index 837249e00a04b432e8b8577d1d5be5b21a149c44..edfd387abad0782b71b6af3401935aad2df2ef37 100644 (file)
@@ -7,3 +7,7 @@ tmp
 .DS_Store
 *~
 doc
+.vagrant
+.ruby-gemset
+.ruby-version
+.idea
\ No newline at end of file
index 8cae440bdd481c29563ca0974f44d2878064cb14..36c5586d852216ae5058a6cf5204c0958f25f431 100644 (file)
@@ -6,7 +6,17 @@ After [installing](INSTALL.md) this software, you may need to carry out some of
 
 Your installation comes with no geographic data loaded. You can either create new data using one of the editors (Potlatch 2, iD, JOSM etc) or by loading an OSM extract.
 
-* Use this [yet-to-be-written script](https://github.com/openstreetmap/openstreetmap-website/issues/282)
+After installing but before creating any users or data, import an extract with [Osmosis](http://wiki.openstreetmap.org/wiki/Osmosis) and the [``--write-apidb``](http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--write-apidb_.28--wd.29) task.
+
+```
+osmosis --read-pbf greater-london-latest.osm.pbf \
+  --write-apidb host="localhost" database="openstreetmap" \
+  user="openstreetmap" password="" validateSchemaVersion="no"
+```
+
+Loading an apidb database with Osmosis is about **twenty** times slower than loading the equivalent data with osm2pgsql into a rendering database. [``--log-progress``](http://wiki.openstreetmap.org/wiki/Osmosis/Detailed_Usage#--log-progress_.28--lp.29) may be desirable for status updates.
+
+To be able to edit the data you have loaded, you will need to use this [yet-to-be-written script](https://github.com/openstreetmap/openstreetmap-website/issues/282).
 
 ## Managing Users
 
@@ -115,3 +125,5 @@ If you want to deploy The Rails Port for production use, you'll need to make a f
 * Your production database will also need the extensions and functions installed - see [INSTALL.md](INSTALL.md)
 * The included version of the map call is quite slow and eats a lot of memory. You should consider using [CGIMap](https://github.com/zerebubuth/openstreetmap-cgimap) instead.
 * The included version of the GPX importer is slow and/or completely inoperable. You should consider using [the high-speed GPX importer](http://git.openstreetmap.org/gpx-import.git/).
+* Make sure you precompile the production assets: `RAILS_ENV=production rake assets:precompile`
+* Make sure the web server user as well as the rails user can read, write and create directories in `tmp/`.
diff --git a/Gemfile b/Gemfile
index d98a2a1fcc8f47975b9aa6c3916f5700a6c83802..fd8e46b9facaac318003176b766082ba5d739bd8 100644 (file)
--- a/Gemfile
+++ b/Gemfile
@@ -1,7 +1,7 @@
-source 'http://rubygems.org'
+source 'https://rubygems.org'
 
 # Require rails
-gem 'rails', '4.0.3'
+gem 'rails', '4.1.6'
 
 # Require things which have moved to gems in ruby 1.9
 gem 'bigdecimal', "~> 1.1.0", :platforms => :ruby_19
@@ -16,7 +16,7 @@ gem 'json'
 gem 'pg'
 
 # Use SCSS for stylesheets
-gem 'sass-rails', '~> 4.0.0'
+gem 'sass-rails', '~> 4.0.3'
 
 # Use Uglifier as compressor for JavaScript assets
 gem 'uglifier', '>= 1.3.0'
@@ -34,6 +34,9 @@ gem 'jsonify-rails'
 # Use R2 for RTL conversion
 gem 'r2'
 
+# Use autoprefixer to generate CSS prefixes
+gem 'autoprefixer-rails'
+
 # Load rails plugins
 gem 'rails-i18n', "~> 4.0.0"
 gem 'dynamic_form'
@@ -41,7 +44,7 @@ gem 'rinku', '>= 1.2.2', :require => 'rails_rinku'
 gem 'oauth-plugin', '>= 0.5.1'
 gem 'open_id_authentication', '>= 1.1.0'
 gem 'validates_email_format_of', '>= 1.5.1'
-gem 'composite_primary_keys', '>= 6.0.1'
+gem 'composite_primary_keys', '~> 7.0.11'
 gem 'http_accept_language', '~> 2.0.0'
 gem 'paperclip', '~> 4.0'
 gem 'deadlock_retry', '>= 1.2.0'
@@ -84,7 +87,7 @@ end
 # Gems needed for running tests
 group :test do
   gem 'timecop'
-  gem 'minitest', '~> 4.7.0', :platforms => [:ruby_19, :ruby_20]
+  gem 'minitest', '~> 5.1', :platforms => [:ruby_19, :ruby_20]
 end
 
 # Needed in development as well so rake can see konacha tasks
index d477fcfca672953b3b2b25613618b493fc9cc057..48d6013bf938ca071a3f96c3bd8adf7c20b3b8b6 100644 (file)
@@ -1,38 +1,41 @@
 GEM
-  remote: http://rubygems.org/
+  remote: https://rubygems.org/
   specs:
     SystemTimer (1.2.3)
-    actionmailer (4.0.3)
-      actionpack (= 4.0.3)
-      mail (~> 2.5.4)
-    actionpack (4.0.3)
-      activesupport (= 4.0.3)
-      builder (~> 3.1.0)
-      erubis (~> 2.7.0)
+    actionmailer (4.1.6)
+      actionpack (= 4.1.6)
+      actionview (= 4.1.6)
+      mail (~> 2.5, >= 2.5.4)
+    actionpack (4.1.6)
+      actionview (= 4.1.6)
+      activesupport (= 4.1.6)
       rack (~> 1.5.2)
       rack-test (~> 0.6.2)
     actionpack-page_caching (1.0.2)
       actionpack (>= 4.0.0, < 5)
-    activemodel (4.0.3)
-      activesupport (= 4.0.3)
-      builder (~> 3.1.0)
-    activerecord (4.0.3)
-      activemodel (= 4.0.3)
-      activerecord-deprecated_finders (~> 1.0.2)
-      activesupport (= 4.0.3)
-      arel (~> 4.0.0)
-    activerecord-deprecated_finders (1.0.3)
-    activesupport (4.0.3)
-      i18n (~> 0.6, >= 0.6.4)
-      minitest (~> 4.2)
-      multi_json (~> 1.3)
+    actionview (4.1.6)
+      activesupport (= 4.1.6)
+      builder (~> 3.1)
+      erubis (~> 2.7.0)
+    activemodel (4.1.6)
+      activesupport (= 4.1.6)
+      builder (~> 3.1)
+    activerecord (4.1.6)
+      activemodel (= 4.1.6)
+      activesupport (= 4.1.6)
+      arel (~> 5.0.0)
+    activesupport (4.1.6)
+      i18n (~> 0.6, >= 0.6.9)
+      json (~> 1.7, >= 1.7.7)
+      minitest (~> 5.1)
       thread_safe (~> 0.1)
-      tzinfo (~> 0.3.37)
-    arel (4.0.2)
-    atomic (1.1.15)
+      tzinfo (~> 1.1)
+    arel (5.0.1.20140414130214)
+    autoprefixer-rails (3.1.1.20141001)
+      execjs
     bigdecimal (1.1.0)
-    builder (3.1.4)
-    capybara (2.2.1)
+    builder (3.2.2)
+    capybara (2.4.3)
       mime-types (>= 1.16)
       nokogiri (>= 1.3.3)
       rack (>= 1.0.0)
@@ -41,32 +44,33 @@ GEM
     climate_control (0.0.3)
       activesupport (>= 3.0)
     cliver (0.3.2)
-    cocaine (0.5.3)
+    cocaine (0.5.4)
       climate_control (>= 0.0.3, < 1.0)
     coffee-rails (4.0.1)
       coffee-script (>= 2.2.0)
       railties (>= 4.0.0, < 5.0)
-    coffee-script (2.2.0)
+    coffee-script (2.3.0)
       coffee-script-source
       execjs
-    coffee-script-source (1.7.0)
-    colorize (0.6.0)
-    composite_primary_keys (6.0.1)
-      activerecord (>= 4.0.0)
-    dalli (2.7.0)
+    coffee-script-source (1.8.0)
+    colorize (0.7.3)
+    composite_primary_keys (7.0.11)
+      activerecord (= 4.1.6)
+    crass (0.2.1)
+    dalli (2.7.2)
     deadlock_retry (1.2.0)
     dynamic_form (1.1.4)
     erubis (2.7.0)
-    execjs (2.0.2)
+    execjs (2.2.1)
     faraday (0.9.0)
       multipart-post (>= 1.2, < 3)
     hike (1.2.3)
-    htmlentities (4.3.1)
-    http_accept_language (2.0.1)
-    httpclient (2.3.4.1)
-    i18n (0.6.9)
+    htmlentities (4.3.2)
+    http_accept_language (2.0.2)
+    httpclient (2.4.0)
+    i18n (0.6.11)
     iconv (0.1)
-    jquery-rails (3.1.0)
+    jquery-rails (3.1.2)
       railties (>= 3.0, < 5.0)
       thor (>= 0.14, < 2.0)
     json (1.8.1)
@@ -75,36 +79,36 @@ GEM
     jsonify-rails (0.3.2)
       actionpack
       jsonify (< 0.4.0)
-    jwt (0.1.11)
-      multi_json (>= 1.5)
+    jwt (1.0.0)
     kgio (2.9.2)
-    konacha (3.1.0)
+    konacha (3.2.4)
       actionpack (>= 3.1, < 5)
       capybara
       colorize
       railties (>= 3.1, < 5)
       sprockets
     libxml-ruby (2.7.0)
-    mail (2.5.4)
-      mime-types (~> 1.16)
-      treetop (~> 1.4.8)
-    mime-types (1.25.1)
-    mini_portile (0.5.2)
-    minitest (4.7.5)
-    multi_json (1.8.4)
+    mail (2.6.1)
+      mime-types (>= 1.16, < 3)
+    mime-types (2.4.1)
+    mini_portile (0.6.0)
+    minitest (5.4.2)
+    multi_json (1.10.1)
     multi_xml (0.5.5)
     multipart-post (2.0.0)
-    nokogiri (1.6.1)
-      mini_portile (~> 0.5.0)
+    nokogiri (1.6.3.1)
+      mini_portile (= 0.6.0)
+    nokogumbo (1.1.12)
+      nokogiri
     oauth (0.4.7)
     oauth-plugin (0.5.1)
       multi_json
       oauth (~> 0.4.4)
       oauth2 (>= 0.5.0)
       rack
-    oauth2 (0.9.3)
+    oauth2 (1.0.0)
       faraday (>= 0.8, < 0.10)
-      jwt (~> 0.1.8)
+      jwt (~> 1.0)
       multi_json (~> 1.3)
       multi_xml (~> 0.5)
       rack (~> 1.2)
@@ -112,20 +116,19 @@ GEM
       rack-openid (~> 1.3)
     openstreetmap-i18n-js (3.0.0.rc5.3)
       i18n
-    paperclip (4.1.1)
+    paperclip (4.2.0)
       activemodel (>= 3.0.0)
       activesupport (>= 3.0.0)
       cocaine (~> 0.5.3)
       mime-types
     pg (0.17.1)
-    poltergeist (1.5.0)
+    poltergeist (1.5.1)
       capybara (~> 2.1)
       cliver (~> 0.3.1)
       multi_json (~> 1.0)
       websocket-driver (>= 0.2.0)
-    polyglot (0.3.4)
-    psych (2.0.4)
-    r2 (0.2.2)
+    psych (2.0.6)
+    r2 (0.2.5)
     rack (1.5.2)
     rack-cors (0.2.9)
     rack-openid (1.4.2)
@@ -133,58 +136,61 @@ GEM
       ruby-openid (>= 2.1.8)
     rack-test (0.6.2)
       rack (>= 1.0)
-    rails (4.0.3)
-      actionmailer (= 4.0.3)
-      actionpack (= 4.0.3)
-      activerecord (= 4.0.3)
-      activesupport (= 4.0.3)
+    rails (4.1.6)
+      actionmailer (= 4.1.6)
+      actionpack (= 4.1.6)
+      actionview (= 4.1.6)
+      activemodel (= 4.1.6)
+      activerecord (= 4.1.6)
+      activesupport (= 4.1.6)
       bundler (>= 1.3.0, < 2.0)
-      railties (= 4.0.3)
-      sprockets-rails (~> 2.0.0)
-    rails-i18n (4.0.1)
+      railties (= 4.1.6)
+      sprockets-rails (~> 2.0)
+    rails-i18n (4.0.3)
       i18n (~> 0.6)
-      rails (~> 4.0)
-    railties (4.0.3)
-      actionpack (= 4.0.3)
-      activesupport (= 4.0.3)
+      railties (~> 4.0)
+    railties (4.1.6)
+      actionpack (= 4.1.6)
+      activesupport (= 4.1.6)
       rake (>= 0.8.7)
       thor (>= 0.18.1, < 2.0)
-    rake (10.1.1)
-    redcarpet (3.1.1)
+    rake (10.3.2)
+    redcarpet (3.1.2)
     rinku (1.7.3)
     ruby-openid (2.5.0)
-    sanitize (2.1.0)
+    sanitize (3.0.2)
+      crass (~> 0.2.0)
       nokogiri (>= 1.4.4)
-    sass (3.2.14)
-    sass-rails (4.0.1)
+      nokogumbo (= 1.1.12)
+    sass (3.2.19)
+    sass-rails (4.0.3)
       railties (>= 4.0.0, < 5.0)
-      sass (>= 3.1.10)
-      sprockets-rails (~> 2.0.0)
+      sass (~> 3.2.0)
+      sprockets (~> 2.8, <= 2.11.0)
+      sprockets-rails (~> 2.0)
     soap4r-ruby1.9 (2.0.5)
     sprockets (2.11.0)
       hike (~> 1.2)
       multi_json (~> 1.0)
       rack (~> 1.0)
       tilt (~> 1.1, != 1.3.0)
-    sprockets-rails (2.0.1)
+    sprockets-rails (2.1.4)
       actionpack (>= 3.0)
       activesupport (>= 3.0)
       sprockets (~> 2.8)
-    thor (0.18.1)
-    thread_safe (0.2.0)
-      atomic (>= 1.1.7, < 2)
+    thor (0.19.1)
+    thread_safe (0.3.4)
     tilt (1.4.1)
     timecop (0.7.1)
-    treetop (1.4.15)
-      polyglot
-      polyglot (>= 0.3.1)
-    tzinfo (0.3.38)
-    uglifier (2.4.0)
+    tzinfo (1.2.2)
+      thread_safe (~> 0.1)
+    uglifier (2.5.3)
       execjs (>= 0.3.0)
       json (>= 1.8.0)
-    validates_email_format_of (1.5.3)
-    vendorer (0.1.14)
-    websocket-driver (0.3.2)
+    validates_email_format_of (1.6.1)
+      i18n
+    vendorer (0.1.16)
+    websocket-driver (0.3.5)
     xpath (2.0.0)
       nokogiri (~> 1.3)
 
@@ -194,9 +200,10 @@ PLATFORMS
 DEPENDENCIES
   SystemTimer (>= 1.1.3)
   actionpack-page_caching
+  autoprefixer-rails
   bigdecimal (~> 1.1.0)
   coffee-rails (~> 4.0.0)
-  composite_primary_keys (>= 6.0.1)
+  composite_primary_keys (~> 7.0.11)
   dalli
   deadlock_retry (>= 1.2.0)
   dynamic_form
@@ -210,7 +217,7 @@ DEPENDENCIES
   kgio
   konacha
   libxml-ruby (>= 2.0.5)
-  minitest (~> 4.7.0)
+  minitest (~> 5.1)
   oauth-plugin (>= 0.5.1)
   open_id_authentication (>= 1.1.0)
   openstreetmap-i18n-js (>= 3.0.0.rc5.3)
@@ -220,13 +227,13 @@ DEPENDENCIES
   psych
   r2
   rack-cors
-  rails (= 4.0.3)
+  rails (= 4.1.6)
   rails-i18n (~> 4.0.0)
   redcarpet
   rinku (>= 1.2.2)
   ruby-openid (>= 2.2.0)
   sanitize
-  sass-rails (~> 4.0.0)
+  sass-rails (~> 4.0.3)
   soap4r-ruby1.9
   timecop
   uglifier (>= 1.3.0)
index 2f954d1060fc86a241945769a89d8222154b4632..780ffdf07057d4b644f4e216cd4028dc66b418b9 100644 (file)
@@ -3,11 +3,12 @@
 These instructions are designed for setting up The Rails Port for development and testing.
 If you want to deploy the software for your own project, then see the notes at the end.
 
+You can install the software directly on your machine, which is the traditional and probably best-bupported approach. However, there is an alternative which may be easier: Vagrant. This installs the software into a virtual machine, which makes it easier to get a consistent development environment and may avoid installation difficulties. For Vagrant instructions, see [VAGRANT.md](VAGRANT.md).
+
 These instructions are based on Ubuntu 12.04 LTS, which is the platform used by the OSMF servers.
 The instructions also work, with only minor amendments, for all other current Ubuntu releases, Fedora and MacOSX
 
-We don't recommend attempting to develop or deploy this software on Windows. If you need to use Windows, then
-try developing this sofware using Ubuntu in a virtual machine.
+We don't recommend attempting to develop or deploy this software on Windows. If you need to use Windows, then try developing this sofware using Ubuntu in a virtual machine, or use [Vagrant](VAGRANT.md).
 
 ## Dependencies
 
@@ -32,7 +33,7 @@ sudo apt-get install ruby1.9.1 libruby1.9.1 ruby1.9.1-dev ri1.9.1 \
                      apache2 apache2-threaded-dev build-essential git-core \
                      postgresql postgresql-contrib libpq-dev postgresql-server-dev-all \
                      libsasl2-dev
-gem1.9.1 install bundle
+sudo gem1.9.1 install bundler
 ```
 
 Note that the "1.9.1" Ubuntu packages do in fact contain ruby 1.9.3.
diff --git a/VAGRANT.md b/VAGRANT.md
new file mode 100644 (file)
index 0000000..0155a33
--- /dev/null
@@ -0,0 +1,46 @@
+# Installing Vagrant
+
+On Ubuntu, it should be as simple as:
+
+```
+sudo apt-get install vagrant
+```
+
+Other Linux distributions should have similar installation instructions using `yum` or similar.
+
+Installers are available for Mac OS X and Windows, please see the [Vagrant project download page](http://www.vagrantup.com/downloads) for more information.
+
+# Setting up openstreetmap-website
+
+Once Vagrant has been installed, you can start an environment by checking out the openstreetmap-website code if you haven't already, then changing to the directory which contains the Vagrantfile by typing:
+
+```
+git clone git@github.com:openstreetmap/openstreetmap-website.git
+cd openstreetmap-website
+vagrant up
+```
+
+This will take a few minutes to download required software from the internet and set it up as a running system. Once it is complete, you should be able to log into the running VM by typing:
+
+```
+vagrant ssh
+```
+
+Within this login shell, you can do development, run the server or the tests. For example, to run the tests:
+
+```
+cd /srv/openstreetmap-website/
+rake test
+```
+
+To access the web pages you run the following commands then access the site in your [local browser](http://localhost:3000):
+
+```
+vagrant ssh
+cd /srv/openstreetmap-website/
+rails server
+```
+
+You edit the code on your computer using the code editor you are used to using, then through shared folders the code is updated on the VM instantly.
+
+You should run the tests before submitting any patch or Pull Request back to the original repository. Please see [CONTRIBUTING.md](CONTRIBUTING.md) for more information.
diff --git a/Vagrantfile b/Vagrantfile
new file mode 100644 (file)
index 0000000..5489192
--- /dev/null
@@ -0,0 +1,16 @@
+# -*- mode: ruby -*-
+# vi: set ft=ruby :
+
+Vagrant.configure("2") do |config|
+  config.vm.box = "precise64"
+  config.vm.box_url = "http://files.vagrantup.com/precise64.box"
+  
+  # port forward for webrick on 3000
+  config.vm.network :forwarded_port, guest: 3000, host: 3000
+
+  # set up synced folder to source in /srv/openstreetmap-website
+  config.vm.synced_folder ".", "/srv/openstreetmap-website"
+
+  # provision using a simple shell script
+  config.vm.provision :shell, :path => "script/vagrant/setup/provision.sh"
+end
index 0cca4055cba08b5533eac5ae98483322cdd77fa1..c2267a6d8a41aac7133c256a3b85f4b20e45fcc5 100644 (file)
@@ -11,13 +11,13 @@ folder 'vendor/assets' do
   end
 
   folder 'leaflet' do
-    file 'leaflet.js', 'http://cdn.leafletjs.com/leaflet-0.7.2/leaflet-src.js'
-    file 'leaflet.css', 'http://cdn.leafletjs.com/leaflet-0.7.2/leaflet.css'
+    file 'leaflet.js', 'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet-src.js'
+    file 'leaflet.css', 'http://cdn.leafletjs.com/leaflet-0.7.3/leaflet.css'
 
     [ 'layers.png', 'layers-2x.png',
       'marker-icon.png', 'marker-icon-2x.png',
       'marker-shadow.png' ].each do |image|
-      file "images/#{image}", "http://cdn.leafletjs.com/leaflet-0.7.2/images/#{image}"
+      file "images/#{image}", "http://cdn.leafletjs.com/leaflet-0.7.3/images/#{image}"
     end
 
     from 'git://github.com/kajic/leaflet-locationfilter.git' do
diff --git a/app/assets/images/browse/caravan_park.n.16.png b/app/assets/images/browse/caravan_park.n.16.png
new file mode 100644 (file)
index 0000000..a4b35a4
Binary files /dev/null and b/app/assets/images/browse/caravan_park.n.16.png differ
diff --git a/app/assets/images/browse/caravan_park.p.24.png b/app/assets/images/browse/caravan_park.p.24.png
deleted file mode 100644 (file)
index 751f520..0000000
Binary files a/app/assets/images/browse/caravan_park.p.24.png and /dev/null differ
index 5860900cf5877b98ec27ab119ba7fa626464f076..51660458a6dff36ccfaa68ff126ca7d4b923b92b 100644 (file)
Binary files a/app/assets/images/browse/parking.p.16.png and b/app/assets/images/browse/parking.p.16.png differ
diff --git a/app/assets/images/sotm.png b/app/assets/images/sotm.png
new file mode 100644 (file)
index 0000000..3df0287
Binary files /dev/null and b/app/assets/images/sotm.png differ
index 6ac398fc591687410467ee4cf15c7be9f3bd5c3a..09ae367f40eb2067e939260b79c21f0a72a08d51 100644 (file)
@@ -22,19 +22,22 @@ var querystring = require('querystring-component');
 
 function remoteEditHandler(bbox, object) {
   var loaded = false,
-      query = {
-          left: bbox.getWest() - 0.0001,
-          top: bbox.getNorth() + 0.0001,
-          right: bbox.getEast() + 0.0001,
-          bottom: bbox.getSouth() - 0.0001
-      };
+    url = document.location.protocol === "https:" ?
+            "https://127.0.0.1:8112/load_and_zoom?" :
+            "http://127.0.0.1:8111/load_and_zoom?",
+    query = {
+        left: bbox.getWest() - 0.0001,
+        top: bbox.getNorth() + 0.0001,
+        right: bbox.getEast() + 0.0001,
+        bottom: bbox.getSouth() - 0.0001
+    };
 
   if (object) query.select = object.type + object.id;
 
   var iframe = $('<iframe>')
     .hide()
     .appendTo('body')
-    .attr("src", "http://127.0.0.1:8111/load_and_zoom?" + querystring.stringify(query))
+    .attr("src", url + querystring.stringify(query))
     .on('load', function() {
       $(this).remove();
       loaded = true;
index 1c0812485100b6100c8a5be5b5eef1e065a3f6f8..b89d6c71d55cf9e56b5d53a40fc788c5803e7d67 100644 (file)
@@ -14,6 +14,7 @@
 //= require index/note
 //= require index/new_note
 //= require index/directions
+//= require index/changeset
 //= require router
 
 $(document).ready(function () {
@@ -156,6 +157,15 @@ $(document).ready(function () {
     $.cookie("_osm_location", OSM.locationCookie(map), { expires: expiry, path: "/" });
   });
 
+  if ($.cookie('_osm_sotm') == 'hide') {
+    $('#sotm').hide();
+  }
+
+  $('#sotm .close').on('click', function() {
+    $('#sotm').hide();
+    $.cookie("_osm_sotm", 'hide', { expires: expiry });
+  });
+
   if ($.cookie('_osm_welcome') == 'hide') {
     $('.welcome').hide();
   }
@@ -252,10 +262,11 @@ $(document).ready(function () {
 
     function addObject(type, id, center) {
       var bounds = map.addObject({type: type, id: parseInt(id)}, function(bounds) {
-        if (!window.location.hash && bounds.isValid()) {
-          OSM.router.moveListenerOff();
-          map.once('moveend', OSM.router.moveListenerOn);
-          if (center || !map.getBounds().contains(bounds)) map.fitBounds(bounds);
+        if (!window.location.hash && bounds.isValid() &&
+            (center || !map.getBounds().contains(bounds))) {
+          OSM.router.withoutMoveListener(function () {
+            map.fitBounds(bounds);
+          });
         }
       });
     }
@@ -283,7 +294,7 @@ $(document).ready(function () {
     "/node/:id(/history)":         OSM.Browse(map, 'node'),
     "/way/:id(/history)":          OSM.Browse(map, 'way'),
     "/relation/:id(/history)":     OSM.Browse(map, 'relation'),
-    "/changeset/:id":              OSM.Browse(map, 'changeset')
+    "/changeset/:id":              OSM.Changeset(map)
   });
 
   if (OSM.preferred_editor == "remote" && document.location.pathname == "/edit") {
@@ -308,4 +319,24 @@ $(document).ready(function () {
     if (OSM.router.route(this.pathname + this.search + this.hash))
       e.preventDefault();
   });
+
+  $(".search_form").on("submit", function(e) {
+    e.preventDefault();
+    $("header").addClass("closed");
+    var query = $(this).find("input[name=query]").val();
+    if (query) {
+      OSM.router.route("/search?query=" + encodeURIComponent(query) + OSM.formatHash(map));
+    } else {
+      OSM.router.route("/");
+    }
+  });
+
+  $(".describe_location").on("click", function(e) {
+    e.preventDefault();
+    var center = map.getCenter().wrap(),
+      precision = OSM.zoomPrecision(map.getZoom());
+    OSM.router.route("/search?query=" + encodeURIComponent(
+      center.lat.toFixed(precision) + "," + center.lng.toFixed(precision)
+    ));
+  });
 });
diff --git a/app/assets/javascripts/index/changeset.js b/app/assets/javascripts/index/changeset.js
new file mode 100644 (file)
index 0000000..57d98dc
--- /dev/null
@@ -0,0 +1,80 @@
+OSM.Changeset = function (map) {
+  var page = {},
+    content = $('#sidebar_content'),
+    currentChangesetId;
+
+  page.pushstate = page.popstate = function(path, id) {
+    OSM.loadSidebarContent(path, function() {
+      page.load(path, id);
+    });
+  };
+
+  page.load = function(path, id) {
+    if(id)
+      currentChangesetId = id;
+    initialize();
+    addChangeset(currentChangesetId, true);
+  };
+
+  function addChangeset(id, center) {
+    var bounds = map.addObject({type: 'changeset', id: parseInt(id)}, function(bounds) {
+      if (!window.location.hash && bounds.isValid() &&
+          (center || !map.getBounds().contains(bounds))) {
+        OSM.router.withoutMoveListener(function () {
+          map.fitBounds(bounds);
+        });
+      }
+    });
+  }
+
+  function updateChangeset(form, method, url, include_data) {
+    $(form).find("input[type=submit]").prop("disabled", true);
+    if(include_data) {
+      data = {text: $(form.text).val()};
+    } else {
+      data = {};
+    }
+
+    $.ajax({
+      url: url,
+      type: method,
+      oauth: true,
+      data: data,
+      success: function () {
+        OSM.loadSidebarContent(window.location.pathname, page.load);
+      }
+    });
+  }
+
+  function initialize() {
+    content.find("input[name=comment]").on("click", function (e) {
+      e.preventDefault();
+      var data = $(e.target).data();
+      updateChangeset(e.target.form, data.method, data.url, true);
+    });
+
+    content.find(".action-button").on("click", function (e) {
+      e.preventDefault();
+      var data = $(e.target).data();
+      updateChangeset(e.target.form, data.method, data.url);
+    });
+
+    content.find("textarea").on("input", function (e) {
+      var form = e.target.form;
+
+      if ($(e.target).val() == "") {
+        $(form.comment).prop("disabled", true);
+      } else {
+        $(form.comment).prop("disabled", false);
+      }
+    });
+
+    content.find("textarea").val('').trigger("input");
+  };
+
+  page.unload = function() {
+    map.removeObject();
+  };
+
+  return page;
+};
\ No newline at end of file
index 6e6867e5b5a15f5139f8b7ac5cac1d3ea3fa7af4..1efac1b31baf6ea1f007a4d6b32da847677a918a 100644 (file)
@@ -53,6 +53,10 @@ OSM.Export = function(map) {
     $("#export_commit").toggle(getBounds().getSize() < OSM.MAX_REQUEST_AREA);
   }
 
+  function checkSubmit(e) {
+    if (getBounds().getSize() > OSM.MAX_REQUEST_AREA) e.preventDefault();
+  }
+
   page.pushstate = page.popstate = function(path) {
     $("#export_tab").addClass("current");
     OSM.loadSidebarContent(path, page.load);
@@ -65,7 +69,7 @@ OSM.Export = function(map) {
 
     $("#maxlat, #minlon, #maxlon, #minlat").change(boundsChanged);
     $("#drag_box").click(enableFilter);
-    $("#sidebar_content .close").on("click", page.minimizeSidebar);
+    $(".export_form").on("submit", checkSubmit);
 
     update();
     return map.getState();
index 8103f047ed5d054e29c0a65fb27c2654150a965b..cb1f6f8d576012680ee051dddc4a222194d98397 100644 (file)
@@ -11,10 +11,15 @@ OSM.History = function(map) {
     .on("mouseout", "[data-changeset]", function () {
       unHighlightChangeset($(this).data("changeset").id);
     })
-    .on("click", "[data-changeset]", function (e) {
-      if (!$(e.target).is('a')) {
-        clickChangeset($(this).data("changeset").id, e);
-      }
+    .on("mousedown", "[data-changeset]", function () {
+      var moved = false;
+      $(this).one("click", function (e) {
+        if (!moved && !$(e.target).is('a')) {
+          clickChangeset($(this).data("changeset").id, e);
+        }
+      }).one("mousemove", function () {
+        moved = true;
+      });
     });
 
   var group = L.featureGroup()
index 18000deb05ab2ea4e963f8e7e3b1a9e6ff9db953..2c9e42210008bf6b1653d5d530233d114090e51e 100644 (file)
@@ -101,9 +101,9 @@ OSM.Note = function (map) {
       latLng = L.latLng(data.coordinates.split(','));
 
     if (!window.location.hash || window.location.hash.match(/^#?c[0-9]+$/)) {
-      OSM.router.moveListenerOff();
-      map.once('moveend', OSM.router.moveListenerOn);
-      map.setView(latLng, 15, {reset: true});
+      OSM.router.withoutMoveListener(function () {
+        map.setView(latLng, 15, {reset: true});
+      });
     }
   }
 
index 841ae1f7bdf652096e80399782474513deb1d880..4e45cbe05238b092f88559e930fc9d01f28bb73f 100644 (file)
@@ -34,7 +34,9 @@ function initializeNotes(map) {
   });
 
   noteLayer.on('click', function(e) {
-    OSM.router.route('/note/' + e.layer.id);
+    if (e.layer.id) {
+      OSM.router.route('/note/' + e.layer.id);
+    }
   });
 
   function updateMarker(marker, feature) {
index 7fb8edbb0005f25cfa2532b7abcfb7d2b65839a9..46f756f3bc017275fb0c1a51b112d54c65d0aea7 100644 (file)
@@ -1,3 +1,5 @@
+//= require jquery.simulate
+
 OSM.Search = function(map) {
   $(".search_form input[name=query]").on("input", function(e) {
     if ($(e.target).val() == "") {
@@ -28,7 +30,19 @@ OSM.Search = function(map) {
 
   $("#sidebar_content")
     .on("click", ".search_more a", clickSearchMore)
-    .on("click", ".search_results_entry a.set_position", clickSearchResult);
+    .on("click", ".search_results_entry a.set_position", clickSearchResult)
+    .on("mouseover", "p.search_results_entry:has(a.set_position)", showSearchResult)
+    .on("mouseout", "p.search_results_entry:has(a.set_position)", hideSearchResult)
+    .on("mousedown", "p.search_results_entry:has(a.set_position)", function () {
+      var moved = false;
+      $(this).one("click", function (e) {
+        if (!moved && !$(e.target).is('a')) {
+          $(this).find("a.set_position").simulate("click", e);
+        }
+      }).one("mousemove", function () {
+        moved = true;
+      });
+    });
 
   function clickSearchMore(e) {
     e.preventDefault();
@@ -44,6 +58,32 @@ OSM.Search = function(map) {
     });
   }
 
+  function showSearchResult(e) {
+    var marker = $(this).data("marker");
+
+    if (!marker) {
+      var data = $(this).find("a.set_position").data();
+
+      marker = L.marker([data.lat, data.lon], {icon: getUserIcon()});
+
+      $(this).data("marker", marker);
+    }
+
+    markers.addLayer(marker);
+
+    $(this).closest("li").addClass("selected");
+  }
+
+  function hideSearchResult(e) {
+    var marker = $(this).data("marker");
+
+    if (marker) {
+      markers.removeLayer(marker);
+    }
+
+    $(this).closest("li").removeClass("selected");
+  }
+
   function clickSearchResult(e) {
     var data = $(this).data(),
       center = L.latLng(data.lat, data.lon);
@@ -57,13 +97,11 @@ OSM.Search = function(map) {
     // Let clicks to object browser links propagate.
     if (data.type && data.id) return;
 
-    marker.setLatLng(center).addTo(map);
-
     e.preventDefault();
     e.stopPropagation();
   }
 
-  var marker = L.marker([0, 0], {icon: getUserIcon()});
+  var markers = L.layerGroup().addTo(map);
 
   var page = {};
 
@@ -96,8 +134,7 @@ OSM.Search = function(map) {
   };
 
   page.unload = function() {
-    map.removeLayer(marker);
-    map.removeObject();
+    markers.clearLayers();
     $(".search_form input[name=query]").val("");
     $(".describe_location").fadeIn(100);
   };
index 6f7d7754fd360887debbe5c2b230d3ba61295d7d..14cddafce7ca6001026981991d8df91df8702e1e 100644 (file)
@@ -24,13 +24,13 @@ L.OSM.Map = L.Map.extend({
         name: I18n.t("javascripts.map.base.standard")
       }),
       new L.OSM.CycleMap({
-        attribution: copyright + ". Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
+        attribution: copyright + ". Tiles courtesy of <a href='http://www.thunderforest.com/' target='_blank'>Andy Allan</a>",
         code: "C",
         keyid: "cyclemap",
         name: I18n.t("javascripts.map.base.cycle_map")
       }),
       new L.OSM.TransportMap({
-        attribution: copyright + ". Tiles courtesy of <a href='http://www.opencyclemap.org/' target='_blank'>Andy Allan</a>",
+        attribution: copyright + ". Tiles courtesy of <a href='http://www.thunderforest.com/' target='_blank'>Andy Allan</a>",
         code: "T",
         keyid: "transportmap",
         name: I18n.t("javascripts.map.base.transport_map")
@@ -241,7 +241,7 @@ L.OSM.Map = L.Map.extend({
 
   setState: function(state, options) {
     if (state.center) this.setView(state.center, state.zoom, options);
-    this.updateLayers(state.layers);
+    if (state.layers) this.updateLayers(state.layers);
   },
 
   setSidebarOverlaid: function(overlaid) {
@@ -263,8 +263,7 @@ L.Icon.Default.imagePath = "/images";
 L.Icon.Default.imageUrls = {
   "/images/marker-icon.png": "<%= asset_path("images/marker-icon.png") %>",
   "/images/marker-icon-2x.png": "<%= asset_path("images/marker-icon-2x.png") %>",
-  "/images/marker-shadow.png": "<%= asset_path("images/marker-shadow.png") %>",
-  "/images/marker-shadow-2x.png": "<%= asset_path("images/marker-shadow-2x.png") %>"
+  "/images/marker-shadow.png": "<%= asset_path("images/marker-shadow.png") %>"
 };
 
 L.extend(L.Icon.Default.prototype, {
index a05ed5a9d2474bf2136669936c1b21cde825de28..c3f13f9dffc1afc78aff160071b5657184b742e0 100644 (file)
@@ -42,8 +42,9 @@
    OSM.Router also handles updating the hash portion of the URL containing transient
    map state such as the position and zoom level. Some route controllers may wish to
    temporarily suppress updating the hash (for example, to omit the hash on pages
-   such as `/way/1234` unless the map is moved). This can be done by calling
-   `OSM.router.moveListenerOff` and `OSM.router.moveListenerOn`.
+   such as `/way/1234` unless the map is moved). This can be done by using
+   `OSM.router.withoutMoveListener` to run a block of code that may update
+   move the map without the hash changing.
  */
 OSM.Router = function(map, rts) {
   var escapeRegExp  = /[\-{}\[\]+?.,\\\^$|#\s]/g;
@@ -114,7 +115,9 @@ OSM.Router = function(map, rts) {
         route = routes.recognize(path);
       if (!route) return false;
       currentRoute.run('unload');
-      window.history.pushState(OSM.parseHash(url), document.title, url);
+      var state = OSM.parseHash(url);
+      map.setState(state);
+      window.history.pushState(state, document.title, url);
       currentPath = path;
       currentRoute = route;
       currentRoute.run('pushstate', currentPath);
@@ -158,12 +161,17 @@ OSM.Router = function(map, rts) {
     router.stateChange(state, hash);
   };
 
-  router.moveListenerOn = function() {
-    map.on('moveend', router.updateHash);
-  };
+  router.withoutMoveListener = function (callback) {
+    function disableMoveListener() {
+      map.off('moveend', router.updateHash);
+      map.once('moveend', function () {
+        map.on('moveend', router.updateHash);
+      });
+    }
 
-  router.moveListenerOff = function() {
-    map.off('moveend', router.updateHash);
+    map.once('movestart', disableMoveListener);
+    callback();
+    map.off('movestart', disableMoveListener);
   };
 
   router.load = function() {
index b552ce850cc13d27464ea82beec1668e40b5f3ac..aa729640eadabf7b2e61ca06a528f38a94d6f48a 100644 (file)
@@ -87,9 +87,7 @@ strong {
 /* Default rules for the body of every page */
 
 * {
-  -webkit-box-sizing: border-box;
-     -moz-box-sizing: border-box;
-          box-sizing: border-box;
+  box-sizing: border-box;
 }
 
 body {
@@ -464,9 +462,8 @@ nav.secondary {
 
 #noscript {
   z-index: 20000000;
-  position: absolute;
-  top: 15px;
-  left: 15px;
+  margin-left: 400px;
+  margin-top: 50px;
 }
 
 /* Rules for bootstrap tooltips */
@@ -846,7 +843,6 @@ nav.secondary {
 
 .leaflet-popup-content-wrapper {
   border-radius: 4px !important;
-  -webkit-border-radius: 4px !important;
 }
 
 /* Rules for attribution text under the main map shown on printouts */
@@ -929,8 +925,6 @@ header .search_forms,
     border-right: none;
 
     transition: 300ms linear;
-    -webkit-transition: 300ms linear;
-    -moz-transition: 300ms linear;
   }
 
   input:focus {
@@ -970,7 +964,9 @@ header .search_forms,
 .search_results_entry {
   ul li {
     border-bottom: $keyline;
+    cursor: pointer;
     &:first-child { border-top: $keyline; }
+    &.selected { background: #FFFFE6; }
   }
 
   .search_details {
@@ -1151,7 +1147,7 @@ tr.turn:hover {
     font-size: 90%;
   }
 
-  .note-comments li {
+  .note-comments li, .changeset-comments li {
     margin: $lineheight/2 0;
 
     p {
@@ -1159,6 +1155,27 @@ tr.turn:hover {
     }
   }
 
+  .comments-header {
+    float: left;
+  }
+
+  .subscribe-buttons {
+    float: left;
+    margin: 18px 10px 10px;
+    min-width: 80px;
+  }
+
+  .subscribe-buttons input {
+    font-size: 90%;
+    line-height: 15px;
+    min-height: 20px;
+  }
+
+  span.action-button:hover {
+    cursor: pointer;
+    text-decoration: underline;
+  }
+
   .note-description {
     overflow: hidden;
     margin: 0 0 10px 10px;
@@ -1372,6 +1389,30 @@ tr.turn:hover {
   }
 }
 
+/* Rules for the new trace form */
+
+#new_trace {
+  input[type=text] {
+    width: 50%;
+    width: calc(100% - 150px);
+    max-width: 500px;
+  }
+}
+
+/* Rules for the edit trace form */
+
+.edit_trace {
+  .form-row p {
+    margin-bottom: 0px;
+  }
+
+  input[type=text] {
+    width: 50%;
+    width: calc(100% - 150px);
+    max-width: 500px;
+  }
+}
+
 /* Rules for the user profile page */
 
 #userinformation {
@@ -1954,7 +1995,6 @@ a.button {
   cursor: pointer;
   border: 0;
   display: inline-block;
-  line-height: 20px;
   padding: $lineheight/4 $lineheight/2;
   min-height: 20px + $lineheight/2;
   min-width: 120px;
@@ -1963,7 +2003,6 @@ a.button {
   background: $blue;
   text-align: center;
   border-radius: 2px;
-  -moz-border-radius: 2px;
   &:hover {
     background: darken($blue, $hovercolor);
     text-decoration: none;
@@ -1985,6 +2024,16 @@ a.button {
   }
 }
 
+input[type="button"],
+input[type="submit"],
+input[type="reset"] {
+  line-height: normal;
+}
+
+a.button {
+  line-height: 20px;
+}
+
 .buttons {
   min-width: 200px;
   input[type="submit"],
@@ -2132,8 +2181,6 @@ a.button {
 
 input.richtext_title[type="text"] {
   width: 50%;
-  width: -moz-calc(100% - 235px);
-  width: -webkit-calc(100% - 235px);
   width: calc(100% - 235px);
 
   @media only screen and (max-width:768px) {
@@ -2146,8 +2193,6 @@ input.richtext_title[type="text"] {
 
   .richtext_content {
     width: 50%;
-    width: -moz-calc(100% - 235px);
-    width: -webkit-calc(100% - 235px);
     width: calc(100% - 235px);
     display: inline-block;
     vertical-align: top;
@@ -2282,12 +2327,8 @@ input.richtext_title[type="text"] {
   border-radius: 0 3px 3px;
   *border-right-width: 2px;
   *border-bottom-width: 2px;
-  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-     -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
-  -webkit-background-clip: padding-box;
-     -moz-background-clip: padding;
-          background-clip: padding-box;
+  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
+  background-clip: padding-box;
 }
 
 .dropdown-menu.pull-right {
@@ -2452,13 +2493,6 @@ input.richtext_title[type="text"] {
   background-size: cover;
   background-attachment: fixed;
 
-  &.photo-0 { background-image: image-url('about/0.jpg'); .photo-0 { display: block; } }
-  &.photo-1 { background-image: image-url('about/1.jpg'); .photo-1 { display: block; } }
-  &.photo-2 { background-image: image-url('about/2.jpg'); .photo-2 { display: block; } }
-  &.photo-3 { background-image: image-url('about/4.jpg'); .photo-3 { display: block; } }
-  &.photo-4 { background-image: image-url('about/4.jpg'); .photo-4 { display: block; } }
-  &.photo-5 { background-image: image-url('about/5.jpg'); .photo-5 { display: block; } }
-
   .caption {
     max-width: 200px;
     font: 13px/20px Helvetica, Arial, sans-serif;
@@ -2584,6 +2618,36 @@ input.richtext_title[type="text"] {
   }
 }
 
+#sidebar #sotm {
+  padding: 10px;
+  min-height: 120px;
+
+  img {
+    float: left;
+    width: 100px;
+    height: 100px;
+  }
+
+  h2 {
+    margin-left: 100px;
+    padding: 7px 10px 6px 15px;
+  }
+
+  p {
+    margin-left: 100px;
+    padding: 6px 10px 7px 15px;
+  }
+
+  a {
+    color: $darkgrey;
+  }
+
+  :hover {
+    text-decoration: none;
+    color: darken($darkgrey, 25%);
+  }
+}
+
 @import 'browse';
 
 @media only screen and (max-width:960px) {
index 13372273c2eba0f940203bee76ff8964e2f3d279..9dd0e909ec051c18e8c80988150c9b665962ef4f 100644 (file)
@@ -321,12 +321,12 @@ class AmfController < ApplicationController
         # Ideally we would do ":include => :nodes" here but if we do that
         # then rails only seems to return the first copy of a node when a
         # way includes a node more than once
-        way = Way.where(:id => wayid).preload(:nodes => :node_tags).first
+        way = Way.where(:id => wayid).first
 
         # check case where way has been deleted or doesn't exist
         return [-4, 'way', wayid] if way.nil? or !way.visible
 
-        points = way.nodes.collect do |node|
+        points = way.nodes.preload(:node_tags).collect do |node|
           nodetags=node.tags
           nodetags.delete('created_by')
           [node.lon, node.lat, node.id, nodetags, node.version]
@@ -551,7 +551,7 @@ class AmfController < ApplicationController
             mid = renumberedways[mid] if m[0] == 'Way'
           end
           if mid
-            typedmembers << [m[0], mid, m[2]]
+            typedmembers << [m[0], mid, m[2].delete("\000-\037\ufffe\uffff", "^\011\012\015")]
           end
         end
 
@@ -886,8 +886,8 @@ class AmfController < ApplicationController
     new_tags = Hash.new
     unless tags.nil?
       tags.each do |k, v|
-        new_k = k.delete "\000-\037", "^\011\012\015"
-        new_v = v.delete "\000-\037", "^\011\012\015"
+        new_k = k.delete "\000-\037\ufffe\uffff", "^\011\012\015"
+        new_v = v.delete "\000-\037\ufffe\uffff", "^\011\012\015"
         new_tags[new_k] = new_v
       end
     end
index 2c442c190585d590647a7705aaff4a1319869278..2f630c6d62f7801c274ea7b23b94a9e1c06f05ef 100644 (file)
@@ -287,8 +287,16 @@ class ApiController < ApplicationController
     status['api'] = api_status.to_s
     status['gpx'] = gpx_status.to_s
     api << status
-
     doc.root << api
+    policy = XML::Node.new 'policy'
+    blacklist = XML::Node.new 'imagery'
+    IMAGERY_BLACKLIST.each do |url_regex| 
+      xnd = XML::Node.new 'blacklist'
+      xnd['regex'] = url_regex.to_s
+      blacklist << xnd
+    end
+    policy << blacklist
+    doc.root << policy
 
     render :text => doc.to_s, :content_type => "text/xml"
   end
index 3830df88bf40fb9b117af17b2d1d27804f821be8..90a9672760755a6ee060e8540cb6fc71ea041d5d 100644 (file)
@@ -73,7 +73,7 @@ class ApplicationController < ActionController::Base
     if request.cookies["_osm_session"].to_s == ""
       if params[:cookie_test].nil?
         session[:cookie_test] = true
-        redirect_to params.merge(:cookie_test => "true")
+        redirect_to Hash[params].merge(:cookie_test => "true")
         return false
       else
         flash.now[:warning] = t 'application.require_cookies.cookies_needed'
index e16ec29147bffe4a2c84b2cb8e407b150cf30603..f0b92f4b47a33e7f8fbe7208348598f7b5b61cca 100644 (file)
@@ -58,6 +58,11 @@ class BrowseController < ApplicationController
   def changeset
     @type = "changeset"
     @changeset = Changeset.find(params[:id])
+    if @user and @user.moderator?
+      @comments = @changeset.comments.unscope(:where => :visible).includes(:author)
+    else
+      @comments = @changeset.comments.includes(:author)
+    end
     @node_pages, @nodes = paginate(:old_nodes, :conditions => {:changeset_id => @changeset.id}, :per_page => 20, :parameter => 'node_page')
     @way_pages, @ways = paginate(:old_ways, :conditions => {:changeset_id => @changeset.id}, :per_page => 20, :parameter => 'way_page')
     @relation_pages, @relations = paginate(:old_relations, :conditions => {:changeset_id => @changeset.id}, :per_page => 20, :parameter => 'relation_page')
index 735fa73a88c31a1820515aa9e4677011946be8b3..646ba2fa35a0160522bcfa69bf4b946edaf6f066 100644 (file)
@@ -7,11 +7,12 @@ class ChangesetController < ApplicationController
   skip_before_filter :verify_authenticity_token, :except => [:list]
   before_filter :authorize_web, :only => [:list, :feed]
   before_filter :set_locale, :only => [:list, :feed]
-  before_filter :authorize, :only => [:create, :update, :delete, :upload, :include, :close]
-  before_filter :require_allow_write_api, :only => [:create, :update, :delete, :upload, :include, :close]
-  before_filter :require_public_data, :only => [:create, :update, :delete, :upload, :include, :close]
-  before_filter :check_api_writable, :only => [:create, :update, :delete, :upload, :include]
-  before_filter :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query, :list, :feed]
+  before_filter :authorize, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+  before_filter :require_moderator, :only => [:hide_comment, :unhide_comment]
+  before_filter :require_allow_write_api, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+  before_filter :require_public_data, :only => [:create, :update, :delete, :upload, :include, :close, :comment, :subscribe, :unsubscribe]
+  before_filter :check_api_writable, :only => [:create, :update, :delete, :upload, :include, :comment, :subscribe, :unsubscribe, :hide_comment, :unhide_comment]
+  before_filter :check_api_readable, :except => [:create, :update, :delete, :upload, :download, :query, :list, :feed, :comment, :subscribe, :unsubscribe, :comments_feed]
   before_filter(:only => [:list, :feed]) { |c| c.check_database_readable(true) }
   after_filter :compress_output
   around_filter :api_call_handle_error, :except => [:list, :feed]
@@ -29,6 +30,10 @@ class ChangesetController < ApplicationController
     # Assume that Changeset.from_xml has thrown an exception if there is an error parsing the xml
     cs.user_id = @user.id
     cs.save_with_tags!
+
+    # Subscribe user to changeset comments
+    cs.subscribers << @user
+
     render :text => cs.id.to_s, :content_type => "text/plain"
   end
 
@@ -37,7 +42,8 @@ class ChangesetController < ApplicationController
   # return anything about the nodes, ways and relations in the changeset.
   def read
     changeset = Changeset.find(params[:id])
-    render :text => changeset.to_xml.to_s, :content_type => "text/xml"
+
+    render :text => changeset.to_xml(params[:include_discussion].presence).to_s, :content_type => "text/xml"
   end
 
   ##
@@ -284,7 +290,7 @@ class ChangesetController < ApplicationController
       elsif params[:bbox]
         changesets = conditions_bbox(changesets, BoundingBox.from_bbox_params(params))
       elsif params[:friends] && @user
-        changesets = changesets.where(:user_id => @user.friend_users.public)
+        changesets = changesets.where(:user_id => @user.friend_users.identifiable)
       elsif params[:nearby] && @user
         changesets = changesets.where(:user_id => @user.nearby)
       end
@@ -305,6 +311,145 @@ class ChangesetController < ApplicationController
     list
   end
 
+  ##
+  # Add a comment to a changeset
+  def comment
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+    raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
+
+    # Extract the arguments
+    id = params[:id].to_i
+    body = params[:text]
+
+    # Find the changeset and check it is valid
+    changeset = Changeset.find(id)
+    raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
+
+    # Add a comment to the changeset
+    comment = changeset.comments.create({
+      :changeset => changeset,
+      :body => body,
+      :author => @user
+    })
+
+    # Notify current subscribers of the new comment
+    changeset.subscribers.each do |user|
+      if @user != user
+        Notifier.changeset_comment_notification(comment, user).deliver
+      end
+    end
+
+    # Add the commenter to the subscribers if necessary
+    changeset.subscribers << @user unless changeset.subscribers.exists?(@user)
+
+    # Return a copy of the updated changeset
+    render :text => changeset.to_xml.to_s, :content_type => "text/xml"
+  end
+
+  ##
+  # Adds a subscriber to the changeset
+  def subscribe
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+
+    # Extract the arguments
+    id = params[:id].to_i
+
+    # Find the changeset and check it is valid
+    changeset = Changeset.find(id)
+    raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
+    raise OSM::APIChangesetAlreadySubscribedError.new(changeset) if changeset.subscribers.exists?(@user)
+
+    # Add the subscriber
+    changeset.subscribers << @user
+
+    # Return a copy of the updated changeset
+    render :text => changeset.to_xml.to_s, :content_type => "text/xml"
+  end
+
+  ##
+  # Removes a subscriber from the changeset
+  def unsubscribe
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+
+    # Extract the arguments
+    id = params[:id].to_i
+
+    # Find the changeset and check it is valid
+    changeset = Changeset.find(id)
+    raise OSM::APIChangesetNotYetClosedError.new(changeset) if changeset.is_open?
+    raise OSM::APIChangesetNotSubscribedError.new(changeset) unless changeset.subscribers.exists?(@user)
+
+    # Remove the subscriber
+    changeset.subscribers.delete(@user)
+
+    # Return a copy of the updated changeset
+    render :text => changeset.to_xml.to_s, :content_type => "text/xml"
+  end
+
+  ##
+  # Sets visible flag on comment to false
+  def hide_comment
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+
+    # Extract the arguments
+    id = params[:id].to_i
+
+    # Find the changeset
+    comment = ChangesetComment.find(id)
+
+    # Hide the comment
+    comment.update(:visible => false)
+
+    # Return a copy of the updated changeset
+    render :text => comment.changeset.to_xml.to_s, :content_type => "text/xml"
+  end
+
+  ##
+  # Sets visible flag on comment to true
+  def unhide_comment
+    # Check the arguments are sane
+    raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
+
+    # Extract the arguments
+    id = params[:id].to_i
+
+    # Find the changeset
+    comment = ChangesetComment.find(id)
+
+    # Unhide the comment
+    comment.update(:visible => true)
+
+    # Return a copy of the updated changeset
+    render :text => comment.changeset.to_xml.to_s, :content_type => "text/xml"
+  end
+
+  ##
+  # Get a feed of recent changeset comments
+  def comments_feed
+    if params[:id]
+      # Extract the arguments
+      id = params[:id].to_i
+
+      # Find the changeset
+      changeset = Changeset.find(id)
+
+      # Return comments for this changeset only
+      @comments = changeset.comments.includes(:author, :changeset).limit(comments_limit)
+    else
+      # Return comments
+      @comments = ChangesetComment.includes(:author, :changeset).where(:visible => :true).order("created_at DESC").limit(comments_limit).preload(:changeset)
+    end
+
+    # Render the result
+    respond_to do |format|
+      format.rss
+    end
+  end
+
 private
   #------------------------------------------------------------
   # utility functions below.
@@ -435,4 +580,17 @@ private
     return changesets.where("num_changes > 0")
   end
 
+  ##
+  # Get the maximum number of comments to return
+  def comments_limit
+    if params[:limit]
+      if params[:limit].to_i > 0 and params[:limit].to_i <= 10000
+        params[:limit].to_i
+      else
+        raise OSM::APIBadUserInput.new("Comments limit must be between 1 and 10000")
+      end
+    else
+      100
+    end
+  end
 end
index 73422c2f0a3cb0a0d7133ab57aedfd94e0980b05..6053cbb4b5588dcb7fbd6863c7cdc6942e7d5b74 100644 (file)
@@ -1,6 +1,7 @@
 # coding: utf-8
 
 class GeocoderController < ApplicationController
+  require 'cgi'
   require 'uri'
   require 'net/http'
   require 'rexml/document'
@@ -140,20 +141,25 @@ class GeocoderController < ApplicationController
 
     # get objects to excude
     if params[:exclude]
-      exclude = "&exclude_place_ids=#{params[:exclude].join(',')}"
+      exclude = "&exclude_place_ids=#{params[:exclude]}"
     end
 
     # ask nominatim
     response = fetch_xml("#{NOMINATIM_URL}search?format=xml&q=#{escape_query(query)}#{viewbox}#{exclude}&accept-language=#{http_accept_language.user_preferred_languages.join(',')}")
 
+    # extract the results from the response
+    results =  response.elements["searchresults"]
+
+    # extract parameters from more_url
+    more_url_params = CGI.parse(URI.parse(results.attributes["more_url"]).query)
+
     # create result array
     @results = Array.new
 
     # create parameter hash for "more results" link
-    @more_params = params.reverse_merge({ :exclude => [] })
-
-    # extract the results from the response
-    results =  response.elements["searchresults"]
+    @more_params = params.merge({
+      :exclude => more_url_params["exclude_place_ids"].first
+    })
 
     # parse the response
     results.elements.each("place") do |place|
@@ -181,7 +187,6 @@ class GeocoderController < ApplicationController
                      :min_lon => min_lon, :max_lon => max_lon,
                      :prefix => prefix, :name => name,
                      :type => object_type, :id => object_id})
-      @more_params[:exclude].push(place.attributes["place_id"].to_s)
     end
 
     render :action => "results"
index 76c97ba5b3799770c3e3f55fe212efa426b489d3..acd88be04329d7f0760ee0e52b69976df581a4d3 100644 (file)
@@ -53,6 +53,9 @@ class NotesController < ApplicationController
   ##
   # Create a new note
   def create
+    # Check the ACLs
+    raise OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip)
+
     # Check the arguments are sane
     raise OSM::APIBadUserInput.new("No lat was given") unless params[:lat]
     raise OSM::APIBadUserInput.new("No lon was given") unless params[:lon]
@@ -86,6 +89,9 @@ class NotesController < ApplicationController
   ##
   # Add a comment to an existing note
   def comment
+    # Check the ACLs
+    raise OSM::APIAccessDenied if Acl.no_note_comment(request.remote_ip)
+
     # Check the arguments are sane
     raise OSM::APIBadUserInput.new("No id was given") unless params[:id]
     raise OSM::APIBadUserInput.new("No text was given") if params[:text].blank?
index 5597fd4aef67db49fcaada7d0cbf41f0d563fd31..e76ee97f6342c8a90c7e4184ebc2328b35d82025 100644 (file)
@@ -6,7 +6,7 @@ class SiteController < ApplicationController
   before_filter :set_locale
   before_filter :redirect_browse_params, :only => :index
   before_filter :redirect_map_params, :only => [:index, :edit, :export]
-  before_filter :require_user, :only => [:edit, :welcome]
+  before_filter :require_user, :only => [:welcome]
   before_filter :require_oauth, :only => [:index]
 
   def index
@@ -17,7 +17,7 @@ class SiteController < ApplicationController
 
   def permalink
     lon, lat, zoom = ShortLink::decode(params[:code])
-    new_params = params.except(:code, :lon, :lat, :zoom, :node, :way, :relation, :changeset)
+    new_params = params.except(:code, :lon, :lat, :zoom, :layers, :node, :way, :relation, :changeset)
 
     if new_params.has_key? :m
       new_params.delete :m
@@ -48,7 +48,11 @@ class SiteController < ApplicationController
 
     new_params[:anchor] = "map=#{zoom}/#{lat}/#{lon}"
 
-    redirect_to new_params
+    if params.has_key? :layers
+      new_params[:anchor] += "&layers=#{params[:layers]}"
+    end
+
+    redirect_to Hash[new_params]
   end
 
   def key
@@ -63,6 +67,8 @@ class SiteController < ApplicationController
       require_oauth
       render :action => :index, :layout => map_layout
       return
+    else
+      require_user
     end
 
     if params[:node]
@@ -145,7 +151,7 @@ class SiteController < ApplicationController
     end
 
     if anchor.present?
-      redirect_to params.merge(:anchor => anchor.join('&'))
+      redirect_to Hash[params].merge(:anchor => anchor.join('&'))
     end
   end
 end
index 9c4a9d8bd18952816f0f267aacec2d378a3a61fc..e1553cbb0f7ca399ed2b86b6a1fbcb7bda247eca 100644 (file)
@@ -49,13 +49,13 @@ class TraceController < ApplicationController
       if @user
         @traces = Trace.visible_to(@user) #1
       else
-        @traces = Trace.public #2
+        @traces = Trace.visible_to_all #2
       end
     else
       if @user and @user == target_user
         @traces = @user.traces #3 (check vs user id, so no join + can't pick up non-public traces by changing name)
       else
-        @traces = target_user.traces.public #4
+        @traces = target_user.traces.visible_to_all #4
       end
     end
 
@@ -206,7 +206,7 @@ class TraceController < ApplicationController
   end
 
   def georss
-    @traces = Trace.public.visible
+    @traces = Trace.visible_to_all.visible
 
     if params[:display_name]
       @traces = @traces.joins(:user).where(:users => {:display_name => params[:display_name]})
index 059f00bbe38b5a6656ba2d4d5f277bc6498aa872..a3face30d4d42af71750d4bf9ac77a038e3c2526 100644 (file)
@@ -26,7 +26,7 @@ class UserPreferenceController < ApplicationController
   ##
   # return the value for a single preference
   def read_one
-    pref = UserPreference.find(@user.id, params[:preference_key])
+    pref = UserPreference.find([@user.id, params[:preference_key]])
 
     render :text => pref.v.to_s, :content_type => "text/plain"
   end
@@ -69,7 +69,7 @@ class UserPreferenceController < ApplicationController
   # update the value of a single preference
   def update_one
     begin
-      pref = UserPreference.find(@user.id, params[:preference_key])
+      pref = UserPreference.find([@user.id, params[:preference_key]])
     rescue ActiveRecord::RecordNotFound 
       pref = UserPreference.new
       pref.user = @user
@@ -85,7 +85,7 @@ class UserPreferenceController < ApplicationController
   ##
   # delete a single preference
   def delete_one
-    UserPreference.find(@user.id, params[:preference_key]).delete
+    UserPreference.find([@user.id, params[:preference_key]]).delete
 
     render :text => "", :content_type => "text/plain"
   end
index b192a63d558ee4c4ba8bd7e06dc815536168a1fa..f4b332f7004fb44785f697fe42cd6b15d246c10d 100644 (file)
@@ -13,14 +13,20 @@ module BrowseHelper
     # don't look at object tags if redacted, so as to avoid giving
     # away redacted version tag information.
     unless object.redacted?
-      if object.tags.include? "name:#{I18n.locale}"
-        name = t 'printable_name.with_name',  :name => object.tags["name:#{I18n.locale}"].to_s, :id => name
+      locale = I18n.locale.to_s
+
+      while locale =~ /-[^-]+/ and not object.tags.include? "name:#{I18n.locale}"
+        locale = locale.sub(/-[^-]+/, "")
+      end
+
+      if object.tags.include? "name:#{locale}"
+        name = t 'printable_name.with_name_html', :name => content_tag(:bdi, object.tags["name:#{locale}"].to_s ), :id => content_tag(:bdi, name)
       elsif object.tags.include? 'name'
-        name = t 'printable_name.with_name',  :name => object.tags['name'].to_s, :id => name
+        name = t 'printable_name.with_name_html', :name => content_tag(:bdi, object.tags['name'].to_s ), :id => content_tag(:bdi, name)
       end
     end
 
-    return name
+    name
   end
 
   def link_class(type, object)
@@ -55,8 +61,12 @@ module BrowseHelper
   def format_value(key, value)
     if wp = wikipedia_link(key, value)
       link_to h(wp[:title]), wp[:url], :title => t('browse.tag_details.wikipedia_link', :page => wp[:title])
+    elsif wdt = wikidata_link(key, value)
+      link_to h(wdt[:title]), wdt[:url], :title => t('browse.tag_details.wikidata_link', :page => wdt[:title])
     elsif url = wiki_link("tag", "#{key}=#{value}")
       link_to h(value), url, :title => t('browse.tag_details.wiki_link.tag', :key => key, :value => value)
+    elsif url = telephone_link(key, value)
+      link_to h(value), url, :title => t('browse.tag_details.telephone_link', :phone_number => value)
     else
       linkify h(value)
     end
@@ -82,7 +92,7 @@ private
   ]
 
   def icon_tags(object)
-    object.tags.find_all { |k,v| ICON_TAGS.include? k }
+    object.tags.find_all { |k,v| ICON_TAGS.include? k }.sort
   end
 
   def wiki_link(type, lookup)
@@ -140,4 +150,25 @@ private
       :title => value + section
     }
   end
+
+  def wikidata_link(key, value)
+    if key == "wikidata" and value =~ /^[Qq][1-9][0-9]*$/
+      return {
+        :url => "//www.wikidata.org/wiki/#{value}?uselang=#{I18n.locale}",
+        :title => value
+      }
+    end
+    return nil
+  end
+
+  def telephone_link(key, value)
+    # does it look like a phone number? eg "+1 (234) 567-8901 " ?
+    return nil unless value =~ /^\s*\+[\d\s\(\)\/\.-]{6,25}\s*$/
+
+    # remove all whitespace instead of encoding it http://tools.ietf.org/html/rfc3966#section-5.1.1
+    # "+1 (234) 567-8901 " -> "+1(234)567-8901"
+    valueNoWhitespace = value.gsub(/\s+/, '')
+
+    return "tel:#{valueNoWhitespace}"
+  end
 end
index da4ad8967e3c72616a7232041b319d2aab49af6d..a1a2125a173f81a72f2b53dcdccecdb3b9322e3f 100644 (file)
@@ -1,6 +1,15 @@
+require 'htmlentities'
+
 module TitleHelper
+  @@coder = HTMLEntities.new
+
   def set_title(title = false)
-    response.headers["X-Page-Title"] = t('layouts.project_name.title') + (title ? ' | ' + title : '')
-    @title = title
+    if title
+      @title = @@coder.decode(title.gsub("<bdi>", "\u202a").gsub("</bdi>", "\u202c"))
+      response.headers["X-Page-Title"] = t('layouts.project_name.title') + ' | ' + @title
+    else
+      @title = title
+      response.headers["X-Page-Title"] = t('layouts.project_name.title')
+    end
   end
 end
index 2db7fb76522a0342324d235367ae51d0c5932c97..e2f163ea585bf8bd5453208c7da72dc24d360548 100644 (file)
@@ -11,6 +11,10 @@ class Acl < ActiveRecord::Base
     self.match(address, domain).where(:k => "no_account_creation").exists?
   end
 
+  def self.no_note_comment(address, domain = nil)
+    self.match(address, domain).where(:k => "no_note_comment").exists?
+  end
+
   def self.no_trace_download(address, domain = nil)
     self.match(address, domain).where(:k => "no_trace_download").exists?
   end
index adb41b204eae382a80c4f4282c69a7b2d33e3a7a..ab6e05ccfd659bec96e3f4a5e5530928ce9b84e5 100644 (file)
@@ -11,6 +11,9 @@ class Changeset < ActiveRecord::Base
   has_many :old_nodes
   has_many :old_ways
   has_many :old_relations
+  
+  has_many :comments, -> { where(:visible => true).order(:created_at) }, :class_name => "ChangesetComment"
+  has_and_belongs_to_many :subscribers, :class_name => 'User', :join_table => 'changesets_subscribers', :association_foreign_key => 'subscriber_id'
 
   validates_presence_of :id, :on => :update
   validates_presence_of :user_id, :created_at, :closed_at, :num_changes
@@ -179,13 +182,13 @@ class Changeset < ActiveRecord::Base
     end
   end
 
-  def to_xml
+  def to_xml(include_discussion = false)
     doc = OSM::API.new.get_xml_doc
-    doc.root << to_xml_node()
+    doc.root << to_xml_node(nil, include_discussion)
     return doc
   end
 
-  def to_xml_node(user_display_name_cache = nil)
+  def to_xml_node(user_display_name_cache = nil, include_discussion = false)
     el1 = XML::Node.new 'changeset'
     el1['id'] = self.id.to_s
 
@@ -217,6 +220,23 @@ class Changeset < ActiveRecord::Base
       bbox.to_unscaled.add_bounds_to(el1, '_')
     end
 
+    el1['comments_count'] = self.comments.count.to_s
+
+    if include_discussion
+      el2 = XML::Node.new('discussion')
+      self.comments.includes(:author).each do |comment|
+        el3 = XML::Node.new('comment')
+        el3['date'] = comment.created_at.xmlschema
+        el3['uid'] = comment.author.id.to_s if comment.author.data_public?
+        el3['user'] = comment.author.display_name.to_s if comment.author.data_public?
+        el4 = XML::Node.new('text')
+        el4.content = comment.body.to_s
+        el3 << el4
+        el2 << el3
+      end
+      el1 << el2
+    end
+
     # NOTE: changesets don't include the XML of the changes within them,
     # they are just structures for tagging. to get the osmChange of a
     # changeset, see the download method of the controller.
diff --git a/app/models/changeset_comment.rb b/app/models/changeset_comment.rb
new file mode 100644 (file)
index 0000000..a010674
--- /dev/null
@@ -0,0 +1,17 @@
+class ChangesetComment < ActiveRecord::Base
+  belongs_to :changeset
+  belongs_to :author, :class_name => "User"
+
+  validates_presence_of :id, :on => :update # is it necessary?
+  validates_uniqueness_of :id
+  validates_presence_of :changeset
+  validates_associated :changeset
+  validates_presence_of :author
+  validates_associated :author
+  validates :visible, :inclusion => { :in => [true,false] }
+  
+  # Return the comment text
+  def body
+    RichText.new("text", read_attribute(:body))
+  end
+end
index 07d43cd741da065ada41e4705b458874f5ca3756..dd91a95b4df1f7b557085f8e9da08e2d1229dba5 100644 (file)
@@ -9,6 +9,7 @@ class NoteComment < ActiveRecord::Base
   validates_presence_of :visible
   validates_associated :author
   validates_inclusion_of :event, :in => [ "opened", "closed", "reopened", "commented", "hidden" ]
+  validates_format_of :body, :with => /\A[^\x00-\x08\x0b-\x0c\x0e-\x1f\x7f\ufffe\uffff]*\z/
 
   # Return the comment text
   def body
index be6679c41b74cd6730134e2dc629e19a48efc634..b1a94a77de0ccfe517edb96e9228f2eddef520d2 100644 (file)
@@ -146,6 +146,26 @@ class Notifier < ActionMailer::Base
     end
   end
 
+  def changeset_comment_notification(comment, recipient)
+    with_recipient_locale recipient do
+      @changeset_url = changeset_url(comment.changeset, :host => SERVER_URL)
+      @comment = comment.body
+      @owner = recipient == comment.changeset.user
+      @commenter = comment.author.display_name
+      @changeset_comment = comment.changeset.tags['comment'].presence
+      @time = comment.created_at
+      @changeset_author = comment.changeset.user.display_name
+
+      if @owner
+        subject = I18n.t("notifier.changeset_comment_notification.commented.subject_own", :commenter => @commenter)
+      else
+        subject = I18n.t("notifier.changeset_comment_notification.commented.subject_other", :commenter => @commenter)
+      end
+
+      mail :to => recipient.email, :subject => subject
+    end
+  end
+
 private
 
   def with_recipient_locale(recipient)
index aba38511ce5e01399bb702a9ef3115b295cd95fa..e5c783f5c68b788e7d5f034970a3a4ebc28acd5e 100644 (file)
@@ -2,6 +2,6 @@ class RelationMember < ActiveRecord::Base
   self.table_name = "current_relation_members"
   self.primary_keys = "relation_id", "sequence_id"
 
-  belongs_to :relation
+  belongs_to :relation, :foreign_key => :relation_id
   belongs_to :member, :polymorphic => true
 end
index df66496a2601381bc103a4fdd6f3c6e9ed82691b..bf8d3731b8e7709a348a7b469fdeef0afd52a7e3 100644 (file)
@@ -7,7 +7,7 @@ class Trace < ActiveRecord::Base
 
   scope :visible, -> { where(:visible => true) }
   scope :visible_to, ->(u) { visible.where("visibility IN ('public', 'identifiable') OR user_id = ?", u) }
-  scope :public, -> { where(:visibility => ["public", "identifiable"]) }
+  scope :visible_to_all, -> { where(:visibility => ["public", "identifiable"]) }
   scope :tagged, ->(t) { joins(:tags).where(:gpx_file_tags => { :tag => t }) }
 
   validates_presence_of :user_id, :name, :timestamp
index b27e0cda54b583afe3d093a3a85e96706e4ed4d9..ed0813bee43a9ff14b47b33be7313147ab395b57 100644 (file)
@@ -12,6 +12,8 @@ class User < ActiveRecord::Base
   has_many :tokens, :class_name => "UserToken"
   has_many :preferences, :class_name => "UserPreference"
   has_many :changesets, -> { order(:created_at => :desc) }
+  has_many :changeset_comments, :foreign_key =>  :author_id
+  has_and_belongs_to_many :changeset_subscriptions, :class_name => 'Changeset', :join_table => 'changesets_subscribers', :foreign_key => 'subscriber_id'
   has_many :note_comments, :foreign_key => :author_id
   has_many :notes, :through => :note_comments
 
@@ -26,7 +28,7 @@ class User < ActiveRecord::Base
 
   scope :visible, -> { where(:status => ["pending", "active", "confirmed"]) }
   scope :active, -> { where(:status => ["active", "confirmed"]) }
-  scope :public, -> { where(:data_public => true) }
+  scope :identifiable, -> { where(:data_public => true) }
 
   has_attached_file :image,
     :default_url => "/assets/:class/:attachment/:style.png",
@@ -42,9 +44,10 @@ class User < ActiveRecord::Base
   validates_length_of :display_name, :within => 3..255, :allow_nil => true
   validates_email_format_of :email, :if => Proc.new { |u| u.email_changed? }
   validates_email_format_of :new_email, :allow_blank => true, :if => Proc.new { |u| u.new_email_changed? }
-  validates_format_of :display_name, :with => /\A[^\/;.,?%#]*\z/, :if => Proc.new { |u| u.display_name_changed? }
+  validates_format_of :display_name, :with => /\A[^\x00-\x1f\x7f\ufffe\uffff\/;.,?%#]*\z/, :if => Proc.new { |u| u.display_name_changed? }
   validates_format_of :display_name, :with => /\A\S/, :message => "has leading whitespace", :if => Proc.new { |u| u.display_name_changed? }
   validates_format_of :display_name, :with => /\S\z/, :message => "has trailing whitespace", :if => Proc.new { |u| u.display_name_changed? }
+  validates_exclusion_of :display_name, :in => %w(new terms save confirm confirm-email go_public reset-password forgot-password suspended)
   validates_numericality_of :home_lat, :allow_nil => true
   validates_numericality_of :home_lon, :allow_nil => true
   validates_numericality_of :home_zoom, :only_integer => true, :allow_nil => true
index 1da048c96b00b39c3c2bd91028949bb531c9efa2..e78d0df0b048b2143cf8038ed7027c0f711bcf31 100644 (file)
@@ -12,7 +12,7 @@ class Way < ActiveRecord::Base
   has_many :old_ways, -> { order(:version) }
 
   has_many :way_nodes, -> { order(:sequence_id) }
-  has_many :nodes, -> { order("sequence_id") }, :through => :way_nodes
+  has_many :nodes, :through => :way_nodes
 
   has_many :way_tags
 
diff --git a/app/views/api/map.xml.builder b/app/views/api/map.xml.builder
deleted file mode 100644 (file)
index a62c481..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-# Note that this file is currently unused
-# I (xin@zxv.ltd.uk) suspect this is slower than using OSM module, which in turn uses libxml
-# it will be good to output xml this way eventually.
-xml.instruct! :xml, :version=>"1.0"
-xml.osm("version" => "0.5", "generator" => "OpenStreetMap Server") do
-  @nodes.each do |node|
-    xml.tag! "node",:id => node.id,
-                    :lat => node.lat,
-                    :lon => node.lon,
-                    :user => node.user_display_name,
-                    :visible => node.visible,
-                    :timestamp => node.timestamp.xmlschema  do
-      node.tags.each do |tag|
-        k,v = tag.split('=')
-        xml.tag! "tag",:k => k, :v => v
-      end
-    end
-  end
-  @ways.each do |way|
-    xml.tag! "way", :id => way.id,
-                    :user => way.user_display_name,
-                    :visible => way.visible,
-                    :timestamp => way.timestamp.xmlschema  do
-      way.nds.each do |nd|
-        xml.tag! "nd", :ref => nd
-      end
-
-    end
-      
-    
-  end
-end
index 971e467aa02c7c66622e80bf14837ed7354f59c7..17a5f1f40708867479f07ceb172adbfb4c6ca43c 100644 (file)
@@ -26,7 +26,7 @@
 <% if @type == "node" and common_details.visible? %>
 <div class="details geo">
   <%= t 'browse.location' %>
-  <%= link_to(content_tag(:span, number_with_delimiter(common_details.lat), :class => "latitude") + ", " + content_tag(:span, number_with_delimiter(common_details.lon), :class => "longitude"), {:controller => 'site', :action => 'index', :lat => h(common_details.lat), :lon => h(common_details.lon), :zoom => "18"}) %>
+  <%= link_to(content_tag(:span, number_with_delimiter(common_details.lat), :class => "latitude") + ", " + content_tag(:span, number_with_delimiter(common_details.lon), :class => "longitude"), {:controller => 'site', :action => 'index', :anchor => "map=18/#{common_details.lat}/#{common_details.lon}"}) %>
 </div>
 <% end %>
 
index 581c49b09155b30435a499c9361040cc2b9aafcb..873360bb22ad0d687fba1d4f299510423fa44eeb 100644 (file)
@@ -14,7 +14,7 @@
       <h4><%= t 'browse.part_of' %></h4>
       <ul>
         <% node.ways.uniq.each do |way| %>
-          <li><%= link_to h(printable_name(way)), { :action => "way", :id => way.id.to_s }, :class => link_class('way', way), :title => link_title(way) %></li>
+          <li><%= link_to printable_name(way), { :action => "way", :id => way.id.to_s }, :class => link_class('way', way), :title => link_title(way) %></li>
         <% end %>
         <%= render :partial => "containing_relation", :collection => node.containing_relation_members.uniq %>
       </ul>
index 2673df3c35c7c9e33458cc04c1f09a07a3b56295..0d17de349ca390a6e5ee38e49bd646805cf3b13f 100644 (file)
@@ -1,6 +1,6 @@
 <%
   member_class = link_class(relation_member.member_type.downcase, relation_member.member)
-  linked_name = link_to h(printable_name(relation_member.member)), { :action => relation_member.member_type.downcase, :id => relation_member.member_id.to_s }, :title => link_title(relation_member.member)
+  linked_name = link_to printable_name(relation_member.member), { :action => relation_member.member_type.downcase, :id => relation_member.member_id.to_s }, :title => link_title(relation_member.member)
   type_str = t'browse.relation_member.type.' + relation_member.member_type.downcase
 %>
   <li class="<%= member_class %>"><%=
@@ -9,4 +9,4 @@
     else
       raw t'browse.relation_member.entry_role', :type => type_str, :name => linked_name, :role => h(relation_member.member_role)
     end
-  %></li>
\ No newline at end of file
+  %></li>
index aff405dde2b780f5ae8cac5fcfdb9dcc4f0f3162..b1dffb9ef40e50268de23c6f0ed2249f60eca294 100644 (file)
       <ul>
         <% way.way_nodes.each do |wn| %>
           <li>
-            <%= link_to h(printable_name(wn.node)), { :action => "node", :id => wn.node_id.to_s }, :class => link_class('node', wn.node), :title => link_title(wn.node) %>
+            <%= link_to printable_name(wn.node), { :action => "node", :id => wn.node_id.to_s }, :class => link_class('node', wn.node), :title => link_title(wn.node) %>
             <% related_ways = wn.node.ways.reject { |w| w.id == wn.way_id } %>
             <% if related_ways.size > 0 then %>
-              (<%= raw t 'browse.way.also_part_of', :count => related_ways.size, :related_ways => related_ways.map { |w| link_to(h(printable_name(w)), { :action => "way", :id => w.id.to_s }, :class => link_class('way', w), :title => link_title(w) ) }.to_sentence %>)
+              (<%= raw t 'browse.way.also_part_of', :count => related_ways.size, :related_ways => related_ways.map { |w| link_to(printable_name(w), { :action => "way", :id => w.id.to_s }, :class => link_class('way', w), :title => link_title(w) ) }.to_sentence %>)
             <% end %>
           </li>
         <% end %>
index 31799f0e9f9e5e592537decb6bfe65e1cc9223ef..bbe22792101c283e39fd7084be5a0d930627aa85 100644 (file)
 
   <%= render :partial => "tag_details", :object => @changeset.tags.except('comment') %>
 
+  <h4 class="comments-header"><%= t('browse.changeset.discussion') %></h4>
+  
+  <div class="buttons clearfix subscribe-buttons">
+    <form action="#" class="hide_unless_logged_in">
+      <% if @changeset.subscribers.exists?(@user) %>
+        <input class="action-button" type="submit" name="unsubscribe" value="<%= t('javascripts.changesets.show.unsubscribe') %>" data-method="POST" data-url="<%= changeset_unsubscribe_url(@changeset) %>" />
+      <% else %>
+        <input class="action-button" type="submit" name="subscribe" value="<%= t('javascripts.changesets.show.subscribe') %>" data-method="POST" data-url="<%= changeset_subscribe_url(@changeset) %>" />
+      <% end %>
+    </form>
+  </div>
+
+  <div class="clearfix"></div>
+
+  <% if @comments.length > 0 %>
+    <div class='changeset-comments'>
+      <form action="#">
+        <ul>
+          <% @comments.each do |comment| %>
+            <% if comment.visible %>
+              <li id="c<%= comment.id %>">
+                <small class='deemphasize'>
+                  <%= t("browse.changeset.commented_by",
+                    :when => friendly_date(comment.created_at), :exact_time => l(comment.created_at),
+                    :user => link_to(h(comment.author.display_name), {:controller => "user", :action => "view",
+                    :display_name => comment.author.display_name})).html_safe %>
+                  <% if @user and @user.moderator? %>
+                    — <span class="action-button deemphasize" data-comment-id="<%= comment.id %>" data-method="POST" data-url="<%= changeset_comment_hide_url(comment.id) %>"><%= t('javascripts.changesets.show.hide_comment') %></span>
+                  <% end %>
+                </small>
+                <%= comment.body.to_html %>
+              </li>
+            <% elsif @user and @user.moderator? %>
+              <li id="c<%= comment.id %>">
+                <small class='deemphasize'>
+                  <%= t("browse.changeset.hidden_commented_by",
+                    :when => friendly_date(comment.created_at), :exact_time => l(comment.created_at),
+                    :user => link_to(h(comment.author.display_name), {:controller => "user", :action => "view",
+                    :display_name => comment.author.display_name})).html_safe %>
+                  — <span class="action-button deemphasize" data-comment-id="<%= comment.id %>" data-method="POST" data-url="<%= changeset_comment_unhide_url(comment.id) %>"><%= t('javascripts.changesets.show.unhide_comment') %></span>
+                 </small>
+                <%= comment.body.to_html %>
+              </li>
+            <% end %>
+          <% end %>
+        </ul>
+      </form>
+    </div>
+  <% end %>
+
+  <div class="notice hide_if_logged_in">
+    <%= link_to(t("browse.changeset.join_discussion"), :controller => 'user', :action => 'login', :referer => request.fullpath) %>
+  </div>
+
+  <% unless @changeset.is_open? %>
+    <form action="#" class="hide_unless_logged_in">
+      <textarea class="comment" name="text" cols="40" rows="5"></textarea>
+      <div class="buttons clearfix">
+        <input type="submit" name="comment" value="<%= t('javascripts.changesets.show.comment') %>" data-changeset-id="<%= @changeset.id %>" data-method="POST" data-url="<%= changeset_comment_url(@changeset) %>" disabled="1"/>
+      </div>
+    </form>
+  <% end %>
+
   <% unless @ways.empty? %>
     <h4>
       <%= type_and_paginated_count('way', @way_pages) %>
@@ -18,7 +81,7 @@
     </h4>
     <ul>
       <% @ways.each do |way| %>
-        <li><%= link_to h(printable_name(way, true)), { :action => "way", :id => way.way_id.to_s }, :class => link_class('way', way), :title => link_title(way) %></li>
+        <li><%= link_to printable_name(way, true), { :action => "way", :id => way.way_id.to_s }, :class => link_class('way', way), :title => link_title(way) %></li>
       <% end %>
     </ul>
   <% end %>
@@ -30,7 +93,7 @@
     </h4>
     <ul>
       <% @relations.each do |relation| %>
-        <li><%= link_to h(printable_name(relation, true)), { :action => "relation", :id => relation.relation_id.to_s }, :class => link_class('relation', relation), :title => link_title(relation) %></li>
+        <li><%= link_to printable_name(relation, true), { :action => "relation", :id => relation.relation_id.to_s }, :class => link_class('relation', relation), :title => link_title(relation) %></li>
       <% end %>
     </ul>
   <% end %>
     </h4>
     <ul>
       <% @nodes.each do |node| %>
-        <li><%= link_to h(printable_name(node, true)), { :action => "node", :id => node.node_id.to_s }, :class => link_class('node', node), :title => link_title(node) %></li>
+        <li><%= link_to printable_name(node, true), { :action => "node", :id => node.node_id.to_s }, :class => link_class('node', node), :title => link_title(node) %></li>
       <% end %>
     </ul>
   <% end %>
index 1e0f118d83803978883640a17479d60e59811da9..38657f4d1fb8f976868bb375b94e0feb206b7088 100644 (file)
@@ -2,7 +2,7 @@
 
 <h2>
   <a class="geolink" href="<%= root_path %>"><span class="icon close"></span></a>
-  <%= t("browse.#{@type}.title", :name => printable_name(@feature)) %>
+  <%= raw t("browse.#{@type}.title", :name => printable_name(@feature)) %>
 </h2>
 
 <%= render :partial => @type, :object => @feature %>
index fa483bfb06bcceead2914f9e70e3a13fcc2d4467..5f5dd4db3274b789890cac68a562ad72cfd3e191 100644 (file)
@@ -2,7 +2,7 @@
 
 <h2>
   <a class="geolink" href="<%= root_path %>"><span class="icon close"></span></a>
-  <%= t("browse.#{@type}.history_title", :name => printable_name(@feature)) %>
+  <%= raw t("browse.#{@type}.history_title", :name => printable_name(@feature)) %>
 </h2>
 
 <%= render :partial => @type, :collection => @feature.send("old_#{@type}s").reverse %>
diff --git a/app/views/changeset/_comment.html.erb b/app/views/changeset/_comment.html.erb
new file mode 100644 (file)
index 0000000..dfd9116
--- /dev/null
@@ -0,0 +1,6 @@
+<h2><%= t "changeset.rss.comment", :author => comment.author.display_name, 
+  :changeset_id => comment.changeset.id.to_s %></h2>
+<div class="changeset-comment" style="margin-top: 5px">
+  <div class="changeset-comment-description" style="font-size: smaller; color: #999999"><%= t "changeset.rss.commented_at_by_html", :when => friendly_date(comment.created_at), :user => comment.author.display_name %></div>
+  <div class="changeset-comment-text"><%= comment.body %></div>
+</div>
diff --git a/app/views/changeset/_comments.rss.builder b/app/views/changeset/_comments.rss.builder
new file mode 100644 (file)
index 0000000..8ad5cba
--- /dev/null
@@ -0,0 +1,18 @@
+comments.each do |comment|
+  xml.item do
+    xml.title t("changeset.rss.comment", :author => comment.author.display_name, :changeset_id => comment.changeset.id.to_s)
+    
+    xml.link url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
+    xml.guid url_for(:controller => "browse", :action => "changeset", :id => comment.changeset.id, :anchor => "c#{comment.id}", :only_path => false)
+
+    xml.description do
+      xml.cdata! render(:partial => "comment", :object => comment, :formats => [ :html ])
+    end
+
+    if comment.author
+      xml.dc :creator, comment.author.display_name
+    end
+
+    xml.pubDate comment.created_at.to_s(:rfc822)
+  end
+end
diff --git a/app/views/changeset/comments_feed.rss.builder b/app/views/changeset/comments_feed.rss.builder
new file mode 100644 (file)
index 0000000..60a229a
--- /dev/null
@@ -0,0 +1,14 @@
+xml.rss("version" => "2.0", 
+        "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
+  xml.channel do
+    if @changeset
+      xml.title t('changeset.rss.title_particular', :changeset_id => @changeset.id)
+    else
+      xml.title t('changeset.rss.title_all')
+    end
+    xml.link url_for(:controller => "site", :action => "index", :only_path => false)
+
+    xml << render(:partial => "comments", :object => @comments)
+  end
+end
+
index a3ba473a8a67e54f11e08cfc79f314e9b3a4201a..a5db0cdca949be7df2846819f6b75f47fb71a311 100644 (file)
@@ -1,6 +1,6 @@
 <%= t 'diary_entry.location.location' %>
 
-<a href="<%= url_for :controller => 'site', :action => 'index', :lat => location.latitude, :lon => location.longitude, :zoom => 14 %>">
+<a href="<%= url_for :controller => 'site', :action => 'index', :anchor => "map=14/#{location.latitude}/#{location.longitude}" %>">
 <abbr class="geo" title="<%= number_with_precision(location.latitude, :precision => 4) %>; <%= number_with_precision(location.longitude, :precision => 4) %>">
 <%= describe_location location.latitude, location.longitude, 14, location.language_code %>
 </abbr>
index 13f70708162dc311c92249d38f3779b3ff3d0b64..1c91e68ec1aac9cd28cbbeb4eb7cbff753cc8209 100644 (file)
@@ -9,8 +9,8 @@
   <%= stylesheet_link_tag "leaflet-all", :media => "screen, print" %>
   <!--[if IE]>
     <%= stylesheet_link_tag "large-#{dir}", :media => "screen" %>
+    <%= favicon_link_tag "favicon.ico" %>
   <![endif]-->
-  <%= favicon_link_tag "favicon.ico" %>
   <%= favicon_link_tag "osm_logo_57.png", :rel => "apple-touch-icon", :sizes => "57x57", :type => "image/png" %>
   <%= favicon_link_tag "osm_logo_72.png", :rel => "apple-touch-icon", :sizes => "72x72", :type => "image/png" %>
   <%= favicon_link_tag "osm_logo_114.png", :rel => "apple-touch-icon", :sizes => "114x114", :type => "image/png" %>
index e72214cbefe86fae1d9e6c816bd99766fec39c3c..4715570536f53cb3dcb6f002b30fd9635ffe70b0 100644 (file)
       <p class="error"><%= t 'layouts.osm_read_only' %></p>
     <% end %>
 
+    <div id="sotm">
+      <a href="http://www.stateofthemap.org/?l=en"><%= image_tag "sotm.png" %></a>
+      <h2>
+        <a><span class="icon close"></span></a>
+        <a href="http://www.stateofthemap.org/?l=en"><%= t 'layouts.sotm_header' %></a>
+      </h2>
+      <p><a href="http://www.stateofthemap.org/?l=en">
+        <%= t 'layouts.sotm_line_1' %>
+      <br />
+        <%= t 'layouts.sotm_line_2' %>
+      <br />
+        <%= t 'layouts.sotm_line_3' %>
+      </a></p>
+    </div>
+
     <div id="flash">
       <%= render :partial => "layouts/flash" %>
     </div>
index 35f5b4a0422505642ae4a1f773cc3bfa6fee505d..f7c26aea1fa90bf2a159e81ae5ec0b20473cb5cb 100644 (file)
@@ -16,7 +16,7 @@
     </div>
     <div class='buttons'>
       <%= submit_tag t('message.new.send_button') %>
-      <%= link_to t('message.new.back'), { :controller => 'message', :action => 'inbox', :display_name => @user.display_name }, :class => 'deemphasize button' %>
+      <%= link_to t('message.new.back_to_inbox'), { :controller => 'message', :action => 'inbox', :display_name => @user.display_name }, :class => 'deemphasize button' %>
     </div>
   </fieldset>
 <% end %>
diff --git a/app/views/notifier/changeset_comment_notification.html.erb b/app/views/notifier/changeset_comment_notification.html.erb
new file mode 100644 (file)
index 0000000..b7646a8
--- /dev/null
@@ -0,0 +1,20 @@
+<p><%= t 'notifier.changeset_comment_notification.greeting' %></p>
+
+<p>
+  <% if @owner %>
+    <%= t "notifier.changeset_comment_notification.commented.your_changeset", :commenter => @commenter, :time => @time %>
+  <% else %>
+    <%= t "notifier.changeset_comment_notification.commented.commented_changeset", :commenter => @commenter, :time => @time, :changeset_author => @changeset_author %>
+  <% end %>
+  <% if @changeset_comment %>
+    <%= t "notifier.changeset_comment_notification.commented.partial_changeset_with_comment", :changeset_comment => @changeset_comment %>
+  <% else %>
+    <%= t "notifier.changeset_comment_notification.commented.partial_changeset_without_comment" %>
+  <% end %>
+</p>
+
+==
+<%= @comment.to_html %>
+==
+
+<p><%= raw t 'notifier.changeset_comment_notification.details', :url => link_to(@changeset_url, @changeset_url) %></p>
diff --git a/app/views/notifier/changeset_comment_notification.text.erb b/app/views/notifier/changeset_comment_notification.text.erb
new file mode 100644 (file)
index 0000000..44a3c12
--- /dev/null
@@ -0,0 +1,18 @@
+<%= t 'notifier.changeset_comment_notification.greeting' %>
+
+<% if @owner %>
+  <%= t "notifier.changeset_comment_notification.commented.your_changeset", :commenter => @commenter, :time => @time %>
+<% else %>
+  <%= t "notifier.changeset_comment_notification.commented.commented_changeset", :commenter => @commenter, :time => @time, :changeset_author => @changeset_author %>
+<% end %>
+<% if @changeset_comment %>
+  <%= t "notifier.changeset_comment_notification.commented.partial_changeset_with_comment", :changeset_comment => @changeset_comment %>
+<% else %>
+  <%= t "notifier.changeset_comment_notification.commented.partial_changeset_without_comment" %>
+<% end %>
+
+==
+<%= @comment.to_text %>
+==
+
+<%= t 'notifier.changeset_comment_notification.details', :url => @changeset_url %>
index f88942669ecbb19595f5b6f62c4378ae68175e4e..7ddee6218269792a64b18bbc4301ce15945d84e3 100644 (file)
       params.background = hashParams.background;
     }
 
+    if (hashParams.comment) {
+      params.comment = hashParams.comment;
+    }
+
+<% if params[:gpx] -%>
+    params.gpx = '<%= trace_data_url(params[:gpx]) %>';
+<% else -%>
     if (hashParams.gpx) {
       params.gpx = hashParams.gpx;
     }
+<% end -%>
 
     $('#id-embed').attr('src', '<%= id_url :locale => params[:locale] %>#' + querystring.stringify(params));
   </script>
index 78b98ae08f10f78e13badb487d4ae7e13c26742b..6bf33653562479adb68a7187e585f35d6c30c13c 100644 (file)
@@ -47,7 +47,7 @@
     <dt><a href="http://download.geofabrik.de/"><%= t'export.start.too_large.geofabrik.title' %></a></dt>
     <dd><%= t'export.start.too_large.geofabrik.description' %></dd>
 
-    <dt><a href="http://metro.teczno.com/"><%= t'export.start.too_large.metro.title' %></a></dt>
+    <dt><a href="https://mapzen.com/metro-extracts/"><%= t'export.start.too_large.metro.title' %></a></dt>
     <dd><%= t'export.start.too_large.metro.description' %></dd>
 
     <dt><a href="http://wiki.openstreetmap.org/wiki/Download"><%= t'export.start.too_large.other.title' %></a></dt>
index c05e00c4a494e8dd139ae5b157717112a73b483b..99d570cf0992f1201c23644ba26532579bf284e6 100644 (file)
@@ -16,7 +16,7 @@
       <% end %>
       ... <%= t'trace.trace.ago', :time_in_words_ago => time_ago_in_words(trace.timestamp) %></span>
       <%= link_to t('trace.trace.more'), {:controller => 'trace', :action => 'view', :display_name => trace.user.display_name, :id => trace.id}, {:title => t('trace.trace.trace_details')} %> /
-      <%= link_to_if trace.inserted?, t('trace.trace.map'), {:controller => 'site', :action => 'index', :lat => trace.latitude, :lon => trace.longitude, :zoom => 14}, {:title => t('trace.trace.view_map')} %> /
+      <%= link_to_if trace.inserted?, t('trace.trace.map'), {:controller => 'site', :action => 'index', :anchor => "map=14/#{trace.latitude}/#{trace.longitude}"}, {:title => t('trace.trace.view_map')} %> /
       <%= link_to t('trace.trace.edit'), {:controller => 'site', :action => 'edit', :gpx => trace.id }, {:title => t('trace.trace.edit_map')} %>
       <span class="trace_<%= trace.visibility %>"><%= t('trace.trace.' + trace.visibility) %></span>
       <br />
index d9ec9f14b7d94cc632ca824607c4ec2edfc07195..da273b0ebb390ff42549c9adb30d108e419bbc8e 100644 (file)
@@ -9,49 +9,41 @@
 <div id='edit-trace-form' class='standard-form'>
   <fieldset>
     <div class='form-row'>
-      <label><%= t'trace.edit.filename' %></label>
+      <label class='standard-label'><%= t'trace.edit.filename' %></label>
       <p class='deemphasize'><%= @trace.name %> (<%= link_to t('trace.edit.download'), :controller => 'trace', :action => 'data', :id => @trace.id %>)</p>
     </div>
     <div class='form-row'>
-      <label><%= t'trace.edit.uploaded_at' %></label>
+      <label class='standard-label'><%= t'trace.edit.uploaded_at' %></label>
       <p class='deemphasize'><%= l @trace.timestamp, :format => :friendly %></p>
     </div>
-  </fieldset>
-
   <% if @trace.inserted? %>
-
-  <fieldset>
     <div class='form-row'>
-      <label><%= t'trace.edit.points' %></label>
+      <label class='standard-label'><%= t'trace.edit.points' %></label>
       <p class='deemphasize'><%= @trace.size.to_s.gsub(/(\d)(?=(\d{3})+$)/,'\1,') %></p>
     </div>
     <div class='form-row'>
-      <label><%= t'trace.edit.start_coord' %></label>
+      <label class='standard-label'><%= t'trace.edit.start_coord' %></label>
     </div>
     <div class="geo">
       <span class="latitude"><%= @trace.latitude %></span>;
       <span class="longitude"><%= @trace.longitude %></span>
     </div>
-    (<%=link_to t('trace.edit.map'), :controller => 'site', :action => 'index', :lat => @trace.latitude, :lon => @trace.longitude, :zoom => 14 %> / <%=link_to t('trace.edit.edit'), :controller => 'site', :action => 'edit', :lat => @trace.latitude, :lon => @trace.longitude, :gpx=> @trace.id, :zoom => 14 %>)
-  </fieldset>
-
+    (<%=link_to t('trace.edit.map'), :controller => 'site', :action => 'index', :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %> / <%=link_to t('trace.edit.edit'), :controller => 'site', :action => 'edit', :gpx=> @trace.id, :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %>)
   <% end %>
-
-  <fieldset>
     <div class='form-row'>
-      <label><%= t'trace.edit.owner' %></label>
+      <label class='standard-label'><%= t'trace.edit.owner' %></label>
       <p class='deemphasize'><%= link_to h(@trace.user.display_name), {:controller => 'user', :action => 'view', :display_name => @trace.user.display_name} %></p>
     </div>
     <div class='form-row'>
-      <label><%= t'trace.edit.description' %></label>
+      <label class='standard-label'><%= t'trace.edit.description' %></label>
       <%= f.text_field :description %>
     </div>
     <div class='form-row'>
-      <label><%= t'trace.edit.tags' %></label>
+      <label class='standard-label'><%= t'trace.edit.tags' %></label>
       <%= f.text_field :tagstring %> (<%= t'trace.edit.tags_help' %>)
     </div>
     <div class='form-row'>
-      <label><%= t'trace.edit.visibility' %></label>
+      <label class='standard-label'><%= t'trace.edit.visibility' %></label>
       <%= f.select :visibility, [[t('trace.visibility.private'),"private"],[t('trace.visibility.public'),"public"],[t('trace.visibility.trackable'),"trackable"],[t('trace.visibility.identifiable'),"identifiable"]] %> (<a href="<%= t'trace.edit.visibility_help_url' %>"><%= t'trace.edit.visibility_help' %></a>)
     </div>
   </fieldset>
index cbe6c1628e928ea701d6a5a82a65d50cb736f3ad..fac0139d94c7ac73f1c9a285800036a44027a4f2 100644 (file)
@@ -25,7 +25,7 @@
     <td><%= @trace.size.to_s.gsub(/(\d)(?=(\d{3})+$)/,'\1,') %></td></tr>
   <tr>
     <td><%= t'trace.view.start_coordinates' %></td>
-    <td><div class="geo" style="display: inline"><span class="latitude"><%= @trace.latitude %></span>; <span class="longitude"><%= @trace.longitude %></span></div> (<%=link_to t('trace.view.map'), :controller => 'site', :action => 'index', :lat => @trace.latitude, :lon => @trace.longitude, :zoom => 14 %> / <%=link_to t('trace.view.edit'), :controller => 'site', :action => 'edit', :lat => @trace.latitude, :lon => @trace.longitude, :gpx=> @trace.id, :zoom => 14 %>)</td>
+    <td><div class="geo" style="display: inline"><span class="latitude"><%= @trace.latitude %></span>; <span class="longitude"><%= @trace.longitude %></span></div> (<%=link_to t('trace.view.map'), :controller => 'site', :action => 'index', :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %> / <%=link_to t('trace.view.edit'), :controller => 'site', :action => 'edit', :gpx=> @trace.id, :anchor => "map=14/#{@trace.latitude}/#{@trace.longitude}" %>)</td>
   </tr>
   <% end %>
   <tr>
index cb70281e6f6bb1fa383eb751ccb7f736b5413d61..051d270a4201164a09c8767790c64aae1e5bf320 100644 (file)
@@ -44,7 +44,6 @@
           <li><%= link_to image_tag("openid.png", :alt => t("user.login.openid_providers.openid.title")), "#", :id => "openid_open_url", :title => t("user.login.openid_providers.openid.title") %></li>
           <li><%= openid_button "google", "gmail.com" %></li>
           <li><%= openid_button "yahoo", "me.yahoo.com" %></li>
-          <li><%= openid_button "myopenid", "myopenid.com" %></li>
           <li><%= openid_button "wordpress", "wordpress.com" %></li>
           <li><%= openid_button "aol", "aol.com" %></li>
         </ul>
index 205abe3536eb70da0ef5fc25dbdace5e48e92a97..5bc2a619e83ea182b17e2507c5e0f2f07f7cf18c 100644 (file)
--- a/config.ru
+++ b/config.ru
@@ -1,4 +1,4 @@
 # This file is used by Rack-based servers to start the application.
 
 require ::File.expand_path('../config/environment',  __FILE__)
-run OpenStreetMap::Application
+run Rails.application
index cc7ef05005bc8156316c2f364afe5e366beeb6ea..a40336c3303dbe53065420e0c8c53c3bd060ccd8 100644 (file)
@@ -5,7 +5,7 @@ require File.expand_path('../preinitializer', __FILE__)
 if STATUS == :database_offline
 require "action_controller/railtie"
 require "action_mailer/railtie"
-require "active_resource/railtie"
+require "active_model/railtie"
 require "sprockets/railtie"
 require "rails/test_unit/railtie"
 else
@@ -14,7 +14,7 @@ end
 
 # Require the gems listed in Gemfile, including any gems
 # you've limited to :test, :development, or :production.
-Bundler.require(:default, Rails.env)
+Bundler.require(*Rails.groups)
 
 module OpenStreetMap
   class Application < Rails::Application
@@ -33,9 +33,6 @@ module OpenStreetMap
     # Custom directories with classes and modules you want to be autoloadable.
     config.autoload_paths += %W(#{config.root}/lib)
 
-    # Configure the default encoding used in templates for Ruby 1.9.
-    config.encoding = "utf-8"
-
     # Use SQL instead of Active Record's schema dumper when creating the database.
     # This is necessary if your schema can't be completely dumped by the schema dumper,
     # like if you have constraints or database-specific column types
@@ -43,12 +40,6 @@ module OpenStreetMap
       config.active_record.schema_format = :sql
     end
 
-    # Enable the asset pipeline
-    config.assets.enabled = true
-
-    # Version of your assets, change this if you want to expire all your assets
-    config.assets.version = '1.0'
-
     # Don't eager load models when the database is offline
     if STATUS == :database_offline
       config.paths["app/models"].skip_eager_load!
index 4489e58688ca642d8e0e9489f6896f49f9b89da6..5e5f0c1fac0bcde58936530ada4fd08abcaf5a64 100644 (file)
@@ -1,6 +1,4 @@
-require 'rubygems'
-
 # Set up gems listed in the Gemfile.
 ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
 
-require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
+require 'bundler/setup' if File.exist?(ENV['BUNDLE_GEMFILE'])
index b958021e8fe587a1b8f04c1f8640d5c71e99d9d4..ee8d90dc651948269f1b869953ff04774e737307 100644 (file)
@@ -1,5 +1,5 @@
-# Load the rails application
+# Load the Rails application.
 require File.expand_path('../application', __FILE__)
 
-# Initialize the rails application
-OpenStreetMap::Application.initialize!
+# Initialize the Rails application.
+Rails.application.initialize!
index 36696f8271c50b09f18ea2e3b56c2b546614abaf..a414d1490655db23aa4a00bb688b5a57664c2313 100644 (file)
@@ -19,11 +19,19 @@ OpenStreetMap::Application.configure do
   # Print deprecation notices to the Rails logger.
   config.active_support.deprecation = :log
 
-  # Raise an error on page load if there are pending migrations
+  # Raise an error on page load if there are pending migrations.
   config.active_record.migration_error = :page_load
 
   # 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
+
+  # Adds additional error checking when serving assets at runtime.
+  # Checks for improperly declared sprockets dependencies.
+  # Raises helpful error messages.
+  config.assets.raise_runtime_errors = true
+
+  # Raises error for missing translations
+  # config.action_view.raise_on_missing_translations = true
 end
index 36f71792f40e381d23f1f419a5778f8e08875a7b..941070902d9f32c08a910a25c48d42c60e533dac 100644 (file)
@@ -5,7 +5,7 @@ OpenStreetMap::Application.configure do
   config.cache_classes = true
 
   # Eager load code on boot. This eager loads most of Rails and
-  # your application in memory, allowing both thread web servers
+  # your application in memory, allowing both threaded web servers
   # and those relying on copy on write to perform better.
   # Rake tasks automatically ignore this option for performance.
   config.eager_load = true
@@ -32,9 +32,6 @@ OpenStreetMap::Application.configure do
   # Generate digests for assets URLs.
   config.assets.digest = true
 
-  # Version of your assets, change this if you want to expire all your assets.
-  config.assets.version = '1.0'
-
   # 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
@@ -67,24 +64,7 @@ OpenStreetMap::Application.configure do
   # Enable serving of images, stylesheets, and JavaScripts from an asset server.
   # config.action_controller.asset_host = "http://assets.example.com"
 
-  # Precompile additional assets.
-  # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
-  config.assets.precompile += %w( index.js browse.js welcome.js fixthemap.js routing.js )
-  config.assets.precompile += %w( user.js diary_entry.js swfobject.js )
-  config.assets.precompile += %w( large-ltr.css small-ltr.css print-ltr.css )
-  config.assets.precompile += %w( large-rtl.css small-rtl.css print-rtl.css )
-  config.assets.precompile += %w( leaflet-all.css leaflet.ie.css )
-  config.assets.precompile += %w( embed.js embed.css )
-  config.assets.precompile += %w( html5shiv.js )
-  config.assets.precompile += %w( images/marker-*.png img/*-handle.png )
-  config.assets.precompile += %w( potlatch2.swf )
-  config.assets.precompile += %w( potlatch2/assets.zip )
-  config.assets.precompile += %w( potlatch2/FontLibrary.swf )
-  config.assets.precompile += %w( potlatch2/locales/*.swf )
-  config.assets.precompile += %w( help/introduction.* )
-  config.assets.precompile += %w( iD.js iD.css )
-  config.assets.precompile += %w( iD/img/*.svg iD/img/*.png iD/img/*.gif )
-  config.assets.precompile += %w( iD/img/pattern/*.png )
+  # `config.assets.precompile` has moved to config/initializers/assets.rb
 
   # Ignore bad email addresses and do not raise email delivery errors.
   # Set this to true and configure the email server for immediate delivery to raise delivery errors.
@@ -102,4 +82,9 @@ OpenStreetMap::Application.configure do
 
   # Use default logging formatter so that PID and timestamp are not suppressed.
   config.log_formatter = ::Logger::Formatter.new
+
+  # Do not dump schema after migrations.
+  unless STATUS == :database_offline
+    config.active_record.dump_schema_after_migration = false
+  end
 end
index ebbda583634ad7b3c1694f188a9b41b14f2c3e2f..b0ff645a0195d9813dbc3139a0ae658f29fbfa94 100644 (file)
@@ -14,7 +14,7 @@ OpenStreetMap::Application.configure do
 
   # Configure static asset server for tests with Cache-Control for performance.
   config.serve_static_assets  = true
-  config.static_cache_control = "public, max-age=3600"
+  config.static_cache_control = 'public, max-age=3600'
 
   # Show full error reports and disable caching.
   config.consider_all_requests_local       = true
@@ -33,4 +33,7 @@ OpenStreetMap::Application.configure do
 
   # Print deprecation notices to the stderr.
   config.active_support.deprecation = :stderr
+
+  # Raises error for missing translations
+  # config.action_view.raise_on_missing_translations = true
 end
index d6a855ef5003b68fb343298bac7b60fd2a1faa73..3fbebdc766c5d82424682433381aeeb5246463ca 100644 (file)
@@ -84,6 +84,11 @@ defaults: &defaults
   require_terms_seen: false
   # Whether to require users to agree to the CTs before editing
   require_terms_agreed: false
+  # Imagery to return in capabilities as blacklisted
+  imagery_blacklist:
+    - ".*\\.googleapis\\.com/.*"
+    - ".*\\.google\\.com/.*"
+    - ".*\\.google\\.ru/.*"
 
 development:
   <<: *defaults
diff --git a/config/initializers/assets.rb b/config/initializers/assets.rb
new file mode 100644 (file)
index 0000000..c90054b
--- /dev/null
@@ -0,0 +1,26 @@
+# Be sure to restart your server when you modify this file.
+
+# Version of your assets, change this if you want to expire all your assets.
+Rails.application.config.assets.version = '1.0'
+
+# Precompile additional assets.
+# application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
+Rails.application.config.assets.precompile += %w( index.js browse.js welcome.js fixthemap.js )
+Rails.application.config.assets.precompile += %w( user.js diary_entry.js )
+Rails.application.config.assets.precompile += %w( routing.js )
+Rails.application.config.assets.precompile += %w( large-ltr.css small-ltr.css print-ltr.css )
+Rails.application.config.assets.precompile += %w( large-rtl.css small-rtl.css print-rtl.css )
+Rails.application.config.assets.precompile += %w( leaflet-all.css leaflet.ie.css )
+Rails.application.config.assets.precompile += %w( embed.js embed.css )
+Rails.application.config.assets.precompile += %w( html5shiv.js )
+Rails.application.config.assets.precompile += %w( images/marker-*.png img/*-handle.png )
+Rails.application.config.assets.precompile += %w( swfobject.js expressInstall.swf )
+Rails.application.config.assets.precompile += %w( potlatch2.swf )
+Rails.application.config.assets.precompile += %w( potlatch2/assets.zip )
+Rails.application.config.assets.precompile += %w( potlatch2/FontLibrary.swf )
+Rails.application.config.assets.precompile += %w( potlatch2/locales/*.swf )
+Rails.application.config.assets.precompile += %w( help/introduction.* )
+Rails.application.config.assets.precompile += %w( iD.js iD.css )
+Rails.application.config.assets.precompile += %w( iD/img/*.svg iD/img/*.png iD/img/*.gif )
+Rails.application.config.assets.precompile += %w( iD/img/pattern/*.png )
+Rails.application.config.assets.precompile += %w( iD/locales/*.json )
diff --git a/config/initializers/cookies_serializer.rb b/config/initializers/cookies_serializer.rb
new file mode 100644 (file)
index 0000000..7a06a89
--- /dev/null
@@ -0,0 +1,3 @@
+# Be sure to restart your server when you modify this file.
+
+Rails.application.config.action_dispatch.cookies_serializer = :json
\ No newline at end of file
index 012e401d2436478ccbc4d07daefb777c3bc83dda..9dcc34fcc05e0706fb2400dec008068cff458b56 100644 (file)
@@ -2,7 +2,7 @@ if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
   module ActiveRecord
     module ConnectionAdapters
       class PostgreSQLAdapter
-        def initialize_type_map_with_enums
+        def initialize_type_map_with_enums(type_map)
           OID.alias_type "format_enum", "text"
           OID.alias_type "gpx_visibility_enum", "text"
           OID.alias_type "note_status_enum", "text"
@@ -11,7 +11,7 @@ if defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter)
           OID.alias_type "user_role_enum", "text"
           OID.alias_type "user_status_enum", "text"
 
-          initialize_type_map_without_enums
+          initialize_type_map_without_enums(type_map)
         end
 
         alias_method_chain :initialize_type_map, :enums
diff --git a/config/initializers/router.rb b/config/initializers/router.rb
new file mode 100644 (file)
index 0000000..a1e6bbf
--- /dev/null
@@ -0,0 +1,18 @@
+# Some versions of ruby seem to accidentally force the encoding
+# as part of normalize_path and some don't
+
+module ActionDispatch
+  module Journey
+    class Router
+      class Utils
+        def self.normalize_path_with_encoding(path)
+          self.normalize_path_without_encoding(path).force_encoding("UTF-8")
+        end
+
+        class << self
+          alias_method_chain :normalize_path, :encoding
+        end
+      end
+    end
+  end
+end
diff --git a/config/initializers/secret_token.rb b/config/initializers/secret_token.rb
deleted file mode 100644 (file)
index ac761ae..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-# Be sure to restart your server when you modify this file.
-
-# Your secret key is used for verifying the integrity of signed cookies.
-# If you change this key, all old signed cookies will become invalid!
-
-# Make sure the secret is at least 30 characters and all random,
-# no regular words or you'll be exposed to dictionary attacks.
-# You can use `rake secret` to generate a secure secret key.
-
-# Make sure your secret_key_base is kept private
-# if you're sharing your code publicly.
-OpenStreetMap::Application.config.secret_key_base = '8be565e2e25831d88231f4bcfd83dfc3ab33957c4f33bb3cff7a279f7820ec4d0c1111f246bb347c68859c0b46b4e591be9179a53a5a7165a9936000d6d2be41'
index 17173d536612fdbba32887b1d766a651e3ffee45..97886ab3e3cf6a639a9c8e337504da417a1e42d0 100644 (file)
@@ -1,7 +1,7 @@
 # Be sure to restart your server when you modify this file.
 
 if defined?(MEMCACHE_SERVERS)
-  OpenStreetMap::Application.config.session_store :mem_cache_store, :memcache_server => MEMCACHE_SERVERS, :namespace => "rails:session", :key => "_osm_session"
+  Rails.application.config.session_store :mem_cache_store, :memcache_server => MEMCACHE_SERVERS, :namespace => "rails:session", :key => "_osm_session"
 else
-  OpenStreetMap::Application.config.session_store :cache_store, :key => '_osm_session'
+  Rails.application.config.session_store :cache_store, :key => '_osm_session'
 end
index 7cfcfbe430d58a191cf15e2b95c4ef50b9e36e3b..16dcbe29ac3c1ef1efc95a648b6e080cad8cbd36 100644 (file)
@@ -1,45 +1,16 @@
 # Messages for Afrikaans (Afrikaans)
 # Exported from translatewiki.net
-# Export driver: syck-pecl
+# Export driver: phpyaml
 # Author: Firefishy
 # Author: Naudefj
 # Author: Nroets
-af: 
-  activerecord: 
-    attributes: 
-      diary_comment: 
-        body: Teks
-      diary_entry: 
-        language: Taal
-        latitude: Breedtegraad
-        longitude: Lengtegraad
-        title: Titel
-        user: Gebruiker
-      friend: 
-        friend: Vriend
-        user: Gebruiker
-      message: 
-        body: Teks
-        recipient: Ontvanger
-        sender: Afsender
-        title: Titel
-      trace: 
-        description: Beskrywing
-        latitude: Breedtegraad
-        longitude: Lengtegraad
-        name: Naam
-        public: Openbaar
-        size: Grootte
-        user: Gebruiker
-        visible: Sigbaar
-      user: 
-        active: Aktief
-        description: Beskrywing
-        display_name: Vertoon Naam
-        email: E-pos
-        languages: Tale
-        pass_crypt: Wagwoord
-    models: 
+---
+af:
+  time:
+    formats:
+      friendly: '%e %B %Y om %H:%M'
+  activerecord:
+    models:
       acl: Toegangsbeheer
       changeset: Stel wysigings
       country: Land
@@ -56,165 +27,181 @@ af:
       user: Gebruiker
       user_preference: Gebruikersvoorkeure
       way: Weg
-  browse: 
-    containing_relation: 
+    attributes:
+      diary_comment:
+        body: Teks
+      diary_entry:
+        user: Gebruiker
+        title: Titel
+        latitude: Breedtegraad
+        longitude: Lengtegraad
+        language: Taal
+      friend:
+        user: Gebruiker
+        friend: Vriend
+      trace:
+        user: Gebruiker
+        visible: Sigbaar
+        name: Naam
+        size: Grootte
+        latitude: Breedtegraad
+        longitude: Lengtegraad
+        public: Openbaar
+        description: Beskrywing
+      message:
+        sender: Afsender
+        title: Titel
+        body: Teks
+        recipient: Ontvanger
+      user:
+        email: E-pos
+        active: Aktief
+        display_name: Vertoon Naam
+        description: Beskrywing
+        languages: Tale
+        pass_crypt: Wagwoord
+  browse:
+    relation_member:
+      entry_role: '%{type} %{name} as %{role}'
+      type:
+        node: Node
+        way: Weg
+        relation: Relasie
+    containing_relation:
       entry: Relasie %{relation_name}
       entry_role: Relasie %{relation_name} (as %{relation_role})
-    not_found: 
+    not_found:
       sorry: Jammer, %{type} %{id} kan nie gevind word nie.
-      type: 
-        changeset: Veranderingstel
+      type:
         node: node
-        relation: relasie
         way: weg
-    relation_member: 
-      entry_role: "%{type} %{name} as %{role}"
-      type: 
-        node: Node
-        relation: Relasie
-        way: Weg
-    start_rjs: 
+        relation: relasie
+        changeset: Veranderingstel
+    timeout:
+      sorry: Jammer, dit het te lank geneem om data vir die %{type} met die id %{id}
+        op te soek.
+      type:
+        node: node
+    start_rjs:
       load_data: Laai data
       loading: Laai...
-    tag_details: 
-      tags: "Etikette:"
-    timeout: 
-      sorry: Jammer, dit het te lank geneem om data vir die %{type} met die id %{id} op te soek.
-      type: 
-        node: node
-  changeset: 
-    changeset: 
-      anonymous: Anoniem
-      no_edits: (geen wysigings)
-    changeset_paging_nav: 
+    tag_details:
+      tags: 'Etikette:'
+  changeset:
+    changeset_paging_nav:
+      showing_page: Wys bladsy %{page}
       next: Volgende »
       previous: » Vorige
-      showing_page: Wys bladsy %{page}
-    changesets: 
-      area: Gebied
-      comment: Opmerking
+    changeset:
+      anonymous: Anoniem
+      no_edits: (geen wysigings)
+    changesets:
       id: ID
       saved_at: Gestoor op
       user: Gebruiker
-  diary_entry: 
-    comments: 
-      when: Wanneer
-    diary_comment: 
-      comment_from: Kommentaar van %{link_user} op %{comment_created_at}
-      confirm: Bevestig
-      hide_link: Versteek die opmerking
-    diary_entry: 
-      comment_count: 
-        one: 1 reaksie
-        other: "%{count} reaksies"
-      comment_link: Lewer kommentaar op hierdie bydrae
-      confirm: Bevestig
-      edit_link: Wysig hierdie inskrywing
-      hide_link: Versteek die inskrywing
-      posted_by: Gepos deur %{link_user} op %{created} in die %{language_link}
-      reply_link: Antwoord op hierdie bydrae
-    edit: 
-      body: "Teks:"
-      language: "Taal:"
-      latitude: "Breedtegraad:"
-      location: "Ligging:"
-      longitude: "Lengtegraad:"
-      marker_text: Ligging van dagboekinskrywing
-      save_button: Stoor
-      subject: "Onderwerp:"
-      title: Wysig dagboekinskrywing
-      use_map_link: gebruik kaart
-    feed: 
-      all: 
-        description: Onlangse dagboekinskrywings van OpenStreetMap-gebruikers
-        title: OpenStreetMap dagboekinskrywings
-      language: 
-        description: Onlangse dagboekinskrywings van OpenStreetMap-gebruikers in %{language_name}
-        title: OpenStreetMap dagboekinskrywings in %{language_name}
-      user: 
-        description: Onlangse OpenStreetMap dagboekinskrywings van %{user}
-        title: OpenStreetMap dagboekinskrywings van %{user}
-    list: 
+      comment: Opmerking
+      area: Gebied
+  diary_entry:
+    new:
+      title: Nuwe dagboekinskrywing
+    list:
+      title: Gebruikersdagboeke
+      user_title: Dagboek van %{user}
       in_language_title: Dagboekinkrywings in %{language}
       new: Nuwe dagboekinskrywing
       new_title: Plaas nuwe artikel in u dagboek
-      newer_entries: Nuwer inskrywings
       no_entries: Geen dagboekinskrywings nie
+      recent_entries: 'Onlangse dagboekinskrywings:'
       older_entries: Ouer inskrywings
-      recent_entries: "Onlangse dagboekinskrywings:"
-      title: Gebruikersdagboeke
+      newer_entries: Nuwer inskrywings
+    edit:
+      title: Wysig dagboekinskrywing
+      subject: 'Onderwerp:'
+      body: 'Teks:'
+      language: 'Taal:'
+      location: 'Ligging:'
+      latitude: 'Breedtegraad:'
+      longitude: 'Lengtegraad:'
+      use_map_link: gebruik kaart
+      save_button: Stoor
+      marker_text: Ligging van dagboekinskrywing
+    view:
+      title: '%{user} se dagboek | %{title}'
       user_title: Dagboek van %{user}
-    location: 
-      edit: Wysig
-      location: "Ligging:"
-      view: Wys
-    new: 
-      title: Nuwe dagboekinskrywing
-    no_such_entry: 
-      body: Jammer, daar is geen dagboekinskrywing of kommentaar met die id %{id} nie. Kontroleer u spelling, of miskien is die skakel waarop u gekliek het verkeerd.
-      heading: Die inskrywing met id %{id} bestaan nie
-      title: Die opgevraagde dagboekinskrywing bestaan nie
-    view: 
       leave_a_comment: Los opmerking agter
+      login_to_leave_a_comment: U moet eers %{login_link} alvorens u kommentaar kan
+        lewer
       login: Meld aan
-      login_to_leave_a_comment: U moet eers %{login_link} alvorens u kommentaar kan lewer
       save_button: Stoor
-      title: "%{user} se dagboek | %{title}"
-      user_title: Dagboek van %{user}
-  export: 
-    start: 
-      add_marker: Plaas 'n merker op die kaart
+    no_such_entry:
+      title: Die opgevraagde dagboekinskrywing bestaan nie
+      heading: Die inskrywing met id %{id} bestaan nie
+      body: Jammer, daar is geen dagboekinskrywing of kommentaar met die id %{id}
+        nie. Kontroleer u spelling, of miskien is die skakel waarop u gekliek het
+        verkeerd.
+    diary_entry:
+      posted_by: Gepos deur %{link_user} op %{created} in die %{language_link}
+      comment_link: Lewer kommentaar op hierdie bydrae
+      reply_link: Antwoord op hierdie bydrae
+      comment_count:
+        one: 1 reaksie
+        other: '%{count} reaksies'
+      edit_link: Wysig hierdie inskrywing
+      hide_link: Versteek die inskrywing
+      confirm: Bevestig
+    diary_comment:
+      comment_from: Kommentaar van %{link_user} op %{comment_created_at}
+      hide_link: Versteek die opmerking
+      confirm: Bevestig
+    location:
+      location: 'Ligging:'
+      view: Wys
+      edit: Wysig
+    feed:
+      user:
+        title: OpenStreetMap dagboekinskrywings van %{user}
+        description: Onlangse OpenStreetMap dagboekinskrywings van %{user}
+      language:
+        title: OpenStreetMap dagboekinskrywings in %{language_name}
+        description: Onlangse dagboekinskrywings van OpenStreetMap-gebruikers in %{language_name}
+      all:
+        title: OpenStreetMap dagboekinskrywings
+        description: Onlangse dagboekinskrywings van OpenStreetMap-gebruikers
+    comments:
+      when: Wanneer
+  export:
+    start:
       area_to_export: Area om te eksporteer
-      embeddable_html: HTML-kode
-      export_button: Eksporteer
-      export_details: OpenStreetMap se data is gelisensieer onder die <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.af">Creative Commons Erkenning-Insgelyks Deel 2.0 lisensie</a>.
-      format: "Formaat:"
+      manually_select: Kies 'n ander gebied handmatig
       format_to_export: Lêerformaat
-      image_size: "Prentgrootte:"
-      latitude: "Breedte:"
+      osm_xml_data: OpenStreetMap XML-data
+      embeddable_html: HTML-kode
       licence: Lisensie
-      longitude: "Lengte:"
-      manually_select: Kies 'n ander gebied handmatig
-      max: max
+      export_details: OpenStreetMap se data is gelisensieer onder die <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.af">Creative
+        Commons Erkenning-Insgelyks Deel 2.0 lisensie</a>.
       options: Voorkeure
-      osm_xml_data: OpenStreetMap XML-data
-      output: Afvoer
+      format: 'Formaat:'
       scale: Skaal
+      max: max
+      image_size: 'Prentgrootte:'
       zoom: Zoom
-  geocoder: 
-    description: 
-      title: 
-        geonames: Ligging vanaf <a href="http://www.geonames.org/">GeoNames</a>
-      types: 
-        cities: Stede
-        places: Plekke
-        towns: Dorpe
-    direction: 
-      east: oos
-      north: noord
-      north_east: noordoos
-      north_west: noordwes
-      south: suid
-      south_east: suid-oos
-      south_west: suidwes
-      west: wes
-    distance: 
-      one: ongeveer 1km
-      other: ongeveer %{count}km
-      zero: minder as 1km
-    results: 
-      more_results: Meer resultate
-      no_results: Geen resultate gevind nie
-    search: 
-      title: 
-        ca_postcode: Resultate vanaf <a href="http://geocoder.ca/">Geocoder.CA</a>
-        geonames: Resultate vanaf <a href="http://www.geonames.org/">GeoNames</a>
+      add_marker: Plaas 'n merker op die kaart
+      latitude: 'Breedte:'
+      longitude: 'Lengte:'
+      output: Afvoer
+      export_button: Eksporteer
+  geocoder:
+    search:
+      title:
         latlon: Resultate vanaf <a href="http://openstreetmap.org/">intern</a>
-        uk_postcode: Resultate vanaf <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
         us_postcode: Resultate vanaf <a href="http://geocoder.us/">Geocoder.us</a>
-    search_osm_nominatim: 
-      prefix: 
-        amenity: 
+        uk_postcode: Resultate vanaf <a href="http://www.npemap.org.uk/">NPEMap /
+          FreeThe Postcode</a>
+        ca_postcode: Resultate vanaf <a href="http://geocoder.ca/">Geocoder.CA</a>
+        geonames: Resultate vanaf <a href="http://www.geonames.org/">GeoNames</a>
+    search_osm_nominatim:
+      prefix:
+        amenity:
           airport: Lughawe
           arts_centre: Kunssentrum
           atm: OTM
@@ -300,11 +287,11 @@ af:
           waste_basket: Asblik
           wifi: WiFi-toegang
           youth_centre: Jeugsentrum
-        boundary: 
+        boundary:
           administrative: Administratiewe grens
-        building: 
+        building:
           "yes": Gebou
-        highway: 
+        highway:
           bridleway: Ruiterpad
           bus_stop: Bushalte
           construction: Snelweg in aanbou
@@ -335,7 +322,7 @@ af:
           trunk_link: Trokpad
           unclassified: Ongeklassifiseerde pad
           unsurfaced: Grondpad
-        historic: 
+        historic:
           archaeological_site: Argeologiese vindplaas
           battlefield: Slagveld
           building: Gebou
@@ -353,7 +340,7 @@ af:
           wayside_cross: Kruis langs die pad
           wayside_shrine: Altaar langs die pad
           wreck: Wrak
-        landuse: 
+        landuse:
           allotments: Volkstuine
           cemetery: Begraafplaas
           commercial: Kommersiële gebied
@@ -377,7 +364,7 @@ af:
           vineyard: Wingerd
           wetland: Vleiland
           wood: Bos
-        leisure: 
+        leisure:
           beach_resort: Strandoort
           fishing: Visvangarea
           garden: Tuin
@@ -394,7 +381,7 @@ af:
           swimming_pool: Swembad
           track: Atletiekbaan
           water_park: Waterspeelpark
-        natural: 
+        natural:
           bay: Baai
           beach: Strand
           cape: Kaap
@@ -430,7 +417,7 @@ af:
           wetland: Moeras
           wetlands: Moeras
           wood: Bos
-        place: 
+        place:
           airport: Lughawe
           city: Stad
           country: Land
@@ -452,7 +439,7 @@ af:
           town: Dorp
           unincorporated_area: Geïnkorporeerde Ruimte
           village: Dorp
-        railway: 
+        railway:
           construction: Spoor in aanbou
           disused_station: Ongebruikte spoorwegstasie
           funicular: Kabelspoorweg
@@ -469,7 +456,7 @@ af:
           subway_entrance: Metroingang
           switch: Spoogwegpunte
           tram_stop: Tramhalte
-        shop: 
+        shop:
           art: Kunswinkel
           bakery: Bakkery
           beauty: Skoonheidssalon
@@ -530,7 +517,7 @@ af:
           toys: Speelgoedwinkel
           travel_agency: Reisburo
           video: Video-winkel
-        tourism: 
+        tourism:
           alpine_hut: Berghut
           artwork: Kunswerk
           attraction: Attraksie
@@ -551,7 +538,7 @@ af:
           valley: Vallei
           viewpoint: Uitkykpunt
           zoo: Dieretuin
-        waterway: 
+        waterway:
           boatyard: Skeepswerf
           canal: Kanaal
           connector: Waterverbinding
@@ -566,554 +553,592 @@ af:
           river: Rivier
           riverbank: Rivierbedding
           stream: Stroom
-          water_point: Waterpunt
           waterfall: Waterval
-  javascripts: 
-    map: 
-      base: 
-        cycle_map: Fietskaart
-  layouts: 
-    copyright: Outeursreg & lisensie
-    donate: Ondersteun OpenStreetMap deur aan die Hardeware Opgradeer-fonds te %{link}.
-    edit: Wysig
-    export: Eksporteer
-    gps_traces: GPS-spore
-    gps_traces_tooltip: Beheer GPS-spore
-    history: Geskiedenis
+          water_point: Waterpunt
+    description:
+      title:
+        geonames: Ligging vanaf <a href="http://www.geonames.org/">GeoNames</a>
+      types:
+        cities: Stede
+        towns: Dorpe
+        places: Plekke
+    results:
+      no_results: Geen resultate gevind nie
+      more_results: Meer resultate
+    distance:
+      one: ongeveer 1km
+      zero: minder as 1km
+      other: ongeveer %{count}km
+    direction:
+      south_west: suidwes
+      south: suid
+      south_east: suid-oos
+      east: oos
+      north_east: noordoos
+      north: noord
+      north_west: noordwes
+      west: wes
+  layouts:
+    logo:
+      alt_text: OpenStreetMap-logo
     home: tuis
+    logout: teken af
     log_in: meld aan
     log_in_tooltip: Teken aan met 'n bestaande rekening
-    logo: 
-      alt_text: OpenStreetMap-logo
-    logout: teken af
-    make_a_donation: 
-      text: Maak 'n donasie
-      title: Ondersteun OpenStreetMap met'n geldelike donasie
-    osm_read_only: Die OpenStreetMap-databasis kan op die oomblik slegs gelees word aangesien noodsaaklik onderhoud tans uitgevoer word.
     sign_up: registreer
     sign_up_tooltip: Skep 'n rekening vir wysigings
-    tag_line: Die vrye wiki-wêreldkaart
+    edit: Wysig
+    history: Geskiedenis
+    export: Eksporteer
+    gps_traces: GPS-spore
+    gps_traces_tooltip: Beheer GPS-spore
     user_diaries: Gebruikersdagboeke
     user_diaries_tooltip: Wys gebruikersdagboeke
-  license_page: 
-    foreign: 
+    tag_line: Die vrye wiki-wêreldkaart
+    osm_read_only: Die OpenStreetMap-databasis kan op die oomblik slegs gelees word
+      aangesien noodsaaklik onderhoud tans uitgevoer word.
+    donate: Ondersteun OpenStreetMap deur aan die Hardeware Opgradeer-fonds te %{link}.
+    copyright: Outeursreg & lisensie
+    make_a_donation:
+      title: Ondersteun OpenStreetMap met'n geldelike donasie
+      text: Maak 'n donasie
+  license_page:
+    foreign:
       title: Oor hierdie vertaling
-  message: 
-    delete: 
-      deleted: Boodskap is verwyder
-    inbox: 
-      date: Datum
-      from: Vanaf
+  notifier:
+    diary_comment_notification:
+      subject: '[OpenStreetMap] %{user} het kommentaar op u dagboekinskrywing gelewer'
+      hi: Hallo %{to_user},
+    message_notification:
+      hi: Hallo %{to_user},
+    friend_notification:
+      subject: '[OpenStreetMap] %{user} het u as ''n vriend bygevoeg'
+    gpx_notification:
+      greeting: Hallo,
+      your_gpx_file: Dit lyk soos jou GPX-lêer
+      with_description: met die beskrywing
+      and_the_tags: 'en die volgende etikette:'
+      and_no_tags: en geen etikette.
+      failure:
+        more_info_2: 'hulle kan gevind word by:'
+    signup_confirm:
+      subject: '[OpenStreetMap] Bevestig u e-posadres'
+    email_confirm:
+      subject: '[OpenStreetMap] Bevestig u e-posadres'
+    email_confirm_plain:
+      greeting: Hallo,
+    email_confirm_html:
+      greeting: Hallo,
+      hopefully_you: Iemand (hopelik u) wil graag sy e-posadres op %{server_url} verander
+        na %{new_address}.
+      click_the_link: As dit u is, kliek op die onderstaande skakel om die verandering
+        te bevestig.
+    lost_password:
+      subject: '[OpenStreetMap] Versoek nuwe wagwoord'
+    lost_password_plain:
+      greeting: Hallo,
+      click_the_link: As dit u is, kliek op die onderstaande skakel om die wagwoord
+        te herstel.
+    lost_password_html:
+      greeting: Hallo,
+  message:
+    inbox:
+      title: Inboks
       my_inbox: My inboks
-      no_messages_yet: U het nog geen boodskappe nie. Hoekom kontak u nie sommige van die %{people_mapping_nearby_link} nie?
       outbox: outboks
-      people_mapping_nearby: nabygeleë karteerders
+      from: Vanaf
       subject: Onderwerp
-      title: Inboks
-    mark: 
-      as_read: Boodskap gemerk as gelees
-      as_unread: Boodskap gemerk as ongelees
-    message_summary: 
-      delete_button: Verwyder
+      date: Datum
+      no_messages_yet: U het nog geen boodskappe nie. Hoekom kontak u nie sommige
+        van die %{people_mapping_nearby_link} nie?
+      people_mapping_nearby: nabygeleë karteerders
+    message_summary:
+      unread_button: Merk as ongelees
       read_button: Merk as gelees
       reply_button: Antwoord
-      unread_button: Merk as ongelees
-    new: 
-      back_to_inbox: Terug na inboks
-      body: Teks
-      message_sent: Boodskap is gestuur
-      send_button: Stuur
+      delete_button: Verwyder
+    new:
+      title: Stuur boodskap
       send_message_to: Stuur 'n nuwe boodskap aan %{name}
       subject: Onderwerp
-      title: Stuur boodskap
-    no_such_message: 
-      heading: Die boodskap bestaan nie
+      body: Teks
+      send_button: Stuur
+      back_to_inbox: Terug na inboks
+      message_sent: Boodskap is gestuur
+    no_such_message:
       title: Die boodskap bestaan nie
-    outbox: 
-      date: Datum
-      inbox: inboks
+      heading: Die boodskap bestaan nie
+    outbox:
+      title: Gestuur
       my_inbox: My %{inbox_link}
-      no_sent_messages: U het nog geen boodskappe gestuur nie. Hoekom kontak u nie sommige van die %{people_mapping_nearby_link} nie?
+      inbox: inboks
       outbox: uitboks
-      people_mapping_nearby: nabygeleë karteerders
-      subject: Onderwerp
-      title: Gestuur
       to: Aan
-    read: 
+      subject: Onderwerp
       date: Datum
+      no_sent_messages: U het nog geen boodskappe gestuur nie. Hoekom kontak u nie
+        sommige van die %{people_mapping_nearby_link} nie?
+      people_mapping_nearby: nabygeleë karteerders
+    read:
+      title: Lees boodskap
       from: Van
-      reply_button: Antwoord
       subject: Onderwerp
-      title: Lees boodskap
-      to: Aan
+      date: Datum
+      reply_button: Antwoord
       unread_button: Merk as ongelees
-    sent_message_summary: 
+      to: Aan
+    sent_message_summary:
       delete_button: Verwyder
-  notifier: 
-    diary_comment_notification: 
-      hi: Hallo %{to_user},
-      subject: "[OpenStreetMap] %{user} het kommentaar op u dagboekinskrywing gelewer"
-    email_confirm: 
-      subject: "[OpenStreetMap] Bevestig u e-posadres"
-    email_confirm_html: 
-      click_the_link: As dit u is, kliek op die onderstaande skakel om die verandering te bevestig.
-      greeting: Hallo,
-      hopefully_you: Iemand (hopelik u) wil graag sy e-posadres op %{server_url} verander na %{new_address}.
-    email_confirm_plain: 
-      greeting: Hallo,
-    friend_notification: 
-      subject: "[OpenStreetMap] %{user} het u as 'n vriend bygevoeg"
-    gpx_notification: 
-      and_no_tags: en geen etikette.
-      and_the_tags: "en die volgende etikette:"
-      failure: 
-        more_info_2: "hulle kan gevind word by:"
-      greeting: Hallo,
-      with_description: met die beskrywing
-      your_gpx_file: Dit lyk soos jou GPX-lêer
-    lost_password: 
-      subject: "[OpenStreetMap] Versoek nuwe wagwoord"
-    lost_password_html: 
-      greeting: Hallo,
-    lost_password_plain: 
-      click_the_link: As dit u is, kliek op die onderstaande skakel om die wagwoord te herstel.
-      greeting: Hallo,
-    message_notification: 
-      hi: Hallo %{to_user},
-    signup_confirm: 
-      subject: "[OpenStreetMap] Bevestig u e-posadres"
-  oauth: 
-    oauthorize: 
-      allow_read_prefs: u gebruikersvoorkeure te lees.
-      allow_write_api: die kaart te wysig.
-      allow_write_gpx: Laai GPS-spore op.
-      allow_write_prefs: verander jou gebruikersvoorkeure.
-  oauth_clients: 
-    edit: 
-      submit: Wysig
-      title: Wysig u applikasie
-    form: 
-      allow_read_prefs: lees hulle gebruikersvoorkeure.
-      allow_write_diary: skep dagboekinskrywings, lewer kommentaar en maak vriende.
-      allow_write_prefs: verander hulle gebruikersvoorkeure.
-      name: Naam
-      required: Verplig
-      support_url: Ondersteunings-URL
-      url: Applikasie-URL
-    index: 
-      application: Applikasienaam
-      issued_at: Uitgereik op
-      my_apps: My kliënt-applikasies
-      register_new: Registreer u applikasie
-      revoke: Herroep!
-      title: My OAuth-details
-    new: 
-      submit: Registreer
-      title: Registreer 'n nuwe applikasie
-    not_found: 
-      sorry: Jammer, die %{type} kon nie gevind word nie.
-    show: 
-      allow_read_prefs: lees hulle gebruikersvoorkeure.
-      allow_write_api: wysig die kaart.
-      allow_write_diary: skep dagboekinskrywings, lewer kommentaar en maak vriende.
-      allow_write_gpx: laai GPS-spore op.
-      authorize_url: "URL vir magtiging:"
-      edit: Wysig details
-  site: 
-    edit: 
-      anon_edits_link_text: Lees waarom dit die geval is.
-      user_page_link: gebruikersbladsy
-    index: 
+    mark:
+      as_read: Boodskap gemerk as gelees
+      as_unread: Boodskap gemerk as ongelees
+    delete:
+      deleted: Boodskap is verwyder
+  site:
+    index:
       permalink: Permanente skakel
       shortlink: Kort skakel
-    key: 
-      table: 
-        entry: 
-          admin: Administratiewe grens
-          allotments: Volkstuine
-          apron: 
-            - Lughaweplatform
-            - terminaal
-          bridge: Brug
+    edit:
+      user_page_link: gebruikersbladsy
+      anon_edits_link_text: Lees waarom dit die geval is.
+    sidebar:
+      search_results: Soekresultate
+      close: Sluit
+    search:
+      search: Soek
+      where_am_i: Waar is ek?
+      submit_text: OK
+    key:
+      table:
+        entry:
+          motorway: Snelweg
+          trunk: Trokpad
+          primary: Primêre pad
+          secondary: Sekondêre pad
+          unclassified: Ongeklassifiseerde pad
+          unsurfaced: Grondpad
+          track: Spoor
           bridleway: Ruiterpad
-          brownfield: Braakliggende terrein
-          building: Belangrike gebou
-          cable: 
-            - Kabelkar
-            - stoelhyser
-          cemetery: Begraafplaas
-          centre: Sport-sentrum
-          commercial: Kommersiële gebied
-          common: 
-            - weide
-            - weide
-          construction: Paaie onder konstruksie
           cycleway: Fietspad
-          destination: Bestemmingsverkeer
-          farm: Plaas
           footway: Voetpad
+          rail: Spoorweg
+          subway: Metro
+          tram:
+          - Ligte spoor
+          - tram
+          cable:
+          - Kabelkar
+          - stoelhyser
+          runway:
+          - Lughawe aanloopbaan
+          - taxibaan
+          apron:
+          - Lughaweplatform
+          - terminaal
+          admin: Administratiewe grens
           forest: Bos
+          wood: Bos
           golf: Gholfbaan
-          heathland: Heide
-          industrial: Industriële gebied
-          lake: 
-            - Meer
-            - reservoir
-          military: Militêre gebied
-          motorway: Snelweg
           park: Park
-          permissive: Beperkte toegang
-          pitch: Sportveld
-          primary: Primêre pad
-          private: Privaat toegang
-          rail: Spoorweg
-          reserve: Natuurreservaat
           resident: Woongebied
+          tourist: Toerisme-trekpleister
+          common:
+          - weide
+          - weide
           retail: Winkelgebied
-          runway: 
-            - Lughawe aanloopbaan
-            - taxibaan
-          school: 
-            - Skool
-            - universiteit
-          secondary: Sekondêre pad
+          industrial: Industriële gebied
+          commercial: Kommersiële gebied
+          heathland: Heide
+          lake:
+          - Meer
+          - reservoir
+          farm: Plaas
+          brownfield: Braakliggende terrein
+          cemetery: Begraafplaas
+          allotments: Volkstuine
+          pitch: Sportveld
+          centre: Sport-sentrum
+          reserve: Natuurreservaat
+          military: Militêre gebied
+          school:
+          - Skool
+          - universiteit
+          building: Belangrike gebou
           station: Spoorwegstasie
-          subway: Metro
-          summit: 
-            - Piek
-            - piek
-          tourist: Toerisme-trekpleister
-          track: Spoor
-          tram: 
-            - Ligte spoor
-            - tram
-          trunk: Trokpad
+          summit:
+          - Piek
+          - piek
           tunnel: Tonnel
-          unclassified: Ongeklassifiseerde pad
-          unsurfaced: Grondpad
-          wood: Bos
-    search: 
-      search: Soek
-      submit_text: OK
-      where_am_i: Waar is ek?
-    sidebar: 
-      close: Sluit
-      search_results: Soekresultate
-  time: 
-    formats: 
-      friendly: "%e %B %Y om %H:%M"
-  trace: 
-    create: 
+          bridge: Brug
+          private: Privaat toegang
+          permissive: Beperkte toegang
+          destination: Bestemmingsverkeer
+          construction: Paaie onder konstruksie
+  trace:
+    create:
       upload_trace: Laai GPS-spore op
-    delete: 
-      scheduled_for_deletion: Spoor is geskeduleer vir verwydering
-    edit: 
-      description: "Beskrywing:"
-      download: aflaai
-      edit: wysig
-      filename: "Lêernaam:"
+    edit:
+      title: Wysig spoor %{name}
       heading: Wysig spoor %{name}
+      filename: 'Lêernaam:'
+      download: aflaai
+      uploaded_at: 'Opgelaai op:'
+      points: 'Punte:'
+      start_coord: 'Beginkoördinaat:'
       map: kaart
-      owner: "Eienaar:"
-      points: "Punte:"
-      save_button: Stoor wysigings
-      start_coord: "Beginkoördinaat:"
-      tags: "Etikette:"
+      edit: wysig
+      owner: 'Eienaar:'
+      description: 'Beskrywing:'
+      tags: 'Etikette:'
       tags_help: met kommas geskei
-      title: Wysig spoor %{name}
-      uploaded_at: "Opgelaai op:"
-      visibility: "Sigbaarheid:"
+      save_button: Stoor wysigings
+      visibility: 'Sigbaarheid:'
       visibility_help: wat beteken dit?
-    list: 
-      public_traces: Openbare GPS-spore
-      public_traces_from: Openbare GPS-spore van %{user}
-      tagged_with: geëtiketteer met %{tags}
-      your_traces: U GPS-spore
-    make_public: 
-      made_public: Spoor is openbaar gemaak
-    trace: 
-      ago: "%{time_in_words_ago} gelede"
-      by: deur
-      count_points: "%{count} punte"
-      edit: wysig
-      edit_map: Kaart bewysig
-      identifiable: IDENTIFISEERBAAR
-      in: in
-      map: kaart
-      more: meer
-      pending: BESIG
-      private: PRIVAAT
-      public: OPENBAAR
-      trace_details: Wys spoor besonderhede
-      view_map: Wys kaart
-    trace_form: 
+    trace_form:
+      upload_gpx: Laai GPX-lêer op
       description: Beskrywing
-      help: Hulp
       tags: Etikette
       tags_help: met kommas geskei
-      upload_button: Laai op
-      upload_gpx: Laai GPX-lêer op
       visibility: Sigbaarheid
       visibility_help: wat beteken dit?
-    trace_header: 
+      upload_button: Laai op
+      help: Hulp
+    trace_header:
       see_all_traces: Wys alle spore
       see_your_traces: Sien al u spore
-    trace_optionals: 
+    trace_optionals:
       tags: Etikette
-    trace_paging_nav: 
-      showing_page: Bladsy %{page}
-    view: 
-      delete_track: Verwyder hierdie spoor
-      description: "Beskrywing:"
-      download: laai af
-      edit: wysig
-      edit_track: Wysig hierdie spoor
-      filename: "Lêernaam:"
+    view:
+      title: Besigting spoor %{name}
       heading: Besigtig spoor %{name}
+      pending: BESIG
+      filename: 'Lêernaam:'
+      download: laai af
+      uploaded: 'Opgelaai op:'
+      points: 'Punte:'
+      start_coordinates: 'Beginkoördinaat:'
       map: kaart
+      edit: wysig
+      owner: 'Eienaar:'
+      description: 'Beskrywing:'
+      tags: 'Etikette:'
       none: Geen
-      owner: "Eienaar:"
-      pending: BESIG
-      points: "Punte:"
-      start_coordinates: "Beginkoördinaat:"
-      tags: "Etikette:"
-      title: Besigting spoor %{name}
+      edit_track: Wysig hierdie spoor
+      delete_track: Verwyder hierdie spoor
       trace_not_found: Spoor nie gevind nie!
-      uploaded: "Opgelaai op:"
-      visibility: "Sigbaarheid:"
-  user: 
-    account: 
-      contributor terms: 
-        link text: wat is dit?
-      current email address: "Huidige e-posadres:"
-      email never displayed publicly: (word nie openbaar gemaak nie)
-      flash update success: U gebruikersinligting is verander.
-      home location: "Tuisligging:"
-      image: "Beeld:"
-      latitude: "Breedtegraad:"
-      longitude: "Lengtegraad:"
-      make edits public button: Maak al my wysigings openbaar
-      my settings: My voorkeure
-      new email address: "Nuwe e-posadres:"
-      new image: Voeg beeld by
-      no home location: U het nog nie u huis se ligging ingevoer nie.
-      preferred languages: "Voorkeur tale:"
-      profile description: "Profielbeskrywing:"
-      public editing: 
-        disabled link text: hoekom kan ek niks wysig nie?
-        enabled: Geaktiveer. U is nie anoniem nie en kan inligting wysig.
-        enabled link text: wat is dit?
-        heading: "Openbaar wysigings:"
-      replace image: Vervang die huidige beeld
-      return to profile: Terug na profiel
-      save changes button: Stoor wysigings
-      title: Wysig rekening
-      update home location on click: Opdateer tuisligging wanneer ek op die kaart kliek?
-    confirm: 
-      button: Bevestig
-      heading: Bevestig 'n gebruiker se rekening
-      press confirm button: Kliek op "Bevestig" hieronder om u rekening aktiveer.
-    confirm_email: 
-      button: Bevestig
-      heading: Bevestig verandering van e-posadres
-      success: U e-posadres is bevestig, dankie dat u geregistreer het!
-    list: 
-      confirm: Bevestig geselekteerde gebruikers
-      empty: Geen gebruikers gevind nie
-      heading: Gebruikers
-      hide: Versteek geselekteerde gebruikers
-      summary: "%{name} geskep vanaf %{ip_address} op %{date}"
-      summary_no_ip: "%{name} geskep op %{date}"
-      title: Gebruikers
-    login: 
-      auth failure: Jammer, kon nie met hierdie inligting aanmeld nie.
-      email or username: "E-posadres of gebruikersnaam:"
+      visibility: 'Sigbaarheid:'
+    trace_paging_nav:
+      showing_page: Bladsy %{page}
+    trace:
+      pending: BESIG
+      count_points: '%{count} punte'
+      ago: '%{time_in_words_ago} gelede'
+      more: meer
+      trace_details: Wys spoor besonderhede
+      view_map: Wys kaart
+      edit: wysig
+      edit_map: Kaart bewysig
+      public: OPENBAAR
+      identifiable: IDENTIFISEERBAAR
+      private: PRIVAAT
+      by: deur
+      in: in
+      map: kaart
+    list:
+      public_traces: Openbare GPS-spore
+      your_traces: U GPS-spore
+      public_traces_from: Openbare GPS-spore van %{user}
+      tagged_with: geëtiketteer met %{tags}
+    delete:
+      scheduled_for_deletion: Spoor is geskeduleer vir verwydering
+    make_public:
+      made_public: Spoor is openbaar gemaak
+  oauth:
+    oauthorize:
+      allow_read_prefs: u gebruikersvoorkeure te lees.
+      allow_write_prefs: verander jou gebruikersvoorkeure.
+      allow_write_api: die kaart te wysig.
+      allow_write_gpx: Laai GPS-spore op.
+  oauth_clients:
+    new:
+      title: Registreer 'n nuwe applikasie
+      submit: Registreer
+    edit:
+      title: Wysig u applikasie
+      submit: Wysig
+    show:
+      authorize_url: 'URL vir magtiging:'
+      edit: Wysig details
+      allow_read_prefs: lees hulle gebruikersvoorkeure.
+      allow_write_diary: skep dagboekinskrywings, lewer kommentaar en maak vriende.
+      allow_write_api: wysig die kaart.
+      allow_write_gpx: laai GPS-spore op.
+    index:
+      title: My OAuth-details
+      application: Applikasienaam
+      issued_at: Uitgereik op
+      revoke: Herroep!
+      my_apps: My kliënt-applikasies
+      register_new: Registreer u applikasie
+    form:
+      name: Naam
+      required: Verplig
+      url: Applikasie-URL
+      support_url: Ondersteunings-URL
+      allow_read_prefs: lees hulle gebruikersvoorkeure.
+      allow_write_prefs: verander hulle gebruikersvoorkeure.
+      allow_write_diary: skep dagboekinskrywings, lewer kommentaar en maak vriende.
+    not_found:
+      sorry: Jammer, die %{type} kon nie gevind word nie.
+  user:
+    login:
+      title: Meld aan
       heading: Meld aan
-      login_button: Meld aan
+      email or username: 'E-posadres of gebruikersnaam:'
+      password: 'Wagwoord:'
+      remember: 'Onthou my:'
       lost password link: Wagwoord vergeet?
-      password: "Wagwoord:"
-      remember: "Onthou my:"
-      title: Meld aan
-    logout: 
+      login_button: Meld aan
+      auth failure: Jammer, kon nie met hierdie inligting aanmeld nie.
+    logout:
+      title: Teken af
       heading: Teken van OpenStreetMap af
       logout_button: Teken af
-      title: Teken af
-    lost_password: 
-      email address: "E-posadres:"
+    lost_password:
+      title: Wagwoord vergeet
       heading: Wagwoord vergeet?
+      email address: 'E-posadres:'
       new password button: Herstel wagwoord
       notice email cannot find: Kon nie die e-posadres vind nie, jammer.
-      title: Wagwoord vergeet
-    make_friend: 
-      already_a_friend: U is reeds met %{name} bevriend.
-      failed: Jammer, kon nie %{name} as 'n vriend byvoeg nie.
-      success: "%{name} is nou u vriend."
-    new: 
-      confirm email address: "Bevestig E-posadres:"
-      confirm password: "Bevestig wagwoord:"
-      continue: Gaan voort
-      display name: "Vertoon naam:"
-      email address: "E-posadres:"
-      license_agreement: Deur 'n rekening hier te skep bevestig u dat u akkoord gaan met voorwaarde dat al die werk wat u na OpenStreetMap oplaai onder die <a href="http://creativecommons.org/licenses/by-sa/2.0/deed.af">Creative Commons-lisensie (by-sa)</a> gelisensieer word (nie-eksklusief).
-      not displayed publicly: Word nie publiek vertoon nie (sien <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki-geheimhoudingbeleid insluitend afdeling oor e-posadresse">geheimhoudingbeleid</a>)
-      password: "Wagwoord:"
-      terms accepted: Dankie dat u die nuwe bydraerooreenkoms aanvaar het!
-      title: Skep rekening
-    no_such_user: 
-      body: Daar is geen gebruiker met die naam %{user} nie. Kontroleer u spelling, of die skakel waarop u gekliek het is verkeerd.
-      heading: Die gebruiker %{user} bestaan nie
-      title: Gebruiker bestaan nie
-    popup: 
-      friend: Vriend
-      nearby mapper: Nabygeleë karteerder
-      your location: U ligging
-    remove_friend: 
-      not_a_friend: "%{name} is nie een van u vriende nie."
-      success: "%{name} is uit u lys van vriende verwyder."
-    reset_password: 
-      confirm password: "Bevestig wagwoord:"
-      flash changed: U wagwoord is verander.
+    reset_password:
+      title: Herstel wagwoord
       heading: Herstel wagwoord vir %{user}
-      password: "Wagwoord:"
+      password: 'Wagwoord:'
+      confirm password: 'Bevestig wagwoord:'
       reset: Kry nuwe wagwoord
-      title: Herstel wagwoord
-    set_home: 
-      flash success: U tuisligging is suksesvol gebêre
-    suspended: 
-      webmaster: webmeester
-    terms: 
+      flash changed: U wagwoord is verander.
+    new:
+      title: Skep rekening
+      license_agreement: Deur 'n rekening hier te skep bevestig u dat u akkoord gaan
+        met voorwaarde dat al die werk wat u na OpenStreetMap oplaai onder die <a
+        href="http://creativecommons.org/licenses/by-sa/2.0/deed.af">Creative Commons-lisensie
+        (by-sa)</a> gelisensieer word (nie-eksklusief).
+      email address: 'E-posadres:'
+      confirm email address: 'Bevestig E-posadres:'
+      not displayed publicly: Word nie publiek vertoon nie (sien <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
+        title="wiki-geheimhoudingbeleid insluitend afdeling oor e-posadresse">geheimhoudingbeleid</a>)
+      display name: 'Vertoon naam:'
+      password: 'Wagwoord:'
+      confirm password: 'Bevestig wagwoord:'
+      continue: Gaan voort
+      terms accepted: Dankie dat u die nuwe bydraerooreenkoms aanvaar het!
+    terms:
+      title: Bydraerooreenkoms
+      heading: Voorwaardes vir bydraes
       agree: Aanvaar
       decline: Weier
-      heading: Voorwaardes vir bydraes
-      legale_names: 
+      legale_names:
         france: Frankryk
         italy: Italië
         rest_of_world: Res van die wêreld
-      title: Bydraerooreenkoms
-    view: 
-      activate_user: aktiveer hierdie gebruiker
-      add as friend: voeg by as vriend
-      ago: (%{time_in_words_ago} gelede)
-      block_history: wys blokkades ontvang
-      blocks by me: blokkades deur my
-      blocks on me: blokkades op my
-      confirm: Bevestig
-      confirm_user: bevestig hierdie gebruiker
-      create_block: blokkeer die gebruiker
-      created from: "Geskep vanaf:"
-      deactivate_user: deaktiveer hierdie gebruiker
-      delete_user: skrap die gebruiker
-      description: Beskrywing
-      diary: dagboek
-      edits: wysigings
-      email address: "E-posadres:"
-      hide_user: versteek hierdie gebruiker
-      if set location: As u u ligging stel, sal 'n pragtige kaart en ander inligting hieronder verskyn. U kan u ligging stel in u %{settings_link}.
-      km away: "%{count}km vêr"
-      m away: "%{count}m vêr"
-      mapper since: "Karteer sedert:"
-      moderator_history: wys blokkades uitgedeel
+    no_such_user:
+      title: Gebruiker bestaan nie
+      heading: Die gebruiker %{user} bestaan nie
+      body: Daar is geen gebruiker met die naam %{user} nie. Kontroleer u spelling,
+        of die skakel waarop u gekliek het is verkeerd.
+    view:
       my diary: my dagboek
+      new diary entry: nuwe dagboekinskrywing
       my edits: my wysigings
-      my settings: my voorkeure
       my traces: my spore
-      nearby users: Ander nabygeleë gebruikers
-      new diary entry: nuwe dagboekinskrywing
-      no friends: U het nog geen vriende bygevoeg nie.
-      no nearby users: Daar is nog geen gebruikers wat herken dat hulle nabygeleë karterinswerk doen nie.
+      my settings: my voorkeure
       oauth settings: Oauth-instellings
+      blocks on me: blokkades op my
+      blocks by me: blokkades deur my
+      send message: stuur boodskap
+      diary: dagboek
+      edits: wysigings
+      traces: spore
       remove as friend: verwyder as vriend
-      role: 
+      add as friend: voeg by as vriend
+      mapper since: 'Karteer sedert:'
+      ago: (%{time_in_words_ago} gelede)
+      email address: 'E-posadres:'
+      created from: 'Geskep vanaf:'
+      status: 'Status:'
+      spam score: 'SPAM-telling:'
+      description: Beskrywing
+      user location: Ligging van gebruiker
+      if set location: As u u ligging stel, sal 'n pragtige kaart en ander inligting
+        hieronder verskyn. U kan u ligging stel in u %{settings_link}.
+      settings_link_text: voorkeure
+      your friends: U vriende
+      no friends: U het nog geen vriende bygevoeg nie.
+      km away: '%{count}km vêr'
+      m away: '%{count}m vêr'
+      nearby users: Ander nabygeleë gebruikers
+      no nearby users: Daar is nog geen gebruikers wat herken dat hulle nabygeleë
+        karterinswerk doen nie.
+      role:
         administrator: Hierdie gebruiker is 'n administrateur
-        grant: 
+        moderator: Hierdie gebruiker is 'n moderator
+        grant:
           administrator: Trek adminregte terug
           moderator: Ken moderatorregte toe
-        moderator: Hierdie gebruiker is 'n moderator
-        revoke: 
+        revoke:
           administrator: Trek adminregte terug
           moderator: Trek moderatorregte terug
-      send message: stuur boodskap
-      settings_link_text: voorkeure
-      spam score: "SPAM-telling:"
-      status: "Status:"
-      traces: spore
+      block_history: wys blokkades ontvang
+      moderator_history: wys blokkades uitgedeel
+      create_block: blokkeer die gebruiker
+      activate_user: aktiveer hierdie gebruiker
+      deactivate_user: deaktiveer hierdie gebruiker
+      confirm_user: bevestig hierdie gebruiker
+      hide_user: versteek hierdie gebruiker
       unhide_user: maak die gebruiker weer sigbaar
-      user location: Ligging van gebruiker
-      your friends: U vriende
-  user_block: 
-    blocks_by: 
-      empty: "%{name} het nog geen blokkades uitgevoer nie."
-      heading: Lys van blokkades deur %{name}
-      title: Blokkades deur %{name}
-    blocks_on: 
-      empty: "%{name} is nog nooit geblokkeer nie."
-      heading: Lys van blokkades teen %{name}
-      title: Blokkades vir %{name}
-    create: 
-      flash: Het gebruiker %{name} geblokkeer.
-      try_contacting: Kontak asseblief die gebruiker en gee hom 'n redelike tyd om te reageer alvorens u hom blokkeer.
-      try_waiting: Gee die gebruikers asseblief 'n redelike tyd om te reageer voordat u 'n blokkade instel.
-    edit: 
+      delete_user: skrap die gebruiker
+      confirm: Bevestig
+    popup:
+      your location: U ligging
+      nearby mapper: Nabygeleë karteerder
+      friend: Vriend
+    account:
+      title: Wysig rekening
+      my settings: My voorkeure
+      current email address: 'Huidige e-posadres:'
+      new email address: 'Nuwe e-posadres:'
+      email never displayed publicly: (word nie openbaar gemaak nie)
+      public editing:
+        heading: 'Openbaar wysigings:'
+        enabled: Geaktiveer. U is nie anoniem nie en kan inligting wysig.
+        enabled link text: wat is dit?
+        disabled link text: hoekom kan ek niks wysig nie?
+      contributor terms:
+        link text: wat is dit?
+      profile description: 'Profielbeskrywing:'
+      preferred languages: 'Voorkeur tale:'
+      image: 'Beeld:'
+      new image: Voeg beeld by
+      replace image: Vervang die huidige beeld
+      home location: 'Tuisligging:'
+      no home location: U het nog nie u huis se ligging ingevoer nie.
+      latitude: 'Breedtegraad:'
+      longitude: 'Lengtegraad:'
+      update home location on click: Opdateer tuisligging wanneer ek op die kaart
+        kliek?
+      save changes button: Stoor wysigings
+      make edits public button: Maak al my wysigings openbaar
+      return to profile: Terug na profiel
+      flash update success: U gebruikersinligting is verander.
+    confirm:
+      heading: Bevestig 'n gebruiker se rekening
+      press confirm button: Kliek op "Bevestig" hieronder om u rekening aktiveer.
+      button: Bevestig
+    confirm_email:
+      heading: Bevestig verandering van e-posadres
+      button: Bevestig
+      success: U e-posadres is bevestig, dankie dat u geregistreer het!
+    set_home:
+      flash success: U tuisligging is suksesvol gebêre
+    make_friend:
+      success: '%{name} is nou u vriend.'
+      failed: Jammer, kon nie %{name} as 'n vriend byvoeg nie.
+      already_a_friend: U is reeds met %{name} bevriend.
+    remove_friend:
+      success: '%{name} is uit u lys van vriende verwyder.'
+      not_a_friend: '%{name} is nie een van u vriende nie.'
+    list:
+      title: Gebruikers
+      heading: Gebruikers
+      summary: '%{name} geskep vanaf %{ip_address} op %{date}'
+      summary_no_ip: '%{name} geskep op %{date}'
+      confirm: Bevestig geselekteerde gebruikers
+      hide: Versteek geselekteerde gebruikers
+      empty: Geen gebruikers gevind nie
+    suspended:
+      webmaster: webmeester
+  user_role:
+    grant:
+      title: Bevestig toekenning van rol
+      heading: Bevestig toekenning van rol
+      confirm: Bevestig
+    revoke:
+      title: Bevestig herroeping van rol
+      heading: Bevestig herroeping van rol
+      confirm: Bevestig
+  user_block:
+    not_found:
+      sorry: Jammer, die gebruiker met ID %{id} kon nie gevind word nie.
+      back: Terug na die indeks
+    new:
+      heading: Skep blokkade op %{name}
+      submit: Skep blokkade
       back: Wys alle blokkades
+    edit:
+      title: Wysig blokkade op %{name}
       heading: Wysig blokkade op %{name}
-      show: Wys hierdie blokkade
       submit: Opdateer blokkade
-      title: Wysig blokkade op %{name}
-    helper: 
-      time_future: Verval oor %{time}.
-      time_past: Het %{time} gelede verval.
-      until_login: Aktief totdat die gebruiker aanmeld.
-    index: 
-      empty: Daar is nog geen blokkades ingestel nie.
-      heading: Lys van gebruikersblokkades
-      title: Gebruikersblokkades
-    new: 
+      show: Wys hierdie blokkade
       back: Wys alle blokkades
-      heading: Skep blokkade op %{name}
-      submit: Skep blokkade
-    not_found: 
-      back: Terug na die indeks
-      sorry: Jammer, die gebruiker met ID %{id} kon nie gevind word nie.
-    partial: 
-      confirm: Is u seker?
-      creator_name: Skepper
-      display_name: Geblokkeerde gebruiker
-      edit: Wysig
-      not_revoked: (nie herroep nie)
-      reason: Rede vir blokkade
-      revoke: Terugtrek
-      revoker_name: Teruggetrek deur
-      show: Wys
-      status: Status
-    period: 
-      one: 1 uur
-      other: "%{count} ure"
-    revoke: 
+    create:
+      try_contacting: Kontak asseblief die gebruiker en gee hom 'n redelike tyd om
+        te reageer alvorens u hom blokkeer.
+      try_waiting: Gee die gebruikers asseblief 'n redelike tyd om te reageer voordat
+        u 'n blokkade instel.
+      flash: Het gebruiker %{name} geblokkeer.
+    update:
+      success: Die blokkade is opgedateer.
+    index:
+      title: Gebruikersblokkades
+      heading: Lys van gebruikersblokkades
+      empty: Daar is nog geen blokkades ingestel nie.
+    revoke:
       confirm: Is u seker u wil hierdie blokkade terugtrek?
-      flash: Hierdie blokkade is teruggetrek.
       revoke: Terugtrek
-    show: 
-      back: Wys alle blokkades
-      confirm: Is u seker?
+      flash: Hierdie blokkade is teruggetrek.
+    period:
+      one: 1 uur
+      other: '%{count} ure'
+    partial:
+      show: Wys
       edit: Wysig
-      heading: "%{block_on} geblokkeer deur %{block_by}"
-      needs_view: Die gebruiker moet aanmeld alvorens hierdie blokkade verwyder sal word.
-      reason: "Rede vir blokkade:"
       revoke: Terugtrek
-      revoker: "Teruggetrek deur:"
-      show: Wys
+      confirm: Is u seker?
+      display_name: Geblokkeerde gebruiker
+      creator_name: Skepper
+      reason: Rede vir blokkade
       status: Status
+      revoker_name: Teruggetrek deur
+      not_revoked: (nie herroep nie)
+    helper:
+      time_future: Verval oor %{time}.
+      until_login: Aktief totdat die gebruiker aanmeld.
+      time_past: Het %{time} gelede verval.
+    blocks_on:
+      title: Blokkades vir %{name}
+      heading: Lys van blokkades teen %{name}
+      empty: '%{name} is nog nooit geblokkeer nie.'
+    blocks_by:
+      title: Blokkades deur %{name}
+      heading: Lys van blokkades deur %{name}
+      empty: '%{name} het nog geen blokkades uitgevoer nie.'
+    show:
+      title: '%{block_on} geblokkeer deur %{block_by}'
+      heading: '%{block_on} geblokkeer deur %{block_by}'
       time_future: Verval oor %{time}
       time_past: Het %{time} gelede verval
-      title: "%{block_on} geblokkeer deur %{block_by}"
-    update: 
-      success: Die blokkade is opgedateer.
-  user_role: 
-    grant: 
-      confirm: Bevestig
-      heading: Bevestig toekenning van rol
-      title: Bevestig toekenning van rol
-    revoke: 
-      confirm: Bevestig
-      heading: Bevestig herroeping van rol
-      title: Bevestig herroeping van rol
+      status: Status
+      show: Wys
+      edit: Wysig
+      revoke: Terugtrek
+      confirm: Is u seker?
+      reason: 'Rede vir blokkade:'
+      back: Wys alle blokkades
+      revoker: 'Teruggetrek deur:'
+      needs_view: Die gebruiker moet aanmeld alvorens hierdie blokkade verwyder sal
+        word.
+  javascripts:
+    map:
+      base:
+        cycle_map: Fietskaart
+...
index d6ac17cf642180961691e9f156a2f0bdca1ef404..3e852d4517ab20885c4a6786c88f31881dafdc94 100644 (file)
@@ -1,6 +1,6 @@
 # Messages for Gheg Albanian (Gegë)
 # Exported from translatewiki.net
-# Export driver: syck-pecl
+# Export driver: phpyaml
 # Author: Albiona
 # Author: Alket
 # Author: Ardian
 # Author: MicroBoy
 # Author: Nemo bis
 # Author: 아라
-aln: 
-  activerecord: 
-    attributes: 
-      diary_comment: 
-        body: Organ
-      diary_entry: 
-        language: Gjuha
-        latitude: Gjerësi
-        longitude: Gjatësi
-        title: Titulli
-        user: Përdorues
-      friend: 
-        friend: Mik
-        user: Përdorues
-      message: 
-        body: Organ
-        recipient: Marrës
-        sender: Dërguesi
-        title: Titulli
-      trace: 
-        description: Përshkrim
-        latitude: Gjerësi
-        longitude: Gjatësi
-        name: Emni
-        public: Publik
-        size: Madhësia
-        user: Përdorues
-        visible: I dukshëm
-      user: 
-        active: Aktiv
-        description: Përshkrimi
-        display_name: Emri Display
-        email: Email
-        languages: Gjuhët
-        pass_crypt: Fjalëkalimi
-    models: 
+---
+aln:
+  time:
+    formats:
+      friendly: '%e %B %Y te %H:%M'
+  activerecord:
+    models:
       acl: Lista Access Control
       changeset: Changeset
       changeset_tag: Changeset Tag
@@ -80,191 +51,202 @@ aln:
       way: Mënyrë
       way_node: Nyja Way
       way_tag: Rruga Tag
-  application: 
-    require_cookies: 
-      cookies_needed: Ju duket se kanë cookies aftësi të kufizuara - ju lutemi aktivizoni cookies në browserin tuaj para se të vazhdoni.
-    setup_user_auth: 
-      blocked: qasja juaj në API është bllokuar. Ju lutemi të log-in për ndërfaqe web për të mësuar më shumë.
-  browse: 
-    changeset: 
+    attributes:
+      diary_comment:
+        body: Organ
+      diary_entry:
+        user: Përdorues
+        title: Titulli
+        latitude: Gjerësi
+        longitude: Gjatësi
+        language: Gjuha
+      friend:
+        user: Përdorues
+        friend: Mik
+      trace:
+        user: Përdorues
+        visible: I dukshëm
+        name: Emni
+        size: Madhësia
+        latitude: Gjerësi
+        longitude: Gjatësi
+        public: Publik
+        description: Përshkrim
+      message:
+        sender: Dërguesi
+        title: Titulli
+        body: Organ
+        recipient: Marrës
+      user:
+        email: Email
+        active: Aktiv
+        display_name: Emri Display
+        description: Përshkrimi
+        languages: Gjuhët
+        pass_crypt: Fjalëkalimi
+  browse:
+    changeset:
+      title: Ndryshim
       changesetxml: Ndryshim en XML
-      feed: 
+      osmchangexml: Ndryshim i OSM-s en XML
+      feed:
         title: Ndryshim %{id}
         title_comment: Ndryshimi %{id} - %{comment}
-      osmchangexml: Ndryshim i OSM-s en XML
-      title: Ndryshim
-    containing_relation: 
+    relation_member:
+      entry_role: '%{type} %{name} asht si %{role}'
+      type:
+        node: Nyje
+        way: Udhë
+        relation: Lidhje
+    containing_relation:
       entry: Lidhja %{relation_name}
       entry_role: Lidhja %{relation_name} (sikur %{relation_role})
-    not_found: 
+    not_found:
       sorry: Na vjen keq, %{type} me ID %{id}, nuk mujti me u gjetë.
-      type: 
+      type:
+        node: pikë
+        way: udhë
+        relation: lidhje
         changeset: shka asht ndrrue
+    timeout:
+      sorry: Kerkojme falje, t'dhanunat për %{type} me %{id}, u vanuen shumë për me
+        u rigjetë.
+      type:
         node: pikë
+        way: rrugë
         relation: lidhje
-        way: udhë
-    relation_member: 
-      entry_role: "%{type} %{name} asht si %{role}"
-      type: 
-        node: Nyje
-        relation: Lidhje
-        way: Udhë
-    start_rjs: 
+        changeset: shka asht ndryshue
+    start_rjs:
       load_data: Ngarkoji të dhanunat
       loading: Tu u ngarkue...
-    tag_details: 
-      tags: "Etiketat:"
-      wiki_link: 
+    tag_details:
+      tags: 'Etiketat:'
+      wiki_link:
         key: Pērshkrimi i wiki faqes pēr %{key} tag
         tag: Pērshkrimi i wiki faqes pēr %{key}=%{value} tag
-      wikipedia_link: "%{page} artikulli nē Wikipedia"
-    timeout: 
-      sorry: Kerkojme falje, t'dhanunat për %{type} me %{id}, u vanuen shumë për me u rigjetë.
-      type: 
-        changeset: shka asht ndryshue
-        node: pikë
-        relation: lidhje
-        way: rrugë
-  changeset: 
-    changeset: 
+      wikipedia_link: '%{page} artikulli nē Wikipedia'
+  changeset:
+    changeset_paging_nav:
+      showing_page: Tu e shfaq faqen %{page}
+      next: Tjetra »
+      previous: «Previous
+    changeset:
       anonymous: Anonim
       no_edits: (Nuk ka redaktimet)
       view_changeset_details: Shikoni detajet changeset
-    changeset_paging_nav: 
-      next: Tjetra »
-      previous: «Previous
-      showing_page: Tu e shfaq faqen %{page}
-    changesets: 
-      area: Zonë
-      comment: Koment
+    changesets:
       id: ID
       saved_at: Ruhen në
       user: Përdorues
-    list: 
+      comment: Koment
+      area: Zonë
+    list:
       title: Changesets
       title_user: Changesets nga %{user}
-  diary_entry: 
-    diary_comment: 
-      comment_from: Komenti prej %{link_user} në %{comment_created_at}
-      confirm: Konfirmo
-      hide_link: Mshefe këtë koment
-    diary_entry: 
-      comment_count: 
-        one: 1 koment
-        other: "%{count} komente"
-      comment_link: Komento në këtë shënim
-      confirm: Konfirmoje
-      edit_link: Ndryshoje qët shënim
-      hide_link: Mshefe qët shënim
-      posted_by: U postu prej %{link_user} më %{created} n'%{language_link}
-      reply_link: Përgjigje për këtë term
-    edit: 
-      body: "Trupi:"
-      language: "Gjuha:"
-      latitude: "Latitude:"
-      location: "Lokacioni:"
-      longitude: "Gjatësi:"
-      marker_text: Vendndodhja Ditari hyrje
-      save_button: Ruje
-      subject: "Titulli:"
-      title: hyrje Edit ditar
-      use_map_link: Harta e përdorimit
-    feed: 
-      all: 
-        description: Shënimet mat fundit të ditarit nga anëtarët e OpenStreetMap
-        title: hyra OpenStreetMap ditar
-      language: 
-        description: shënimeve ditar nga përdoruesit e fundit të OpenStreetMap në %{language_name}
-        title: shënimet në ditar OpenStreetMap në %{language_name}
-      user: 
-        description: shënimet e fundit OpenStreetMap ditar nga %{user}
-        title: hyra OpenStreetMap ditar për %{user}
-    list: 
+  diary_entry:
+    new:
+      title: Hyrja e re Ditari
+    list:
+      title: ditarë Përdorues ,
+      user_title: Ditari i %{user}
       in_language_title: Shënimet e Ditarit në %{language}
       new: Hyrja e re Ditari
       new_title: Shkruaj një hyrje e re në ditarin tuaj përdorues
-      newer_entries: Shënimet Ma Të Reja
       no_entries: Nuk ka shënime në ditar
+      recent_entries: 'shënimet e fundit ditar:'
       older_entries: Shënimet e Vjetra
-      recent_entries: "shënimet e fundit ditar:"
-      title: ditarë Përdorues ,
-      user_title: Ditari i %{user}
-    location: 
-      edit: Ndrysho
-      location: "Lokacioni:"
-      view: Kshyre
-    new: 
-      title: Hyrja e re Ditari
-    no_such_entry: 
-      body: Me na fal, por nuk ka shënim në ditar ose koment me id %{id}. Ju lutem shihni drejtshkrimin, ose lidhja që keni kliku asht gabim.
-      heading: "Nuk ka shënim me id: %{id}"
-      title: Nuk ka hyrje të tilla ditar
-    view: 
-      leave_a_comment: Lene naj koment
-      login: Hyrje
-      login_to_leave_a_comment: "%{login_link} për me lon koment"
+      newer_entries: Shënimet Ma Të Reja
+    edit:
+      title: hyrje Edit ditar
+      subject: 'Titulli:'
+      body: 'Trupi:'
+      language: 'Gjuha:'
+      location: 'Lokacioni:'
+      latitude: 'Latitude:'
+      longitude: 'Gjatësi:'
+      use_map_link: Harta e përdorimit
       save_button: Ruje
+      marker_text: Vendndodhja Ditari hyrje
+    view:
       title: ditari i %{user} | %{title}
       user_title: ditari i %{user}
-  export: 
-    start: 
-      add_marker: Shto ni shenues en harte
+      leave_a_comment: Lene naj koment
+      login_to_leave_a_comment: '%{login_link} për me lon koment'
+      login: Hyrje
+      save_button: Ruje
+    no_such_entry:
+      title: Nuk ka hyrje të tilla ditar
+      heading: 'Nuk ka shënim me id: %{id}'
+      body: Me na fal, por nuk ka shënim në ditar ose koment me id %{id}. Ju lutem
+        shihni drejtshkrimin, ose lidhja që keni kliku asht gabim.
+    diary_entry:
+      posted_by: U postu prej %{link_user} më %{created} n'%{language_link}
+      comment_link: Komento në këtë shënim
+      reply_link: Përgjigje për këtë term
+      comment_count:
+        one: 1 koment
+        other: '%{count} komente'
+      edit_link: Ndryshoje qët shënim
+      hide_link: Mshefe qët shënim
+      confirm: Konfirmoje
+    diary_comment:
+      comment_from: Komenti prej %{link_user} në %{comment_created_at}
+      hide_link: Mshefe këtë koment
+      confirm: Konfirmo
+    location:
+      location: 'Lokacioni:'
+      view: Kshyre
+      edit: Ndrysho
+    feed:
+      user:
+        title: hyra OpenStreetMap ditar për %{user}
+        description: shënimet e fundit OpenStreetMap ditar nga %{user}
+      language:
+        title: shënimet në ditar OpenStreetMap në %{language_name}
+        description: shënimeve ditar nga përdoruesit e fundit të OpenStreetMap në
+          %{language_name}
+      all:
+        title: hyra OpenStreetMap ditar
+        description: Shënimet mat fundit të ditarit nga anëtarët e OpenStreetMap
+  export:
+    start:
       area_to_export: Zona për Eksport
-      embeddable_html: HTML e trupzueshme
-      export_button: Eksporto
-      export_details: T'dhanat e OpenStreetMap jan te licensume nën <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative Commons Attribution-ShareAlike 2.0 license</a>.
-      format: Formati
+      manually_select: Manualisht zgedhe ni zon te ndryshme
       format_to_export: Formati për Eksport
-      image_size: Madhsia e Imazhit
-      latitude: "Lat:"
+      osm_xml_data: OpenStreetMap XML të dhana
+      embeddable_html: HTML e trupzueshme
       licence: Licensa
-      longitude: "Lon:"
-      manually_select: Manualisht zgedhe ni zon te ndryshme
-      max: maks
+      export_details: T'dhanat e OpenStreetMap jan te licensume nën <a href="http://creativecommons.org/licenses/by-sa/2.0/">Creative
+        Commons Attribution-ShareAlike 2.0 license</a>.
+      too_large:
+        body: Kjo zonë është shum e madhe që të eksportohet si XML në OpenStreetMap.
+          Të lutna afroje ma ngat ose mere një zonë ma të vogel.
       options: Opcionet
-      osm_xml_data: OpenStreetMap XML të dhana
-      output: Outputi
-      paste_html: Fute HTML për me ngjit në web sajt
+      format: Formati
       scale: Shkallë
-      too_large: 
-        body: Kjo zonë është shum e madhe që të eksportohet si XML në OpenStreetMap. Të lutna afroje ma ngat ose mere një zonë ma të vogel.
+      max: maks
+      image_size: Madhsia e Imazhit
       zoom: Zmadho
-  geocoder: 
-    description: 
-      title: 
-        geonames: Lokacioni prej <a href="http://www.geonames.org/">GeoNames</a>
-        osm_nominatim: Lokacioni prej <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
-      types: 
-        cities: Qytetet
-        places: Places
-        towns: Qytetet
-    direction: 
-      east: lindja
-      north: veriu
-      north_east: veri-lindje
-      north_west: veri-perendim
-      south: jug
-      south_east: jug-lindje
-      south_west: jug-perëndim
-      west: perëndim
-    distance: 
-      one: rreth 1km
-      other: rreth %{count}km
-      zero: ma pak se 1km
-    results: 
-      more_results: Më shumë rezultate
-      no_results: Nuk është gjetur asnjë rezultat
-    search: 
-      title: 
-        ca_postcode: Rezultatet prej <a href="http://geocoder.ca/">Geocoder.CA</a>
-        geonames: Rezultatet prej <a href="http://www.geonames.org/">GeoNames</a>
+      add_marker: Shto ni shenues en harte
+      latitude: 'Lat:'
+      longitude: 'Lon:'
+      output: Outputi
+      paste_html: Fute HTML për me ngjit në web sajt
+      export_button: Eksporto
+  geocoder:
+    search:
+      title:
         latlon: Rezultatet prej <a href="http://openstreetmap.org/">Internal</a>
-        osm_nominatim: Rezultatet prej <a href="http://nominatim.openstreetmap.org/">OpenStreetMap Nominatim</a>
-        uk_postcode: Rezultatet prej <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>
         us_postcode: Rezultatet prej <a href="http://geocoder.us/">Geocoder.us</a>
-    search_osm_nominatim: 
-      prefix: 
-        amenity: 
+        uk_postcode: Rezultatet prej <a href="http://www.npemap.org.uk/">NPEMap /
+          FreeThe Postcode</a>
+        ca_postcode: Rezultatet prej <a href="http://geocoder.ca/">Geocoder.CA</a>
+        osm_nominatim: Rezultatet prej <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>
+        geonames: Rezultatet prej <a href="http://www.geonames.org/">GeoNames</a>
+    search_osm_nominatim:
+      prefix:
+        amenity:
           airport: Airoport
           arts_centre: Art Qendra
           atm: Bankomat
@@ -355,11 +337,11 @@ aln:
           waste_basket: Mbeturinat Shporta
           wifi: WiFi Hyrje
           youth_centre: Qendër Rinore
-        boundary: 
+        boundary:
           administrative: Administrative kufitare
-        building: 
+        building:
           "yes": Ndërtesë
-        highway: 
+        highway:
           bridleway: Rruge pa osfallt
           bus_guideway: Lane udhëzoi Autobuseve
           bus_stop: Stacion i autobusave
@@ -395,7 +377,7 @@ aln:
           trunk_link: rrugën kryesore
           unclassified: Paklasifikuara Road
           unsurfaced: Rrugë pa sipërfaqe
-        historic: 
+        historic:
           archaeological_site: Arkeologjik Faqes
           battlefield: Fushë beteje
           boundary_stone: Kufitare Stone
@@ -414,7 +396,7 @@ aln:
           wayside_cross: Buzë rruge Kryqi
           wayside_shrine: Buzë rruge tempullin
           wreck: Mbytet
-        landuse: 
+        landuse:
           allotments: Ndarje
           basin: Pellgut
           brownfield: Brownfield Toka
@@ -446,7 +428,7 @@ aln:
           vineyard: Vresht
           wetland: Ligatinore
           wood: Druri
-        leisure: 
+        leisure:
           beach_resort: hoteli në plazh
           common: Toke e njejte
           fishing: Zone peshkimi
@@ -466,7 +448,7 @@ aln:
           swimming_pool: Bazen
           track: traka e vrapimit
           water_park: Park uji
-        natural: 
+        natural:
           bay: Gji
           beach: Pllazh
           cape: Kep
@@ -504,7 +486,7 @@ aln:
           wetland: Lagunat
           wetlands: Lagunat
           wood: Dru
-        place: 
+        place:
           airport: Aeroport
           city: Qyteti
           country: Veni
@@ -527,7 +509,7 @@ aln:
           town: Veni
           unincorporated_area: Zone e painkorpuruar
           village: Fshati
-        railway: 
+        railway:
           abandoned: Braktisur hekurudhave
           construction: Hekurudhave në ndërtim
           disused: Hekurudhave papërdorur
@@ -550,7 +532,7 @@ aln:
           tram: Tramvajëve
           tram_stop: Tramvaj Stop
           yard: depo stacioni hekurudhor
-        shop: 
+        shop:
           alcohol: kiosk
           art: Shitore e kafshëve
           bakery: Dyqan buke
@@ -618,7 +600,7 @@ aln:
           travel_agency: Agjenci Turistike
           video: dyqan video
           wine: kiosk
-        tourism: 
+        tourism:
           alpine_hut: Vikendice
           artwork: Puna artistike
           attraction: Qef
@@ -639,7 +621,7 @@ aln:
           valley: Lugine
           viewpoint: Pike shikimi
           zoo: Kopsht Zoologjik
-        waterway: 
+        waterway:
           boatyard: Kantier detar
           canal: Kanal
           connector: lidhës lumë i lundrueshëm
@@ -657,709 +639,881 @@ aln:
           riverbank: banka e lumit
           stream: Lumë
           wadi: luginë
-          water_point: Pika e ujit
           waterfall: Ujëvarë
+          water_point: Pika e ujit
           weir: Pendë
-  javascripts: 
-    map: 
-      base: 
-        cycle_map: Cikli Harta
-    site: 
-      edit_disabled_tooltip: Zoom në hartë për të redaktuar
-      edit_tooltip: Edit Harta
-  layouts: 
-    copyright: Copyright & License
-    donate: OpenStreetMap Mbështetja nga %{link} në Fondin Hardware Upgrade.
-    edit: Ndrysho
-    export: Eksport
-    gps_traces: GPS Gjurmët
-    gps_traces_tooltip: Manage gjurmë GPS
-    history: Historia
+    description:
+      title:
+        osm_nominatim: Lokacioni prej <a href="http://nominatim.openstreetmap.org/">OpenStreetMap
+          Nominatim</a>
+        geonames: Lokacioni prej <a href="http://www.geonames.org/">GeoNames</a>
+      types:
+        cities: Qytetet
+        towns: Qytetet
+        places: Places
+    results:
+      no_results: Nuk është gjetur asnjë rezultat
+      more_results: Më shumë rezultate
+    distance:
+      one: rreth 1km
+      zero: ma pak se 1km
+      other: rreth %{count}km
+    direction:
+      south_west: jug-perëndim
+      south: jug
+      south_east: jug-lindje
+      east: lindja
+      north_east: veri-lindje
+      north: veriu
+      north_west: veri-perendim
+      west: perëndim
+  layouts:
+    logo:
+      alt_text: logo e OpenStreetMap
     home: shtëpi
+    logout: logout
     log_in: log in
     log_in_tooltip: Hyni që me një llogari ekzistuese
-    logo: 
-      alt_text: logo e OpenStreetMap
-    logout: logout
-    make_a_donation: 
-      text: Bëni një donacion
-      title: OpenStreetMap Mbështetje me një donacion monetar
-    osm_offline: Baza e të dhanave të OpenStreetMap niher për niher jasht funksioni derisa disa punë themelore po kryhen në bazën e të dhanave.
-    osm_read_only: Baza e të dhënave OpenStreetMap është aktualisht në mënyrë read-only ndërsa thelbësor bazës së të dhënave mirëmbajtjen puna është kryer.
     sign_up: regjistrohu
     sign_up_tooltip: Krijo një llogari për përpunim
-    tag_line: Free Harta Wiki Botërore
+    edit: Ndrysho
+    history: Historia
+    export: Eksport
+    gps_traces: GPS Gjurmët
+    gps_traces_tooltip: Manage gjurmë GPS
     user_diaries: Përdoruesi Diaries
     user_diaries_tooltip: përdorues ditaret Shiko
-  license_page: 
-    foreign: 
-      english_link: origjinal anglisht
-      text: Në ni ngjarje të ni konflikti me faqen e përkthyme dhe %{english_original_link}, faqja anglisht ka përparsi
+    tag_line: Free Harta Wiki Botërore
+    osm_offline: Baza e të dhanave të OpenStreetMap niher për niher jasht funksioni
+      derisa disa punë themelore po kryhen në bazën e të dhanave.
+    osm_read_only: Baza e të dhënave OpenStreetMap është aktualisht në mënyrë read-only
+      ndërsa thelbësor bazës së të dhënave mirëmbajtjen puna është kryer.
+    donate: OpenStreetMap Mbështetja nga %{link} në Fondin Hardware Upgrade.
+    copyright: Copyright & License
+    make_a_donation:
+      title: OpenStreetMap Mbështetje me një donacion monetar
+      text: Bëni një donacion
+  license_page:
+    foreign:
       title: Rreth kti përkthimi
-    legal_babble: 
-      contributors_ca_html: "<strong> Kanada </ strong>: Përmban të dhëna nga\n   GeoBase ®, GeoGratis (© Departamenti i Natyrore\n   Burimet Kanada), CanVec (Departamenti i Natyrore ©\n   Burimet Kanada), dhe StatCan (Divizioni Gjeografia,\n   Statistika Kanada)."
-      contributors_footer_2_html: "  Përfshirja e të dhënave në OpenStreetMap nuk do të thotë që origjinal\n  dhënave miraton ofrues OpenStreetMap, ofron çdo garanci ose\n  pranon ndonjë përgjegjësi."
-      contributors_gb_html: "<strong> Mbretëria e Bashkuar </ strong>: Përmban të pajisjeve\n   Anketa të dhënat © Crown copyright bazës së të dhënave dhe të drejtë\n   2010."
-      contributors_intro_html: "licencë CC BY-SA jonë kërkon që ju të \"japin origjinal\n  Author kredi të arsyeshme për të mesëm ose të thotë Ti je\n  shfrytëzuar \". Individuale mappers OSM nuk kërkojnë një\n  kreditit mbi dhe më lart që të \"OpenStreetMap\n  kontribuesit \", por kur të dhënat nga një hartës kombëtare\n  agjenci ose burim kryesor ka qenë i përfshirë në\n  OpenStreetMap, ai mund të jetë e arsyeshme për kredi nga ana e tyre direkt\n  riprodhimin e kreditit e tyre apo duke i lidhur me të në këtë faqe."
-      contributors_nz_html: "<strong> Zelanda e Re </ strong>: Përmban të dhëna me burim nga\n   Zelanda e Re Toka e informacionit. Crown Copyright rezervuara."
-      contributors_title_html: kontribuesit tona
-      credit_1_html: "Nëse jeni duke përdorur harta imazhe OpenStreetMap, ne kërkojmë që\n  kreditit tuaj lexon të paktën \"© OpenStreetMap\n  kontribuesit, CC BY-SA \". Nëse jeni duke përdorur të dhëna vetëm në hartë,\n  ne kerkojme \"Organizimi i të dhënave © kontribuesit OpenStreetMap,\n  CC BY-SA \"."
-      credit_2_html: "Ku të jetë e mundur, duhet të jetë OpenStreetMap hyperlinked në <a\n  href = \"http://www.openstreetmap.org/\"> http://www.openstreetmap.org/ </ a>\n  dhe CC BY-SA për <a\n  href = \"http://creativecommons.org/licenses/by-sa/2.0/\"> http://creativecommons.org/licenses/by-sa/2.0/ </ a>. Nëse\n  ju jeni duke përdorur një të mesme, ku lidhjet nuk janë të mundshme (p.sh. një\n  shtypura punë), ne ju sugjerojmë lexuesit tuaj të drejtpërdrejtë të\n  www.openstreetmap.org (ndoshta duke zgjeruar\n  'OpenStreetMap' në këtë adresë të plotë) dhe të\n  www.creativecommons.org."
+      text: Në ni ngjarje të ni konflikti me faqen e përkthyme dhe %{english_original_link},
+        faqja anglisht ka përparsi
+      english_link: origjinal anglisht
+    native:
+      title: Rreth ksaj faqeje
+      text: Ju jeni tu e kshyr versionin në gjuhën shqipe të faqes së autorit. Ju
+        muni me shku në %{native_link} të kësaj faqe, ose ju muni mos me lexu në lidhje
+        me të drejtën e autorit dhe %{mapping_link}
+      native_link: Gegë verzion
+      mapping_link: fillo hartografimin
+    legal_babble:
+      title_html: Copyright
+      intro_1_html: |-
+        OpenStreetMap is <i>open data</i>, licensed under the <a
+        href="http://opendatacommons.org/licenses/odbl/">Open Data
+        Commons Open Database License</a> (ODbL).
+      intro_2_html: |-
+        Ju jeni të lirë ta kopjoni, shpërndani, përcjell dhe përshtatur hartat tona
+          dhe të dhënat, për aq kohë sa ju e kreditit OpenStreetMap e saj
+          kontribuesve. Nëse ju ndryshoni ose me ndërtimin e hartave tona ose të dhëna, ju
+          mund të shpërndani rezultat vetëm në bazë të licencës të njëjtën.
+          <Plotë një
+          href = "http://creativecommons.org/licenses/by-sa/2.0/legalcode"> ligjore
+          <Kod / a> shpjegon të drejtat tuaja dhe të përgjegjësive.
       credit_title_html: Si të kreditit OpenStreetMap
-      intro_1_html: "OpenStreetMap is <i>open data</i>, licensed under the <a\nhref=\"http://opendatacommons.org/licenses/odbl/\">Open Data\nCommons Open Database License</a> (ODbL)."
-      intro_2_html: "Ju jeni të lirë ta kopjoni, shpërndani, përcjell dhe përshtatur hartat tona\n  dhe të dhënat, për aq kohë sa ju e kreditit OpenStreetMap e saj\n  kontribuesve. Nëse ju ndryshoni ose me ndërtimin e hartave tona ose të dhëna, ju\n  mund të shpërndani rezultat vetëm në bazë të licencës të njëjtën.\n  <Plotë një\n  href = \"http://creativecommons.org/licenses/by-sa/2.0/legalcode\"> ligjore\n  <Kod / a> shpjegon të drejtat tuaja dhe të përgjegjësive."
-      more_1_html: "Lexo më shumë lidhje me përdorimin e të dhënave tona në <a\n  href = \"http://wiki.openstreetmap.org/wiki/Legal_FAQ\"> Ligjore\n  FAQ </ a>."
-      more_2_html: "OSM janë kontribuesit kujtoi kurrë për të shtuar të dhënat nga ndonjë\n  Burime copyright (p.sh. Google Maps apo të shtypura harta) pa\n  lejen shprehimisht nga mbajtësit të drejtën e autorit."
+      credit_1_html: |-
+        Nëse jeni duke përdorur harta imazhe OpenStreetMap, ne kërkojmë që
+          kreditit tuaj lexon të paktën "© OpenStreetMap
+          kontribuesit, CC BY-SA ". Nëse jeni duke përdorur të dhëna vetëm në hartë,
+          ne kerkojme "Organizimi i të dhënave © kontribuesit OpenStreetMap,
+          CC BY-SA ".
+      credit_2_html: |-
+        Ku të jetë e mundur, duhet të jetë OpenStreetMap hyperlinked në <a
+          href = "http://www.openstreetmap.org/"> http://www.openstreetmap.org/ </ a>
+          dhe CC BY-SA për <a
+          href = "http://creativecommons.org/licenses/by-sa/2.0/"> http://creativecommons.org/licenses/by-sa/2.0/ </ a>. Nëse
+          ju jeni duke përdorur një të mesme, ku lidhjet nuk janë të mundshme (p.sh. një
+          shtypura punë), ne ju sugjerojmë lexuesit tuaj të drejtpërdrejtë të
+          www.openstreetmap.org (ndoshta duke zgjeruar
+          'OpenStreetMap' në këtë adresë të plotë) dhe të
+          www.creativecommons.org.
       more_title_html: Gjetja më shumë
-      title_html: Copyright
-    native: 
-      mapping_link: fillo hartografimin
-      native_link: Gegë verzion
-      text: Ju jeni tu e kshyr versionin në gjuhën shqipe të faqes së autorit. Ju muni me shku në %{native_link} të kësaj faqe, ose ju muni mos me lexu në lidhje me të drejtën e autorit dhe %{mapping_link}
-      title: Rreth ksaj faqeje
-  message: 
-    delete: 
-      deleted: Mesazhi u fshi
-    inbox: 
-      date: Data
-      from: Prej
+      more_1_html: |-
+        Lexo më shumë lidhje me përdorimin e të dhënave tona në <a
+          href = "http://wiki.openstreetmap.org/wiki/Legal_FAQ"> Ligjore
+          FAQ </ a>.
+      more_2_html: |-
+        OSM janë kontribuesit kujtoi kurrë për të shtuar të dhënat nga ndonjë
+          Burime copyright (p.sh. Google Maps apo të shtypura harta) pa
+          lejen shprehimisht nga mbajtësit të drejtën e autorit.
+      contributors_title_html: kontribuesit tona
+      contributors_intro_html: |-
+        licencë CC BY-SA jonë kërkon që ju të "japin origjinal
+          Author kredi të arsyeshme për të mesëm ose të thotë Ti je
+          shfrytëzuar ". Individuale mappers OSM nuk kërkojnë një
+          kreditit mbi dhe më lart që të "OpenStreetMap
+          kontribuesit ", por kur të dhënat nga një hartës kombëtare
+          agjenci ose burim kryesor ka qenë i përfshirë në
+          OpenStreetMap, ai mund të jetë e arsyeshme për kredi nga ana e tyre direkt
+          riprodhimin e kreditit e tyre apo duke i lidhur me të në këtë faqe.
+      contributors_ca_html: |-
+        <strong> Kanada </ strong>: Përmban të dhëna nga
+           GeoBase ®, GeoGratis (© Departamenti i Natyrore
+           Burimet Kanada), CanVec (Departamenti i Natyrore ©
+           Burimet Kanada), dhe StatCan (Divizioni Gjeografia,
+           Statistika Kanada).
+      contributors_nz_html: |-
+        <strong> Zelanda e Re </ strong>: Përmban të dhëna me burim nga
+           Zelanda e Re Toka e informacionit. Crown Copyright rezervuara.
+      contributors_gb_html: |-
+        <strong> Mbretëria e Bashkuar </ strong>: Përmban të pajisjeve
+           Anketa të dhënat © Crown copyright bazës së të dhënave dhe të drejtë
+           2010.
+      contributors_footer_2_html: |2-
+          Përfshirja e të dhënave në OpenStreetMap nuk do të thotë që origjinal
+          dhënave miraton ofrues OpenStreetMap, ofron çdo garanci ose
+          pranon ndonjë përgjegjësi.
+  notifier:
+    diary_comment_notification:
+      subject: '[OpenStreetMap] %{user} ka komentu në shënimin tond të ditarit'
+      hi: Tung %{to_user},
+      header: '%{from_user} ka komentu në shënimin tond të fundit në ditar tek OpenStreetMap
+        me titullin %{subject}:'
+      footer: Ju muni gjithashtu me lexu komentin te %{readurl} dhe ju muni me komentu
+        te %{commenturl} apo me u përgjigj te %{replyurl}
+    message_notification:
+      hi: Tung %{to_user},
+      header: '%{from_user} ju ka dërgu një mesazh përmes OpenStreetMap me titullin
+        %{subject}:'
+    friend_notification:
+      subject: '[OpenStreetMap] %{user} ju ka shtu juve si një shok'
+      had_added_you: '%{user} ju ka shtu juve si një shok në OpenStreetMap.'
+      see_their_profile: Ju muni me pa profilin e tyre tek %{userurl}.
+      befriend_them: Ju muni gjithashtu me i shtu ata si shokë tek %{befriendurl}.
+    gpx_notification:
+      greeting: Tung,
+      your_gpx_file: Ajo duket si te re dosjen tuaj
+      with_description: me përshkrimin e
+      and_the_tags: 'dhe të mëposhtme tags:'
+      and_no_tags: dhe nuk tags.
+      failure:
+        subject: '[OpenStreetMap] te re dështimit Import'
+        failed_to_import: 'nuk arriti të importit. Këtu është gabim:'
+        more_info_1: Më shumë informacion në lidhje me dështimet e importit te re
+          dhe si për të shmangur
+        more_info_2: 'ato mund të gjenden në:'
+      success:
+        subject: '[OpenStreetMap] Import sukses te re'
+        loaded_successfully: ngarkuar me sukses me %{trace_points} nga një jetë e
+          mundur %{possible_points} piket.
+    signup_confirm:
+      subject: '[OpenStreetMap] Konfirmoje email adresën tonde'
+    email_confirm:
+      subject: '[OpenStreetMap] Konfirmoje email adresën tonde'
+    email_confirm_plain:
+      greeting: Tung,
+      click_the_link: Nëse ky je ti, ju lutem trusni lidhjen e mëposhtme për me konfirmu
+        ndryshimin.
+    email_confirm_html:
+      greeting: Tung,
+      hopefully_you: Dikush (shpresojmë se ju), do të doja të ndryshuar adresën e-mail
+        e tyre gjatë në %{server_url} në %{new_address}.
+      click_the_link: Nëse ky je ti, ju lutem trusni lidhjen e mëposhtme për me konfirmu
+        ndryshimin.
+    lost_password:
+      subject: '[OpenStreetMap] kërkesës Password reset'
+    lost_password_plain:
+      greeting: Tung,
+      click_the_link: Nëse kjo është që ju, ju lutemi klikoni lidhjen më poshtë për
+        të rivendosni fjalëkalimin tuaj.
+    lost_password_html:
+      greeting: Tung,
+      hopefully_you: Dikush (ndoshta ju) ka kërkuar një fjalëkalim për t,u rivendosur
+        në llogarinë openstreetmap.org këtë adresë email-i.
+      click_the_link: Nëse kjo është që ju, ju lutemi klikoni lidhjen më poshtë për
+        të rivendosni fjalëkalimin tuaj.
+  message:
+    inbox:
+      title: Inbox
       my_inbox: postë e mia
-      no_messages_yet: Ju nuk keni asnjë mesazh. Pse nuk po llidheni me disa prej %{people_mapping_nearby_link}?
       outbox: Dalje
-      people_mapping_nearby: njerëzit pranë hartës
+      from: Prej
       subject: Tema
-      title: Inbox
-    mark: 
-      as_read: Mesazhi u bo si i lexum
-      as_unread: Mesazhi u bo si i palexum
-    message_summary: 
-      delete_button: Fshije
+      date: Data
+      no_messages_yet: Ju nuk keni asnjë mesazh. Pse nuk po llidheni me disa prej
+        %{people_mapping_nearby_link}?
+      people_mapping_nearby: njerëzit pranë hartës
+    message_summary:
+      unread_button: Bone si të palexume
       read_button: Bone si të lexume
       reply_button: Ktheje
-      unread_button: Bone si të palexume
-    new: 
-      back_to_inbox: Kthehu në postë
-      body: Organ
-      limit_exceeded: Ju keni dërguar shumë mesazhe kohët e fundit. Ju lutem prisni një kohë para se të dërgoni ndonjë tjetër.
-      message_sent: Mesazhi u dërgu
-      send_button: Dërgo
+      delete_button: Fshije
+    new:
+      title: Qo mesazh
       send_message_to: Qoje një mesazh të ri te %{name}
       subject: Titulli
-      title: Qo mesazh
-    no_such_message: 
-      body: Me na fal por nuk ka asnjë mesazh me at id.
-      heading: Nuk ka ksi mesazhi
+      body: Organ
+      send_button: Dërgo
+      back_to_inbox: Kthehu në postë
+      message_sent: Mesazhi u dërgu
+      limit_exceeded: Ju keni dërguar shumë mesazhe kohët e fundit. Ju lutem prisni
+        një kohë para se të dërgoni ndonjë tjetër.
+    no_such_message:
       title: Nuk ka ksi mesazhi
-    outbox: 
-      date: Data
-      inbox: postë
+      heading: Nuk ka ksi mesazhi
+      body: Me na fal por nuk ka asnjë mesazh me at id.
+    outbox:
+      title: Dalje
       my_inbox: Im %{inbox_link}
-      no_sent_messages: Ju nuk keni dërgu asnjë mesazh. Pse nuk po llidheni me disa prej %{people_mapping_nearby_link}?
+      inbox: postë
       outbox: Dalje
-      people_mapping_nearby: njerëzit pranë hartës
-      subject: Titulli
-      title: Dalje
       to: Te
-    read: 
+      subject: Titulli
       date: Data
+      no_sent_messages: Ju nuk keni dërgu asnjë mesazh. Pse nuk po llidheni me disa
+        prej %{people_mapping_nearby_link}?
+      people_mapping_nearby: njerëzit pranë hartës
+    reply:
+      wrong_user: Ju keni hy si `%{user}' por mesazhi që po doni me ju përgjigj nuk
+        u dërgu për at anëtar. Ju lutem hyni si anëtari korrekt nëse doni me ju përgjigj
+        atij mesazhi.
+    read:
+      title: Lexo mesazhin
       from: Prej
-      reply_button: Përgjigju
       subject: Titulli
-      title: Lexo mesazhin
-      to: Te
+      date: Data
+      reply_button: Përgjigju
       unread_button: Bone si të palexum
-      wrong_user: Ju keni hy si `%{user}' por mesazhi që po doni me lexu nuk u dërgu për ose nga ai anëtar. Ju lutem hyni si anëtari korrekt nëse doni me lexu atë mesazh.
-    reply: 
-      wrong_user: Ju keni hy si `%{user}' por mesazhi që po doni me ju përgjigj nuk u dërgu për at anëtar. Ju lutem hyni si anëtari korrekt nëse doni me ju përgjigj atij mesazhi.
-    sent_message_summary: 
+      to: Te
+      wrong_user: Ju keni hy si `%{user}' por mesazhi që po doni me lexu nuk u dërgu
+        për ose nga ai anëtar. Ju lutem hyni si anëtari korrekt nëse doni me lexu
+        atë mesazh.
+    sent_message_summary:
       delete_button: Fshij
-  notifier: 
-    diary_comment_notification: 
-      footer: Ju muni gjithashtu me lexu komentin te %{readurl} dhe ju muni me komentu te %{commenturl} apo me u përgjigj te %{replyurl}
-      header: "%{from_user} ka komentu në shënimin tond të fundit në ditar tek OpenStreetMap me titullin %{subject}:"
-      hi: Tung %{to_user},
-      subject: "[OpenStreetMap] %{user} ka komentu në shënimin tond të ditarit"
-    email_confirm: 
-      subject: "[OpenStreetMap] Konfirmoje email adresën tonde"
-    email_confirm_html: 
-      click_the_link: Nëse ky je ti, ju lutem trusni lidhjen e mëposhtme për me konfirmu ndryshimin.
-      greeting: Tung,
-      hopefully_you: Dikush (shpresojmë se ju), do të doja të ndryshuar adresën e-mail e tyre gjatë në %{server_url} në %{new_address}.
-    email_confirm_plain: 
-      click_the_link: Nëse ky je ti, ju lutem trusni lidhjen e mëposhtme për me konfirmu ndryshimin.
-      greeting: Tung,
-    friend_notification: 
-      befriend_them: Ju muni gjithashtu me i shtu ata si shokë tek %{befriendurl}.
-      had_added_you: "%{user} ju ka shtu juve si një shok në OpenStreetMap."
-      see_their_profile: Ju muni me pa profilin e tyre tek %{userurl}.
-      subject: "[OpenStreetMap] %{user} ju ka shtu juve si një shok"
-    gpx_notification: 
-      and_no_tags: dhe nuk tags.
-      and_the_tags: "dhe të mëposhtme tags:"
-      failure: 
-        failed_to_import: "nuk arriti të importit. Këtu është gabim:"
-        more_info_1: Më shumë informacion në lidhje me dështimet e importit te re dhe si për të shmangur
-        more_info_2: "ato mund të gjenden në:"
-        subject: "[OpenStreetMap] te re dështimit Import"
-      greeting: Tung,
-      success: 
-        loaded_successfully: ngarkuar me sukses me %{trace_points} nga një jetë e mundur %{possible_points} piket.
-        subject: "[OpenStreetMap] Import sukses te re"
-      with_description: me përshkrimin e
-      your_gpx_file: Ajo duket si te re dosjen tuaj
-    lost_password: 
-      subject: "[OpenStreetMap] kërkesës Password reset"
-    lost_password_html: 
-      click_the_link: Nëse kjo është që ju, ju lutemi klikoni lidhjen më poshtë për të rivendosni fjalëkalimin tuaj.
-      greeting: Tung,
-      hopefully_you: Dikush (ndoshta ju) ka kërkuar një fjalëkalim për t,u rivendosur në llogarinë openstreetmap.org këtë adresë email-i.
-    lost_password_plain: 
-      click_the_link: Nëse kjo është që ju, ju lutemi klikoni lidhjen më poshtë për të rivendosni fjalëkalimin tuaj.
-      greeting: Tung,
-    message_notification: 
-      header: "%{from_user} ju ka dërgu një mesazh përmes OpenStreetMap me titullin %{subject}:"
-      hi: Tung %{to_user},
-    signup_confirm: 
-      subject: "[OpenStreetMap] Konfirmoje email adresën tonde"
-  oauth: 
-    oauthorize: 
-      allow_read_gpx: lexoni privat tuaj GPS gjurmë.
-      allow_read_prefs: lexoni preferencat tuaj të përdoruesit.
-      allow_to: "Lejoni klientin të aplikimit:"
-      allow_write_api: modifikimin e hartes.
-      allow_write_diary: krijojnë të hyra ditar, komentet dhe të bëni miq të rinj.
-      allow_write_gpx: GPS upload gjurmë.
-      allow_write_prefs: ndryshuar parapëlqimet tuaj të përdoruesit.
-      request_access: Aplikacioni %{app_name} po kërkon qasje në llogarinë tonde. Ju lutem kshyrne nëse doni që aplikacioni me i pas kto mundësi. Ju muni me zgjedh sa ma shumë ose sa ma pak që të doni.
-    revoke: 
-      flash: Ju keni revokuar shenjë për %{application}
-  oauth_clients: 
-    create: 
-      flash: Informatat jon regjistru me sukses.
-    destroy: 
-      flash: Shkatërruar kërkesë e klientit regjistrimit
-    edit: 
-      submit: Redaktoj
-      title: Redakto kërkesën tuaj
-    form: 
-      allow_read_gpx: lexo privat GPS gjurmë e tyre.
-      allow_read_prefs: lexoni preferencat e tyre të përdoruesit.
-      allow_write_api: ndryshoje hartën.
-      allow_write_diary: krijojnë të hyra ditar, komentet dhe të bëni miq të rinj.
-      allow_write_gpx: GPS upload gjurmë.
-      allow_write_prefs: ndryshuar parapëlqimet e tyre të përdoruesit.
-      callback_url: Callback URL
-      name: Emni
-      requests: "Kërkesë të drejtat e mëposhtme nga përdoruesit:"
-      required: E kërkume
-      support_url: Asistenca URL
-      url: URL Kryesore Aplikimi
-    index: 
-      application: Emri i Aplikacionit
-      issued_at: Lëshuar në
-      list_tokens: "Argumentet e mëposhtme janë lëshuar për aplikimet në emrin tuaj:"
-      my_apps: Aplikime Klienti im
-      my_tokens: Aplikimet e mia i Autorizuar
-      no_apps: A keni një aplikim që ju do të doja të regjistruar për të përdorur me ne duke përdorur %{oauth} standarde? Ju duhet të regjistroheni kërkesën tuaj para se ajo mund të bëjë kërkesë OAuth për këtë shërbim.
-      register_new: Regjistroje aplikacionin tond
-      registered_apps: "Ju keni aplikimet e mëposhtme klientit të regjistruar:"
-      revoke: Tërheq!
-      title: Detajet e mia OAuth
-    new: 
-      submit: Regjistrohu
-      title: Regjistroje një aplikacion të ri.
-    not_found: 
-      sorry: Na vjen keq, se %{type} nuk mund të gjendet.
-    show: 
-      access_url: "URL Qasja Shenjë:"
-      allow_read_gpx: lexo privat GPS gjurmë e tyre.
-      allow_read_prefs: lexoni preferencat e tyre të përdoruesit.
-      allow_write_api: modifikimin e hartes.
-      allow_write_diary: krijojnë të hyra ditar, komentet dhe të bëni miq të rinj.
-      allow_write_gpx: GPS upload gjurmë.
-      allow_write_prefs: ndryshuar parapëlqimet e tyre të përdoruesit.
-      authorize_url: "Authorise URL:"
-      edit: Edit Details
-      key: "Konsumatorit kryesore:"
-      requests: "Kërkuar të drejtat e mëposhtme nga përdoruesit:"
-      secret: "Konsumatorit Sekret:"
-      support_notice: Ne mbështesim HMAC-SHA1 (rekomandohet) si tekst i thjeshtë në mënyrë SSL.
-      title: Detajet OAuth për %{app_name}
-      url: "URL Kërkesë Shenjë:"
-    update: 
-      flash: Përditësuar më të dhënat e klientit me sukses
-  site: 
-    edit: 
-      anon_edits_link_text: Find out pse kjo është e rastit.
-      flash_player_required: Ju duhet me pas Flash player për me përdor Potlatch, Flash editorin e OpenStreetMap. Ju muni <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">me marr Flash Player nga Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Disa mënyra të tjera</a> janë të mundshme për me editu OpenStreetMap.
-      not_public: Ju nuk keni vendosur redaktimet e juaj të jetë publike.
-      not_public_description: Ju nuk mund të redaktoni hartën e nëse ju një gjë të tillë. Ju mund të vendosni redaktimet e tuaja si publik nga %{user_page} tuaj.
-      potlatch_unsaved_changes: Ju keni para shpëtimit të ndryshimeve. (Për të ruajtur në Potlatch, ju duhet të asnjërën mënyrë e tanishme ose me pikën e, në qoftë se redaktimi në mënyrë të jetojnë, ose klikoni ruani në qoftë se ju keni një buton të shpëtuar.)
-      user_page_link: faqe përdorues
-    index: 
-      js_1: Ju jeni tuj e përdor naj shfletues që nuk e përkrah JavaScript, ose ju e keni ndalu JavaScript.
+    mark:
+      as_read: Mesazhi u bo si i lexum
+      as_unread: Mesazhi u bo si i palexum
+    delete:
+      deleted: Mesazhi u fshi
+  site:
+    index:
+      js_1: Ju jeni tuj e përdor naj shfletues që nuk e përkrah JavaScript, ose ju
+        e keni ndalu JavaScript.
       js_2: OpenStreetMap përdor Java skriptet për planet e saj të rrëshqitshëm.
       permalink: Permalink
       shortlink: Shortlink
-    key: 
-      table: 
-        entry: 
-          admin: kufitare administrative
-          allotments: Ndarje
-          apron: 
-            - aeroportit Aeroporti
-            - terminal
-          bridge: Shtresë e jashtme e Zi = urë
-          bridleway: Bridleway
-          brownfield: site Brownfield
-          building: ndërtimin e rëndësishme
+    edit:
+      not_public: Ju nuk keni vendosur redaktimet e juaj të jetë publike.
+      not_public_description: Ju nuk mund të redaktoni hartën e nëse ju një gjë të
+        tillë. Ju mund të vendosni redaktimet e tuaja si publik nga %{user_page} tuaj.
+      user_page_link: faqe përdorues
+      anon_edits_link_text: Find out pse kjo është e rastit.
+      flash_player_required: Ju duhet me pas Flash player për me përdor Potlatch,
+        Flash editorin e OpenStreetMap. Ju muni <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">me
+        marr Flash Player nga Adobe.com</a>. <a href="http://wiki.openstreetmap.org/wiki/Editing">Disa
+        mënyra të tjera</a> janë të mundshme për me editu OpenStreetMap.
+      potlatch_unsaved_changes: Ju keni para shpëtimit të ndryshimeve. (Për të ruajtur
+        në Potlatch, ju duhet të asnjërën mënyrë e tanishme ose me pikën e, në qoftë
+        se redaktimi në mënyrë të jetojnë, ose klikoni ruani në qoftë se ju keni një
+        buton të shpëtuar.)
+    sidebar:
+      search_results: Rezultatet e Kërkimit
+      close: Mshele
+    search:
+      search: Kërko
+      where_am_i: Ku jom une?
+      where_am_i_title: Përshkruje lokacionin e tanishëm tuj e përdor makinën kërkuese
+      submit_text: Shkoj
+    key:
+      table:
+        entry:
+          motorway: Autostradë
+          trunk: rrugë nacionale
+          primary: Udhë kryesore
+          secondary: rrugë e mesme
+          unclassified: Udhë e paklasifikume
+          unsurfaced: rrugë Unsurfaced
+          track: Udhë
           byway: I parrahur
-          cable: 
-            - teleferik
-            - heqë karrige
-          cemetery: Varrezë
-          centre: Qendër Sportive
-          commercial: Zona Tregtare
-          common: 
-            - I përbashkët
-            - livadh
-          construction: Rrugët në ndërtim e sipër
+          bridleway: Bridleway
           cycleway: Cycleway
-          destination: qasje Destinacioni
-          farm: Ferm
           footway: Këmbësore
+          rail: Hekurudhor
+          subway: Metro
+          tram:
+          - hekurudhor Lehta
+          - tramvaj
+          cable:
+          - teleferik
+          - heqë karrige
+          runway:
+          - Aeroporti i pistës
+          - taxiway
+          apron:
+          - aeroportit Aeroporti
+          - terminal
+          admin: kufitare administrative
           forest: Pyll
+          wood: Druri
           golf: fushë e golfit
-          heathland: Heathland
-          industrial: Zonë Industriale
-          lake: 
-            - Liqe
-            - rezervuar
-          military: Zonë Ushtarake
-          motorway: Autostradë
           park: Park
-          permissive: qasje tolerant
-          pitch: katran Sport
-          primary: Udhë kryesore
-          private: qasje privat
-          rail: Hekurudhor
-          reserve: rezervë Natyra
           resident: Zonë Rezidenciale
+          tourist: tërheqje Turistike
+          common:
+          - I përbashkët
+          - livadh
           retail: zonë me pakicë
-          runway: 
-            - Aeroporti i pistës
-            - taxiway
-          school: 
-            - Shkollë
-            - universitet
-          secondary: rrugë e mesme
+          industrial: Zonë Industriale
+          commercial: Zona Tregtare
+          heathland: Heathland
+          lake:
+          - Liqe
+          - rezervuar
+          farm: Ferm
+          brownfield: site Brownfield
+          cemetery: Varrezë
+          allotments: Ndarje
+          pitch: katran Sport
+          centre: Qendër Sportive
+          reserve: rezervë Natyra
+          military: Zonë Ushtarake
+          school:
+          - Shkollë
+          - universitet
+          building: ndërtimin e rëndësishme
           station: Stacion hekurudhor
-          subway: Metro
-          summit: 
-            - Samiti i
-            - pik
-          tourist: tërheqje Turistike
-          track: Udhë
-          tram: 
-            - hekurudhor Lehta
-            - tramvaj
-          trunk: rrugë nacionale
+          summit:
+          - Samiti i
+          - pik
           tunnel: tunel zorrë thye =
-          unclassified: Udhë e paklasifikume
-          unsurfaced: rrugë Unsurfaced
-          wood: Druri
-    search: 
-      search: Kërko
-      submit_text: Shkoj
-      where_am_i: Ku jom une?
-      where_am_i_title: Përshkruje lokacionin e tanishëm tuj e përdor makinën kërkuese
-    sidebar: 
-      close: Mshele
-      search_results: Rezultatet e Kërkimit
-  time: 
-    formats: 
-      friendly: "%e %B %Y te %H:%M"
-  trace: 
-    create: 
-      trace_uploaded: E dhana jote GPX asht ngarkue edhe osht ka pret futjen en databazë. Kjo zakonisht ndodhë mrena gjysë ore, dhe ni email vjen te ti en fund të përfundimit
+          bridge: Shtresë e jashtme e Zi = urë
+          private: qasje privat
+          permissive: qasje tolerant
+          destination: qasje Destinacioni
+          construction: Rrugët në ndërtim e sipër
+  trace:
+    visibility:
+      private: Private (ndahen vetem si pika anonime të rendituna)
+      public: Publike (shfaqet ne listen e të dhanave si e padukshme, pikat e rendituna)
+      trackable: në gjendje për të gjurmuar (ndahet vetëm si anonim, ka urdhëruar
+        pikë me timestamps)
+      identifiable: E identifikueshme (shfaqet në listën e të dhanave, pikat i urdhëron
+        me orë)
+    create:
       upload_trace: Ngarkoj tdhanat e GPS-it
-    delete: 
-      scheduled_for_deletion: Gjurma u parapa për fshirje
-    edit: 
-      description: "Përshkrimi:"
-      download: shkarko
-      edit: ndryshoje
-      filename: "Emni i fajllit:"
+      trace_uploaded: E dhana jote GPX asht ngarkue edhe osht ka pret futjen en databazë.
+        Kjo zakonisht ndodhë mrena gjysë ore, dhe ni email vjen te ti en fund të përfundimit
+    edit:
+      title: Duke ndryshue të dhanen %{name}
       heading: Ndrysho të dhanën %{name}
+      filename: 'Emni i fajllit:'
+      download: shkarko
+      uploaded_at: 'Të ngarkume:'
+      points: 'Pikët:'
+      start_coord: 'Fillo kordinatën:'
       map: harta
-      owner: "Pronari:"
-      points: "Pikët:"
-      save_button: Ruaj Ndryshimet
-      start_coord: "Fillo kordinatën:"
-      tags: "Etiketat:"
+      edit: ndryshoje
+      owner: 'Pronari:'
+      description: 'Përshkrimi:'
+      tags: 'Etiketat:'
       tags_help: Presje e kufizume
-      title: Duke ndryshue të dhanen %{name}
-      uploaded_at: "Të ngarkume:"
-      visibility: "Dukshmënia:"
+      save_button: Ruaj Ndryshimet
+      visibility: 'Dukshmënia:'
       visibility_help: Çka do me than kjo?
-    list: 
-      public_traces: Të dhanat publike të GPS-it
-      public_traces_from: Të dhana publike të GPS-it pej %{user}
-      tagged_with: " e etikume me %{tags}"
-      your_traces: Të dhanat e GPS-it
-    make_public: 
-      made_public: Gjurma u ba publike
-    offline: 
-      heading: Mbledhsi i GPX asht jasht linje
-      message: Mbledhsi i skedareve GPX dhe sistemi i ngarkimit për momentin janë jasht funksionit.
-    offline_warning: 
-      message: Sistemi i ngarkimit GPX për momentin asht jasht përdonimit
-    trace: 
-      ago: "%{time_in_words_ago} përpara"
-      by: nga
-      count_points: "%{count} pikët"
-      edit: ndrysho
-      edit_map: Ndryshoje Harten
-      identifiable: E identifikueshme
-      in: në
-      map: harta
-      more: ma shumë
-      pending: NË PRITJE
-      private: PRIVATE
-      public: PUBLIKE
-      trace_details: Kshyri detalet e të dhanave
-      trackable: E GJURMUESHME
-      view_map: Kshyre Hartën
-    trace_form: 
+    trace_form:
+      upload_gpx: Ngarko një skedar GPX
       description: Përshkrimi
-      help: Ndihma
       tags: Etiketat
       tags_help: Presje e kufizume
-      upload_button: Ngarko
-      upload_gpx: Ngarko një skedar GPX
       visibility: Dukshmënia
       visibility_help: çka do me than kjo?
-    trace_header: 
+      upload_button: Ngarko
+      help: Ndihma
+    trace_header:
       see_all_traces: Kshyri kejt të dhanat
       see_your_traces: Shikoj kejt të dhanat tuja
-      traces_waiting: Ju keni %{count} të dhëna duke pritur për tu ngrarkuar.Ju lutem pritni deri sa të përfundoj ngarkimi përpara se me ngarku tjetër gjë, pra që mos me blloku rradhën për përdoruesit e tjerë.
-    trace_optionals: 
+      traces_waiting: Ju keni %{count} të dhëna duke pritur për tu ngrarkuar.Ju lutem
+        pritni deri sa të përfundoj ngarkimi përpara se me ngarku tjetër gjë, pra
+        që mos me blloku rradhën për përdoruesit e tjerë.
+    trace_optionals:
       tags: Etiketat
-    trace_paging_nav: 
-      showing_page: Duke shfaqun faqen %{page}
-    view: 
-      delete_track: Fshij kët gjurm
-      description: "Përshkrimi:"
-      download: shkarko
-      edit: ndrysho
-      edit_track: Ndrysho kët gjurm
-      filename: "Emni i fajllit:"
+    view:
+      title: Duke par gjurmën %{name}
       heading: Tuj i kqyr t'dhanat %{name}
+      pending: DUKE PRITUR
+      filename: 'Emni i fajllit:'
+      download: shkarko
+      uploaded: 'Të ngarkume:'
+      points: 'Pikët:'
+      start_coordinates: 'Fillo kordinimin:'
       map: harta
+      edit: ndrysho
+      owner: 'Pronari:'
+      description: 'Përshkrimi:'
+      tags: 'Etiketat:'
       none: Asnjo
-      owner: "Pronari:"
-      pending: DUKE PRITUR
-      points: "Pikët:"
-      start_coordinates: "Fillo kordinimin:"
-      tags: "Etiketat:"
-      title: Duke par gjurmën %{name}
+      edit_track: Ndrysho kët gjurm
+      delete_track: Fshij kët gjurm
       trace_not_found: Gjurma nuk u gjet!
-      uploaded: "Të ngarkume:"
-      visibility: "Dukshmënia:"
-    visibility: 
-      identifiable: E identifikueshme (shfaqet në listën e të dhanave, pikat i urdhëron me orë)
-      private: Private (ndahen vetem si pika anonime të rendituna)
-      public: Publike (shfaqet ne listen e të dhanave si e padukshme, pikat e rendituna)
-      trackable: në gjendje për të gjurmuar (ndahet vetëm si anonim, ka urdhëruar pikë me timestamps)
-  user: 
-    account: 
-      current email address: "Email adresa e tanishme:"
-      delete image: Heke imazhin e tanishëm
-      email never displayed publicly: (asniher su kan publike)
-      flash update success: Informatat e shfrytëzuesit u ndryshuan me sukses.
-      flash update success confirm needed: Informatat e shfyrtezuesit u ndryshan me sukses. Shihni emailin per konfirmim.
-      home location: "Veni juej:"
-      image: "Imazhi:"
-      image size hint: (imazhet katrore s'paku me madhsi 100x100px doken ma mir)
-      keep image: Maje imazhin e tanishëm
-      latitude: "Latituda:"
-      longitude: "Longituda:"
-      make edits public button: Boni gjith ndryshimet e mija publike
-      my settings: Preferencat e mia
-      new email address: "Email adresa e re:"
-      new image: Shto ni imazh
-      no home location: Ju se keni caktu venin e juj.
-      preferred languages: "Gjuhët e parapëlqyme:"
-      profile description: "Pershkrimi i profilit:"
-      public editing: 
-        disabled: E çkyckur dhe smuni me i ndryshu të dhanat, të gjitha ndryshimet e ma hershme jan anonime.
-        disabled link text: pse spo muj me i ndryshue?
-        enabled: E pranishme. Jo anonime dhe muni me i ndryshue t'dhanat.
-        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
-        enabled link text: çka osht kjo?
-        heading: "Ndryshime publike:"
-      public editing note: 
-        heading: Duke ndryshue publikisht
-        text: Niher për niher ndryshimet e juaja janë anonime dhe njerëzit nuk mund të ju dërgojnë mesazhe apo shohin vendndodhjen tuaj. Për të treguar atë që e keni edituar dhe lejojnë njerëzit të lidhen me ju nëpërmjet internetit, kliko butonin më poshtë. <b> Që nga ndryshimi 0,6 API, vetëm përdoruesit e publikut mund të redaktoni të dhënat hartë </ b>. (<a Href="http://wiki.openstreetmap.org/wiki/Anonymous_edits"> gjeni se pse </ a>). <ul> <li> Adresa juaj e emailit nuk do të zbulohet duke u bërë publik. </ Li > <li> Ky veprim nuk mund të kthehet dhe të gjithë përdoruesit e rinj janë tashmë publik nga default. </ li> </ ul>
-      replace image: Ndryshoje imazhin e tanishëm
-      return to profile: Kthehu te profili
-      save changes button: Ruaj Ndryshimet
-      title: Ndrysho akountin
-      update home location on click: Ndryshoma venin kur të klikoj në hart?
-    confirm: 
-      button: Konfirmo
-      heading: Konfirmo nje akount te shfrytezuesit
-      press confirm button: Shtype butonin e konfirmimit ma posht që me mujt me aktivizue akountin e juej
-    confirm_email: 
-      button: Konfirmo
-      failure: Ni email adres tashma osht konfirmue me kët token.
-      heading: Konfirmo ni ndryshim te email adreses
-      press confirm button: Truse butonin për konfirmim për me konfirmu email adresën tone të re.
-      success: Konfirmo email adresën tone, ju faleminderit për regjistrim!
-    filter: 
-      not_an_administrator: Ju duhet të jeni administrator për me kry kët veprim.
-    go_public: 
-      flash success: Gjitha ndryshimet tuja janë publike tash, edhe tash t'lejohet me ndryshue
-    list: 
-      confirm: Konfirmo Anëtarët e Selektum
-      empty: Asni perputhje e perdoruesve nuk asht gjetun
-      heading: Perdoruesit
-      hide: Mshefi Perdorust e Zgjedhun
-      showing: 
-        one: Tu e kallxu faqen %{page} (%{first_item} prej %{items})
-        other: Tu e kallxu faqen %{page} (%{first_item}-%{last_item} prej %{items})
-      summary: "%{name} u kriju prej %{ip_address} në %{date}"
-      summary_no_ip: "%{name} u krijue me %{date}"
-      title: Perdoruesit
-    login: 
-      account not active: Na vjen keq, akonti juej nuk asht hala aktiv<br /> Ju lutemi klikoni në linkun e dërguem në email për me aktivizu akountin tuej.
-      auth failure: Na vjen keq, smunem me ju kyc me ato detaje.
-      email or username: "Email Adresa ose Username:"
+      visibility: 'Dukshmënia:'
+    trace_paging_nav:
+      showing_page: Duke shfaqun faqen %{page}
+    trace:
+      pending: NË PRITJE
+      count_points: '%{count} pikët'
+      ago: '%{time_in_words_ago} përpara'
+      more: ma shumë
+      trace_details: Kshyri detalet e të dhanave
+      view_map: Kshyre Hartën
+      edit: ndrysho
+      edit_map: Ndryshoje Harten
+      public: PUBLIKE
+      identifiable: E identifikueshme
+      private: PRIVATE
+      trackable: E GJURMUESHME
+      by: nga
+      in: në
+      map: harta
+    list:
+      public_traces: Të dhanat publike të GPS-it
+      your_traces: Të dhanat e GPS-it
+      public_traces_from: Të dhana publike të GPS-it pej %{user}
+      tagged_with: ' e etikume me %{tags}'
+    delete:
+      scheduled_for_deletion: Gjurma u parapa për fshirje
+    make_public:
+      made_public: Gjurma u ba publike
+    offline_warning:
+      message: Sistemi i ngarkimit GPX për momentin asht jasht përdonimit
+    offline:
+      heading: Mbledhsi i GPX asht jasht linje
+      message: Mbledhsi i skedareve GPX dhe sistemi i ngarkimit për momentin janë
+        jasht funksionit.
+  application:
+    require_cookies:
+      cookies_needed: Ju duket se kanë cookies aftësi të kufizuara - ju lutemi aktivizoni
+        cookies në browserin tuaj para se të vazhdoni.
+    setup_user_auth:
+      blocked: qasja juaj në API është bllokuar. Ju lutemi të log-in për ndërfaqe
+        web për të mësuar më shumë.
+  oauth:
+    oauthorize:
+      request_access: Aplikacioni %{app_name} po kërkon qasje në llogarinë tonde.
+        Ju lutem kshyrne nëse doni që aplikacioni me i pas kto mundësi. Ju muni me
+        zgjedh sa ma shumë ose sa ma pak që të doni.
+      allow_to: 'Lejoni klientin të aplikimit:'
+      allow_read_prefs: lexoni preferencat tuaj të përdoruesit.
+      allow_write_prefs: ndryshuar parapëlqimet tuaj të përdoruesit.
+      allow_write_diary: krijojnë të hyra ditar, komentet dhe të bëni miq të rinj.
+      allow_write_api: modifikimin e hartes.
+      allow_read_gpx: lexoni privat tuaj GPS gjurmë.
+      allow_write_gpx: GPS upload gjurmë.
+    revoke:
+      flash: Ju keni revokuar shenjë për %{application}
+  oauth_clients:
+    new:
+      title: Regjistroje një aplikacion të ri.
+      submit: Regjistrohu
+    edit:
+      title: Redakto kërkesën tuaj
+      submit: Redaktoj
+    show:
+      title: Detajet OAuth për %{app_name}
+      key: 'Konsumatorit kryesore:'
+      secret: 'Konsumatorit Sekret:'
+      url: 'URL Kërkesë Shenjë:'
+      access_url: 'URL Qasja Shenjë:'
+      authorize_url: 'Authorise URL:'
+      support_notice: Ne mbështesim HMAC-SHA1 (rekomandohet) si tekst i thjeshtë në
+        mënyrë SSL.
+      edit: Edit Details
+      requests: 'Kërkuar të drejtat e mëposhtme nga përdoruesit:'
+      allow_read_prefs: lexoni preferencat e tyre të përdoruesit.
+      allow_write_prefs: ndryshuar parapëlqimet e tyre të përdoruesit.
+      allow_write_diary: krijojnë të hyra ditar, komentet dhe të bëni miq të rinj.
+      allow_write_api: modifikimin e hartes.
+      allow_read_gpx: lexo privat GPS gjurmë e tyre.
+      allow_write_gpx: GPS upload gjurmë.
+    index:
+      title: Detajet e mia OAuth
+      my_tokens: Aplikimet e mia i Autorizuar
+      list_tokens: 'Argumentet e mëposhtme janë lëshuar për aplikimet në emrin tuaj:'
+      application: Emri i Aplikacionit
+      issued_at: Lëshuar në
+      revoke: Tërheq!
+      my_apps: Aplikime Klienti im
+      no_apps: A keni një aplikim që ju do të doja të regjistruar për të përdorur
+        me ne duke përdorur %{oauth} standarde? Ju duhet të regjistroheni kërkesën
+        tuaj para se ajo mund të bëjë kërkesë OAuth për këtë shërbim.
+      registered_apps: 'Ju keni aplikimet e mëposhtme klientit të regjistruar:'
+      register_new: Regjistroje aplikacionin tond
+    form:
+      name: Emni
+      required: E kërkume
+      url: URL Kryesore Aplikimi
+      callback_url: Callback URL
+      support_url: Asistenca URL
+      requests: 'Kërkesë të drejtat e mëposhtme nga përdoruesit:'
+      allow_read_prefs: lexoni preferencat e tyre të përdoruesit.
+      allow_write_prefs: ndryshuar parapëlqimet e tyre të përdoruesit.
+      allow_write_diary: krijojnë të hyra ditar, komentet dhe të bëni miq të rinj.
+      allow_write_api: ndryshoje hartën.
+      allow_read_gpx: lexo privat GPS gjurmë e tyre.
+      allow_write_gpx: GPS upload gjurmë.
+    not_found:
+      sorry: Na vjen keq, se %{type} nuk mund të gjendet.
+    create:
+      flash: Informatat jon regjistru me sukses.
+    update:
+      flash: Përditësuar më të dhënat e klientit me sukses
+    destroy:
+      flash: Shkatërruar kërkesë e klientit regjistrimit
+  user:
+    login:
+      title: Kyçu
       heading: Kycu
-      login_button: Kyçu
+      email or username: 'Email Adresa ose Username:'
+      password: 'Fjalekalimi:'
+      remember: 'Kujtom mu:'
       lost password link: Keni harru fjalëkalimin tuaj?
-      password: "Fjalekalimi:"
-      remember: "Kujtom mu:"
-      title: Kyçu
-    logout: 
+      login_button: Kyçu
+      account not active: Na vjen keq, akonti juej nuk asht hala aktiv<br /> Ju lutemi
+        klikoni në linkun e dërguem në email për me aktivizu akountin tuej.
+      auth failure: Na vjen keq, smunem me ju kyc me ato detaje.
+    logout:
+      title: Dil
       heading: Dil nga OpenStreetMap
       logout_button: Dil
-      title: Dil
-    lost_password: 
-      email address: "Email Adresa:"
+    lost_password:
+      title: T'ka hup fjalkalimi
       heading: Ke harrue fjalkalimin?
-      help_text: Shkrueje email adresen që je regjistrue me to, do t'ju deromi një lidhe rreth ksaj ku ju muni me ndrru fjalkalimin
+      email address: 'Email Adresa:'
       new password button: Ndrysho fjalkalimin
+      help_text: Shkrueje email adresen që je regjistrue me to, do t'ju deromi një
+        lidhe rreth ksaj ku ju muni me ndrru fjalkalimin
+      notice email on way: Na vjen keq që e keni hup :-( po ni email ka me ju ardh
+        së shpejti edhe muni me ricaktu.
       notice email cannot find: Smujtëm me gjet qat email adres, na vjen keq.
-      notice email on way: Na vjen keq që e keni hup :-( po ni email ka me ju ardh së shpejti edhe muni me ricaktu.
-      title: T'ka hup fjalkalimi
-    make_friend: 
-      already_a_friend: Ju tashma jeni shok me %{name}.
-      failed: Na vjen keq, dështuam ta shtojm %{name} si shok/qe.
-      success: "%{name} është shok/shoqe jot/e."
-    new: 
-      confirm email address: "Konfirmo Adresën e Emailit:"
-      confirm password: "Konfirmo fjalëkalimin:"
-      contact_webmaster: Ju lutna kontaktoni <a href="mailto:webmaster@openstreetmap.org">webmasterin</a> per më caktu ni akount që të ju krijohet - na do të merremi me kërkesën sa ma shpejt që tjet e mundshme.
-      continue: Vazhdo
-      display name: "Emni i pamshem:"
-      display name description: Emni jot publik. Ju muni me ndrru ma von në preferencat e tua.
-      email address: "Email Adresa:"
-      license_agreement: Kur e konfirmoni llogarinë tuaj ju duhet ti pranoni <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">kushtet e kontributit</a>.
-      no_auto_account_create: Për momentin spo mujm me ju kriju akount automatikisht.
-      not displayed publicly: Nuk u shfaq publikisht (kshyre <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy" title="wiki privacy policy including section on email addresses">privacy policy</a>)
-      password: "Fjalekalimi:"
-      title: Krijo akount
-    no_such_user: 
-      body: Na vjen keq, ska shfrytëzues me kët emën %{user}. Ju lutemi kontrolloni shkrimin, ose nashta linku ku keni kliku asht gabim.
-      heading: Ky shfrytzues %{user} nuk egziston
-      title: Ska ksi shfrytëzuesi
-    popup: 
-      friend: Shoq
-      nearby mapper: Hartues i aftërt
-      your location: Vendi juej
-    remove_friend: 
-      not_a_friend: "%{name} nuk osht njoni pi shokve tu."
-      success: "%{name} u hek pi shokve tu"
-    reset_password: 
-      confirm password: "Konfirmo Fjalëkalimin:"
-      flash changed: Fjalëkalimi juaj u ndryshua.
-      flash token bad: Sun e gjetëm qat token, kontrolloje URL?
+    reset_password:
+      title: Ricakto fjalëkalimin
       heading: Ricakto fjalëkalimin për %{user}
-      password: "Fjalëkalimi:"
+      password: 'Fjalëkalimi:'
+      confirm password: 'Konfirmo Fjalëkalimin:'
       reset: Ricakto Fjalëkalimin
-      title: Ricakto fjalëkalimin
-    set_home: 
-      flash success: Veni i shpis u ruajt me sukses
-    suspended: 
-      body: "<p>\n  Me na fal, por llogaria juaj automatikisht osht suspendu\n  për shkak të aktivitetit të dyshimt.\n</p>\n<p>\n  Ky vendim së shpejti ka mu rishiku prej një administratori, ose\n  ju muni me kontaktu me %{webmaster} nëse doni me diskutu ma shumë.\n</p>"
-      heading: Llogaria u Suspendu
-      title: Llogaria u Suspendu
-      webmaster: webmaster
-    terms: 
-      agree: Pajtohem
+      flash changed: Fjalëkalimi juaj u ndryshua.
+      flash token bad: Sun e gjetëm qat token, kontrolloje URL?
+    new:
+      title: Krijo akount
+      no_auto_account_create: Për momentin spo mujm me ju kriju akount automatikisht.
+      contact_webmaster: Ju lutna kontaktoni <a href="mailto:webmaster@openstreetmap.org">webmasterin</a>
+        per më caktu ni akount që të ju krijohet - na do të merremi me kërkesën sa
+        ma shpejt që tjet e mundshme.
+      license_agreement: Kur e konfirmoni llogarinë tuaj ju duhet ti pranoni <a href="http://www.osmfoundation.org/wiki/License/Contributor_Terms">kushtet
+        e kontributit</a>.
+      email address: 'Email Adresa:'
+      confirm email address: 'Konfirmo Adresën e Emailit:'
+      not displayed publicly: Nuk u shfaq publikisht (kshyre <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy"
+        title="wiki privacy policy including section on email addresses">privacy policy</a>)
+      display name: 'Emni i pamshem:'
+      display name description: Emni jot publik. Ju muni me ndrru ma von në preferencat
+        e tua.
+      password: 'Fjalekalimi:'
+      confirm password: 'Konfirmo fjalëkalimin:'
+      continue: Vazhdo
+    terms:
+      heading: rregullat për Pjesëmarrës
       consider_pd: Unë e konsideroj kontributet e mia të jenë në domenin publik
       consider_pd_why: çka o kjo?
+      agree: Pajtohem
       decline: Mos prano
-      heading: rregullat për Pjesëmarrës
-      legale_names: 
+      legale_select: 'Ju lutem zgjidhni vendin tuaj të banimit:'
+      legale_names:
         france: Franca
         italy: Italia
         rest_of_world: Pjesa tjetër e botës
-      legale_select: "Ju lutem zgjidhni vendin tuaj të banimit:"
-    view: 
-      activate_user: aktivizo kët shfrytezues
-      add as friend: shtoje si shoq
-      ago: (para %{time_in_words_ago})
-      block_history: shih blokimet e marrne
-      blocks by me: bllokimet e dhana nga un
-      blocks on me: bllokimet e mia
-      confirm: Konfirmo
-      confirm_user: konfirmo ket perdorus
-      create_block: blloko ket shfrytzues
-      created from: "U krijue prej:"
-      deactivate_user: ç'aktivizoje kët shfrytezues
-      delete_user: fshije kët shfrytzues
-      description: Përshkrimi
-      diary: ditari
-      edits: ndryshimet
-      email address: "Email Adresa:"
-      hide_user: mshife kët shfrytëzues
-      if set location: Nqofse e zgedh venin, shum harta edhe sene kan me u paraqit ktu. Ju muni me caktu venin ton në %{settings_link} .
-      km away: "%{count}km larg"
-      m away: "%{count}m larg"
-      mapper since: "Hartues qe prej:"
-      moderator_history: shihe kan e ke blloku
+    no_such_user:
+      title: Ska ksi shfrytëzuesi
+      heading: Ky shfrytzues %{user} nuk egziston
+      body: Na vjen keq, ska shfrytëzues me kët emën %{user}. Ju lutemi kontrolloni
+        shkrimin, ose nashta linku ku keni kliku asht gabim.
+    view:
       my diary: ditari im
+      new diary entry: hyrje e re ne ditar
       my edits: ndryshimet e mia
-      my settings: preferencat e mia
       my traces: gjurmët e mia
-      nearby users: Shfrytëzuesit e tjer që jan afër
-      new diary entry: hyrje e re ne ditar
-      no friends: Hala nuk ke shtue asni shoq.
-      no nearby users: Hala nuk ka shfrytëzues që pranon hartimin e aftërt.
+      my settings: preferencat e mia
       oauth settings: ndrryshimet per autorizim
+      blocks on me: bllokimet e mia
+      blocks by me: bllokimet e dhana nga un
+      send message: dërgo mesazh
+      diary: ditari
+      edits: ndryshimet
+      traces: gjurmet
       remove as friend: heke si shok
-      role: 
+      add as friend: shtoje si shoq
+      mapper since: 'Hartues qe prej:'
+      ago: (para %{time_in_words_ago})
+      email address: 'Email Adresa:'
+      created from: 'U krijue prej:'
+      status: 'Statuti:'
+      spam score: 'Piket e Badihavgjive:'
+      description: Përshkrimi
+      user location: Veni i shfrytëzuesit
+      if set location: Nqofse e zgedh venin, shum harta edhe sene kan me u paraqit
+        ktu. Ju muni me caktu venin ton në %{settings_link} .
+      settings_link_text: ndryshimet
+      your friends: Shokt e tu
+      no friends: Hala nuk ke shtue asni shoq.
+      km away: '%{count}km larg'
+      m away: '%{count}m larg'
+      nearby users: Shfrytëzuesit e tjer që jan afër
+      no nearby users: Hala nuk ka shfrytëzues që pranon hartimin e aftërt.
+      role:
         administrator: Ky shfrytëzues asht aministrator
-        grant: 
+        moderator: Ky shfrytëzues asht moderator
+        grant:
           administrator: Banu administrator
           moderator: Banu moderator
-        moderator: Ky shfrytëzues asht moderator
-        revoke: 
+        revoke:
           administrator: Riqoje aksesin e administratorit
           moderator: Riqoje aksesin e moderatorit
-      send message: dërgo mesazh
-      settings_link_text: ndryshimet
-      spam score: "Piket e Badihavgjive:"
-      status: "Statuti:"
-      traces: gjurmet
+      block_history: shih blokimet e marrne
+      moderator_history: shihe kan e ke blloku
+      create_block: blloko ket shfrytzues
+      activate_user: aktivizo kët shfrytezues
+      deactivate_user: ç'aktivizoje kët shfrytezues
+      confirm_user: konfirmo ket perdorus
+      hide_user: mshife kët shfrytëzues
       unhide_user: shfaqe kët shfrytzues
-      user location: Veni i shfrytëzuesit
-      your friends: Shokt e tu
-  user_block: 
-    blocks_by: 
-      empty: "%{name} nuk ka bërë ndonjë blloqe ende."
-      heading: Lista e blloqeve me %{name}
-      title: Blloqe me %{name}
-    blocks_on: 
-      empty: "%{name} nuk është bllokuar akoma."
-      heading: Lista e blloqeve në %{name}
-      title: Blocks në %{name}
-    create: 
-      flash: Krijuar një bllok të përdorues %{name}.
-      try_contacting: Ju lutemi provoni kontaktuar përdorues para se bllokimi i tyre dhe duke u dhënë atyre një kohë të arsyeshme për t,u përgjigjur.
-      try_waiting: Ju lutemi provoni duke i dhënë përdoruesit një kohë të arsyeshme për t,u përgjigjur para se bllokimi i tyre.
-    edit: 
+      delete_user: fshije kët shfrytzues
+      confirm: Konfirmo
+    popup:
+      your location: Vendi juej
+      nearby mapper: Hartues i aftërt
+      friend: Shoq
+    account:
+      title: Ndrysho akountin
+      my settings: Preferencat e mia
+      current email address: 'Email adresa e tanishme:'
+      new email address: 'Email adresa e re:'
+      email never displayed publicly: (asniher su kan publike)
+      public editing:
+        heading: 'Ndryshime publike:'
+        enabled: E pranishme. Jo anonime dhe muni me i ndryshue t'dhanat.
+        enabled link: http://wiki.openstreetmap.org/wiki/Anonymous_edits
+        enabled link text: çka osht kjo?
+        disabled: E çkyckur dhe smuni me i ndryshu të dhanat, të gjitha ndryshimet
+          e ma hershme jan anonime.
+        disabled link text: pse spo muj me i ndryshue?
+      public editing note:
+        heading: Duke ndryshue publikisht
+        text: Niher për niher ndryshimet e juaja janë anonime dhe njerëzit nuk mund
+          të ju dërgojnë mesazhe apo shohin vendndodhjen tuaj. Për të treguar atë
+          që e keni edituar dhe lejojnë njerëzit të lidhen me ju nëpërmjet internetit,
+          kliko butonin më poshtë. <b> Që nga ndryshimi 0,6 API, vetëm përdoruesit
+          e publikut mund të redaktoni të dhënat hartë </ b>. (<a Href="http://wiki.openstreetmap.org/wiki/Anonymous_edits">
+          gjeni se pse </ a>). <ul> <li> Adresa juaj e emailit nuk do të zbulohet
+          duke u bërë publik. </ Li > <li> Ky veprim nuk mund të kthehet dhe të gjithë
+          përdoruesit e rinj janë tashmë publik nga default. </ li> </ ul>
+      profile description: 'Pershkrimi i profilit:'
+      preferred languages: 'Gjuhët e parapëlqyme:'
+      image: 'Imazhi:'
+      new image: Shto ni imazh
+      keep image: Maje imazhin e tanishëm
+      delete image: Heke imazhin e tanishëm
+      replace image: Ndryshoje imazhin e tanishëm
+      image size hint: (imazhet katrore s'paku me madhsi 100x100px doken ma mir)
+      home location: 'Veni juej:'
+      no home location: Ju se keni caktu venin e juj.
+      latitude: 'Latituda:'
+      longitude: 'Longituda:'
+      update home location on click: Ndryshoma venin kur të klikoj në hart?
+      save changes button: Ruaj Ndryshimet
+      make edits public button: Boni gjith ndryshimet e mija publike
+      return to profile: Kthehu te profili
+      flash update success confirm needed: Informatat e shfyrtezuesit u ndryshan me
+        sukses. Shihni emailin per konfirmim.
+      flash update success: Informatat e shfrytëzuesit u ndryshuan me sukses.
+    confirm:
+      heading: Konfirmo nje akount te shfrytezuesit
+      press confirm button: Shtype butonin e konfirmimit ma posht që me mujt me aktivizue
+        akountin e juej
+      button: Konfirmo
+    confirm_email:
+      heading: Konfirmo ni ndryshim te email adreses
+      press confirm button: Truse butonin për konfirmim për me konfirmu email adresën
+        tone të re.
+      button: Konfirmo
+      success: Konfirmo email adresën tone, ju faleminderit për regjistrim!
+      failure: Ni email adres tashma osht konfirmue me kët token.
+    set_home:
+      flash success: Veni i shpis u ruajt me sukses
+    go_public:
+      flash success: Gjitha ndryshimet tuja janë publike tash, edhe tash t'lejohet
+        me ndryshue
+    make_friend:
+      success: '%{name} është shok/shoqe jot/e.'
+      failed: Na vjen keq, dështuam ta shtojm %{name} si shok/qe.
+      already_a_friend: Ju tashma jeni shok me %{name}.
+    remove_friend:
+      success: '%{name} u hek pi shokve tu'
+      not_a_friend: '%{name} nuk osht njoni pi shokve tu.'
+    filter:
+      not_an_administrator: Ju duhet të jeni administrator për me kry kët veprim.
+    list:
+      title: Perdoruesit
+      heading: Perdoruesit
+      showing:
+        one: Tu e kallxu faqen %{page} (%{first_item} prej %{items})
+        other: Tu e kallxu faqen %{page} (%{first_item}-%{last_item} prej %{items})
+      summary: '%{name} u kriju prej %{ip_address} në %{date}'
+      summary_no_ip: '%{name} u krijue me %{date}'
+      confirm: Konfirmo Anëtarët e Selektum
+      hide: Mshefi Perdorust e Zgjedhun
+      empty: Asni perputhje e perdoruesve nuk asht gjetun
+    suspended:
+      title: Llogaria u Suspendu
+      heading: Llogaria u Suspendu
+      webmaster: webmaster
+      body: |-
+        <p>
+          Me na fal, por llogaria juaj automatikisht osht suspendu
+          për shkak të aktivitetit të dyshimt.
+        </p>
+        <p>
+          Ky vendim së shpejti ka mu rishiku prej një administratori, ose
+          ju muni me kontaktu me %{webmaster} nëse doni me diskutu ma shumë.
+        </p>
+  user_role:
+    filter:
+      not_an_administrator: Veç administratorat munen me pas rol të menaxhimit, dhe
+        ju nuk jeni administrator.
+      not_a_role: Lidhja `%{role}' nuk asht rol valid.
+      already_has_role: Shfrytzuesi tashmë ka ni rol %{role}.
+      doesnt_have_role: Ky shfrytzeus nuk ka asni rrol %{role}
+    grant:
+      title: Konfirmo dhanjen e rolit
+      heading: Konfirmo dhenjen e rolit
+      are_you_sure: A jeni i sigurt që po doni mja dhonë rolin `%{role}' te përdoruesi
+        `%{name}'?
+      confirm: Konfirmo
+      fail: Nuk i dha rol tmadh `%{role}' te perdoruesi `%{name}'. Ju lutna kontrollone
+        perdoruesin dhe rolin qe a jane te dzte valid.
+    revoke:
+      title: Konfirmoje rolin duke e zgjuar
+      heading: Konfirmoje folin duke e zgjuar
+      are_you_sure: A jeni i sigurt qe ju doni me zgjue rolin `%{role}' prej perdoruesit
+        `%{name}'?
+      confirm: Konfirmo
+      fail: Nuk munet me zgjue folin `%{role}' prej perdoruesit `%{name}'. Ju lutem
+        kontrolloje perdoruesin edhe rolin a jane te dyte valid.
+  user_block:
+    model:
+      non_moderator_update: Duhet të jetë një moderator për të krijuar ose rinovuar
+        një bllok.
+      non_moderator_revoke: Duni me kon moderator për me hek një bllokim.
+    not_found:
+      sorry: Na vjen keq, blloku përdorues me ID %{id} nuk mund të gjendet.
+      back: Kthehu tek Indeksi
+    new:
+      title: Krijimi i bllokuar në %{name}
+      heading: Krijimi i bllokuar në %{name}
+      reason: Arsyja pse %{name} osht blloku. Ju lutem bëhuni sa më i qet dhe arsyeshëm
+        që osht e mundshme, tu dhon sa ma shumë detaje që muni rreth situatës, tu
+        e mbajt në men që mesazhi munet me u pa prej publikut. Maje në men se jo krejt
+        anëtarët e kuptojn gjuhën e komunitetit, pra ju lutem munoni me përdor terma
+        të mirë.
+      period: Sa kohë, duke filluar nga tani, përdoruesi do të bllokohet nga API për.
+      submit: bllok Krijo
+      tried_contacting: Unë kam kontaktuar me përdorues dhe u kërkoi atyre për të
+        ndaluar.
+      tried_waiting: Unë kam dhënë një sasi të arsyeshme kohore për përdoruesit për
+        t,iu përgjigjur atyre të komunikimit.
+      needs_view: Përdoruesi duhet të hyni në para këtij blloku do të pastrohen
       back: Shiko të gjitha blloqet e
+    edit:
+      title: Editimi bllokuar në %{name}
       heading: Editimi bllokuar në %{name}
-      needs_view: A i përdoruesit duhet të identifikoheni për para këtij blloku do të fshihet?
+      reason: Arsyeja pse %{name} është bllokuar. Ju lutemi të jetë si të qetë dhe
+        të arsyeshme të jetë e mundur, duke i dhënë sa më shumë hollësi si ju mund
+        të lidhur me situatën. Të ketë parasysh se jo të gjithë përdoruesit e kuptojnë
+        zhargon komunitetit, kështu që ju lutemi provoni të përdorni laymans kushtet.
       period: Sa kohë, duke filluar nga tani, përdoruesi do të bllokohet nga API për.
-      reason: Arsyeja pse %{name} është bllokuar. Ju lutemi të jetë si të qetë dhe të arsyeshme të jetë e mundur, duke i dhënë sa më shumë hollësi si ju mund të lidhur me situatën. Të ketë parasysh se jo të gjithë përdoruesit e kuptojnë zhargon komunitetit, kështu që ju lutemi provoni të përdorni laymans kushtet.
-      show: Shiko këtë bllok
       submit: bllok Update
-      title: Editimi bllokuar në %{name}
-    filter: 
+      show: Shiko këtë bllok
+      back: Shiko të gjitha blloqet e
+      needs_view: A i përdoruesit duhet të identifikoheni për para këtij blloku do
+        të fshihet?
+    filter:
       block_expired: Blloku ka skaduar dhe nuk mund të redaktohen.
-      block_period: Periudha e bllokuar duhet të jetë një nga vlerat selectable në drop-down list.
-    helper: 
-      time_future: Përfundon në %{time}.
-      time_past: Përfundoi %{time} më parë.
-      until_login: Aktiv deri kur përdoruesi shkrimet in
-    index: 
-      empty: Nuk ka blloqe janë bërë ende.
-      heading: Lista e blloqeve përdorues
+      block_period: Periudha e bllokuar duhet të jetë një nga vlerat selectable në
+        drop-down list.
+    create:
+      try_contacting: Ju lutemi provoni kontaktuar përdorues para se bllokimi i tyre
+        dhe duke u dhënë atyre një kohë të arsyeshme për t,u përgjigjur.
+      try_waiting: Ju lutemi provoni duke i dhënë përdoruesit një kohë të arsyeshme
+        për t,u përgjigjur para se bllokimi i tyre.
+      flash: Krijuar një bllok të përdorues %{name}.
+    update:
+      only_creator_can_edit: Vetëm moderatori i cili krijoi këtë bllok mund ta redaktojnë.
+      success: Block përditësuar.
+    index:
       title: blloqe Përdoruesi
-    model: 
-      non_moderator_revoke: Duni me kon moderator për me hek një bllokim.
-      non_moderator_update: Duhet të jetë një moderator për të krijuar ose rinovuar një bllok.
-    new: 
-      back: Shiko të gjitha blloqet e
-      heading: Krijimi i bllokuar në %{name}
-      needs_view: Përdoruesi duhet të hyni në para këtij blloku do të pastrohen
-      period: Sa kohë, duke filluar nga tani, përdoruesi do të bllokohet nga API për.
-      reason: Arsyja pse %{name} osht blloku. Ju lutem bëhuni sa më i qet dhe arsyeshëm që osht e mundshme, tu dhon sa ma shumë detaje që muni rreth situatës, tu e mbajt në men që mesazhi munet me u pa prej publikut. Maje në men se jo krejt anëtarët e kuptojn gjuhën e komunitetit, pra ju lutem munoni me përdor terma të mirë.
-      submit: bllok Krijo
-      title: Krijimi i bllokuar në %{name}
-      tried_contacting: Unë kam kontaktuar me përdorues dhe u kërkoi atyre për të ndaluar.
-      tried_waiting: Unë kam dhënë një sasi të arsyeshme kohore për përdoruesit për t,iu përgjigjur atyre të komunikimit.
-    not_found: 
-      back: Kthehu tek Indeksi
-      sorry: Na vjen keq, blloku përdorues me ID %{id} nuk mund të gjendet.
-    partial: 
-      confirm: A jeni i sigurt?
-      creator_name: Krijuesi
-      display_name: Përdoruesi Blocked
-      edit: Redaktoj
-      not_revoked: (Jo revokuar)
-      reason: Arsyeja për bllok
-      revoke: Tërheq!
-      revoker_name: Revokuar nga ana
-      show: Tregoj
-      status: Statusi
-    period: 
-      one: 1 orë
-      other: "%{count} orë"
-    revoke: 
-      confirm: Jeni i sigurt që dëshironi të revokuar kete kategori?
-      flash: Ky bllok është revokuar.
+      heading: Lista e blloqeve përdorues
+      empty: Nuk ka blloqe janë bërë ende.
+    revoke:
+      title: Revokimin e bllokuar në %{block_on}
       heading: Revokimin e bllokuar në %{block_on} nga %{block_by}
+      time_future: Ky bllok do të përfundojë në %{time}.
       past: Ky bllok u mbyll %{time} më parë dhe nuk mund të kthehet tani.
+      confirm: Jeni i sigurt që dëshironi të revokuar kete kategori?
       revoke: Tërheq!
-      time_future: Ky bllok do të përfundojë në %{time}.
-      title: Revokimin e bllokuar në %{block_on}
-    show: 
-      back: Shiko të gjitha blloqet
-      confirm: A jeni i sigurt?
+      flash: Ky bllok është revokuar.
+    period:
+      one: 1 orë
+      other: '%{count} orë'
+    partial:
+      show: Tregoj
       edit: Redaktoj
-      heading: "%{block_on} bllokuar nga %{block_by}"
-      needs_view: Shfrytëzuesi duhet të hyj para se të fshihet ky bllok.
-      reason: "Arsyeja për bllok:"
       revoke: Tërheq!
-      revoker: "Revoker:"
-      show: Tregoj
+      confirm: A jeni i sigurt?
+      display_name: Përdoruesi Blocked
+      creator_name: Krijuesi
+      reason: Arsyeja për bllok
       status: Statusi
+      revoker_name: Revokuar nga ana
+      not_revoked: (Jo revokuar)
+    helper:
+      time_future: Përfundon në %{time}.
+      until_login: Aktiv deri kur përdoruesi shkrimet in
+      time_past: Përfundoi %{time} më parë.
+    blocks_on:
+      title: Blocks në %{name}
+      heading: Lista e blloqeve në %{name}
+      empty: '%{name} nuk është bllokuar akoma.'
+    blocks_by:
+      title: Blloqe me %{name}
+      heading: Lista e blloqeve me %{name}
+      empty: '%{name} nuk ka bërë ndonjë blloqe ende.'
+    show:
+      title: '%{block_on} bllokuar nga %{block_by}'
+      heading: '%{block_on} bllokuar nga %{block_by}'
       time_future: Përfundon në %{time}
       time_past: Përfundoi %{time} më parë
-      title: "%{block_on} bllokuar nga %{block_by}"
-    update: 
-      only_creator_can_edit: Vetëm moderatori i cili krijoi këtë bllok mund ta redaktojnë.
-      success: Block përditësuar.
-  user_role: 
-    filter: 
-      already_has_role: Shfrytzuesi tashmë ka ni rol %{role}.
-      doesnt_have_role: Ky shfrytzeus nuk ka asni rrol %{role}
-      not_a_role: Lidhja `%{role}' nuk asht rol valid.
-      not_an_administrator: Veç administratorat munen me pas rol të menaxhimit, dhe ju nuk jeni administrator.
-    grant: 
-      are_you_sure: A jeni i sigurt që po doni mja dhonë rolin `%{role}' te përdoruesi `%{name}'?
-      confirm: Konfirmo
-      fail: Nuk i dha rol tmadh `%{role}' te perdoruesi `%{name}'. Ju lutna kontrollone perdoruesin dhe rolin qe a jane te dzte valid.
-      heading: Konfirmo dhenjen e rolit
-      title: Konfirmo dhanjen e rolit
-    revoke: 
-      are_you_sure: A jeni i sigurt qe ju doni me zgjue rolin `%{role}' prej perdoruesit `%{name}'?
-      confirm: Konfirmo
-      fail: Nuk munet me zgjue folin `%{role}' prej perdoruesit `%{name}'. Ju lutem kontrolloje perdoruesin edhe rolin a jane te dyte valid.
-      heading: Konfirmoje folin duke e zgjuar
-      title: Konfirmoje rolin duke e zgjuar
+      status: Statusi
+      show: Tregoj
+      edit: Redaktoj
+      revoke: Tërheq!
+      confirm: A jeni i sigurt?
+      reason: 'Arsyeja për bllok:'
+      back: Shiko të gjitha blloqet
+      revoker: 'Revoker:'
+      needs_view: Shfrytëzuesi duhet të hyj para se të fshihet ky bllok.
+  javascripts:
+    map:
+      base:
+        cycle_map: Cikli Harta
+    site:
+      edit_tooltip: Edit Harta
+      edit_disabled_tooltip: Zoom në hartë për të redaktuar
+...
index 881af85ff37cc58bf4861159020891399d3cf24c..a0e39b5da7392c0e6e26caac1b344ed3b7a8a2b6 100644 (file)
@@ -1,6 +1,6 @@
 # Messages for Arabic (العربية)
 # Exported from translatewiki.net
-# Export driver: syck-pecl
+# Export driver: phpyaml
 # Author: Ali1
 # Author: Aude
 # Author: Bassem JARKAS
 # Author: TTMTT
 # Author: Zaher kadour
 # Author: ترجمان05
-ar: 
-  activerecord: 
-    attributes: 
-      diary_comment: 
-        body: نص الرسالة
-      diary_entry: 
-        language: اللغة
-        latitude: خط العرض
-        longitude: خط الطول
-        title: العنوان
-        user: المستخدم
-      friend: 
-        friend: صديق
-        user: المستخدم
-      message: 
-        body: نص الرسالة
-        recipient: المستلم
-        sender: المرسل
-        title: العنوان
-      trace: 
-        description: الوصف
-        latitude: خط العرض
-        longitude: خط الطول
-        name: الاسم
-        public: علني
-        size: الحجم
-        user: المستخدم
-        visible: ظاهر
-      user: 
-        active: نشط
-        description: الوصف
-        display_name: الاسم الظاهر
-        email: البريد الإلكتروني
-        languages: اللغات
-        pass_crypt: كلمة السر
-    models: 
-      acl: قائمة تحكم الوصول
+# Author: عباد ديرانية
+# Author: عبد الرحمان أيمن
+---
+ar:
+  html:
+    dir: rtl
+  time:
+    formats:
+      friendly: '%e %B %Y في %H:%M'
+  activerecord:
+    models:
+      acl: لائحة التحكم بالوصول
       changeset: حزمة التغييرات
       changeset_tag: سمة حزمة التغييرات
       country: البلد/الدولة
@@ -84,247 +59,304 @@ ar:
       way: طريق
       way_node: عقدة طريق
       way_tag: سمة طريق
-  application: 
-    require_cookies: 
-      cookies_needed: يبدو أن الكوكيز عندك معطلة - يرجى تفعيل الكوكيز في متصفحك قبل المتابعة.
-    require_moderator: 
-      not_a_moderator: عليك أن تكون وسيط لتنفيذ هذا الإجراء
-    setup_user_auth: 
-      blocked: لقد تم عرقلة وصولك إلى الـ API. يرجى تسجيل الدخول من صفحة الموقع لمعرفة المزيد.
-  browse: 
+    attributes:
+      diary_comment:
+        body: نص الرسالة
+      diary_entry:
+        user: المستخدم
+        title: الموضوع
+        latitude: خط العرض
+        longitude: خط الطول
+        language: اللغة
+      friend:
+        user: المستخدم
+        friend: صديق
+      trace:
+        user: المستخدم
+        visible: ظاهر
+        name: الاسم
+        size: الحجم
+        latitude: خط العرض
+        longitude: خط الطول
+        public: علني
+        description: الوصف
+      message:
+        sender: المرسل
+        title: الموضوع
+        body: نص الرسالة
+        recipient: المستلم
+      user:
+        email: البريد الإلكتروني
+        active: نشط
+        display_name: الاسم الظاهر
+        description: الوصف
+        languages: اللغات
+        pass_crypt: كلمة السر
+  editor:
+    default: الغيابي (حالياً %{name})
+    potlatch:
+      name: Potlatch 1
+      description: Potlatch 1 (محرّر ضمن المتصفح)
+    id:
+      name: معرّف
+    potlatch2:
+      name: Potlatch 2
+      description: Potlatch 2 (محرّر ضمن المتصفح)
+    remote:
+      name: تحكم عن بعد
+      description: تحكم عن بعد (JOSM أو Merkaartor)
+  browse:
+    created: تم الإنشاء
+    closed: تم الإغلاق
+    created_html: تم الإغلاق قبل <abbr title='%{title}'>%{time}</abbr>
+    closed_html: تم الإغلاق قبل <abbr title='%{title}'>%{time}</abbr>
+    created_by_html: تم الإنشاء قبل <abbr title='%{title}'>%{time}</abbr> على يد %{user}
+    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}
+    version: الإصدار
+    in_changeset: مجموعة تغييرات
     anonymous: مجهول
-    changeset: 
+    no_comment: (لا تعليق)
+    part_of: جزء من
+    download_xml: حمّل XML
+    view_history: شاهد التاريخ
+    view_details: شاهد التفاصيل
+    location: 'الموقع:'
+    changeset:
+      title: حزمة التغييرات %{id}
+      belongs_to: الصانع
       changesetxml: حزمة التغييرات إكس إم أل
-      feed: 
+      feed:
         title: حزمة التغييرات %{id}
         title_comment: حزمة التغييرات %{id} - %{comment}
-      title: حزمة التغييرات
-    containing_relation: 
+    relation:
+      members: الأعضاء
+    relation_member:
+      entry_role: '%{type} %{name} كــ %{role}'
+      type:
+        node: عقدة
+        way: طريق
+        relation: علاقة
+    containing_relation:
       entry: العلاقة %{relation_name}
       entry_role: العلاقة %{relation_name} (كــ %{relation_role})
-    location: "الموقع:"
-    no_comment: (لا تعليق)
-    not_found: 
-      sorry: عفوًا، لم يتم العثور على %{type} بالمعرّف %{id}.
-      type: 
-        changeset: حزمة التغييرات
+    not_found:
+      sorry: 'عفوًا، تعذر العثور على %{type} #%{id}.'
+      type:
         node: عقدة
-        relation: علاقة
         way: طريق
-    note: 
-      closed_title: "ملاحظات محلولة: %{note_name}"
-      open_title: "ملاحظة لم يتم حلها: %{note_name}"
-      title: ملاحظة
-    redacted: 
+        relation: علاقة
+        changeset: حزمة التغييرات
+    timeout:
+      sorry: عذرًا، بيانات %{type} بالمعرّف %{id} استغرقت وقتًا طويلا للاسترداد.
+      type:
+        node: العقدة
+        way: الطريق
+        relation: العلاقة
+        changeset: حزمة التغييرات
+    redacted:
       redaction: التنقيح %{id}
-      type: 
+      message_html: لا يمكن إظهار الإصدارة  %{version} من هذا %{type} لأن صياغتها
+        غُيِّرت، رجاءً اطلع على %{redaction_link} للمزيد من التفاصيل
+      type:
         node: العقدة
-        relation: علاقة
         way: طريق
-    relation_member: 
-      entry_role: "%{type} %{name} كــ %{role}"
-      type: 
-        node: عقدة
         relation: علاقة
-        way: طريق
-    start_rjs: 
+    start_rjs:
+      feature_warning: يجري تحميل ميزات %{num_features}، والتي يمكن أن تجعل متصفّحك
+        بطيئاً أو عديم الاستجابة. هل أنت متأكد من رغبتك بعرض هذه البيانات؟
       load_data: تحميل البيانات
       loading: جاري التحميل...
-    tag_details: 
-      tags: "الوسوم:"
+    tag_details:
+      tags: الوسوم
+      wiki_link:
+        key: صفحة وصف الويكي لعلامة %{key}
+        tag: صفحة وصف الويكي لعلامة %{key}=%{value}
+      wikidata_link: صفحة %{page} على ويكي داتا
       wikipedia_link: الـ%{page} مقالة على ويكيبيديا
-    timeout: 
-      sorry: عذرًا، بيانات %{type} بالمعرّف %{id} استغرقت وقتًا طويلا للاسترداد.
-      type: 
-        changeset: حزمة التغييرات
-        node: العقدة
-        relation: العلاقة
-        way: الطريق
-    version: الإصدار
-  changeset: 
-    changeset: 
+      telephone_link: اتصل بـ %{phone_number}
+    note:
+      title: 'ملاحظة: %{id}'
+      new_note: ملاحظة جديدة
+      description: الوصف
+      open_title: 'ملاحظة لم يتم حلها: %{note_name}'
+      closed_title: 'ملاحظات محلولة: %{note_name}'
+      hidden_title: 'ملاحظة مخفيّة #%{note_name}'
+      open_by: أنشأه المستخدم %{user} قبل <abbr title='%{exact_time}'>%{when}</abbr>
+      open_by_anonymous: أنشأه مستخدم مجهول قبل  <abbr title='%{exact_time}'>%{when}
+        </abbr>
+      commented_by: تعليق من %{user} قبل <abbr title='%{exact_time}'>%{when} </abbr>
+      commented_by_anonymous: تعليق من مجهول قبل <abbr title='%{exact_time}'>%{when}
+        </abbr>
+      closed_by: حلّه %{user} قبل <abbr title='%{exact_time}'>%{when} </abbr>
+      closed_by_anonymous: حلّه مجهول قبل <abbr title='%{exact_time}'>%{when} </abbr>
+      reopened_by: أعاد تنشيطه %{user} قبل <abbr title='%{exact_time}'>%{when} </abbr>
+      reopened_by_anonymous: أعاد تنشيطه مجهول قبل <abbr title='%{exact_time}'>%{when}
+        </abbr>
+      hidden_by: أخفاه %{user} قبل <abbr title='%{exact_time}'>%{when} =</abbr>
+  changeset:
+    changeset_paging_nav:
+      showing_page: الصفحة %{page}
+      next: التالي »
+      previous: «السابق
+    changeset:
       anonymous: مجهول
       no_edits: (لا تعديلات)
       view_changeset_details: اعرض تفاصيل حزمة التغييرات
-    changeset_paging_nav: 
-      next: التالي »
-      previous: «السابق
-      showing_page: الصفحة %{page}
-    changesets: 
-      area: منطقة
-      comment: التعليق
+    changesets:
       id: رقم
       saved_at: حُفظ في
       user: المستخدم
-    list: 
+      comment: التعليق
+      area: منطقة
+    list:
       title: حزم التغييرات
+      title_user: حزم التغييرات بواسطة %{user}
       title_friend: حزم التغييرات بواسطة أصدقائك
<