etmvc中的国际化处理 - shuzheng/etmvc GitHub Wiki
etmvc框架在处理国际化上分两个部分,第一是在视图处理上,第二是在ActiveRecord(下简称AR)的数据验证信息处理上。
对于第一部分,可以使用目前成熟的技术,如JSTL等来处理I18N问题,所以在etmvc中并不对此重复制作轮子,etmvc中对国际化的处理主要集中在AR的数据验证信息处理上。AR的数据验证是通过验证注解应用在数据模型的字段上,而验证信息是通过注解中的message属性说明的。来看一个例子:
@Table(name="users")
public class User extends ActiveRecordBase{
@Id private Integer id;
@Column
@Length(min=0,max=10,message="数据长度非法,最多不超过10。")
private String name;
@Column private String pass;
@Column private String addr;
@Column private String email;
}
在对用户名称进行验证时,采用了@Length注解,我们设定最大长度为10,所以一旦超过这个长度,将获得由message指定的错误信息。
现在来测试一下:
User user = new User();
user.setName("1234567890123456");
user.validate();
for(String err : user.getErrors()) {
System.out.println(err);
}
运行时将获得“数据长度非法,最多不超过10。”的错误信息。
这种错误信息的设置方法采用了硬编码的方式,无法解决国际化问题。为了解决国际化问题,我们需要做以下的改造:
准备资源文件
解决I18N问题就需要制作资源文件,对于上面的例子,我们制作了res.properties, res_zh_CN.properties文件。
其中res.properties的内容如下:
user.name.length=user name length is invalid,the max length is {max}
在资源文件中可以通过{max},{min}等引用注解中的属性值。
设置数据模型中的message
数据模型中的验证信息message不能再用硬编码了,应该用资源文件中的key代替,前面的User类修改为:
@Table(name="users")
public class User extends ActiveRecordBase{
@Id private Integer id;
@Column
@Length(min=0,max=10,message="user.name.length")
private String name;
@Column private String pass;
@Column private String addr;
@Column private String email;
}
注意比较一下message的不同。
在AR中设置验证资源
调用ActiveRecordBase中的setValidatorResource方法来指定验证信息的获取是从那个资源文件中来的,如:
ResourceBundle resource = ResourceBundle.getBundle("pp.res");
ActiveRecordBase.setValidatorResource(resource);
User user = new User();
user.setName("1234567890123456");
user.validate();
for(String err : user.getErrors()) {
System.out.println(err);
}
运行后,将显示错误信息“用户名称长度不对,最大不超过10.“。
如此,我们将拥有国际化的能力了。