Skip to content

Commit 29bc321

Browse files
authored
I18N performance improvements (#526)
1 parent c3d3587 commit 29bc321

File tree

23 files changed

+715
-475
lines changed

23 files changed

+715
-475
lines changed

frontend/src/locales.ts

Lines changed: 33 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,54 @@
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";
211
import {i18n} from "@lingui/core";
22-
import {t} from "@lingui/macro";
232

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";
386

397
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: '🇻🇳',
5011
};
5112

5213
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`,
6317
};
6418

65-
export const getLocaleName = (locale: SupportedLocales) => {
66-
return t`${localeToNameMap[locale]}`
67-
}
19+
export const getLocaleName = (locale: SupportedLocales) => localeToNameMap[locale];
6820

69-
export const getClientLocale = () => {
21+
export const getClientLocale = (): SupportedLocales => {
7022
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+
};
7629

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+
];
8034

81-
return getSupportedLocale(window.navigator.language);
82-
}
35+
const normalized = userLocale.toLowerCase();
36+
if (supported.includes(normalized as SupportedLocales)) return normalized as SupportedLocales;
8337

84-
return "en";
38+
const mainLang = normalized.split('-')[0];
39+
return supported.find(l => l.startsWith(mainLang)) || "en";
8540
};
8641

8742
export async function dynamicActivateLocale(locale: string) {
43+
const safeLocale = getSupportedLocale(locale);
8844
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 {
9352
i18n.activate("en");
9453
}
9554
}
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-
};

frontend/src/locales/de.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)