title

react-i18n构建项目国际化

引入I18n及其配置

创建locales文件夹,存放languages语言json

目录

import en from './languages/en.json' import zh from './languages/zh.json' export const resources = { en: { translation: en, }, zh: { translation: zh, }, } import i18n from 'i18next' import { initReactI18next } from 'react-i18next' import LanguageDetector from 'i18next-browser-languagedetector' import { resources } from './resource' i18n.use(LanguageDetector) // 将 i18n 实例传递给 react-i18next .use(initReactI18next) // 初始化 i18next // 所有配置选项: https://www.i18next.com/overview/configuration-options .init({ resources, fallbackLng: 'zh', // lng: navigator.language, lng: 'en', debug: true, interpolation: { escapeValue: false, // not needed for react as it escapes by default }, }) export default i18n

配置完毕后,在项目入口文件中引入locales文件夹

使用

  1. class组件中
import React from "react"; import { withTranslation } from "react-i18next"; class App extends React.Component { render() { const { t } = this.props; return (<div className="App"> {t("title")} </div>); } } export default withTranslation()(App);
  1. hook组件中
import { useTranslation } from "react-i18next"; function App() { const { t } = useTranslation(); return ( <div className="App"> {t("title")} </div> ); } export default App;
  1. 任何位置中引用(在class项目中的很多配置文件中使用)
import i18n from '../locales' const t = i18n.getFixedT(null, 'translation')
  1. 组件引用
import { Translation } from "react-i18next"; function App() { return ( <Translation> { (t) => <div className="App"> {t("title")} </div> } </Translation> ); } export default App;

通过t转换的过程

可以通过vscode的一个插件 Du i18n来一键转化

  • jsx 结尾的文件可以自带jsx代码环境
  • js 结尾的文件只可以简单替换

Locales的文件

  • 普通字符串就是一一对应

  • 数组等其他类型统一转换的话

    • 增加配置 { returnObjects: true }

      t('viewDetail.config.NGSDectectionLabels', { returnObjects: true })
  • jsx 字符 (dangerouslySetInnerHTML来解析字符串中的html,然后传值)

    • eg: 已录入 22 个样本

      <div dangerouslySetInnerHTML={{ __html: t('numberOfSamples', { sampleNumber }) }}></div> "firstPage.card.text4": "已录入 <span>{{sampleNumber}}</span> 个样本", "firstPage.card.text4": "<span>{{sampleNumber}}</span> samples have been entered",