`Intl.DisplayNames`
面向全球用户的 Web 应用需要以许多不同语言显示语言、地区、书写系统和货币的名称。这些名称的翻译需要数据,该数据可在 Unicode CLDR 中找到。将数据打包为应用的一部分会耗费开发时间。用户往往更喜欢语言和地区名称的统一翻译,而随着全球地缘政治情况的变化保持数据更新需要持续维护。
面向全球用户的 Web 应用需要以许多不同语言显示语言、地区、书写系统和货币的名称。这些名称的翻译需要数据,该数据可在 Unicode CLDR 中找到。将数据打包为应用的一部分会耗费开发时间。用户往往更喜欢语言和地区名称的统一翻译,而随着全球地缘政治情况的变化保持数据更新需要持续维护。
你可能已经熟悉了 Intl.NumberFormat
API,因为它已经在现代环境中被支持了一段时间。
在其最基本的形式中,Intl.NumberFormat
允许创建一个可重用的格式化实例,该实例支持基于区域的数字格式化。就像其他 Intl.*Format
API 一样,格式化实例支持 format
和 formatToParts
方法:
现代的网页应用通常使用包含动态数据的列表。例如,一个照片查看器应用可能会显示如下内容:
此照片包含了 Ada、Edith 和 Grace。
而一个基于文本的游戏可能需要展示不同形式的列表:
选择你的超级能力: 隐身、心灵致动 或 共情。
由于每种语言具有不同的列表格式化惯例和用词,实现一个本地化列表格式化工具是极其复杂的。这不仅需要列出每种语言中所有的单词(如上述例子中的 “和” 或 “或”),还需要在编码时定义这些语言的具体格式化规则。Unicode CLDR 提供了这些数据,但在 JavaScript 中使用这些数据需要事先嵌入,并与其他库代码一起发送。这不幸会增加这些库的打包体积,从而对加载时间、解析/编译成本以及内存消耗产生负面影响。
国际化是一件难事。处理复数是一个可能看起来很简单的问题,直到你发现每种语言都有自己的复数规则。
对于英语的复数化规则,只有两种可能的结果。让我们以“cat(猫)”这个词为例:
'one'
形式,在英语中称为单数。'other'
形式(唯一的其它形式),在英语中称为复数。全新的 Intl.PluralRules
API 可以告诉你,在给定语言中哪种形式适用于特定数字。
const pr = new Intl.PluralRules('en-US');
pr.select(0); // 'other' (例如 '0 cats')
pr.select(0.5); // 'other' (例如 '0.5 cats')
pr.select(1); // 'one' (例如 '1 cat')
pr.select(1.5); // 'other' (例如 '1.5 cats')
pr.select(2); // 'other' (例如 '2 cats')