根据用户区域设置过滤字符串列表

解脂

当使用AngularJS 1.6处理JavaScript项目时,我有一个要过滤的字符串列表。例如,假设我的列表包含árbolcigüeñanidotubo

当用西班牙语过滤字符串时,如果我过滤了“ u”,我希望cigüeñatubo都出现,这对于西班牙人来说是最自然的结果。但是,德语不是这种情况-u和ü是不同的字母,因此德国人不希望在列表中看到cigüeña因此,我正在寻找一种使列表过滤了解用户语言环境的方法。

我碰巧有一个包含很多变音符号的对象,例如:

diacritics["á"] = "a";
diacritics["ü"] = "u";
// and so on...

这是我的过滤代码如下所示:

function matches(word, search) {
    var cleanWord = removeDiacritics(word.toLowerCase());
    var cleanSearch = removeDiacritics(search.toLowerCase());
    return cleanWord.indexOf(cleanSearch) > -1;
}

function removeDiacritics(word) {
    function match(a) {
        return diacritics[a] || a;
    }
    return text.replace(/[^\u0000-\u007E]/g, match);
}

上面的代码只是删除了所有变音符号,因此我想让它知道用户的语言环境。因此,我将match()函数更改为:

function match(a) {
    if (diacritics[a] && a.localeCompare(diacritics[a] === 0) {
        return diacritics[a];
    }
    return a;
}

不幸的是,这行不通。将“ u”和“ü”与德语和西班牙语语言环境进行比较时,localeCompare函数将返回相同的值,因此这里不是答案。我已经遍历了localeCompare方法参考,并尝试了用法和敏感性选项,但是它们在这里似乎并没有太大帮助。

我该如何调整我的代码才能正常工作?有没有可以为我正确处理此问题的库?

油菜

我将直接通过navigatorsrc从浏览器获取用户的语言环境,该对象代表用户代理:

var language = navigator.language;

language在我的情况下,这将分配用户浏览器的语言环境代码en-US我发现此站点有助于查找语言环境代码以测试世界其他地区。

我的strFromLocale功能与您的removeDiacritics功能相当

function strFromLocale(str) {
    function match(letter) {
        function letterMatch(letter, normalizedLetter) {
            var location = new Intl.Collator(language, {usage: 'search', sensitivity: 'base' }).compare(letter, normalizedLetter);
            return (location == 0)
        }
        normalizedLetter = letter.normalize('NFD').replace(/[\u0300-\u036f]/gi, "")
        if ( letterMatch(letter, normalizedLetter) ) {
            return normalizedLetter;
        } else {
            return letter;
        }
    }
    return str.replace(/[^\u0000-\u007E]/g, match);
}

注意带有Intl.Collatorsrc的行该行将变音符号与变音符号的规范化字母进行比较,并检查给定语言的字母的位置差异。因此:

/* English */
new Intl.Collator('en-US', {usage: 'search', sensitivity: 'base' }).compare('u', 'ü');
>>> 0

/* Swedish */
new Intl.Collator('sv', {usage: 'search', sensitivity: 'base' }).compare('u', 'ü');
>>> -1

/* German */
new Intl.Collator('de', {usage: 'search', sensitivity: 'base' }).compare('u', 'ü');
>>> -1

正如您在letterMatch函数中看到的那样,当且仅当结果为Intl.Collatoris时,它返回true 0,指示该语言的字母表中字母之间没有位置差异,这意味着可以安全替换。

这样,下面是对该strFromLocale功能的一些测试

var language = navigator.language; // en-US
strFromLocale("cigüeña");
>>> ciguena

var language = 'sv' // Swedish
strFromLocale("cigüeña");
>>> cigüena

var language = 'de' // German
strFromLocale("cigüeña");
>>> cigüena

var language = 'es-mx' // Spanish - Mexico
strFromLocale("cigüeña");
>>> cigueña

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章