SpringBoot中的国际化
在国际化项目中,需要考虑对特定语言环境下的前端请求,返回特定语言的操作结果信息。如在中文环境下,后端返回操作成功信息:“操作成功”;在英文环境下,后端返回操作成功信息:“success”;
本文将以UAC项目为例,讲解在SpringBoot项目中如何实现国际化。
一、项目国际化配置
1. 添加国际化处理器
在项目中添加信息国际化处理器:MessageSourceHandler;
MessageSourceHandler源码:
package com.uac.handler; import org.springframework.context.MessageSource; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** * @author wxy */ @Component public class MessageSourceHandler { @Resource private HttpServletRequest request; @Resource private MessageSource messageSource; public String getMessage(String messageKey) { return messageSource.getMessage(messageKey, null, request.getLocale()); } }
其中MessageSource为SpringBoot自带组件;引入HttpServletRequest目的是从前端请求中获取当前请求的语言环境信息。
2. 添加国际化配置文件
在项目resources目录下新增名为i18n的文件夹,i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在i18n目录下添加Resource Bundle,如下图:
可根据项目实际情况增加语种,本例中默认语种设为中文,另增加了英语和繁体中文,共三个语种配置文件;在项目后期开发过程中如需增加新的语种,在Resource Bundle中新增对应语种的配置文件即可。
默认语种messages.properties配置国际化字段:
message.success=操作成功 message.fail=操作失败
美式英语messages_en_US.properties中国际化配置:
message.success=success message.fail=request was aborted
繁体中文messages_zh_TW.properties中国际化配置:
message.success=操作成功 message.fail=請求失敗
在项目配置文件 application.yml 中填写国际化配置文件的相对路径,表示读取i18n文件夹下前缀为messages的配置文件,编码设置为UTF-8以防止出现中文乱码情况,所有语种的messages.properties配置文件也要设置为以UTF-8编码格式保存。
application.yml中国际化配置:
spring: messages: basename: i18n/messages encoding: UTF-8
二、返回值枚举类中使用国际化
返回值枚举类中定义的message为messages.properties中的定义的key。通过静态内部类的方式将国际化处理器MessageSourceHandler 注入,在getMessage()方法中调用国际化处理器:return messageSourceHandler.getMessage(message),实现根据请求中的特定语言环境动态返回相应的操作信息。
定义返回枚举类国际化配置:
package com.uac.enumeration; import com.uac.handler.MessageSourceHandler; import lombok.Getter; import lombok.Setter; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.EnumSet; /** * @author linksfield */ public enum RespEnum { success("0000", "message.success"), fail("9999", "message.fail"); @Getter private String code; private String message; @Setter private MessageSourceHandler messageSourceHandler; public String getMessage() { return messageSourceHandler.getMessage(message); } /** * 通过静态内部类的方式注入bean,并赋值到枚举中 */ @Component public static class ReportTypeServiceInjector { // 引入国际化处理类 @Resource private MessageSourceHandler messageSourceHandler; @PostConstruct public void postConstruct() { for (RespEnum resp : EnumSet.allOf(RespEnum.class)) { resp.setMessageSourceHandler(messageSourceHandler); } } } RespEnum(String code, String message) { this.code = code; this.message = message; } }
三、多模块项目中配置国际化
在多个module组成的SpringBoot项目中,可以为每个module单独配置属于自己的国际化资源。
1. 模块单独添加国际化配置文件
每个module单独配置一套配置文件;需要注意的是:配置文件basename不能出现重复,否则会出现配置文件被其他模块的同名配置文件屏蔽的情况!这里建议使用各个module的模块名作为配置文件的basename,既避免出现重复,又逻辑清晰优雅。
2. 配置查找国际化资源路径
在程序入口所在包下application.yml配置文件中,配置所引用的module中的国际化路径,通过“,”来配置多个module的国际化资源文件。如下所示:
application.yml中多module国际化配置:
spring: messages: basename: i18n/common,i18n/publicRes,i18n/roleRight,i18n/userMng encoding: UTF-8