首页 > 其他分享 >国际化

国际化

时间:2024-09-13 17:02:50浏览次数:1  
标签:国际化 zh 语言 default ts import CN

国际化

@umi/max 内置了国际化插件,它可以轻松地将国际化功能集成到你的 Umi 应用程序之中。

开始使用

国际化插件采用约定式目录结构,我们约定在 src/locales 目录下引入多语言文件。

多语言文件的命名需遵循此规范:<lang><separator><COUNTRY>.(js|json|ts)。其中,<separator> 为分隔符,默认为 -,可以通过 baseSeparator 项配置。

例如,如果您需要在项目中引入简体中文和英文的多语言支持,可以在 src/locales 目录下创建 zh-CN.ts 和 en-US.ts 两个文件:

src + locales + zh-CN.ts + en-US.ts pages

在 .umirc.ts 中配置国际化插件:

export default { locale: { // 默认使用 src/locales/zh-CN.ts 作为多语言文件 default: 'zh-CN', baseSeparator: '-', }, };

关于配置的更多介绍可参见配置插件章节。

现在,添加您的第一条多语言内容:

// src/locales/zh-CN.ts export default { welcome: '欢迎光临 Umi 的世界!', }; // src/locales/en-US.ts export default { welcome: "Welcome to Umi's world!", };

您也可以使用 .json 文件来存放多语言的内容:

// src/locales/zh-CN.json { "welcome": "欢迎光临 Umi 的世界!", }   // src/locales/en-US.json { "welcome": "Welcome to Umi's world!", }

一切就绪,现在您可以在 Umi 中使用多语言内容。交给我们的 <FormattedMessage /> 组件吧,只需要将前面的 welcome 作为参数 id 的值传入即可:

import { FormattedMessage } from 'umi';   export default function Page() { return ( <div> <FormattedMessage id="welcome" /> </div> ); };

渲染的结果如下:

<!-- zh-CN --> <div>欢迎光临 Umi 的世界!</div>   <!-- en-US --> <div>Welcome to Umi's world!</div>

在组件的参数中使用

在某些情况下,您需要将多语言内容作为参数传递给某个组件。可以通过 intl 对象来实现:

import { Alert } from 'antd'; import { useIntl } from 'umi';   export default function Page() { const intl = useIntl(); const msg = intl.formatMessage({ id: 'welcome', });   return <Alert message={msg} type="success" />; };

在底层,国际化插件基于 react-intl 封装,并支持它的所有接口,详情可见此文档

在上面的代码中,我们就运用到了 react-intl 提供的 useIntl() 接口来初始化 intl 对象,并调用此对象的 formatMessage() 方法来格式化字符串。

格式化字符串

您可能想要在多语言翻译中动态插值,那么可以像这样编写多语言内容:

// src/locales/zh-CN.ts export default { user: { welcome: '{name},今天也是美好的一天!', }, }; // src/locales/en-US.ts export default { user: { welcome: '{name}, what a nice day!', }, };

在上面,我们编写了特殊的语法 {name},这允许我们在运行时动态赋值:

import { FormattedMessage } from 'umi';   export default function Page() { return ( <p> <FormattedMessage id="user.welcome" values={{ name: '张三' }} /> </p> ); };

如果您希望通过 intl 对象来实现,那么可以这样对它赋值:

import { useIntl } from 'umi';   export default function Page() { const intl = useIntl(); const msg = intl.formatMessage( { id: 'user.welcome', }, { name: '张三', }, );   return <p>{msg}</p>; };

注意,用于赋值的键值对对象应当作为 formatMessage() 方法的第二个参数传递。

渲染的结果如下:

<!-- zh-CN --> <p>张三,今天也是美好的一天!</p>   <!-- en-US --> <p>张三, what a nice day!</p>

切换语言

通过预设的 <SelectLang /> 组件可以帮助您快速地向项目中添加切换语言的功能,只需要像这样编写:

import { SelectLang } from 'umi';   export default function Page() { return <SelectLang />; };

更多情况下,您可能需要自己编写切换语言的组件。这时就轮到 setLocale() 接口大显身手了:

import { setLocale } from 'umi';   // 切换时刷新页面 setLocale('en-US');

使用该方法切换语言时,默认情况下会刷新当前的页面。您可以设置它的第二个参数为 false 来实现无刷新切换语言:

// 切换时不刷新页面 setLocale('en-US', false);

如果需要切换为默认的语言,只需要调用此方法而不用传递任何参数:

// 如果您的默认语言为 zh-CN // 那么以下调用具有与 setLocale('zh-CN') 同样的效果 setLocale();

多语言默认值

为了页面的一致性,当 Umi 没有在当前的多语言文件中找到 id 对应的内容时,它会直接将 id 渲染为页面上的内容。

例如,编写了如下多语言文件:

// src/locales/zh-CN.ts export default { table: { submit: '提交表单', }, }; // src/locales/en-US.ts export default { // table: { // submit: 'SUBMIT TABLE', // }, };

有如下组件:

import { Button } from 'antd'; import { FormattedMessage } from 'umi';   export default function Page() { return ( <Button type="primary"> <FormattedMessage id="table.submit" /> </Button> ); };

渲染的结果为:

<!-- zh-CN --> <button type="primary">提交表单</button>   <!-- en-US --> <button type="primary">table.submit</button>

特别的,如果您需要在没有完成国际化适配的情况下,给出一个默认的值,可以使用 defaultMessage 参数:

import { Button } from 'antd'; import { FormattedMessage } from 'umi';   export default function Page() { return ( <Button type="primary"> <FormattedMessage id="table.submit" defaultMessage="SUBMIT TABLE" /> </Button> ); };

使用 formatMessage() 方法时,也可以这么做:

import { Button } from 'antd'; import { useIntl } from 'umi';   export default function Page() { const intl = useIntl(); const msg = intl.formatMessage({ id: 'table.submit', defaultMessage: 'SUBMIT TABLE', });   return <Button type="primary">{msg}</Button>; };

不推荐使用 defaultMessage 配置默认值,因为这会编写大量重复的国际化内容。最好的情况是,在您进行国际化适配时,确保了每个多语言文件中都包含所有用到的键。

常用接口介绍

addLocale 动态添加多语言支持

无需创建并编写单独的多语言文件,使用 addLocale() 接口可以在运行时动态添加语言支持。它接受三个参数:

参数类型介绍
name String 多语言的 Key
message Object 多语言的内容对象
options Object momentLocale 和 antd 配置

例如,您想要动态引入繁体中文的多语言支持,可以编写代码如下:

import { addLocale } from 'umi'; import zhTW from 'antd/es/locale/zh_TW';   addLocale( 'zh-TW', { welcome: '歡迎光臨 Umi 的世界!', }, { momentLocale: 'zh-tw', antd: zhTW, }, );

getAllLocales 获取多语言列表

通过 getAllLocales() 接口可以获取当前所有多语言选项的数组,包括通过 addLocale() 方法添加的多语言选项。该接口默认会在 src/locales 目录下寻找形如 zh-CN.(js|json|ts) 的文件,并返回多语言的 Key。

import { getAllLocales } from 'umi';   getAllLocales(); // [en-US, zh-CN, ...]

getLocale 获取当前选择的语言

通过 getLocale() 接口可以获取当前选择的语言:

import { getLocale } from 'umi';   getLocale(); // zh-CN

useIntl 获取 intl 对象

useIntl() 很有可能会是您开发中最常用的接口,通过它可以获取 intl 对象,并进一步执行 formatMessage() 等方法来实现您多元的需求:

// src/locales/en-US.json { "welcome": "Hi, {name}." } import { useIntl } from 'umi';   const intl = useIntl(); const msg = intl.formatMessage( { id: 'welcome', }, { name: 'Jackson', }, ); console.log(msg); // Hi, Jackson.

关于 intl 对象的更多用法,请参阅 react-intl 的接口文档

setLocale 设置语言

通过 setLocale() 接口可以使用编程的方法动态设置当前的语言。它有两个参数:

参数类型介绍
lang String 切换到的语言
realReload Boolean 切换时是否刷新页面,默认为 true 刷新页面
import { setLocale } from 'umi';   // 切换时刷新页面 setLocale('en-US');   // 切换时不刷新页面 setLocale('en-US', false);

配置插件

您可以在 .umirc.ts 中配置国际化插件。默认值如下:

export default { locale: { antd: false, // 如果项目依赖中包含 `antd`,则默认为 true baseNavigator: true, baseSeparator: '-', default: 'zh-CN', title: false, useLocalStorage: true, }, };

配置的详细介绍如下:

配置项类型默认值介绍
antd Boolean false;如果项目包含 antd 依赖,则为 true antd 的国际化支持。更多介绍可参见此文档
baseNavigator Boolean true 开启浏览器语言检测。默认情况下,当前语言环境的识别按照:localStorage 中 umi_locale 值 > 浏览器检测 > default 设置的默认语言 > zh-CN
baseSeparator String - 语言(Language)与国家(Country) 之间的分割符。默认情况下为 -,返回的语言及目录文件为 zh-CNen-US 和 sk 等。若指定为 _,则 default 默认为 zh_CN
default String zh-CN 项目默认语言。当检测不到具体语言时,使用 default 设置的默认语言。
title Boolean false 开启标题国际化
useLocalStorage Boolean true 自动使用 localStorage 保存当前使用的语言。

标题国际化

在路由配置中添加 title 项即可启用国际化支持,自动将页面的标题转为对应的多语言内容。

例如,编写多语言文件如下:

// src/locales/zh-CN.ts export default { 'site.title': 'Umi - 企业级 React 应用开发框架', 'about.title': 'Umi - 关于我', }; // src/locales/en-US.ts export default { 'site.title': 'Umi - Enterprise-level React Application Framework', 'about.title': 'Umi - About me', };

配置路由内容如下:

// .umirc.ts export default { title: 'site.title', routes: [ { path: '/', component: 'Index', }, { path: '/about', component: 'About', title: 'about.title', }, ], };

访问页面时:

  • / 路由。多语言选项为 zh-CN 时,页面标题为 Umi - 企业级 React 应用开发框架;为 en-US 时,页面标题为 Umi - Enterprise-level React Application Framework
  • /about 路由。多语言选项为 zh-CN 时,页面标题为 Umi - 关于我;为 en-US 时,页面标题为 Umi - About me

运行时拓展

国际化插件允许您在运行时对它进行一些拓展与定制。

自定义 getLocale

您可以自定义获取页面语言 getLocale() 方法的逻辑,例如通过识别链接 ?locale=en-US,将 en-US 作为当前页面的语言:

// src/app.ts import qs from 'qs';   export const locale = { getLocale() { const { search } = window.location; const { locale = 'zh-CN' } = qs.parse(search, { ignoreQueryPrefix: true }); return locale; }, };

自定义选项配置

Umi 的 i18n 是基于 react-intl 实现的, 当您需要配置更多 react-intl 初始化选项的时候,可以在 app.ts 中配置,具体配置选项可以参考react-intl 文档

// src/app.ts import { RuntimeConfig } from '@umijs/max'   export const locale: RuntimeConfig['locale'] = { textComponent: 'span', one rror: () => { console.log('error handler...'); } // locale: string // formats: CustomFormats // messages: Record<string, string> | Record<string, MessageFormatElement[]> // defaultLocale: string // defaultFormats: CustomFormats // timeZone?: string // textComponent?: React.ComponentType | keyof React.ReactHTML // wrapRichTextChunksInFragment?: boolean // defaultRichTextElements?: Record<string, FormatXMLElementFn<React.ReactNode>> // one rror(err: string): void }

FAQ

为什么不直接使用 formatMessage 这个语法糖?

虽然 formatMessage 直接使用起来会非常方便,但是它脱离了 React 的生命周期,最严重的问题就是切换语言时无法触发 DOM 的重新渲染。为了解决这个问题,我们切换语言时就需要刷新一下浏览器,用户体验很差。所以推荐大家使用 useIntl 或者 injectIntl,可以实现同样的功能。

标签:国际化,zh,语言,default,ts,import,CN
From: https://www.cnblogs.com/sexintercourse/p/18412546

相关文章

  • MapBox Android版开发 4 国际化功能v11
    MapBoxAndroid版开发4国际化功能v11前言遇到的问题国际化功能原文给出的方案(V10版)migrate-to-v11适用于V11版的代码示例MapStyle类运行效果图前言在前文MapBox地图样式v11中,使用Style的localizeLabels方法本地化地图语言。但MapboxStandard样式和MapboxStan......
  • 打开全球市场的大门:使用 SubErase-Translate-Embed 实现短剧国际化
    在全球化的背景下,短剧的国际化成为提升作品影响力的重要步骤。对于国内短剧来说,如何高效地将其翻译成多种语言并推向海外市场,是许多创作者和制作公司面临的挑战。SubErase-Translate-Embed提供了一个有效的解决方案,助力短剧国际化过程。shortTV-translatedSubErase-......
  • iOS端-多语言国际化适配方案,组件化多语言适配
    一.普通文案适配1.组件内创建Strings文件并添加适配文案(1).创建Strings文件,如下图命名一般以系统名Localizable命名即可,如下图所示。如果起其他名称,需要在后面步骤中添加对应tbl名称,详细见后面步骤二中的第3点(2).将需要适配的语言加入到strings文件中,勾选Localization下Lo......
  • Spring 国际化:i18n 如何使用
    1、i18n概述国际化也称作i18n,其来源是英文单词internationalization的首末字符i和n,18为中间的字符数。由于软件发行可能面向多个国家,对于不同国家的用户,软件显示不同语言的过程就是国际化。通常来讲,软件中的国际化是通过配置文件来实现的,假设要支撑两种语言,那么就需要两个版本的配......
  • react-hook-form 搭配 next-intl 国际化插件 处理form 表单错误
    useEffect(()=>{ form.clearErrors() if(state&&state.data){ router.push('/') } //后台错误 if(state&&state.errorMessage){ //showErrorToast(t(state.errorMessage)) showErrorToast(state.errorMessage) } ......
  • Spring框架中如何实现国际化(i18n)?
    在Spring框架中实现国际化(i18n)主要涉及以下几个步骤:1.准备资源文件首先,你需要为不同语言准备资源文件。这些资源文件通常放在类路径下的特定目录中,如src/main/resources/下的messages.properties文件。对于不同的语言和地区,你可以创建对应的.properties文件,例如me......
  • 多语言界面的无限可能:Scratch的国际化之旅
    多语言界面的无限可能:Scratch的国际化之旅Scratch,这款专为儿童和青少年设计的编程工具,在全球范围内受到广泛欢迎。为了满足不同国家和地区用户的需求,Scratch支持多语言界面,使用户无论使用何种语言都能轻松学习编程。本文将详细介绍Scratch如何实现多语言界面,以及如何通过代......
  • 使用 Vue I18n 进行 Vue.js 应用的国际化
    随着互联网的全球化发展,开发多语言支持的应用变得越来越重要。Vue.js作为一个流行的前端框架,通过vue-i18n插件,能够非常方便地实现应用的国际化(i18n)。本文将介绍如何在Vue.js应用中使用vue-i18n进行国际化设置。什么是国际化(i18n)?国际化(Internationalization)通常简写......
  • Xcode 应用国际化全攻略:打造多语言应用的秘诀
    Xcode应用国际化全攻略:打造多语言应用的秘诀引言在全球化的软件开发领域,应用的国际化是拓展国际市场的关键步骤。Xcode,作为苹果官方的集成开发环境,提供了一套强大的本地化支持工具和流程。本文将详细介绍如何在Xcode中进行应用的国际化,包括详细的步骤说明和代码示例,帮助......
  • 人民币国际化:跨境收付金额激增超20%,去年9月全球贸易融资比重跃居第二
    在全球经济的大舞台上,人民币正以其独特的魅力和实力,逐渐成为国际贸易与金融交易的重要角色。近年来,人民币的国际化进程不断加速,跨境收付金额的显著增长便是这一趋势的最佳证明。据最新数据显示,仅在2023年的前九个月,人民币跨境收付金额的同比增长率就超过了20%,而在去年9月,其在全球......