「国際化対応」の編集履歴(バックアップ)一覧はこちら
「国際化対応」(2012/03/22 (木) 07:34:24) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
-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にアクセスすれば、日本語/英語が切り替わるんだねー
---日本語:http://localhost:3000/hello/i18n?locale=ja
---英語:http://localhost:3000/hello/i18n?locale=en
--へー。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にアクセスすれば、日本語/英語が切り替わるんだねー
---日本語:http://localhost:3000/ja/hello/i18n
---英語:http://localhost:3000/en/hello/i18n
*辞書の配置とか
辞書は、結構いろいろと書けるみたい!こういうの、好き
-まずは、テンプレート単位での記載は、こう
--日本語辞書(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から取ってきて、使ってみた
---https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale
--あー、エラー系はもちろん、曜日とか単位とかも結構書いてあるんだね。すげー
*ビューヘルパー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件
----
#counter
-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にアクセスすれば、日本語/英語が切り替わるんだねー
---日本語:http://localhost:3000/hello/i18n?locale=ja
---英語:http://localhost:3000/hello/i18n?locale=en
--へー。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にアクセスすれば、日本語/英語が切り替わるんだねー
---日本語:http://localhost:3000/ja/hello/i18n
---英語:http://localhost:3000/en/hello/i18n
*辞書の配置とか
辞書は、結構いろいろと書けるみたい!こういうの、好き
-まずは、テンプレート単位での記載は、こう
--日本語辞書(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から取ってきて、使ってみた
---https://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale
--あー、エラー系はもちろん、曜日とか単位とかも結構書いてあるんだね。すげー
*ビューヘルパー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件
----
#counter