react umi 中使用 i18next 实现动态加载国际化资源

安装相关依赖

yarn add i18next react-i18next i18next-browser-languagedetector i18next-http-backend

配置

import i18n from 'i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
import {initReactI18next} from 'react-i18next';

i18n
  // 加入Backend插件,用于从远程服务器获取国际化资源
  // 插件详见: https://github.com/i18next/i18next-http-backend
  .use(Backend)
  // 探测用户语言
  // 插件详见: https://github.com/i18next/i18next-browser-languageDetector
  .use(LanguageDetector)
  // pass the i18n instance to react-i18next.
  .use(initReactI18next)
  // 初始化配置
  // 所有配置详见: https://www.i18next.com/overview/configuration-options
  .init({
    react: {
      // 是否需要在最外层加入Suspense标签
      useSuspense: false
    },
    // 设置默认语言
    lng: 'zh-CN',
    fallbackLng: 'zh-CN',
    // 是否启用调试模式
    debug: true,
    //
    load: 'currentOnly',
    backend: {
      /**
       * 用于构建请求url
       * @param lngs 语言编码
       * @param namespaces 名称空间
       */
      loadPath: function (lngs: Array, namespaces: Array) {
        console.log(lngs, namespaces)
        return `http://localhost:8000/api/language/resource/${lngs[0]}`;
      },
      /**
       * 用于对响应的结果进行结构转化
       * @param data 原始响应的字符串结果
       */
      parse: function (data: string) {
        const obj = eval("(" + data + ")");
        return obj.resp;
      },
      /**
       * 是否允许跨域
       */
      crossDomain: true,
      /**
       * 是否允许携带登录凭证
       */
      withCredentials: true,
    },
    interpolation: {
      escapeValue: false, // not needed for react as it escapes by default
    },
  }, function (err, t) {
    // i18n插件初始化完成或异常时的回调函数
    console.log('国际化插件初始化完毕!', err)
  });
export default i18n;

hook方式使用

import React, {memo, useEffect, useState, Suspense} from 'react';
import styles from './Index.less';
import {Button} from "antd";
import {useTranslation} from 'react-i18next';

interface RouteProps {
  /**
   * 当前路由的路径
   */
  path: string;
  /**
   * 路由路径是否需要完全匹配
   */
  exact: boolean;
}

interface IndexProps {
  route: RouteProps;
}

const Index: React.FC = (props) => {
  const {t, i18n} = useTranslation();
  // 仅在组件第一次初始化时调用
  useEffect(() => {
  }, []);

  const onClick = () => {
    i18n.changeLanguage('en-US');
  }
  // 获取国际化资源
  const val = t('title');
  return (
    

{val}

); }; export default memo(Index);

你可能感兴趣的:(react umi 中使用 i18next 实现动态加载国际化资源)