react大型项目的 i18n 解决方案
使用 react-i18n + vite-i18n-loader 完成项目的i18n功能,边开发,热加载,随后生成的文件在 public/locals/{lang}.json
位置
01 安装项目需要的包
安装包
# 开发使用
yarn add --dev @jswork/vite-i18n-loader
# 基本的i18next组件
yarn add i18next-http-backend react-i18next i18next
# 自己写的 provider 简化配置
yarn add @jswork/react-i18n @jswork/i18n-language-detect
02 配置 provider
配置
provider
,使用 backend 方式加载public/locals/*.json
文件
import { LocaleProvider } from '@jswork/react-i18n';
import LNGDetect from '@jswork/i18n-language-detect';
export default (props: PropsWithChildren<any>) => {
return (
<LocaleProvider
harmony
plugins={[LNGDetect]}
options={{ debug: false, publicURL: '/', version: '__VERSION__' }}
routerType="browser"
mode="backend">
{props.children}
</LocaleProvider>
);
};
03 配置 i18n 插件
添加
loader
组件
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import i18nLoader from '@jswork/vite-i18n-loader';
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), i18nLoader()],
server: {
host: '0.0.0.0'
}
});
04 样板文件 - 组件
针对组件,添加样板文件(
abc-components
)
.
├── App.tsx
├── assets
│ └── react.svg
├── components
│ ├── abc-component
│ │ ├── index.tsx
│ │ └── locale.yml
05 定义一个 locale.yml
文件里的值最终会写到
zh-CN/en-US.json
的components.abc-component
这个 key 上。
# 这个id可以不写,但写了就会以写的为准
id: components.abc-component
languages:
zh-CN:
title: 组件名称
description: 第一个i18n示例组件
en-US:
title: Component Name
description: The first i18n example component
06 使用i18n文件
使用
useIntl
结合scope
const Anonymous = () => {
const { t } = nx.useIntl('components.abc-component');
return (
<div className="debug-red p-2">
<h1>{t('title')}</h1>
<p>{t('description')}</p>
</div>
);
};
export default Anonymous;