Jarek Radosz 9da9b2e1cc
DEV: Add i18n fallback specs ()
Those fail on the buggy i18n release (1.8.6) and pass on 1.8.5, 1.8.7 (the revert release), and with the second stab at thread safety on the current master (63a79cb929)
2021-01-08 17:47:28 +01:00

143 lines
3.6 KiB
Ruby

# frozen_string_literal: true
require "rails_helper"
require "i18n/duplicate_key_finder"
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
describe "i18n integrity checks" do
it 'has an i18n key for each Trust Levels' do
TrustLevel.all.each do |ts|
expect(ts.name).not_to match(/translation missing/)
end
end
it "has an i18n key for each Site Setting" do
SiteSetting.all_settings.each do |s|
next if s[:setting][/^test_/]
expect(s[:description]).not_to match(/translation missing/)
end
end
it "has an i18n key for each Badge description" do
Badge.where(system: true).each do |b|
expect(b.long_description).to be_present
expect(b.description).to be_present
end
end
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
Dir["#{Rails.root}/config/locales/client.*.yml"].each do |path|
it "has valid client YAML for '#{path}'" do
yaml = YAML.load_file(path)
locale = extract_locale(path)
expect(yaml.keys).to eq([locale])
expect(yaml[locale]["js"]).to be
if !LocaleSiteSetting.fallback_locale(locale)
expect(yaml[locale]["admin_js"]).to be
expect(yaml[locale]["wizard_js"]).to be
end
end
end
Dir["#{Rails.root}/**/locale*/*.en.yml"].each do |english_path|
english_yaml = YAML.load_file(english_path)["en"]
context(english_path) do
it "has no duplicate keys" do
english_duplicates = DuplicateKeyFinder.new.find_duplicates(english_path)
expect(english_duplicates).to be_empty
end
end
Dir[english_path.sub(".en.yml", ".*.yml")].each do |path|
next if path[".en.yml"]
context(path) do
locale = extract_locale(path)
yaml = YAML.load_file(path)
it "has no duplicate keys" do
duplicates = DuplicateKeyFinder.new.find_duplicates(path)
expect(duplicates).to be_empty
end
it "does not overwrite another locale" do
expect(yaml.keys).to eq([locale])
end
unless path["transliterate"]
it "is compatible with english" do
expect(is_yaml_compatible?(english_yaml, yaml)).to eq(true)
end
end
end
end
end
end
describe "fallbacks" do
before do
I18n.backend = I18n::Backend::DiscourseI18n.new
I18n.fallbacks = I18n::Backend::FallbackLocaleList.new
I18n.reload!
I18n.init_accelerator!
end
it "finds the fallback translation" do
I18n.backend.store_translations(:en, test: "en test")
I18n.with_locale("pl_PL") do
expect(I18n.t("test")).to eq("en test")
end
end
context "in a multi-threaded environment" do
it "finds the fallback translation" do
I18n.backend.store_translations(:en, test: "en test")
thread = Thread.new do
I18n.with_locale("pl_PL") do
expect(I18n.t("test")).to eq("en test")
end
end
begin
thread.join
ensure
thread.exit
end
end
end
end