Intl.DisplayNames 是浏览器和 Node.js(v18.0+)原生支持的国际化 API,可将 ISO 国家或语言代码同步转为本地化名称,无需依赖、零网络请求,需检测支持性并妥善处理降级与非法输入。

Intl.DisplayNames 是浏览器和 Node.js(v18.0+)原生支持的国际化 API,无需安装任何依赖,就能把 ISO 3166 国家代码(如 "CN"、"US")或 ISO 639 语言代码(如 "zh"、"en")异步转成对应语言环境下的本地化名称(比如在法语环境下显示 "Chine"、"États-Unis")。
确认运行环境支持
Intl.DisplayNames 在现代浏览器中已全面支持(Chrome 90+、Firefox 96+、Safari 15.4+),Node.js 需 v18.0 或更高版本。使用前可简单检测:
if (typeof Intl.DisplayNames === 'function') {
// ✅ 支持
} else {
// ❌ 降级方案(如静态映射表)
}
基础用法:同步生成 DisplayNames 实例
虽然 API 本身是同步构造的,但“异步转换”实际指:先按用户语言环境动态创建实例,再调用其 of() 方法——整个流程无需网络请求,零依赖、无 bundle 体积开销。
- 国家名称转换示例:
const countryNames = new Intl.DisplayNames('zh-CN', { type: 'region' });
console.log(countryNames.of('US')); // "美国"
console.log(countryNames.of('JP')); // "日本"
- 语言名称转换示例:
const langNames = new Intl.DisplayNames('ja-JP', { type: 'language' });
console.log(langNames.of('en')); // "英語"
console.log(langNames.of('fr')); // "フランス語"
动态适配用户语言:结合 navigator.language 或 i18n 框架
真实场景中,需根据用户当前语言环境(而非写死)创建实例。可封装为一个轻量函数:
function getLocalizedName(code, type = 'region', locale) {
const userLocale = locale || navigator.language || 'en-US';
try {
const dn = new Intl.DisplayNames(userLocale, { type });
return dn.of(code) || code; // fallback 到原始 code
} catch {
return code;
}
}
// 使用
getLocalizedName('DE', 'region'); // 如在 es-ES 下返回 "Alemania"
getLocalizedName('ko', 'language'); // 如在 pt-BR 下返回 "coreano"
注意:Intl.DisplayNames 构造时若 locale 不被完全支持(如 'zh-Hant-TW'),会自动降级到最接近的可用 locale(如 'zh-Hant' 或 'zh'),无需手动处理。
支持的类型与常见陷阱
目前 type 可选值有:'region'(国家/地区)、'language'、'script'(文字系统,如 'Latn' → "latin")、'currency'(需搭配 style: 'narrow' 等选项)。
- ❌ 错误:传入非法 code(如
'xyz')会返回undefined,务必加 fallback - ❌ 错误:混淆
language和region类型 ——'zh'是语言,'CN'是地区,不可混用 - ✅ 提示:对多语言应用,建议缓存不同 locale 的
Intl.DisplayNames实例,避免重复构造
不复杂但容易忽略:它不处理翻译逻辑,只做标准码表映射;所有数据来自 Unicode CLDR,权威且持续更新。


















