react国际化

105 阅读2分钟

React国际化项目实践

1.安装如下工具库

   
     "i18next": "^23.10.1",
     "i18next-browser-languagedetector": "^7.2.0",
     "i18next-http-backend": "^2.5.0",
     "react-i18next": "^14.1.0",

2.项目scr目录下创建i18n.ts 配置文件

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
// 首次打开页面 自动识别当前浏览器语言 设置 原理通过 navigator.languages api获取浏览器首选语言 当然i18n当我们手动设置语言了是会存在localstorage里的 首先会去缓存找
import LanguageDetector from 'i18next-browser-languagedetector';
//这个包 是为了优化我们的包 比如说我是中国人 我就只会汉语,不用其他语言 这个时候这个包就会帮我们做一个懒加载的效果
import Backend from "i18next-http-backend";
import en from './locale/en.json'
import zh from './locale/zh.json'
import Français from './locale/french.json'
import Italiano from './locale/Italiano.json'
// the translations
// (tip move them in a JSON file and import them,
// or even better, manage them separated from your code: https://react.i18next.com/guides/multiple-translation-files)
export const resources = {
  en: {
    translation: {
      ...en
    }
  },
  Français: {
    translation: {
      ...Français
    }
  },
  Italiano: {
    translation: {
      ...Italiano
    }
  },
  zh: {
    translation: {
      ...zh
    }
  }
};

i18n.use(LanguageDetector).use(Backend).use(initReactI18next) // passes i18n down to react-i18next
  .init({
    resources,
    interpolation: {
      escapeValue: false // react already safes from xss  默认情况下,i18n会对模版插值的变量进行转义。 设置true的话会防止xss攻击 react本身就防止xss攻击 所以设置false
    }
  });

export default i18n;

3.创建locale文件夹 存放我们的json语言包

image.png

4.main.js引入i18n

image.png

5.在tsx文件使用i18n转换

import { useTranslation } from 'react-i18next';
const App  = ()=>{
    const {t} = useTranslation()
    return (
    <>
     { t('json定义的属性名') }   
     </>
    )
}

6.切换语言

import { useTranslation } from 'react-i18next';

const Settings: React.FC = () => {
    const { t, i18n } = useTranslation();
    const onChangeLanguage = (language: string) => {
        i18n.changeLanguage(language);
    }
    console.log('i18n.language',i18n.language)
     
}

i18n还有很多其他的用法 有兴趣可以去看看 react.i18next.com/ 对于我目前的项目上面就已经够用了