diff --git a/src/utils.ts b/src/utils.ts index 3089faf..87b6fcb 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -30,6 +30,8 @@ export const sanitizeLocales = (...locales: any[]): string[] | [] => { let current = `${locale}`.toLowerCase(); try { [current] = Intl.Collator.supportedLocalesOf(locale); + + if (!current) throw new Error(`[i18n]: '${locale}' is non-standard.`); } catch (error) { console.warn(`[i18n]: Non-standard locale provided: '${locale}'. Check your 'translations' and 'loaders' in i18n config...`); } diff --git a/tests/data/index.ts b/tests/data/index.ts index d628b92..5652765 100644 --- a/tests/data/index.ts +++ b/tests/data/index.ts @@ -26,8 +26,8 @@ export const CONFIG: Config.T = { }, { key: 'common', - locale: 'cs', - loader: async () => (import('../data/translations/cs/common.json')), + locale: 'zh-Hans', + loader: async () => (import('../data/translations/zh-Hans/common.json')), }, ], }; \ No newline at end of file diff --git a/tests/data/translations/index.ts b/tests/data/translations/index.ts index 1684b65..b812014 100644 --- a/tests/data/translations/index.ts +++ b/tests/data/translations/index.ts @@ -3,7 +3,8 @@ import type { Translations } from '../../../src/types'; import * as common from './en/common.json'; import * as route from './en/route.json'; -import * as common_cs from './cs/common.json'; +import * as common_ku from './ku/common.json'; +import * as common_zhHans from './zh-Hans/common.json'; export default ({ en: toDotNotation({ @@ -11,7 +12,10 @@ export default ({ route1: route, route2: route, }), - cs: toDotNotation({ - common: common_cs, + 'zh-Hans': toDotNotation({ + common: common_zhHans, + }), + ku: toDotNotation({ + common: common_ku, }), }) as Translations.T; \ No newline at end of file diff --git a/tests/data/translations/cs/common.json b/tests/data/translations/ku/common.json similarity index 100% rename from tests/data/translations/cs/common.json rename to tests/data/translations/ku/common.json diff --git a/tests/data/translations/zh-Hans/common.json b/tests/data/translations/zh-Hans/common.json new file mode 100644 index 0000000..3cf6df0 --- /dev/null +++ b/tests/data/translations/zh-Hans/common.json @@ -0,0 +1,9 @@ +{ + "no_placeholder": "NO_PLACEHOLDER", + "placeholder": "VALUES: {{value}}, {{value;}}, {{ value }}, {{ value; }}", + "modifier_test": "VALUES: {{value; option1:VALUE1; option2:VALUE2; default:DEFAULT VALUE;}}, {{ value ; option1 : VALUE1 ; option2 : VALUE2 ; default : DEFAULT VALUE ;}}", + "custom_modifier": "{{date:date;}}", + "modifier_number": "{{value:number;}}", + "modifier_date": "{{value:date;}}", + "modifier_ago": "{{value:ago;}}" +} \ No newline at end of file diff --git a/tests/specs/index.spec.ts b/tests/specs/index.spec.ts index ae42b9f..1bc4ea0 100644 --- a/tests/specs/index.spec.ts +++ b/tests/specs/index.spec.ts @@ -117,6 +117,31 @@ describe('i18n instance', () => { const $locale = locale.get(); expect($locale).toBe(initLocale.toLocaleLowerCase()); }); + it('`locale` can be non-standard', async () => { + const nonStandardLocale = 'ku'; + const { loading, locale, locales, setRoute, initialized, translations } = new i18n({ loaders: [{ key: 'common', locale: `${nonStandardLocale}`.toUpperCase(), loader: () => import(`../data/translations/${nonStandardLocale}/common.json`) }], parser }); + await setRoute(''); + locale.set(nonStandardLocale); + + const $loading = loading.get(); + expect($loading).toBe(true); + + await loading.toPromise(); + + const $initialized = get(initialized); + expect($initialized).toBe(true); + + const $locale = locale.get(); + expect($locale).toBe(nonStandardLocale); + + const $locales = locales.get(); + expect($locales).toContainEqual(nonStandardLocale); + + const $translations = translations.get(); + expect($translations[nonStandardLocale]).toEqual( + expect.objectContaining(filterTranslationKeys(TRANSLATIONS[nonStandardLocale], ['common'])), + ); + }); it('`getTranslationProps` method works', async () => { const { initialized, getTranslationProps } = new i18n({ loaders, parser });