国际化
Internationalization
在这个全球化日益加深的时代,软件应用的用户遍布全球各个角落。为了更好地服务于不同地区的用户,应用的国际化已经成为了软件开发过程中的一项重要任务。
国际化(Internationalization,i18n):指将软件与特定语言及地区脱钩的软件设计。当需要适配不同的语言及地区时,软件本身不用做内部工程上的改变或修正。
简单来说,就是让软件能够跨越语言和文化的界限,为全球用户提供本地化的体验。它不仅仅是指将软件本地化成不同语言,更重要的是适应不同地区用户的使用习惯,提供更贴近用户需求的体验。
前端与后端国际化
i18n
前端国际化专注于用户界面和交互,例如需要将界面元素如按钮、文本等翻译成目标语言,根据用户的 Locale 调整日期、时间、数字和货币的显示。
后端国际化确保服务器生成的内容,如邮件和通知,以及错误消息等,都根据用户的语言偏好本地化,并能正确格式化日期、时间和货币等数据。
总之,前后端国际化有各自不同的职责和实现方法,但它们必须协同工作来完成整个应用的国际化。例如,前端需要从后端获取已经本地化的内容,而后端需要根据前端传递的用户 Locale 信息来返回适当的数据。
前端国际化流程
i18n
现在我们主要来关注和探索前端的国际化方案设计。例如:
【当一个其他国家的用户打开一个中文网站时,所有的网页内容都是以他所熟悉的本土语言展示,于是用户可以毫无障碍地使用所有功能。】
这中间到底发生了什么?
1
Locale 识别
用户打开应用页面时,前端首先通过浏览器发送的 Accept-Language 头部信息来检测用户的语言偏好。除了自动检测外,很多网站还会在页面上提供一个语言选择器,让用户可以手动选择偏好的语言。
2
资源文件加载
一旦应用确认了用户的 Locale,应用内的国际化框架便开始加载相应的语言资源文件。这些资源文件通常是在应用开发阶段就准备好的,由专业的翻译人员或翻译服务提供的本地化文本,包含了应用界面中所有文本的翻译,如按钮标签、菜单项、提示信息等。
3
内容本地化
资源文件加载完毕后,国际化框架接着将页面上的所有可本地化文本替换为资源文件中相应的其他语言文本。当中不仅涉及静态文本的替换,还可能包括由 JS 动态生成的内容。此外,如果页面中包含日期、时间或数字等信息,国际化框架也会将它们格式化为符合当地标准的格式,比如将日期从“年-月-日”格式转换为“日/月/年”。
4
布局调整
国际化框架还会负责调整页面布局以适应文本方向,这点对阿拉伯语或希伯来语用户尤其重要。
前端国际化框架
i18n
以 React 应用为例,我们可以使用现成的国际化框架来简化国际化过程,例如比较常用的 react-i18next、react-intl 等。以下将以 react-i18next 为例,介绍其工作原理和使用方式。
i18next 是一个国际化框架,将国际化逻辑与应用逻辑解耦,简化 JavaScript 应用中的多语言翻译和本地化处理,提供了灵活的资源管理、复数形式处理、变量插值、自定义格式化等功能。i18next 的设计让应用可以从简单的 JSON 文件中加载翻译资源,或者与后端服务集成,动态获取所需的翻译数据。
react-i18next 则是基于 i18next 的 React 绑定库,它将 i18next 的多语言功能与 React 组件结合起来,提供了与 React 组件生命周期和渲染流程紧密结合的接口。开发者可以利用 React 的 Hooks(如useTranslation)或高阶组件(如withTranslatio)直接在组件中获取和使用翻译函数。此外,react-i18next 还提供了 Trans 组件来处理复杂的翻译场景,比如插值和嵌套组件的本地化。
其核心机制在于以下几点:
1
初始化与配置
在应用启动时,i18next 实例被创建并配置,当中涉及设置默认语言、资源文件的路径和加载方式等。这个实例将作为全局的国际化引擎,负责管理语言资源和提供翻译功能。
2
资源文件的结构化
react-i18next 利用 JSON 格式的资源文件来组织不同语言的翻译内容,每个文件对应一种语言,内含键值对映射。这些键值对代表了应用中需要翻译的文本及其对应的本地化版本。
3
翻译上下文的提供
通过 I18nextProvider 组件或 useTranslationhook,可以将翻译功能注入到React 组件树中。这样,任何组件都可以通过上下文访问到翻译函数 t。
4
文本的动态替换
在组件中可以使用t函数通过键值来获取翻译文本。react-i18next 在内部处理了资源文件的加载和键值映射的解析,确保了即使在异步加载资源的情况下,用户界面也能及时更新。
5
语言的切换
当调用 i18n.changeLanguage 函数更改语言时,i18next 会触发一个更新流程,加载新语言的资源文件并通知所有依赖于翻译资源的组件进行更新。
以下是一些使用流程示例:
1. 初始化和配置。在应用的入口文件中,初始化并配置 i18next。
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
i18n
.use(initReactI18next)
.init({
resources: {
en: {
translation: {
'hello_message': 'Hello'
}
},
zh: {
translation: {
'hello_message': '你好'
}
}
},
lng: 'en', // 默认语言
fallbackLng: 'en', // 备用语言
interpolation: {
escapeValue: false // 不需要对输出进行转义
}
});
2. 使用翻译函数。在 React 组件收纳柜,通过 useTranslation hook 来使用翻译函数 t。
import React from 'react';
import { useTranslation } from 'react-i18next';
function Hello() {
const { t } = useTranslation();
return <h1>{t('hello_message')}</h1>;
}
export default Hello;
3. 切换语言。在任何组件中都可以调用 i18n.changeLanguage 来切换语言。
import i18n from 'i18next';
// 假设这是一个语言切换按钮的点击事件响应函数
function handleLanguageChange(language) {
i18n.changeLanguage(language);
}
MicroStrategy
Workstation
i18n
以 MicroStrategy Workstation 插件为例,Workstation 不仅能够自动识别系统的地区设置,自动适配用户的本地语言环境,还提供了一个更直观的语言选择器,允许用户根据个人喜好自主选择界面语言。在各个插件初始化过程中,系统会从浏览器的 navigator.language 属性中提取用户的 Locale 信息,并以此作为参数来配置和启动国际化框架 i18next,随后动态加载与之匹配的语言资源文件,确保各个插件在用户首次使用时即呈现本地化的界面,提升全球用户体验。
Internationalization
大多数情况下,我们没有必要从头开始重复造轮子,可以利用现成的国际化框架和库来简化开发。未来,也许AI实时翻译将成为可能,这将进一步简化国际化过程,应用的国际化开发将变得更加快捷高效。