我使用hibernate创建了一个应用程序并使用注释来进行验证。 我意识到要将消息翻译成我的语言,我必须在资源文件夹中放入一个名为ValidationMessage_xx.properties的文件。问题是什么应该是默认语言,但我必须让访问者选择更改网站的语言,从而也改变验证的语言
添加我使用验证器的类代码
类示例{
@NotEmpty
private String fieldOne;
@NotEmpty
private String fieldTwo;
public String getFieldOne(){
return fieldOne;
}
public void setFieldOne(String fieldOne){
this.fieldOne = fieldOne
}
....
}
答案 0 :(得分:3)
默认语言环境(例如ValidationMessage.properties
)可以是您想要的任何语言,这完全取决于应用程序。因为我会说英语,所以我倾向于使该文件包含基于英语的翻译,并且我会根据需要扩展到其他语言。
至于选择适当的区域设置选择,您需要提供一种将应用程序层下游的值传递给验证框架的方法。
例如,您的应用程序可以设置线程局部变量,或者如果您使用spring,则使用LocalContextHolder
,这将允许您设置可以静态访问下游的特定于线程的Locale
在代码中。
根据我过去的经验,我们通常只有一个资源包,我们希望在与控制器和服务共享的bean验证中使用。我们为bean验证提供了一个解析器实现,它根据线程局部变量加载该资源包,并以这种方式公开国际化消息。
提供的示例:
// This class uses spring's LocaleContextHolder class to access the requested
// application Locale instead a ThreadLocal variable. See spring's javadocs
// for details on how to use LocaleContextHolder.
public class ContextualMessageInterpolator
extends ResourceBundleMessageInterpolator {
private static final String BUNDLE_NAME = "applicationMessages";
@Override
public ContextualMessageInterpolator() {
super( new PlatformResourceBundleLocator( BUNDLE_NAME ) );
}
@Override
public String interpolate(String template, Context context) {
return super.interpolate( template, context, LocaleContextHolder.getLocale() );
}
@Override
public String interpolate(String template, Context context, Locale locale) {
return super.interpolate( template, context, LocaleContextHolder.getLocale() );
}
}
下一步是您需要向Hibernate Validator提供ContextualMessageInterpolator
实例。这可以通过创建validation.xml
并将META-INF
置于类路径的根目录下来完成。在Web应用程序中,这将是WEB-INF/classes/META-INF
。
<validation-config
xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration"
version="1.1">
<message-interpolator>com.company.ContextualMessageInterpolator</message-interpolator>
</validation-config>
由于我使用applicationMessages
作为我的包名称,因此只需创建一个默认的applicationMessages.properties
文件和后续的特定于语言环境的版本,并将验证消息字符串添加到这些属性文件中。
javax.validation.constraints.NotNull.message=Field must not be empty.
javax.validation.constraints.Max.message=Field must be less-than or equal-to {value}.
javax.validation.constraints.Min.message=Field must be greater-than or equal-to {value}.
希望有所帮助。