国際化(i18n)の第一歩
2008/12/26
前回までで、asagao のすべてのテストが通りました。
今回からは、いよいよ Rails 2.x の新しい特徴を活用して、asagao を書き換えていきます。
まずは、Rails 2.2 の目玉である、国際化(i18n)から手を付けましょう。
Rails 2.1 までは、Rails 自体が国際化の標準的なやり方を示していませんでしたので、Globalize や Ruby-GetText-Package など様々な方法が提案されてきました。
i18n の基本はこうです。
config/locales
フォルダを作成し、その下にキーワードと翻訳を YAML 形式で格納する。- コントローラおよびビューの中では、
t
メソッドにキーワードを与えることで翻訳を取得する。
早速、やってみましょう。
app/views/main/news.rhtml
を開いてください。1 行目は次のようになっているでしょう。
<% @page_title = 'ニュース' -%>
これを、次のように修正します。
<% @page_title = t('title.news') -%>
ブラウザで /main/news
を開くと、次のような文字列がページのタイトルとして表示されます。
<span class="translation_missing">en, title, news</span>
これは、title という分類に属するキーワード news に対応する英語(en)用の翻訳が用意されていないことを意味します。
そこで、config/locales
フォルダに titles_en.yml
という空のファイルを作成し、次のように書き入れます。
en: title: news: News
サーバを再起動し、ブラウザでページを再読込すると、タイトルに「News」と表示されます。
続いて、config/locales
フォルダに titles_ja.yml
を作成し、次のように書き入れます。
ja: title: news: ニュース
さらに、config/environment.rb
を開いて、Rails::Initializer.run do |config|
と end
の間に、次の行を追加します。
config.i18n.default_locale = :ja
サーバを再起動し、ブラウザでページを再読込すると、タイトルに「ニュース」と表示されます。
どうですか。根本的な原理は説明していませんが、何となく使い方がわかってしまったのではないでしょうか。
翻訳を定義する YAML ファイルの中身は、階層構造のデータです。最も上の階層が言語の区別を表しています。言語は、en や ja のようなアルファベット 2 文字で表現します。
下の階層では具体的にキーワードと翻訳を指定するのですが、キーワードを分類するための階層を用意することもできます。
今回の例では、title という分類の下に news というキーワードを配置しています。
この news に対応する翻訳を取得するには t('title.news')
と記述します。
本日はここまで。