i18nとは

Railsのプラクティスに入りました。 Railsを国際化するために必要なi18nについて調べました。

結論

i18nとは国際化(多言語化)するためのgem。

アプリケーションの文言を英語以外の 別の1つの言語に翻訳 する機能や 多言語サポート 機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。

国際化とLocalizationの違い

分かりにくい国際化とLocalizationの違いについて。

国際化(internationalization)

多言語に対応すること。 使われるすべての文言やロケール固有の要素 (日付や通貨フォーマットなど) の抽象化までの作業のこと。 アプリケーションを国際化するプロセスは以下の3つ。

  1. i18nをサポートする設定を追加。
  2. ロケール辞書の置き場所をRailsに指示する。
  3. ロケールの設定・保存・切替方法をRailsに指示する。

Localization

具体的な翻訳方法を提供したり、そのためのフォーマットを提供すること。 アプリケーションをローカライズするプロセスは以下の3つ。

  1. Railsのデフォルトロケールの差し替えまたはロケールの追加。(日付や時刻のフォーマット、月の呼称、Active Recordモデル名などが対象)
  2. アプリケーションで使われる文字列を抽象化し、キーで検索できる辞書に保存する。(フラッシュメッセージやビュー内の固定テキストなどが対象)
  3. 作成された辞書を別の場所に保存する。

ロケールの切り替え方法

ロケールの切り替えにはいくつかの方法がある。

ロケール設定のポイント

  • config/locales 以下にあるすべての.rbファイルと.ymlファイルは自動的に訳文読み込みパスに追加される。
  • config/application.rb でイニシャライザのデフォルトロケールを変更する。
  • config/application.rb 内のI18n.load_paths に直接追加すると外部gem由来の訳文はオーバーライドされないことに注意する。

方法1: ドメイン毎に切り替える

トップレベルドメインサブドメインドメイン名を基づいてロケールを切り替える。

例) www.example.com: 英語ロケールwww.example.es: スペイン語ロケール

Rails 国際化(i18n)API - Railsガイド

  • ロケールがURLの一部として明確に示される。
  • ApplicationControlleraround_actionロケールを設定する。

方法2: paramsで切り替え

ロケールをURL paramsに含めることでロケールを切り替える。

例) www.example.com/books?locale=jawww.example.com/ja/books

Rails 国際化(i18n)API - Railsガイド

  • ロケールをすべてのURLに含めてリクエスト経由で渡すことでロケールを設定する。
  • ApplicationController#default_url_options をオーバーライドすることでurl_for に依存するすべてのヘルパーメソッド(root_path など)にロケール情報がクエリ文字列に含まれるようになる。
  • config/routes.rbscope "/:locale" do... とすることで"/en/books" のようにロケール情報をURLの上の方に置くことができる。

方法3: クライアントの情報を元に切り替える

ユーザーが選択したロケール設定をデータベースに保存しておき、それを用いてユーザーからの認証済みリクエストごとにロケールを切り替える。

Rails 国際化(i18n)API - Railsガイド

リクエストにロケールが明示的に設定されていない場合には下記の情報を基にロケールをアプリケーション側で設定する。

  • Accept-Language: ブラウザやOSで設定した情報
  • GeoIP: IPアドレスからの地域情報(信頼性が低いためあまりおすすめできない)
  • ユーザープロファイル: 言語選択等

ロケールをセッションやcookieに保存しない

ロケールは透過的にすべきであり、かつURLの一部に含めるべきです。

全てのリソースに対してURIを通して表現できなくなってしまう。 つまり、RESTfulでなくなってしまうのでNG。

RESTful APIとは何なのか - Qiita

リソース指向アーキテクチャ(ROA)とは何なのか - Qiita

まとめ

Railsガイドを読んで自分なりにまとめてみましたが、理解度はいまいちです。 実際にアプリを国際化していくことで理解できる部分もあると思うので手を動かして理解していこうと思います。

参照

Rails 国際化(i18n)API - Railsガイド

RESTful APIとは何なのか - Qiita

リソース指向アーキテクチャ(ROA)とは何なのか - Qiita