RailsのWebアプリケーションを英語化(多言語化)をサポートしてくれるGem「i18n
」の紹介です。
😸 i18nのベーシックな使い方
デフォルトの言語を日本語にするには、config/application.rb
の次のように指定します。
config.i18n.default_locale = :ja |
日本語のロケールファイル(辞書ファイル)は、config/locales/ja.yml
に作成します。
ja: |
View側で設定したロケールファイルを使うには次のように記述します。
<%= t('view.hello') %> |
ブラウザでviewを見ると「あろは〜、世界」となっていると思います。
これがi18nの基本的な使い方です。
ちなみに次のように書くこともできます。
book |
I18n.t book.author |
I18n.t
とI18n.l
の使い方は次のとおりです。
メソッド | 説明 |
---|---|
I18n.t(I18n.translate) |
ロケールファイルからキーにマッチする値を取得 |
I18l.l(I18n.localize) |
ロケールファイルで設定された日付や時刻フォーマットに変換 |
😀 GitHubから辞書ファイルをダウンロード
Railsを日本語で使う場合のデフォルトのロケールファイルを「svenfuchs/rails-i18n · GitHub」からダウンロードします。
curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/ja.yml -o config/locales/ja.yml |
英語のロケールファイルは次のコマンドで取得します。
curl -s https://raw.githubusercontent.com/svenfuchs/rails-i18n/master/rails/locale/en.yml -o config/locales/en.yml |
これで、config/locales/en.yml
やconfig/locales/ja.yml
には一般的な設定が記述された状態からスタートできます。
😎 辞書ファイルを分割して管理をしやすくする
プロジェクトの規模が大きくなるとロケールファイルを1つのYAMLで管理するのが困難になります。
そこで、辞書ファイルをmodel/view単位で分割してみます。
まず、複数のロケールファイルを読み込めるようにconfig/application.rb
に次のコードを追加します。
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s] |
上記の設定によって、次のようなフォルダ/ファイル構成でロケールファイルを管理できます。
├── defaults |
🏀 言語別のHTMLテンプレート
言語(locale)別でViewの構造が異なる場合は、言語別のテンプレートを作ることができます。
app/views/users/ |
🐝 ユーザーの言語を動的に判定
ユーザーに表示する言語(locale)を動的に判定する方法について書きます。
多言語化のノウハウは「Google Webマスターツールの多言語化のセッション」がお勧めです。
日本語でわかりやすくまとまっていますし、SEOを考える上でも必読の資料だと思います。
上記のURLの内容を含めて考えるとURLで言語を判断できるようにした方がよいと思います。
理由はGoogleのクローラ対応、他人にURLをシェアしたときに言語(locale)を明示できるからです。
サブドメインで言語(locale)を判定する
日本語はhttp://ja.xxxx.com
、英語はhttp://en.xxxx.com
のようにサブドメインを分けて多言語する場合のRails側の対応方法です。これは言語毎にサーバを分けて管理したい時などに有効です。
app/controllers/application_controller.rb
に以下を追加すれば、サブドメインからlocaleを判定してくれます。
before_filter :set_locale |
URLのパラメータで言語(locale)を判定する
日本語はhttp://xxxx.com/ja/
、英語ならhttp://xxxx.com/en/
とURLの一部に言語(locale)をセットする場合の対応方法です。
このパターンは、ひとつのサーバ(バーチャルホスト)内で複数言語へ対応する場合に使えます。
app/controllers/application_controller.rb
に以下を追加すれば、パラメータからlocaleを判定できます。
before_filter :set_locale |
🎳 DBに格納されている文字列の多言語化
テーブル内のあるカラムを英語化する方法は2つ考えられます。
locale毎にカラムを分ける
+------+-------------+---------------+ |
1つのカラムをシリアライズする
# app/models/greeting.rb |
🐯 モデル名やモデルの属性名の多言語化
モデル名は、config/locale/ja(en).yml
に次のように書きます。
# モデル名 |
viewなどで表示する場合には次のように記述します。
# モデル名 |
😼 JavaScriptのi18n対応
JavaScript側でRailsのロケールファイルを使うには『i18n-js』というGemを使います。
Gemfile
に以下を追加して、bundle install
を実行します。
# javascriptのi18n対応 |
app/assets/javascripts/application.js
に以下を追記します。
//= require i18n |
コンソールから次のコマンドを実行して、設定ファイルconfig/i18n.js .yml
を生成します。
rake i18n:js:setup |
app/views/layouts/application.html.erb
にJavaScript側へRailsが認識したユーザーの言語(locale)を通知するための設定を追記します。
<script type=text/javascript> |
これで設定は完了です。次にJavaScript側でのi18nの使い方です。config/i18n.js.yml
に次のコードを書きます。
ja: |
JavaScript側でi18nを表示したい場所で次のように書きます。
t(hello); |
これでJavaScript側に「こんちゃー」が表示されます。
👽 参考リンク
- RailsのI18n APIの使い方の基本と辞書ファイルの整理方針: Modelごと、Viewごとに分けて管理する - memo.yomukaku.net
- Rails 3 の I18n について - おもしろWEBサービス開発日記
- Railsでi18n-jsを使ってJavaScriptの国際化 - Startup Reality
- Rails3 事始め: [Rails3] 国際化 I18n のまとめ(その3:辞書ファイルの使い方)
- 気にすんな - 国際化対応
- Model.model_name.humanとModel.human_attribute_name - Qiita