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

スポンサーリンク

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

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

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

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

まず、前提としてロケールのデフォルトは日本語、利用できる言語は日本語と英語としています。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 の機能全体を網羅されています。
 
スポンサーリンク

Leave Your Message!