mirror of
https://github.com/discourse/discourse.git
synced 2024-11-30 23:23:58 +08:00
140 lines
5.2 KiB
Ruby
140 lines
5.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "i18n/backend/discourse_i18n"
|
|
require "translation_override"
|
|
|
|
RSpec.describe I18n::Backend::DiscourseI18n do
|
|
let(:backend) { I18n::Backend::DiscourseI18n.new }
|
|
|
|
before do
|
|
backend.reload!
|
|
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(:en, link: "[text](url)")
|
|
end
|
|
|
|
after { backend.reload! }
|
|
|
|
it "translates the basics as expected" do
|
|
expect(backend.translate(:en, "foo")).to eq("Foo in :en")
|
|
expect(backend.translate(:en, "items", count: 1)).to eq("one item")
|
|
expect(backend.translate(:en, "items", count: 3)).to eq("3 items")
|
|
expect(backend.translate(:en, "wat", count: 3)).to eq("Hello 3")
|
|
end
|
|
|
|
it "can be searched by key or value" do
|
|
expect(backend.search(:en, "fo")).to eq("foo" => "Foo in :en")
|
|
expect(backend.search(:en, "foo")).to eq("foo" => "Foo in :en")
|
|
expect(backend.search(:en, "Foo")).to eq("foo" => "Foo in :en")
|
|
expect(backend.search(:en, "hello")).to eq("wat" => "Hello %{count}")
|
|
expect(backend.search(:en, "items.one")).to eq("items.one" => "one item")
|
|
expect(backend.search(:en, "](")).to eq("link" => "[text](url)")
|
|
end
|
|
|
|
it "can return multiple results" do
|
|
results = backend.search(:en, "item")
|
|
|
|
expect(results["items.one"]).to eq("one item")
|
|
expect(results["items.other"]).to eq("%{count} items")
|
|
end
|
|
|
|
describe "fallbacks" do
|
|
it "uses fallback locales for translating" do
|
|
expect(backend.translate(:de, "bar")).to eq("Bar in :de")
|
|
expect(backend.translate(:de, "foo")).to eq("Foo in :en")
|
|
end
|
|
end
|
|
|
|
describe "#exists?" do
|
|
it "returns true when a key is given that exists" do
|
|
expect(backend.exists?(:de, :bar)).to eq(true)
|
|
end
|
|
|
|
it "returns true when a key is given that exists in a fallback locale of the locale" do
|
|
expect(backend.exists?(:de, :foo)).to eq(true)
|
|
end
|
|
|
|
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)
|
|
end
|
|
|
|
it "returns false when a non-existing key and an existing locale is given" do
|
|
expect(backend.exists?(:en, :bogus)).to eq(false)
|
|
expect(backend.exists?(:de, :bogus)).to eq(false)
|
|
expect(backend.exists?(:ru, :bogus)).to eq(false)
|
|
end
|
|
|
|
it "returns true when a key is given which is missing from the given locale and exists in a fallback locale" do
|
|
expect(backend.exists?(:de, :foo)).to eq(true)
|
|
expect(backend.exists?(:ru, :foo)).to eq(true)
|
|
end
|
|
|
|
it "returns true when a key is given which is missing from the given locale and all its fallback locales" do
|
|
expect(backend.exists?(:de, :baz)).to eq(false)
|
|
expect(backend.exists?(:ru, :bogus)).to eq(false)
|
|
end
|
|
end
|
|
|
|
describe "#pluralize" do
|
|
it "uses fallback locales when a pluralization key is missing" do
|
|
SiteSetting.default_locale = "ru"
|
|
|
|
backend.store_translations(
|
|
:ru,
|
|
items: {
|
|
one: "%{count} Russian item",
|
|
many: "%{count} Russian items are many",
|
|
},
|
|
)
|
|
|
|
expect(backend.translate(:ru, :items, count: 1)).to eq("1 Russian item")
|
|
expect(backend.translate(:ru, :items, count: 2)).to eq("2 items")
|
|
expect(backend.translate(:ru, :items, count: 5)).to eq("5 Russian items are many")
|
|
expect(backend.translate(:ru, :items, count: 10.2)).to eq("10.2 items")
|
|
|
|
backend.store_translations(
|
|
:ru,
|
|
items: {
|
|
one: "%{count} Russian item",
|
|
few: "%{count} Russian items are a few",
|
|
many: "%{count} Russian items are many",
|
|
other: "%{count} Russian items",
|
|
},
|
|
)
|
|
|
|
expect(backend.translate(:ru, :items, count: 2)).to eq("2 Russian items are a few")
|
|
expect(backend.translate(:ru, :items, count: 10.2)).to eq("10.2 Russian items")
|
|
|
|
backend.store_translations(:en, airplanes: { one: "%{count} airplane" })
|
|
expect(backend.translate(:ru, :airplanes, count: 1)).to eq("1 airplane")
|
|
expect { backend.translate(:ru, :airplanes, count: 2) }.to raise_error(
|
|
I18n::InvalidPluralizationData,
|
|
)
|
|
end
|
|
end
|
|
|
|
describe ".sort_local_files" do
|
|
it "sorts an array of client ymls with '-(highest-number)' being last" do
|
|
expect(
|
|
I18n::Backend::DiscourseI18n.sort_locale_files(
|
|
%w[
|
|
discourse/plugins/discourse-second/config/locales/client-99.es.yml
|
|
discourse/plugins/discourse-first/config/locales/client.es.yml
|
|
discourse/plugins/discourse-third/config/locales/client-2.es.yml
|
|
discourse/plugins/discourse-third/config/locales/client-3.bs_BA.yml
|
|
],
|
|
),
|
|
).to eq(
|
|
%w[
|
|
discourse/plugins/discourse-first/config/locales/client.es.yml
|
|
discourse/plugins/discourse-third/config/locales/client-2.es.yml
|
|
discourse/plugins/discourse-third/config/locales/client-3.bs_BA.yml
|
|
discourse/plugins/discourse-second/config/locales/client-99.es.yml
|
|
],
|
|
)
|
|
end
|
|
end
|
|
end
|