react umi 中使用 i18next 实现动态加载国际化资源
yarn add i18next react-i18next i18next-browser-languagedetector i18next-http-backend
import i18n from 'i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
import {initReactI18next} from 'react-i18next';
i18n
.use(Backend)
.use(LanguageDetector)
.use(initReactI18next)
.init({
react: {
// 是否需要在最外层加入Suspense标签
useSuspense: false
},
// 设置默认语言
lng: 'zh-CN',
fallbackLng: 'zh-CN',
// 是否启用调试模式
debug: true,
//
load: 'currentOnly',
backend: {
loadPath: function (lngs: Array<string>, namespaces: Array<string>) {
console.log(lngs, namespaces)
return `http:
},
parse: function (data: string) {
const obj = eval("(" + data + ")");
return obj.resp;
},
crossDomain: true,
withCredentials: true,
},
interpolation: {
escapeValue: false,
},
}, function (err, t) {
console.log('国际化插件初始化完毕!', err)
});
export default i18n;
import React, {memo, useEffect, useState, Suspense} from 'react';
import styles from './Index.less';
import {Button} from "antd";
import {useTranslation} from 'react-i18next';
interface RouteProps {
path: string;
exact: boolean;
}
interface IndexProps {
route: RouteProps;
}
const Index: React.FC<IndexProps> = (props) => {
const {t, i18n} = useTranslation();
useEffect(() => {
}, []);
const onClick = () => {
i18n.changeLanguage('en-US');
}
const val = t('title');
return (
<div>
<Button onClick={onClick}>按钮</Button>
<h1 className={styles.title}>{val}</h1>
</div>
);
};
export default memo(Index);