React Native 0.83 使用 TurboModules 新架构后,传统的 locale 检测 API(I18nManager、SettingsManager)不再可用,需改用 Hermes 引擎的 Intl API。
概述
在 React Native 旧架构中,检测系统语言常用两种方式:
I18nManager.getConstants().localeIdentifier(如返回zh_Hans_CN)NativeModules.SettingsManager.settings.AppleLocale(iOS 专用)
升级到 RN 0.83(TurboModules 新架构)后,这两个 API 均失效:
I18nManager.getConstants()只返回{ isRTL, doLeftAndRightSwapInRTL },无localeIdentifierNativeModules.SettingsManager?.settings返回undefined
用法
使用 Hermes 引擎内置的 Intl API,不依赖任何原生模块:
function getSystemLocale(): string | undefined {
try {
return Intl.DateTimeFormat().resolvedOptions().locale
} catch {
return undefined
}
}
返回值示例:
- 中文简体系统:
zh-CN - 中文繁体系统:
zh-TW或zh-Hant - 英文系统:
en-US
配合语言匹配逻辑:
function matchLanguage(locale: string | undefined): 'cn' | 'tw' | 'en' {
const normalized = locale?.toLowerCase().replace(/_/g, '-')
if (
normalized?.startsWith('zh-hant') ||
normalized?.startsWith('zh-tw') ||
normalized?.startsWith('zh-hk')
) {
return 'tw'
}
return normalized?.startsWith('zh') ? 'cn' : 'en'
}
注意事项
IntlAPI 在 Hermes 引擎中可用,但在 JSC(JavaScriptCore)中可能不完整- 该 API 在 JS 模块加载时即可同步调用,不存在 bridge 初始化时序问题
Intl.DateTimeFormat().resolvedOptions().locale返回的格式已经是 BCP 47 标准(如zh-CN),无需额外规范化
版本说明
本页基于 React Native 0.83.2 + Hermes 引擎。旧架构(Bridge 模式)下 I18nManager.localeIdentifier 仍可用。
参见
- React Native
参考
- SaltyFlame HAT-398 调试过程(2026-04-28),通过
console.log(I18nManager.getConstants())实测确认 API 返回值 - React Native New Architecture: https://reactnative.dev/docs/new-architecture-intro