最近在写一些Web的东西,技术上采用了Spring Boot + Bootstrap + jQuery + Freemarker。过程当中查了大量的资料,也感觉到了前端技术的分裂,每种东西都有N种实现,组合起来,每种解决方案的资料却颇有限。html
这篇文章记录下多语言国际化的实现,以支持中英文为例。前端
1.定义页面文本配置文件的路径,在application.properties里添加spring.messages.basename=i18n/messages
java
2.在resources/目录下建立上述目录,添加3个配置文件messages.properties、messages_zh.properties、messages_en.properties,分别对应默认,中文和英文配置,完整路径为resources/i18n/messages.properties正则表达式
3.在配置文件里定义每条须要国际化的文本,好比中文 index.title=麦希工具 - 您身边的助手
,英文Meta Tool - Your Best Assistant
spring
4.在Freemarker文件里使用<@spring.message ""/>来输出文本,好比<title><@spring.message "index.title"/></title>
后端
所谓验证内容,就是好比在填Form表单的时候,有些字段有格式或数值等的要求,表单提交时,应该验证数据是否符合要求。验证又分前端验证和后端验证,通常结合使用。app
前端用来验证格式(必须是数字/英文/邮件)等,如:ide
<input type="text" name="height" id="height" class="form-control col-2" placeholder="" pattern="^[1-9][0-9]{2}$" required>
这里pattern使用正则表达式,定义了输入框输入字符的范围和数量。工具
后端用来验证数值(必须大于18岁)等,能够在Spring Boot的VO对象里,以添加注解的形式实现,如:ui
@Min(value = 100, message = "不能低于100cm") @Max(value = 250, message = "不能高于250cm") private String height;
这里就出现了问题,即注解也应该采用配置文件的形式,以支持多语言切换,这就是验证内容的国际化。
1.定义验证文本配置文件的路径,在application.properties里添加spring.messages.basename=i18n/messages,i18n/ValidationMessages
,前面的是第一节的页面文本,后面的是验证文本
2.在resources/目录下建立上述目录,添加3个配置文件ValidationMessages.properties、ValidationMessages_zh.properties、ValidationMessages_en.properties,分别对应默认,中文和英文配置,完整路径为resources/i18n/ValidationMessages.properties
3.在配置文件里定义每条须要国际化的文本,好比中文 vm.bmi.height.lower=不能低于100cm
,英文vm.bmi.height.lower=Can Not Lower Than 100cm
4.与页面文本相比,这里要多作一步,即在代码里覆盖默认验证器的配置,在代码根目录添加如下文件:
@Configuration public class CustomConfiguration implements WebMvcConfigurer { @Autowired private MessageSource messageSource; @Override public Validator getValidator() { return localValidatorFactoryBean(); } @Bean public LocalValidatorFactoryBean localValidatorFactoryBean() { LocalValidatorFactoryBean validator = new LocalValidatorFactoryBean(); validator.setValidationMessageSource(messageSource); return validator; } }
5.在接收表达的VO对象的属性上,使用验证文本做为提示
public class BmiVo { @Min(value = 100, message = "{vm.bmi.height.lower}") @Max(value = 250, message = "{vm.bmi.height.upper}") private String height;
6.在表单上添加验证失败后的提示,使用<@spring.bind "" />绑定VO对象的属性,使用<@spring.showErrors ""/>显示属性验证失败的提示
<div id="div-height" class="form-group form-row align-items-center"> <@spring.bind "vo.height" /> <label for="height" class="col-form-label text-center offset-3 col-2"><@spring.message "bmi.height"/></label> <input type="text" name="height" id="height" class="form-control col-2" placeholder="" pattern="^[1-9][0-9]{2}$" required> <span class="text-primary text-center col-1">cm</span> <span class="text-danger col-4"><@spring.showErrors ""/></span> </div>
这样就作到了页面内容和验证内容的多语言国际化支持,具体示例参看Meta Tool