国際化対応

「国際化対応」の編集履歴(バックアップ)一覧はこちら

国際化対応」(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

表示オプション

横に並べて表示:
変化行の前後のみ表示: