【问题标题】:language specific chars base letter and sorting语言特定字符基本字母和排序
【发布时间】:2018-08-27 06:16:27
【问题描述】:

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

  • Åen-USes-ES 中有a 的基数,不应打印
  • Å 应打印在 sv-SE
  • Ñen-USsv-SE 中有n 的基数,不应该是 印刷
  • Ñ 应该打印在 es-ES

Link to jsbin

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

console.clear();
var sortedItems;
var uniqueStartLetters;
var locales = ['en-US', 'es-ES', 'sv-SE'];
var items = ['am', 'ån', 'ao', 'na', 'ñb', 'nc' ];

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

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

      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, uniqueStartLetters);
})

【问题讨论】:

  • 这是供客户端还是服务器端使用?
  • @RobbyCornelissen 这是客户端
  • Unicode CLDR 数据在其杂项信息中包含exemplarCharacters。这是misc file for Swedish。也许这有帮助?

标签: javascript localization locale


【解决方案1】:

通过以下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);    
})

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多