navigator.languages数组可获取用户语言偏好顺序,是构建权重表的原始依据;按精确匹配(100分)、语言主干匹配(70分)、回退匹配(40分)三级打分,生成带权重的预加载策略表。

直接用 navigator.languages 数组可以获取用户浏览器声明的语言偏好顺序,它比 navigator.language(仅返回首选语言)更完整、更具决策价值。这个数组天然就是“权重表”的原始依据——索引越靠前,用户倾向越强。
理解 navigator.languages 的结构与含义
该数组按用户系统/浏览器设置的优先级从高到低排列,例如:
-
["zh-CN", "en-US", "ja-JP"]表示用户首选简体中文,其次美式英语,最后日语 - 值为标准 BCP 47 标签(如
zh-Hans,es-419,fr-CA),支持区域与书写变体 - 部分旧版 Safari 可能只返回单元素数组,但现代 Chrome/Firefox/Edge 均稳定支持多语言列表
构建动态加载权重表的核心逻辑
权重不是简单递减数字,而应结合匹配粒度与业务策略。推荐按三级匹配打分:
-
精确匹配:语言+地区完全一致(如请求
zh-CN,用户列表含zh-CN)→ 权重 = 100 -
语言主干匹配:仅语言代码相同(如请求
zh-Hans,用户有zh-CN或zh-SG)→ 权重 = 70 -
回退匹配:仅语言前缀一致(如请求
en,用户有en-US、en-GB)→ 权重 = 40 - 未匹配语言 → 权重 = 0(不参与预加载或降级候选)
生成可执行的资源加载策略表
将权重映射为实际行为,例如在初始化 i18n 加载器时:
- 对每个已支持的 locale(如
["en-US", "zh-CN", "ja-JP", "es-ES"]),计算其对应权重 - 按权重排序,取前 N 个(如 Top 2)触发
<link rel="preload">预加载 - 权重为 0 的 locale 不生成 preload,仅在切换时按需 fetch
- 默认 fallback(如
en-US)始终保底加载,不依赖权重判断
代码片段示意(无框架依赖)
// 示例:生成带权重的候选语言列表
function buildLocaleWeights(supportedLocales) {<br> const userLangs = navigator.languages || [navigator.language];<br> return supportedLocales.map(locale => {<br> const score = userLangs.reduce((max, userLang) => {<br> if (userLang === locale) return Math.max(max, 100);<br> if (userLang.split('-')[0] === locale.split('-')[0]) {<br> return userLang.includes('-') && locale.includes('-') ? Math.max(max, 70) : Math.max(max, 40);<br> }<br> return max;<br> }, 0);<br> return { locale, weight: score };<br> }).filter(item => item.weight > 0).sort((a, b) => b.weight - a.weight);<br>}











