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. ...
随机推荐
- 鸿蒙HarmonyOS实战-ArkUI事件(焦点事件)
前言 焦点事件是指程序中的重要事件或关键点.焦点事件通常是程序的核心逻辑和功能,需要引起特殊的关注和处理. 在图形用户界面(GUI)编程中,焦点事件通常与用户交互和界面输入相关.例如,当用户点击按钮. ...
- 26ObjectStream
ObjectStream ObjectOutputStream 用于将属性和内容保存到文件中,保存数据类型和值,即序列化,该流为处理流 static和transient修饰的属性无法序列化,切被序列化 ...
- ajax递归发送请求
简介 大家都知道浏览器在处理http网络请求的时候,不同的浏览器会有不一样的并发限制,下表是一些主流浏览器对 HTTP 1.1 和 HTTP 1.0 的最大并发连接数目: Browser HTTP/1 ...
- JavaScript 数组常用方法整理
数组变异方法 push() 数组末尾添加一个项目,返回新数组长度,arr.push(item)pop() 数组末尾删除一个元素,返回被删除元素,arr.pop()shift() 删除数组开头第1个元素 ...
- java 读取气象专业格式NetCDF文件
一.NetCDF简介NetCDF全称为network Common Data Format( "网络通用数据格式"),是一个软件库与机器无关的数据格式,支持创建,访问基于数组的科研 ...
- uniapp登录板块封装(旧接口getUserInfo)
点击查看代码 // 授权并获取用户信息 const authorizeAndGetUserInfo = (loginRes) => { uni.getUserInfo({ success(res ...
- mysql如何优雅的备份数据
MySQL 有多种备份方式,以下是几种常用的备份方式: 使用 mysqldump 命令备份数据 mysqldump 是 MySQL 自带的备份工具,可以备份指定数据库或表的数据为 SQL 文件.可以通 ...
- 基于Python的性能优化
一.多线程 在CPU不密集.IO密集的任务下,多线程可以一定程度的提升运行效率. import threading import time import requests def fetch_url( ...
- 2024盘古石取证比赛(APK)
题目列表 使用软件: Notepad++,火眼证据分析软件,雷电分析app,DB browser for SQLCipher 1. 分析伏季雅的手机检材,手机中诈骗APP的包名是:[答案格式:abc. ...
- 007. gitlab仓库管理
1. gitlab创建组 创建后: 组管理: 组创建完成后,开始创建用户 2. gtilab创建用户 这里无法直接创建密码,需要创建用户后在对用户进行操作修改密码 密码和权限设置,取消和开启创建组权限 ...