本文将展示如何使用 react-i18next
来国际化一段包含 React 组件(如 <Link>
)的文本。以下是一个完整的示例,涵盖配置和使用方法:
1. 安装依赖
首先,确保安装了必要的包:
bash
npm install i18next react-i18next
2. 配置 i18next
创建一个 i18n.js
文件来初始化 i18next
:
javascript
// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
// 定义多语言资源
const resources = {
en: {
translation: {
welcome: 'Welcome to our <1>website</1>',
},
},
zh: {
translation: {
welcome: '欢迎访问我们的<1>网站</1>',
},
},
};
i18n
.use(initReactI18next)
.init({
resources,
lng: 'en', // 默认语言
interpolation: {
escapeValue: false, // React 已经处理了 XSS
},
});
export default i18n;
3. 在 React 应用中集成
在你的主应用文件中(例如 index.js
或 App.js
)引入 i18n 配置:
javascript
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './i18n'; // 引入 i18n 配置
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
4. 使用 react-i18next 国际化带组件的文本
在组件中使用 useTranslation
钩子,并结合 <Trans>
组件来处理包含 React 组件的翻译:
javascript
// App.js
import React from 'react';
import { useTranslation, Trans } from 'react-i18next';
import { Link } from 'react-router-dom'; // 假设使用 react-router-dom
function App() {
const { t, i18n } = useTranslation();
// 切换语言的函数
const changeLanguage = (lng) => {
i18n.changeLanguage(lng);
};
return (
<div>
<h1>React i18next 示例</h1>
{/* 使用 Trans 组件处理带 React 组件的翻译 */}
<Trans i18nKey="welcome" components={{ 1: <Link to="/home" /> }}>
Welcome to our <Link to="/home">website</Link>
</Trans>
{/* 语言切换按钮 */}
<div>
<button onClick={() => changeLanguage('en')}>English</button>
<button onClick={() => changeLanguage('zh')}>中文</button>
</div>
</div>
);
}
export default App;
5. 翻译文件结构
确保翻译文件中的占位符(如 <1>
)与 <Trans>
组件中的 components
属性对应。components
对象的键(如 1
)对应翻译字符串中的 <1>
,值是实际的 React 组件(如 <Link>
)。
翻译资源示例(已在 i18n.js
中定义):
json
{
"en": {
"translation": {
"welcome": "Welcome to our <1>website</1>"
}
},
"zh": {
"translation": {
"welcome": "欢迎访问我们的<1>网站</1>"
}
}
}
6. 运行效果
- 当语言为
en
时,页面显示:Welcome to our website
(website
是可点击的<Link>
)。 - 当语言为
zh
时,页面显示:欢迎访问我们的网站
(网站
是可点击的<Link>
)。 - 点击语言切换按钮可动态切换语言。