2017-01-24 6 views
4

В Java есть способ создать Locale.LanguageRange из локали?Стандартный способ создания Locale.LanguageRange из локали в Java

В настоящее время я делаю это:

List<LanguageRange> ranges = 
     Locale.LanguageRange.parse(
       locale.toString() // locale.toString() gives en_GB 
       .replace('_', '-') // parse() needs en-GB 
       + ";q=1.0");  // weight 

Он чувствует себя грязным и очень безвкусный.

Есть ли лучший или даже стандартный способ сделать это? Я не смог его найти.

Минимальный рабочий пример:

import java.util.Collection; 
import java.util.List; 
import java.util.Locale; 
import java.util.Locale.LanguageRange; 

public class LanguageUtil { 
     public static Locale getClosestMatch(Locale locale, Locale defaultLocale, Collection<Locale> allowedLanguages) { 
      List<LanguageRange> ranges = Locale.LanguageRange.parse(
        locale.toString().replace('_', '-') + ";q=1.0," +   //exact match e.g. en-GB -> en-GB 
        locale.getLanguage() + ";q=0.5," +       //close match e.g. en-US -> en-GB 
        defaultLocale.toString().replace('_', '-') + ";q=0.0")); //default match e.g. fr-FR -> en-GB 
      return Locale.filter(ranges, allowedLanguages).get(0); 
     } 
    } 

ответ

2

Я использую new LanguageRange(locale.toLanguageTag()) вывести LanguageRange из Locale, который заботится о синтаксисе.

Однако, подавая это на Locale.lookup(), соответствие является ограничительным (оно не вернет en_GB для en).

поэтому я закончил с двухступенчатый механизмом:

  1. filter всех системных локалями запрашиваемых локалями
  2. lookup лучший матч из списка результатов шага 1 против поддерживаемых локалей

Исходный код:

List<Locale> allAvailableLocales = Arrays.asList(Locale.getAvailableLocales()); 

private Locale findBestMatch(final List<Locale> requested, final List<Locale> supported) { 
    final List<LanguageRange> languageRanges = toLanguageRanges(requested); 

    final List<Locale> allMatches = Locale.filter(languageRanges, allAvailableLocales); 
    final Locale bestMatch = Locale.lookup(toLanguageRanges(allMatches), supported); 

    return bestMatch; 
} 

private static List<LanguageRange> toLanguageRanges(final List<Locale> locales) { 
    final ArrayList<LanguageRange> languageRanges = new ArrayList<>(); 
    for (final Locale locale : locales) { 
     languageRanges.add(toLanguageRange(locale)); 
    } 
    return languageRanges; 
} 

private static LanguageRange toLanguageRange(final Locale locale) { 
    return new LanguageRange(locale.toLanguageTag()); 
} 

Примечание: рассмотрите значение по умолчанию в случае, если findBestMatch возвращает null.

 Смежные вопросы

  • Нет связанных вопросов^_^