Java 如何根据message.properties检查区域设置

Java 如何根据message.properties检查区域设置,java,locale,resteasy,Java,Locale,Resteasy,我正在使用hibernate和RestEasy API来创建服务器。我有3个属性文件message.properties a、mesage_en-GB.properties和message_en.properties文件。 当我从客户端收到请求时,它在头参数中有locale。我需要对照我的属性文件检查此区域设置,即,如果它是en GB,则使用mesage_en-GB.properties;如果没有指定,则使用message.properties;如果输入错误,则输入错误消息。 但我不知道如何比较

我正在使用hibernate和RestEasy API来创建服务器。我有3个属性文件
message.properties a、mesage_en-GB.properties和message_en.properties
文件。 当我从客户端收到请求时,它在头参数中有locale。我需要对照我的属性文件检查此区域设置,即,如果它是en GB,则使用mesage_en-GB.properties;如果没有指定,则使用message.properties;如果输入错误,则输入错误消息。 但我不知道如何比较这些值。
请建议。

您需要在Spring配置中注册一个
LocaleChangeInterceptor
,并使用
标记输出消息

下面是一个很棒的演练:

PS
此机制可以在不同的服务器之间更改,在某些情况下,使用
可能是更好的选择。

如果由于某种原因无法由容器管理区域设置和捆绑包,则需要手动管理它们

我假设您的类路径中有属性文件

首先,您需要创建要使用的区域设置。例如,您从HTTP头中以字符串
fr
的形式获取语言,将其传递给Java7中的方法,或者使用Java6中的构造函数并获取Locale对象:

Locale locale = Locale.forLanguageTag(stringFromHeader) // since Java 7
Locale locale = new Locale(stringFromHeader) // prior to Java 7
然后将此区域设置传递给方法以获得正确的捆绑包:

ResourceBundle messages = ResourceBundle.getBundle("messages", locale);
然后调用ResourceBundle的方法来获取本地化字符串:

messages.getString("my_message")

要确保此方法100%有效,您可以按照以下简单步骤操作:

1) 在某处创建一个文件夹
tmp

2) 在该文件夹中创建包含以下内容的文件
A.java

import java.util.*;

public class A {

public static void main(String[] args) throws Exception {
  Locale locale = new Locale("en");
  ResourceBundle messages = ResourceBundle.getBundle("messages", locale);
  System.out.println(messages.getString("my_message"));
  locale = new Locale("fr");
  messages = ResourceBundle.getBundle("messages", locale);
  System.out.println(messages.getString("my_message"));
}   
}
my_message=hello
my_message=salut
3) 创建包含以下内容的文件
消息.属性

import java.util.*;

public class A {

public static void main(String[] args) throws Exception {
  Locale locale = new Locale("en");
  ResourceBundle messages = ResourceBundle.getBundle("messages", locale);
  System.out.println(messages.getString("my_message"));
  locale = new Locale("fr");
  messages = ResourceBundle.getBundle("messages", locale);
  System.out.println(messages.getString("my_message"));
}   
}
my_message=hello
my_message=salut
4) 创建包含以下内容的文件
消息\u fr.properties

import java.util.*;

public class A {

public static void main(String[] args) throws Exception {
  Locale locale = new Locale("en");
  ResourceBundle messages = ResourceBundle.getBundle("messages", locale);
  System.out.println(messages.getString("my_message"));
  locale = new Locale("fr");
  messages = ResourceBundle.getBundle("messages", locale);
  System.out.println(messages.getString("my_message"));
}   
}
my_message=hello
my_message=salut
5) 转到
tmp
文件夹并运行两个命令:

javac A.java
java -cp . A
输出为:

hello
salut
我希望这对你有用

附言:
这里有一条很棒的步行路线:

Qwe:谢谢你的回答。但这不是我所需要的。我想你不明白我的意思。事实上,我正在做一个测试,并根据客户端的语言环境给出结果。现在我需要比较区域设置(由客户端发送到)与message.properties或message_en-GB.prperties)。在问题的原始版本中,您说您使用的是Spring MVC,我理解正确,现在您使用的是RestEasy,我理解错误有一次,我错误地将其写为Spring MVC,对此表示抱歉。现在,你能建议我如何解决这个问题吗?因此,你通过RestEasy获得REST请求并接收HTTP头,在服务器端,你需要选择要使用的属性--我是否正确?是的..我需要将HTTP heaer与属性文件进行比较,并选择要选择的文件。这正是我正在做的。但是在Locale.forLanguageTag(stringFromHeader)的位置上,我使用新的Locale(stringFromHeader),即使我在stringFromHeader中获取xyz,也会从messages.properties文件中获取MSG。其次,我没有获取Locale.forLanguageTag()方法,对于本地class@Romi编辑了我的答案,添加了有关forLanguageTag()仅在最新Java版本中出现的注释