Spring Boot + Bootstrap + jQuery + Freemarker
原文地址:http://qilu.me/post/tech/2018-03-18
最近在寫一些Web的東西,技術上采用了Spring Boot + Bootstrap + jQuery + Freemarker。過程中查了大量的資料,也感受到了前端技術的分裂,每種東西都有N種實現,組合起來,每種解決方案的資料卻很有限。
這篇文章記錄下多語言國際化的實現,以支持中英文為例。
首先是頁面內容的國際化
1.定義頁面文本配置文件的路徑,在application.properties里添加spring.messages.basename=i18n/messages
2.在resources/目錄下創建上述目錄,添加3個配置文件messages.properties、messages_zh.properties、messages_en.properties,分別對應默認,中文和英文配置,完整路徑為resources/i18n/messages.properties
3.在配置文件里定義每條需要國際化的文本,比如中文 index.title=麥希工具 - 您身邊的助手,英文Meta Tool - Your Best Assistant
4.在Freemarker文件里使用<@spring.message ""/>來輸出文本,比如
再說下驗證內容的國際化
所謂驗證內容,就是比如在填Form表單的時候,有些字段有格式或數值等的要求,表單提交時,應該驗證數據是否符合要求。驗證又分前端驗證和后端驗證,一般結合使用。
前端用來驗證格式(必須是數字/英文/郵件)等,如:
這里pattern使用正則表達式,定義了輸入框輸入字符的范圍和數量。后端用來驗證數值(必須大於18歲)等,可以在Spring Boot的VO對象里,以添加注解的形式實現,如:
@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 ""/>顯示屬性驗證失敗的提示