Skip to content

Commit c47e44a

Browse files
committed
i18n: aync load lang file
1 parent d9692b3 commit c47e44a

File tree

4 files changed

+27
-11
lines changed

4 files changed

+27
-11
lines changed

package-lock.json

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"events": "^3.3.0",
2525
"i18next": "^23.11.5",
2626
"i18next-browser-languagedetector": "^8.0.0",
27+
"i18next-resources-to-backend": "^1.2.1",
2728
"idb": "^7.1.1",
2829
"idb-open-plus": "^1.0.0",
2930
"jsonc-parser": "^3.2.0",

src/components/Language.tsx

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
import { Button, ButtonProps } from "antd";
2+
import { useState } from "react";
23
import { useTranslation } from "react-i18next";
34

45
export const LanguageButton = (props: ButtonProps) => {
56
const { i18n } = useTranslation();
7+
const [isLoading, setLoading] = useState(false);
8+
(window as any).i18n = i18n;
69
return (
710
<Button
11+
loading={isLoading}
812
shape="circle"
913
{...props}
1014
onClick={() => {
11-
i18n.changeLanguage(i18n.resolvedLanguage === "en" ? "zh" : "en");
15+
setLoading(true);
16+
i18n
17+
.changeLanguage(i18n.resolvedLanguage === "en" ? "zh-cn" : "en")
18+
// .then(()=>console.log('changeLanguage ok'), (err) => console.error(err))
19+
.finally(() => setLoading(false));
1220
}}
1321
>
14-
{i18n.resolvedLanguage === "en" ? "中" : "En"}
22+
{isLoading ? "" : i18n.resolvedLanguage === "en" ? "中" : "En"}
1523
</Button>
1624
);
1725
};

src/uitls/i18n.ts

+7-9
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,28 @@
11
import i18n from "i18next";
22
import { initReactI18next } from "react-i18next";
33
import LanguageDetector from "i18next-browser-languagedetector";
4+
import resourcesToBackend from "i18next-resources-to-backend";
45
import { isValidElement } from "react";
5-
import en from '../i18n/en.json';
6-
import zh from '../i18n/zh.json';
7-
// const en = await import("../i18n/en.json");
8-
// const zh = await import("../i18n/zh.json");
6+
97
const fallbackLng = "en";
108
i18n
119
// 检测用户当前使用的语言
1210
// 文档: https://github.com/i18next/i18next-browser-languageDetector
1311
.use(LanguageDetector)
1412
// 注入 react-i18next 实例
1513
.use(initReactI18next)
14+
// 动态加载语言包
15+
.use(
16+
resourcesToBackend((language:string, namespace:string) => import(`../i18n/${language}.json`))
17+
)
1618
// 初始化 i18next
1719
// 配置参数的文档: https://www.i18next.com/overview/configuration-options
1820
.init({
19-
debug: true,
21+
debug: import.meta.env.DEV,
2022
fallbackLng: fallbackLng,
2123
interpolation: {
2224
escapeValue: false,
2325
},
24-
resources: {
25-
en: { translation: en },
26-
zh: { translation: zh },
27-
},
2826
});
2927

3028
export function getLabel(label: string | { [key: string]: string }) {

0 commit comments

Comments
 (0)