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 {
@Bean
public MessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
// 配置路径
messageSource.setBasename("i18n.messages");
messageSource.setDefaultEncoding("UTF-8");
return messageSource;
}
@Bean
public LocaleResolver localeResolver() {
CookieLocaleResolver resolver = new CookieLocaleResolver();
resolver.setDefaultLocale(Locale.CHINA);
resolver.setCookieName("lang");
return resolver;
}
}
不想用以上代码中写死的配置,也可以通过配置文件进行配置: 如下
# 配置MessageSource
spring:
messages:
# 文件类路径位置,文件名保留
basename: messages/messages
# 编码语言
encoding: UTF-8
# 在未查询到时是否使用默认设置的message
use-code-as-default-message: true
messages_en_US.properties
msg.activity= activity participation and statistics
messages_zh_CN.properties
msg.activity=中文活动参与和统计
在资源文件图片中Resource Bundle 'messages’文件夹是创建多个message_language_country.properties文件时IDEA自动创建的
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 {
@Autowired
private MessageSource messageSource;
@Autowired
private LocaleResolver localeResolver;
@GetMapping("/getMessage")
public String getMessage(HttpServletRequest request) {
//国际化语言
Locale locale = localeResolver.resolveLocale(request);
return messageSource.getMessage("msg.activity", null, locale);
}
}
#验证中文请求
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