Fork me on GitHub

アプリケーションを国際化する方法 {#i18n}

i18nのGemは文字列のオブジェクトを国際化や、ロケールが 可能な代替の管理にも使うための機能を提供します。

require 'i18n'
require 'i18n/backend/fallbacks'

i18nには以下のような設定が必要です。

  • 他のロケールに対応させる設定(翻訳が追いついていない場合など)

  • すべての翻訳ファイルはYAML形式でlocaleディレクトリに保存

configure do
  I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks)
  I18n.load_path = Dir[File.join(settings.root, 'locales', '*.yml')]
  I18n.backend.load_translations
end

では早速ユーザーに対してロケールをどのように振り 当てる方法を決めましょう。ブラウザの言語設定、特定の URL、サブドメインからの判断、クッキーやセッションから 判別する方法があります(さらにそれらを組み合わせるなど )が、ありますが、そのうちの3つを紹介します。

ブラウザの設定より(rack-contribが必要です)

use Rack::Locale

特定のURLより

before '/:locale/*' do
  I18n.locale       =       params[:locale]
  request.path_info = '/' + params[:splat ][0]
end

サブドメインからの判別

before do
  if (locale = request.host.split('.')[0]) != 'www'
    I18n.locale = locale
  end
end

これでそれぞれのユーザーの母語への文章やページへ導く ためのすべて必要な情報が揃いました。それから改めて 文字列を選択したり、どのテンプレートを使うかを 決めます。

国際化された文字列やオブジェクトを参照するだけであれ ば、I18nの標準メソッドを使えば簡単に取り出せます。

I18n.t(:token)
I18n.l(Time.now)

それぞれのロケールに沿ったテンプレートを表示させる ために、ここではfind_templateメソッドを用意しました。 これは先にユーザーのロケールにマッチ(あるいは最低 ひとつ以上のロケールファイルから)選び出す必要が あります。この処理を簡略化させるには、それぞれのviews ディレクトリに対応するロケールの名前を用意します。

helpers do
  def find_template(views, name, engine, &block)
    I18n.fallbacks[I18n.locale].each { |locale|
      super(views, "#{name}.#{locale}", engine, &block) }
    super(views, name, engine, &block)
  end
end
Top