Java 将区域设置作为彼此的子集进行比较的规范方法

Java 将区域设置作为彼此的子集进行比较的规范方法,java,locale,Java,Locale,假设我有一个区域设置以任何格式存储在某个配置中,我可以从中获取locale对象。然后,我需要检查当前的区域设置是该区域设置还是该区域设置的子集 因此,本质上,我要寻找的是一个具有以下属性的方法isSubsetLocale(Locale currentLocale,Locale configLocale): isSubsetLocale(Locale.forLanguageTag("en-US"), Locale.forLanguageTag("en")) == true; isSubsetLoc

假设我有一个区域设置以任何格式存储在某个配置中,我可以从中获取
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%的情况下,我只需检查配置语言环境是否是当前语言环境的前缀,但我想知道是否有更惯用的方法来进行比较。

是否需要比
locale.getLanguage()
更多的东西来进行比较?这将为您提供用于比较的前缀

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

您是否需要比locale.getLanguage()更多的东西来进行比较?这将为您提供用于比较的前缀

Locale.forLanguageTag("en-US").getLanguage().equals(Locale.forLanguageTag("en").getLanguage()) //true;
这可能会奏效:

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);
}
试验

输出

true
真的
假的
真的
假的
这可能有效:

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);
}
试验

输出

true
真的
假的
真的
假的


似乎是一个寻找标准化方法的好地方。@AndyTurner我知道这个标准的存在,但也许它确实有意义去寻找它的实现。@AndyTurner我已经找到了它,似乎我正在寻找的是。谢谢你的提示!这似乎是一个寻找标准化方法的好地方。@AndyTurner我知道这个标准的存在,但也许它确实有意义去寻找它的实现。@AndyTurner我已经查过了,似乎我正在寻找的是。谢谢你的提示!是的,配置可以定义具有不同“特定性”级别的区域设置。问题中的最后一个测试用例失败。--对于
isSubsetLocale(Locale.forLanguageTag(“en”)、Locale.forLanguageTag(“en-US”)==false,也将失败是的,配置可以定义具有不同“指定性”级别的区域设置。问题中的最后一个测试用例失败。--对于
isSubsetLocale(Locale.forLanguageTag(“en”)、Locale.forLanguageTag(“en-US”)==false,也将失败我在Q中提到过这种解决方案,但我希望能够有一些经过测试的(希望是标准库)实现来处理所有的边缘情况,但是如果没有,我将不得不编写类似的代码indeed@DmitryGinzburg什么边缘案例?如果你问的是边缘案例,你应该在问题中提到这一点。在问题中显示您正在谈论的边缘情况。我没有想到任何具体的情况,但是,例如,我不知道这个
“”->“und”
映射。也许在实施之前,我还需要注意一些事情this@DmitryGinzburg如果按字母顺序列出JVM已知的所有语言环境,您将看到所有子集都是前缀子集。例如,运行以下命令:
Arrays.stream(Locale.getavailablecales()).map(Locale::toLanguageTag).sorted().forEach(System.out::println)---的javadoc中列出了
und
异常。无论如何,我要找的东西似乎有一个内置的功能:docs.oracle.com/javase/tutorial/i18n/locale/matching.htmlI我在Q中提到过这种解决方案,但我希望能有一些经过测试的(希望是标准库)处理所有边缘情况的实现,但如果没有,我将不得不编写类似的代码indeed@DmitryGinzburg什么边缘案例?如果你问的是边缘案例,你应该在问题中提到这一点。在问题中显示您正在谈论的边缘情况。我没有想到任何具体的情况,但是,例如,我不知道这个
“”->“und”
映射。也许在实施之前,我还需要注意一些事情this@DmitryGinzburg如果按字母顺序列出JVM已知的所有语言环境,您将看到所有子集都是前缀子集。例如,运行以下命令:
Arrays.stream(Locale.getavailablecales()).map(Locale::toLanguageTag).sorted().forEach(System.out::println)---的javadoc中列出了
und
异常。无论如何,我要找的东西似乎有一个内置的功能:docs.oracle.com/javase/tutorial/i18n/locale/matching.html