diff --git a/src/v3/src/util/locUtil.test.ts b/src/v3/src/util/locUtil.test.ts
index 6e6abc625d..7de4a3bc67 100644
--- a/src/v3/src/util/locUtil.test.ts
+++ b/src/v3/src/util/locUtil.test.ts
@@ -10,8 +10,8 @@
* See the License for the specific language governing permissions and limitations under the License.
*/
-import type { loc as origLoc } from './locUtil';
import * as OrigLanguageUtils from './languageUtils';
+import type { loc as origLoc } from './locUtil';
jest.unmock('./locUtil');
@@ -86,30 +86,30 @@ describe('locUtil Tests', () => {
expect(localizedText).toBe('This is some test string with multiple tokens: here is a test string ');
});
});
-
+
// https://www.i18next.com/translation-function/plurals
describe('Pluralization', () => {
const MockedLogin: Record> = {
en: {
- 'item_one': 'one item',
- 'item_other': '{0} items',
- 'apple_one': 'one apple',
- 'apple_other': '{0} apples',
- 'pear_one': 'one pear',
- 'pear_other': '{0} pears',
+ item_one: 'one item',
+ item_other: '{0} items',
+ apple_one: 'one apple',
+ apple_other: '{0} apples',
+ pear_one: 'one pear',
+ pear_other: '{0} pears',
},
ro: {
- 'item_one': 'un articol',
- 'item_few': '{0} articole',
- 'item_other': '{0} de articole',
+ item_one: 'un articol',
+ item_few: '{0} articole',
+ item_other: '{0} de articole',
// 'apple_one': 'un măr', // missing translation
- 'apple_few': '{0} mere',
- 'apple_other': '{0} de mere',
- 'apple': '{0} de mere', // will be used as fallback
- 'pear_few': '{0} pere', // no fallback
+ apple_few: '{0} mere',
+ apple_other: '{0} de mere',
+ apple: '{0} de mere', // will be used as fallback
+ pear_few: '{0} pere', // no fallback
},
};
-
+
beforeEach(() => {
jest.resetModules();
jest.unmock('./i18next');
@@ -124,10 +124,7 @@ describe('locUtil Tests', () => {
login: MockedLogin.en,
country: {},
loadLanguage: jest.fn().mockImplementation(
- // eslint-disable-next-line no-unused-vars
- async (language: string, overrides: any, assets: Record,
- supportedLanguages: string[], omitDefaultKeys?: (key: string) => boolean
- ) => {
+ async (language: string) => {
Bundles.currentLanguage = language;
Bundles.login = MockedLogin[language] ?? {};
Bundles.country = {};
@@ -144,44 +141,56 @@ describe('locUtil Tests', () => {
it('can localize singular/plural in English', () => {
languageUtils.initDefaultLanguage();
const localizedTextOne = loc('item', 'login', [1]);
- expect(localizedTextOne).toBe('one item');
+ expect(localizedTextOne).toBe('one item'); // item_one
const localizedTextTwo = loc('item', 'login', [2]);
- expect(localizedTextTwo).toBe('2 items');
+ expect(localizedTextTwo).toBe('2 items'); // item_other
});
it('can localize multiple plurals in other languages', async () => {
languageUtils.initDefaultLanguage();
await languageUtils.loadLanguage({ language: 'ro' });
const localizedText1 = loc('item', 'login', [1]);
- expect(localizedText1).toBe('un articol');
+ expect(localizedText1).toBe('un articol'); // item_one
const localizedText2 = loc('item', 'login', [2]);
- expect(localizedText2).toBe('2 articole');
+ expect(localizedText2).toBe('2 articole'); // item_few
const localizedText20 = loc('item', 'login', [20]);
- expect(localizedText20).toBe('20 de articole');
+ expect(localizedText20).toBe('20 de articole'); // item_other
});
it('can fallback to default form if some plural form translation is missing', async () => {
languageUtils.initDefaultLanguage();
await languageUtils.loadLanguage({ language: 'ro' });
const localizedText2 = loc('apple', 'login', [2]);
- expect(localizedText2).toBe('2 mere');
- // fallback
+ expect(localizedText2).toBe('2 mere'); // apple_few
+ // no 'apple_one' => fallback to 'apple'
const localizedText1 = loc('apple', 'login', [1]);
- expect(localizedText1).toBe('1 de mere');
+ expect(localizedText1).toBe('1 de mere'); // apple
});
it('will fallback to English if some plural form translation is missing and there is no fallback', async () => {
languageUtils.initDefaultLanguage();
await languageUtils.loadLanguage({ language: 'ro' });
const localizedText2 = loc('pear', 'login', [2]);
- expect(localizedText2).toBe('2 pere');
- // fallback to English
+ expect(localizedText2).toBe('2 pere'); // pear_few
+ // no 'pear_one', no fallback to 'pear' => fallback to English 'pear_one'
const localizedText1 = loc('pear', 'login', [1]);
expect(localizedText1).toBe('one pear');
});
- // todo: unload lang
-
- // todo: L10N_ERROR
+ it('emits error event if requested key is missing in bundle', () => {
+ // spy on emitting of CustomEvent with type 'okta-i18n-error' in `loc()` util
+ const dispatchEventSpy = jest.spyOn(document, 'dispatchEvent');
+ languageUtils.initDefaultLanguage();
+ const localizedText2 = loc('missing_key', 'login');
+ expect(localizedText2).toBe('L10N_ERROR[missing_key]');
+ expect(dispatchEventSpy).toHaveBeenCalledWith(new CustomEvent('okta-i18n-error', {
+ detail: {
+ type: 'l10n-error',
+ key: 'missing_key',
+ bundleName: 'login',
+ reason: 'key',
+ },
+ }));
+ });
});
});