|
| 1 | +// @ts-ignore |
| 2 | +import {messages as en} from "./locales/en.po"; |
| 3 | +// @ts-ignore |
| 4 | +import {messages as de} from "./locales/de.po"; |
| 5 | +// @ts-ignore |
| 6 | +import {messages as fr} from "./locales/fr.po"; |
| 7 | +// @ts-ignore |
| 8 | +import {messages as nl} from "./locales/nl.po"; |
| 9 | +// @ts-ignore |
| 10 | +import {messages as pt} from "./locales/pt.po"; |
| 11 | +// @ts-ignore |
| 12 | +import {messages as es} from "./locales/es.po"; |
| 13 | +// @ts-ignore |
| 14 | +import {messages as zhCn} from "./locales/zh-cn.po"; |
| 15 | +// @ts-ignore |
| 16 | +import {messages as zhHk} from "./locales/zh-hk.po"; |
| 17 | +// @ts-ignore |
| 18 | +import {messages as ptBr} from "./locales/pt-br.po"; |
| 19 | +// @ts-ignore |
| 20 | +import {messages as vi} from "./locales/vi.po"; |
1 | 21 | import {i18n} from "@lingui/core";
|
| 22 | +import {t} from "@lingui/macro"; |
2 | 23 |
|
3 |
| -export type SupportedLocales = |
4 |
| - | "en" | "de" | "fr" | "nl" | "pt" | "es" |
5 |
| - | "zh-cn" | "zh-hk" | "pt-br" | "vi"; |
| 24 | +export type SupportedLocales = "en" | "de" | "fr" | "nl" | "pt" | "es" | "zh-cn" | "pt-br" | "vi" |"zh-hk"; |
| 25 | + |
| 26 | +export const localeMessages: Record<string, any> = { |
| 27 | + en: en, |
| 28 | + de: de, |
| 29 | + fr: fr, |
| 30 | + nl: nl, |
| 31 | + pt: pt, |
| 32 | + es: es, |
| 33 | + "zh-cn": zhCn, |
| 34 | + "zh-hk": zhHk, |
| 35 | + "pt-br": ptBr, |
| 36 | + vi: vi, |
| 37 | +}; |
6 | 38 |
|
7 | 39 | export const localeToFlagEmojiMap: Record<SupportedLocales, string> = {
|
8 |
| - en: '🇬🇧', de: '🇩🇪', fr: '🇫🇷', nl: '🇳🇱', pt: '🇵🇹', |
9 |
| - es: '🇪🇸', "zh-cn": '🇨🇳', "zh-hk": '🇭🇰', |
10 |
| - "pt-br": '🇧🇷', vi: '🇻🇳', |
| 40 | + en: '🇬🇧', |
| 41 | + de: '🇩🇪', |
| 42 | + fr: '🇫🇷', |
| 43 | + nl: '🇳🇱', |
| 44 | + pt: '🇵🇹', |
| 45 | + es: '🇪🇸', |
| 46 | + "zh-cn": '🇨🇳', |
| 47 | + "zh-hk": '🇭🇰', |
| 48 | + "pt-br": '🇧🇷', |
| 49 | + vi: '🇻🇳', |
11 | 50 | };
|
12 | 51 |
|
13 | 52 | export const localeToNameMap: Record<SupportedLocales, string> = {
|
14 |
| - en: `English`, de: `German`, fr: `French`, nl: `Dutch`, |
15 |
| - pt: `Portuguese`, es: `Spanish`, "zh-cn": `Chinese`, |
16 |
| - "zh-hk": `Cantonese`, "pt-br": `Portuguese (Brazil)`, vi: `Vietnamese`, |
| 53 | + en: `English`, |
| 54 | + de: `German`, |
| 55 | + fr: `French`, |
| 56 | + nl: `Dutch`, |
| 57 | + pt: `Portuguese`, |
| 58 | + es: `Spanish`, |
| 59 | + "zh-cn": `Chinese`, |
| 60 | + "zh-hk": `Cantonese`, |
| 61 | + "pt-br": `Portuguese (Brazil)`, |
| 62 | + vi: `Vietnamese`, |
17 | 63 | };
|
18 | 64 |
|
19 |
| -export const getLocaleName = (locale: SupportedLocales) => localeToNameMap[locale]; |
| 65 | +export const getLocaleName = (locale: SupportedLocales) => { |
| 66 | + return t`${localeToNameMap[locale]}` |
| 67 | +} |
20 | 68 |
|
21 |
| -export const getClientLocale = (): SupportedLocales => { |
| 69 | +export const getClientLocale = () => { |
22 | 70 | if (typeof window !== "undefined") {
|
23 |
| - const storedLocale = document.cookie.split(";") |
24 |
| - .find((c) => c.includes("locale="))?.split("=")[1]; |
25 |
| - return getSupportedLocale(storedLocale || window.navigator.language); |
26 |
| - } |
27 |
| - return "en"; |
28 |
| -}; |
| 71 | + const storedLocale = document |
| 72 | + .cookie |
| 73 | + .split(";") |
| 74 | + .find((c) => c.includes("locale=")) |
| 75 | + ?.split("=")[1]; |
29 | 76 |
|
30 |
| -export const getSupportedLocale = (userLocale: string): SupportedLocales => { |
31 |
| - const supported: SupportedLocales[] = [ |
32 |
| - "en", "de", "fr", "nl", "pt", "es", "zh-cn", "zh-hk", "pt-br", "vi" |
33 |
| - ]; |
| 77 | + if (storedLocale) { |
| 78 | + return getSupportedLocale(storedLocale); |
| 79 | + } |
34 | 80 |
|
35 |
| - const normalized = userLocale.toLowerCase(); |
36 |
| - if (supported.includes(normalized as SupportedLocales)) return normalized as SupportedLocales; |
| 81 | + return getSupportedLocale(window.navigator.language); |
| 82 | + } |
37 | 83 |
|
38 |
| - const mainLang = normalized.split('-')[0]; |
39 |
| - return supported.find(l => l.startsWith(mainLang)) || "en"; |
| 84 | + return "en"; |
40 | 85 | };
|
41 | 86 |
|
42 | 87 | export async function dynamicActivateLocale(locale: string) {
|
43 |
| - const safeLocale = getSupportedLocale(locale); |
44 | 88 | try {
|
45 |
| - const {messages} = await import( |
46 |
| - /* @vite-ignore */ |
47 |
| - `./locales/${safeLocale}.po` |
48 |
| - ); |
49 |
| - i18n.load(safeLocale, messages); |
50 |
| - i18n.activate(safeLocale); |
51 |
| - } catch { |
| 89 | + const messages = localeMessages[locale] || localeMessages["en"]; |
| 90 | + i18n.load(locale, messages); |
| 91 | + i18n.activate(locale); |
| 92 | + } catch (error) { |
52 | 93 | i18n.activate("en");
|
53 | 94 | }
|
54 | 95 | }
|
| 96 | + |
| 97 | +export const getSupportedLocale = (userLocale: string) => { |
| 98 | + const normalizedLocale = userLocale.toLowerCase(); |
| 99 | + |
| 100 | + if (localeMessages[normalizedLocale]) { |
| 101 | + return normalizedLocale; |
| 102 | + } |
| 103 | + |
| 104 | + const mainLanguage = normalizedLocale.split('-')[0]; |
| 105 | + const mainLocale = Object.keys(localeMessages).find(locale => locale.startsWith(mainLanguage)); |
| 106 | + if (mainLocale) { |
| 107 | + return mainLocale; |
| 108 | + } |
| 109 | + |
| 110 | + return "en"; |
| 111 | +}; |
0 commit comments