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 相关文章推荐
解决jquery .ajax 在IE下卡死问题的解决方法
Oct 26 Javascript
怎么清空javascript数组
May 11 Javascript
函数式 JavaScript(一)简介
Jul 07 Javascript
Javascript 拖拽的一些高级的应用(逐行分析代码,让你轻松了拖拽的原理)
Jan 23 Javascript
canvas绘制爱心的几种方法总结(推荐)
Oct 31 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
Nov 02 Javascript
详细分析单线程JS执行问题
Nov 22 Javascript
jquery简单实现纵向的无缝滚动代码实例
Apr 01 jQuery
webpack项目使用eslint建立代码规范实现
May 16 Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 Javascript
javascript实现滚动条效果
Mar 24 Javascript
在Vue中使用Select选择器拼接label的操作
Oct 22 Javascript
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
如何制作自己的原生JavaScript路由
May 05 #Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 #Vue.js
如何用JavaScript学习算法复杂度
You might like
Thinkphp模板中使用自定义函数的方法
2012/09/23 PHP
php版小黄鸡simsimi聊天机器人接口分享
2014/01/26 PHP
Yii2框架数据验证操作实例详解
2018/05/02 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
jquery 页面全选框实践代码
2010/04/02 Javascript
DIV始终居中的js代码
2014/02/17 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
vue-router中的hash和history两种模式的区别
2018/07/17 Javascript
详解promise.then,process.nextTick, setTimeout 以及 setImmediate的执行顺序
2018/11/21 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
利用React高阶组件实现一个面包屑导航的示例
2020/08/23 Javascript
Vue指令实现OutClick的示例
2020/11/16 Javascript
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
一些常用的Python爬虫技巧汇总
2016/09/28 Python
python编程使用selenium模拟登陆淘宝实例代码
2018/01/25 Python
pandas.loc 选取指定列进行操作的实例
2018/05/18 Python
Python基于聚类算法实现密度聚类(DBSCAN)计算【测试可用】
2018/12/26 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
python实现ftp文件传输功能
2020/03/20 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
广告设计专业自荐信范文
2013/11/14 职场文书
八一慰问活动方案
2014/02/07 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
会计电算化专业求职信
2014/06/10 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
小学班主任自我评价
2015/03/11 职场文书
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技