以下のコードは、Rails アプリケーションの coffeescript ファイルの 1 つにあるものです。「Select Account First」や「Select One」などの文字列値の i18n サポートを追加するのに苦労しています。通常の JavaScript ファイルでは、I18n.t("shared.select_account_first") のようなものを使用して、i18n-js gem を使用して文字列の国際化された値を取得しています。
jQuery ->
networks = $('#account_offering_network_id').html()
select_network_options = new Option("Select Account First", "", true, false)
filter_networks_by_account = (account) ->
if account is 'Select One'
$('#account_offering_network_id').html(select_network_options)
else
escaped_account = account.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g, '\\$1')
options = $(networks).filter("optgroup[label='#{escaped_account}']")
$('#account_offering_network_id').html(options.html())
# Show proper network dropdown first time
filter_networks_by_account($('#account_offering_account_id :selected').text())
# Show proper network dropdown on account change
$('#account_offering_account_id').change -> filter_networks_by_account($('#account_offering_account_id :selected').text())
このすべての目的は、選択したアカウントに基づいてネットワーク ドロップダウンをフィルタリングすることです。アカウントが選択されていない場合 (アカウント ドロップダウンの値に [1 つ選択] または対応する i18n 値が表示される)、選択したロケールでネットワーク ドロップダウンに [最初にアカウントを選択] と表示されます。
i18s-js gem(https://github.com/fnando/i18n-js) を使用して、javascript での翻訳を有効にしています。以下は、gem をサポートするためにアプリケーションに加えなければならなかった変更です。
application.js で:
//= require i18n
//= require i18n/translations
production.rb と development.rb に追加されたプロパティ:
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
config.i18n.fallbacks = true
config.i18n.available_locales = [:en, :ru]
application.html.erb で:
<%# For localization/i18n in javascript %>
<script type="text/javascript">
I18n.defaultLocale = "<%= I18n.default_locale %>";
I18n.locale = "<%= I18n.locale %>";
I18n.fallbacks = true;
</script>
最後に、「rake i18n:js:export」を実行すると、名前と値のペアが読み込まれた翻訳ファイル (app/javascripts/i18n/translations.js) が作成されます。これで、任意の JavaScript から I18n.t(name) を使用して翻訳にアクセスできます。