第 20 期 - 前端全球化的多方面考量
logoFRONTALK AI/11月12日 16:31/阅读原文

摘要

本文主要讲述前端全球化相关内容,包括国内企业开拓海外市场使国际化成为职业发展方向,国际化不仅是多语言适配,还涉及工程化解决方案、文化习俗差异、多种布局适配、数据存储等,还介绍了相关的技术知识如 Intl 对象、语言标识、文本阅读顺序、多语言文案处理、时间时区处理以及低版本兼容等

一、国际化的背景与概念

国内很多企业如 Shopee、阿里的 Lazada 等积极开拓国际市场,当国内市场存量业务达到峰值预期时,海外业务成为公司收入增长的动力,国际化成为重要职业发展方向。并且国内 IT 企业收入存在天花板。而国际化不只是多语言文案适配这么简单,更是一整套工程化解决方案。从业人员需要具备全球视野,了解不同地区文化习俗等知识。

二、产品全球化的设计与开发

(一)以苹果键盘为例的全球化产品设计

苹果键盘售卖多国,有多种型号,不同型号布局不一样。制造卖到世界各地的键盘,可以统一生产电路板等硬件配件,制定三种布局方案,单独开孔键帽印刷不同语言文案,并且 MacOS 开发语言输入软件适配不同键盘语言输入。

(二)国际化与本地化概念

全球化等于国际化(i18n)加上本地化(l10n)。产品设计和开发部署需要考虑国际化多语言多布局,如阿拉伯语的 RTL(从右到左),多货币,全球多地区多机房部署等。产品本地化是国际化后的可选流程,需要引入本地化团队转化和质量验收再投入本地市场,不同地区的本地化投入因语言、习惯差异而有所不同。

三、前端国际化相关技术知识

(一)Intl 对象

在 JavaScript 中,浏览器的 Intl 是用于国际化支持的内置对象。它可以处理日期、时间、数字格式化以及货币和语言相关操作。例如,使用 Intl.DateTimeFormat 对象格式化日期和时间,根据用户地区偏好显示;使用 Intl.NumberFormat 对象格式化数字和货币;使用 Intl.getCanonicalLocales 方法获取支持的语言和区域设置信息。

(二)语言标识

按照 ISO 标准,语言可以用大类+小类表示,如“zh”是汉语大类,“zh - CN”是简体中文缩写,语言声明是三段式结构[language]-[script]-[region]。还介绍了不同地区使用的中文标识以及其他语言的标识示例。

(三)文本阅读顺序

不同语言的文本阅读顺序有所不同,如阿拉伯语、希伯来语等是 RTL,而普通的中文和英文是 LTR(从左到右)。HTML 标签的 dir 属性和 CSS 的 writing - mode 属性可以用来设置文本阅读顺序。在多语言场景下,一些布局属性需要更新,如用 margin - inline - start 等替代 margin - left 等属性。

(四)多语言文案处理

多语言文案 l10n 本地化的工作量较大的部分是文本翻译。技术实现方式有多种,如程序打包嵌入文案(通过 key:text 映射),接口获取程序运行时拿文案,实时翻译替换加载翻译的脚本。并且提到了不同框架如 Vue、React 的国际化相关内容,还介绍了占位符与单复数处理的 ICU 语法,以及 Intl.Segmenter 分段器的使用。

(五)时间时区处理

国际化会涉及到时区划分问题,全球不同地区时间与 UTC 时间不一致。介绍了 GMT 和 UTC 的概念,获取用户时区信息的方法,以及 Intl.DateTimeFormat 处理时间国际化问题,包括 DST(夏令时/冬令时)相关内容。还介绍了其他时间处理相关的内容,如 dayjs 插件的国际化支持,Intl.RelativeTimeFormat 格式化相对时间,以及不同语言下数字格式化(整数分隔、小数分隔、百分比、缩写)、货币格式化、货币单位显示等内容。

(六)排序与列表

Intl.Collator 用于字符串比较和排序,可根据不同语言和区域设置执行正确的排序操作,有不同的配置参数如 usage 和 sensitivity 等。Intl.ListFormat 用于格式化列表,可指定列表项的连接方式、样式和语言设置,同样有不同的配置参数 style 和 type。

(七)日历相关

介绍了不同的日历,如伊斯兰历、希伯来历、农历、波斯历等。通过示例展示了不同语言下不同日历的日期格式化,以及不同语言下不同日历名称的显示。还涉及到星期相关内容,如日本的和历与其他地区不同,以及获取每周第一天在不同地区的设置等内容,最后还提到如何写一个国际化日历组件。

四、低版本兼容

Intl 是浏览器对 i18n 提供的底层 API,如果没处理好兼容性问题直接使用可能会报错。例如在低版本操作系统或一些移动端场景下。formatjs 可以提供 polyfill 做低版本兼容,在移动端场景要注意包体积问题。同时解释了为什么 babel 不能为 Intl API 做 polyfill,以及在 Nodejs 中使用 Intl 相关的操作。

 

扩展阅读

Made by 捣鼓键盘的小麦 / © 2025 Front Talk 版权所有