2019-04-29 20:27:42 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
def extract_locale(path)
|
|
|
|
path[/\.([^.]{2,})\.yml$/, 1]
|
|
|
|
end
|
|
|
|
|
|
|
|
def is_yaml_compatible?(english, translated)
|
|
|
|
english.each do |k, v|
|
|
|
|
if translated.has_key?(k)
|
|
|
|
if Hash === v
|
|
|
|
if Hash === translated[k]
|
|
|
|
return false unless is_yaml_compatible?(v, translated[k])
|
|
|
|
end
|
|
|
|
else
|
|
|
|
return false unless v.class == translated[k].class
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
2022-12-13 14:03:53 -05:00
|
|
|
def load_yaml(path)
|
|
|
|
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("3.1.0")
|
|
|
|
YAML.load_file(path, aliases: true)
|
|
|
|
else
|
|
|
|
YAML.load_file(path)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-07-27 22:27:38 -04:00
|
|
|
RSpec.describe "i18n integrity checks" do
|
2017-02-24 05:35:33 -05:00
|
|
|
it "has an i18n key for each Site Setting" do
|
2013-02-05 14:16:51 -05:00
|
|
|
SiteSetting.all_settings.each do |s|
|
2023-05-24 19:53:57 -04:00
|
|
|
next if s[:plugin] == SiteSetting::SAMPLE_TEST_PLUGIN.name
|
2024-07-10 04:48:56 -04:00
|
|
|
expect(s[:description]).not_to be_blank
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
it "has an i18n key for each Badge description" do
|
2016-04-12 12:55:49 -04:00
|
|
|
Badge
|
|
|
|
.where(system: true)
|
|
|
|
.each do |b|
|
|
|
|
expect(b.long_description).to be_present
|
|
|
|
expect(b.description).to be_present
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-06-18 22:13:23 -04:00
|
|
|
Dir["#{Rails.root}/config/locales/{client,server}.*.yml"].each do |path|
|
|
|
|
it "does not contain invalid interpolation keys for '#{path}'" do
|
|
|
|
matches = File.read(path).scan(/%\{([^a-zA-Z\s]+)\}|\{\{([^a-zA-Z\s]+)\}\}/)
|
|
|
|
matches.flatten!
|
|
|
|
matches.compact!
|
|
|
|
matches.uniq!
|
|
|
|
expect(matches).to eq([])
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
Dir["#{Rails.root}/config/locales/client.*.yml"].each do |path|
|
|
|
|
it "has valid client YAML for '#{path}'" do
|
2022-12-13 14:03:53 -05:00
|
|
|
yaml = load_yaml(path)
|
2017-02-24 05:35:33 -05:00
|
|
|
locale = extract_locale(path)
|
2013-03-23 03:57:31 -04:00
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
expect(yaml.keys).to eq([locale])
|
2013-03-23 03:57:31 -04:00
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
expect(yaml[locale]["js"]).to be
|
2019-05-15 17:43:00 -04:00
|
|
|
|
|
|
|
if !LocaleSiteSetting.fallback_locale(locale)
|
|
|
|
expect(yaml[locale]["admin_js"]).to be
|
|
|
|
expect(yaml[locale]["wizard_js"]).to be
|
|
|
|
end
|
2013-03-20 05:51:28 -04:00
|
|
|
end
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
Dir["#{Rails.root}/**/locale*/*.en.yml"].each do |english_path|
|
2022-12-13 14:03:53 -05:00
|
|
|
english_yaml = load_yaml(english_path)["en"]
|
2015-09-18 15:12:37 -04:00
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
context(english_path) do
|
|
|
|
it "has no duplicate keys" do
|
|
|
|
english_duplicates = DuplicateKeyFinder.new.find_duplicates(english_path)
|
|
|
|
expect(english_duplicates).to be_empty
|
2015-09-18 15:12:37 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
Dir[english_path.sub(".en.yml", ".*.yml")].each do |path|
|
|
|
|
next if path[".en.yml"]
|
2015-09-24 18:43:23 -04:00
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
context(path) do
|
|
|
|
locale = extract_locale(path)
|
2022-12-13 14:03:53 -05:00
|
|
|
yaml = load_yaml(path)
|
2015-09-24 18:43:23 -04:00
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
it "has no duplicate keys" do
|
|
|
|
duplicates = DuplicateKeyFinder.new.find_duplicates(path)
|
|
|
|
expect(duplicates).to be_empty
|
2015-09-24 18:43:23 -04:00
|
|
|
end
|
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
it "does not overwrite another locale" do
|
|
|
|
expect(yaml.keys).to eq([locale])
|
2015-09-18 15:12:37 -04:00
|
|
|
end
|
2015-09-24 18:43:23 -04:00
|
|
|
|
2017-02-24 05:35:33 -05:00
|
|
|
unless path["transliterate"]
|
|
|
|
it "is compatible with english" do
|
|
|
|
expect(is_yaml_compatible?(english_yaml, yaml)).to eq(true)
|
2015-09-24 18:43:23 -04:00
|
|
|
end
|
|
|
|
end
|
2015-09-18 15:12:37 -04:00
|
|
|
end
|
2021-01-08 11:47:28 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2022-07-27 22:27:38 -04:00
|
|
|
RSpec.describe "fallbacks" do
|
2021-01-08 11:47:28 -05:00
|
|
|
before do
|
|
|
|
I18n.backend = I18n::Backend::DiscourseI18n.new
|
|
|
|
I18n.fallbacks = I18n::Backend::FallbackLocaleList.new
|
|
|
|
I18n.reload!
|
|
|
|
I18n.init_accelerator!
|
|
|
|
end
|
2017-02-24 05:35:33 -05:00
|
|
|
|
2021-01-08 11:47:28 -05:00
|
|
|
it "finds the fallback translation" do
|
|
|
|
I18n.backend.store_translations(:en, test: "en test")
|
|
|
|
|
|
|
|
I18n.with_locale("pl_PL") { expect(I18n.t("test")).to eq("en test") }
|
2015-09-18 15:12:37 -04:00
|
|
|
end
|
2017-02-24 05:35:33 -05:00
|
|
|
|
2022-07-27 12:14:14 -04:00
|
|
|
context "when in a multi-threaded environment" do
|
2021-01-08 11:47:28 -05:00
|
|
|
it "finds the fallback translation" do
|
|
|
|
I18n.backend.store_translations(:en, test: "en test")
|
|
|
|
|
|
|
|
thread = Thread.new { I18n.with_locale("pl_PL") { expect(I18n.t("test")).to eq("en test") } }
|
|
|
|
|
|
|
|
begin
|
|
|
|
thread.join
|
|
|
|
ensure
|
|
|
|
thread.exit
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
end
|