diff --git a/lib/geocoder/results/geoip2.rb b/lib/geocoder/results/geoip2.rb index 96721ad5c211b0cb0c0eb111718eb38a0058f8d3..5e8b00884ba20d6441a35ad2a44a2cd9b2ae6999 100644 --- a/lib/geocoder/results/geoip2.rb +++ b/lib/geocoder/results/geoip2.rb @@ -15,11 +15,15 @@ module Geocoder end def city - data.fetch('city', {}).fetch('names', {}).fetch(locale, '') + fetch_name( + data.fetch('city', {}).fetch('names', {}) + ) end def state - data.fetch('subdivisions', []).fetch(0, {}).fetch('names', {}).fetch(locale, '') + fetch_name( + data.fetch('subdivisions', []).fetch(0, {}).fetch('names', {}) + ) end def state_code @@ -27,7 +31,9 @@ module Geocoder end def country - data.fetch('country', {}).fetch('names', {}).fetch(locale, '') + fetch_name( + data.fetch('country', {}).fetch('names', {}) + ) end def country_code @@ -48,14 +54,26 @@ module Geocoder end end + def language=(l) + @language = l.to_s + end + + def language + @language ||= default_language + end + private def data @data.to_hash end - def locale - @locale ||= Geocoder.config[:language].to_s + def default_language + @default_language = Geocoder.config[:language].to_s + end + + def fetch_name(names) + names[language] || names[default_language] || '' end end end diff --git a/test/unit/lookups/geoip2_test.rb b/test/unit/lookups/geoip2_test.rb index d50e3bce67e866355c46cf1ad9bab126c7042745..62e752ebc1748c55eebd0edb32b5b8fe7a303bd7 100644 --- a/test/unit/lookups/geoip2_test.rb +++ b/test/unit/lookups/geoip2_test.rb @@ -35,4 +35,22 @@ class Geoip2Test < GeocoderTestCase Geocoder::Configuration.language = :ru assert_equal 'Маунтин-Вью', result.city end + + def test_dynamic_localization + result = Geocoder.search('8.8.8.8').first + + result.language = :ru + + assert_equal 'Маунтин-Вью', result.city + end + + def test_dynamic_localization_fallback + result = Geocoder.search('8.8.8.8').first + + result.language = :unsupported_language + + assert_equal 'Mountain View', result.city + assert_equal 'California', result.state + assert_equal 'United States', result.country + end end diff --git a/test/unit/lookups/maxmind_geoip2_test.rb b/test/unit/lookups/maxmind_geoip2_test.rb index a930a20137010f078e3e2060a611a2a132cedfaf..125b05cb1e76878a903fbf0233af3a933cbbd1f8 100644 --- a/test/unit/lookups/maxmind_geoip2_test.rb +++ b/test/unit/lookups/maxmind_geoip2_test.rb @@ -29,4 +29,24 @@ class MaxmindGeoip2Test < GeocoderTestCase results = Geocoder.search("no results") assert_equal 0, results.length end + + def test_dynamic_localization + result = Geocoder.search('1.2.3.4').first + + result.language = :ru + + assert_equal 'ЛоÑ-ÐнджелеÑ', result.city + assert_equal 'КалифорниÑ', result.state + assert_equal 'СШÐ', result.country + end + + def test_dynamic_localization_fallback + result = Geocoder.search('1.2.3.4').first + + result.language = :unsupported_language + + assert_equal 'Los Angeles', result.city + assert_equal 'California', result.state + assert_equal 'United States', result.country + end end