网站的语言切换功能大家都见过不少,一般都是一个下拉框选择语言,如果让我们想一下怎么实现这个功能,我相信大家都是有哥大概思路,一个语言切换的select,将当前的选择的语言存在全局,根据这个语言的key去使用相应语言的配置文字。最近接到这个需求,就去搜了搜react相关的插件,网上大佬们好像主要是提到有三种,react-il8next,react-intl以及react-intl-universal,写了个demo项目都试了一下。我们这里还用到了高德地图,相关语言配置查了一下官网有api可以配置,不过目前只支持英文和中文两种,不过一般情况主要就是这两种语言。接下来写一下具体的测试和实现图。  

  一.相关插件使用:

  1.react-il8next:安装:npm install il8next react-il8next --save(当然这里用yarn add 也是可以的,之后的两款安装也是这样后边就不再说啦) ;

  具体使用:

  第一步:在src目录下建立文件夹local,建立一个init的文件,用来初始化该插件。如图:

  这里我建立了另外两个文件夹是用另外的插件做比较建立的。init具体内容如下,resource为语言配置项,这里应该是单独把配置项拿出来更好,在后边的方法中抽离出来了。

  

  第二步:引入index.js(或者其他在项目运行时一定会执行的文件中)使项目运行时就可初始化。 第三步:具体的使用在jsx的页面中(此处是使用hook的方式),import { useTranslation } from 'react-i18next';根据页面需求const { t, i18n } = useTranslation();t用来使用/展示,i18n. changeLanguage(‘zh’)用来改变配置语言。

  2.react-intl:安装:npm install react-intl –save

  具体使用:

  第一步:这个插件相对更好用就是不用专门初始化,引进来直接标签就可以用,语言配置文件肯定是要建的,可以直接引入在根组件中,这里是建了一个文件把语言都引入进来,不需要进行其他操作;

  

  第二步:在根组件中引入(红框部分)

  

IntlProvider有两个参数这里,locale是传递需要国际化的语言的缩写,通过这个参数可以确定格式化日期,数字,量词的时候按照哪一种语言的规则,这个是规则是intl提供的,一般浏览器会内置这个库,但是在Safari和IE11之前需要自己安装,messages是用于传递当前的语言配置。可以通过获取浏览器语言设置(navigator.language),但是这里我们手动设置了,和之前的方法一样(这里一般是用户会手动切换的,会有手动设置的需要吧;

  第三步:在组件中使用: import { FormattedMessage } from 'react-intl'; 在jsx中使用: 感觉使用是组件的形式,id就是我们配文文件的key,目前查到的好像只有这种形式,后期可以深究一下函数中怎么拿到这个值。FormattedMessage中还有一些别的参数可以设置,这里不再细说,更多的人推荐使用另外两种方式,特别是react-intl-universe,还可以在js文件中使用。

  3.react-intl-universal:安装:npm install react-intl-universal –save

  具体使用:

  第一步:在locales中新建react-intl-universal,建立相关的初始化文件,以及配置文件或工具类文件,我把EventEmitter也放在这里了,应该是在一般的项目里这个应该会放在untils文件夹里,但是这里只是为了调试这个用所以放这边了。这里的index里写的初始化的方法我封装了一下,因为目前看的资料是在切换语言的时候需要重新初始化语言配置,所以在这里简单封装了一下:

  第二步:在初始化的入口文件引入,这里我的是index.js,进行初始化。

  

  第三步:在整个app的最外层的jsx文件中引入,在进行语言切换的时候重新初始化语言的配置。一般应该是被router标签包起来的,这里重新初始化语言其实在别的页面也是可以的,比如在切换语言的组件的页面直接重新初始化,但是这里是为了顺便能够一起切换antd的组件语言,因为像antd的日期选择之类的很多组件都是有国际化配置的,具体的使用如下: 需要引入的文件:import zhCN from 'antd/lib/locale/zh_CN'; import enUS from 'antd/lib/locale/en_US'; import frFR from 'antd/lib/locale/fr_FR'; // antd语言的配置 import { ConfigProvider } from 'antd'; import { emit } from './locales/react-intl-universe/emit'; import setLocales from './locales/react-intl-universe/index';

  

  第四步:在使用语言配置的地方直接引入 import intl from 'react-intl-universal'; 在jsx中使用:

{intl.get('welcome')},welcom为配置文件中的key,这里的用法上和react-i18next差不多。

  注意:这里有一点和react-i18next不同的是,后者中t函数不可以在js文件中使用(原因应该是这个原理是hook的一种自定义,所以只能在jsx文件中使用),例如我们想要在配置文件中使用,可能就需要给配置文件导出为一个函数,在使用改配置的时候,传入语言的参数,但是react-intl-universal可以直接在js中使用,像这样:

  其他相关:关于高德地图的配置:高德地图在初始化地图的时候有配置项:lang – 可选值:zh_cn:中文简体,en:英文,zh_en:中英文对照;这里项目中使用了antd,antd有自己的国际化,详细的可参考官网:https://ant.design/components/config-provider-cn/。这里我把自己的练习demo放在gitlab上了,git地址:http://gitlab.sftcwl.com/01406039/react-test-project.git,登陆页欢迎页什么的不用管直接路由输入/home进入。

  具体的效果图:

  中文:

  

  英文:

  

  刚接触react两个星期,写的东西可能不是很好,如果有更好的欢迎大家指教~

react项目实现多语言切换的更多相关文章

  1. react中多语言切换的实现方式

    目前正在进行的项目就是一个多语言切换的项目,有些前情知识我们可以 从https://react.i18next.com/getting-started进行了解. 说到使用方法,当然首先是要$ npm ...

  2. vue-i18n vue-cli项目中实现国际化 多语言切换功能 一

    vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...

  3. React项目结构

    任何一种语言.框架,在真正上手的时候,多多少少会想想怎么安排项目结构(正所谓磨刀不误砍柴工),React也不例外. google了下,拿下面3篇博客来说道说道. (1) how-to-better-o ...

  4. Android app应用多语言切换功能实现

    最近在做一个多语言切换的功能,类似于微信的语言切换,搜了下资料基本上都是以下这种: 1. 实现的效果 和微信类似,在设置界面打开切换语言的界面,选择语言后重启 HomeActivity,语言切换完成, ...

  5. ABP的语言切换

    在ABP官网http://www.aspnetboilerplate.com/创建一个Multi Page Web Application项目并打开,在Web项目下可以找到一个Controllers/ ...

  6. iOS 语言切换、本地化,国际化

    什么是本地化处理? 本地化处理就是我们的应用程序有可能发布到世界的很多国家去,因为每个国家应用的语言是不一样的,所以我们要把我们的应用程序的语言要进行本地化处理一下. 本地化处理需要处理那些文件? ( ...

  7. QT实现多语言切换

    功能需求: 网盘客户端要能够实现多国语言的切换,第一版要支持中.英文的切换.在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单.下面就来看一下QT中如何制作多语言 ...

  8. iOS开发——iOS国际化 APP内语言切换

    最近一个一直在迭代的老项目收到一份新的开发需求,项目需要做国际化适配,简体中文+英文.由于项目中采用了storyboard和纯代码两种布局方式,所以国际化也要同时实现.上网查了些资料,实现了更改系统语 ...

  9. 如何实现Echart不刷新页面,多语言切换下的地图数据重新加载,api请求数据加载,soketed数据实时加载

    可视化项目中经常用到ecahrt,各种异步加载,连接socket,多语言切换等问题,现在汇总一下: Ecahrt初始化,全局统一init,可以初始化为0,等待后续数据操作 1.如果是api重新请求,数 ...

随机推荐

  1. 怀疑前端组件把我的excel文件搞坏了,怎么证明

    背景 我在做个需求,用户通过excel上传文件,文件中,每一行就是一条数据,后台批量处理:但是呢,用户填的数据可能有问题,所以我后台想先做个检查,然后在每一行中加一列,来指出这一行存在的问题. 我本来 ...

  2. Jenkins 进阶篇 - 参数化构建

    我们在构建任务时经常会遇到这样的情景,一个任务配置好了以后,在后面的构建过程中,又会修改一些配置.例如,我们构建项目的代码可能是拉取指定的分支或者是Tag进行构建,又或者是在构建是需要指定特定的运行平 ...

  3. 【Uva1025 A Spy in the Metro】动态规划

    题目描述 某城市地铁是线性的,有n(2≤n≤50)个车站,从左到右编号1~n.有M1辆列车从第1站开始往右开,还有M2辆列车从第n站开始往左开.列车在相邻站台间所需的运行时间是固定的,因为所有列车的运 ...

  4. Xshell记录Linux连接操作日志遇到的坑

    1.问题描述: 在Windows上,以前一直使用Secure CRT连接Linux主机进行远程操作,使用CRT的日志功能记录连接过程中的所有操作以及输出. 最近(2019-8-17)使用Xshell进 ...

  5. macOS下将可执行文件索引位置增添到PATH中

    一.shell中可执行文件的两种执行方式 (1)绝对路径 比如,打开电脑上安装的python3,使用绝对路径方式打开为: /usr/local/bin/python3 (2)使用PATH 将pytho ...

  6. "virtualbox for mac安装器遇到了一个错误, 导致安装失败. 请联系软件制造商以获得帮助"的解决办法

    virtualbox下载地址: https://www.virtualbox.org/wiki/Downloads 原因:"Mac OS 10.13.4 会阻止外部内核扩展的安装" ...

  7. 直接使用!安装WordPress一键部署轻松建站教程

    关于 WordPress WordPress (opens new window)简称WP,最初是一款博客系统,后逐步演化成一款功能强大的企业级 CMS(内容管理/建站系统),目前是公认的全球最佳建站 ...

  8. 大数据开发-Go-数组,切片

    new()和make的区别 二者看起来没什么区别,但是他们的行为不同,分别适用于不同的类型 new (T) 为每个新的类型 T 分配一片内存,初始化为 0 并且返回类型为 * T 的内存地址:这种方法 ...

  9. vue菜单切换

    HTML: <div id="box"> <ul> <li v-for= "(item,index) in arry"> & ...

  10. flight.Archives001 / CSS Selectors选择器

    Title/CSS选择器 序 : 这是flight.Archives 梦开始的地方, 作者我熬夜肝出来了这篇文章... 保证这是最简洁高效的 CSS Selectors 教程 Note : 暂时没有能 ...