一、 Spring boot i18n 国际化实现Springboot 内置了i18n,无需引入额外pom依赖,需java代码+properties文件实现国家化通用工具类功能实现实现各个模块通用一套公用的国际化语言,实现在单独模块可定义独属于此模块的国际化语言。实现可以国际化文字中指定位置的内容动态化除了在配置文件中定义国际化语言,还要实现通过java代码动态批量向内存中注册国家化语言场景1、语言配置文件定义1.1 properties命名规范在common模块中的在resource包下新增messages_common_en_US.properties和messages_common_zh_US.properties两个文件。其他子模块中在resource包下新增message_en_US.properties和messages_zh_US.properties两个文件。当然也可以叫其他的名字,不过需要在“MessageSourceConfig ”类中将你的名字注册在代码中,以便程序方便扫描。如fileSource.setBasenames("messages","messages_commom");1.2 properties配置文件内容:说明key可以随便定义,最好自己定义一个规范,比如common模块的最好以common模块开头,其他模块则以其他模块的名称开头。key对应的值,在en_US文件中为英文,在zh_US中为中文;在字符串中某个位置动态替换动态值,则以{0},{1},{2} 这样占位,在调用时,会传入可变参,0,1,2 则是可变参对应的位置例如:messages_common_en_US.propertiescommon.system.error=Server exceptionmessages_common_zh_US.propertiescommon.system.error=服务器异常message_en_US.propertiesmodelname.check.storageFail=Storage failedmodelname.automaticrating.reqEngineFail=request{0}failed:{1}message_zh_US.propertiesmodelname.check.storageFail=存储失败modelname.automaticrating.reqEngineFail=请求{0}失败:{1}1.3 前后端交互注意:前端切换语言时,需要将当前语言放到请求体中的header中,后端需要根据语言来返回对应国际化文本;不管是ajax或是axios都有全局定义请求header的方法。{header:{"Accept-Language":"zh_CN"}}2 、工具类封装2.1 在common模块实现如下目录i18nserver-config--MessageSourceConfig.java-service--MapMessageSource-enumI18nKey.java-I18nUtil.java2.2 代码实现2.2.1 MessageSourceConfig.javaimportcom.hetao.i18nserver.service.MapMessageSource;importorg.springframework.context.MessageSource;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importorg.springframework.context.support.ResourceBundleMessageSource;/** * 多模块国际化资源加载配置 * 支持从properties 文件和java代码动态写入国际化消息 * 查找优先级: Map内存 properties 文件 * 各模块如需动态注册国家化消息,请注入MapMessageSource Bean * 示例见I18nRegistry.java */@ConfigurationpublicclassMessageSourceConfig{@BeanpublicMapMessageSourcemapMessageSource(){returnnewMapMessageSource();}@Primary@BeanpublicMessageSourcemessageSource(MapMessageSourcemapSource){// 1. 创建文件资源MessageSource 作为父级,优先级较低ResourceBundleMessageSourcefileSource=newResourceBundleMessageSource();fileSource.setBasenames("messages","messages_commom");fileSource.setDefaultEncoding("UTF-8");fileSource.setUseCodeAsDefaultMessage(true);// 2. 将文件资源设为MapMessageSource的父级mapSource.setParentMessageSource(fileSource);returnmapSource;}}2.2.2 MapMessageSource.javaimportorg.springframework.context.HierarchicalMessageSource;importorg.springframework.context.MessageSource;importorg.springframework.context.MessageSourceResolvable;importorg.springframework.context.NoSuchMessageException;importjava.text.MessageFormat;importjava.util.Collection;importjava.util.HashMap;importjava.util.Locale;importjava.util.Map;/** * 基于内存Map的MessageSource,允许通过java程序动态写入国际化文本 * 查找优先级:map内存 父MessageSource(properties文件) */publicclassMapMessageSourceimplementsHierarchicalMessageSource{privatefinalMapString,MapLocale,Stringmessages=newHashMap();privateMessageSourceparentMessageSource;@OverridepublicvoidsetParentMessageSource(MessageSourceparent){this.parentMessageSource=parent;}@OverridepublicMessageSourcegetParentMessageSource(){returnparentMessageSource;}publicvoidaddMessage(Stringkey,Localelocale,Stringtext){messages.computeIfAbsent(key,k-newHashMap()).put(locale,text);}publicvoidaddMessage(Stringkey,MapLocale,StringmessagesMap){