java – 检测浏览器区域设置/语言并生成输出

我们有一个
Java应用程序,可根据浏览器语言设置在用户的浏览器会话中呈现本地化文本.该应用程序读取浏览器语言设置[在请求应用程序中的标题内设置]并准备本地化文本.

但最近我们遇到了Mozilla 5.0版浏览器的问题.注意我们的代码在IE中工作正常.举一个’ja’语言的例子,我们期待浏览器将接受的语言发送为’ja-JP'[IE所做的] – 但不幸的是Mozilla(FF)没有 – 它只发送浏览器接受的语言为’ja’.因此,我们使用默认语言生成内容.

因为我们提供相同的修复 – 基本上类似于地图[语言代码到语言 – 国家代码],如”ja’到’ja-JP’,然后创建一个新的语言环境[仅当有2位数字语言代码后才出现请求] – 我的问题是针对其他浏览器的

苹果浏览器
等等
标题中发送的语言格式是什么?
所以有一个阵列说这样
ja-JP = ja-JP
ja = ja-JP
并将浏览器语言映射到语言国家/地区代码将有助于解决问题.但是,我们需要解决的是否有任何特定的约束 – 比如是否有多个地方使用的语言 – 如果有,那么我们将如何应对?
还有其他我们需要注意的事情吗?
提前致谢.

最佳答案 查看java.util.ResourceBundle类,主要是getBundle()方法. (您可以使用它,或者自己实现类似的机制.)

原则上,您具有区域设置层次结构,并且只要不特别支持区域设置,您就会回退到父区域设置.在您的情况下,“ja_JP”(在Java表示法中)具有父语言环境“ja”,而父语言环境又具有父语言环境“”.

由于大多数日语页面并非特定于日本,因此您通常会为ja完成所有日语翻译,并且只有当特殊情况仅对日本的日本用户有效时,才会有ja_JP.如果某个用户发送了jp_US,那么你也没有问题,因为他在美国使用日语.

如果您只想使用Java ResourceBundle机制来指示我们拥有数据的区域设置,您可以创建(例如)这些(空)文件:

> MyLocale.properties – 对应于“”Locale
> MyLocale_de.properties – 对应“de”Locale(德语)
> MyLocale_en.properties – 对应“en”Locale(英语)
> MyLocale_ja.properties – 对应“ja”Locale(日语)

然后在你的程序中你会写

Locale rLocale = request.getLocale();
ResourceBundle bundle = ResourceBundle.getBundle("MyLocale", rLocale);
Locale selectedLocale = bundle.getLocale();

现在selectedLocale肯定是“”,“de”,“en”,“jp”之一,无论rLocale是什么语言环境.例如,对于“en”,“en_GB”,“en_US”在所有情况下都会选择“en”,“ja”和“ja_JP”都会产生“ja”,而“de_DE”和“de_AT”都会产生导致“de”,“it_IT”,“eo”和大多数其他语言环境将导致“”.

执行此操作的“正确的Java方式”:
您不会向您的捆绑包询问其Locale,而只是将捆绑包用作ResourceBundle,从中获取本地化资源.所以,当你需要一些文字时,你就可以了

 String text = bundle.getText("greeting.hello");

然后输出文本.有时您会使用MessageFormat格式化插入值的文本(或Formatter). (当然,您的属性文件不会为空,但包含以下行:

 greeting.hello = Hello World!

(在英文文件中)

 greeting.hello = Hallo Welt!

(在德国文件中)

请注意,浏览器通常不仅会发送一个Locale代码,还会发送一个首选代码列表.所以你实际上应该对这些代码执行“捆绑搜索”,然后选择第一个返回除“”之外的东西,并且只有在没有请求的语言匹配时才回退到“”. (例如,我的浏览器发送“eo”,“de_DE”,“de”,“en”.由于大多数网站不支持世界语,因此它们会回归德语(如果可用且选择正确实施),或者默认语言(如果它们只查看第一个条目)).

点赞