Rails: интернационализация строк Javascript?
Итак, у нас есть существующее приложение Rails 2.3.5, которое вообще не поддерживает интернационализацию. Теперь, я хорошо знаком с Rails i18n вещи, но у нас есть много выходных строк внутри /javascripts/. Я не большой поклонник такого подхода, но, к сожалению, это слишком поздно, чтобы исправить это сейчас.
Как мы можем интернационализировать строки, хранящиеся в JS-файлах в приложении Rails? Rails даже не обслуживает файлы JS...
Я думаю, что я всегда мог бы иметь приложение Rails обслуживать JS файлы, но это кажется довольно грубой. Есть ли плагины для этого?
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