Skip to content

Commit 4d99f8f

Browse files
committed
feat: add initI18n to use selected language with fallback
1 parent b9d9924 commit 4d99f8f

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

packages/translation/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
export * from './types';
22
export * from './lib/i18n';
33
export { default as i18n } from './lib/i18n';
4+
export { initI18n } from './lib/i18n';

packages/translation/src/lib/i18n.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,49 @@ for (const lang of Object.values(Language)) {
2525
});
2626
}
2727

28+
const normalizeNavigatorLanguage = (input: Language | string): Language => {
29+
const code = String(input).toLowerCase();
30+
const base = code.split(/[_-]/)[0]; // "en-GB" -> "en", "ja-JP" -> "ja"
31+
switch (base) {
32+
case 'en': {
33+
return Language.en;
34+
}
35+
case 'ja': {
36+
return Language.ja;
37+
}
38+
default: {
39+
return DEFAULT_LANG;
40+
}
41+
}
42+
};
43+
44+
export const initI18n = async (
45+
lang?: Language | string,
46+
): Promise<typeof i18n> => {
47+
const resolved = normalizeNavigatorLanguage(lang ?? DEFAULT_LANG);
48+
49+
if (i18n.isInitialized) {
50+
return i18n.changeLanguage(resolved).then(() => i18n);
51+
}
52+
53+
return i18n
54+
.use(initReactI18next)
55+
.init({
56+
lng: resolved,
57+
fallbackLng: DEFAULT_LANG,
58+
resources,
59+
supportedLngs: Object.values(Language) as string[],
60+
nonExplicitSupportedLngs: true,
61+
lowerCaseLng: true,
62+
interpolation: { escapeValue: false },
63+
react: {
64+
useSuspense: false,
65+
transSupportBasicHtmlNodes: true,
66+
},
67+
})
68+
.then(() => i18n);
69+
};
70+
2871
i18n.use(initReactI18next).init({
2972
fallbackLng: DEFAULT_LANG,
3073
interpolation: {

packages/translation/src/types/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type {
66

77
export enum Language {
88
en = 'en',
9+
ja = 'ja',
910
}
1011

1112
export type TranslationKey = keyof (typeof allTranslations)[Language.en];

0 commit comments

Comments
 (0)