react国际化react-intl的使用


Posted in Javascript onMay 06, 2021

react怎么实现国际化?react-intl插件提供了一套实现react国际化的方法,具体实现如下~~

一 搭建react环境和下载相应插件

默认你已经安装了nodejs 如果没有装的百度装下 这里不再细讲

利用react官方脚手架搭建react项目,已经存在有的react项目也可忽略搭建这步;然后下载相关依赖 react-intl

npx create-react-app react-intl-demo  
npm i react-intl -S

等待下载完成

找到项目根目录下的src文件夹 在里面新建一个叫locale的文件夹 存放语言包设置的文件;这里只实现中英文切换,后续其他语言的都是一样的操作

react国际化react-intl的使用 

二 写相关的配置文件

找到locale的intl.js文件 引入相关的插件 进行封装暴露出去

import React, { useContext } from 'react'
import { IntlProvider } from 'react-intl' // 包裹在需要语言国际化的组件的最外层,和react-redux的Provider一样 让组件和组件内的子组件都能使用react-intl提供的api和方法
import { mainContext } from '../reducer' // 这里使用的是useReducer 简单的在根目录下创建一个 来控制语言的全局状态维护
import zh_CN from './cn' // 中文包
import en_US from './en' // 英文包

const Inter = (props) => {
    // 获取默认的语言设置 也可以配合一些全局状态管理进行结合使用 如redux Mobx或者react自身提供的useReducer等
  const { state } = useContext(mainContext)
  const chooseLocale = (val) => { 
    let _val = val || navigator.language.split('_')[0]
    switch (_val) {
      case 'en':
        return en_US
      case 'zh':
        return zh_CN
      default:
        return zh_CN
    }
  }
  let locale = state.locale // 获取 locale
  let { children } = props
  // 包裹子组件 让子组件共享react-intl的api 实现多语言
  return (
    <IntlProvider
      key={locale}
      locale={locale}
      defaultLocale='zh'
      messages={chooseLocale(locale)}
    >
      {children}
    </IntlProvider>
  )
}

export default Inter

cn.js

const zh_CN = {
    start: '开始',
    switch: '切换'
  }
  export default zh_CN

en.js

const en_US = {
    start: 'start',
    switch: 'switch'
  }
  export default en_US

reducer.js (src目录下新建一个)

import React, { useReducer } from 'react'
const CHANGE_LOCALE = 'CHANGE_LOCALE'

const mainContext = React.createContext()

const reducer = (state, action) => {
  switch (action.type) {
    case CHANGE_LOCALE:
      return { ...state, locale: action.locale || 'zh' }
    default:
      return state
  }
}

const ContextProvider = (props) => {
  const [state, dispatch] = useReducer(reducer, {
    locale: 'zh'
  })
  return (
    <mainContext.Provider value={{ state, dispatch }}>
      {props.children}
    </mainContext.Provider>
  )
}

export { reducer, mainContext, ContextProvider }

三 在App.js引入相关文件并使用

App.js

import './App.css';
import { ContextProvider } from './reducer'
import Inter from './locale/intl'
import View from './views'

function App() {
  return (
    <ContextProvider>
      <Inter>
        <View />
      </Inter>
    </ContextProvider>
  );
}
export default App;

四 新建views目录下面使用相关的插件和api实现国际化

views新建一个 index.jsx 文件试试效果

import react, { useContext} from 'react'
import { mainContext } from '../reducer'
import { FormattedMessage } from 'react-intl'
 
function Index() {
    const { dispatch, state } = useContext(mainContext)
    const { locale } = state
    const changeLang = () => { // 改变状态里的 语言 进行切换
        dispatch({
            type: 'CHANGE_LOCALE',
            locale: locale === 'zh' ? 'en' : 'zh'
        })
    }
    return (
        <div>
           <div>
            <FormattedMessage id="start" ></FormattedMessage>
           </div>
           <div>
                <button onClick={changeLang} > <FormattedMessage id="switch" ></FormattedMessage></button>
           </div>
        </div>
    );
}
export default Index;

最终目录 红框为新增

react国际化react-intl的使用

就这样 一个简单的react国际化就完成了!
可以去试一试,如果项目有需要也可以按照这种移植进去
本次的demo已上传GitHub:github地址 可自行克隆运行

到此这篇关于react国际化react-intl的使用的文章就介绍到这了,更多相关react 国际化内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
用js实现计算代码行数的简单方法附代码
Aug 13 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
Apr 24 Javascript
Javascript学习笔记之数组的遍历和 length 属性
Nov 23 Javascript
JQuery中DOM事件冒泡实例分析
Jun 13 Javascript
js闭包所用的场合以及优缺点分析
Jun 22 Javascript
AngularJs 60分钟入门基础教程
Apr 03 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
Apr 20 Javascript
浅谈Node.js 沙箱环境
May 15 Javascript
vue.js template模板的使用(仿饿了么布局)
Aug 13 Javascript
原生JS实现列表内容自动向上滚动效果
May 22 Javascript
Vue实现数据请求拦截
Oct 23 Javascript
vue-cli创建的项目中的gitHooks原理解析
Feb 14 Javascript
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
如何制作自己的原生JavaScript路由
May 05 #Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 #Vue.js
如何用JavaScript学习算法复杂度
You might like
无数据库的详细域名查询程序PHP版(3)
2006/10/09 PHP
php MYSQL 数据备份类
2009/06/19 PHP
PHP中鲜为人知的10个函数
2014/02/28 PHP
php获取表单中多个同名input元素的值
2014/03/20 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP自定义函数实现数组比较功能示例
2017/10/19 PHP
JS 自动安装exe程序
2008/11/30 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
js data日期初始化的5种方法
2013/12/29 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
点击页面任何位置隐藏div的实现方法
2016/09/05 Javascript
JavaScript仿微博发布信息案例
2016/11/16 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
javascript实现去除HTML标签的方法
2016/12/26 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
angularjs2中父子组件的数据传递的实例代码
2017/07/05 Javascript
jquery判断滚动条距离顶部的距离方法
2018/09/05 jQuery
解决Antd Table组件表头不对齐的问题
2020/10/27 Javascript
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
Cpy和Python的效率对比
2015/03/20 Python
python开启多个子进程并行运行的方法
2015/04/18 Python
python连接mongodb密码认证实例
2018/10/16 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
利用CSS3的定位页面元素
2009/08/29 HTML / CSS
一款简洁的纯css3代码实现的动画导航
2014/10/31 HTML / CSS
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
HTML5单选框、复选框、下拉菜单、文本域的实现代码
2020/12/01 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
工程总经理工作职责
2013/12/09 职场文书
廉政承诺书范文
2015/04/28 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
大学生军训感言
2015/08/01 职场文书
2016年大学生党员公开承诺书
2016/03/24 职场文书
Python if else条件语句形式详解
2022/03/24 Python
PHP面试题 wakeup魔法 Ezpop pop序列化与反序列化
2022/04/11 PHP