You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非英语语言字母数字排序失效,更换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 03:32:45