React项目国际化-React-intl
import {IntlProvider} from "react-intl";
ReactDOM.render(
<React.StrictMode>
<IntlProvider locale='en-us'>
<App />
</IntlProvider>
</React.StrictMode>,
document.getElementById('root')
);
怎么翻译项目中的文本?翻译文件放到什么地方?通常来说,会为每一种语言提供一个翻译文件(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"
/>
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}` })
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'
},
});
<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的更多相关文章
- 七天接手react项目 系列 —— react 脚手架创建项目
其他章节请看: 七天接手react项目 系列 react 脚手架创建项目 前面我们一直通过 script 的方式学习 react 基础知识,而真实项目通常是基于脚手架进行开发. 本篇首先通过 reac ...
- 七天接手react项目 系列 —— react 路由
其他章节请看: 七天接手react项目 系列 react 路由 本篇首先讲解路由原理,接着以一个基础路由示例为起点讲述路由最基础的知识,然后讲解嵌套路由.路由传参,最后讲解路由组件和一般组件的区别,以 ...
- 搭建React项目环境【1】
1.安装NodeJS6.0以上自带npm依赖包管理工具 2.webstrom 2019.2 工具 1.在cmd输入node -v就可以看到node的当前版本 2.在输入node进入node环境 3.查 ...
- React项目模板-从项目搭建到部署
前一段时间做了一个小项目,时间比较紧,就一个人月.最终希望能够通过微信公众号链接启动应用. 项目的业务细节就不多说了,主要是想分享一下做这个项目技术方面的一些经验. 技术选型 参考范围大致三种:Ang ...
- React项目搭建与部署
React项目搭建与部署 一,介绍与需求 1.1,介绍 1.1.1,React简介 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人认为 React ...
- React项目
React项目 React项目搭建与部署 一,介绍与需求 1.1,介绍 1.1.1,React简介 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人 ...
- react项目中antd组件库的使用需要注意的问题
antd是蚂蚁金服推出的ui组件库,给我们在react项目开发中提供了大大的便利.但在使用的过程中,或多或少的会遇到一些问题,毕竟,用的是别人的东西,就得遵守别人的规则嘛!官方文档:https://a ...
- 使用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 ...
- 现有iOS项目集成React Native过程记录
在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...
- 如何在非 React 项目中使用 Redux
本文作者:胡子大哈 原文链接:https://scriptoj.com/topic/178/如何在非-react-项目中使用-redux 转载请注明出处,保留原文链接和作者信息. 目录 1.前言 2. ...
随机推荐
- Linux下Nginx 配置前后端接口
一.编辑nginx.conf配置文件命令 ## /usr/local/nginx/ nginx的安装路径 vim /usr/local/nginx/conf/nginx.conf 二.后端接口配置信息 ...
- tarjan板子整理
缩点 stack<int>q; void tarjan(int u) { pre[u]=low[u]=++cnt; q.push(u); vis[u]=1; for(int i=head[ ...
- 用pageOffice控件实现 office word文档 强制留痕编辑Word
OA办公中,业务需要多人编辑word文档,需要强制留痕功能,用来查看文档编辑过程中的具体修改痕迹. 怎么实现word文档的强制留痕呢? 1 实现方法 通过pageOffice实现简单的在线打开编辑wo ...
- Linux:查看磁盘配额报告数据
近期在超算云上跑代码遇到了个乌龙,就是作业一提交到集群上去先是PD状态,然后马上就终止调了.后来知道是我用户目录下文件数量太多,导致已经超过管理员给我分配的磁盘配额了(众所周知机器学习相关项目的数据集 ...
- 【wordpress开发必备】新增必填字段相关函数和钩子,适用6.1版本
当表单包含多个必填字段时,它们的标签可能带有一个带有图例的星号,以说明这些字段是必填的.为了减少代码重复并帮助维护全局一致的标记,WordPress 有两个新函数:wp_required_field_ ...
- 微服务实践k8s&dapr开发部署实验(2)状态管理
新建webapi项目 建项目时取消https支持,勾选docker支持, Program.cs中注释下面语句,这样部署后才能访问Swagger // Configure the HTTP reques ...
- Flutter(七):Flutter混合开发--接入现有原生工程(iOS+Android)
在上一篇文章Flutter(六):Flutter_Boost接入现有原生工程(iOS+Android)中介绍了Flutter_Boost的接入方法,这一篇将介绍Flutter自带的接入方法. 新建工程 ...
- 全网最全100个AI工具导航网站合集
随着ChatGPT年前的爆火,人工智能也变成当今最热门的领域之一,它正在改变着我们的生活和工作方式.无论你是想要学习人工智能的基础知识,还是想要利用人工智能来提升你的业务效率和创新能力,都需要找到合适 ...
- Github Markdown 指定图片在光亮或暗黑模式展示
Github 根据系统配置不同的主题模式: 如果想要在光亮模式和暗黑模式显示不同的主题的图片,比如以下就是同一个图片在暗黑模式和光亮模式下展示: 解决方案 在markdon 的图片链接后添加#gh-d ...
- kettle从入门到精通 第三十五课 kettle 变量
1.设置变量 a.可以通过转换中的"设置变量"步骤进行设置. b.手动通过kettle.properties文件或通过"编辑"菜单中的"设置环境变量& ...