navigator.language返回浏览器首选语言(如"zh-CN"),简单可靠但仅单值;navigator.languages返回完整偏好数组(如["zh-CN","zh","en-US"]),更全面但Safari兼容性需兜底;Intl.DateTimeFormat().resolvedOptions().locale推导实际生效locale,稳定但依赖JS;服务端Accept-Language头含权重信息,是SSR首屏唯一可靠来源。

直接用 navigator.language 或 navigator.languages 就能拿到,但得知道它们的区别和适用场景,不然容易出错或漏掉用户真实偏好。
最常用:navigator.language(简单可靠)
返回用户浏览器设置的首选语言,比如 "zh-CN" 或 "en-US"。它兼容性好,连老版 IE 都支持 navigator.userLanguage 作为备选。
- 写法示例:
const lang = navigator.language || navigator.userLanguage; - 适合快速判断主语言,但只给一个值,无法反映用户多语言排序偏好
- 注意:部分系统(如 macOS + Safari)可能返回操作系统的语言,而非浏览器显式设置的语言
更全面:navigator.languages(获取完整偏好列表)
返回一个数组,按用户在浏览器设置中排列的语言顺序列出,例如 ["zh-CN", "zh", "en-US", "en"]。这是目前最贴近用户真实偏好的方式。
- 写法示例:
const langs = navigator.languages || [navigator.language]; - 现代浏览器基本都支持,但 Safari 在某些版本中可能只返回空数组或单个值,建议加兜底
- 可用于实现“按顺序匹配支持语言”的逻辑,比如优先加载
zh-CN,不支持再试zh
更精准:Intl.DateTimeFormat().resolvedOptions().locale
借助国际化 API 推导出当前环境实际生效的区域设置,结果通常与系统/浏览器语言一致,且格式标准(如 "zh-Hans-CN")。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 写法示例:
const locale = Intl.DateTimeFormat().resolvedOptions().locale; - 不受 UA 伪造影响,稳定性高,但依赖 JS 运行时,禁用 JS 时不可用
- 注意:它反映的是格式化行为所用的 locale,不完全等同于“用户设置的语言”,但实践中高度重合
服务端配合:Accept-Language 请求头
前端拿不到这个值,但后端可通过 HTTP 请求头读取,比如 Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7。它带权重(q 值),语义最丰富。
- 适合 SSR 场景,在首屏 HTML 中注入语言信息,避免客户端 JS 加载前的闪动
- 若 JS 被禁用或首屏需直出内容,这是唯一可靠的来源
- 前端可配合 localStorage 缓存服务端传来的语言,后续请求直接复用
实际项目中建议组合使用:先查 navigator.languages,降级到 navigator.language,再用 Intl 校验;同时服务端提供 fallback,并允许用户手动切换并持久化选择。

















