Springboot 基于MessageSource配置国际化
1. 国际化的基本配置
package com.collmall.config;import org.springframework.boot.SpringApplication;import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.ResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import java.util.Locale;public class I18nConfig {@Beanpublic MessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();// 配置路径messageSource.setBasename("i18n.messages");messageSource.setDefaultEncoding("UTF-8");return messageSource;}@Beanpublic LocaleResolver localeResolver() {CookieLocaleResolver resolver = new CookieLocaleResolver();resolver.setDefaultLocale(Locale.CHINA);resolver.setCookieName("lang");return resolver;}
}
不想用以上代码中写死的配置,也可以通过配置文件进行配置: 如下
# 配置MessageSource
spring:messages:
# 文件类路径位置,文件名保留basename: messages/messages
# 编码语言encoding: UTF-8
# 在未查询到时是否使用默认设置的messageuse-code-as-default-message: true
2. 国际化的配置文件
以 中文和英文举例:
messages_en_US.properties
msg.activity= activity participation and statistics
messages_zh_CN.properties
msg.activity=中文活动参与和统计
在资源文件图片中Resource Bundle 'messages’文件夹是创建多个message_language_country.properties文件时IDEA自动创建的
3. 编写接口用于测试
package com.collmall.document.controller.i18n;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.LocaleResolver;import javax.servlet.http.HttpServletRequest;
import java.util.Locale;@RestController
public class I18nController {@Autowiredprivate MessageSource messageSource;@Autowiredprivate LocaleResolver localeResolver;@GetMapping("/getMessage")public String getMessage(HttpServletRequest request) {//国际化语言Locale locale = localeResolver.resolveLocale(request);return messageSource.getMessage("msg.activity", null, locale);}
}
4. 测试用例
#验证中文请求
curl -H "Accept-Language: zh-CN" http://localhost:8080/getMessage# 验证英文请求
curl -H "Accept-Language: en-US" http://localhost:8080/getMessage
已注释掉spring.mvc.locale=zh_CN配置
系统现在会根据请求自动选择语言环境
语言解析优先级:
URL参数?language=xx_XX(最高优先级)
Accept-Language请求头
JVM默认语言环境(最低优先级)
已添加的配置:
CookieLocaleResolver作为默认的LocaleResolver实现
设置默认语言环境为Locale.CHINA(zh_CN)
使用"lang"作为存储语言的cookie名称
语言解析流程:
优先从cookie获取语言设置
如果没有cookie,使用默认的Locale.CHINA
仍然支持通过Accept-Language头覆盖
# 测试默认中文
curl http://localhost:8080/getMessage# 测试cookie语言设置
curl -H "Cookie: lang=en_US" http://localhost:8080/getMessage
扩展性: 如需改为Session存储,只需将CookieLocaleResolver替换为SessionLocaleResolver:
@Bean
public LocaleResolver localeResolver() {SessionLocaleResolver resolver = new SessionLocaleResolver();resolver.setDefaultLocale(Locale.CHINA);return resolver;
}
已添加CookieLocaleResolver作为默认实现
配置了合理的默认语言环境(zh_CN)
系统现在支持:
Cookie存储语言偏好
默认中文回退
仍然兼容Accept-Language头
# 验证默认中文
curl http://localhost:8080/getMessage# 验证cookie设置英文
curl -H "Cookie: lang=en_US" http://localhost:8080/getMessage