Канонический способ сравнения локалей как подмножеств друг друга - PullRequest
2 голосов
/ 23 января 2020

Предположим, у меня есть локаль, сохраненная в некоторой конфигурации в любом формате, из которого я могу получить объект Locale. Затем мне нужно проверить, что текущим Locale является этот языковой стандарт или подмножество этого языкового стандарта .

Итак, по сути, я ищу метод isSubsetLocale(Locale currentLocale, Locale configLocale) с этими свойствами:

isSubsetLocale(Locale.forLanguageTag("en-US"), Locale.forLanguageTag("en")) == true;
isSubsetLocale(Locale.forLanguageTag("en-US"), Locale.forLanguageTag("en-US")) == true;
isSubsetLocale(Locale.forLanguageTag("de-CH"), Locale.forLanguageTag("en")) == false;

// or even
isSubsetLocale(Locale.forLanguageTag("en-US"), Locale.forLanguageTag("")) == true;

Я понимаю, что в 99% случаев я могу просто проверить, является ли локаль конфигурации префиксом текущей локали, но мне интересно, есть ли еще идиоматические c способ сделать это.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Это может работать:

public static boolean isSubsetLocale(Locale locale1, Locale locale2) {
    String tag1 = locale1.toLanguageTag();
    String tag2 = locale2.toLanguageTag();
    if (tag1.equals("und"))
        tag1 = "";
    if (tag2.equals("und"))
        tag2 = "";
    return tag1.startsWith(tag2);
}

Тест

System.out.println(isSubsetLocale(Locale.forLanguageTag("en-US"), Locale.forLanguageTag("en")));
System.out.println(isSubsetLocale(Locale.forLanguageTag("en-US"), Locale.forLanguageTag("en-US")));
System.out.println(isSubsetLocale(Locale.forLanguageTag("de-CH"), Locale.forLanguageTag("en")));

System.out.println(isSubsetLocale(Locale.forLanguageTag("en-US"), Locale.forLanguageTag("")));
System.out.println(isSubsetLocale(Locale.forLanguageTag("en"), Locale.forLanguageTag("en-US")));

Выход

true
true
false
true
false
0 голосов
/ 23 января 2020

Вам нужно что-то большее, чем locale.getLanguage() для сравнения? Это даст вам префикс для сравнения.

Locale.forLanguageTag("en-US").getLanguage().equals(Locale.forLanguageTag("en").getLanguage()) //true;
...