react-intl——react国际化使用方案

国际化介绍

i18n:internationalization 国家化简称,首字母+首尾字母间隔的字母个数+尾字母,类似的还有 k8s(Kubernetes) <br />
React-intl是 React 中最受欢迎的库。

使用步骤

  • 安装

    # use npm
    npm install react-intl -D
    # use yarn
    
  • 项目入口文件配置

    // index.tsx
    import React from "react";
    import ReactDOM from "react-dom";
    import { IntlProvider } from "react-intl";
    import App from "src/App";
    import { getCurrentLang, getCurrentMessages } from "src/locales";
    import "./styles/index.less";const root = (<IntlProvider locale={getCurrentLang()} messages={getCurrentMessages()}><App /></IntlProvider>
    );ReactDOM.render(root, document.getElementById("root"));
    

    IntlProvider 有三个配置参数:

    • locale, <string>, 语言标记,例如 'zh-CN' 'en-US'
    • messages, <object>, 国际化所需的 key-value 对象
    • formats, <object>, 自定义 format,比如日期格式、货币等
  • 在 src/locales 中创建国际化文件,一般有 en 和 zh,如

    ├─src
    │  ├─en
    │  │  ├─index.ts
    │  ├─zh
    │  │  ├─index.ts
    |  |——index.ts
    

    添加键值对并导出

    // zh/index.ts
    export default {whatever: `你好 {placeholder}`,
    };
    
    // locales/index.ts
    import zh from './zh';
    import en from './en';import ls from 'src/utils/localStore';
    import { createIntl, createIntlCache } from 'react-intl';const _currentLang = ls.getItem('qs_lang') || 'zh-CN';
    const messages = {'zh-CN': zh,'en-US': en,
    };
    export const getCurrentLang = () => _currentLang;
    export const getCurrentMessages = () => messages[_currentLang];const cache = createIntlCache();
    const intl = createIntl({locale: _currentLang,messages: getCurrentMessages(),},cache
    );export default intl;
  • 接着在组件中就可以使用FormattedMessage等组件

    import React from "react";
    import { FormattedMessage } from "react-intl";const App = () => {return (<FormattedMessageid="whatever"description="hello world"defaultMessage="Hello {placeholder}"values={{ placeholder: "world" }}/>);
    };export default App;
    

    或者在函数式组件中使用 hooks

    import { useIntl } from "react-intl";const App = () => {const { formatMessage: f } = useIntl();return (<>{f({id: "whatever",description: "hello world",defaultMessage: "Hello {placeholder}",},{ placeholder: "world" })}</>);
    };export default App;
    
    • <FormattedMessage>组件中可以通过values属性来传值,如以上例子传递{placeholder: 'world'},渲染到对应的你好 {placeholder}位置
    • formatMessage中传递第二个参数作为占位符的入参

如何在非组件中使用 react-intl

例如我需要在组件目录下添加constants.ts文件来管理静态变量,而且需要国际化处理,因为它不是 react 组件,所以是没法用以上的方法处理。

这时候就需要使用createIntl来处理,createIntl 允许在不使用 Provider 的情况下创建 IntlShape 对象,它返回一个可以在 React 组件外部使用的对象。

// locales/index.ts
import { createIntl, createIntlCache } from 'react-intl';
...
const cache = createIntlCache();
const intl = createIntl({locale: _currentLang,messages: getCurrentMessages(),},cache
);export default intl;

在非组件文件中使用时

// xxx/constants.ts
import intl from "src/locales";const a = intl.formatMessage({ id: "whatever", defaultMessage: "你好 {world}" },{ placeholder: "world" }
);

更多

react-intl还能处理像货币、时间、数字等等各种国际化问题,更多请参考官方文档

github上的demo

antd 国际化方案

参考国际化

其实就是使用 React 的 context 特性,只需要一个 Provider Component,用它来提供国际化的上下文。

import zhCN from "antd/es/locale/zh_CN";return (<ConfigProvider locale={zhCN}><App /></ConfigProvider>
);

react-intl结合antd使用

以上步骤完成后,在切换语言为英文时,react-intl中使用的国际化文案正常显示。但此时会发现antd中组件依然显示的是中文,因为此时我们还没有对antd组件的国际化进行处理。

  1. src/locales中导出antd相关的国际化文案
  2. 在入口文件index.tsx中antd全局配置组件中引入即可
// src/locales/index.ts
import zh from './zh';
import en from './en';import enUS from 'antd/es/locale/en_US';
import zhCN from 'antd/es/locale/zh_CN';
import ls from 'src/utils/localStore';
import { createIntl, createIntlCache } from 'react-intl';const _currentLang = ls.getItem('qs_lang') || 'zh-CN';
export const getCurrLang = () => _currentLang;const messages = {'zh-CN': zh,'en-US': en,
};export const antMessages = {'zh-CN': zhCN,'en-US': enUS,
};export const getAntMessages = () => antMessages[_currentLang];export const getCurrentMessages = () => messages[_currentLang];
...
// src/index.tsx
import React from "react";
import ReactDOM from "react-dom";
import { IntlProvider } from "react-intl";
import App from "src/App";
import { ConfigProvider } from "antd";
import { getCurrentLang, getCurrentMessages, getAntMessages } from "src/locales";
import "./styles/index.less";const root = (<IntlProvider locale={getCurrentLang()} messages={getCurrentMessages()}><ConfigProvider locale={getAntMessages()}><App /></ConfigProvider></IntlProvider>
);ReactDOM.render(root, document.getElementById("root"));


喜欢的朋友记得点赞、收藏、关注哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/423967.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6.6高斯噪声

在OpenCV联合C中给一张图片添加高斯噪声&#xff08;Gaussian Noise&#xff09;&#xff0c;可以通过生成随机数并在图像的每个像素上加上这些随机数来实现。高斯噪声是一种统计分布服从正态分布的噪声&#xff0c;通常用于模拟自然界的许多物理现象。 示例代码 以下是一个使…

云曦2024秋季开学考

ezezssrf 第一关&#xff1a;md5弱比较 yunxi%5B%5D1&wlgf%5B%5D2 第二关&#xff1a; md5强比较 需要在bp中传参&#xff0c;在hackbar里不行 yunxiiM%C9h%FF%0E%E3%5C%20%95r%D4w%7Br%15%87%D3o%A7%B2%1B%DC V%B7J%3D%C0x%3E%7B%95%18%AF%BF%A2%00%A8%28K%F3n%8EKU%B3_B…

华为HCIA、HCIP和HCIE认证考试明细

华为认证体系包括三个主要等级&#xff1a;HCIA&#xff08;华为认证ICT助理&#xff09;、HCIP&#xff08;华为认证ICT高级工程师&#xff09;和HCIE&#xff08;华为认证ICT专家&#xff09;。每个等级的认证都有其特定的考试内容和费用。 HCIA&#xff08;华为认证ICT助理…

Excel 基础知识-操作手册2

十、查找与引用函数 Excel中的查找与引用函数非常丰富&#xff0c;以下是一些主要的函数及其使用示例&#xff1a; 1. **VLOOKUP** - 语法&#xff1a;VLOOKUP(lookup_value, table_array, col_index_num, [range_lookup]) - 示例&#xff1a;假设A列是员工编号&#xff0c;B…

国际快递跟集运有什么区别?怎么做才能好集运?

在国际物流的舞台上&#xff0c;海外集运和国际快递是两种备受瞩目的运输方式&#xff0c;那两者之间有什么区别呢&#xff1f; 国际快递其实类似于国内快递&#xff0c;只是运输终点是海外。一般由公司或个人直接向海外邮寄&#xff0c;采用飞机运输&#xff0c;3 - 5 天就能…

IntelliJ IDE 插件开发 | (十二)自定义项目脚手架(上)

系列文章 本系列文章已收录到专栏&#xff0c;交流群号&#xff1a;689220994&#xff0c;也可点击链接加入。 前言 在开发创建一个新项目的时候&#xff0c;我们一般都会使用平台自带的脚手架&#xff0c;如下图所示&#xff1a; 或者是使用网页版&#xff1a; 尽管平台已经…

先楫HPM6750 Windows下VSCode开发环境配置

用的是EVKmini&#xff0c;ft2232作为调试器jtag接口调试 启动start_gui.exe 以hello_world为例&#xff0c;更改一下build path&#xff0c;可以generate并使用gcc compile 最后会得到这些 点击start_gui里面的命令行&#xff0c;用命令行启动vscode 新建.vscode文件夹&…

如何让Windows控制台窗口不接受鼠标点击(禁用鼠标输入)

一、简述 在我们编写控制台应用程序时&#xff0c;默认情况下程序的打印输出会在控制台窗口中进行显示&#xff0c;我们在写服务功能时在窗口中会不断打印消息输出&#xff0c;这个时候如果使用鼠标点击了控制台窗口&#xff0c;会阻塞程序的继续运行&#xff0c;导致我们的程…

vue使用TreeSelect设置带所有父级节点的回显

Element Plus的el-tree-select组件 思路&#xff1a; 选中节点时&#xff0c;给选中的节点赋值 pathLabel&#xff0c;pathLabel 为函数生成的节点名字拼接&#xff0c;数据源中不包含。 在el-tree-select组件中设置 props“{ label: ‘pathLabel’ }” 控制选中时input框中回…

树莓派智能语音助手实现音乐播放

树莓派语音助手从诞生的第一天开始&#xff0c;我就想着让它能像小爱音箱一样&#xff0c;可以语音控制播放音乐。经过这些日子的倒腾&#xff0c;今天终于实现了。 接下里&#xff0c;和大家分享下我的实现方法&#xff1a;首先音乐播放模块用的是我在上一篇博文写的《用sound…

基于spring的博客系统(二)

4. 业务代码 4.1 持久层 根据需求, 先⼤致计算有哪些DB相关操作, 完成持久层初步代码, 后续再根据业务需求进⾏完善 1. ⽤⼾登录⻚ a. 根据⽤⼾名查询⽤⼾信息 2. 博客列表⻚ a. 根据id查询user信息 b. 获取所有博客列表 3. 博客详情⻚ a. 根据博客ID查询博客信息 b. 根据博客I…

现代 Web 开发工具箱:Element-UI 表单组件全攻略(二)

现代 Web 开发工具箱&#xff1a;Element-UI 表单组件全攻略&#xff08;二&#xff09; 一 . Switch 开关控件1.1 Switch 组件的创建① 注册路由② 创建 Switch 组件 1.2 Switch 组件的属性① 开关的宽度② 开关 打开/关闭 的文字提示③ 开关打开或者关闭时候的值④ 开关打开或…

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点&#xff0c;就像冯诺依曼原理说的一样&#xff0c;一个计算机最起码要有输入输出吧&#xff0c;我们有了信息的接收和处理&#xff0c;那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…

测试通用面试题大全

24年软件测试的发展如何&#xff1f; 1、IT行业还会继续升温&#xff0c;高质量人才需求相对还是短缺。 2、要求变高之后&#xff0c;很难再下降了&#xff0c;学历和经验。 3、功能测试之外的东西&#xff0c;接口、性能和自动化要掌握一点。 4、长远来看&#xff0c;软件…

数据集 wider_face 人脸数据集 人脸检测 >> DataBall

数据集 wider 人脸检测数据集 WIDER FACE: A Face Detection Benchmark inproceedings{yang2016wider, Author {Yang, Shuo and Luo, Ping and Loy, Chen Change and Tang, Xiaoou}, Booktitle {IEEE Conference on Computer Vision and Pattern Recognition (CVPR)}, Title…

Radware Alteon 负载均衡-基于URL Filetype的七层负载均衡

作者&#xff1a;Xiaolei Ren Radware Alteon作为一款高性能的负载均衡器&#xff0c;其基于URL Filetype的七层负载均衡功能为众多企业提供了灵活、高效的解决方案。 该案例实现如下需求&#xff1a;当客户端访问服务器时&#xff0c;默认访问10.200.1.100&#xff0c;在ht…

【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用

【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用 建议前提配置用到的命令参考文献&#xff1a; 建议 本文仅作个人记录&#xff0c;请勿完全照搬&#xff0c;建议直接看此视频&#xff0c;按作者的步骤进行配置 linux配置内外网&#xff08;ubuntu举例&#xff09;&am…

决策树算法上篇

决策树概述 决策树是属于有监督机器学习的一种&#xff0c;起源非常早&#xff0c;符合直觉并且非常直观&#xff0c;模仿人类做决策的过程&#xff0c;早期人工智能模型中有很多应用&#xff0c;现在更多的是使用基于决策树的一些集成学习的算法。 示例一&#xff1a; 上表根据…

Sparse4D v1

Sparse4D: Multi-view 3D Object Detection with Sparse Spatial-Temporal Fusion Abstract 基于鸟瞰图 (BEV) 的方法最近在多视图 3D 检测任务方面取得了重大进展。与基于 BEV 的方法相比&#xff0c;基于稀疏的方法在性能上落后&#xff0c;但仍然有很多不可忽略的优点。为了…

四数之和--力扣18

四数之和 题目思路代码 题目 思路 类似于三数之和&#xff0c;先排序&#xff0c;利用双指针解题。 如果排序后的第一个元素大于目标值&#xff0c;直接返回&#xff0c;为什么nums[i]需要大于等于0&#xff0c;因为目标值可能为负数。比如&#xff1a;数组是[-4, -3, -2, -1…