Files
nairobi/spec/i18n_spec.rb
voodoorai2000 be80973e44 Avoid InvalidPluralizationData exception when missing translations
We work with many languages using Crowdin[1]

Sometimes translators forget to fill in all the necessary plural forms of a translation (zero, one, other) and in those cases we were seing the exception InvalidPluralizationData being raised

There are a number of approches to fix this... from being more strict when approving translations, to automatically extrapolating what those plural forms should be

For now, we've gone for a simple approach to display the actual count(0,1,2,3,4, etc) instead of the whole translation

So, if the plural form of "1 comment" is missing, just a "1" will be displayed and no exceptions raised

Note: The first two specs, test what is really Rails' functionalities. However as we are monkey patching the pluralize method, I thought it was appropriate to doble check it

[1]https://crowdin.com/project/consul
2018-10-05 12:26:07 +02:00

64 lines
2.0 KiB
Ruby

require 'rails_helper'
require 'i18n/tasks'
describe 'I18n' do
let(:i18n) { I18n::Tasks::BaseTask.new }
let(:missing_keys) { i18n.missing_keys }
let(:unused_keys) { i18n.unused_keys }
it 'does not have missing keys' do
expect(missing_keys).to be_empty,
"Missing #{missing_keys.leaves.count} i18n keys, run `i18n-tasks missing' to show them"
end
it 'does not have unused keys' do
expect(unused_keys).to be_empty,
"#{unused_keys.leaves.count} unused i18n keys, run `i18n-tasks unused' to show them"
end
context "Plurals" do
after do
I18n.backend.reload!
end
it "returns plural rule if translation present" do
keys = { zero: "No comments",
one: "1 comment",
other: "%{count} comments" }
I18n.backend.store_translations(:en, { test_plural: keys })
expect(I18n.t("test_plural", count: 0)).to eq("No comments")
expect(I18n.t("test_plural", count: 1)).to eq("1 comment")
expect(I18n.t("test_plural", count: 2)).to eq("2 comments")
end
it "returns default locale's plural rule if whole translation not present" do
keys = { zero: "No comments",
one: "1 comment",
other: "%{count} comments" }
I18n.backend.store_translations(I18n.default_locale, { test_plural: keys })
I18n.backend.store_translations(:zz, {} )
I18n.enforce_available_locales = false
I18n.locale = :zz
expect(I18n.t("test_plural", count: 0)).to eq("No comments")
expect(I18n.t("test_plural", count: 1)).to eq("1 comment")
expect(I18n.t("test_plural", count: 2)).to eq("2 comments")
end
it "returns count if specific plural rule not present" do
keys = { zero: "No comments" }
I18n.backend.store_translations(:en, { test_plural: keys })
expect(I18n.t("test_plural", count: 0)).to eq("No comments")
expect(I18n.t("test_plural", count: 1)).to eq(1)
expect(I18n.t("test_plural", count: 2)).to eq(2)
end
end
end