在使用 Taro 构建小程序或跨平台项目时,国际化(i18n)是一个常见需求,尤其当你的应用需要支持多种语言时。Taro 本身并未直接提供国际化功能,但可以利用第三方国际化库(如
i18next
、react-intl
、@lingui/react
)来实现。
以下是 Taro 项目中实现国际化的完整指南:
1. 使用 i18next 实现国际化
i18next
是一个简单高效的国际化解决方案,且容易集成到 Taro 项目中。
1.1 安装依赖
在 Taro 项目中安装相关依赖:
yarn add i18next react-i18next
如果使用 TypeScript,还需要安装类型定义文件:
yarn add @types/react-i18next -D
1.2 配置 i18next
在项目的 src/
目录下创建i18n.js
文件,用于配置和初始化 i18next
。
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
// 定义语言资源
const resources = {
en: {
translation: {
welcome: "Welcome to Taro",
description: "This is an internationalized app",
},
},
zh: {
translation: {
welcome: "欢迎使用 Taro",
description: "这是一个国际化的应用",
},
},
};
// 初始化 i18next
i18n
.use(initReactI18next) // 使用 React 插件
.init({
resources, // 多语言资源
lng: 'zh', // 默认语言
fallbackLng: 'en', // 备用语言
interpolation: {
escapeValue: false, // React 已经对 XSS 进行转义
},
});
export default i18n;
1.3 在项目中引入配置
在项目入口文件(例如 app.js 或 app.tsx)中引入配置文件:
import React from 'react';
import './app.css';
import './i18n'; // 引入 i18next 配置
const App = ({ children }) => {
return children; // 如果有多语言切换组件,可以在这里引入
};
export default App;
1.4 使用多语言工具
在组件中使用react-i18next
提供的 useTranslation
Hook 来获取翻译内容。
示例:在页面中使用
如在 pages/index/index
中:
import React from 'react';
import { Button, Text, View } from '@tarojs/components';
import { useTranslation } from 'react-i18next';
const Index = () => {
const { t, i18n } = useTranslation();
// 切换语言
const changeLanguage = (lng) => {
i18n.changeLanguage(lng); // 动态更改语言
};
return (
<View>
<Text>{t('welcome')}</Text> {/* 翻译内容 */}
<Text>{t('description')}</Text>
<Button onClick={() => changeLanguage('en')}>English</Button>
<Button onClick={() => changeLanguage('zh')}>中文</Button>
</View>
);
};
export default Index;
在运行时,点击按钮即可切换语言,比如从简体中文切换到英文。
2. 动态加载国际化文案
在项目较大,文案量较多时,可以将语言文件拆分成多个文件并按需动态加载。
在 src/locales
目录中创建语言文件:
src/locales/en.json
{
"welcome": "Welcome to Taro",
"description": "This is an internationalized app"
}
src/locales/zh.json
{
"welcome": "欢迎使用 Taro",
"description": "这是一个国际化的应用"
}
2.2 修改 i18n.js 配置
使用 i18next
的 backend
插件实现语言文件的动态加载。
安装依赖:
yarn add i18next-http-backend
修改 i18n.js 文件:
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import Backend from 'i18next-http-backend'; // 导入后端插件
i18n
.use(Backend) // 使用动态加载插件
.use(initReactI18next)
.init({
lng: 'zh', // 默认语言
fallbackLng: 'en', // 备用语言
interpolation: {
escapeValue: false,
},
backend: {
// 配置语言文件路径
loadPath: '/locales/{{lng}}.json',
},
});
export default i18n;
2.3 配置 Taro 项目语言文件资源
确保将配置的语言文件路径 (/locales/{{lng}}.json) 放到静态资源目录,供小程序和 Web 使用。
例如,在 src/locales 内存放语言文件后,通过 Taro 的构建配置将其输出到 dist:
// config/index.js 添加 copy 配置,将静态语言文件拷贝到打包输出目录
const config = {
// ...
copy: {
patterns: [
{ from: 'src/locales/', to: 'dist/locales/' }, // 配置语言文件路径
],
},
};
export default config;
3. 国际化切换语言保存
为了记住用户选择的语言设置:
使用
localStorage
或Taro.setStorage
保存和获取当前语言。在 i18next 初始化时,读取存储的语言:
i18n.init({
lng: Taro.getStorageSync('language') || 'zh', // 当前语言
});
- 每次切换语言时,更新存储:
const changeLanguage = (lng) => {
i18n.changeLanguage(lng);
Taro.setStorageSync('language', lng); // 更新本地存储
};
4. 与多平台兼容
Taro 支持跨平台开发(如微信公众号、小程序、H5),但不同平台对国际化的支持方式稍有不同:
- 小程序:直接使用 i18next 或自定义简单翻译工具。
- H5 和 Web:可以完整采用 i18next,并动态加载语言文件。
- 离线国际化:如果目标平台不支持异步加载国际化文案,需在打包时将多语言文案嵌入项目。
总结
通过以上方式,我们可以在 Taro 项目中方便地集成国际化,支持语言动态加载和切换。整个流程分为以下几点:
- 配置 i18next 并管理语言资源。
- 页面中使用 useTranslation Hook 获取翻译文案。
- 动态加载语言资源,提高性能。
- 存储用户语言偏好,提升用户体验。
完成后可以实现灵活的国际化支持,比如 H5 页面中实时切换语言,或小程序适配不同地区的语言需求。