diff --git a/lib/i18n/backend/fallback_locale_list.rb b/lib/i18n/backend/fallback_locale_list.rb
index e1b3d25ebbb..f1b5acaea6e 100644
--- a/lib/i18n/backend/fallback_locale_list.rb
+++ b/lib/i18n/backend/fallback_locale_list.rb
@@ -6,19 +6,15 @@ module I18n
class FallbackLocaleList < Hash
def [](locale)
locale = locale.to_sym
- return [locale] if locale == :en
+ locale_list = [locale]
+ return locale_list if locale == :en
- fallback_locale = LocaleSiteSetting.fallback_locale(locale)
- site_locale = SiteSetting.default_locale.to_sym
-
- locale_list =
- if locale == site_locale || site_locale == :en || fallback_locale == :en
- [locale, fallback_locale, :en]
- else
- site_fallback_locale = LocaleSiteSetting.fallback_locale(site_locale)
- [locale, fallback_locale, site_locale, site_fallback_locale, :en]
- end
+ while (fallback_locale = LocaleSiteSetting.fallback_locale(locale))
+ locale_list << fallback_locale
+ locale = fallback_locale
+ end
+ locale_list << :en
locale_list.uniq.compact
end
end
diff --git a/spec/components/js_locale_helper_spec.rb b/spec/components/js_locale_helper_spec.rb
index c1b9933f080..e1c9cb40bba 100644
--- a/spec/components/js_locale_helper_spec.rb
+++ b/spec/components/js_locale_helper_spec.rb
@@ -130,7 +130,7 @@ 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
JsLocaleHelper.set_translations('en', "en" => {
"js" => {
"only_english" => "1-en",
@@ -161,12 +161,12 @@ describe JsLocaleHelper do
expected = {
"none" => "[uk.js.none]",
"only_english" => "1-en",
- "only_site" => "2-ru",
- "english_and_site" => "3-ru",
+ "only_site" => "[uk.js.only_site]",
+ "english_and_site" => "3-en",
"only_user" => "4-uk",
"english_and_user" => "5-uk",
"site_and_user" => "6-uk",
- "all_three" => "7-uk",
+ "all_three" => "7-uk"
}
SiteSetting.default_locale = 'ru'
@@ -178,9 +178,9 @@ describe JsLocaleHelper do
ctx.eval(JsLocaleHelper.output_locale(I18n.locale))
ctx.eval('I18n.defaultLocale = "ru";')
- expect(ctx.eval('I18n.translations.en.js').keys).to contain_exactly("only_english")
- expect(ctx.eval('I18n.translations.ru.js').keys).to contain_exactly("only_site", "english_and_site")
+ expect(ctx.eval('I18n.translations').keys).to contain_exactly("uk", "en")
expect(ctx.eval('I18n.translations.uk.js').keys).to contain_exactly("all_three", "english_and_user", "only_user", "site_and_user")
+ expect(ctx.eval('I18n.translations.en.js').keys).to contain_exactly("only_english", "english_and_site")
expected.each do |key, expect|
expect(ctx.eval("I18n.t(#{"js.#{key}".inspect})")).to eq(expect)
diff --git a/spec/lib/i18n/discourse_i18n_spec.rb b/spec/lib/i18n/discourse_i18n_spec.rb
index 0215dc33fee..39c0691d363 100644
--- a/spec/lib/i18n/discourse_i18n_spec.rb
+++ b/spec/lib/i18n/discourse_i18n_spec.rb
@@ -13,7 +13,6 @@ describe I18n::Backend::DiscourseI18n do
backend.store_translations(:en, foo: 'Foo in :en', bar: 'Bar in :en', wat: 'Hello %{count}')
backend.store_translations(:en, items: { one: 'one item', other: '%{count} items' })
backend.store_translations(:de, bar: 'Bar in :de')
- backend.store_translations(:ru, baz: 'Baz in :ru')
backend.store_translations(:en, link: '[text](url)')
end
@@ -54,13 +53,6 @@ describe I18n::Backend::DiscourseI18n do
expect(backend.translate(:de, 'bar')).to eq('Bar in :de')
expect(backend.translate(:de, 'foo')).to eq('Foo in :en')
end
-
- it 'uses default_locale as fallback when key exists' do
- SiteSetting.default_locale = 'ru'
- expect(backend.translate(:de, 'bar')).to eq('Bar in :de')
- expect(backend.translate(:de, 'baz')).to eq('Baz in :ru')
- expect(backend.translate(:de, 'foo')).to eq('Foo in :en')
- end
end
describe '#exists?' do
@@ -75,7 +67,6 @@ describe I18n::Backend::DiscourseI18n do
it 'returns true when an existing key and an existing locale is given' do
expect(backend.exists?(:en, :foo)).to eq(true)
expect(backend.exists?(:de, :bar)).to eq(true)
- expect(backend.exists?(:ru, :baz)).to eq(true)
end
it 'returns false when a non-existing key and an existing locale is given' do
diff --git a/spec/lib/i18n/fallback_locale_list_spec.rb b/spec/lib/i18n/fallback_locale_list_spec.rb
index 793ac8b2a0a..f84a4908aa7 100644
--- a/spec/lib/i18n/fallback_locale_list_spec.rb
+++ b/spec/lib/i18n/fallback_locale_list_spec.rb
@@ -16,7 +16,7 @@ describe I18n::Backend::FallbackLocaleList do
it "works when default_locale is English (United States)" do
SiteSetting.default_locale = :en_US
- expect(list[:ru]).to eq([:ru, :en_US, :en])
+ expect(list[:ru]).to eq([:ru, :en])
expect(list[:en_US]).to eq([:en_US, :en])
expect(list[:en]).to eq([:en])
end
@@ -24,7 +24,7 @@ describe I18n::Backend::FallbackLocaleList do
it "works when default_locale is not English" do
SiteSetting.default_locale = :de
- expect(list[:ru]).to eq([:ru, :de, :en])
+ expect(list[:ru]).to eq([:ru, :en])
expect(list[:de]).to eq([:de, :en])
expect(list[:en]).to eq([:en])
expect(list[:en_US]).to eq([:en_US, :en])
@@ -34,6 +34,7 @@ describe I18n::Backend::FallbackLocaleList do
before do
DiscoursePluginRegistry.register_locale("es_MX", fallbackLocale: "es")
DiscoursePluginRegistry.register_locale("de_AT", fallbackLocale: "de")
+ DiscoursePluginRegistry.register_locale("de_AT-formal", fallbackLocale: "de_AT")
end
after do
@@ -44,15 +45,27 @@ describe I18n::Backend::FallbackLocaleList do
SiteSetting.default_locale = :en
expect(list[:de_AT]).to eq([:de_AT, :de, :en])
+ expect(list[:"de_AT-formal"]).to eq([:"de_AT-formal", :de_AT, :de, :en])
expect(list[:de]).to eq([:de, :en])
expect(list[:en]).to eq([:en])
end
+ it "works when default_locale is English (United States)" do
+ SiteSetting.default_locale = :en_US
+
+ expect(list[:de_AT]).to eq([:de_AT, :de, :en])
+ expect(list[:"de_AT-formal"]).to eq([:"de_AT-formal", :de_AT, :de, :en])
+ expect(list[:de]).to eq([:de, :en])
+ expect(list[:en]).to eq([:en])
+ expect(list[:en_US]).to eq([:en_US, :en])
+ end
+
it "works when default_locale is not English" do
SiteSetting.default_locale = :de
- expect(list[:es_MX]).to eq([:es_MX, :es, :de, :en])
- expect(list[:es]).to eq([:es, :de, :en])
+ expect(list[:es_MX]).to eq([:es_MX, :es, :en])
+ expect(list[:"de_AT-formal"]).to eq([:"de_AT-formal", :de_AT, :de, :en])
+ expect(list[:es]).to eq([:es, :en])
expect(list[:en]).to eq([:en])
end
end
diff --git a/spec/models/theme_field_spec.rb b/spec/models/theme_field_spec.rb
index 570a861d7a9..fcc91536f4b 100644
--- a/spec/models/theme_field_spec.rb
+++ b/spec/models/theme_field_spec.rb
@@ -8,6 +8,10 @@ describe ThemeField do
ThemeField.destroy_all
end
+ before do
+ I18n.locale = :en
+ end
+
describe "scope: find_by_theme_ids" do
it "returns result in the specified order" do
theme = Fabricate(:theme)
@@ -60,22 +64,22 @@ describe ThemeField do
it 'only extracts inline javascript to an external file' do
html = <<~HTML
-
-
-
-
-
-
+
+
+
+
+
+
HTML
theme_field = ThemeField.create!(theme_id: 1, target_id: 0, name: "header", value: html)
@@ -91,13 +95,13 @@ describe ThemeField do
it 'adds newlines between the extracted javascripts' do
html = <<~HTML
-
-
+
+
HTML
extracted = <<~JavaScript
- var a = 10
- var b = 10
+ var a = 10
+ var b = 10
JavaScript
theme_field = ThemeField.create!(theme_id: 1, target_id: 0, name: "header", value: html)
@@ -301,8 +305,8 @@ HTML
let!(:theme3) { Fabricate(:theme) }
let!(:en1) {
- ThemeField.create!(theme: theme, target_id: Theme.targets[:translations], name: "en_US",
- value: { en_US: { somestring1: "helloworld", group: { key1: "enval1" } } }
+ ThemeField.create!(theme: theme, target_id: Theme.targets[:translations], name: "en",
+ value: { en: { somestring1: "helloworld", group: { key1: "enval1" } } }
.deep_stringify_keys.to_yaml
)
}
@@ -313,21 +317,21 @@ HTML
)
}
let!(:fr2) { ThemeField.create!(theme: theme2, target_id: Theme.targets[:translations], name: "fr", value: "") }
- let!(:en2) { ThemeField.create!(theme: theme2, target_id: Theme.targets[:translations], name: "en_US", value: "") }
+ let!(:en2) { ThemeField.create!(theme: theme2, target_id: Theme.targets[:translations], name: "en", value: "") }
let!(:ca3) { ThemeField.create!(theme: theme3, target_id: Theme.targets[:translations], name: "ca", value: "") }
- let!(:en3) { ThemeField.create!(theme: theme3, target_id: Theme.targets[:translations], name: "en_US", value: "") }
+ let!(:en3) { ThemeField.create!(theme: theme3, target_id: Theme.targets[:translations], name: "en", value: "") }
describe "scopes" do
it "filter_locale_fields returns results in the correct order" do
expect(ThemeField.find_by_theme_ids([theme3.id, theme.id, theme2.id])
.filter_locale_fields(
- ["en_US", "fr"]
+ ["en", "fr"]
)).to eq([en3, en1, fr1, en2, fr2])
end
it "find_first_locale_fields returns only the first locale for each theme" do
expect(ThemeField.find_first_locale_fields(
- [theme3.id, theme.id, theme2.id], ["ca", "en_US", "fr"]
+ [theme3.id, theme.id, theme2.id], ["ca", "en", "fr"]
)).to eq([ca3, en1, en2])
end
end
@@ -358,7 +362,7 @@ HTML
it "loads correctly" do
expect(fr1.translation_data).to eq(
fr: { somestring1: "bonjourworld", group: { key2: "frval2" } },
- en_US: { somestring1: "helloworld", group: { key1: "enval1" } }
+ en: { somestring1: "helloworld", group: { key1: "enval1" } }
)
end
@@ -380,7 +384,7 @@ HTML
theme.reload
expect(fr1.translation_data).to eq(
fr: { somestring1: "bonjourworld", group: { key2: "frval2" } },
- en_US: { somestring1: "helloworld", group: { key1: "overriddentest1" } }
+ en: { somestring1: "helloworld", group: { key1: "overriddentest1" } }
)
end
end
@@ -398,9 +402,9 @@ HTML
describe "prefix injection" do
it "injects into JS" do
html = <<~HTML
-
+
HTML
theme_field = ThemeField.create!(theme_id: theme.id, target_id: 0, name: "head_tag", value: html)
diff --git a/spec/models/theme_spec.rb b/spec/models/theme_spec.rb
index ae162773e37..04b452ccfc6 100644
--- a/spec/models/theme_spec.rb
+++ b/spec/models/theme_spec.rb
@@ -7,6 +7,10 @@ describe Theme do
Theme.clear_cache!
end
+ before do
+ I18n.locale = :en
+ end
+
fab! :user do
Fabricate(:user)
end
@@ -657,8 +661,8 @@ HTML
end
it "can create a hash of overridden values" do
- en_translation = ThemeField.create!(theme_id: theme.id, name: "en_US", type_id: ThemeField.types[:yaml], target_id: Theme.targets[:translations], value: <<~YAML)
- en_US:
+ en_translation = ThemeField.create!(theme_id: theme.id, name: "en", type_id: ThemeField.types[:yaml], target_id: Theme.targets[:translations], value: <<~YAML)
+ en:
group_of_translations:
translation1: en test1
YAML
@@ -668,7 +672,7 @@ HTML
theme.update_translation("group_of_translations.translation1", "overriddentest2")
theme.reload
expect(theme.translation_override_hash).to eq(
- "en_US" => {
+ "en" => {
"group_of_translations" => {
"translation1" => "overriddentest1"
}