如何从Java代码中检测操作系统的语言(区域设置)

34

从Java代码中了解操作系统语言(区域设置)的正确方法是什么?

我已经尝试过

Locale.getDefault()
System.getProperties("user.language")

但是它们都不正确,实际上没有显示出可通过Windows命令"systeminfo"获得的"系统区域设置"。
4个回答

37

Windows XP的systeminfo命令会显示很多内容,但重要信息是:

System Locale:             en-us;English (United States)
Input Locale:              en-us;English (United States)
要在Java中获取等效的信息,请使用Locale.getDefault()获取Java正在使用的区域设置,并使用Locale对象上的方法(例如getCountry()getLanguage())获取详细信息。这些信息可用ISO代码和可读/显示名称。
请注意,Locale.getDefault()提供了Java从环境中获取的区域设置,但这可能与“系统”区域设置相同,也可能不同。要在Java中明确获取“系统”区域设置,需要执行特定于平台的操作。如果您真的需要该信息,则更简单的方法是确保Java使用系统区域设置启动...。
更新:显然,Java 7已更改了在Windows上确定getDefault()使用的区域设置信息的方式;请参见https://dev59.com/22w05IYBdhLWcg3wqzes#8319889

抱歉,我忘记提到了,我通过控制面板->区域和语言选项将我的语言设置更改为“法语”。当我运行上述代码时,它会正确地显示更改后的本地化设置为“fr”,但是当我运行“systeminfo”时,它仍然显示“en-US”作为系统和输入语言环境。 - Sudhir
你可能需要关闭命令提示符并重新打开。与许多 Windows 事物一样,“systeminfo”获取其显示的信息的来源并不完全清楚。 - Stephen C
如何确保Java使用系统语言环境启动? - Vlad Ilie
据我所知,你不能这样做。 - Stephen C

20

那么呢?

System.getProperty("user.country"); 
System.getProperty("user.language");

在我的情况下返回值为

user.country=DE

user.language=de

你可以轻松地从这些信息中生成区域设置。 区域设置是“语言代码_国家/地区代码”,所以在我的情况下是 de_DE


这与Locale.getDefault()有何区别? - NateS

10

使用默认语言环境如何?

Locale locale = Locale.getDefault();
String lang = locale.getDisplayLanguage();
String country = locale.getDisplayCountry();

这将根据Windows的systeminfo命令返回我当前的语言和国家。这是你要找的吗?(如果你想要语言/国家的两个字符代码,你可以使用getLanguage()getCountry())。


抱歉,我忘记提到了,我通过控制面板->区域和语言选项将我的语言设置更改为“法语”。当我运行上述代码时,它会正确地显示更改后的本地设置为“fr”,但是当我运行“systeminfo”时,它仍然显示系统和输入语言环境为“en-US”。 - Sudhir
所以我的问题是,这是因为“用户区域设置”和“系统区域设置”之间的差异,我们通过控制面板更改的是“用户区域设置”而不是“系统区域设置”,上面的代码返回“用户区域设置”?那么获取“系统区域设置”的方法是什么? - Sudhir

3

确切地说,您可以尝试以下代码:

public Locale getLocale() {
    if (this.locale == null) {
        this.locale = new Locale(System.getProperty("user.language"), System.getProperty("user.country"));
    }
    return this.locale;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接