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的拖动布局插件
Nov 25 Javascript
Javascript 遮罩层和加载效果代码
Aug 01 Javascript
动态加载jquery库的方法
Feb 12 Javascript
ANGULARJS中使用JQUERY分页控件
Sep 16 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
Oct 01 Javascript
bootstrap滚动监控器使用方法解析
Jan 13 Javascript
利用node.js搭建简单web服务器的方法教程
Feb 20 Javascript
JavaScript函数柯里化原理与用法分析
Mar 31 Javascript
原生JS 实现的input输入时表格过滤操作示例
Aug 03 Javascript
javascript随机变色实例代码
Oct 15 Javascript
keep-Alive搭配vue-router实现缓存页面效果的示例代码
Jun 24 Javascript
微信小程序实现发微博功能的示例代码
Jun 24 Javascript
LayUI+Shiro实现动态菜单并记住菜单收展的示例
如何用JavaScript实现一个数组惰性求值库
原生JS中应该禁止出现的写法
May 05 #Javascript
详解Javascript实践中的命令模式
如何制作自己的原生JavaScript路由
May 05 #Javascript
Vue项目中如何封装axios(统一管理http请求)
May 02 #Vue.js
如何用JavaScript学习算法复杂度
You might like
详解Yii2.0 rules验证规则集合
2017/03/21 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
Aptana调试javascript图解教程
2009/11/30 Javascript
js 图片等比例缩放代码
2010/05/13 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
jQuery实现可关闭固定于底(顶)部的工具条菜单效果
2015/11/06 Javascript
谷歌Chrome浏览器扩展程序开发小记
2016/01/06 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
javascript设计模式之module(模块)模式
2016/08/19 Javascript
Vuex之理解Getters的用法实例
2017/04/19 Javascript
浅析 NodeJs 的几种文件路径
2017/06/07 NodeJs
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
angular.js实现购物车功能
2017/10/23 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
nodejs require js文件入口,在package.json中指定默认入口main方法
2018/10/10 NodeJs
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
python先序遍历二叉树问题
2017/11/10 Python
Python 实现12306登录功能实例代码
2018/02/09 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Python3.5面向对象程序设计之类的继承和多态详解
2019/04/24 Python
pytorch+lstm实现的pos示例
2020/01/14 Python
可以随进度显示不同颜色的css3进度条分享
2014/04/11 HTML / CSS
html5音频_动力节点Java学院整理
2018/08/22 HTML / CSS
工程造价与管理专业应届生求职信
2013/11/23 职场文书
审计工作个人的自我评价
2013/12/25 职场文书
精彩自我鉴定
2014/01/16 职场文书
小学英语教学反思案例
2014/02/04 职场文书
电工技术比武方案
2014/05/11 职场文书
党员先进事迹材料
2014/12/19 职场文书
2015年公司国庆放假通知
2015/07/30 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
MySQL学习之基础操作总结
2022/03/19 MySQL
关于Python中进度条的六个实用技巧分享
2022/04/05 Python