全球新闻发布系统:React-i18next实现国际【新增功能】

本文解决方案参考链接 react i18n_React i18n —如何使您的React应用程序国际化_weixin_26738395的博客-CSDN博客

1.安装React-i18next和本教程所需的依赖项

npm install i18next i18next-xhr-backend i18next-browser-languagedetector react-i18next

2.在src文件夹中创建i18next.js文件

    第一步:导入需要的库

import i18n from "i18next";
import { initReactI18next } from "react-i18next";
import Backend from "i18next-xhr-backend";
import LanguageDetector from "i18next-browser-languagedetector";

 第二步:准备初始化语言和其他功能【en 英语 zh 中文】

// 需要切换的语言类型
const Languages = ["en", "zh"]

   第三步:导出默认函数创建为i18n并添加以下代码  

// 配置i18n
export default i18n
    .use(Backend)
    .use(LanguageDetector)
    .use(initReactI18next)
    .init({
        fallbackLng: "en",
        debug: true,
        whitelist: Languages,
        interpolation: {
            escapeValue: false,
        }
    }) 

3.在index.js文件中引入上面配置好的i18next.js文件

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import './utils/http'
// 必须引入不然会报错
import "./i18next"

const root = ReactDOM.createRoot(document.getElementById('root'));

root.render(
  <App />
);

4.在需要使用语法切换的组件内引入 react-i18next

本项目中我将切换中英文的按钮放在了 TopHeard中,通过redux进行状态管理,实现切换语法页面语法切换

 

 

 TopHeader中添加以下代码(引入react-i18next+解构函数+按钮及相应的回调)

// 1.引入react-i18next
import { useTranslation } from "react-i18next";
    const { t, i18n } = useTranslation();
    // 英文
    function handleClick1() {
        // 修改 langname
        props.change_en()
        // 使用新的langnamej进行修改
        i18n.changeLanguage(props.langname);
    }

    // 中文
    function handleClick2() {
        props.change_de()
        i18n.changeLanguage(props.langname);
    }

 return (
        <Header
            className="site-layout-background"
            style={{ padding: '0px 16px' }}
        >
            {/* 左侧折叠图标根据 isClollapse 动态展示*/}
            {
                props.isClollapse ? <MenuUnfoldOutlined onClick={changeCollapsed} /> : <MenuFoldOutlined onClick={changeCollapsed} />
            }
            {/* 右侧展示区 */}
            <div style={{ float: 'right' }}>
                <Button
                    onClick={() => handleClick1()}
                >
                    中文
                </Button>
                <Button
                    onClick={() => handleClick2()}
                >
                    English
                </Button>
                <span>{t("topheader.welcome")} <span style={{ color: '#1890ff' }}>{username}</span>{t("topheader.back")}</span>
                <Dropdown overlay={menu}>
                    <Avatar size="large" icon={<UserOutlined />} />
                </Dropdown>
            </div>
        </Header >
    )
} 

 

以下为 获取redux中 langname属性的代码

// 映射props
const mapStateToProps = (props) => {
    const { isClollapse } = props.Collapse
    const { langname } = props.Lang
    return {
        isClollapse,
        langname
    }

}

// 映射dispatch
const mapDispatchToProps = {
    // 改变折叠属性的dispatch
    changeCollapsed() {
        return {
            type: 'change_collapsed'  // action
        }
    },
    // 改变语言的dispatch
    change_de() {
        return {
            type: 'change_zh'
        }
    },
    change_en() {
        return {
            type: 'change_en'
        }
    }
}
export default connect(mapStateToProps, mapDispatchToProps)(withRouter(TopHeader))

 

Langreducer配置

export const Lang = (preState = { langname: 'en' }, action) => {
    // 语言默认值是英文
    let { type } = action
    switch (type) {
        // 改成中文
        case 'change_de':
            preState = { langname: 'de' }
            return preState
        // 改成英文
        case 'change_en':
            preState = { langname: 'en' }
            return preState
        default:
            return preState;
    }
}  

5.创建相应的translation文件

在public文件创建一个名为locales的目录,创建三个文件夹,分别为zh,en, 确保这些文件夹的名称应与i18next.js文件中提供的常量值相似。为每个文件夹创建JSON文件,并将其命名为translation.json。

 

 

 zh文件 translation.json 部分示例 【这里我按照组件进行分类,后面使用时可以 组件名 . key值 去取值了,总之提前定义好使用中英文切换的属性就行】

{
    "common":{
        "ok":"确定",
        "cancel":"取消",
        "manage":"操作",
        "deleteconfirm":"确定要删除吗?"
    },
    "topheader": {
        "welcome": "欢迎",
        "back":"回来",
        "logout":"退出"
    },
    "sidemenu": {
        "title": "文章发布管理系统",
        "/home":"首页",
        "/user-manage":"用户管理",
        "/user-manage/add":"添加用户",
        "/user-manage/delete":"删除用户",
        "/user-manage/update":"更新用户",
        "/user-manage/list":"用户列表",
        "/right-manage":"权限管理",
        "/right-manage/role/list":"角色列表",
        "/right-manage/right/list":"权限列表",
        "/news-manage":"文章管理",
        "/news-manage/add":"撰写文章",
        "/news-manage/draft":"草稿箱",
        "/news-manage/category":"文章分类",
        "/audit-manage":"审核管理",
        "/audit-manage/audit":"审核文章",
        "/audit-manage/list":"审核列表",
        "/publish-manage":"发布管理",
        "/publish-manage/unpublished":"待发布",
        "/publish-manage/published":"已发布",
        "/publish-manage/sunset":"已下线"
    },
    "home":{
        "newstitle":"文章分类图示",
        "carttitle1":"用户最长浏览",
        "carttitle2":"用户点赞最多",
        "pertitle":"个人文章分类",
        "global":"全球",
        "superadmin":"超级管理员",
        "regionadmin":"区域管理员",
        "regionedit":"区域编辑"
        
    },
    "user":{
        "adduser":"添加用户",
        "updateuser":"更新用户",
        "region":"区域",
        "rolename":"角色名称",
        "username":"用户名",
        "rolestate":"用户状态",
        "password":"密码",
        "namem":"请输入用户名",
        "passwordm":"请输入密码",
        "regionm":"请输入区域",
        "rolem":"请输入角色"
    },
    "role":{
        "permission":"权限分配"
    },
    "right":{
        "name":"权限名称",
        "path":"权限路径",
        "popover":"页面配置项",
        "message":"温馨提示:删除操作不可撤销"
    },
    "login":{
        "title":"文章发布管理系统",
        "login":"登录"
    }
}

 

en文件夹translation.json 文件 格式和上面一样,将 中文翻译成英文即可, 

6.组件内使用 t() 进行引用

举例:login组件内 用户名输入框placeholder文本进行中英文切换,其他地方使用方法一样,语法:t("对象名.key值")注意:使用模板字符串时直接将双引号换成 ``即可

<Input prefix={<UserOutlined className="site-form-item-icon" />} placeholder={t("user.username")} />

 

  

 大家可以参考原文跟着创建一个新国际化项目,理清思路后再往写好的项目里添加会更快速。

posted @ 2022-09-25 16:31  前端番茄康  阅读(127)  评论(0编辑  收藏  举报