- 更新日: 2014年2月20日
- Rails
Rails4 で i18n で英語化(多言語化)
Rails4 では、i18n ライブラリがデフォルトで含まれているので、その枠組を利用すると英語化(多言語化)が割と楽にできます。翻訳作業は自力でやらないといけないですけれど。以下、i18n を使った英語化(多言語化)の流れをまとめました。
辞書ファイル、locale に関する初期設定
config/locales 以下の全ての辞書ファイルを読み込むように、config.i18n.load_path に追加します。またデフォルトのロケールを日本語(:ja)に設定。
config/application.rb
1 2 |
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')] config.i18n.default_locale = :ja |
config/locales 以下に辞書ファイルを用意
一から作るのは大変なので、辞書ファイルのテンプレートを github からダウンロードします。ありがたい。
1 2 3 4 5 |
$ cd config/locales $ wget https://raw.github.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml $ wget https://raw.github.com/svenfuchs/rails-i18n/master/rails/locale/en.yml |
認証エンジンに Devise を使っている場合は、Devise 用の辞書ファイルのテンプレートも準備。”devise.ja.yml” でぐぐると沢山見つかります。以下見つけた参照URL等。
1 2 3 4 5 6 7 8 9 10 |
https://github.com/plataformatec/devise/wiki/I18n(Japanese devise.ja.yml の箇所) https://github.com/Junsuke/miscellaneous/blob/master/devise.ja.yml https://github.com/malclocke/fulcrum/blob/master/config/locales/devise.ja.yml http://boiled-octopus.blog.so-net.ne.jp/2013-04-27-1 http://qiita.com/MasatoYoshioka@github/items/8d910e793e7c485403bb https://gist.github.com/606476 https://gist.github.com/orzccc/3104030 https://gist.github.com/kawamoto/4729292 |
テンプレートの辞書ファイルを元に、不足分は自分で補います。
辞書ファイルをモデル/ビューのディレクトリに分けて管理
辞書ファイルは、モデル/ビュー別の階層で管理もできます。その場合は、以下のように配置。
config/locales 以下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
locales | defaults/ | | en.yml | | ja.yml | models/ | | defaults/ | | | en.yml | | | ja.yml | | users/ | | | en.yml | | | ja.yml | | books/ | | | en.yml | | | ja.yml | views/ | | defaults/ | | | en.yml | | | ja.yml | | users/ | | | en.yml | | | ja.yml | | books/ | | | en.yml | | | ja.yml |
辞書ファイルをアプリから参照
辞書ファイルを参照するには以下。
config/locale/ja.yml
1 2 |
ja: hello: こんにちは |
以上の辞書ファイルの場合、View では以下のように書く。
1 |
<%= t('hello') %> |
これでロケール値(I18n.locale)が :ja の場合は、”こんにちは” とビューに出力されます。
Controller に書く場合は、以下。
1 |
I18n.t('hello') |
URL の一部にロケール情報を含むルーティング
日本語と英語のページを別々のURLで表示させるためには、Rails Internationalization (I18n) API — Ruby on Rails Guides を参考にして、URLの一部にロケール情報を含ませるルーティングを行う。
config/routes.rb
1 2 3 4 |
# config/routes.rb scope "/:locale" do resources :books end |
このルーティングにより、http://localhost:3000/ja/books, http://localhost:3000/en/books のように、URLパスの一部にロケール情報を含ませることができます。
ロケールの判定を application_controller.rb で行う
今回は以下の値の順で、ロケール判定を行うことにしました。
1. URL の :locale パラメータの値
2. HTTP_ACCEPT_LANGUAGE の値
3. geoip でIPアドレスから取得した値
IPアドレスからロケールを判定するには、geoip ライブラリが必要なので、あらかじめ Gemfile に gem “geoip” を書いてインストールしておきます。
また、geoip を用いる準備として、GeoLite Free Downloadable Databases « Maxmind Developer Site から GeoIP.dat.gz(GeoLite Country の Binary / gzip)をダウンロードします。その後、GeoIP を db 以下に設置。
application_controller.rb に以下のコードを書いて、before_filter で locale を判定してセットします。
app/controller/application_controller.rb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
ApplicationController < ActionController::Base require 'geoip' before_filter :set_locale private def set_locale locale = params[:locale] || locale_from_accept_language || locale_from_ip I18n.locale = (I18n::available_locales.include? locale.to_sym) ? locale.to_sym : I18n.default_locale end def locale_from_accept_language request.env['HTTP_ACCEPT_LANGUAGE'].scan(/^[a-z]{2}/).first end def locale_from_ip geoip ||= GeoIP.new(Rails.root.join( "db/GeoIP.dat" )) country = geoip.country(request.remote_ip) country.country_code2.downcase end end |
【追記 2014/04/06】
上記の locale_from_ip メソッドがバグを含んでいたので修正しました。以下エントリーの参照をお願いします。
RailsでGeoIPのIPアドレスからロケール判定する際の注意点 | EasyRamble
【追記ここまで』
ロケールの判定については、以下がとても参考になりました。
Rails3 事始め: [Rails3] 国際化 I18n のまとめ(その2:ロケールの切り替え)
ロケール別にビューテンプレートを作成
1 2 3 4 5 6 7 |
views | books | | index.en.html.erb | | index.ja.html.erb | | index.de.html.erb |
ロケール別に表示させたいHTMLテンプレートの構造が異なる場合は、上述のように各々ロケールに合わせたビューファイルを作成できます。ロケール値(I18n.locale の値)に合わせて、適切なテンプレートを選択して表示してくれます。便利です。
一応今回の多言語化(英語化)の対応はここまでです。
- – 参考リンク –
- Rails Internationalization (I18n) API — Ruby on Rails Guides
- Rails3 事始め: [Rails3] 国際化 I18n のまとめ(その1:準備編)
- Railsの多言語化対応 i18nのやり方を整理してみた!【国際化/英語化】 – 酒と泪とRubyとRailsと
IPアドレスでlocaleを決める方法 – Rails + GeoIP – The longest day in my life
- Rails の関連記事
- RailsでMySQLパーティショニングのマイグレーション
- Rails ActiveRecordでdatetime型カラムのGROUP BY集計にタイムゾーンを考慮する
- RailsプラグインGemの作成方法、RSpecテストまで含めたrails pluginの作り方
- RailsでAMPに対応するgemをリリースしました
- Railsでrequest.urlとrequest.original_urlの違い
- Railsでwheneverによるcronバッチ処理
- Google AnalyticsのRails Turbolinks対応
- Railsアプリにソーシャル・シェアボタンを簡単設置
- Rails監視ツール用にErrbitをHerokuで運用
- Facebook APIバージョンのアップグレード手順(Rails OmniAuth)
Leave Your Message!