当前位置:首页 > 科技  > 软件

React 中的国际化优秀实践

来源: 责编: 时间:2024-05-17 09:02:29 86观看
导读到目前为止,知命境这个合集里已经包含了大量的内容,足够我们在 React 上成为成为一名高手,也有许多付费群里的朋友陆陆续续靠合集里的内容找到了更好的工作,也算是把之前对群友承诺的坑补齐了,延后了很久实在是抱歉。后续

yAd28资讯网——每日最新资讯28at.com

到目前为止,知命境这个合集里已经包含了大量的内容,足够我们在 React 上成为成为一名高手,也有许多付费群里的朋友陆陆续续靠合集里的内容找到了更好的工作,也算是把之前对群友承诺的坑补齐了,延后了很久实在是抱歉。后续 React 知命境的内容会根据大家在群里的疑问补充一些东西。yAd28资讯网——每日最新资讯28at.com

在实现国际化之前,我们要考虑一个比较严肃的问题,就是商用项目是否应该利用翻译软件自动翻译结果?yAd28资讯网——每日最新资讯28at.com

答案是:不应该。yAd28资讯网——每日最新资讯28at.com

这里的核心问题不是说翻译不准确,最严重的问题是自动翻译会可能出现不符合当地人语言习惯、不符合当地法律条文等情况,从而导致项目推广受到不可控的阻碍。yAd28资讯网——每日最新资讯28at.com

因此国际化项目的核心内容,都应该有专业的翻译团队来处理语言翻译问题。yAd28资讯网——每日最新资讯28at.com

从技术角度上来说,自动翻译还会出现的情况是翻译结果单词过长,会导致布局出现混乱。因此翻译结果就会有一些限制。yAd28资讯网——每日最新资讯28at.com

明确了这个前提,我们再来思考具体的功能应该如何实现。不然很多团队在自动翻译上踩坑之后才明白过来,就很得不偿失了。yAd28资讯网——每日最新资讯28at.com

一、数据驱动 UI

在数据驱动 UI 的考虑之下,我们很容易能够想到实现方案,因为文字内容成为了变化量,所以文字内容就应该抽象成具体的数据。yAd28资讯网——每日最新资讯28at.com

结合语言切换,会导致文字内容发生变化,那么很容易能够想到,我们应该设计一个状态,来表示当前选中的语言是什么。yAd28资讯网——每日最新资讯28at.com

const [local, setLocal] = useState<I18nType>('zh_cn')

这个状态会影响到整个项目,因此在 React 中,我们可以把该状态设计成为全局状态。yAd28资讯网——每日最新资讯28at.com

我们只需要选择一种全局状态管理方案来做即可。我这里选择我自己设计的状态管理工具 mozz。yAd28资讯网——每日最新资讯28at.com

首先设计一个自定义 hook 用于存储状态 local。yAd28资讯网——每日最新资讯28at.com

import { useState } from "react";export type I18nType = 'zh_cn' | 'zh_en'export function useI18n() {  const [local, setLocal] = useState<I18nType>('zh_cn')  return {local, setLocal}}

然后引入 mozz,把该自定义 hook 转化为全局 store。yAd28资讯网——每日最新资讯28at.com

import { useState } from "react";+ import {createStore} from 'mozz'export type I18nType = 'zh_cn' | 'zh_en'export function useI18n() {  const [local, setLocal] = useState<I18nType>('zh_cn')  return {local, setLocal}}+ export const {Provider, useStore} = createStore(useI18n)

然后在项目入口文件中,使用 Provider 包裹项目顶层父组件。yAd28资讯网——每日最新资讯28at.com

import {Provider} from './useI18n'import App from './App'export default function I18nApp() {  return (    <Provider>      <App />    </Provider>  )}

这样,在任意子组件,我们就可以通过 useStore 拿到刚才自定义 hook 中的状态。yAd28资讯网——每日最新资讯28at.com

import {useStore} from "./useI18n";const hw = {  'zh_cn': '你好,世界!',  'zh_en': 'hello world!'}export default function App() {  const {local} = useStore()  return (    <div>      <div>{hw[local]}</div>    </div>  )}

简单吧。yAd28资讯网——每日最新资讯28at.com

我们可以引入一个切换语言的功能,实现也非常简单,就是利用 useStore 拿到 setLocal 去改变值即可。yAd28资讯网——每日最新资讯28at.com

import {useStore} from './useI18n'const switchLanguage = {  'zh_cn': '中文',  'zh_en': 'english'}export default function ChangeLanguage() {  const {local, setLocal} = useStore()  function onclick() {    if (local === 'zh_cn') {      setLocal('zh_en')    }    if (local === 'zh_en') {      setLocal('zh_cn')    }  }  return (    <div>      <button onClick={onclick}>        {switchLanguage[local]}      </button>    </div>  )}

将该组件引入到 App 中。yAd28资讯网——每日最新资讯28at.com

+ import ChangeLanguage from "./ChangeLanguage";import {useStore} from "./useI18n";const hw = {  'zh_cn': '你好,世界!',  'zh_en': 'hello world!'}export default function App() {  const {local} = useStore()  return (    <div>+     <ChangeLanguage />      <div>{hw[local]}</div>    </div>  )}

一个简易的国际化应用就实现了。yAd28资讯网——每日最新资讯28at.com

yAd28资讯网——每日最新资讯28at.com

组件的扩展也非常简单,你要创建新的组件支持国际化,只需要使用 useStore 拿到我们刚才设计的状态 local 即可。文章里就不继续扩展了。yAd28资讯网——每日最新资讯28at.com

二、语言包如何维护

我们通过切换状态 local,从一个语言的配置项中获取到对应的文案内容。这里还有一个关键的问题就是,语言的配置文件应该如何维护。yAd28资讯网——每日最新资讯28at.com

这里有两种思考。yAd28资讯网——每日最新资讯28at.com

一种就是如果你的项目可以支持自定义语言包。那么就需要把整个项目所有的语言配置都写在同一个文件里,例如中文语言包。yAd28资讯网——每日最新资讯28at.com

// zh_cn.tsconst language = {  global: '请选择',  // 表示唯一基础组件  Table: {    filterTtitle: '筛选',    ...  },  // 表示唯一页面组件  personal: {    info: '个人信息',  }}

然后每支持一种语言,我们就会维护一个语言包文件。根据 local 去选择使用具体的语言包。yAd28资讯网——每日最新资讯28at.com

yAd28资讯网——每日最新资讯28at.com

这样,当你需要新增其他的外置语言包的时候,只需要给项目提供一个这样的格式统一的文件即可。yAd28资讯网——每日最新资讯28at.com

另外一种思路就是拆分维护。每个组件只维护自己的语言配置项。这样做的好处就是开发时会轻松很多,不需要去全局的语言包里修改或者新增内容。yAd28资讯网——每日最新资讯28at.com

例如在 antd 中,在每个稍微复杂的组件都单独维护了自己的多语言配置。yAd28资讯网——每日最新资讯28at.com

这种方式不需要考虑外部插件支持,只需要考虑自己内部维护,因此实现方式上就会灵活很多。yAd28资讯网——每日最新资讯28at.com

yAd28资讯网——每日最新资讯28at.com

三、总结

国际化的实现在 React 中并不难,属于看完就学会的一个知识点。只是在商用项目中,完善起来比较繁琐。更多的工作量体现在语言包的维护上。稍有差错就是 bug。yAd28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88738-0.htmlReact 中的国际化优秀实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: TaskAffinity属性对应用程序任务栈和启动行为的影响

下一篇: 一招教你解决页面中关联id的转换

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 摸鱼心法第一章——和配置文件说拜拜

    摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 从零到英雄:高并发与性能优化的神奇之旅

    从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • “买真退假” 这种“羊毛”不能薅

    “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主&ldquo;七王&rdquo;在群里介绍一些刷单赚
Top