From 0ebca080365abb61886e8675c8f77b7596b376e3 Mon Sep 17 00:00:00 2001 From: Leilei332 Date: Fri, 14 Nov 2025 19:12:24 +0800 Subject: [PATCH] Update makeCompareFunction to support locale --- core/modules/utils/utils.js | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/core/modules/utils/utils.js b/core/modules/utils/utils.js index 951d2ccc8..96ca7b92b 100644 --- a/core/modules/utils/utils.js +++ b/core/modules/utils/utils.js @@ -1020,12 +1020,12 @@ exports.stringifyNumber = function(num) { return num + ""; }; -exports.makeCompareFunction = function(type,options) { - options = options || {}; +exports.makeCompareFunction = function(type,options = {}) { // set isCaseSensitive to true if not defined in options var isCaseSensitive = (options.isCaseSensitive === false) ? false : true, gt = options.invert ? -1 : +1, lt = options.invert ? +1 : -1, + locale = exports.checkLanguageCode(options.locale) ? options.locale : undefined, compare = function(a,b) { if(a > b) { return gt ; @@ -1043,11 +1043,8 @@ exports.makeCompareFunction = function(type,options) { return compare($tw.utils.parseInt(a),$tw.utils.parseInt(b)); }, "string": function(a,b) { - if(!isCaseSensitive) { - a = a.toLowerCase(); - b = b.toLowerCase(); - } - return compare("" + a,"" + b); + const sorter = Intl.Collator(locale, { sensitivity: isCaseSensitive ? "variant" : "accent" }); + return options.invert ? sorter.compare(b.toString(), a.toString()) : sorter.compare(a.toString(), b.toString()); }, "date": function(a,b) { var dateA = $tw.utils.parseDate(a), @@ -1064,11 +1061,8 @@ exports.makeCompareFunction = function(type,options) { return compare($tw.utils.compareVersions(a,b),0); }, "alphanumeric": function(a,b) { - if(!isCaseSensitive) { - a = a.toLowerCase(); - b = b.toLowerCase(); - } - return options.invert ? b.localeCompare(a,undefined,{numeric: true,sensitivity: "base"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: "base"}); + const sorter = Intl.Collator(locale, {numeric: true, sensitivity: isCaseSensitive ? "case" : "base"}); + return options.invert ? sorter.compare(b, a) : sorter.compare(a, b); } }; return (types[type] || types[options.defaultType] || types.number);