Add JsLocaleHelper tests for i18n fallback

This commit is contained in:
Kane York 2015-07-15 14:23:41 -07:00
parent ff219bc65c
commit cb395662d0
2 changed files with 104 additions and 25 deletions

View File

@ -1,7 +1,7 @@
module JsLocaleHelper module JsLocaleHelper
def self.load_translations(locale) def self.load_translations(locale)
@loaded_translations ||= {} @loaded_translations ||= HashWithIndifferentAccess.new
@loaded_translations[locale] ||= begin @loaded_translations[locale] ||= begin
locale_str = locale.to_s locale_str = locale.to_s
@ -69,19 +69,21 @@ module JsLocaleHelper
end end
end end
def self.output_locale(locale, request=nil) def self.output_locale(locale)
current_locale = I18n.locale locale_sym = locale.to_sym
I18n.locale = locale.to_sym
locale_str = locale.to_s locale_str = locale.to_s
current_locale = I18n.locale
I18n.locale = locale_sym
site_locale = SiteSetting.default_locale.to_sym site_locale = SiteSetting.default_locale.to_sym
if locale == :en if locale_sym == :en
translations = load_translations(locale) translations = load_translations(locale_sym)
elsif locale == site_locale || site_locale == :en elsif locale_sym == site_locale || site_locale == :en
translations = load_translations_merged(locale, :en) translations = load_translations_merged(locale_sym, :en)
else else
translations = load_translations_merged(locale, site_locale, :en) translations = load_translations_merged(locale_sym, site_locale, :en)
end end
message_formats = strip_out_message_formats!(translations[locale_str]['js']) message_formats = strip_out_message_formats!(translations[locale_str]['js'])

View File

@ -2,6 +2,24 @@ require 'spec_helper'
require_dependency 'js_locale_helper' require_dependency 'js_locale_helper'
describe JsLocaleHelper do describe JsLocaleHelper do
module StubLoadTranslations
def set_translations(locale, translations)
@loaded_translations ||= HashWithIndifferentAccess.new
@loaded_translations[locale] = translations
end
def clear_cache!
@loaded_translations = nil
@loaded_merges = nil
end
end
JsLocaleHelper.extend StubLoadTranslations
after do
JsLocaleHelper.clear_cache!
end
it 'should be able to generate translations' do it 'should be able to generate translations' do
expect(JsLocaleHelper.output_locale('en').length).to be > 0 expect(JsLocaleHelper.output_locale('en').length).to be > 0
end end
@ -57,21 +75,23 @@ describe JsLocaleHelper do
it 'handles message format special keys' do it 'handles message format special keys' do
ctx = V8::Context.new ctx = V8::Context.new
ctx.eval("I18n = {};") ctx.eval("I18n = {};")
ctx.eval(JsLocaleHelper.output_locale('en',
{
"en" =>
{
"js" => {
"hello" => "world",
"test_MF" => "{HELLO} {COUNT, plural, one {1 duck} other {# ducks}}",
"error_MF" => "{{BLA}",
"simple_MF" => "{COUNT, plural, one {1} other {#}}"
}
}
}))
expect(ctx.eval('I18n.translations')["en"]["js"]["hello"]).to eq("world") JsLocaleHelper.set_translations 'en', {
expect(ctx.eval('I18n.translations')["en"]["js"]["test_MF"]).to eq(nil) "en" =>
{
"js" => {
"hello" => "world",
"test_MF" => "{HELLO} {COUNT, plural, one {1 duck} other {# ducks}}",
"error_MF" => "{{BLA}",
"simple_MF" => "{COUNT, plural, one {1} other {#}}"
}
}
}
ctx.eval(JsLocaleHelper.output_locale('en'))
expect(ctx.eval('I18n.translations["en"]["js"]["hello"]')).to eq("world")
expect(ctx.eval('I18n.translations["en"]["js"]["test_MF"]')).to eq(nil)
expect(ctx.eval('I18n.messageFormat("test_MF", { HELLO: "hi", COUNT: 3 })')).to eq("hi 3 ducks") expect(ctx.eval('I18n.messageFormat("test_MF", { HELLO: "hi", COUNT: 3 })')).to eq("hi 3 ducks")
expect(ctx.eval('I18n.messageFormat("error_MF", { HELLO: "hi", COUNT: 3 })')).to match(/Invalid Format/) expect(ctx.eval('I18n.messageFormat("error_MF", { HELLO: "hi", COUNT: 3 })')).to match(/Invalid Format/)
@ -85,7 +105,64 @@ describe JsLocaleHelper do
end end
it 'performs fallbacks to english if a translation is not available' do it 'performs fallbacks to english if a translation is not available' do
skip('todo: write test') JsLocaleHelper.set_translations 'en', {
"en" => {
"js" => {
"only_english" => "1-en",
"english_and_site" => "3-en",
"english_and_user" => "5-en",
"all_three" => "7-en",
}
}
}
JsLocaleHelper.set_translations 'ru', {
"ru" => {
"js" => {
"only_site" => "2-ru",
"english_and_site" => "3-ru",
"site_and_user" => "6-ru",
"all_three" => "7-ru",
}
}
}
JsLocaleHelper.set_translations 'uk', {
"uk" => {
"js" => {
"only_user" => "4-uk",
"english_and_user" => "5-uk",
"site_and_user" => "6-uk",
"all_three" => "7-uk",
}
}
}
expected = {
"none" => "[uk.js.none]",
"only_english" => "1-en",
"only_site" => "2-ru",
"english_and_site" => "3-ru",
"only_user" => "4-uk",
"english_and_user" => "5-uk",
"site_and_user" => "6-uk",
"all_three" => "7-uk",
}
SiteSetting.default_locale = 'ru'
I18n.locale = :uk
ctx = V8::Context.new
ctx.eval('var window = this;')
ctx.load(Rails.root + 'app/assets/javascripts/locales/i18n.js')
ctx.eval(JsLocaleHelper.output_locale(I18n.locale))
ctx.eval('I18n.defaultLocale = "ru";')
# Test - unneeded translations are not emitted
expect(ctx.eval('I18n.translations.en.js').keys).to eq(["only_english"])
expect(ctx.eval('I18n.translations.ru.js').keys).to eq(["only_site", "english_and_site"])
expected.each do |key, expect|
expect(ctx.eval("I18n.t(#{"js.#{key}".inspect})")).to eq(expect)
end
end end
LocaleSiteSetting.values.each do |locale| LocaleSiteSetting.values.each do |locale|