web-dev-qa-db-ja.com

Rails:JavaScript文字列の国際化?

つまり、国際化をまったくサポートしていない既存のRails 2.3.5アプリがあります。今、私はRails I18nのものに精通していますが、 /javascripts/の内部にはたくさんの出力文字列があります。私はこのアプローチの大ファンではありませんが、残念ながら今は修正できません。

Rails app?RailsはJSファイルを提供していません...

私は常にRailsアプリがJSファイルを提供するようにできると思いますが、それはかなり粗末なようです。これを行うプラグインはありますか?

54
Matt Rogish

なぜ次のような単純なものではないのですか?

<script type="text/javascript">
  window.I18n = <%= I18n.backend.send(:translations).to_json.html_safe %>
</script>

次に、JSでは次のようなことができます。

I18n["en-US"]["alpha"]["bravo"];

私はアプリケーションヘルパーに私の物を包みました。

def current_translations
  @translations ||= I18n.backend.send(:translations)
  @translations[I18n.locale].with_indifferent_access
end

次に、application.html.erbでの呼び出しは次のようになります。

<script type="text/javascript">
  window.I18n = <%= current_translations.to_json.html_safe %>
</script>

これにより、JavaScriptで現在のロケールを知る必要がなくなります。

I18n["alpha"]["bravo"];

または

I18n.alpha.bravo;
95
Ryan Montgomery

バリブは捨てられました。 i18n-jsを使用: https://github.com/fnando/i18n-js

18

上記のRyanのソリューションは完璧ですが、バックエンドがまだ初期化されていない場合は初期化する必要があります。

I18n.backend.send(:init_translations) unless I18n.backend.initialized?
# now you can safely dump the translations to json
9
life_like_weeds

Rails 3つのアプリケーションの場合、これを行うことができます:

I18n.js.erbファイルを作成し、application.jsに追加します。そして、このコードをファイルに追加します。

<%
@translator = I18n.backend
@translator.load_translations
@translations ||= @translator.send(:translations)[I18n.locale][:javascript]
%>

window.I18n = <%= @translations.to_json.html_safe %>

また、翻訳の範囲を、巨大なJavaScriptファイルにしないようにしました。私のスコープは:javascriptです。

それが誰かを助けることを願っています!

6
Vince V.

なぜこれをあなたのJavascriptファイルに入れないのですか?

var a_message = "<%= I18n.t 'my_key' %>"

これを機能させるには、JavaScriptファイルの拡張子に.erbを追加する必要があります。

Ruby> = 2.0を使用していない場合は、JavaScriptファイルの先頭に次の行を追加する必要がある場合もあります。

<%# encoding: utf-8 %>

詳細については、このスレッドで承認された回答の最後のコメントを参照してください: Railsアセットパイプラインを使用したJavaScriptファイルのエンコードの問題

5
Dany Marcoux

役立つかもしれない別のオプション:

利用可能なすべての言語を含むモデル言語(スラグ)があるとします。翻訳が欠落している場合に対応します(デフォルトのロケールバージョンに置き換えられます)。

assets/javascript/i18n.js.erb

<%
@translator = I18n.backend
@translator.load_translations

translations = {}
Language.all.each do |l|
    translations[l.slug] = @translator.send(:translations)[l.slug.to_sym]
end

@translations = translations

%>
window.I18n = <%= @translations.to_json.html_safe %>

window.I18n.t = function(key){
    if(window.I18n[current_locale]){
        el = eval("I18n['"+current_locale+"']." + key);
    }
    if(window.I18n[default_locale] && typeof(el) == 'undefined'){
        el = eval("I18n['"+default_locale+"']." + key);
    }
    if(typeof(el) == 'undefined'){
        el = key;
    }
    return el;
};

views/layout/application.html.erb

...
<%= javascript_tag "var current_locale = '#{I18n.locale.to_s}';" %>
<%= javascript_tag "var default_locale = '#{I18n.default_locale}';" %>
...

あなたのjavascriptコードでは、次のように翻訳できます:

// current_locale:fr , default_locale:en

// existing translation (in french) 
I18n.t('message.hello_world'); // => Bonjour le monde

// non-existing translation (in french) but existing in english 
I18n.t('message.hello_this_world'); // => Hello this world

// non-existing translation (french & english) 
I18n.t('message.hello_this_new_world'); // => message.hello_this_new_world

それが役に立てば幸い!

2
melalj

Babil はRailsこれを行うプラグインです。

2
sblom

ライアンのソリューションは素晴らしいです。ただし、ファイル全体を含めない場合は、I18n.backend.send(:translations)["alpha"]の代わりに@translations[I18n.locale].with_indifferent_access["alpha"]を使用する必要があります。

1
macler

I18n-js は私にとってはうまく機能しているので、お勧めします。彼の rewriteブランチ を使用する場合、プラグインには_/assets/i18n/filtered.js_ファイルが含まれます。このファイルは、@ ryan-montgomeryが答えたものを正確に出力します。手動で何もする必要はありません。

このように、Rails helpers t(:key))を使用してバックエンドで同じ翻訳を使用し、フロントエンドのJavascriptでI18n.t('key')を使用できます。

0
robbie613

「国際化をまったくサポートしていない」「今すぐ修正するには遅すぎる」などのアプリケーションの場合、jQueryプラグインのQuick-i18n: https:// github。 com/katio/Quick-i18n デモ(およびその使用方法): http://johannpaul.net/Quick-i18n/

0