非英语语言字母数字排序失效,更换Locale后触发RangeError求助
解决多语言字母数字排序的Locale错误问题
问题原因
Liferay的ThemeDisplay.getLanguageId()返回的是Java风格的Locale格式(例如zh_CN、en_US),但ECMAScript的Intl.Collator要求使用BCP 47标准格式(例如zh-CN、en-US),直接传入不兼容的格式会触发Incorrect locale information provided错误。此外,部分小众语言的Locale可能不被当前浏览器环境支持,也会导致报错。
解决方案
通过格式转换+容错回退的方式解决,步骤如下:
- 将Liferay返回的Locale格式转换为Intl支持的标准格式(下划线替换为连字符)
- 检查当前环境是否支持转换后的Locale,不支持则回退到默认值(
undefined)
修改后的代码
// 获取Liferay语言ID并转换为Intl兼容格式 const liferayLangId = Liferay.ThemeDisplay.getLanguageId(); const normalizedLocale = liferayLangId.replace('_', '-'); // 验证Locale有效性,无效则回退到默认 const validLocale = Intl.Collator.supportedLocalesOf(normalizedLocale).length > 0 ? normalizedLocale : undefined; // 执行排序 alphanumericSortedValues.sort((a, b) => { const collator = new Intl.Collator(validLocale, { numeric: true, sensitivity: 'base' }); return collator.compare(a, b); });
调试技巧
如果仍有问题,先在浏览器控制台打印Liferay返回的语言ID,确认格式:
console.log(Liferay.ThemeDisplay.getLanguageId());
若输出是特殊格式(如包含多余后缀),可以进一步调整replace逻辑或添加正则处理,确保转换后的Locale符合BCP 47标准。
内容的提问来源于stack exchange,提问作者Sahana MH
相关产品推荐
相关产品推荐

