Rails: интернационализация строк Javascript?



Итак, у нас есть существующее приложение Rails 2.3.5, которое вообще не поддерживает интернационализацию. Теперь, я хорошо знаком с Rails i18n вещи, но у нас есть много выходных строк внутри /javascripts/. Я не большой поклонник такого подхода, но, к сожалению, это слишком поздно, чтобы исправить это сейчас.



Как мы можем интернационализировать строки, хранящиеся в JS-файлах в приложении Rails? Rails даже не обслуживает файлы JS...



Я думаю, что я всегда мог бы иметь приложение Rails обслуживать JS файлы, но это кажется довольно грубой. Есть ли плагины для этого?

598   10  

10 ответов:

почему не что-то простое, как:

<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

тогда мой звонок в моем приложении.формат html.erb выглядит так:

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

это позволяет избежать необходимости знать текущую локаль в JavaScript.

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

или

I18n.alpha.bravo;

Балибу заброшен. Используйте i18n-js:https://github.com/fnando/i18n-js

решение Райана выше идеально, за исключением того, что бэкэнд должен быть инициализирован, если он еще не был.

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

для приложений rails 3 Вы можете сделать это:

создать i18n.js.erb-файл и добавьте его в свое приложение.js. И добавьте этот кусок кода в файл.

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

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

Я также масштабирую свои переводы, чтобы не иметь огромного файла javascript. Моя область применения: javascript.

надеюсь, что это поможет кому-то!

почему бы просто не сделать это в вашем Javascript файле:

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

для этого, чтобы работать, вы должны добавить .erb к расширению вашего файла Javascript.

вам также может потребоваться добавить следующую строку в верхней части файла Javascript, если вы не используете ruby >= 2.0.

<%# encoding: utf-8 %>

смотрите последний комментарий принятого ответа в этой теме для получения дополнительной информации:проблемы кодирования в файлах javascript с использованием Rails asset pipeline

Babilu это Rails плагин, который делает это для вас.

еще один вариант, который может быть полезен:

предположим, что у вас есть язык модели (slug), который содержит все доступные языки. Он обрабатывает случаи, когда отсутствует перевод (он заменен версией локали по умолчанию)

assets/javascript/i18n.js.Эрб

<%
@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;
};

вид/макет/приложения.формат html.Эрб

...
<%= 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

надеюсь, что это помогает!

Райан решение является brillant. Но чтобы не включать весь файл, вы должны использовать: @translations[I18n.locale].with_indifferent_access["alpha"] вместо I18n.backend.send(:translations)["alpha"]

I18n-js отлично работает для меня, и я бы рекомендовал его. Если вы используете его филиала переписать затем плагин будет включать в себя /assets/i18n/filtered.js файл, который выводит именно то, что @ryan-montgomery ответил, не делая ничего самостоятельно вручную.

таким образом, вы можете использовать тот же перевод на backend с рельсами помощники t(:key) и с помощью I18n.t('key') в Javascript на интерфейсе.

для приложений, подобных тому, который вы описали "который вообще не поддерживает интернационализацию" и "слишком поздно, чтобы исправить это сейчас" я написал очень быстрый подход: плагин jQuery Quick-i18n:https://github.com/katio/Quick-i18n демо (и как его использовать):http://johannpaul.net/Quick-i18n/

Comments

    Ничего не найдено.