Node.js v18.18.2 文档


目录

国际化支持#

Node.js 具有许多功能,使编写国际化程序变得更加容易。他们之中有一些是:

Node.js 和底层 V8 引擎使用 International Components for Unicode (ICU)在本机 C/C++ 代码中实现这些功能。完整的 ICU 数据集默认由 Node.js 提供。但是,由于 ICU 数据文件的大小,在构建或运行 Node.js 时,提供了多个选项用于自定义 ICU 数据集。

构建 Node.js 的选项#

为了控制 ICU 在 Node.js 中的使用方式,编译期间有四个configure选项可用。有关如何编译 Node.js 的其他详细信息记录在BUILDING.md中。

  • --with-intl=none / --without-intl
  • --with-intl=system-icu
  • --with-intl=small-icu
  • --with-intl=full-icu(默认)

每个configure选项的可用 Node.js 和 JavaScript 功能概述 :

特征nonesystem-icusmall-icufull-icu
String.prototype.normalize()无(函数无操作)满的满的满的
String.prototype.to*Case()满的满的满的满的
Intl无(对象不存在)部分/完整(取决于操作系统)部分(仅限英语)满的
String.prototype.localeCompare()部分(不了解区域设置)满的满的满的
String.prototype.toLocale*Case()部分(不了解区域设置)满的满的满的
Number.prototype.toLocaleString()部分(不了解区域设置)部分/完整(取决于操作系统)部分(仅限英语)满的
Date.prototype.toLocale*String()部分(不了解区域设置)部分/完整(取决于操作系统)部分(仅限英语)满的
旧版 URL 解析器部分(不支持 IDN)满的满的满的
WHATWG URL 解析器部分(不支持 IDN)满的满的满的
require('node:buffer').transcode()无(函数不存在)满的满的满的
REPL 交互式编程环境部分(行编辑不准确)满的满的满的
require('node:util').TextDecoder部分(基本编码支持)部分/完整(取决于操作系统)部分(仅限 Unicode)满的
RegExp Unicode 属性转义无(无效的RegExp错误)满的满的满的

“(not locale-aware)”标志表示该函数执行其操作就像该函数的非Locale版本(如果存在)一样。例如,在none模式下,Date.prototype.toLocaleString()的操作与Date.prototype.toString()相同。

禁用所有国际化功能 ( none )#

如果选择此选项,ICU 将被禁用,并且上述大多数国际化功能将在生成的node二进制文件中不可用

使用预安装的 ICU 进行构建 ( system-icu )#

Node.js 可以链接到系统上已安装的 ICU 版本。事实上,大多数 Linux 发行版已经安装了 ICU,并且此选项可以重用操作系统中其他组件使用的同一组数据。

仅需要 ICU 库本身的功能,例如 String.prototype.normalize()WHATWG URL 解析器,在system-icu下得到完全支持。另外需要 ICU 区域设置数据的功能(例如Intl.DateTimeFormat 可能会得到完全或部分支持,具体取决于系统上安装的 ICU 数据的完整性。

嵌入一​​组有限的 ICU 数据 ( small-icu )#

此选项使生成的二进制链接静态地指向 ICU 库,并在node可执行文件中包含 ICU 数据的子集(通常只有英语区域设置)。

仅需要 ICU 库本身的功能,例如 String.prototype.normalize()WHATWG URL 解析器,在small-icu下得到完全支持。另外需要 ICU 区域设置数据的功能(例如Intl.DateTimeFormat通常仅适用于英语区域设置:

const january = new Date(9e8);
const english = new Intl.DateTimeFormat('en', { month: 'long' });
const spanish = new Intl.DateTimeFormat('es', { month: 'long' });

console.log(english.format(january));
// Prints "January"
console.log(spanish.format(january));
// Prints either "M01" or "January" on small-icu, depending on the user’s default locale
// Should print "enero" 

此模式提供了功能和二进制大小之间的平衡。

在运行时提供 ICU 数据#

如果使用small-icu选项,我们仍然可以在运行时提供额外的语言环境数据,以便 JS 方法适用于所有 ICU 语言环境。假设数据文件存储在/some/directory,则可以通过以下任一方式将其提供给 ICU:

  • NODE_ICU_DATA环境变量:

    env NODE_ICU_DATA=/some/directory node 
  • --icu-data-dir CLI参数:

    node --icu-data-dir=/some/directory 

(如果两者都指定,则--icu-data-dir CLI 参数优先。)

ICU能够自动查找并加载多种数据格式,但数据必须适合ICU版本,并且文件命名正确。数据文件最常见的名称是icudt6X[bl].dat,其中6X表示预期的 ICU 版本,而bl表示系统的字节序。查看ICU 用户指南中的“ICU 数据”文章,了解其他支持的格式以及有关 ICU 数据的更多详细信息。

full -icu npm 模块可以通过检测正在运行的node可执行文件的 ICU 版本并下载适当的数据文件来极大地简化 ICU 数据安装。通过npm i full-icu安装模块后,数据文件将在./node_modules/full-icu处可用。然后可以将此路径传递给NODE_ICU_DATA--icu-data-dir(如上所示)以启用完整的Intl支持。

嵌入整个 ICU ( full-icu )#

此选项使生成的二进制链接静态地指向 ICU,并包含完整的 ICU 数据集。以这种方式创建的二进制文件没有进一步的外部依赖项并支持所有语言环境,但可能相当大。如果没有传递--with-intl标志,则这是默认行为。官方的二进制文件也是以这种模式构建的。

检测国际化支持#

要验证 ICU 是否已启用(system-icusmall-icufull-icu ),只需检查Intl是否存在就足够了:

const hasICU = typeof Intl === 'object'; 

或者,检查process.versions.icu(仅在启用 ICU 时定义的属性)也有效:

const hasICU = typeof process.versions.icu === 'string'; 

要检查对非英语区域设置(即full-icusystem-icu)的支持,Intl.DateTimeFormat可能是一个很好的区分因素:

const hasFullICU = (() => {
  try {
    const january = new Date(9e8);
    const spanish = new Intl.DateTimeFormat('es', { month: 'long' });
    return spanish.format(january) === 'enero';
  } catch (err) {
    return false;
  }
})(); 

对于Intl支持的更详细测试,以下资源可能会有所帮助:

  • btest402:通常用于检查支持Intl的 Node.js 是否正确构建。
  • Test262:ECMAScript 的官方一致性测试套件包括专门针对 ECMA-402 的部分。

NodeJS中文文档为Read dev Docs平台提供托管,中文NodeJS文档均由英文版NodeJS文档翻译,版权属于nodejs.org