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. 免费的visual studio智能代码插件——CodeGeeX

    CodeGeeX是什么?什么是CodeGeeX? CodeGeeX是一款基于大模型的智能编程助手,它可以实现代码的生成与补全,自动为代码添加注释,不同编程语言的代码间实现互译,针对技术和代码问题的智能 ...

  2. Ubuntu20.04桌面版图文安装(超详细)

    参考文档: https://baijiahao.baidu.com/s?id=1670100505795119581&wfr=spider&for=pc https://mirrors ...

  3. gorm 如何对字段进行comment注释?

    type User struct { Model Name string `gorm:"type:char(30);comment:'姓名'"` }

  4. SR-IOV 网卡虚拟化技术

    目录 文章目录 目录 PCI 与 PCIe 设备 SR-IOV 在 KVM 中启用 SR-IOV 网卡 手动挂载 VF 到虚拟机 指令方式挂载 SR-IOV 的数据包分发机制 PCI 与 PCIe 设 ...

  5. 降本提效 | AIRIOT设备运维管理解决方案

      传统运维多是使用在本地化系统,以人工运维和独立系统执行运维工作,重点关注的是设施运行,存在以下几个问题:   1.信息孤岛:本地化系统的接口不同,功能单一独立,各个系统之间的数据无法对接.交互,形 ...

  6. Linux搭建ESP-IDF开发环境

    下载esp-gitee-tools git clone git@gitee.com:EspressifSystems/esp-gitee-tools.git 替换github网址 cd esp-git ...

  7. C# winfrom 局域网版多人成语接龙(二)

    功能基本上是完成了,要两个人完才好玩,目前 倒计时,每组游戏玩家数量这些控制变量,都是写死再代码里的,等以后想改的时候再改,这个项目核心的功能算是实现了,但还可以扩展,比如记录一下用户的游戏数据,答对 ...

  8. 如何使用Charles查看页面接口请求?

    1.Charles下载地址: https://www.charlesproxy.com/latest-release/download.do 2.如何抓取浏览器的操作 2.1 点击映射 2.2 点击映 ...

  9. 带你深入领略 Proxy 的世界

    Proxy 是 es2015 标准规范加入的语法,很可能你只是听说过,但并没有用过,毕竟考虑到兼容的问题,不能轻易地使用 Proxy 特性. 但现在随着各个浏览器的更新迭代,Proxy 的支持度也越来 ...

  10. CSS——3D转换