Rails3での国際化対応方法・準備編
Rails3での国際化対応について、2回にわけて書いてみようと思います。
今回は簡単な知識面のお話と対応するための準備作業をご紹介。なお、ご紹介する内容の大部分は以下の公式ドキュメントを通読した上で、抜粋したり別の方法を探したりしてご紹介しております。
「国際化対応」って何?
「Internationalization (I18n) 」って考えてみると、すごい略し方ですよね。
18文字あるからって、18を間に挟むとは。。。
「国際化」には2つの側面があります。
- 翻訳
- ローカライズ
1はその国の言葉に変換すること。例えば
Shop => 店
のような変換が「翻訳」です。
ローカライズは、時間や日付などの書き方が変わるものを指します。
これらを実現するためにRailsでは、I18n APIという仕組みが標準で組み込まれています。このため、デフォルトのロケールファイルは既に設定されており、システムの標準的なメッセージや日付、時間のフォーマットも設定ずみの状態です。なお、デフォルトのロケールは"en"です。
したがって日本語化するときは、以下の流れになります。
完全な国際化対応は実に非常に骨の折れる作業です。自作の部分に関する作業などは次回にして、今回は標準的な部分について作業してみます。
アプリケーションのデフォルト設定などへの作業
config/application.rbに設定をする事で変更などが出来ます。デフォルトは英語です。
そのため、英語以外にする場合は上記のファイルに設定をする必要があります。中を見てみると、コメントアウトされている部分がありますので参照して下さい。
もし、何らかの理由でapplication.rbに設定を書きたくない場合は、config/initializes/locale.rbに設定する事も可能です。
日本語でしかアプリケーションを動かさない場合は、application.rbに「ja」と書き込むのが楽で良いと思います。
一番簡単なロケールの設定方法
デフォルトを英語のままにしておいて、動的にロケールを切り替えるなどをしたい場合は、次の方法などが必要になります。
ApplicationControllerにbefore_filterを用意します。内容は以下ものを書き込んで下さい。
before_filter :set_locale private: def set_locale I18n.locale = params[:locale] end
こうしておくことでURLの最後にパラメータで
?locale=ja
を加えると、ロケールを日本語にするなど簡単に切り替えられます。
これの発展系として、paramsロケールを取らないでsessionから設定するなどの手も考えられます。
上記の方法や別の方法は、オフィシャルのドキュメントに紹介されています。
Rails3の国際化に関する公式ドキュメント
「2 Setup the Rails Application for Internationalization」を読んでみて下さい。
オフィシャルのロケールファイルの取得・配置をしよう
rails-i18nのリポジトリでは、各国語のデフォルトで使える翻訳ファイルが提供されています。が、ダウンロードして必要なフォルダを作ってなど作業が手間です。
ちょっと探してみたところ、便利なプラグインを見つけました。
これ使うと、rails-i18nのオフィシャルにて公開されている、各言語用のファイルをダウンロードし適切な位置への保存を自動で行ってくれます。その上、ActiveRecordのモデルについても翻訳ファイル作成をしてくれそうです。
プラグインと書いてますが、普通にGemとしてインストールすることもできます。こういう何パターンかで使えますよっていう作り・・・素晴らしい!!カッコいいです。*1
私はプラグインとしてインストールしました。
こうしておく事で、明確にプロジェクトへこれを使っているという痕跡を残せるためです。
rails plugin install git://github.com/amatsuda/i18n_generators.git
導入後には、以下のコマンドで
- 言語ファイルの取得
- ActiveRecordを使っている場合は、同時にモデルの翻訳ファイルを生成
を行いました。
rails g i18n ja
実は、よっしゃー!と思っていたのですが、ちょっと残念な事態に。
現在私はMongodidを使っているため、モデル用の翻訳ファイルが生成されませんでした。これは残念。というか、MongoidがARの仕組みを使っていない方が問題なのかも。MongoMapperなら翻訳ファイルできるんですかね?ちょっと今回はこの部分の調査は割愛。気になるので、いずれ時間をとって実験してみよう。
ということで、松田さんに深く感謝しつつ、Mongoidのためのプラグインを次回探します。今回の内容で普通の国際化対応については準備が出来ていると思います。
あとはViewで翻訳を適応するための書き方なども次回ということで。