2017-01-24 11 views
4

Javaでは、ロケールからLocale.LanguageRangeを作成する方法はありますか?現時点でJavaのロケールからLocale.LanguageRangeを作成する標準的な方法

私はこれを行う:

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

それは汚いし、非常に洗練感じています。

もっと良い方法や標準的な方法がありますか?私は1つを見つけることができませんでした。

最小限の作業例:

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

は、私は、構文の世話をLocaleからLanguageRangeを導出するnew LanguageRange(locale.toLanguageTag())を使用しています。

ただし、これをLocale.lookup()に入力すると、一致が制限されます(enの場合はen_GBが返されません)。

Iため、2段階機構になってしまった:要求されたロケールによって、すべてのシステムロケール

  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()); 
} 

注:findBestMatchnullを返す場合のデフォルトを考慮してください。

関連する問題