fallback properly with pluralized strings (#7495)

Signed-off-by: Kerry Archibald <kerrya@element.io>
This commit is contained in:
Kerry 2022-01-10 14:54:57 +01:00 committed by GitHub
parent 368085982f
commit 5cfb046816
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 26 deletions

View file

@ -118,7 +118,7 @@ describe('languageHandler', function() {
});
});
describe('when a translation string does not exist in active language', () => {
describe('for a non-en language', () => {
beforeEach(async () => {
stubClient();
await setLanguage('lv');
@ -130,33 +130,75 @@ describe('languageHandler', function() {
setMissingEntryGenerator(counterpartDefaultMissingEntryGen);
});
// mocked lv has only `"Uploading %(filename)s and %(count)s others|one"`
const lvExistingPlural = 'Uploading %(filename)s and %(count)s others';
const lvNonExistingPlural = '%(spaceName)s and %(count)s others';
// lv does not have a pluralizer function
const noPluralizerCase = [
'handles plural strings when no pluralizer exists for language',
lvExistingPlural,
{ count: 1, filename: 'test.txt' },
undefined,
'Uploading test.txt and 1 other',
] as TestCase;
describe('pluralization', () => {
const pluralCases = [
[
'falls back when plural string exists but not for for count',
lvExistingPlural,
{ count: 2, filename: 'test.txt' },
undefined,
'Uploading test.txt and 2 others',
],
[
'falls back when plural string does not exists at all',
lvNonExistingPlural,
{ count: 2, spaceName: 'test' },
undefined,
'test and 2 others',
],
] as TestCase[];
describe('_t', () => {
it.each([...testCasesEn, noPluralizerCase])(
"%s and translates with fallback locale",
async (_d, translationString, variables, tags, result) => {
expect(_t(translationString, variables, tags)).toEqual(result);
},
);
describe('_t', () => {
it('translated correctly when plural string exists for count', () => {
expect(_t(
lvExistingPlural,
{ count: 1, filename: 'test.txt' }, undefined)).toEqual('Качване на test.txt и 1 друг');
});
it.each(pluralCases)(
"%s",
async (_d, translationString, variables, tags, result) => {
expect(_t(translationString, variables, tags)).toEqual(result);
},
);
});
describe('_tDom()', () => {
it('translated correctly when plural string exists for count', () => {
expect(_tDom(
lvExistingPlural,
{ count: 1, filename: 'test.txt' }, undefined)).toEqual('Качване на test.txt и 1 друг');
});
it.each(pluralCases)(
"%s and translates with fallback locale, attributes fallback locale",
async (_d, translationString, variables, tags, result) => {
expect(_tDom(translationString, variables, tags)).toEqual(<span lang="en">{ result }</span>);
},
);
});
});
describe('_tDom()', () => {
it.each([...testCasesEn, noPluralizerCase])(
"%s and translates with fallback locale, attributes fallback locale",
async (_d, translationString, variables, tags, result) => {
expect(_tDom(translationString, variables, tags)).toEqual(<span lang="en">{ result }</span>);
},
);
describe('when a translation string does not exist in active language', () => {
describe('_t', () => {
it.each(testCasesEn)(
"%s and translates with fallback locale",
async (_d, translationString, variables, tags, result) => {
expect(_t(translationString, variables, tags)).toEqual(result);
},
);
});
describe('_tDom()', () => {
it.each(testCasesEn)(
"%s and translates with fallback locale, attributes fallback locale",
async (_d, translationString, variables, tags, result) => {
expect(_tDom(translationString, variables, tags)).toEqual(<span lang="en">{ result }</span>);
},
);
});
});
});
});