国際化(i18n)の第一歩

2008/12/26

前回までで、asagao のすべてのテストが通りました。

今回からは、いよいよ Rails 2.x の新しい特徴を活用して、asagao を書き換えていきます。

まずは、Rails 2.2 の目玉である、国際化(i18n)から手を付けましょう。

Rails 2.1 までは、Rails 自体が国際化の標準的なやり方を示していませんでしたので、GlobalizeRuby-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 ファイルの中身は、階層構造のデータです。最も上の階層が言語の区別を表しています。言語は、enja のようなアルファベット 2 文字で表現します。

下の階層では具体的にキーワードと翻訳を指定するのですが、キーワードを分類するための階層を用意することもできます。

今回の例では、title という分類の下に news というキーワードを配置しています。

この news に対応する翻訳を取得するには t('title.news') と記述します。

本日はここまで。