国際化対応

  • Railsの国際化対応は、「I18n(Internationalization) API」を使うんだねー
    • このI18nって、「Internationalizationの、Iとnの間に18文字あるからそう呼ばれてる」って、シャレか?

I18nの基本的な流れ

I18nを使う基本的な流れは、こんな感じだね!

  • 言語毎の辞書ファイルを作る
  • アクションやコントローラで、言語を判定するように変更(ja固定でもOK)
  • テンプレートなどの文言を、辞書を呼びだすように修正
    • 場合によっては、テンプレート自体を言語化する事も可能

日本語化してみよう!

こんな感じで、日本語できるんだねー

  • まずは、辞書ファイルを作成
    • 基本は、config/locales 以下に「言語名.yml」ファイルを作るんだね!
      • YAML形式でも、Ruby形式でもOK!
    • 今回は以下の2つを作る感じだね。
      • まずは、英語用の[config/locales/en.yml]を、以下のように修正
        en:
          general:
            greeting:
              morning: 'Good Morning.'
              hello: 'Hello, %{name}!'
        
      • 日本語は、[config/locales/ja.yml]をこんな感じで作成
        ja:
          general:
            greeting:
              morning: 'おはようっす!'
              hello: 'こんにちは、%{name}さん!'
        
  • 次に、アプリ設定(config/application.rb)を日本語に変更
       # config.i18n.default_locale = :de
       config.i18n.default_locale = :ja
    
  • 後は、辞書呼び出しのテンプレート作成ね。
    <%= t 'general.greeting.morning' %>
    <%= t 'general.greeting.hello', :name => 'アンタ' %>
    
  • で、Webサーバ再起動して、http://localhost:3000/hello/i18n にアクセスすれば、こんな感じで日本語で出る、と。
    おはようっす!
    こんにちは、アンタさん!
    
    • 当然、default_localeを[:en]にすれば、英語になるよー

ロケールの動的設定

上記の方法だと、サーバ単位で言語を設定されちゃうから、動的に変えたいよね!

  • で、まずはブラウザの言語設定を見るように変更するには、こんな感じ
    • 要するに、ApplicationControllerで判定して、設定するんだね
    • で、修正はこんな感じかな?
      class ApplicationController < ActionController::Base
       before_filter :detect_locale
       
       private
       def detect_locale
         I18n.locale = request.headers['Accept-Language'].scan(/^[a-z]{2}/).first
       end
      
      • この場合、リクエストに入ってるAccept-Languageヘッダの先頭の2文字を、そのまま設定って感じだね
      • Accept-Languageには、優先順に言語が入ってるハズだからこれで「そこそこ」動きそうだねー
  • 次は、クエリによって言語を切り替えるには、こんな感じ
    • まあ、上記の奴は所詮ブラウザの設定であって、「自分の言語は自分で決める!」って人用には他の方法が必要だからなー
    • やり方は、同じくApplicationControllerをこんな感じに修正かな?
       private
       def default_url_options(options = {})
         { :locale => I18n.locale }
       end
       def detect_locale
         I18n.locale = params[:locale]
       end
      
    • 後は、こんな感じにURLにアクセスすれば、日本語/英語が切り替わるんだねー
    • へー。default_url_optionsを使うことで、全ての<form>や<a>のリンクにlocaleが設定されるんだねー
  • ルートパラメータ経由なら、こう!
    • クエリだとキャッシュとかかなり微妙なんで、ルートパラメータで設定することもできる
      • 要するに、ルート設定で言語を認識しちゃうのねー
    • [config/routes.rb]をこんな感じに変えればいいのかな?
       scope "(:locale)", :locale => /ja|en/ do
         resources :books
         match ':controller(/:action(/:id(.:format)))'
       end
      
      • うーん、動かん…。→スペルミスだったか…。相変わらずださい。ちゃんと動きました…。
      • ただ、このままだとルートが動かないので、以下の設定も必要
         match '/:locale' => 'books#index'
         root :to => 'books#index'
        
    • 後は、こんな感じにURLにアクセスすれば、日本語/英語が切り替わるんだねー

辞書の配置とか

辞書は、結構いろいろと書けるみたい!こういうの、好き

  • まずは、テンプレート単位での記載は、こう
    • 日本語辞書(config/locales/ja.yml)にこんな感じで書いて、
      ja:
        hello:
          i18n:
            message: メッセージだい!?
      
    • こんな感じで、テンプレート(app/views/hello/i18n.html.erb)書けば、messageが表示される、と。
      <%= t '.message' %>
      
      • '.message'のドットが重要なのね!
    • なんだけど、なぜか英語の方だとちゃんと参照されないんだよな…。なんだろ?まあ、日本語は表示されるからいいか。
  • で、モデル属性も書けるんだね
    • 日本語辞書(config/locales/ja.yml)にこんな感じで書いて、
      ja:
        attributes:
          isbn: 'ISBNコード'
          title: '書名'
          price: '価格'
          publish: '出版社'
          published: '刊行日'
      
    • http://localhost:3000/ja/books/new にアクセスすれば、各項目が日本語化される、と。
      • これって、下みたいに既にlabelビューヘルパーを使って書いてあるから、翻訳結果が表示されるんだねー。
           <%= f.label :isbn %><br />
        
      • showやindexだとlabelを使わず、そのまま「Isbn:」とかって書いてあるから翻訳されなくて、焦ったw
  • 辞書ファイルを階層的に分割もできるよ
    • デフォルトでは[config/locales]直下のファイルしか読まない設定なんだね。
    • でも、config/application.rbの以下のトコのコメントを解除して好きに変更すれば、フォルダの下も読んでくれるみたいだねー
         # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
      
    • ただ、フォルダでファイル自体は階層化できても、中の記述そのものは変わらないから、かなーり微妙ー
  • 辞書じゃなくて、テンプレート自体も翻訳しちゃえるよ
    • 単にテンプレートのファイル名を下みたいに変えて、配置するだけ。下の例はbooks/indexの場合ね。
      元   index.html.erb
      日本語 index.ja.html.erb
      英語  index.en.html.erb
    • こういうの本当にいいな、と思うなー

Rails標準のメッセージの翻訳

  • へー、Rails自体の標準メッセージも簡単に翻訳できるんだねー
  • と言っても、基本はgithubとかで公開された翻訳ファイルを持って来て修正するのが吉だね。
    • この辺は、もともとある[config/locales/en.yml]とかにURLが書いてあるから、そこを見るのが良さそう
    • ちなみに、今回は以下のURLから取ってきて、使ってみた
    • あー、エラー系はもちろん、曜日とか単位とかも結構書いてあるんだね。すげー

ビューヘルパーtのオプション

辞書を使う時に「t」を使うんで、そのオプション詳細ね。

  • ネームスペースは、scopeで指定
    scopeオプション      :<%= t :morning, :scope => 'general.greeting' %><br />
    scopeオプションの配列:<%= t :morning, :scope => [:general,:greeting] %><br />
    変数に入れれば、きれいに書ける?:
    <% k = [:general,:greeting] %><br />
    <%= t :morning, :scope => k %><br />
    
  • デフォルト設定は、:default
    デフォルト設定  :<%= t 'general.greeting.hey', :default => 'へい!' %><br />
    デフォルトの配列:<%= t :hey, :default => [:default,'へーい!'] %><br />
    
    • デフォルトの配列は、何の意味があるのか、理解できない…。
  • ロケール設定は、:locale
    ロケールの直設定:<%= t 'general.greeting.morning', :locale => 'en' %><br />
    
  • 単数形/複数形の区別は、:countで!
    • まずは、辞書に以下の設定を追加して、
      ja:
        result:
          one: 'ひとつ'
          other: '%{count}件'
      
    • テンプレートでは、こんな感じで書けば、
      1個の場合:<%= t 'result', :count => 1 %><br />
      3個の場合:<%= t 'result', :count => 3 %><br />
      
    • こんな表示になるんだねー
      1個の場合:ひとつ
      3個の場合:3件
      

-
最終更新:2012年03月22日 07:34