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']})