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 相关文章推荐
javascript 数据类型转换(parseInt,parseFloat)
Jul 20 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 Javascript
js中eval详解
Mar 30 Javascript
javascript去掉前后空格的实例
Nov 07 Javascript
纯js和css完成贪吃蛇小游戏demo
Sep 01 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
Oct 26 Javascript
jQuery实现ajax无刷新分页页码控件
Feb 28 Javascript
js对象数组和对象的使用实例详解
Aug 27 Javascript
解决Layui中layer报错的问题
Sep 03 Javascript
layui 解决富文本框form表单提交为空的问题
Oct 26 Javascript
uniapp实现可以左右滑动导航栏
Oct 21 Javascript
使用vue-element-admin框架从后端动态获取菜单功能的实现
Apr 29 Vue.js
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
如何制作自己的原生JavaScript路由
May 05 #Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 #Vue.js
如何用JavaScript学习算法复杂度
You might like
smarty模板引擎从php中获取数据的方法
2015/01/22 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
CCPry JS类库 代码
2009/10/30 Javascript
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
javascript instanceof,typeof的区别
2010/03/24 Javascript
模拟select的代码
2011/10/19 Javascript
Jquery实现图片左右自动滚动示例
2013/09/25 Javascript
完美兼容各大浏览器的jQuery插件实现图片切换特效
2014/12/12 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
jQuery事件多次绑定与解绑问题实例分析
2019/02/19 jQuery
使用JS来动态操作css的几种方法
2019/12/18 Javascript
[40:29]2018DOTA2亚洲邀请赛 4.7总决赛 LGD vs Mineski 第一场
2018/04/10 DOTA
[54:06]OG vs TNC 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python文件的md5加密方法
2016/04/06 Python
Python 内置函数complex详解
2016/10/23 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
python实现屏保计时器的示例代码
2018/08/08 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
python图片验证码识别最新模块muggle_ocr的示例代码
2020/07/03 Python
获取python运行输出的数据并解析存为dataFrame实例
2020/07/07 Python
洲际酒店集团大中华区:IHG中国
2016/08/17 全球购物
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
瑞典在互联网上最大的宠物商店:Animail
2020/10/31 全球购物
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
开工仪式主持词
2014/03/20 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
画展观后感
2015/06/17 职场文书
个人的事迹材料怎么写
2019/04/24 职场文书
导游词之河北白洋淀
2020/01/15 职场文书
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android