Merge 16216:16355 from trunk.
authorTom Hughes <tom@compton.nu>
Sun, 5 Jul 2009 23:47:40 +0000 (23:47 +0000)
committerTom Hughes <tom@compton.nu>
Sun, 5 Jul 2009 23:47:40 +0000 (23:47 +0000)
37 files changed:
app/controllers/geocoder_controller.rb
app/views/geocoder/_description.html.erb [new file with mode: 0644]
app/views/geocoder/_results.html.erb [deleted file]
app/views/geocoder/_search.html.erb [new file with mode: 0644]
app/views/geocoder/error.html.erb [new file with mode: 0644]
app/views/geocoder/results.html.erb [new file with mode: 0644]
app/views/layouts/site.html.erb
app/views/site/_search.html.erb
app/views/user/view.html.erb
config/lighttpd.conf
config/locales/be.yml
config/locales/de.yml
config/locales/en.yml
config/locales/es.yml
config/locales/fr.yml
config/locales/he.yml
config/locales/hi.yml
config/locales/is.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ko.yml
config/locales/nl.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/ru.yml
config/locales/sl.yml
config/locales/vi.yml [new file with mode: 0644]
config/locales/yo.yml
config/locales/zh-CN.yml
config/locales/zh-TW.yml
config/openlayers.cfg
config/routes.rb
lib/short_link.rb
public/images/searching.gif [new file with mode: 0644]
public/javascripts/site.js
public/stylesheets/site.css
test/integration/short_link_test.rb

index c7efec154a646afcb850d2b36134b1cdf6fe5606..1b2ae340b58c38912fe76edb0827b62a6dabf3a4 100644 (file)
@@ -6,84 +6,67 @@ class GeocoderController < ApplicationController
   before_filter :set_locale
 
   def search
-    query = params[:query]
-    results = Array.new
-
-    query.sub(/^\s+/, "")
-    query.sub(/\s+$/, "")
-
-    if query.match(/^[+-]?\d+(\.\d*)?\s*[\s,]\s*[+-]?\d+(\.\d*)?$/)
-      results.push search_latlon(query)
-    elsif query.match(/^\d{5}(-\d{4})?$/)
-      results.push search_us_postcode(query)
-    elsif query.match(/^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})$/i)
-      results.push search_uk_postcode(query)
-      results.push search_osm_namefinder(query)
-    elsif query.match(/^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i)
-      results.push search_ca_postcode(query)
+    @query = params[:query]
+    @sources = Array.new
+
+    @query.sub(/^\s+/, "")
+    @query.sub(/\s+$/, "")
+
+    if @query.match(/^[+-]?\d+(\.\d*)?\s*[\s,]\s*[+-]?\d+(\.\d*)?$/)
+      @sources.push "latlon"
+    elsif @query.match(/^\d{5}(-\d{4})?$/)
+      @sources.push "us_postcode"
+    elsif @query.match(/^(GIR 0AA|[A-PR-UWYZ]([0-9]{1,2}|([A-HK-Y][0-9]|[A-HK-Y][0-9]([0-9]|[ABEHMNPRV-Y]))|[0-9][A-HJKS-UW])\s*[0-9][ABD-HJLNP-UW-Z]{2})$/i)
+      @sources.push "uk_postcode"
+      @sources.push "osm_namefinder"
+    elsif @query.match(/^[A-Z]\d[A-Z]\s*\d[A-Z]\d$/i)
+      @sources.push "ca_postcode"
     else
-      results.push search_osm_namefinder(query)
-      results.push search_geonames(query)
+      @sources.push "osm_namefinder"
+      @sources.push "geonames"
     end
 
-    results_count = count_results(results)
-
     render :update do |page|
-      page.replace_html :sidebar_content, :partial => 'results', :object => results
-
-      if results_count == 1
-        position = results.collect { |s| s[:results] }.compact.flatten[0]
-        page.call "setPosition", position[:lat].to_f, position[:lon].to_f, position[:zoom].to_i
-      else
-        page.call "openSidebar"
-      end
-    end
-  end
-  
-  def description
-    results = Array.new
-
-    lat = params[:lat]
-    lon = params[:lon]
-
-    results.push description_osm_namefinder("cities", lat, lon, 2)
-    results.push description_osm_namefinder("towns", lat, lon, 4)
-    results.push description_osm_namefinder("places", lat, lon, 10)
-    results.push description_geonames(lat, lon)
-
-    render :update do |page|
-      page.replace_html :sidebar_content, :partial => 'results', :object => results
+      page.replace_html :sidebar_content, :partial => "search"
       page.call "openSidebar"
     end
   end
 
-private
+  def search_latlon
+    # get query parameters
+    query = params[:query]
 
-  def search_latlon(query)
-    results = Array.new
+    # create result array
+    @results = Array.new
 
     # decode the location
-    if m = query.match(/^([+-]?\d+(\.\d*)?)\s*[\s,]\s*([+-]?\d+(\.\d*)?)$/)
+    if m = query.match(/^\s*([+-]?\d+(\.\d*)?)\s*[\s,]\s*([+-]?\d+(\.\d*)?)\s*$/)
       lat = m[1].to_f
       lon = m[3].to_f
     end
 
     # generate results
     if lat < -90 or lat > 90
-      return { :source => "Internal", :url => "http://openstreetmap.org/", :error => "Latitude #{lat} out of range" }
+      @error = "Latitude #{lat} out of range"
+      render :action => "error"
     elsif lon < -180 or lon > 180
-      return { :source => "Internal", :url => "http://openstreetmap.org/", :error => "Longitude #{lon} out of range" }
+      @error = "Longitude #{lon} out of range"
+      render :action => "error"
     else
-      results.push({:lat => lat, :lon => lon,
-                    :zoom => APP_CONFIG['postcode_zoom'],
-                    :name => "#{lat}, #{lon}"})
+      @results.push({:lat => lat, :lon => lon,
+                     :zoom => APP_CONFIG['postcode_zoom'],
+                     :name => "#{lat}, #{lon}"})
 
-      return { :source => "Internal", :url => "http://openstreetmap.org/", :results => results }
+      render :action => "results"
     end
   end
 
-  def search_us_postcode(query)
-    results = Array.new
+  def search_us_postcode
+    # get query parameters
+    query = params[:query]
+
+    # create result array
+    @results = Array.new
 
     # ask geocoder.us (they have a non-commercial use api)
     response = fetch_text("http://rpc.geocoder.us/service/csv?zip=#{escape_query(query)}")
@@ -91,19 +74,24 @@ private
     # parse the response
     unless response.match(/couldn't find this zip/)
       data = response.split(/\s*,\s+/) # lat,long,town,state,zip
-      results.push({:lat => data[0], :lon => data[1],
-                    :zoom => APP_CONFIG['postcode_zoom'],
-                    :prefix => "#{data[2]}, #{data[3]}, ",
-                    :name => data[4]})
+      @results.push({:lat => data[0], :lon => data[1],
+                     :zoom => APP_CONFIG['postcode_zoom'],
+                     :prefix => "#{data[2]}, #{data[3]}, ",
+                     :name => data[4]})
     end
 
-    return { :source => "Geocoder.us", :url => "http://geocoder.us/", :results => results }
+    render :action => "results"
   rescue Exception => ex
-    return { :source => "Geocoder.us", :url => "http://geocoder.us/", :error => "Error contacting rpc.geocoder.us: #{ex.to_s}" }
+    @error = "Error contacting rpc.geocoder.us: #{ex.to_s}"
+    render :action => "error"
   end
 
-  def search_uk_postcode(query)
-    results = Array.new
+  def search_uk_postcode
+    # get query parameters
+    query = params[:query]
+
+    # create result array
+    @results = Array.new
 
     # ask npemap.org.uk to do a combined npemap + freethepostcode search
     response = fetch_text("http://www.npemap.org.uk/cgi/geocoder.fcgi?format=text&postcode=#{escape_query(query)}")
@@ -114,36 +102,44 @@ private
       data = dataline.split(/,/) # easting,northing,postcode,lat,long
       postcode = data[2].gsub(/'/, "")
       zoom = APP_CONFIG['postcode_zoom'] - postcode.count("#")
-      results.push({:lat => data[3], :lon => data[4], :zoom => zoom,
-                    :name => postcode})
+      @results.push({:lat => data[3], :lon => data[4], :zoom => zoom,
+                     :name => postcode})
     end
 
-    return { :source => "NPEMap / FreeThePostcode", :url => "http://www.npemap.org.uk/", :results => results }
+    render :action => "results"
   rescue Exception => ex
-    return { :source => "NPEMap / FreeThePostcode", :url => "http://www.npemap.org.uk/", :error => "Error contacting www.npemap.org.uk: #{ex.to_s}" }
+    @error = "Error contacting www.npemap.org.uk: #{ex.to_s}"
+    render :action => "error"
   end
 
-  def search_ca_postcode(query)
-    results = Array.new
+  def search_ca_postcode
+    # get query parameters
+    query = params[:query]
+    @results = Array.new
 
     # ask geocoder.ca (note - they have a per-day limit)
     response = fetch_xml("http://geocoder.ca/?geoit=XML&postal=#{escape_query(query)}")
 
     # parse the response
     if response.get_elements("geodata/error").empty?
-      results.push({:lat => response.get_text("geodata/latt").to_s,
-                    :lon => response.get_text("geodata/longt").to_s,
-                    :zoom => APP_CONFIG['postcode_zoom'],
-                    :name => query.upcase})
+      @results.push({:lat => response.get_text("geodata/latt").to_s,
+                     :lon => response.get_text("geodata/longt").to_s,
+                     :zoom => APP_CONFIG['postcode_zoom'],
+                     :name => query.upcase})
     end
 
-    return { :source => "Geocoder.CA", :url => "http://geocoder.ca/", :results => results }
+    render :action => "results"
   rescue Exception => ex
-    return { :source => "Geocoder.CA", :url => "http://geocoder.ca/", :error => "Error contacting geocoder.ca: #{ex.to_s}" }
+    @error = "Error contacting geocoder.ca: #{ex.to_s}"
+    render :action => "error"
   end
 
-  def search_osm_namefinder(query)
-    results = Array.new
+  def search_osm_namefinder
+    # get query parameters
+    query = params[:query]
+
+    # create result array
+    @results = Array.new
 
     # ask OSM namefinder
     response = fetch_xml("http://gazetteer.openstreetmap.org/namefinder/search.xml?find=#{escape_query(query)}")
@@ -162,14 +158,14 @@ private
         prefix = ""
         name = type
       else
-        prefix = "#{type} "
+        prefix =  t "geocoder.search_osm_namefinder.prefix", :type => type
       end
 
       if place
         distance = format_distance(place.attributes["approxdistance"].to_i)
         direction = format_direction(place.attributes["direction"].to_i)
         placename = format_name(place.attributes["name"].to_s)
-        suffix = ", #{distance} #{direction} of #{placename}"
+        suffix = t "geocoder.search_osm_namefinder.suffix_place", :distance => distance, :direction => direction, :placename => placename
 
         if place.attributes["rank"].to_i <= 30
           parent = nil
@@ -193,11 +189,11 @@ private
             parentname = format_name(parent.attributes["name"].to_s)
 
             if  place.attributes["info"].to_s == "suburb"
-              suffix = "#{suffix}, #{parentname}"
+              suffix = t "geocoder.search_osm_namefinder.suffix_suburb", :suffix => suffix, :parentname => parentname
             else
               parentdistance = format_distance(parent.attributes["approxdistance"].to_i)
               parentdirection = format_direction(parent.attributes["direction"].to_i)
-              suffix = "#{suffix} (#{parentdistance} #{parentdirection} of #{parentname})"
+              suffix = t "geocoder.search_osm_namefinder.suffix_parent", :suffix => suffix, :parentdistance => parentdistance, :parentdirection => parentdirection, :parentname => parentname
             end
           end
         end
@@ -205,18 +201,23 @@ private
         suffix = ""
       end
 
-      results.push({:lat => lat, :lon => lon, :zoom => zoom,
-                    :prefix => prefix, :name => name, :suffix => suffix,
-                    :description => description})
+      @results.push({:lat => lat, :lon => lon, :zoom => zoom,
+                     :prefix => prefix, :name => name, :suffix => suffix,
+                     :description => description})
     end
 
-    return { :source => "OpenStreetMap Namefinder", :url => "http://gazetteer.openstreetmap.org/namefinder/", :results => results }
+    render :action => "results"
   rescue Exception => ex
-    return { :source => "OpenStreetMap Namefinder", :url => "http://gazetteer.openstreetmap.org/namefinder/", :error => "Error contacting gazetteer.openstreetmap.org: #{ex.to_s}" }
+    @error = "Error contacting gazetteer.openstreetmap.org: #{ex.to_s}"
+    render :action => "error"
   end
 
-  def search_geonames(query)
-    results = Array.new
+  def search_geonames
+    # get query parameters
+    query = params[:query]
+
+    # create result array
+    @results = Array.new
 
     # ask geonames.org
     response = fetch_xml("http://ws.geonames.org/search?q=#{escape_query(query)}&maxRows=20")
@@ -227,19 +228,41 @@ private
       lon = geoname.get_text("lng").to_s
       name = geoname.get_text("name").to_s
       country = geoname.get_text("countryName").to_s
-      results.push({:lat => lat, :lon => lon,
-                    :zoom => APP_CONFIG['geonames_zoom'],
-                    :name => name,
-                    :suffix => ", #{country}"})
+      @results.push({:lat => lat, :lon => lon,
+                     :zoom => APP_CONFIG['geonames_zoom'],
+                     :name => name,
+                     :suffix => ", #{country}"})
     end
 
-    return { :source => "GeoNames", :url => "http://www.geonames.org/", :results => results }
+    render :action => "results"
   rescue Exception => ex
-    return { :source => "GeoNames", :url => "http://www.geonames.org/", :error => "Error contacting ws.geonames.org: #{ex.to_s}" }
+    @error = "Error contacting ws.geonames.org: #{ex.to_s}"
+    render :action => "error"
   end
+  
+  def description
+    @sources = Array.new
 
-  def description_osm_namefinder(types, lat, lon, max)
-    results = Array.new
+    @sources.push({ :name => "osm_namefinder", :types => "cities", :max => 2 })
+    @sources.push({ :name => "osm_namefinder", :types => "towns", :max => 4 })
+    @sources.push({ :name => "osm_namefinder", :types => "places", :max => 10 })
+    @sources.push({ :name => "geonames" })
+
+    render :update do |page|
+      page.replace_html :sidebar_content, :partial => "description"
+      page.call "openSidebar"
+    end
+  end
+
+  def description_osm_namefinder
+    # get query parameters
+    lat = params[:lat]
+    lon = params[:lon]
+    types = params[:types]
+    max = params[:max]
+
+    # create result array
+    @results = Array.new
 
     # ask OSM namefinder
     response = fetch_xml("http://gazetteer.openstreetmap.org/namefinder/search.xml?find=#{types}+near+#{lat},#{lon}&max=#{max}")
@@ -255,19 +278,25 @@ private
       description = named.elements["description"].to_s
       distance = format_distance(place.attributes["approxdistance"].to_i)
       direction = format_direction((place.attributes["direction"].to_i - 180) % 360)
-      prefix = "#{distance} #{direction} of #{type} "
-      results.push({:lat => lat, :lon => lon, :zoom => zoom,
-                    :prefix => prefix.capitalize, :name => name,
-                    :description => description})
+      prefix = t "geocoder.description_osm_namefinder.prefix", :distance => distance, :direction => direction, :type => type
+      @results.push({:lat => lat, :lon => lon, :zoom => zoom,
+                     :prefix => prefix.capitalize, :name => name,
+                     :description => description})
     end
 
-    return { :type => types.capitalize, :source => "OpenStreetMap Namefinder", :url => "http://gazetteer.openstreetmap.org/namefinder/", :results => results }
+    render :action => "results"
   rescue Exception => ex
-    return { :type => types.capitalize, :source => "OpenStreetMap Namefinder", :url => "http://gazetteer.openstreetmap.org/namefinder/", :error => "Error contacting gazetteer.openstreetmap.org: #{ex.to_s}" }
+    @error = "Error contacting gazetteer.openstreetmap.org: #{ex.to_s}"
+    render :action => "error"
   end
 
-  def description_geonames(lat, lon)
-    results = Array.new
+  def description_geonames
+    # get query parameters
+    lat = params[:lat]
+    lon = params[:lon]
+
+    # create result array
+    @results = Array.new
 
     # ask geonames.org
     response = fetch_xml("http://ws.geonames.org/countrySubdivision?lat=#{lat}&lng=#{lon}")
@@ -276,14 +305,17 @@ private
     response.elements.each("geonames/countrySubdivision") do |geoname|
       name = geoname.get_text("adminName1").to_s
       country = geoname.get_text("countryName").to_s
-      results.push({:prefix => "#{name}, #{country}"})
+      @results.push({:prefix => "#{name}, #{country}"})
     end
 
-    return { :type => "Location", :source => "GeoNames", :url => "http://www.geonames.org/", :results => results }
+    render :action => "results"
   rescue Exception => ex
-    return { :type => "Location", :source => "GeoNames", :url => "http://www.geonames.org/", :error => "Error contacting ws.geonames.org: #{ex.to_s}" }
+    @error = "Error contacting ws.geonames.org: #{ex.to_s}"
+    render :action => "error"
   end
 
+private
+
   def fetch_text(url)
     return Net::HTTP.get(URI.parse(url))
   end
@@ -293,19 +325,18 @@ private
   end
 
   def format_distance(distance)
-    return "less than 1km" if distance == 0
-    return "about #{distance}km"
+    return t("geocoder.distance", :count => distance)
   end
 
   def format_direction(bearing)
-    return "south-west" if bearing >= 22.5 and bearing < 67.5
-    return "south" if bearing >= 67.5 and bearing < 112.5
-    return "south-east" if bearing >= 112.5 and bearing < 157.5
-    return "east" if bearing >= 157.5 and bearing < 202.5
-    return "north-east" if bearing >= 202.5 and bearing < 247.5
-    return "north" if bearing >= 247.5 and bearing < 292.5
-    return "north-west" if bearing >= 292.5 and bearing < 337.5
-    return "west"
+    return t("geocoder.direction.south_west") if bearing >= 22.5 and bearing < 67.5
+    return t("geocoder.direction.south") if bearing >= 67.5 and bearing < 112.5
+    return t("geocoder.direction.south_east") if bearing >= 112.5 and bearing < 157.5
+    return t("geocoder.direction.east") if bearing >= 157.5 and bearing < 202.5
+    return t("geocoder.direction.north_east") if bearing >= 202.5 and bearing < 247.5
+    return t("geocoder.direction.north") if bearing >= 247.5 and bearing < 292.5
+    return t("geocoder.direction.north_west") if bearing >= 292.5 and bearing < 337.5
+    return t("geocoder.direction.west")
   end
 
   def format_name(name)
diff --git a/app/views/geocoder/_description.html.erb b/app/views/geocoder/_description.html.erb
new file mode 100644 (file)
index 0000000..7d93179
--- /dev/null
@@ -0,0 +1,13 @@
+<% @sources.each do |source| %>
+  <% if source[:types] %>
+    <p class="search_results_heading"><%= t("geocoder.description.title.#{source[:name]}", :types => t("geocoder.description.types.#{source[:types]}")) %></p>
+  <% else %>
+    <p class="search_results_heading"><%= t("geocoder.description.title.#{source[:name]}") %></p>
+  <% end %>
+  <div class='search_results_entry' id='<%= "description_#{source[:name]}_#{source[:types]}" %>'>
+    <%= image_tag "searching.gif", :class => "search_searching" %>
+  </div>
+  <script type="text/javascript">
+    <%= remote_function :update => "description_#{source[:name]}_#{source[:types]}", :url => { :action => "description_#{source[:name]}", :lat => params[:lat], :lon => params[:lon], :types => source[:types], :max => source[:max] } %>
+  </script>
+<% end %>
diff --git a/app/views/geocoder/_results.html.erb b/app/views/geocoder/_results.html.erb
deleted file mode 100644 (file)
index bf42244..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-<% results.each do |source| %>
-<% type = source[:type] || t('geocoder.results.results') %>
-<p class="search_results_heading"><%= t'geocoder.results.type_from_source', :type => type, :source_link => link_to(source[:source], source[:url]) %></p>
-<% if source[:results] %>
-<% if source[:results].empty? %>
-<p class="search_results_entry"><%= t'geocoder.results.no_results' %></p>
-<% else %>
-<% source[:results].each do |result| %>
-<p class="search_results_entry"><%= result_to_html(result) %></p>
-<% end %>
-<% end %>
-<% else %>
-<p class="search_results_error"><%= source[:error] %></p>
-<% end %>
-<% end %>
diff --git a/app/views/geocoder/_search.html.erb b/app/views/geocoder/_search.html.erb
new file mode 100644 (file)
index 0000000..0d0ed24
--- /dev/null
@@ -0,0 +1,9 @@
+<% @sources.each do |source| %>
+  <p class="search_results_heading"><%= t "geocoder.search.title.#{source}" %></p>
+  <div class='search_results_entry' id='<%= "search_#{source}" %>'>
+    <%= image_tag "searching.gif", :class => "search_searching" %>
+  </div>
+  <script type="text/javascript">
+    <%= remote_function :update => "search_#{source}", :url => { :action => "search_#{source}", :query => @query } %>
+  </script>
+<% end %>
diff --git a/app/views/geocoder/error.html.erb b/app/views/geocoder/error.html.erb
new file mode 100644 (file)
index 0000000..e2ce07b
--- /dev/null
@@ -0,0 +1 @@
+<p class="search_results_error"><%= @error %></p>
diff --git a/app/views/geocoder/results.html.erb b/app/views/geocoder/results.html.erb
new file mode 100644 (file)
index 0000000..70051c9
--- /dev/null
@@ -0,0 +1,7 @@
+<% if @results.empty? %>
+  <p class="search_results_entry"><%= t 'geocoder.results.no_results' %></p>
+<% else %>
+  <% @results.each do |result| %>
+    <p class="search_results_entry"><%= result_to_html(result) %></p>
+  <% end %>
+<% end %>
index 241bf1817eba764da60c046460a08f938675aeb6..320161fa0b1fcdb4f3fba1d4c899ee08ab1dae81 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%= I18n.locale %>" lang="<%= I18n.locale %>" dir="<% t'html.dir' %>">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<%= I18n.locale %>" lang="<%= I18n.locale %>" dir="<%= t'html.dir' %>">
   <head>
     <%= javascript_include_tag 'prototype' %>
     <%= javascript_include_tag 'site' %>
index d6c1e38fa08b24e8449be7c3292e4ae890c3e91a..12b8bccc558e5d10b07e7c56f594cd7f81b32c5e 100644 (file)
@@ -1,29 +1,19 @@
 <script type="text/javascript">
 <!--
   function startSearch() {
-    updateSidebar("<%= t 'site.sidebar.search_results' %>", "<p class='search_results_entry'><%= t 'site.search.searching' %><\/p>");
-
-    $("search_field").style.display = "none";
-    $("search_active").style.display = "inline";
-  }
-
-  function endSearch() {
-    $("search_field").style.display = "inline";
-    $("search_active").style.display = "none";
+    updateSidebar("<%= t 'site.sidebar.search_results' %>", "");
   }
 
   function describeLocation() {
     var position = getPosition();
 
     <%= remote_function(:loading => "startSearch()",
-                        :complete => "endSearch()",
                         :url => { :controller => :geocoder, :action => :description },
                         :with => "'lat=' + position.lat + '&lon=' + position.lon") %>
   }
 
   <% if params[:query] %>
   <%= remote_function(:loading => "startSearch()",
-                      :complete => "endSearch()",
                       :url => { :controller => :geocoder, :action => :search, :query => h(params[:query]) }) %>
   <% end %>
 // -->
@@ -42,7 +32,6 @@
       <%= submit_tag t('site.search.submit_text') %>
     <% end %>
     </div>
-    <p id="search_active"><%= t 'site.search.searching' %></p>
     </div>
     <p class="search_help">
       <%= t 'site.search.search_help' %>
index 0dbc09dd3484f0f9580f39f1e9a0ce476dcfaf33..e50610037e7bde0d4f9ab4b17deedba56c1484e9 100644 (file)
       <% end %>
       </td>
       <td class="username"><%= link_to h(@friend.display_name), :controller => 'user', :action => 'view',  :display_name => @friend.display_name %></td>
-      <td><% if @friend.home_lon and @friend.home_lat %><%= t 'user.view.km away', :count => @this_user.distance(@friend).round %><% end %></td>
+      <td>
+        <% if @friend.home_lon and @friend.home_lat %>
+          <% distance = @this_user.distance(@friend) %>
+          <% if distance < 1 %>
+            <%= t 'user.view.m away', :count => (distance * 1000).round %>
+          <% else %>
+            <%= t 'user.view.km away', :count => distance.round %>
+          <% end %>
+        <% end %>
+      </td>
       <td class="message">(<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :user_id => @friend.id %>)</td>
       </tr>
       <%end%>
       <% @this_user.nearby.each do |nearby| %>
       <tr>
       <td class="username"><%= link_to h(nearby.display_name), :controller => 'user', :action => 'view',  :display_name => nearby.display_name %></td>
-      <td><%= t 'user.view.km away', :count => @this_user.distance(nearby).round %></td>
+      <td>
+        <% distance = @this_user.distance(nearby) %>
+        <% if distance < 1 %>
+          <%= t 'user.view.m away', :count => (distance * 1000).round %>
+        <% else %>
+          <%= t 'user.view.km away', :count => distance.round %>
+        <% end %>
+      </td>
       <td class="message">(<%= link_to t('user.view.send message'), :controller => 'message', :action => 'new', :user_id => nearby.id %>)</td>
       </tr>
       <% end %>
index c1537edef3d9be1e264636f9a500ca88448d1749..e07a9c295dfadcf8d281fc77e96316e64c58134d 100644 (file)
@@ -31,7 +31,7 @@ server.errorlog = "/var/log/lighttpd/error.log"
 #
 # Allow munin to monitor the server's status
 #
-$HTTP["remoteip"] == "127.0.0.1" { 
+$HTTP["remoteip"] == "128.40.168.98" { 
   status.config-url = "/server-config"
   status.status-url = "/server-status"
   status.statistics-url = "/server-statistics"
@@ -49,6 +49,14 @@ $HTTP["remoteip"] == "143.210.16.160" { url.access-deny = ("") }
 #
 #$HTTP["useragent"] == "tilesAtHome" { url.access-deny = ("") }
 
+#
+# Block JOSM revisions  1722-1727 as they have a serious bug that causes
+# lat/lon to be swapped (http://josm.openstreetmap.de/ticket/2804)
+#
+$HTTP["useragent"] =~ "^JOSM/[0-9]+\.[0-9]+ \(172[234567] .*\)$" {
+  url.access-deny = ("")
+}
+
 #
 # Limit connections to 20 per IP address
 #
@@ -61,6 +69,7 @@ mimetype.assign = (
   ".css" => "text/css",
   ".gif" => "image/gif",
   ".html" => "text/html; charset=utf-8",
+  ".jpg" => "image/jpeg",
   ".js" => "application/x-javascript",
   ".png" => "image/png",
   ".swf" => "application/x-shockwave-flash",
@@ -136,13 +145,13 @@ server.document-root = "/home/rails/public"
 #
 # Send everything else to the appropriate FastCGI server
 #
-$HTTP["useragent"] == "tilesAtHome" {
+$HTTP["useragent"] =~ "^tilesAtHome" {
   server.error-handler-404 = "/dispatch.tah"
 }
-else $HTTP["url"] =~ "^/api/0\.6/(map|trackpoints|amf|amf/read|swf/trackpoints)$" {
+else $HTTP["url"] =~ "^/api/0\.6/(map|trackpoints|amf|amf/read|swf/trackpoints|changeset/[0-9]+/upload)$" {
   server.error-handler-404 = "/dispatch.bulkapi"
 }
-else $HTTP["url"] =~ "^/api/0\.6/.*/search$" {
+else $HTTP["url"] =~ "^/api/0\.6/.*/(full|search)$" {
   server.error-handler-404 = "/dispatch.bulkapi"
 }
 else $HTTP["url"] =~ "^/api/0\.6/" {
@@ -151,6 +160,12 @@ else $HTTP["url"] =~ "^/api/0\.6/" {
 else $HTTP["url"] =~ "^/api/0\.[0-9]+/" {
   url.access-deny = ("")
 }
+else $HTTP["url"] =~ "^/geocoder/(search|description)_osm_namefinder$" {
+  server.error-handler-404 = "/dispatch.namefinder"
+}
+else $HTTP["url"] =~ "^/geocoder/(search|description)_geonames$" {
+  server.error-handler-404 = "/dispatch.geonames"
+}
 else $HTTP["url"] =~ "^/" {
   server.error-handler-404 = "/dispatch.web"
 }
@@ -185,12 +200,20 @@ fastcgi.server = (
     ( "host" => "127.0.0.1", "port" => 8022, "check-local" => "disable" ),
     ( "host" => "127.0.0.1", "port" => 8023, "check-local" => "disable" ),
     ( "host" => "127.0.0.1", "port" => 8024, "check-local" => "disable" ),
-    ( "host" => "127.0.0.1", "port" => 8025, "check-local" => "disable" ),
+    ( "host" => "127.0.0.1", "port" => 8025, "check-local" => "disable" )
+  ),
+  ".namefinder" => (
     ( "host" => "127.0.0.1", "port" => 8026, "check-local" => "disable" ),
     ( "host" => "127.0.0.1", "port" => 8027, "check-local" => "disable" ),
     ( "host" => "127.0.0.1", "port" => 8028, "check-local" => "disable" ),
     ( "host" => "127.0.0.1", "port" => 8029, "check-local" => "disable" )
   ),
+  ".geonames" => (
+    ( "host" => "127.0.0.1", "port" => 8030, "check-local" => "disable" ),
+    ( "host" => "127.0.0.1", "port" => 8031, "check-local" => "disable" ),
+    ( "host" => "127.0.0.1", "port" => 8032, "check-local" => "disable" ),
+    ( "host" => "127.0.0.1", "port" => 8033, "check-local" => "disable" )
+  ),
   ".api" => (
     ( "host" => "127.0.0.1", "port" => 8030, "check-local" => "disable" ),
     ( "host" => "127.0.0.1", "port" => 8031, "check-local" => "disable" ),
@@ -220,14 +243,32 @@ fastcgi.server = (
     ( "host" => "10.0.0.12", "port" => 8002, "check-local" => "disable" ),
     ( "host" => "10.0.0.10", "port" => 8003, "check-local" => "disable" ),
     ( "host" => "10.0.0.11", "port" => 8003, "check-local" => "disable" ),
-    ( "host" => "10.0.0.12", "port" => 8003, "check-local" => "disable" )
-  ),
-  ".tah" => (
+    ( "host" => "10.0.0.12", "port" => 8003, "check-local" => "disable" ),
     ( "host" => "10.0.0.10", "port" => 8004, "check-local" => "disable" ),
     ( "host" => "10.0.0.11", "port" => 8004, "check-local" => "disable" ),
     ( "host" => "10.0.0.12", "port" => 8004, "check-local" => "disable" ),
     ( "host" => "10.0.0.10", "port" => 8005, "check-local" => "disable" ),
     ( "host" => "10.0.0.11", "port" => 8005, "check-local" => "disable" ),
-    ( "host" => "10.0.0.12", "port" => 8005, "check-local" => "disable" )
+    ( "host" => "10.0.0.12", "port" => 8005, "check-local" => "disable" ),
+    ( "host" => "10.0.0.10", "port" => 8006, "check-local" => "disable" ),
+    ( "host" => "10.0.0.11", "port" => 8006, "check-local" => "disable" ),
+    ( "host" => "10.0.0.12", "port" => 8006, "check-local" => "disable" ),
+    ( "host" => "10.0.0.10", "port" => 8007, "check-local" => "disable" ),
+    ( "host" => "10.0.0.11", "port" => 8007, "check-local" => "disable" ),
+    ( "host" => "10.0.0.12", "port" => 8007, "check-local" => "disable" ),
+    ( "host" => "10.0.0.10", "port" => 8008, "check-local" => "disable" ),
+    ( "host" => "10.0.0.11", "port" => 8008, "check-local" => "disable" ),
+    ( "host" => "10.0.0.12", "port" => 8008, "check-local" => "disable" ),
+    ( "host" => "10.0.0.10", "port" => 8009, "check-local" => "disable" ),
+    ( "host" => "10.0.0.11", "port" => 8009, "check-local" => "disable" ),
+    ( "host" => "10.0.0.12", "port" => 8009, "check-local" => "disable" ),
+    ( "host" => "10.0.0.10", "port" => 8010, "check-local" => "disable" ),
+    ( "host" => "10.0.0.11", "port" => 8010, "check-local" => "disable" ),
+    ( "host" => "10.0.0.12", "port" => 8010, "check-local" => "disable" ),
+  ),
+  ".tah" => (
+    ( "host" => "10.0.0.10", "port" => 8011, "check-local" => "disable" ),
+    ( "host" => "10.0.0.11", "port" => 8011, "check-local" => "disable" ),
+    ( "host" => "10.0.0.12", "port" => 8011, "check-local" => "disable" )
   )
 )
index 4eba9b4328c287d06ce2c3cf3f3f28caf8b3e728..ab79381615e887b4b3803c21f3ee1d131edfec1c 100644 (file)
@@ -286,9 +286,15 @@ be:
       add_marker: "Дадаць маркер на карту"
       view_larger_map: "Прагледзець большую карту"
   geocoder:
+    search:
+      title:
+        latlon: 'Рэзультаты з <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Рэзультаты з <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Рэзультаты з <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Рэзультаты з <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Рэзультаты з <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Рэзультаты з <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Рэзультаты"
-      type_from_source: "{{type}} з {{source_link}}"
       no_results: "Нічога не знойдзена"
   layouts:
     welcome_user: "Вітаем, {{user_link}}"
@@ -432,7 +438,6 @@ be:
       search: Пошук
       where_am_i: "Дзе я?"
       submit_text: "=>"
-      searching: "Пошук..."
       search_help: "напрыклад: 'Мінск', 'Regent Street, Cambridge', 'CB2 5AQ', ці 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>больш прыкладаў...</a>"
     key:
       map_key: "Ключ карты"
index b3a5549ad7ea77945fcb5ae70918f863d4ab28a5..611935a2e83d5d2fd16a9746d34ed31313c7fee3 100644 (file)
@@ -338,9 +338,15 @@ de:
       add_marker: "Markierung zur Karte hinzufügen"
       view_larger_map: "Größere Karte anzeigen"
   geocoder:
+    search:
+      title:
+        latlon: 'Suchergebnisse von <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Suchergebnisse von <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Suchergebnisse von <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Suchergebnisse von <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Suchergebnisse von <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Suchergebnisse von <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Suchergebnisse"
-      type_from_source: "{{type}} von {{source_link}}"
       no_results: "Keine Ergebnisse"
   layouts:
     project_name:
@@ -578,7 +584,6 @@ de:
       search: Suchen
       where_am_i: "Wo bin ich?"
       submit_text: "Go"
-      searching: "Suche..."
       search_help: "Beispiele: 'München', 'Heinestraße, Würzburg', 'CB2 5AQ', oder 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>mehr Beispiele...</a>"
     key:
       map_key: "Legende"
index c52e9b47475ed7055704f246a359340e1012541f..e11cda46a670b0b7082cd1c0d82af475ecfad3d9 100644 (file)
@@ -331,10 +331,44 @@ en:
       add_marker: "Add a marker to the map"
       view_larger_map: "View Larger Map"
   geocoder:
+    search:
+      title:
+        latlon: 'Results from <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Results from <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Results from <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Results from <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Results from <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Results from <a href="http://www.geonames.org/">GeoNames</a>'
+    search_osm_namefinder:
+      prefix: "{{type}} "
+      suffix_place: ", {{distance}} {{direction}} of {{placename}}"
+      suffix_parent: "{{suffix}} ({{parentdistance}} {{parentdirection}} of {{parentname}})"
+      suffix_suburb: "{{suffix}}, {{parentname}}"
+    description:
+      title:
+        osm_namefinder: '{{types}} from <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Location from <a href="http://www.geonames.org/">GeoNames</a>'
+      types:
+        cities: Cities
+        towns: Towns
+        places: Places
+    description_osm_namefinder:
+      prefix: "{{distance}} {{direction}} of {{type}} "
     results:
-      results: "Results"
-      type_from_source: "{{type}} from {{source_link}}"
       no_results: "No results found"
+    distance:
+      zero: "less than 1km"
+      one: "about 1km"
+      other: "about {{count}}km"
+    direction:
+      south_west: "south-west"
+      south: "south"
+      south_east: "south-east"
+      east: "east"
+      north_east: "north-east"
+      north: "north"
+      north_west: "north-west"
+      west: "west"
   layouts:
     project_name:
       # in <title>
@@ -571,7 +605,6 @@ en:
       search: Search
       where_am_i: "Where am I?"
       submit_text: "Go"
-      searching: "Searching..."
       search_help: "examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', or 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>more examples...</a>"
     key:
       map_key: "Map key"
@@ -793,6 +826,7 @@ en:
       your friends: Your friends
       no friends: You have not added any friends yet.
       km away: "{{count}}km away"
+      m away: "{{count}}m away"
       nearby users: "Nearby users: "
       no nearby users: "There are no users who admit to mapping nearby yet."
       change your settings: change your settings
index e36a7d9d5a5e93462eaeb59a5b9475e4e588592b..7516e0300fe30518febf776850763ecb421d4562 100644 (file)
@@ -309,9 +309,15 @@ es:
       add_marker: "Añadir un marcador al mapa"
       view_larger_map: "Ver mapa más grande"
   geocoder:
+    search:
+      title:
+        latlon: 'Resultados en <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Resultados en <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Resultados en <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Resultados en <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Resultados en <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Resultados en <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Resultados"
-      type_from_source: "{{type}} en {{source_link}}"
       no_results: "No se han encontrado resultados"
   layouts:
     project_name:
@@ -514,7 +520,6 @@ es:
       search: "Buscar"
       where_am_i: "¿Dónde estoy?"
       submit_text: "Ir"
-      searching: "Buscando..."
   trace:
     edit:
       points: "Puntos:"
index 521ebe59b3a03d70f42ad084d0ec307f6c7ce049..83481d9f3e5322dd835b75538232193739139064 100644 (file)
@@ -163,7 +163,6 @@ fr:
       search: "Recherche"
       where_am_i: "Où suis-je ?"
       submit_text: "Envoyer"
-      searching: "En cours de recherche..."
       search_help: "exemples : 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', ou 'bureaux de poste près de Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>Autres d'exemples...</a>"
     key:
       map_key: "Légende de la carte"
index 3f7f38b09ad83bbbc13f4c3f8a3bcb26faf6b82c..45c1680285ad33f7f16822a62d80b761324ecfdf 100644 (file)
@@ -288,8 +288,6 @@ he:
       view_larger_map: "View Larger Map"
   geocoder:
     results:
-      results: "Results"
-      type_from_source: "{{type}} from {{source_link}}"
       no_results: "No results found"
   layouts:
     welcome_user: "{{user_link}}ברוך הבא"
@@ -435,7 +433,6 @@ he:
       search: Search
       where_am_i: "Where am I?"
       submit_text: "Go"
-      searching: "Searching..."
       search_help: "examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', or 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>more examples...</a>"
     key:
       map_key: "Map key"
index e9f1b66111cc632dd2f2ab01b277d606b8615314..4374e5303dfbd7f5132ae2c06452e55c09f83e11 100644 (file)
@@ -315,8 +315,6 @@ hi:
       view_larger_map: "View Larger Map"
   geocoder:
     results:
-      results: "Results"
-      type_from_source: "{{type}} from {{source_link}}"
       no_results: "No results found"
   layouts:
     welcome_user: "Welcome, {{user_link}}"
@@ -499,7 +497,6 @@ hi:
       search: Search
       where_am_i: "Where am I?"
       submit_text: "Go"
-      searching: "Searching..."
       search_help: "examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', or 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>more examples...</a>"
     key:
       map_key: "Map key"
index 3f4e68fe24397fd01ebad015e18ac8a265eb3597..c6484ad8ddb9be54715f98d41d3a9d3a3025615d 100644 (file)
@@ -349,10 +349,34 @@ is:
       add_marker: "Bæta við punkt á kortið"
       view_larger_map: "Skoða á stærra korti"
   geocoder:
+    search:
+      title:
+        latlon: 'Niðurstöður frá <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Niðurstöður frá <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Niðurstöður frá <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Niðurstöður frá <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Niðurstöður frá <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Niðurstöður frá <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Niðurstöður"
-      type_from_source: "{{type}} frá {{source_link}}"
       no_results: "Ekkert fannst"
+      namefinder:
+        prefix: "{{type}} "
+        suffix_place: ", {{distance}} {{direction}} af {{placename}}"
+        suffix_parent: "{{suffix}} ({{parentdistance}} {{parentdirection}} af {{parentname}})"
+        suffix_suburb: "{{suffix}}, {{parentname}}"
+      distance:
+        zero: "minna en 1km"
+        one: "u.þ.b. 1km"
+        other: "u.þ.b. {{count}}km"
+      direction:
+        south_west: "suðvestur"
+        south: "suður"
+        south_east: "suðaustur"
+        east: "austur"
+        north_east: "norðaustur"
+        north: "norður"
+        north_west: "norðvestur"
+        west: "vestur"
   layouts:
     project_name:
       # in <title>
@@ -587,7 +611,6 @@ is:
       search: "Leita"
       where_am_i: "Hvar er ég?"
       submit_text: "Ok"
-      searching: "Leita..."
       search_help: "dæmi: „Akureyri“, „Laugavegur, Reykjavík“ eða „post offices near Lünen“. Sjá einnig <a href='http://wiki.openstreetmap.org/index.php?uselang=is&title=Search'>leitarhjálpina</a>."
     key:
       map_key: "Kortaskýringar"
@@ -812,6 +835,7 @@ is:
       your friends: Vinir þínir
       no friends: Þú átt enga vini
       km away: "í {{count}} km fjarlægð"
+      m away: "í {{count}} m fjarlægð"
       nearby users: "Nálægir notendur:"
       no nearby users: "Engir notendur hafa stillt staðsetningu sína nálægt þér."
       change your settings: "breyttu stillingunum þínum"
index a35ff34a1e96148cf8267ee4979d68547cdee9f8..d4c83fa7a3859a83741dff9d0c42f423c9a984dd 100644 (file)
@@ -287,9 +287,15 @@ it:
       add_marker: "Aggiungi un marcatore alla mappa"
       view_larger_map: "Visualizza una mappa più ampia"
   geocoder:
+    search:
+      title:
+        latlon: 'Risultati da <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Risultati da <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Risultati da <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Risultati da <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Risultati da <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Risultati da <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Risultati"
-      type_from_source: "{{type}} da {{source_link}}"
       no_results: "Nessun risultato"
   layouts:
     welcome_user: "Benvenuto, {{user_link}}"
@@ -433,7 +439,6 @@ it:
       search: Cerca
       where_am_i: "Dove sono?"
       submit_text: "Vai"
-      searching: "Ricerca in corso..."
       search_help: "esempi: 'Trieste', 'Via Dante Alighieri, Trieste', 'CB2 5AQ', oppure 'post offices near Trieste' <a href='http://wiki.openstreetmap.org/wiki/Search'>altri esempi...</a>"
     key:
       map_key: "Legenda"
index 2864de141c0678f1bc25958b19dc0601c212ef5a..bf7c2e8a244d90764a3318274ef82eff2b587827 100644 (file)
@@ -318,9 +318,15 @@ ja:
       add_marker: "マーカーを地図に追加する"
       view_larger_map: "大きな地図を表示..."
   geocoder:
+    search:
+      title:
+        latlon: '<a href="http://openstreetmap.org/">Internal</a>からの結果'
+        us_postcode: '<a href="http://geocoder.us/">Geocoder.us</a>からの結果'
+        uk_postcode: '<a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>からの結果'
+        ca_postcode: '<a href="http://geocoder.ca/">Geocoder.CA</a>からの結果'
+        osm_namefinder: '<a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>からの結果'
+        geonames: '<a href="http://www.geonames.org/">GeoNames</a>からの結果'
     results:
-      results: "結果"
-      type_from_source: "{{source_link}}からの{{type}}"
       no_results: "見つかりませんでした。"
   layouts:
     project_name:
@@ -560,7 +566,6 @@ ja:
       search: "検索"
       where_am_i: "いまどこ?"
       submit_text: "行く"
-      searching: "検索中..."
       search_help: "例: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', or 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>他の例...</a>"
       #いずれ、wiki.openstreetmap.org/wiki/Ja:Searchを作成すること
     key:
index 96634658de6c3474195d36f32a17b579fd15ec0a..41f6f9e96850c82e0dddf678eb077b98bd1e2c90 100644 (file)
@@ -16,20 +16,20 @@ ko:
       node: "노드"
       node_tag: "노드 태그"
       notifier: "알림자"
-      old_node: "Old Node"
-      old_node_tag: "Old Node Tag"
-      old_relation: "Old Relation"
-      old_relation_member: "Old Relation Member"
-      old_relation_tag: "Old Relation Tag"
+      old_node: "옛 노드"
+      old_node_tag: "옛 노드 태그"
+      old_relation: "옛 관계"
+      old_relation_member: "옛 관계 멤버"
+      old_relation_tag: "옛 관계 태그"
       old_way: "Old Way"
       old_way_node: "Old Way Node"
       old_way_tag: "Old Way Tag"
       relation: "관계"
-      relation_member: "Relation Member"
+      relation_member: "관계 멤버"
       relation_tag: "관계 태그"
       session: "세션"
       trace: "발자취"
-      tracepoint: "Trace Point"
+      tracepoint: "발자취 지점"
       tracetag: "발자취 태그"
       user: "사용자"
       user_preference: "사용자 환경"
@@ -53,7 +53,7 @@ ko:
         friend: "친구"
       trace:
         user: "사용자"
-        visible: "Visible"
+        visible: "일람 가능"
         name: "이름"
         size: "크기"
         latitude: "위도"
@@ -66,8 +66,8 @@ ko:
         body: "내용"
         recipient: "받는 사람"
       user:
-        email: "Email"
-        active: "Active"
+        email: "전자 우편"
+        active: "활성"
         display_name: "표시 이름"
         description: "설명"
         languages: "언어"
@@ -91,9 +91,9 @@ ko:
       no_bounding_box: "이 변경셋을 위해 저장된 경계가 없습니다."
       show_area_box: "영역 표시"
       box: "box"
-      has_nodes: "Has the following {{count}} nodes:"
-      has_ways: "Has the following {{count}} ways:"
-      has_relations: "Has the following {{count}} relations:"
+      has_nodes: "는(은) 다음 {{count}} 개의 노드를 가지고 있습니다:"
+      has_ways: "는(은) 다음 {{count}} 개의 길을 가지고 있습니다:"
+      has_relations: "는(은) 다음 {{count}} 개의 관계를 가지고 있습니다:"
     common_details: 
       edited_at: "편집일:"
       edited_by: "편집자:"
@@ -149,25 +149,25 @@ ko:
       zoom_or_select: "확대 또는 보고 싶은 지도의 지역을 선택하세요"
       drag_a_box: "지역을 보기 위해 지도로 끌어 놓으세요."
       manually_select: "다른 지역 선택"
-      loaded_an_area_with_num_features: "You have loaded an area which contains [[num_features]] features. In general, some browsers may not cope well with displaying this quantity of data. Generally, browsers work best at displaying less than 100 features at a time: doing anything else may make your browser slow/unresponsive. If you are sure you want to display this data, you may do so by clicking the button below."
+      loaded_an_area_with_num_features: "당신은 [[num_features]] 개의 특성을 가진 지역을 로드하였습니다. 경우에 따라, 어떤 브라우저에서는 이 데이터를 모두 처리하지 못 할 수도 있습니다. 일반적으로, 브라우저들은 대게 100개 이하의 특성을 처리하여 보여줄 수 있습니다. 그렇지 않은 경우, 브라우저의 속도가 저하되거나 브라우저의 반응이 느려질 수 있습니다. 여전히 이 데이터를 표시하려면, 아래의 버튼을 클릭하여 주십시오."
       load_data: "정보 불러 오기"
-      unable_to_load_size: "불러 오기 실패: Bounding box size of [[bbox_size]] is too large (must be smaller than {{max_bbox_size}})"
+      unable_to_load_size: "불러 오기 실패: 표시하려는 지역([[bbox_size]])의 설정 박스가 너무 큽니다. {{max_bbox_size}}까지 표시할 수 있습니다."
       loading: "불러 오는 중..."
       show_history: "이력 보기"
       wait: "잠시만 기다려 주세요..."
       history_for_feature: "[[feature]]의 이력"
       details: "세부 사항"
-      private_user: "private user"
-      edited_by_user_at_timestamp: "Edited by [[user]] at [[timestamp]]"
+      private_user: "개인 유저"
+      edited_by_user_at_timestamp: "[[timestamp]]에 [[user]]가 수정"
       object_list:
-        heading: "Object list"
-        back: "Display object list"
+        heading: "개체 목록"
+        back: "개체 목록 표시"
         type:
           node: "노드"
           way: "길"
           # There's no 'relation' type because it isn't represented in OpenLayers
-        api: "Retrieve this area from the API"
-        details: "Details"
+        api: "API로부터 이 지역 회수"
+        details: "세부 사항"
         selected:
           type:
             node: "노드 [[id]]"
@@ -179,13 +179,13 @@ ko:
             way: "길 [[id]]"
             # There's no 'relation' type because it isn't represented in OpenLayers
     tag_details:
-      tags: "Tags:"
+      tags: "태그들:"
     way_details:
       nodes: "노드:"
-      part_of: "Part of:"
+      part_of: "포함되는 길:"
       also_part_of:
-        one: "also part of way {{related_ways}}"
-        other: "also part of ways {{related_ways}}"
+        one: "{{related_ways}}의 일부"
+        other: "{{related_ways}}의 일부"
     way_history:
       way_history: "길 이력"
       way_history_title: "길 이력: {{way_name}}"
@@ -203,26 +203,26 @@ ko:
       showing_page: "Showing page"
       of: "of"
     changeset:
-      still_editing: "(still editing)"
-      anonymous: "Anonymous"
-      no_comment: "(none)"
-      no_edits: "(no edits)"
-      show_area_box: "show area box"
-      big_area: "(big)"
+      still_editing: "(현재 수정 중)"
+      anonymous: "익명"
+      no_comment: "(없음)"
+      no_edits: "(수정 없음)"
+      show_area_box: "지역 박스 보기"
+      big_area: "(큰 지역)"
       view_changeset_details: "변경셋 세부 사항 보기"
       more: "more"
     changesets:
       id: "ID"
-      saved_at: "ì \80ì\9e¥ ì\9c\84ì¹\98"
+      saved_at: "ì \80ì\9e¥ ì\8b\9cê°\84"
       user: "사용자"
       comment: "설명"
       area: "지역"
     list_bbox:
       history: "이력"
       changesets_within_the_area: "이 지역 내의 변경셋:"
-      show_area_box: "show area box"
+      show_area_box: "지역 박스 보기"
       no_changesets: "변경셋 없음"
-      all_changes_everywhere: "For all changes everywhere see {{recent_changes_link}}"
+      all_changes_everywhere: "전체 지역의 모든 변경은 {{recent_changes_link}}를 보세요"
       recent_changes: "최근 변경 사항"
       no_area_specified: "지역 설정 안 됨"
       first_use_view: "First use the {{view_tab_link}} to pan and zoom to an area of interest, then click the history tab."
@@ -319,8 +319,6 @@ ko:
       view_larger_map: "큰 지도 보기"
   geocoder:
     results:
-      results: "Results"
-      type_from_source: "{{type}} from {{source_link}}"
       no_results: "No results found"
   layouts:
     project_name:
@@ -557,7 +555,6 @@ ko:
       search: Search
       where_am_i: "Where am I?"
       submit_text: "Go"
-      searching: "Searching..."
       search_help: "examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', or 'post offices near L체nen' <a href='http://wiki.openstreetmap.org/wiki/Search'>more examples...</a>"
     key:
       map_key: "Map key"
index 5110be2b9dd47df890530e0da460894b00d2f59d..837d29d355b69c3de31b3cb66fbbaa814a48a740 100644 (file)
@@ -73,7 +73,7 @@ nl:
   map:
     view: Bekijken
     edit: Bewerken
-    coordinates: "Coördinaten:"
+    coordinates: "Coördinaten:"
   browse:
     changeset:
       title: "Changeset"
@@ -86,7 +86,7 @@ nl:
       closed_at: "Gesloten op:"
       belongs_to: "Gemaakt door:"
       bounding_box: "Rechthoek:" #good translation?
-      no_bounding_box: "Geen coördinaten opgeslagen voor deze changeset."
+      no_bounding_box: "Geen coördinaten opgeslagen voor deze changeset."
       show_area_box: "Laat gebied zien"
       box: "vak" #good translation?
       has_nodes: "Bevat de volgende {{count}} nodes:"
@@ -104,7 +104,7 @@ nl:
       loading: "Laden..."
       deleted: "Verwijderd"
     node_details:
-      coordinates: "Coördinaten: "
+      coordinates: "Coördinaten: "
       part_of: "Part of:" #to be translated
     node_history:
       node_history: "Node-geschiedenis"
@@ -199,7 +199,7 @@ nl:
       all_changes_everywhere: "Voor alle aanpassingen over de hele wereld zie {{recent_changes_link}}"
       recent_changes: "Recente wijzigingen"
       no_area_specified: "Geen gebied opgegeven"
-      first_use_view: "Gebruik eerst de {{view_tab_link}} om te schuiven en te zoomen naar het gebied waarin je geïnteresseerd bent, klik dan op de Geschiedenis-tab."
+      first_use_view: "Gebruik eerst de {{view_tab_link}} om te schuiven en te zoomen naar het gebied waarin je geïnteresseerd bent, klik dan op de Geschiedenis-tab."
       view_the_map: "Bekijk de kaart"
       view_tab: "Bekijken-tab"
       alternatively_view: "Of bekijk alle {{recent_changes_link}}"
@@ -287,9 +287,15 @@ nl:
       add_marker: "Marker op de kaart zetten"
       view_larger_map: "Grotere kaart zien"
   geocoder:
+    search:
+      title:
+        latlon: 'Resultaten van <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Resultaten van <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Resultaten van <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Resultaten van <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Resultaten van <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Resultaten van <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Resultaten"
-      type_from_source: "{{type}} van {{source_link}}"
       no_results: "Geen resultaten gevonden"
   layouts:
     welcome_user: "Welkom, {{user_link}}"
@@ -340,7 +346,7 @@ nl:
       wiki_signup: "Je kunt je ook registreren bij de OpenStreetMap-wiki:"
       # next four translations are in pairs : please word wrap appropriately
       user_wiki_1: "Het is aanbevolen dat je een gebruikerspagina maakt met onder andere"
-      user_wiki_2: "categorieën die zeggen waar je bent, zoals [[Category:Users_in_Amsterdam]]."
+      user_wiki_2: "categorieën die zeggen waar je bent, zoals [[Category:Users_in_Amsterdam]]."
       current_user_1: "Een lijst van gebruikers, gesorteerd op woonplaats"
       current_user_2: "is beschikbaar op:" #good translation?
     signup_confirm_html:
@@ -353,7 +359,7 @@ nl:
       more_videos_here: "hier nog meer video's"
       get_reading: 'Lees over OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Beginners%27_Guide">op de wiki</p> of <a href="http://www.opengeodata.org/">de OpenGeoData-blog</a> die ook <a href="http://www.opengeodata.org/?cat=13">podcasts</a> aanbiedt!'
       wiki_signup: 'Je kunt je ook <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Main_Page">registreren op de OpenStreetMap-wiki</a>.'
-      user_wiki_page: 'Het is aanbevolen dat je een gebruikerspagina maakt met onder andere categorieën die zeggen waar je bent, zoals <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_Amsterdam">[[Category:Users_in_Amsterdam]]</a>.'
+      user_wiki_page: 'Het is aanbevolen dat je een gebruikerspagina maakt met onder andere categorieën die zeggen waar je bent, zoals <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_Amsterdam">[[Category:Users_in_Amsterdam]]</a>.'
       current_user: 'Een lijst van gebruikers, gesorteerd op woonplaats, is te zien op <a href="http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region">Category:Users_by_geographical_region</a>.'
   message:
     inbox:
@@ -433,19 +439,18 @@ nl:
       search: Zoeken
       where_am_i: "Waar ben ik?"
       submit_text: "Ga"
-      searching: "Zoeken..."
       search_help: "voorbeelden: 'Alkmaar', 'Spui, Amsterdam', 'CB2 5AQ', of 'post offices near Leiden' <a href='http://wiki.openstreetmap.org/wiki/Search'>meer voorbeelden...</a>"
     key:
       map_key: "Legenda"
   trace:
     create:
       upload_trace: "Upload GPS-track"
-      trace_uploaded: "Je track is geüpload en wacht totdat hij in de database wordt opgenomen. Dit gebeurt normaal binnen een half uur. Als het klaar is, zul je een e-mail ontvangen."
+      trace_uploaded: "Je track is geüpload en wacht totdat hij in de database wordt opgenomen. Dit gebeurt normaal binnen een half uur. Als het klaar is, zul je een e-mail ontvangen."
     edit:
       filename: "Bestandsnaam:"
-      uploaded_at: "Geüpload op:"
+      uploaded_at: "Geüpload op:"
       points: "Punten:"
-      start_coord: "Startcoördinaat:"
+      start_coord: "Startcoördinaat:"
       edit: "bewerken"
       owner: "Eigenaar:"
       description: "Beschrijving:"
@@ -464,16 +469,16 @@ nl:
       see_just_your_traces: "Alleen je eigen tracks zien, of een track uploaden"
       see_all_traces: "Alle tracks zien"
       see_your_traces: "Al jouw tracks zien"
-      traces_waiting: "Je hebt al {{count}} tracks die wachten om geüpload te worden. Overweeg om te wachten totdat die verwerkt zijn, om te voorkomen dat de wachtrij voor andere gebruikers geblokkeerd wordt."
+      traces_waiting: "Je hebt al {{count}} tracks die wachten om geüpload te worden. Overweeg om te wachten totdat die verwerkt zijn, om te voorkomen dat de wachtrij voor andere gebruikers geblokkeerd wordt."
     trace_optionals:
       tags: "Tags"
     view:
       pending: "BEZIG"
       filename: "Bestandsnaam:"
       download: "download"
-      uploaded: "Geüpload op:"
+      uploaded: "Geüpload op:"
       points: "Punten:"
-      start_coordinates: "Startcoördinaat:"
+      start_coordinates: "Startcoördinaat:"
       map: "kaart"
       edit: "bewerken"
       owner: "Eigenaar:"
@@ -498,7 +503,7 @@ nl:
       edit: "bewerken"
       edit_map: "Kaart bewerken"
       public: "OPENBAAR"
-      private: "PRIVÉ"
+      private: "PRIVÉ"
       by: "door"
       in: "in"
       map: "kaart"
@@ -548,7 +553,7 @@ nl:
       password: "Wachtwoord: "
       confirm password: "Wachtwoord bevestigen: "
       signup: Registreren
-      flash create success message: "Gebruiker succesvol gemaakt. Bekijk je e-mail voor een bevestigingsmail, en je bent zó aan het mappen :-)<br /><br />Denk eraan dat je niet kunt inloggen voordat je je bevestigingsmail hebt ontvangen en bevestigd.<br /><br />Als je een spamfilter gebruikt die bevestigingsmails stuurt, zorg er dan voor dat je webmaster@openstreetmap.org toestaat. Wij kunnen namelijk geen bevestigingsmails terugsturen."
+      flash create success message: "Gebruiker succesvol gemaakt. Bekijk je e-mail voor een bevestigingsmail, en je bent zó aan het mappen :-)<br /><br />Denk eraan dat je niet kunt inloggen voordat je je bevestigingsmail hebt ontvangen en bevestigd.<br /><br />Als je een spamfilter gebruikt die bevestigingsmails stuurt, zorg er dan voor dat je webmaster@openstreetmap.org toestaat. Wij kunnen namelijk geen bevestigingsmails terugsturen."
     no_such_user:
       body: "Sorry, er is geen gebruiker met de naam {{user}}. Controleer de spelling, of misschien is de link waarop je klikte onjuist."
     view:
index 859c26e1ae8396cfecc62145206ba33300929a39..8dd0345ffabcdf7d58ec312d4dd6864a777d65eb 100644 (file)
@@ -291,9 +291,15 @@ pl:
       add_marker: "Dodaj pinezkę na mapie"
       view_larger_map: "Większy widok mapy"
   geocoder:
+    search:
+      title:
+        latlon: 'Wyniki z <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Wyniki z <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Wyniki z <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Wyniki z <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Wyniki z <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Wyniki z <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Wyniki"
-      type_from_source: "{{type}} z {{source_link}}"
       no_results: "Nie znaleziono"
   layouts:
     welcome_user: "Witaj, {{user_link}}"
@@ -447,7 +453,6 @@ pl:
       search: Wyszukiwanie
       where_am_i: "Gdzie jestem?"
       submit_text: "Szukaj"
-      searching: "Wyszukiwanie..."
       search_help: "przykłady: 'Wąchock', 'Franciszkańska, Poznań', 'CB2 5AQ', lub 'post offices near Mokotów' <a href='http://wiki.openstreetmap.org/wiki/Search'>więcej przykładów...</a>"
     key:
       map_key: "Legenda"
index a5f1961b826fbeb22253cc7618aded95d2776e3a..602870877f1a0aeb12bbd718f92889396762e0ee 100644 (file)
@@ -318,9 +318,15 @@ pt-BR:
       add_marker: "Adicionar um marcador ao mapa"
       view_larger_map: "Ver Mapa Ampliado"
   geocoder:
+    search:
+      title:
+        latlon: 'Resultados de <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Resultados de <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Resultados de <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Resultados de <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Resultados de <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Resultados de <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Resultados"
-      type_from_source: "{{type}} de {{source_link}}"
       no_results: "Não foram encontrados resultados"
   layouts:
     project_name:
@@ -557,7 +563,6 @@ OpenStreetMap em:"
       search: "Buscar"
       where_am_i: "Onde estou?"
       submit_text: "Ir"
-      searching: "Buscando..."
       search_help: "exemplos: 'Belo Horizonte', 'Av. Paulista, São Paulo', 'CB2 5AQ', or 'post offices near Porto Alegre' <a href='http://wiki.openstreetmap.org/wiki/Pt-br:Search'>mais exemplos...</a>"
     key:
       map_key: "Map key"
index 24910c0f9389d5d3794ebab71ec84c6c89986040..700619645fac09166acfdbb2b5901bcee5bd0222 100644 (file)
@@ -287,9 +287,15 @@ ru:
       add_marker: "Добавить маркер на карту"
       view_larger_map: "Посмотреть бо&#769;льшую карту"
   geocoder:
+    search:
+      title:
+        latlon: 'Результаты из <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: 'Результаты из <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Результаты из <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Результаты из <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Результаты из <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Результаты из <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "Результаты"
-      type_from_source: "{{type}} из {{source_link}}"
       no_results: "Ничего не найдено"
   layouts:
     welcome_user: "Добро пожаловать, {{user_link}}"
@@ -433,7 +439,6 @@ ru:
       search: Поиск
       where_am_i: "Где я?"
       submit_text: "->"
-      searching: "Поиск..."
       search_help: "примеры: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', или 'post offices near LУМnen' <a href='http://wiki.openstreetmap.org/wiki/Search'>больше примеров...</a>"
     key:
       map_key: "Легенда"
index 0f5f41ef36603b70e40e2b415fd9b7e4719f65d3..2e5e8740f635efe6ea3557b2a780c22bdcac356d 100644 (file)
@@ -91,9 +91,21 @@ sl:
       no_bounding_box: "Ta paket nima določenega pravokotnega področja."
       show_area_box: "Prikaži pravokotno področje"
       box: "področje"
-      has_nodes: "Vsebuje naslednjih {{count}} vozlišč:"
-      has_ways: "Vsebuje naslednjih {{count}} poti:"
-      has_relations: "Vsebuje naslednjih {{count}} relacij:"
+      has_nodes:
+        one: "Vsebuje naslednje {{count}} vozlišče:"
+        two: "Vsebuje naslednji {{count}} vozlišči:"
+        few: "Vsebuje naslednja {{count}} vozlišča:"
+        other: "Vsebuje naslednjih {{count}} vozlišč:"
+      has_ways: 
+        one: "Vsebuje naslednjo {{count}} pot:"
+        two: "Vsebuje naslednji {{count}} poti:"
+        few: "Vsebuje naslednje {{count}} poti:"
+        other: "Vsebuje naslednjih {{count}} poti:"
+      has_relations: 
+        one: "Vsebuje naslednjo {{count}} relacijo:"
+        two: "Vsebuje naslednji {{count}} relaciji:"
+        few: "Vsebuje naslednje {{count}} relacije:"
+        other: "Vsebuje naslednjih {{count}} relacij:"
     common_details: 
       edited_at: "Urejeno ob:"
       edited_by: "Uredil:"
@@ -334,10 +346,44 @@ sl:
       add_marker: "Dodaj zaznamek na zemljevid"
       view_larger_map: "Večji zemljevid" 
   geocoder:
+    search:
+      title:
+        latlon: '<a href="http://openstreetmap.org/">Interni</a> zadetki'
+        us_postcode: 'Zadetki iz <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Zadetki iz <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Zadetki iz <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Zadetki iz <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Zadetki iz <a href="http://www.geonames.org/">GeoNames</a>'
+    search_osm_namefinder:
+      prefix: "{{type}} "
+      suffix_place: ", {{distance}} {{direction}} od {{placename}}"
+      suffix_parent: "{{suffix}} ({{parentdistance}} {{parentdirection}} od {{parentname}})"
+      suffix_suburb: "{{suffix}}, {{parentname}}"
+    description:
+      title:
+        osm_namefinder: '{{types}} iz <a href="http://gazetteer.openstreetmap.org/namefinder/">iskalca po OpenStreetMap-u</a>'
+        geonames: 'Lokacija iz <a href="http://www.geonames.org/">GeoNames</a>'
+      types:
+        cities: Velemesta
+        towns: Mesta
+        places: Kraji
+    description_osm_namefinder:
+      prefix: "{{distance}} {{direction}} od {{type}} "
     results:
-      results: "Zadetki"
-      type_from_source: "{{type}} iz {{source_link}}"
       no_results: "Ni zadetkov"
+    distance:
+      zero: "manj kot 1 km"
+      one: "približno {{count}} km"
+      other: "približno {{count}} km"
+    direction:
+      south_west: "jugozahodno"
+      south: "južno"
+      south_east: "jugovzhodno"
+      east: "vzhodno"
+      north_east: "severovzhodno"
+      north: "severno"
+      north_west: "severozahodno"
+      west: "zahodno"
   layouts:
     project_name:
       # in <title>
@@ -576,7 +622,6 @@ sl:
       search: Iskanje
       where_am_i: "Kje sem?"
       submit_text: "Išči"
-      searching: "Iščem..."
       search_help: "primeri: 'Bovec', 'Prešernova, Celje', 'Živalski vrt' ali 'vzpenjača' <a href='http://wiki.openstreetmap.org/wiki/Search'>Več primerov...</a>"
     key:
       map_key: "Legenda"
diff --git a/config/locales/vi.yml b/config/locales/vi.yml
new file mode 100644 (file)
index 0000000..f60ffb0
--- /dev/null
@@ -0,0 +1,888 @@
+vi:
+  html:
+    dir: ltr
+  activerecord:
+    # Translates all the model names, which is used in error handling on the web site
+    models:
+      acl: "Danh sách Điều khiển Truy cập"
+      changeset: "Bộ thay đổi"
+      changeset_tag: "Thẻ Bộ thay đổi"
+      country: "Quốc gia"
+      diary_comment: "Bình luận Nhật ký"
+      diary_entry: "Mục Nhật ký"
+      friend: "Người bạn"
+      language: "Ngôn ngữ"
+      message: "Thư"
+      node: "Nốt"
+      node_tag: "Thẻ Nốt"
+      notifier: "Trình báo"
+      old_node: "Nốt Cũ"
+      old_node_tag: "Thẻ Nốt Cũ"
+      old_relation: "Quan hệ Cũ"
+      old_relation_member: "Thành viên Quan hệ Cũ"
+      old_relation_tag: "Thẻ Quan hệ Cũ"
+      old_way: "Lối Cũ"
+      old_way_node: "Nốt Lối Cũ"
+      old_way_tag: "Thẻ Lối Cũ"
+      relation: "Quan hệ"
+      relation_member: "Thành viên Quan hệ"
+      relation_tag: "Thẻ Quan hệ"
+      session: "Phiên"
+      trace: "Tuyến đường"
+      tracepoint: "Điểm Tuyến đường"
+      tracetag: "Thẻ Tuyến đường"
+      user: "Người dùng"
+      user_preference: "Tùy chọn Cá nhân"
+      user_token: "Dấu hiệu Cá nhân"
+      way: "Lối"
+      way_node: "Nốt Lối"
+      way_tag: "Thẻ Lối"
+    # Translates all the model attributes, which is used in error handling on the web site
+    # Only the ones that are used on the web site are translated at the moment
+    attributes:
+      diary_comment:
+        body: "Nội dung"
+      diary_entry:
+        user: "Người dùng"
+        title: "Tiêu đề"
+        latitude: "Vĩ độ"
+        longitude: "Kinh độ"
+        language: "Ngôn ngữ"
+      friend:
+        user: "Người dùng"
+        friend: "Người bạn"
+      trace:
+        user: "Người dùng"
+        visible: "Thấy được"
+        name: "Tên"
+        size: "Kích cỡ"
+        latitude: "Vĩ độ"
+        longitude: "Kinh độ"
+        public: "Công khai"
+        description: "Miêu tả"
+      message:
+        sender: "Người gửi"
+        title: "Tiêu đề"
+        body: "Nội dung"
+        recipient: "Người nhận"
+      user:
+        email: "Thư điện tử"
+        active: "Tích cực"
+        display_name: "Tên Hiển thị"
+        description: "Miêu tả"
+        languages: "Ngôn ngữ"
+        pass_crypt: "Mật khẩu"
+  printable_name:
+    with_id: "{{id}}"
+    with_version: "{{id}}, v{{version}}"
+    with_name: "{{name}} ({{id}})"
+  map:
+    view: "Hiển thị"
+    edit: "Sửa đổi"
+    coordinates: "Tọa độ:"
+  browse:
+    changeset:
+      title: "Bộ thay đổi"
+      changeset: "Bộ thay đổi:"
+      download: "Tải xuống {{changeset_xml_link}} hoặc {{osmchange_xml_link}}"
+      changesetxml: "Bộ thay đổi XML"
+      osmchangexml: "osmChange XML"
+    changeset_details:
+      created_at: "Lúc Tạo:"
+      closed_at: "Lúc Đóng:"
+      belongs_to: "Người Sửa đổi:"
+      bounding_box: "Hộp bao:"
+      no_bounding_box: "Không lưu hộp bao của bộ thay đổi này."
+      show_area_box: "Hiện Hộp vùng"
+      box: "hộp"
+      has_nodes: "Có {{count}} nốt sau:"
+      has_ways: "Có {{count}} lối sau:"
+      has_relations: "Có {{count}} quan hệ sau:"
+    common_details: 
+      edited_at: "Lúc Sửa đổi:"
+      edited_by: "Người Sửa đổi:"
+      version: "Phiên bản:"
+      in_changeset: "Thuộc bộ thay đổi:"
+    containing_relation:
+      entry: "Quan hệ {{relation_name}}"
+      entry_role: "Quan hệ {{relation_name}} (vai trò: {{relation_role}})"
+    map:
+      loading: "Đang tải..."
+      deleted: "Đã xóa"
+      larger:
+        area: "Xem vùng trên bản đồ rộng hơn"
+        node: "Xem nốt trên bản đồ rộng hơn"
+        way: "Xem lối trên bản đồ rộng hơn"
+        relation: "Xem quan hệ trên bản đồ rộng hơn"
+    node_details:
+      coordinates: "Tọa độ: "
+      part_of: "Trực thuộc:"
+    node_history:
+      node_history: "Lịch sử Nốt"
+      node_history_title: "Lịch sử Nốt: {{node_name}}"
+      download: "{{download_xml_link}} hoặc {{view_details_link}}"
+      download_xml: "Tải xuống XML"
+      view_details: "xem chi tiết"
+    node:
+      node: "Nốt"
+      node_title: "Nốt: {{node_name}}"
+      download: "{{download_xml_link}}, {{view_history_link}}, hoặc {{edit_link}}"
+      download_xml: "Tải xuống XML"
+      view_history: "xem lịch sử"
+      edit: "sửa đổi"
+    not_found:
+      sorry: "Rất tiếc, không thể tìm thấy {{type}} với ID {{id}}."
+      type:
+        node: "nốt"
+        way: "lối"
+        relation: "quan hệ"
+    paging_nav:
+      showing_page: "Đang hiện trang"
+      of: "của"
+    relation_details:
+      members: "Thành viên:"
+      part_of: "Trực thuộc:"
+    relation_history:
+      relation_history: "Lịch sử Quan hệ"
+      relation_history_title: "Lịch sử Quan hệ: {{relation_name}}"
+    relation_member:
+      entry: "{{type}} {{name}}"
+      entry_role: "{{type}} {{name}} với vai trò {{role}}"
+      type:
+        node: "Nốt"
+        way: "Lối"
+        relation: "Quan hệ"
+    relation:
+      relation: "Quan hệ"
+      relation_title: "Quan hệ: {{relation_name}}"
+      download: "{{download_xml_link}} hoặc {{view_history_link}}"
+      download_xml: "Tải xuống XML"
+      view_history: "xem lịch sử"
+    start:
+      view_data: "Xem dữ liệu của phần bản đồ đang xem"
+      manually_select: "Chọn vùng khác thủ công"
+    start_rjs:
+      data_layer_name: "Dữ liệu"
+      data_frame_title: "Dữ liệu"
+      zoom_or_select: "Phóng to hoặc chọn vùng bản đồ để xem"
+      drag_a_box: "Kéo hộp trên bản đồ để chọn vùng"
+      manually_select: "Chọn vùng khác thủ công"
+      loaded_an_area_with_num_features: "Bạn đã tải vùng chứa [[num_features]] nét. Một số trình duyệt không hiển thị nổi nhiều dữ liệu như thế. Nói chung, trình duyệt hoạt động tốt khi nào chỉ có 100 nét cùng lúc: hơn thì trình duyệt sẽ chậm chạp. Nếu bạn chắc chắn muốn xem dữ liệu này, hãy bấm nút ở dưới."
+      load_data: "Tải Dữ liệu"
+      unable_to_load_size: "Không thể tải: Hộp bao với cỡ [[bbox_size]] quá lớn (phải nhỏ hơn {{max_bbox_size}})"
+      loading: "Đang tải..."
+      show_history: "Xem Lịch sử"
+      wait: "Xin chờ..."
+      history_for_feature: "Lịch sử [[feature]]"
+      details: "Chi tiết"
+      private_user: "người bí mật"
+      edited_by_user_at_timestamp: "Được sửa đổi bởi [[user]] lúc [[timestamp]]"
+      object_list:
+        heading: "Danh sách đối tượng"
+        back: "Liệt kê các đối tượng"
+        type:
+          node: "Nốt"
+          way: "Lối"
+          # There's no 'relation' type because it isn't represented in OpenLayers
+        api: "Lấy vùng này dùng API"
+        details: "Chi tiết"
+        selected:
+          type:
+            node: "Nốt [[id]]"
+            way: "Lối [[id]]"
+            # There's no 'relation' type because it isn't represented in OpenLayers
+        history:
+          type:
+            node: "Nốt [[id]]"
+            way: "Lối [[id]]"
+            # There's no 'relation' type because it isn't represented in OpenLayers
+    tag_details:
+      tags: "Thẻ:"
+    way_details:
+      nodes: "Nốt:"
+      part_of: "Thuộc về:"
+      also_part_of:
+        one: "cũng thuộc về lối {{related_ways}}"
+        other: "cũng thuộc về các lối {{related_ways}}"
+    way_history:
+      way_history: "Lịch sử Lối"
+      way_history_title: "Lịch sử Lối: {{way_name}}"
+      download: "{{download_xml_link}} hoặc {{view_details_link}}"
+      download_xml: "Tải xuống XML"
+      view_details: "xem chi tiết"
+    way:
+      way: "Lối"
+      way_title: "Lối: {{way_name}}"
+      download: "{{download_xml_link}}, {{view_history_link}}, hoặc {{edit_link}}"
+      download_xml: "Tải xuống XML"
+      view_history: "xem lịch sử"
+      edit: "sửa đổi"
+  changeset:
+    changeset_paging_nav: 
+      showing_page: "Đang hiện trang"
+      of: "của"
+    changeset:
+      still_editing: "(đang mở)"
+      anonymous: "Vô danh"
+      no_comment: "(không có)"
+      no_edits: "(không có thay đổi)"
+      show_area_box: "hiện hộp vùng"
+      big_area: "(lớn)"
+      view_changeset_details: "Xem chi tiết của bộ thay đổi"
+      more: "thêm"
+    changesets:
+      id: "ID"
+      saved_at: "Lúc Lưu"
+      user: "Người dùng"
+      comment: "Miêu tả"
+      area: "Vùng"
+    list_bbox:
+      history: "Lịch sử"
+      changesets_within_the_area: "Bộ thay đổi ở vùng:"
+      show_area_box: "xem hộp vùng"
+      no_changesets: "Không có bộ thay đổi"
+      all_changes_everywhere: "Xem các thay đổi ở mọi nơi tại {{recent_changes_link}}"
+      recent_changes: "Thay đổi Gần đây"
+      no_area_specified: "Không định rõ vùng"
+      first_use_view: "Trước tiên dùng {{view_tab_link}} để chuyển và phóng to một vùng, rồi nhấn chuột vào thẻ lịch sử."
+      view_the_map: "xem bản đồ"
+      view_tab: "thẻ Xem"
+      alternatively_view: "Hoặc xem tất cả các {{recent_changes_link}}"
+    list:
+      recent_changes: "Thay đổi Gần đây"
+      recently_edited_changesets: "Bộ thay đổi được sửa đổi gần đây:"
+      for_more_changesets: 'Để xem thêm bộ thay đổi, chọn người dùng và xem danh sách sửa đổi của họ, hoặc xem "lịch sử" của một vùng.'
+    list_user:
+      edits_by_username: "Sửa đổi của {{username_link}}"
+      no_visible_edits_by: "{{name}} không có sửa đổi công khai."
+      for_all_changes: "Xem các thay đổi bởi mọi người dùng tại {{recent_changes_link}}"
+      recent_changes: "Thay đổi Gần đây"
+  diary_entry:
+    new:
+      title: "Mục Nhật ký Mới"
+    list:
+      title: "Các Nhật ký Cá nhân"
+      user_title: "Nhật ký của {{user}}"
+      in_language_title: "Các Mục Nhật ký bằng {{language}}"
+      new: "Mục Nhật ký Mới"
+      new_title: "Soạn thảo mục mới trong nhật ký của bạn"
+      no_entries: "Chưa có mục nhật ký"
+      recent_entries: "Mục nhật ký gần đây: "
+      older_entries: "Mục Trước"
+      newer_entries: "Mục Sau"
+    edit:
+      title: "Sửa đổi mục nhật ký"
+      subject: "Tiêu đề: "
+      body: "Nội dung: "
+      language: "Ngôn ngữ: "
+      location: "Vị trí: "
+      latitude: "Vĩ độ: "
+      longitude: "Kinh độ: "
+      use_map_link: "sử dụng bản đồ"
+      save_button: "Lưu"
+      marker_text: "Vị trí của mục nhật ký"
+    view:
+      title: "Các Nhật ký Cá nhân | {{user}}"
+      user_title: "Nhật ký của {{user}}"
+      leave_a_comment: "Bình luận"
+      login_to_leave_a_comment: "{{login_link}} để bình luận"
+      login: "Đăng nhập"
+      save_button: "Lưu"
+    no_such_entry:
+      title: "Mục nhật ký không tồn tại"
+      heading: "Không có mục với ID: {{id}}"
+      body: "Rất tiếc, không có mục hoặc bình luận trong nhật ký với ID {{id}}. Xin hãy kiểm tra chính tả, hoặc có lẽ bạn đã theo một liên kết sai."
+    no_such_user:
+      title: "Người dùng không tồn tại"
+      heading: "Người dùng {{user}} không tồn tại"
+      body: "Rất tiếc, không có người dùng với tên {{user}}. Xin hãy kiểm tra chính tả, hoặc có lẽ bạn đã theo một liên kết sai."
+    diary_entry:
+      posted_by: "Được đăng bởi {{link_user}} lúc {{created}} bằng {{language}}"
+      comment_link: "Bình luận về mục này"
+      reply_link: "Trả lời mục này"
+      comment_count:
+        one: "1 bình luận"
+        other: "{{count}} bình luận"
+      edit_link: "Sửa đổi mục này"
+    diary_comment:
+      comment_from: "Bình luận của {{link_user}} lúc {{comment_created_at}}"
+  export:
+    start:
+      area_to_export: "Vùng để Xuất"
+      manually_select: "Chọn vùng khác thủ công"
+      format_to_export: "Định dạng Xuất"
+      osm_xml_data: "Dữ liệu OpenStreetMap XML"
+      mapnik_image: "Hình Mapnik"
+      osmarender_image: "Hình Osmarender"
+      embeddable_html: "HTML để Nhúng"
+      licence: "Giấy phép"
+      export_details: 'Dữ liệu OpenStreetMap được phép sử dụng theo <a href="http://creativecommons.org/licenses/by-sa/2.0/">giấy phép Ghi công–Chia sẻ tương tự Creative Commons 2.0</a>.'
+      options: "Tùy chọn"
+      format: "Định dạng"
+      scale: "Tỷ lệ"
+      max: "tối đa"
+      image_size: "Kích cỡ Hình"
+      zoom: "Thu phóng"
+      add_marker: "Đánh dấu vào bản đồ"
+      latitude: "Vĩ độ:"
+      longitude: "Kinh độ:"
+      output: "Đầu ra"
+      paste_html: "Dán HTML để nhúng vào trang Web"
+      export_button: "Xuất"
+    start_rjs:
+      export: "Xuất"
+      drag_a_box: "Kéo hộp trên bản đồ để chọn vùng"
+      manually_select: "Chọn vùng khác thủ công"
+      click_add_marker: "Nhấn chuột vào bản đồ để đánh dấu"
+      change_marker: "Thay đổi vị trí đánh dấu"
+      add_marker: "Đánh dấu vào bản đồ"
+      view_larger_map: "Xem Bản đồ Rộng hơn"
+  geocoder:
+    search:
+      title:
+        latlon: 'Kết quả <a href="http://www.openstreetmap.org/">nội bộ</a>'
+        us_postcode: 'Kết quả <a href="http://www.geocoder.us/">Geocoder.us</a>'
+        uk_postcode: 'Kết quả <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: 'Kết quả <a href="http://www.geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: 'Kết quả <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Kết quả <a href="http://www.geonames.org/">GeoNames</a>'
+    search_osm_namefinder:
+      prefix: "{{type}} "
+      suffix_place: ", {{distance}} về phía {{direction}} của {{placename}}"
+      suffix_parent: "{{suffix}} ({{parentdistance}} về phía {{parentdirection}} của {{parentname}})"
+      suffix_suburb: "{{suffix}}, {{parentname}}"
+    description:
+      title:
+        osm_namefinder: '{{types}} từ <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: 'Vị trí từ <a href="http://www.geonames.org/">GeoNames</a>'
+      types:
+        cities: "Thành phố"
+        towns: "Thị xã"
+        places: "Địa điểm"
+    description_osm_namefinder:
+      prefix: "{{distance}} về phía {{direction}} của {{type}} "
+    results:
+      no_results: "Không tìm thấy kết quả"
+    distance:
+      zero: "không tới 1 km"
+      one: "khoảng 1 km"
+      other: "khoảng {{count}} km"
+    direction:
+      south_west: "tây nam"
+      south: "nam"
+      south_east: "đông nam"
+      east: "đông"
+      north_east: "đông bắc"
+      north: "bắc"
+      north_west: "tây bắc"
+      west: "tây"
+  layouts:
+    project_name:
+      # in <title>
+      title: "OpenStreetMap"
+      # in <h1>
+      h1: "OpenStreetMap"
+    logo:
+      alt_text: "Biểu trưng OpenStreetMap"
+    welcome_user: "Hoan nghênh, {{user_link}}"
+    welcome_user_link_tooltip: "Trang cá nhân của bạn"
+    home: "nhà"
+    home_tooltip: "Về vị trí nhà"
+    inbox: "hộp thư ({{count}})"
+    inbox_tooltip:
+      zero: "Hộp thư của bạn không có thư chưa đọc"
+      one: "Hộp thư của bạn có 1 thư chưa đọc"
+      other: "Hộp thư của bạn có {{count}} thư chưa đọc"
+    logout: "đăng xuất"
+    logout_tooltip: "Đăng xuất"
+    log_in: "đăng nhập"
+    log_in_tooltip: "Đăng nhập với tài khoản đã tồn tại"
+    sign_up: "đăng ký"
+    sign_up_tooltip: "Mở tài khoản để sửa đổi"
+    view: "Xem"
+    view_tooltip: "Xem bản đồ"
+    edit: "Sửa đổi"
+    edit_tooltip: "Sửa đổi bản đồ"
+    history: "Lịch sử"
+    history_tooltip: "Lịch sử bộ thay đổi"
+    export: "Xuất"
+    export_tooltip: "Xuất dữ liệu bản đồ"
+    gps_traces: "Tuyến đường GPS"
+    gps_traces_tooltip: "Quản lý tuyến đường"
+    user_diaries: "Nhật ký Cá nhân"
+    user_diaries_tooltip: "Đọc các nhật ký cá nhân"
+    tag_line: "Bản đồ Wiki của Thế giới Mở"
+    intro_1: "OpenStreetMap là bản đồ thế giới nguồn mở, do những người như bạn vẽ."
+    intro_2: "OpenStreetMap cho phép xem, sửa đổi, và sử dụng dữ liệu địa lý một cách cộng tác ở mọi nơi trên thế giới."
+    intro_3: "OpenStreetMap hoạt động do sự hỗ trợ hosting của {{ucl}} và {{bytemark}}."
+    intro_3_ucl: "Trung tâm VR tại UCL"
+    intro_3_bytemark: "bytemark"
+    osm_offline: "Cơ sở dữ liệu OpenStreetMap đang ngoại tuyến trong lúc đang thực hiện những công việc bảo quản cơ sở dữ liệu cần thiết."
+    osm_read_only: "Cơ sở dữ liệu OpenStreetMap đang bị khóa không được sửa đổi trong lúc đang thực hiện những công việc bảo quản cơ sở dữ liệu cần thiết."
+    donate: "Hỗ trợ OpenStreetMap bằng cách {{link}} cho Quỹ Nâng cấp Phần cứng."
+    donate_link_text: "quyên góp"
+    help_wiki: "Trợ giúp &amp; Wiki"
+    help_wiki_tooltip: "Site trợ giúp &amp; wiki của dự án"
+    help_wiki_url: "http://wiki.openstreetmap.org/wiki/Vi:Main_Page?uselang=vi"
+    news_blog: "Blog Tin tức"
+    news_blog_tooltip: "Blog có tin tức về OpenStreetMap, dữ liệu địa lý mở, v.v."
+    shop: "Tiệm"
+    shop_tooltip: "Tiệm bán hàng hóa OpenStreetMap"
+    shop_url: "http://wiki.openstreetmap.org/wiki/Merchandise?uselang=vi"
+    sotm: "Mời tham gia Hội nghị OpenStreetMap 2009, The State of the Map (Trình trạng Bản đồ), ngày 10-12 tháng 7 tại Amsterdam!"
+    alt_donation: "Quyên góp"
+  notifier:
+    diary_comment_notification:
+      subject: "[OpenStreetMap] {{user}} đã bình luận về mục nhật ký của bạn"
+      banner1: "*                 Vui lòng đừng trả lời thư điện tử này.                  *"
+      banner2: "*              Hãy sử dụng website OpenStreetMap để trả lời.              *"
+      hi: "Chào {{to_user}},"
+      header: "{{from_user}} đã bình luận về mục nhật ký gần đây của bạn tại OpenStreetMap với tiêu đề {{subject}}:"
+      footer: "Bạn cũng có thể đọc bình luận tại {{readurl}}, bình luận tại {{commenturl}}, hoặc trả lời tại {{replyurl}}"
+    message_notification:
+      subject: "[OpenStreetMap] {{user}} đã gửi thư mới cho bạn"
+      banner1: "*                 Vui lòng đừng trả lời thư điện tử này.                  *"
+      banner2: "*              Hãy sử dụng website OpenStreetMap để trả lời.              *"
+      hi: "Chào {{to_user}},"
+      header: "{{from_user}} đã gửi thư cho bạn dùng OpenStreetMap có tiêu đề {{subject}}:"
+      footer1: "Bạn cũng có thể đọc thư này tại {{readurl}}"
+      footer2: "và trả lời tại {{replyurl}}"
+    friend_notification:
+      subject: "[OpenStreetMap] {{user}} đã thêm bạn là người bạn"
+      had_added_you: "{{user}} đã thêm bạn vào danh sách bạn tại OpenStreetMap."
+      see_their_profile: "Có thể xem trang cá nhân của họ tại {{userurl}} và cũng thêm họ vào danh sách của bạn tùy ý."
+    gpx_notification:
+      greeting: "Chào bạn,"
+      your_gpx_file: "Hình như tập tin GPX của bạn"
+      with_description: "với miêu tả"
+      and_the_tags: "và các thẻ sau:"
+      and_no_tags: "và không có thẻ"
+      failure:
+        subject: "[OpenStreetMap] Nhập GPX thất bại"
+        failed_to_import: "không nhập thành công. Đã gặp lỗi này:"
+        more_info_1: "Có thêm chi tiết về vụ nhập GPX bị thất bại và cách tránh"
+        more_info_2: "vấn đề này tại:"
+        import_failures_url: "http://wiki.openstreetmap.org/wiki/GPX_Import_Failures"
+      success:
+        subject: "[OpenStreetMap] Nhập GPX thành công"
+        loaded_successfully: |
+          {{trace_points}} điểm được tải thành công trên tổng số
+          {{possible_points}} điểm.
+    signup_confirm:
+      subject: "[OpenStreetMap] Xác nhận địa chỉ thư điện tử của bạn"
+    signup_confirm_plain:
+      greeting: "Chào bạn!"
+      hopefully_you: "Ai (chắc bạn) muốn mở tài khoản bên"
+      # next two translations run-on : please word wrap appropriately
+      click_the_link_1: "Nếu bạn là người đó, hoan nghênh! Xin hãy nhấn chuột vào liên kết ở dưới để"
+      click_the_link_2: "xác nhận tài khoản của bạn và đọc tiếp để tìm hiểu thêm về OpenStreetMap."
+      introductory_video: "Bạn có thể coi video giới thiệu OpenStreetMap tại đây:"
+      more_videos: "Có thêm video tại đây:"
+      the_wiki: "Bắt đầu tìm hiểu về OpenStreetMap trên wiki:"
+      the_wiki_url: "http://wiki.openstreetmap.org/wiki/Vi:Beginners%27_Guide"
+      opengeodata: "OpenGeoData.org là blog của OpenStreetMap, nó cũng chứa podcast:"
+      wiki_signup: "Có lẽ bạn cũng muốn mở tài khoản ở wiki OpenStreetMap tại:"
+      wiki_signup_url: "http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Vi:Main_Page"
+      # next four translations are in pairs : please word wrap appropriately
+      user_wiki_1: "Bạn nên tạo ra trang cá nhân trên wiki và gắn các thẻ thể loại để cho"
+      user_wiki_2: "người ta biết bạn ở đâu, thí dụ như [[Category:Users in Hanoi]]."
+      current_user_1: "Có danh sách các người dùng, xếp thể loại theo nơi ở,"
+      current_user_2: ""
+    signup_confirm_html:
+      greeting: "Chào bạn!"
+      hopefully_you: "Ai (chắc bạn) muốn mở tài khoản bên"
+      click_the_link: "Nếu bạn là người đó, hoan nghênh! Xin hãy nhấn chuột vào liên kết ở dưới để xác nhân tài khoản đó và đọc tiếp để tìm hiểu thêm về OpenStreetMap."
+      introductory_video: "Bạn có thể coi {{introductory_video_link}}."
+      video_to_openstreetmap: "video giới thiệu về OpenStreetMap"
+      more_videos: "Cũng có {{more_videos_link}}."
+      more_videos_here: "thêm video tại đây"
+      get_reading: 'Bắt đầu tìm hiểu về OpenStreetMap <a href="http://wiki.openstreetmap.org/wiki/Vi:Beginners%27_Guide?uselang=vi">tại wiki</p> hoặc <a href="http://www.opengeodata.org/">blog OpenGeoData</a>, blog này cũng chứa <a href="http://www.opengeodata.org/?cat=13">podcast để nghe</a>!'
+      wiki_signup: 'Có lẽ bạn cũng muốn <a href="http://wiki.openstreetmap.org/index.php?title=Special:Userlogin&type=signup&returnto=Vi:Main_Page&uselang=vi">mở tài khoản ở wiki OpenStreetMap</a>.'
+      user_wiki_page: 'Bạn nên tạo ra trang cá nhân trên wiki và gắn các thẻ thể loại để cho người ta biết bạn ở đâu, thí dụ như <a href="http://wiki.openstreetmap.org/wiki/Category:Users_in_Hanoi?uselang=vi">[[Category:Users in Hanoi]]</a>.'
+      current_user: 'Có danh sách các người dùng, xếp thể loại theo nơi ở, tại <a href="http://wiki.openstreetmap.org/wiki/Category:Users_by_geographical_region?uselang=vi">Category:Users by geographical region</a>.'
+    email_confirm:
+      subject: "[OpenStreetMap] Xác nhân địa chỉ thư điện tử của bạn"
+    email_confirm_plain:
+      greeting: "Chào bạn,"
+      hopefully_you_1: "Ai (chắc bạn) muốn đổi địa chỉ thư điện tử bên"
+      hopefully_you_2: "{{server_url}} thành {{new_address}}."
+      click_the_link: "Nếu bạn là người đó, xin hãy nhấn chuột vào liên kết ở dưới để xác nhận thay đổi này."
+    email_confirm_html:
+      greeting: "Chào bạn,"
+      hopefully_you: "Ai (chắc bạn) muốn đổi địa chỉ thư điện tử bên {{server_url}} thành {{new_address}}."
+      click_the_link: "Nếu bạn là người đó, xin hãy nhấn chuột vào liên kết ở dưới để xác nhận thay đổi này."
+    lost_password:
+      subject: "[OpenStreetMap] Yêu cầu đặt lại mật khẩu"
+    lost_password_plain:
+      greeting: "Hi,"
+      hopefully_you_1: "Ai (chắc bạn) đã xin đặt lại mật khẩu của tài khoản openstreetmap.org"
+      hopefully_you_2: "có địa chỉ thư điện tử này."
+      click_the_link: "Nếu bạn là người đó, xin hãy nhấn chuột vào liên kết ở dưới để đặt lại mật khẩu."
+    lost_password_html:
+      greeting: "Chào bạn,"
+      hopefully_you: "Ai (chắc bạn) đã xin đặt lại mật khẩu của tài khoản openstreetmap.org có địa chỉ thư điện tử này."
+      click_the_link: "Nếu bạn là người đó, xin hãy nhấn chuột vào liên kết ở dưới để đặt lại mật khẩu."
+    reset_password:
+      subject: "[OpenStreetMap] Đã đặt lại mật khẩu"
+    reset_password_plain:
+      greeting: "Chào bạn,"
+      reset: "Mật khẩu của bạn đã được đặt lại thành {{new_password}}"
+    reset_password_html:
+      greeting: "Chào bạn,"
+      reset: "Mật khẩu của bạn đã được đặt lại thành {{new_password}}"
+  message:
+    inbox:
+      title: "Hộp thư"
+      my_inbox: "Hộp thư đến"
+      outbox: "đã gửi"
+      you_have: "Bạn có {{new_count}} thư mới và {{old_count}} thư cũ"
+      from: "Từ"
+      subject: "Tiêu đề"
+      date: "Ngày"
+      no_messages_yet: "Bạn chưa nhận thư nào. Hãy thử liên lạc với {{people_mapping_nearby_link}}?"
+      people_mapping_nearby: "những người ở gần"
+    message_summary:
+      unread_button: "Đánh dấu là chưa đọc"
+      read_button: "Đánh dấu là đã đọc"
+      reply_button: "Trả lời"
+    new:
+      title: "Gửi thư"
+      send_message_to: "Gửi thư mới cho {{name}}"
+      subject: "Tiêu đề"
+      body: "Nội dung"
+      send_button: "Gửi"
+      back_to_inbox: "Trở về hộp thư đến"
+      message_sent: "Thư đã gửi"
+    no_such_user:
+      title: "Người dùng hoặc thư không tồn tại"
+      heading: "Người dùng hoặc thư không tồn tại"
+      body: "Rất tiếc, không có người dùng hoặc thư với tên hoặc ID đó"
+    outbox: 
+      title: "Hộp thư đã gửi"
+      my_inbox: "Hộp {{inbox_link}}"
+      inbox: "thư đến"
+      outbox: "thư đã gửi"
+      you_have_sent_messages: "Bạn đã gửi {{sent_count}} thư"
+      to: "Tới"
+      subject: "Tiêu đề"
+      date: "Ngày"
+      no_sent_messages: "Bạn chưa gửi thư cho người nào. Hãy thử liên lạc với {{people_mapping_nearby_link}}?"
+      people_mapping_nearby: "những người ở gần"
+    read:
+      title: "Đọc thư"
+      reading_your_messages: "Đọc thư"
+      from: "Từ"
+      subject: "Tiêu đề"
+      date: "Ngày"
+      reply_button: "Trả lời"
+      unread_button: "Đánh dấu là chưa đọc"
+      back_to_inbox: "Trở về hộp thư đến"
+      reading_your_sent_messages: "Đọc thư đã gửi"
+      to: "Tới"
+      back_to_outbox: "Trở về hộp thư đã gửi"
+    mark:
+      as_read: "Thư đã đọc"
+      as_unread: "Thư chưa đọc"
+  site:
+    index:
+      js_1: "Hoặc trình duyệt của bạn không hỗ trợ JavaScript, hoặc bạn đã tắt JavaScript."
+      js_2: "OpenStreetMap sử dụng JavaScript cho chức năng bản đồ trơn."
+      js_3: 'Bạn vẫn có thể sử dụng <a href="http://tah.openstreetmap.org/Browse/">bản đồ tĩnh Tiles@Home</a> nếu không bật lên JavaScript được.'
+      permalink: "Liên kết thường trực"
+      shortlink: "Liên kết ngắn gọn"
+      license:
+        notice: "{{project_name}} và những người đóng góp cho phép sử dụng theo giấy phép {{license_name}}."
+        license_name: "Creative Commons Attribution-Share Alike 2.0"
+        license_url: "http://www.creativecommons.org/licenses/by-sa/2.0/"
+        project_name: "Dự án OpenStreetMap"
+        project_url: "http://www.openstreetmap.org/"
+    edit:
+      not_public: "Bạn chưa đưa ra công khai các sửa đổi của bạn."
+      not_public_description: "Nếu không đưa ra công khai, bạn không còn được phép sửa đổi bản đồ. Bạn có thể đưa ra công khai tại {{user_page}}."
+      user_page_link: "trang cá nhân"
+      anon_edits: "({{link}})"
+      anon_edits_link: "http://wiki.openstreetmap.org/wiki/Disabling_anonymous_edits?uselang=vi"
+      anon_edits_link_text: "Tại sao vậy?"
+      flash_player_required: 'Bạn cần có Flash Player để sử dụng Potlatch, trình vẽ OpenStreetMap bằng Flash. Bạn có thể <a href="http://www.adobe.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash">tải xuống Flash Player từ Adobe.com</a>. Cũng có sẵn <a href="http://wiki.openstreetmap.org/wiki/Editing?uselang=vi">vài cách khác</a> để sửa đổi OpenStreetMap.'
+      potlatch_unsaved_changes: "Bạn có thay đổi chưa lưu. (Để lưu trong Potlatch, hãy bỏ chọn lối hoặc địa điểm đang được chọn, nếu đến sửa đổi trong chế độ Áp dụng Ngay, hoặc bấm nút Lưu nếu có.)"
+    sidebar:
+      search_results: "Kết quả Tìm kiếm"
+      close: "Đóng"
+    search:
+      search: "Tìm kiếm"
+      where_am_i: "Tôi ở đâu?"
+      submit_text: "Đi"
+      search_help: 'thí dụ: "Alkmaar", "Regent Street, Cambridge", "CB2 5AQ", hoặc "post offices near Lünen" - <a href="http://wiki.openstreetmap.org/wiki/Search?uselang=vi">thêm thí dụ...</a>'
+    key:
+      map_key: "Chú giải"
+      map_key_tooltip: "Chú giải kiểu bản đồ Mapnik tại mức thu phóng này"
+      table:
+        heading: "Chú giải tại mức {{zoom_level}}"
+        entry:
+          motorway: "Quốc lộ"
+          trunk: "Xa lộ"
+          primary: "Tỉnh lộ"
+          secondary: "Đường chính"
+          unclassified: "Đường lớn"
+          unsurfaced: "Đường không lát"
+          track: "Đường mòn"
+          byway: "Đường mòn đa mốt"
+          bridleway: "Đường cưỡi ngựa"
+          cycleway: "Đường xe đạp"
+          footway: "Đường đi bộ"
+          rail: "Đường sắt"
+          subway: "Đường ngầm"
+          tram:
+            - "Đường sắt nhẹ"
+            - "xe điện"
+          cable:
+            - "Đường xe cáp"
+            - "ski lift"
+          runway:
+            - "Đường băng"
+            - "đường lăn"
+          apron:
+            - "Sân đậu máy bay"
+            - "nhà ga hành khách"
+          admin: "Biên giới hành chính"
+          forest: "Rừng trồng cây"
+          wood: "Rừng"
+          golf: "Sân golf"
+          park: "Công viên"
+          resident: "Khu vực nhà ở"
+          tourist: "Nơi du lịch"
+          common:
+            - "Đất công"
+            - "bãi cỏ"
+          retail: "Khu vực buôn bán"
+          industrial: "Khu vực công nghiệp"
+          commercial: "Khu vực thương mại"
+          heathland: "Vùng cây bụi"
+          lake:
+            - "Hồ"
+            - "bể nước"
+          farm: "Ruộng"
+          brownfield: "Sân để trống"
+          cemetery: "Nghĩa địa"
+          allotments: "Khu vườn gia đình"
+          pitch: "Sân thể thao"
+          centre: "Trung tâm thể thao"
+          reserve: "Khu bảo tồn thiên niên"
+          military: "Khu vực quân sự"
+          school: "Trường học"
+          building: "Kiến trúc quan trọng"
+          station: "Nhà ga"
+          summit:
+            - "Đỉnh núi"
+            - "đồi"
+          tunnel: "Đường đứt nét = đường hầm"
+          bridge: "Đường rắn = cầu"
+          private: "Đường riêng"
+          permissive: "Đường cho phép"
+          destination: "Chỉ giao thông địa phương"
+          construction: "Đường đang xây"
+  trace:
+    create:
+      upload_trace: "Tải lên Tuyến đường GPS"
+      trace_uploaded: "Tập tin GPX của bạn đã được tải lên và đang chờ được chèn vào cơ sở dữ liệu. Thường chỉ cần chờ đợi trong vòng nửa tiếng, và bạn sẽ nhận thư điện tử lúc khi nó xong."
+    edit:
+      title: "Sửa đổi tuyến đường {{name}}"
+      heading: "Sửa đổi tuyến đường {{name}}"
+      filename: "Tên tập tin:"
+      download: "tải xuống"
+      uploaded_at: "Lúc tải lên:"
+      points: "Số nốt:"
+      start_coord: "Tọa độ đầu đường:"
+      map: "bản đồ"
+      edit: "sửa đổi"
+      owner: "Tác giả:"
+      description: "Miêu tả:"
+      tags: "Thẻ:"
+      save_button: "Lưu các Thay đổi"
+    no_such_user:
+      title: "Người dùng không tồn tại"
+      heading: "Người dùng {{user}} không tồn tại"
+      body: "Rất tiếc, không có người dùng nào với tên {{user}}. Xin hãy kiểm tra chính tả, hoặc có lẽ bạn đã theo một liên kết sai."
+    trace_form:
+      upload_gpx: "Tải lên Tập tin GPX"
+      description: "Miêu tả"
+      tags: "Thẻ"
+      public: "Công khai?"
+      public_help: "có nghĩa là gì?"
+      public_help_url: "http://wiki.openstreetmap.org/wiki/Visibility_of_GPS_traces?uselang=vi"
+      upload_button: "Tải lên"
+      help: "Trợ giúp"
+      help_url: "http://wiki.openstreetmap.org/wiki/Upload?uselang=vi"
+    trace_header:
+      see_just_your_traces: "Chỉ xem các tuyến đường của bạn, hoặc tải lên tuyến đường"
+      see_all_traces: "Xem tất cả các tuyến đường"
+      see_your_traces: "Xem các tuyến đường của bạn"
+      traces_waiting: "Bạn có {{count}} tuyến đường đang chờ được tải lên. Xin hãy chờ đợi việc xong trước khi tải lên thêm tuyến đường, để cho người khác vào hàng đợi kịp."
+    trace_optionals:
+      tags: "Thẻ"
+    view:
+      title: "Xem tuyến đường {{name}}"
+      heading: "Xem tuyến đường {{name}}"
+      pending: "CHƯA XỬ"
+      filename: "Tên tập tin:"
+      download: "tải xuống"
+      uploaded: "Lúc tải lên:"
+      points: "Số nốt:"
+      start_coordinates: "Tọa độ đầu đường:"
+      map: "bản đồ"
+      edit: "sửa đổi"
+      owner: "Tác giả:"
+      description: "Miêu tả:"
+      tags: "Thẻ:"
+      none: "Không có"
+      make_public: "Phát hành tuyến đường công khai thường trực"
+      edit_track: "Sửa đổi tuyến đường này"
+      delete_track: "Xóa tuyến đường này"
+      trace_not_found: "Không tìm thấy tuyến đường!"
+    trace_paging_nav:
+      showing: "Xem trang"
+      of: "trong"
+    trace:
+      pending: "CHƯA XỬ"
+      count_points: "{{count}} nốt"
+      ago: "cách đây {{time_in_words_ago}}"
+      more: "thêm"
+      trace_details: "Xem Chi tiết Tuyến đường"
+      view_map: "Xem Bản đồ"
+      edit: "sửa đổi"
+      edit_map: "Sửa đổi Bản đồ"
+      public: "CÔNG KHAI"
+      private: "RIÊNG"
+      by: "bởi"
+      in: "trong"
+      map: "bản đồ"
+    list:
+      public_traces: "Tuyến đường GPS công khai"
+      your_traces: "Tuyến đường GPS của bạn"
+      public_traces_from: "Tuyến đường GPS công khai của {{user}}"
+      tagged_with: " có thẻ {{tags}}"
+    delete:
+      scheduled_for_deletion: "Tuyến đường chờ được xóa"
+    make_public:
+      made_public: "Tuyến đường được phát hành công khai"
+  user:
+    login:
+      title: "Đăng nhập"
+      heading: "Đăng nhập"
+      please login: "Xin hãy đăng nhập hoặc {{create_user_link}}."
+      create_account: "mở tài khoản"
+      email or username: "Địa chỉ Thư điện tử hoặc Tên đăng ký: "
+      password: "Mật khẩu: "
+      lost password link: "Quên mất Mật khẩu?"
+      login_button: "Đăng nhập"
+      account not active: "Rất tiếc, tài khoản của bạn chưa được kích hoạt.<br>Xin hãy nhấn chuột vào liên kết trong thư điện tử xác nhận tài khoản để kích hoạt tài khoản."
+      auth failure: "Rất tiếc, không thể đăng nhập với những chi tiết đó."
+    lost_password:
+      title: "quên mất mật khẩu"
+      heading: "Quên mất Mật khẩu?"
+      email address: "Địa chỉ Thư điện tử:"
+      new password button: "Gửi mật khẩu mới cho tôi"
+      notice email on way: "Đáng tiếc là bạn quên nó. :-( May là thư điện tử sắp tới để bạn đặt nó lại."
+      notice email cannot find: "Rất tiếc, không tìm thấy địa chỉ thư điện tử."
+    reset_password:
+      title: "đặt lại mật khẩu"
+      flash changed check mail: "Mật khẩu của bạn đã được đổi và mật khẩu mới sắp tới hộp thư của bạn. :-)"
+      flash token bad: "Không tìm thấy dấu hiệu đó. Có lẽ kiểm tra URL?"
+    new:
+      title: "Mở tài khoản"
+      heading: "Mở Tài khoản Người dùng"
+      no_auto_account_create: "Rất tiếc, chúng ta hiện không có khả năng tạo ra tài khoản tự động cho bạn."
+      contact_webmaster: 'Xin hãy liên lạc với <a href="mailto:webmaster@openstreetmap.org">webmaster</a> để xin họ tạo ra tài khoản - chúng tôi sẽ cố gắng thỏa mãn yêu cầu nhanh lẹ. '
+      fill_form: "Điền biểu mẫu rồi chúng tôi sẽ gửi thư điện tử cho bạn để kích hoạt tài khoản."
+      license_agreement: 'Khi mở tài khoản, bạn đã chấp nhận rằng tất cả dữ liệu được bạn đăng lên dự án OpenStreetMap được cho phép (không độc quyền) sử dụng theo <a href="http://www.creativecommons.org/licenses/by-sa/2.0/">giấy phép Creative Commons này (by-sa)</a>.'
+      email address: "Địa chỉ Thư điện tử: "
+      confirm email address: "Xác nhận Địa chỉ Thư điện tử: "
+      not displayed publicly: 'Không được hiển thị công khai (xem <a href="http://wiki.openstreetmap.org/wiki/Privacy_Policy?uselang=vi" title="Chính sách riêng tư wiki, có đoạn nói về địa chỉ thư điện tử including section on email addresses">chính sách riêng tư</a>)'
+      display name: "Tên hiển thị: "
+      password: "Mật khẩu: "
+      confirm password: "Xác nhận Mật khẩu: "
+      signup: "Đăng ký"
+      flash create success message: "Tài khoản người dùng được tạo ra thành công. Kiểm tra hộp thư điện tử cho thư xác nhận để bắt đầu vẽ bản đồ ngay lập tức. :-)<br /><br />Xin lưu ý rằng bạn cần phải nhận thư xác nhận và xác nhận địa chỉ thư điện tử trước khi có thể đăng nhập.<br /><br />Nếu hệ thống thư điện tử của bạn có tính năng chống spam bằng cách yêu cầu xác nhận lại, xin hãy chắc chắn thêm webmaster@openstreetmap.org vào danh sách trắng, tại vì chúng tôi không thể trả lời những yêu cầu xác nhận này."
+    no_such_user:
+      title: "Người dùng không tồn tại"
+      heading: "Người dùng {{user}} không tồn tại"
+      body: "Rất tiếc, không có người dùng với tên {{user}}. Xin hãy kiểm tra chính tả, hoặc có lẽ bạn đã theo một liên kết sai."
+    view:
+      my diary: "nhật ký của tôi"
+      new diary entry: "mục nhật ký mới"
+      my edits: "đóng góp của tôi"
+      my traces: "tuyến đường của tôi"
+      my settings: "tùy chọn"
+      send message: "gửi thư"
+      diary: "nhật ký"
+      edits: "đóng góp"
+      traces: "tuyến đường"
+      remove as friend: "dời người bạn"
+      add as friend: "thêm là người bạn"
+      mapper since: "Tham gia: "
+      ago: "(cách đây {{time_in_words_ago}})"
+      user image heading: "Hình người dùng"
+      delete image: "Xóa Hình"
+      upload an image: "Tải lên hình"
+      add image: "Thêm Hình"
+      description: "Miêu tả"
+      user location: "Vị trí của người dùng"
+      no home location: "Chưa đặt vị trí nhà."
+      if set location: "Nếu đặt vị trí, bản đồ đẹp đẽ và những thứ đó sẽ được hiển thị ở dưới. Bạn có thể đặt vị trí nhà tại trang {{settings_link}}."
+      settings_link_text: "tùy chọn"
+      your friends: "Người bạn của bạn"
+      no friends: "Bạn chưa thêm người bạn."
+      km away: "cách {{count}} km"
+      m away: "cách {{count}} m"
+      nearby users: "Người dùng ở gần: "
+      no nearby users: "Chưa có người dùng nào nhận là họ ở gần."
+      change your settings: "thay đổi tùy chọn của bạn"
+    friend_map:
+      your location: "Vị trí của bạn"
+      nearby mapper: "Người vẽ bản đồ ở gần: "
+    account:
+      title: "Chỉnh sửa tài khoản"
+      my settings: "Tùy chọn"
+      email never displayed publicly: "(không lúc nào hiện công khai)"
+      public editing:
+        heading: "Sửa đổi công khai: "
+        enabled: "Kích hoạt. Không vô danh và có thể sửa đổi dữ liệu."
+        enabled link: "http://wiki.openstreetmap.org/wiki/Anonymous_edits?uselang=vi"
+        enabled link text: "có nghĩa là gì?"
+        disabled: "Vô hiệu. Không thể sửa đổi dữ liệu. all previous edits are anonymous."
+        disabled link text: "tại sao không thể sửa đổi?"
+      profile description: "Tự giới thiệu: "
+      preferred languages: "Ngôn ngữ Ưu tiên: "
+      home location: "Vị trí Nhà: "
+      no home location: "Bạn chưa định vị trí nhà."
+      latitude: "Vĩ độ: "
+      longitude: "Kinh độ: "
+      update home location on click: "Cập nhật vị trí nhà khi tôi nhấn chuột vào bản đồ?"
+      save changes button: "Lưu các Thay đổi"
+      make edits public button: "Phát hành công khai các sửa đổi của tôi"
+      return to profile: "Trở về trang cá nhân"
+      flash update success confirm needed: "Đã cập nhật thông tin cá nhân thành công. Kiểm tra thư điện tử xác nhận địa chỉ thư điện tử mới."
+      flash update success: "Đã cập nhật thông tin cá nhân thành công."
+    confirm:
+      heading: "Xác nhận tài khoản người dùng"
+      press confirm button: "Bấm nút Xác nhận ở dưới để xác nhận tài khoản."
+      button: "Xác nhận"
+      success: "Đã xác nhận tài khoản của bạn. Cám ơn bạn đã đăng ký!"
+      failure: "Tài khoản với dấu hiệu này đã được xác nhận."
+    confirm_email:
+      heading: "Xác nhận thay đổi địa chỉ thư điện tử"
+      press confirm button: "Bấm nút Xác nhận ở dưới để xác nhận địa chỉ thư điện tử mới."
+      button: "Xác nhận"
+      success: "Đã xác nhận địa chỉ thư điện tử mới. Cám ơn bạn đã đăng ký!"
+      failure: "Một địa chỉ thư điện tử đã được xác nhận dùng dấu hiệu này."
+    set_home:
+      flash success: "Đã lưu vị trí nhà thành công"
+    go_public:
+      flash success: "Tất cả các sửa đổi của bạn được phát hành công khai, và bạn mới được phép sửa đổi."
+    make_friend:
+      success: "{{name}} mới là người bạn."
+      failed: "Rất tiếc, việc thêm {{name}} là người bạn bị thất bại."
+      already_a_friend: "{{name}} đã là người bạn."
+    remove_friend:
+      success: "{{name}} không còn người bạn."
+      not_a_friend: "{{name}} đã không phải người bạn."
index f33d41704fcec89405ac722d51af3cbf81958ddd..bc207113bbc5fadc952bc7a438f4472a550c3d1f 100644 (file)
@@ -21,7 +21,7 @@ yo:
       old_relation: "ìsötàn agba"
       old_relation_member: "aráìbátançbíiyèkan agba"
       old_relation_tag: "Old Relation Tag"
-      old_way: "Old Way"
+      old_way: "Ona Atijo"
       old_way_node: "Old Way Node"
       old_way_tag: "Old Way Tag"
       relation: "ìsötàn"
@@ -63,7 +63,7 @@ yo:
       message:
         sender: "Sender"
         title: "Title"
-        body: "Body"
+        body: "Ara"
         recipient: "Recipient"
       user:
         email: "Email"
@@ -154,7 +154,7 @@ yo:
       unable_to_load_size: "Unable to load: Bounding box size of [[bbox_size]] is too large (must be smaller than {{max_bbox_size}})"
       loading: "Loading..."
       show_history: "Show History"
-      wait: "Wait..."
+      wait: "Duro..."
       history_for_feature: "History for [[feature]]"
       details: "Details"
       private_user: "private user"
@@ -164,14 +164,14 @@ yo:
         back: "Display object list"
         type:
           node: "Node"
-          way: "Way"
+          way: "Ona"
           # There's no 'relation' type because it isn't represented in OpenLayers
         api: "Retrieve this area from the API"
         details: "Details"
         selected:
           type:
             node: "Node [[id]]"
-            way: "Way [[id]]"
+            way: "Ona [[id]]"
             # There's no 'relation' type because it isn't represented in OpenLayers
         history:
           type:
@@ -254,12 +254,12 @@ yo:
     edit:
       title: "Edit diary entry"
       subject: "Subject: "
-      body: "Body: "
-      language: "Language: "
+      body: "Ara: "
+      language: "ede: "
       location: "Location: "
       latitude: "Latitude: "
       longitude: "Longitude: "
-      use_map_link: "use map"
+      use_map_link: "Lo map"
       save_button: "Save"
       marker_text: Diary entry location
     view:
@@ -267,7 +267,7 @@ yo:
       user_title: "{{user}}'s diary"
       leave_a_comment: "Leave a comment"
       login_to_leave_a_comment: "{{login_link}} to leave a comment"
-      login: "Login"
+      login: "wole"
       save_button: "Save"
     no_such_entry:
       heading: "No entry with the id: {{id}}"
@@ -319,8 +319,6 @@ yo:
       view_larger_map: "View Larger Map"
   geocoder:
     results:
-      results: "Results"
-      type_from_source: "{{type}} from {{source_link}}"
       no_results: "No results found"
   layouts:
     project_name:
@@ -330,23 +328,23 @@ yo:
       h1: OpenStreetMap
     logo:
       alt_text: OpenStreetMap logo
-    welcome_user: "Welcome, {{user_link}}"
+    welcome_user: "Kabo, {{user_link}}"
     welcome_user_link_tooltip: Your user page
-    home: home
-    home_tooltip: Go to home location
+    home: ile
+    home_tooltip: Lo si ile 
     inbox: "inbox ({{count}})"
     inbox_tooltip:
       zero: Your inbox contains no unread messages
       one: Your inbox contians 1 unread message
       other: Your inbox contains {{count}} unread messages
-    logout: logout
-    logout_tooltip: "Log out"
-    log_in: log in
-    log_in_tooltip: Log in with an existing account
+    logout: jade
+    logout_tooltip: "Jade"
+    log_in: Wole
+    log_in_tooltip: wole pelu with an existing account
     sign_up: sign up
     sign_up_tooltip: Create an account for editing
-    view: View
-    view_tooltip: View maps
+    view: wo
+    view_tooltip: wo maps
     edit: Edit
     edit_tooltip: Edit maps
     history: History
@@ -366,17 +364,17 @@ yo:
     osm_offline: "The OpenStreetMap database is currently offline while essential database maintenance work is carried out."
     osm_read_only: "The OpenStreetMap database is currently in read-only mode while essential database maintenance work is carried out."
     donate: "Support OpenStreetMap by {{link}} to the Hardware Upgrade Fund."
-    donate_link_text: donating
+    donate_link_text: idawo
     help_wiki: "Help &amp; Wiki"
     help_wiki_tooltip: "Help &amp; Wiki site for the project"
     help_wiki_url: "http://wiki.openstreetmap.org"
     news_blog: "News blog"
     news_blog_tooltip: "News blog about OpenStreetMap, free geographical data, etc."
-    shop: Shop
-    shop_tooltip: Shop with branded OpenStreetMap 
+    shop: Oja
+    shop_tooltip: Oja oni OpenStreetMap 
     shop_url: http://wiki.openstreetmap.org/wiki/Merchandise
-    sotm: 'Come to the 2009 OpenStreetMap Conference, The State of the Map, July 10-12 in Amsterdam!'
-    alt_donation: Make a Donation
+    sotm: 'Wa si 2009 Ipade OpenStreetMap, The State of the Map, July 10-12 ni ilu  Amsterdam!'
+    alt_donation: Da wo si openstreetmap.org
   notifier:
     diary_comment_notification:
       subject: "[OpenStreetMap] {{user}} commented on your diary entry"
@@ -508,24 +506,24 @@ yo:
       my_inbox: "My {{inbox_link}}"
       inbox: "inbox"
       outbox: "outbox"
-      you_have_sent_messages: "You have {{sent_count}} sent messages"
+      you_have_sent_messages: "O ni {{sent_count}} sent messages"
       to: "To"
       subject: "Subject"
       date: "Date"
       no_sent_messages: "You have no sent messages yet. Why not get in touch with some of the {{people_mapping_nearby_link}}?"
       people_mapping_nearby: "people mapping nearby"
     read:
-      title: "Read message"
-      reading_your_messages: "Reading your messages"
+      title: "Ka message"
+      reading_your_messages: "Ka messages eh"
       from: "From"
       subject: "Subject"
       date: "Date"
       reply_button: "Reply"
       unread_button: "Mark as unread"
-      back_to_inbox: "Back to inbox"
-      reading_your_sent_messages: "Reading your sent messages"
+      back_to_inbox: "Pada si inbox"
+      reading_your_sent_messages: "Ka sent messages"
       to: "To"
-      back_to_outbox: "Back to outbox"
+      back_to_outbox: "Pad si outbox"
     mark:
       as_read: "Message marked as read"
       as_unread: "Message marked as unread"
@@ -555,9 +553,8 @@ yo:
       close: Close
     search:
       search: Search
-      where_am_i: "Where am I?"
-      submit_text: "Go"
-      searching: "Searching..."
+      where_am_i: "Ni bo ni mo wa?"
+      submit_text: "Lo"
       search_help: "examples: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', or 'post offices near Lünen' <a href='http://wiki.openstreetmap.org/wiki/Search'>more examples...</a>"
     key:
       map_key: "Map key"
@@ -641,16 +638,16 @@ yo:
       made_public: "Track made public"
   user:
     login:
-      title: "Login"
-      heading: "Login"
-      please login: "Please login or {{create_user_link}}."
+      title: "Wole"
+      heading: "Wole"
+      please login: "Ejo e Wolw abi {{create_user_link}}."
       create_account: "create an account"
       email or username: "Email Address or Username: "
       password: "Password: "
-      lost password link: "Lost your password?"
+      lost password link: "Se eh ti san password nu?"
       login_button: "Login"
-      account not active: "Sorry, your account is not active yet.<br>Please click on the link in the account confirmation email to activate your account."
-      auth failure: "Sorry, couldn't log in with those details."
+      account not active: "Pele, account yin ko wa active .<br>Jo eh te link ni nu account confirmation email lati tan account eh."
+      auth failure: "Pele, e le wole pelu details yi."
     lost_password:
       title: "lost password"
       heading: "Forgotten Password?"
index 9c69010dfe9bff6e6361dd03e1a3d40d10a0986e..b1ef83dc21104637618cc1f27d1ef5d599ec3a2f 100644 (file)
@@ -291,9 +291,15 @@ zh-CN:
       add_marker: "标记地图"
       view_larger_map: "查看放大地图"
   geocoder:
+    search:
+      title:
+        latlon: '结果 从 <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: '结果 从 <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: '结果 从 <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: '结果 从 <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: '结果 从 <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: '结果 从 <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "结果"
-      type_from_source: "{{type}} 从 {{source_link}}"
       no_results: "没有发现结果"
   layouts:
     welcome_user: "欢迎, {{user_link}}"
@@ -458,7 +464,6 @@ zh-CN:
       search: 搜索
       where_am_i: "我在哪儿?"
       submit_text: "开始"
-      searching: "搜索中..."
       search_help: "例如: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', 或者 'post offices near L??nen' <a href='http://wiki.openstreetmap.org/wiki/Search'>更多例子...</a>"
     key:
       map_key: "地图符号"
index 57b90c589a4ca45ad4daeacc9344cf7a9efbf6cd..104137e4ba315f414871f8f8f331461b0e84ba32 100644 (file)
@@ -318,9 +318,15 @@ zh-TW:
       add_marker: "加入標記至地圖"
       view_larger_map: "檢視較大的地圖"
   geocoder:
+    search:
+      title:
+        latlon: '結果 從 <a href="http://openstreetmap.org/">Internal</a>'
+        us_postcode: '結果 從 <a href="http://geocoder.us/">Geocoder.us</a>'
+        uk_postcode: '結果 從 <a href="http://www.npemap.org.uk/">NPEMap / FreeThe Postcode</a>'
+        ca_postcode: '結果 從 <a href="http://geocoder.ca/">Geocoder.CA</a>'
+        osm_namefinder: '結果 從 <a href="http://gazetteer.openstreetmap.org/namefinder/">OpenStreetMap Namefinder</a>'
+        geonames: '結果 從 <a href="http://www.geonames.org/">GeoNames</a>'
     results:
-      results: "結果"
-      type_from_source: "{{type}} 從 {{source_link}}"
       no_results: "找不到任何結果"
   layouts:
     project_name:
@@ -557,7 +563,6 @@ zh-TW:
       search: "搜尋"
       where_am_i: "我在哪裡?"
       submit_text: "走"
-      searching: "搜尋中..."
       search_help: "範例: 'Alkmaar', 'Regent Street, Cambridge', 'CB2 5AQ', 或 'post offices near L羹nen' <a href='http://wiki.openstreetmap.org/wiki/Search'>更多範例...</a>"
     key:
       map_key: "圖例"
index 7b7e6632668f05c9304295b9de3dd51ce3ddb1a1..7b71ca1a5355bcbe3bcf4114834b33dd251c2982 100644 (file)
@@ -22,8 +22,10 @@ OpenLayers/Layer.js
 OpenLayers/Layer/GML.js
 OpenLayers/Layer/Markers.js
 OpenLayers/Layer/SphericalMercator.js
-OpenLayers/Layer/TMS.js
+OpenLayers/Layer/XYZ.js
 OpenLayers/Layer/Vector.js
+OpenLayers/Tile.js
+OpenLayers/Tile/Image.js
 OpenLayers/Feature/Vector.js
 OpenLayers/Format/GML.js
 OpenLayers/Format/OSM.js
index b19003343da9230bf1e59f9e105709e1c5309f5a..845c1277c0dd40778130d4f0b889007cecf7909e 100644 (file)
@@ -117,7 +117,7 @@ ActionController::Routing::Routes.draw do |map|
   map.connect '/forgot-password.html', :controller => 'user', :action => 'lost_password'
 
   # permalink
-  map.connect '/go/:code', :controller => 'site', :action => 'permalink', :code => /[a-zA-Z0-9_@]+=*/
+  map.connect '/go/:code', :controller => 'site', :action => 'permalink', :code => /[a-zA-Z0-9_@]+[=-]*/
 
   # traces  
   map.connect '/traces', :controller => 'trace', :action => 'list'
@@ -172,7 +172,15 @@ ActionController::Routing::Routes.draw do |map|
 
   # geocoder
   map.connect '/geocoder/search', :controller => 'geocoder', :action => 'search'
+  map.connect '/geocoder/search_latlon', :controller => 'geocoder', :action => 'search_latlon'
+  map.connect '/geocoder/search_us_postcode', :controller => 'geocoder', :action => 'search_uk_postcode'
+  map.connect '/geocoder/search_uk_postcode', :controller => 'geocoder', :action => 'search_us_postcode'
+  map.connect '/geocoder/search_ca_postcode', :controller => 'geocoder', :action => 'search_ca_postcode'
+  map.connect '/geocoder/search_osm_namefinder', :controller => 'geocoder', :action => 'search_osm_namefinder'
+  map.connect '/geocoder/search_geonames', :controller => 'geocoder', :action => 'search_geonames'
   map.connect '/geocoder/description', :controller => 'geocoder', :action => 'description'
+  map.connect '/geocoder/description_osm_namefinder', :controller => 'geocoder', :action => 'description_osm_namefinder'
+  map.connect '/geocoder/description_geonames', :controller => 'geocoder', :action => 'description_geonames'
 
   # export
   map.connect '/export/start', :controller => 'export', :action => 'start'
index afcf1ef37f5462a0b83b4cc3d85a283a24e0dc7d..b91d7e569dddc57d12e3b3fe02d11df7aea10e82 100644 (file)
@@ -57,7 +57,7 @@ module ShortLink
     # append characters onto the end of the string to represent
     # partial zoom levels (characters themselves have a granularity
     # of 3 zoom levels).
-    ((z + 8) % 3).times { str << "=" }
+    ((z + 8) % 3).times { str << "-" }
     
     return str
   end
diff --git a/public/images/searching.gif b/public/images/searching.gif
new file mode 100644 (file)
index 0000000..5b33f7e
Binary files /dev/null and b/public/images/searching.gif differ
index b7ad7d7e4b782e338a8515f56a95cdb0a7d24fe5..59999b8c022bf5dff709ff04ebfd4243f9f19d3a 100644 (file)
@@ -231,7 +231,7 @@ function makeShortCode(lat, lon, zoom) {
        str += char_array.charAt(digit);
     }
     for (var i = 0; i < ((zoom + 8) % 3); ++i) {
-       str += "=";
+       str += "-";
     }
     return str;
 }
index 86b38f8ace41b1f65f8e302e2b42d634c8b8b394..c44d54bcea0b18bae8acbf5472381984b2a9bf50 100644 (file)
@@ -402,11 +402,6 @@ hr {
   padding-bottom: 6px;
 }
 
-#search_active {
-  display: none;
-  color: red;
-}
-
 .rsssmall {
   position: relative;
   top: 4px;
@@ -514,6 +509,11 @@ hr {
   margin-bottom: 0px;
 }
 
+.search_searching {
+  margin-top: 5px;
+  margin-bottom: 5px;
+}
+
 .olControlAttribution {
   display: none !important;
 }
index 91f939a529265ed786ced63a5131a9bb0026a8b9..3f2d65a27c323da7d5eb7be63a8ff56a03a1c9dd 100644 (file)
@@ -6,7 +6,7 @@ class ShortLinkTest < ActionController::IntegrationTest
   # kept in the redirect.
   def test_short_link_params
     assert_short_link_redirect('1N8H@P_5W')
-    assert_short_link_redirect('euu4oTas==')
+    assert_short_link_redirect(ShortLink::encode(-0.107846, 51.50771, 18))
   end
 
   ##