fix(common): make sure the plural category exists (#13169)
fixes #12379
This commit is contained in:

committed by
Alex Rickabaugh

parent
12959f444c
commit
82c81cd0d2
@ -23,9 +23,23 @@ export abstract class NgLocalization { abstract getPluralCategory(value: any): s
|
|||||||
*/
|
*/
|
||||||
export function getPluralCategory(
|
export function getPluralCategory(
|
||||||
value: number, cases: string[], ngLocalization: NgLocalization): string {
|
value: number, cases: string[], ngLocalization: NgLocalization): string {
|
||||||
const nbCase = `=${value}`;
|
let key = `=${value}`;
|
||||||
|
|
||||||
return cases.indexOf(nbCase) > -1 ? nbCase : ngLocalization.getPluralCategory(value);
|
if (cases.indexOf(key) > -1) {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
key = ngLocalization.getPluralCategory(value);
|
||||||
|
|
||||||
|
if (cases.indexOf(key) > -1) {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cases.indexOf('other') > -1) {
|
||||||
|
return 'other';
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new Error(`No plural message found for value "${value}"`);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -7,13 +7,10 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {LOCALE_ID} from '@angular/core';
|
import {LOCALE_ID} from '@angular/core';
|
||||||
import {TestBed} from '@angular/core/testing';
|
import {TestBed, inject} from '@angular/core/testing';
|
||||||
import {beforeEach, describe, inject, it} from '@angular/core/testing/testing_internal';
|
|
||||||
import {expect} from '@angular/platform-browser/testing/matchers';
|
|
||||||
|
|
||||||
import {NgLocaleLocalization, NgLocalization, getPluralCategory} from '../src/localization';
|
import {NgLocaleLocalization, NgLocalization, getPluralCategory} from '../src/localization';
|
||||||
|
|
||||||
|
|
||||||
export function main() {
|
export function main() {
|
||||||
describe('l10n', () => {
|
describe('l10n', () => {
|
||||||
|
|
||||||
@ -141,6 +138,23 @@ export function main() {
|
|||||||
expect(getPluralCategory(5, ['one', 'other', '=5'], l10n)).toEqual('=5');
|
expect(getPluralCategory(5, ['one', 'other', '=5'], l10n)).toEqual('=5');
|
||||||
expect(getPluralCategory(6, ['one', 'other', '=5'], l10n)).toEqual('other');
|
expect(getPluralCategory(6, ['one', 'other', '=5'], l10n)).toEqual('other');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should fallback to other when the case is not present', () => {
|
||||||
|
const l10n = new NgLocaleLocalization('ro');
|
||||||
|
expect(getPluralCategory(1, ['one', 'other'], l10n)).toEqual('one');
|
||||||
|
// 2 -> 'few'
|
||||||
|
expect(getPluralCategory(2, ['one', 'other'], l10n)).toEqual('other');
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('errors', () => {
|
||||||
|
it('should report an error when the "other" category is not present', () => {
|
||||||
|
expect(() => {
|
||||||
|
const l10n = new NgLocaleLocalization('ro');
|
||||||
|
// 2 -> 'few'
|
||||||
|
getPluralCategory(2, ['one'], l10n);
|
||||||
|
}).toThrowError('No plural message found for value "2"');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
Reference in New Issue
Block a user