Ruby on Railsアプリ内で使用するjavascriptでi18n APIを利用する
Ruby on Railsアプリを国際化する場合は、I18n APIを利用しますが、javascriptの中から国際化リソースを利用したい場合、Rails標準の仕組みでは機能が足りません。
もちろんスクリプトを全部インラインにすればviewの中でI18nを利用できますが、infoScoop Calendarのようにscriptの量が多くなるとやはり外部スクリプトにした方が管理もパフォーマンス的にも良いので、いいプラグインがないか探してみたところ、babiluというRailsプラグインをtoretoreさんという方が作っていたので、その使い方について説明します。
プラグインの追加は以下のサイトから、lucyという共通ライブラリもインストールする必要があるようです。
script/plugin install git://github.com/toretore/lucy.git script/plugin install git://github.com/toretore/babilu.git
例えば、以下のように「config/locales/ja.yml」に記述されています。
ja: hello: "こんにちは!"
babiluを利用するには、ビューのファイルにlocales.jsをインクルードします。
<%= javascript_include_tag("locales") %> <%= javascript_include_tag("hello") %>
ここでは、サンプルとしてhello.jsもインクルードしています。
public/javascript/hello.jsに以下のような記述があると、アラートには「こんにちは!」と表示されます。
alert( I18n.t('hello') );
その他の使い方も、Rubyのファイルと同様です。
デフォルト
上記の例で、各箇所でデフォルトの値を使用したい場合は、第二引数にdefaultValueを指定したjsonを渡します。
I18n.t('hello', {defaultValue : 'Hello!'});
スコープ
scopeはjsonに配列で指定ます。以下の場合、"activerecord.errors.messages.invalid"のリソースが使用されます。
I18n.t('messages.invalid', {scope:['activerecord', 'errors']})