语言特定的字符基本字母和排序

时间:2018-08-27 06:16:27

标签: javascript localization locale

我正在尝试打印出已排序的项目列表,并将每个项目的首字母打印为“组”标题。该代码在客户端使用。 。 排序工作得很好,问题在于在另一个语言环境中对特定于语言的字符进行排序时。例如,在大多数语言环境中,将å视作en-GB中的a,将ñ视作n。 有什么通用的方法可以确定字符是否“属于” js中的语言环境?

  • Åaen-US中以es-ES为基础,不应打印
  • Å应该以{{1​​}}
  • 打印
  • sv-SEÑn中以en-US为底,不应为 印刷
  • sv-SE应该以{{1​​}}
  • 打印

Link to jsbin

包括最简单的示例来显示问题:

Ñ

1 个答案:

答案 0 :(得分:0)

解决了以下so question

中的一些提示
console.clear();
var sortedItems;
var locales = ['en-US', 'es-ES', 'sv-SE', 'de-DE'];
var items = ['am', 'ån', 'ao', 'na', 'ñb', 'nc', 'ua', 'üb', 'uc', 'va' ];

strFromLocale = (str, locale) => {
    match = (letter) => {
        letterMatch = (letter, normalizedLetter) => {
            var location = new Intl.Collator(locale, { 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);
}


sortAlphabetically = (array, locale) => {
    const sortFunc = (a, b) => a.localeCompare(b, locale, { usage: 'search', sensitivity: 'base' });    
    return array.sort(sortFunc);
}

render = (sortedItems, locale) => {
    const processedLetters = {};
    const res = sortedItems.map((item, index) => {      
      const firstLetter = strFromLocale(item[0].toUpperCase(), locale);  

      if (!processedLetters[firstLetter]) {
        processedLetters[firstLetter] = true;
          console.log(firstLetter);
      }
      console.log(item);  
    });
}

locales.map(locale => {
    console.log('\n' + 'Using locale: ' + locale);
    sortedItems = sortAlphabetically(items, locale);
    render(sortedItems, locale);    
})