|
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"; |
21 | 1 | import {i18n} from "@lingui/core"; |
22 | | -import {t} from "@lingui/macro"; |
23 | 2 |
|
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 | | -}; |
| 3 | +export type SupportedLocales = |
| 4 | + | "en" | "de" | "fr" | "nl" | "pt" | "es" |
| 5 | + | "zh-cn" | "zh-hk" | "pt-br" | "vi"; |
38 | 6 |
|
39 | 7 | export const localeToFlagEmojiMap: Record<SupportedLocales, string> = { |
40 | | - en: '🇬🇧', |
41 | | - de: '🇩🇪', |
42 | | - fr: '🇫🇷', |
43 | | - nl: '🇳🇱', |
44 | | - pt: '🇵🇹', |
45 | | - es: '🇪🇸', |
46 | | - "zh-cn": '🇨🇳', |
47 | | - "zh-hk": '🇭🇰', |
48 | | - "pt-br": '🇧🇷', |
49 | | - vi: '🇻🇳', |
| 8 | + en: '🇬🇧', de: '🇩🇪', fr: '🇫🇷', nl: '🇳🇱', pt: '🇵🇹', |
| 9 | + es: '🇪🇸', "zh-cn": '🇨🇳', "zh-hk": '🇭🇰', |
| 10 | + "pt-br": '🇧🇷', vi: '🇻🇳', |
50 | 11 | }; |
51 | 12 |
|
52 | 13 | export const localeToNameMap: Record<SupportedLocales, string> = { |
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`, |
| 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`, |
63 | 17 | }; |
64 | 18 |
|
65 | | -export const getLocaleName = (locale: SupportedLocales) => { |
66 | | - return t`${localeToNameMap[locale]}` |
67 | | -} |
| 19 | +export const getLocaleName = (locale: SupportedLocales) => localeToNameMap[locale]; |
68 | 20 |
|
69 | | -export const getClientLocale = () => { |
| 21 | +export const getClientLocale = (): SupportedLocales => { |
70 | 22 | if (typeof window !== "undefined") { |
71 | | - const storedLocale = document |
72 | | - .cookie |
73 | | - .split(";") |
74 | | - .find((c) => c.includes("locale=")) |
75 | | - ?.split("=")[1]; |
| 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 | +}; |
76 | 29 |
|
77 | | - if (storedLocale) { |
78 | | - return getSupportedLocale(storedLocale); |
79 | | - } |
| 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 | + ]; |
80 | 34 |
|
81 | | - return getSupportedLocale(window.navigator.language); |
82 | | - } |
| 35 | + const normalized = userLocale.toLowerCase(); |
| 36 | + if (supported.includes(normalized as SupportedLocales)) return normalized as SupportedLocales; |
83 | 37 |
|
84 | | - return "en"; |
| 38 | + const mainLang = normalized.split('-')[0]; |
| 39 | + return supported.find(l => l.startsWith(mainLang)) || "en"; |
85 | 40 | }; |
86 | 41 |
|
87 | 42 | export async function dynamicActivateLocale(locale: string) { |
| 43 | + const safeLocale = getSupportedLocale(locale); |
88 | 44 | try { |
89 | | - const messages = localeMessages[locale] || localeMessages["en"]; |
90 | | - i18n.load(locale, messages); |
91 | | - i18n.activate(locale); |
92 | | - } catch (error) { |
| 45 | + const {messages} = await import( |
| 46 | + /* @vite-ignore */ |
| 47 | + `./locales/${safeLocale}.po` |
| 48 | + ); |
| 49 | + i18n.load(safeLocale, messages); |
| 50 | + i18n.activate(safeLocale); |
| 51 | + } catch { |
93 | 52 | i18n.activate("en"); |
94 | 53 | } |
95 | 54 | } |
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