Railsのプラクティスに入りました。 Railsを国際化するために必要なi18nについて調べました。
結論
アプリケーションの文言を英語以外の 別の1つの言語に翻訳 する機能や 多言語サポート 機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。
- Rails 2.2以降からRailsに同梱されている。
- Railsフレームワーク内の静的文字列は国際化済み。(ローカライズしたい言語のLocalを作成して切り分けるだけでローカライズできる)
- Railsのローカライズはデフォルト文字列(Locale)を訳文でオーバーライドするだけでok。
- I18nライブラリはEnglishをデフォルトのロケールとして設定されている。
国際化とLocalizationの違い
分かりにくい国際化とLocalizationの違いについて。
国際化(internationalization)
多言語に対応すること。 使われるすべての文言やロケール固有の要素 (日付や通貨フォーマットなど) の抽象化までの作業のこと。 アプリケーションを国際化するプロセスは以下の3つ。
Localization
具体的な翻訳方法を提供したり、そのためのフォーマットを提供すること。 アプリケーションをローカライズするプロセスは以下の3つ。
- Railsのデフォルトロケールの差し替えまたはロケールの追加。(日付や時刻のフォーマット、月の呼称、Active Recordモデル名などが対象)
- アプリケーションで使われる文字列を抽象化し、キーで検索できる辞書に保存する。(フラッシュメッセージやビュー内の固定テキストなどが対象)
- 作成された辞書を別の場所に保存する。
ロケールの切り替え方法
ロケールの切り替えにはいくつかの方法がある。
ロケール設定のポイント
config/locales
以下にあるすべての.rbファイルと.ymlファイルは自動的に訳文読み込みパスに追加される。config/application.rb
でイニシャライザのデフォルトロケールを変更する。config/application.rb
内のI18n.load_paths
に直接追加すると外部gem由来の訳文はオーバーライドされないことに注意する。
方法1: ドメイン毎に切り替える
トップレベルドメイン、サブドメインのドメイン名を基づいてロケールを切り替える。
例) www.example.com
: 英語ロケール、www.example.es
: スペイン語ロケール
方法2: paramsで切り替え
ロケールをURL paramsに含めることでロケールを切り替える。
例) www.example.com/books?locale=ja
、www.example.com/ja/books
- ロケールをすべてのURLに含めてリクエスト経由で渡すことでロケールを設定する。
ApplicationController#default_url_options
をオーバーライドすることでurl_for
に依存するすべてのヘルパーメソッド(root_path
など)にロケール情報がクエリ文字列に含まれるようになる。config/routes.rb
にscope "/:locale" do...
とすることで"/en/books"
のようにロケール情報をURLの上の方に置くことができる。
方法3: クライアントの情報を元に切り替える
ユーザーが選択したロケール設定をデータベースに保存しておき、それを用いてユーザーからの認証済みリクエストごとにロケールを切り替える。
リクエストにロケールが明示的に設定されていない場合には下記の情報を基にロケールをアプリケーション側で設定する。
- Accept-Language: ブラウザやOSで設定した情報
- GeoIP: IPアドレスからの地域情報(信頼性が低いためあまりおすすめできない)
- ユーザープロファイル: 言語選択等
ロケールをセッションやcookieに保存しない
ロケールは透過的にすべきであり、かつURLの一部に含めるべきです。
全てのリソースに対してURIを通して表現できなくなってしまう。 つまり、RESTfulでなくなってしまうのでNG。
リソース指向アーキテクチャ(ROA)とは何なのか - Qiita
まとめ
Railsガイドを読んで自分なりにまとめてみましたが、理解度はいまいちです。 実際にアプリを国際化していくことで理解できる部分もあると思うので手を動かして理解していこうと思います。