当使用AngularJS 1.6处理JavaScript项目时,我有一个要过滤的字符串列表。例如,假设我的列表包含árbol,cigüeña,nido和tubo。
当用西班牙语过滤字符串时,如果我过滤了“ u”,我希望cigüeña和tubo都出现,这对于西班牙人来说是最自然的结果。但是,德语不是这种情况-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方法的参考,并尝试了用法和敏感性选项,但是它们在这里似乎并没有太大帮助。
我该如何调整我的代码才能正常工作?有没有可以为我正确处理此问题的库?
我将直接通过navigator
(src)从浏览器获取用户的语言环境,该对象代表用户代理:
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.Collator
(src)的行。该行将变音符号与变音符号的规范化字母进行比较,并检查给定语言的字母的位置差异。因此:
/* 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.Collator
is时,它返回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] 删除。
我来说两句