- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入 Node环境
- 子进程(Child processes)
- 集群(Cluster)
- 命令行选项
- 控制台(Console)
- 核心包(Corepack)
- 加密(Crypto)
- 调试器(Debugger)
- 已弃用的 API
- 诊断通道(Diagnostics Channel)
- 域名系统(DNS)
- 域(Domain)
- 错误(Errors)
- 事件(Events)
- 文件系统(File system)
- 全局变量(Globals)
- HTTP
- HTTP/2
- HTTPS
- 检查器(Inspector)
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:packages 模块
- 网络(Net)
- 系统(OS)
- 路径(Path)
- 性能挂钩(Performance hooks)
- 性能挂钩(Permissions)
- 进程(Process)
- Punycode 国际化域名编码
- 查询字符串(Query strings)
- 命令行库(Readline)
- REPL 交互式编程环境
- 诊断报告
- 单个可执行应用程序
- Stream 流
- 字符串解码器
- 单元测试
- 定时器(Timers)
- 传输层安全/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用程序
- V8
- 虚拟机
- WebAssembly
- Web加密 API(Web Crypto API)
- 网络流 API(Web Streams API)
- 工作线程(Worker threads)
- zlib
Node.js v18.18.2 文档
- Node.js v18.18.2
- ► 目录
-
►
索引
- 断言测试
- 异步上下文跟踪
- 异步钩子
- 缓冲(Buffer)
- C++ 插件
- 使用 Node-API 的 C/C++ 插件
- C++ 嵌入 Node环境
- 子进程(Child processes)
- 集群(Cluster)
- 命令行选项
- 控制台(Console)
- 核心包(Corepack)
- 加密(Crypto)
- 调试器(Debugger)
- 已弃用的 API
- 诊断通道(Diagnostics Channel)
- 域名系统(DNS)
- 域(Domain)
- 错误(Errors)
- 事件(Events)
- 文件系统(File system)
- 全局变量(Globals)
- HTTP
- HTTP/2
- HTTPS
- 检查器(Inspector)
- 国际化
- 模块:CommonJS 模块
- 模块:ECMAScript 模块
- 模块:
node:module
API - 模块:packages 模块
- 网络(Net)
- 系统(OS)
- 路径(Path)
- 性能挂钩(Performance hooks)
- 性能挂钩(Permissions)
- 进程(Process)
- Punycode 国际化域名编码
- 查询字符串(Query strings)
- 命令行库(Readline)
- REPL 交互式编程环境
- 诊断报告
- 单个可执行应用程序
- Stream 流
- 字符串解码器
- 单元测试
- 定时器(Timers)
- 传输层安全/SSL
- 跟踪事件
- TTY
- UDP/数据报
- URL
- 实用程序
- V8
- 虚拟机
- WebAssembly
- Web加密 API(Web Crypto API)
- 网络流 API(Web Streams API)
- 工作线程(Worker threads)
- zlib
- ► 其他版本
- ► 选项
目录
国际化支持#
Node.js 具有许多功能,使编写国际化程序变得更加容易。他们之中有一些是:
- ECMAScript 语言规范中的区域设置敏感或 Unicode 感知函数:
- ECMAScript 国际化 API 规范(又名 ECMA-402)
中描述的所有功能:
Intl
对象- 区域设置敏感的方法,例如
String.prototype.localeCompare()
和Date.prototype.toLocaleString()
- WHATWG URL 解析器的国际化域名(IDN) 支持
require('node:buffer').transcode()
- 更准确的REPL 交互式编程环境行编辑
require('node:util').TextDecoder
RegExp
Unicode 属性转义
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 功能概述
:
特征 | none | system-icu | small-icu | full-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 版本,而b
或l
表示系统的字节序。查看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-icu
、small-icu
或
full-icu
),只需检查Intl
是否存在就足够了:
const hasICU = typeof Intl === 'object';
或者,检查process.versions.icu
(仅在启用 ICU 时定义的属性)也有效:
const hasICU = typeof process.versions.icu === 'string';
要检查对非英语区域设置(即full-icu
或
system-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
支持的更详细测试,以下资源可能会有所帮助: