From 02d928f9a406c536d5a83ebac0532b6383f8e1fc Mon Sep 17 00:00:00 2001
From: Christian Meier <m.kristian@web.de>
Date: Mon, 26 May 2014 12:55:43 +0100
Subject: [PATCH] allow to pass in language/locale parameter on per request
 base

---
 lib/geocoder/lookups/google.rb    |  2 +-
 lib/geocoder/lookups/nominatim.rb |  2 +-
 lib/geocoder/lookups/yahoo.rb     |  4 +++-
 lib/geocoder/lookups/yandex.rb    |  2 +-
 lib/geocoder/query.rb             |  4 ++++
 test/unit/lookup_test.rb          | 17 +++++++++++++++++
 6 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/lib/geocoder/lookups/google.rb b/lib/geocoder/lookups/google.rb
index d87f79bf..ef1e41c7 100644
--- a/lib/geocoder/lookups/google.rb
+++ b/lib/geocoder/lookups/google.rb
@@ -44,7 +44,7 @@ module Geocoder::Lookup
       params = {
         (query.reverse_geocode? ? :latlng : :address) => query.sanitized_text,
         :sensor => "false",
-        :language => configuration.language
+        :language => (query.language || configuration.language)
       }
       unless (bounds = query.options[:bounds]).nil?
         params[:bounds] = bounds.map{ |point| "%f,%f" % point }.join('|')
diff --git a/lib/geocoder/lookups/nominatim.rb b/lib/geocoder/lookups/nominatim.rb
index 4e594862..6eeef989 100644
--- a/lib/geocoder/lookups/nominatim.rb
+++ b/lib/geocoder/lookups/nominatim.rb
@@ -37,7 +37,7 @@ module Geocoder::Lookup
       params = {
         :format => "json",
         :addressdetails => "1",
-        :"accept-language" => configuration.language
+        :"accept-language" => (query.language || configuration.language)
       }.merge(super)
       if query.reverse_geocode?
         lat,lon = query.coordinates
diff --git a/lib/geocoder/lookups/yahoo.rb b/lib/geocoder/lookups/yahoo.rb
index 2b80100c..ec19f4fe 100644
--- a/lib/geocoder/lookups/yahoo.rb
+++ b/lib/geocoder/lookups/yahoo.rb
@@ -62,11 +62,13 @@ module Geocoder::Lookup
     end
 
     def query_url_params(query)
+      lang = (query.language || configuration.language).to_s
+      lang += '_US' if lang == 'en'
       {
         :location => query.sanitized_text,
         :flags => "JXTSR",
         :gflags => "AC#{'R' if query.reverse_geocode?}",
-        :locale => "#{configuration.language}_US",
+        :locale => lang,
         :appid => configuration.api_key
       }.merge(super)
     end
diff --git a/lib/geocoder/lookups/yandex.rb b/lib/geocoder/lookups/yandex.rb
index f5559efb..6be58770 100644
--- a/lib/geocoder/lookups/yandex.rb
+++ b/lib/geocoder/lookups/yandex.rb
@@ -46,7 +46,7 @@ module Geocoder::Lookup
       {
         :geocode => q,
         :format => "json",
-        :plng => "#{configuration.language}", # supports ru, uk, be
+        :plng => "#{query.language || configuration.language}", # supports ru, uk, be
         :key => configuration.api_key
       }.merge(super)
     end
diff --git a/lib/geocoder/query.rb b/lib/geocoder/query.rb
index d201c94f..c8e8c298 100644
--- a/lib/geocoder/query.rb
+++ b/lib/geocoder/query.rb
@@ -98,6 +98,10 @@ module Geocoder
       coordinates?
     end
 
+    def language
+      options[:language]
+    end
+
     private # ----------------------------------------------------------------
 
     def params_given?
diff --git a/test/unit/lookup_test.rb b/test/unit/lookup_test.rb
index 83561537..ba7a14a3 100644
--- a/test/unit/lookup_test.rb
+++ b/test/unit/lookup_test.rb
@@ -56,6 +56,23 @@ class LookupTest < GeocoderTestCase
     end
   end
 
+  {
+    :google => :language,
+    :google_premier => :language,
+    :nominatim => :"accept-language",
+    :yahoo => :locale,
+    :yandex => :plng
+  }.each do |l,p|
+    define_method "test_passing_language_to_#{l}_query_overrides_configuration_value" do
+      set_api_key!(l)
+      url = Geocoder::Lookup.get(l).query_url(Geocoder::Query.new(
+        "test", :language => 'xxxx'
+      ))
+      assert_match(/#{p}=xxxx/, url,
+        "Param passed to #{l} lookup does not override configuration value")
+    end
+  end
+
   def test_raises_exception_on_invalid_key
     Geocoder.configure(:always_raise => [Geocoder::InvalidApiKey])
     #Geocoder::Lookup.all_services_except_test.each do |l|
-- 
GitLab