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.“。

如此,我们将拥有国际化的能力了。