RailsでGeoIPのIPアドレスからロケール判定する際の注意点

Rails の I18n による多言語化でユーザーのロケール判定のために、GeoIP というライブラリを利用していたのですが、自分が書いたコードにバグを発見して修正しました。GeoIP の導入や I18n 多言語化についての詳細は以下のエントリーを参照。

Rails4 で i18n で英語化(多言語化) | EasyRamble

スポンサーリンク

日本語と英語を利用できるようにする前提

まず、前提としてロケールのデフォルトは日本語、利用できる言語は日本語と英語としています。application.rb に以下のように設定している場合です。

config/application.rb

GeoIP#country(ip_address_in_japan).country_code2 が “JP” を返す

IPアドレスから国コードを判定するコードとして、次のようなコードを書いていたのですが、結論から言うとここの locale_from_ip メソッドがバグを含んでいました。

app/controllers/application.rb

set_locale は before_action に設定して、全てのコントローラーのアクション前に実行され、ロケールがセットされるようにしています。

locale_from_ip メソッドに対して日本のIPアドレスを渡して “ja” が返されるべき、という内容のテストを書いて判明したのですが、日本の国コードを表す文字列として “jp” を返されます。以下、コンソールの pry でも試しました。

geoip.country(“123.456.789.123″) のIPアドレス指定の部分の、”123.456.789.123″ は自分のプロバイダのIPアドレス(日本のもの)で試しました。

以上のように国コードは、”jp” という文字列が返されるので注意が必要です。I18n.locale では通常日本語のロケール用に :ja, “ja” を使うはずですので。翻訳用の yml ファイルも ja で作成します。

locale_from_ip メソッドを修正

これを踏まえて、以下のように locale_from_ip メソッドを修正しました。

取得した国コード( GeoIP#country(ip_address).country_code2.downcase )が、”jp” の場合は locale_from_ip が “ja” を返すように修正しました。

また色々調べたら、国コードが取得できなかった場合は “–” を返すことが分かったので、elsif 節を書いて、国コードが取得できてかつ “–” じゃなかった場合は、ロケールとして “en” を返すようにしました。国コードが “jp” じゃない場合に nil を返したければ、elsif 節を削除すれば良いです。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!