安装相关依赖
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
// 加入Backend插件,用于从远程服务器获取国际化资源
// 插件详见: https://github.com/i18next/i18next-http-backend
.use(Backend)
// 探测用户语言
// 插件详见: https://github.com/i18next/i18next-browser-languageDetector
.use(LanguageDetector)
// pass the i18n instance to react-i18next.
.use(initReactI18next)
// 初始化配置
// 所有配置详见: https://www.i18next.com/overview/configuration-options
.init({
react: {
// 是否需要在最外层加入Suspense标签
useSuspense: false
},
// 设置默认语言
lng: 'zh-CN',
fallbackLng: 'zh-CN',
// 是否启用调试模式
debug: true,
//
load: 'currentOnly',
backend: {
/**
* 用于构建请求url
* @param lngs 语言编码
* @param namespaces 名称空间
*/
loadPath: function (lngs: Array<string>, namespaces: Array<string>) {
console.log(lngs, namespaces)
return `http://localhost:8000/api/language/resource/${lngs[0]}`;
},
/**
* 用于对响应的结果进行结构转化
* @param data 原始响应的字符串结果
*/
parse: function (data: string) {
const obj = eval("(" + data + ")");
return obj.resp;
},
/**
* 是否允许跨域
*/
crossDomain: true,
/**
* 是否允许携带登录凭证
*/
withCredentials: true,
},
interpolation: {
escapeValue: false, // not needed for react as it escapes by default
},
}, function (err, t) {
// i18n插件初始化完成或异常时的回调函数
console.log('国际化插件初始化完毕!', err)
});
export default i18n;
hook方式使用
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);
网友评论