Springboot支持国际化很简单,只需要简单的配置就可以使用了,下面是一个简单的后端国际化Demo
项目结构图
代码清单:
创建国际化资源 i18n 文件夹,在下面创建三个配置文件分别是:messages.properties,messages_en_US.properties ,messages_zh_CN.properties,内容分别为:
#注意中文的编码方式为ASCII
success.message=成功
success.message=success
success.message=成功
修改配置文件,指定国际化资源路径和编码
spring.messages.basename=i18n/messages
spring.messages.encoding=utf-8
创建国际化配置 WebConfig.java 实现 WebMvcConfigurer 接口
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}
}
创建MyLocaleResolver.java实现LocaleResolver接口 ,通过http请求头添加语言字段来判断当前的语言环境
public class MyLocaleResolver implements LocaleResolver {
private static final String LANG = "lang";
private static final String LANG_SESSION = "lang_session";
public static final String DELIMITER = "_";
@Override
public Locale resolveLocale(HttpServletRequest request) {
String lang = request.getHeader(LANG);
//默认语言 简体中文
Locale locale = Locale.CHINA;
if (StringUtils.isNotBlank(lang) && lang.contains(DELIMITER)) {
String[] langueagea = lang.split(DELIMITER);
locale = new Locale(langueagea[0], langueagea[1]);
HttpSession session = request.getSession();
session.setAttribute(LANG_SESSION, locale);
} else {
HttpSession session = request.getSession();
Locale localeInSession = (Locale) session.getAttribute(LANG_SESSION);
if (localeInSession != null) {
locale = localeInSession;
}
}
return locale;
}
@Override
public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {
}
}
创建i18n配置文件 MessageConfig.java ,读取i18n目录下的资源
@PropertySource(value = {
"classpath:i18n/messages*.properties"})
public class MessageConfig {
/**
* 国际化信息map
*/
private static final Map<String, ResourceBundle> MESSAGES = new HashMap<>();
/**
* 获取国际化信息
* 只配置了 zh en 语言
*/
public static String getMessage(String key) {
//获取当前语言环境
Locale locale = LocaleContextHolder.getLocale();
if (!Locale.CHINA.getLanguage().equals(locale.getLanguage())
&& !Locale.ENGLISH.getLanguage().equals(locale.getLanguage())) {
//其他语言一律为中文
locale = Locale.CHINA;
}
ResourceBundle message = MESSAGES.get(locale.getLanguage());
if (message == null) {
//根据语言读取配置
message = MESSAGES.get(locale.getLanguage());
if (message == null) {
message = ResourceBundle.getBundle("i18n/messages", locale);
MESSAGES.put(locale.getLanguage(), message);
}
}
return message.getString(key);
}
/**
* 清除国际化信息
*/
public static void flushMessage() {
MESSAGES.clear();
}
}
创建LoginEnum.java枚举,根据语言环境返回对应语言的提示信息
public enum LoginEnum {
/**
* 成功
*/
SUCCESS(1, "成功", "success"),
;
public Integer code;
public String desc;
public String descEn;
LoginEnum(Integer code, String desc, String descEn) {
this.code = code;
this.desc = desc;
this.descEn = descEn;
}
public static String getMessage(Integer key) {
LoginEnum loginEnum = null;
LoginEnum[] values = LoginEnum.values();
for (LoginEnum object : values) {
if (object.code.equals(key)) {
loginEnum = object;
}
}
//获取当前语言环境
Locale locale = LocaleContextHolder.getLocale();
if (!Locale.CHINA.getLanguage().equals(locale.getLanguage())
&& !Locale.ENGLISH.getLanguage().equals(locale.getLanguage())) {
//其他语言一律为中文
locale = Locale.CHINA;
}
if (loginEnum == null) {
return "未知";
}
if (locale.getLanguage().equals(Locale.CHINA.getLanguage())) {
return loginEnum.desc;
} else {
return loginEnum.descEn;
}
}
}
创建测试接口 LoginController.java
@RestController
public class LoginController {
/**
* 获取枚举中的提示信息
*/
@GetMapping("/login1")
public String login1() {
return "login1 " + LoginEnum.getMessage(1);
}
/**
* 根据key获取配置文件中的信息
*/
@GetMapping("/login2")
public String login2() {
return "login2 " + MessageConfig.getMessage("success.message");
}
}
通过postman调用接口