在Java中获取操作系统语言

7

我在这里遇到了一种问题。

我是法国人,在英语版的Windows XP上工作。因此,我将区域选项设置为法语,但仍然使用英语语言UI。

我正在开发一个小型Java SE应用程序,并决定使用资源包对其进行国际化。

为了显示正确的语言,我使用以下函数创建bundle:

private static ResourceBundle bundle = ResourceBundle
          .getBundle("locale.Strings", Locale.getDefault());

但是Locale.getDefault()函数返回的是区域设置(即:法语),而不是系统界面语言。因此,在英语环境下,我的用户界面默认为法语。那真的不是我想要的...

有谁知道一种平台无关的方法来恢复系统界面语言吗?

提前感谢!

编辑:修正了Local到Locale,谢谢。


1
嗯,我觉得Java所做的是正确的事情。如果您将操作系统配置为法语首选项,但操作系统仍然以英语显示所有内容,而Java却不是,那么操作系统是错误的,而Java是正确的,不是吗?如果您希望所有内容都是英文,为什么不使用英文首选项进行配置呢? - JB Nizet
7
@JBNizet 这并不是一个罕见的要求。我是荷兰人,和 OP 一样,我更喜欢将 GUI 语言设置为英语,同时仍然希望数字格式和日期格式以我自己的语言环境显示(例如,美国的月份在前的日期对我来说很困惑,在我的大脑中需要额外的解析时间)。软件翻译通常很糟糕,尤其是在编程等英文术语的领域中,更是如此。 - Barend
@Barend Garvelink:没错!感谢您的理解。 - Redwarp
3
我是一名居住在法国的比利时人,母语为法语,我能基本理解您的论点。但如果我的操作系统说出类似“你好,今天是12月13日星期五”的话,我也觉得很奇怪。 - JB Nizet
@JB 在这里使用英文GUI。您可以配置Windows仍然显示“2012年6月”,但使用德语数字格式,公制测量单位,通常的日期和时间格式等。如果程序不经常查询错误的数据,然后默认为我的语言德语,我真的不会注意到任何分裂。可悲的是,这仍然不是一个常见的配置(尽管我相信许多非英语国家的程序员都有它),所以它经常被忽略。 - Voo
显示剩余2条评论
3个回答

7
这是Windows中的错误配置。 Locale#getDefault() 返回系统语言环境,而不是日期/时间格式区域或位置。
在下面这张针对Windows XP的截图中,您可以将区域选项语言设置为法语或其他任何语言。在高级菜单中的下拉菜单实际上设置了系统语言环境,应该将其设置为英语。 enter image description here 不可否认,这在Windows XP中解释得很差,Windows 7则做得更好: enter image description here

1
这并不是那么明显的。Java 7和之前的版本有所不同。此外,本地化和MUI版本的Windows可能也有所不同,但在这种情况下,我希望看到的是英语而不是法语。这很复杂 :) - Paweł Dyda

3

我很抱歉,我不能尝试它(因为我倾向于避免使用微软的任何产品),但是请看这些:

需要Java 7:

Locale uiLocale = Locale.getDefault(Locale.Category.DISPLAY);

无论如何,这就是应该用于获取翻译的方式(从Java 7开始)。

如果这并不是很有帮助,我会尝试:

System.out.println(System.getenv("LC_MESSAGES"));       
System.out.println(System.getenv("LANG"));
System.out.println(System.getenv("LANGUAGE"));

然而,在这种情况下,我期望与默认语言环境存在一些相似之处...

0

我根据您的建议尝试了一些方法,以下是我的观察:

  • 如果您使用的是Java 6而不是Java 7,则会出现问题。
  • 如果您使用的是Java 7,则应按照BalusC的建议更改区域和语言设置。之后,Locale.getDefault()将默认返回显示语言,如果您将其设置为英语,则表示为英语。为确保这一点,您可以通过调用Locale.getDefault(Locale.Category.DISPLAY)来创建您的语言环境。

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