Java 如何根据message.properties检查区域设置
我正在使用hibernate和RestEasy API来创建服务器。我有3个属性文件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;如果输入错误,则输入错误消息。 但我不知道如何比较
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版本中出现的注释