npx create-react-app react-intl-demo && cd react-intl-demo,创建react-intl-demo项目。npm install react-intl, 安装react-intl。使用react-intl时, 首先要提供一个provider,把整个项目包起来。怎么提供呢?使用react-intl的IntlProvider,它有1个必传参数locale, 设置本地语言,你的app要使用哪种语言进行渲染。你app的用户使用哪种语言,就要设置local为哪种语言, 比如en-us(美式英语)  zh-cn(简体中文)。
import {IntlProvider} from "react-intl";

ReactDOM.render(
<React.StrictMode>
<IntlProvider locale='en-us'>
<App />
</IntlProvider>
</React.StrictMode>,
document.getElementById('root')
);
  为什么要提供一个provider呢?就是为了让React组件能够使用国际化的函数,翻译文本。React Intl 使用Provider的模式为组件树提供i18n(国际化)的上下文。在根组件中提供配置本地语言和翻译信息,<Formatted*>组件可以直接使用。

  怎么翻译项目中的文本?翻译文件放到什么地方?通常来说,会为每一种语言提供一个翻译文件(json文件),src/translations/zh.json提供中文翻译 .  en.json file 提供英文翻译。假设要翻译App.js中的内容,src/translations/en.json

{
"app.learn-react-link": "Learn React.",
"app.text": "Edit <code>src/App.js</code> and save to reload."
}

  src/translations/zh.json

{
"app.learn-react-link": "学习 React.",
"app.text": "编辑<code>src/App.js</code>,保存,并刷新页面"
}

  项目中怎么获取到翻译文件? <IntlProvider />有messages属性, 把locale设置的语言对应的翻译内容,传给它,就可以为项目提供翻译内容。比如locale是en-us,那就要把en.json中的翻译内容传递给messsages. locale是zh-cn,那就把zh.json中的翻译内容传递给messages。怎么传递,只能先把json文件引入到项目中,再构建一个以locale为属性,翻译内容为值的对象,让messages的值根据locale来定。index.js中

import zh from './translations/zh.json';
import en from './translations/en.json'; const messages = {
'en-us': en,
'zh-cn': zh
} const locale = 'zh-cn'; ReactDOM.render(
<React.StrictMode>
<IntlProvider locale={locale} messages={messages[locale]}>
<App />
</IntlProvider>
</React.StrictMode>,
document.getElementById('root')
);

  组件中怎么使用翻译内容?最简单的方法就是把要翻译的文本使用<FormattedMessage> 组件来代替。组件有一个必传属性id,用来引用翻译文件。怎么理解id呢?IntlProvider 的messages属性实际上是一个js对象,包含着项目中每一句文本的翻译,格式为{"app.learn-react-link": "学习 React."},"app.learn-react-link"可以看作组件中使用翻译时引用的id,react-intl自动会引用id 对应的翻译好的文本。<FormattedMessage> 中的id就是引用的这个id,也就是说,id必须和messages中指向json文件中的id一致。App.js

import {FormattedMessage} from 'react-intl';

<p><FormattedMessage id="app.text" /></p>

<a className="App-link" href="https://reactjs.org" target="_blank" rel="noopener noreferrer">
<FormattedMessage id="app.learn-react-link" />
</a>

  npm start, 可以看到项目已经翻译成中文了。能不能把<code> 去掉呢?FormattedMessage 可以在value属性中解析出富文本中的XML标签。FormattedMessage 有一个value属性

<FormattedMessage id="app.text"
values={{
code: chunks => <code>{chunks}</code>
}}
>
</FormattedMessage>

  code对应的就是app.text中的<code></code>标签, 要解析富文本中的哪个标签,属性就是哪个标签。chunks就可解析出标签中的的内容,在这里就是code标签中的内容,src/App.js, 返回值就是替换整个标签及内容。但此时有个问题,如果有一种语言,恰好没有翻译呢?比如把locale改成en,

const locale = 'en';

  页面就只显示app.text和app.learn-react-link 等Id

  这时要用<FormattedMessage />的defaultMessage属性,设置默认展示的文本。 如果此文本没有在翻译文件中找到,就显示默认文本。它还有一个description: 描述这个文本的作用,主要为翻译者提供上下文。

<FormattedMessage id="app.text"
values={{
code: chunks => <code>{chunks}</code>
}}
defaultMessage="编辑<code>src/App.js</code>,保存,并刷新页面"
description="edit text"
>
<FormattedMessage id="app.learn-react-link"
defaultMessage="学习 React."
description="text link"
/>
  但有时候,你不能使用组件,比如输入框的placeholder, 它只是纯文本,这就要用到formatMessage 函数。但使用formatMessage函数时,你需要一个intl的上下文。如果在函数组件中可以使用useIntl。写一个input输入框

import React from 'react';
import { useIntl } from 'react-intl'; export function Input() {
const intl = useIntl();
const placeholder = intl.formatMessage({id: 'app.placeholder'})
return <input placeholder={placeholder}></input>
}

  引入useIntl,在组件中调用它,返回intl上下文,调用formatMessage方法,它接受一个对象作为参数,id属性就是对应翻译文件中的id。不要忘了在,json文件中写

"app.placeholder": "请输入数字"

  当然,id属性可以是动态生成的,比如

const intlKey = "something"
const placeholder = intl.formatMessage({ id: `${intlKey}` })
  随着<FormattedMessage />用的越来越多,页面结构可能有点混乱,把id, defaultmessage, description 都写到组件中,太占空间。这时可以使用defineMessages 定义文本,就是用一个变量来指代这一系列的参数。单独创建一个文件 messages.js

import { defineMessages } from 'react-intl'

export default defineMessages({
text: {
id: 'app.text',
defaultMessage: 'Edit <code>src/App.js</code>'
},
link: {
id: 'app.learn-react-link',
defaultMessage: 'Lerne React',
description: 'Link on react page'
},
     placeholder: {
        id: 'app.placeholder'
     }
});

  <FormattedMessage /> and formatMessage()就可以使用message.js中定义的text和link。App.js

import messages from './message.js'
import { FormattedMessage } from 'react-intl' <p>
<FormattedMessage {...messages.text}
values={{
code: chunks => <code>{chunks}</code>
}}
>
</FormattedMessage>
</p> <a
className="App-link"
href="https://reactjs.org"
target="_blank"
>
<FormattedMessage {...messages.link} />
</a>

  Input.js

import { useIntl } from 'react-intl';
import messages from './message' export function Input() {
const intl = useIntl();
const placeholder = intl.formatMessage(messages.placeholder)
return <input placeholder={placeholder}></input>
}

  如果不能使用useIntl hooks, 在普通函数或类组件中可以使用injectIntl函数提供intl上下文。Input.js

import React from 'react';
import messages from './message.js'
import { injectIntl } from 'react-intl' function Input({intl}) {
const placeholder = intl.formatMessage(messages.placeholder)
return <input placeholder={placeholder}></input>
} export default injectIntl(Input);

  使用类

import React from 'react';
import messages from './message.js'
import { injectIntl } from 'react-intl' class Input extends React.Component {
render() {
const {intl} = this.props;
const placeholder = intl.formatMessage(messages.placeholder)
return <input placeholder={placeholder}></input>
}
} export default injectIntl(Input);

React项目国际化-React-intl的更多相关文章

  1. 七天接手react项目 系列 —— react 脚手架创建项目

    其他章节请看: 七天接手react项目 系列 react 脚手架创建项目 前面我们一直通过 script 的方式学习 react 基础知识,而真实项目通常是基于脚手架进行开发. 本篇首先通过 reac ...

  2. 七天接手react项目 系列 —— react 路由

    其他章节请看: 七天接手react项目 系列 react 路由 本篇首先讲解路由原理,接着以一个基础路由示例为起点讲述路由最基础的知识,然后讲解嵌套路由.路由传参,最后讲解路由组件和一般组件的区别,以 ...

  3. 搭建React项目环境【1】

    1.安装NodeJS6.0以上自带npm依赖包管理工具 2.webstrom 2019.2 工具 1.在cmd输入node -v就可以看到node的当前版本 2.在输入node进入node环境 3.查 ...

  4. React项目模板-从项目搭建到部署

    前一段时间做了一个小项目,时间比较紧,就一个人月.最终希望能够通过微信公众号链接启动应用. 项目的业务细节就不多说了,主要是想分享一下做这个项目技术方面的一些经验. 技术选型 参考范围大致三种:Ang ...

  5. React项目搭建与部署

    React项目搭建与部署 一,介绍与需求 1.1,介绍 1.1.1,React简介 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人认为 React ...

  6. React项目

    React项目 React项目搭建与部署 一,介绍与需求 1.1,介绍 1.1.1,React简介 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人 ...

  7. react项目中antd组件库的使用需要注意的问题

    antd是蚂蚁金服推出的ui组件库,给我们在react项目开发中提供了大大的便利.但在使用的过程中,或多或少的会遇到一些问题,毕竟,用的是别人的东西,就得遵守别人的规则嘛!官方文档:https://a ...

  8. 使用create-react-app+react-router-dom+axios+antd+react-redux构建react项目

    1.安装.构建 # 全局安装 npm install -g create-react-app # 构建一个my-app的项目 npx create-react-app my-app cd my-app ...

  9. 现有iOS项目集成React Native过程记录

    在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...

  10. 如何在非 React 项目中使用 Redux

    本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...

随机推荐

  1. Docker 必知必会----初识

    什么是Docker?Docker 是一个开源的容器管理引擎.开发者可以通过Docker直接管理应用程序所需要的容器.它的logo如下: 为什么需要Docker使用Docker主要有两个原因,1.屏蔽不 ...

  2. WEB服务与NGINX(2)-NGINX的I/O模型

    WEB服务与NGINX(2)-NGINX的I/O模型 目录 WEB服务与NGINX(2)-NGINX的I/O模型 1. linux I/0模型及在NGINX中的应用 1.1 I/O模型概述 1.2 系 ...

  3. JS实现跟随鼠标移动的div,和一串跟随鼠标的div,鼠标移入移出实现图片的颜色淡入淡出

    1.一直跟着鼠标移动的div:原理是div的left和top值有oEvent.clientX+scrollLeft鼠标指针向对于浏览器页面(或客户区)的水平坐标+元素中滚动条的水平偏移 <!DO ...

  4. iPad 远程控制 Mac 电脑远程办公的终极解决方案

    作为安全技术人员来说,用 iPad 远程控制 Mac 电脑,在我看来是一件很酷的事情! 首先吐槽一下自己为什么会有这个奇怪的想法,原因是因为,目前我有一个16寸的mac,我每天下班的第一个动作就是先把 ...

  5. AI回答总不满意?你的提问方式可能完全错误!

    AI回答总不满意?你的提问方式可能完全错误! 大家好,我是卷福同学,一个专注AI大模型整活的前阿里程序员,腾讯云社区2023新秀突破作者 向AI提问想写一篇论文,结果AI就生成2000字左右的文章后就 ...

  6. PageOffice调用本地office实现多人在线同时编辑Word文档

    说明:多人同时在线编辑文件大多数会出现文档相互覆盖的问题,后保存的文档会覆盖先保存的文档.pageoffice的这个功能可以用程序控制不同用户打开文件后,编辑Word文档中属于自己的区域,并且不会互相 ...

  7. log4j日志记录级别

    目录 一.日志的作用 二.log4j的日志级别和简介 三.log4j配置文件包含的节点简介 四.logger配置说明 一.日志的作用 ​ 问题追踪:通过日志不仅仅包括我们程序的一些 bug,也可以在安 ...

  8. 为什么wait()、notify()方法需要和synchronized一起使用

    提示:更多优秀博文请移步博主的GitHub仓库:GitHub学习笔记.Gitee学习笔记 Obj.wait()与Obj.notify()必须要与synchronized(Obj)一起使用,也就是wai ...

  9. Vue cli之使用Vue-CLI初始化创建前端项目

    1.生成项目目录 使用vue自动化工具可以快速搭建单页应用项目目录. 该工具为现代化的前端开发工作流提供了开箱即用的构建配置.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及可用于生产环境的构 ...

  10. WPF如何自定义TabControl控件样式示例详解

    一.前言 程序中经常会用到TabControl控件,默认的控件样式很普通.而且样式或功能不一定符合我们的要求.比如:我们需要TabControl的标题能够居中.或平均分布:或者我们希望TabContr ...