一、国际化怎么确定语言。
springboot国际化的时候,是通过interface LocaleResolver
接口的实现类的bean来确定是哪种语言的。这个接口有2个方法: 1、resolveLocale 用来获取当前语言环境。 2、setLocale 修改语言环境。(针对Cookie、Session这种有状态的请求。)
LocaleResolver有下面4个实现。如图: 上面的图中LocaleResolver的实现类只有4个:
- AcceptHeaderLocaleResolver (我使用这个)
- CookieLocaleResolver
- FixedLocaleResolver
- SessionLocaleResolver 默认使用AcceptHeaderLocaleResolver实现。
二、LocaleResolver的实现类。
1、AcceptHeaderLocaleResolver 确定语言。
查看AcceptHeaderLocaleResolver的源码后知道,每次请求的时候,AcceptHeaderLocaleResolver获取http的名字叫Accept-Language的header参数。来确定是哪种语言。 如果是API使用这种方式就需要在请求中加Accept-Language的header参数。web浏览器(比如:chrom)在请求的时候会自动把当前系统的语言附加到Accept-Language参数中。
2、SessionLocaleResolver 确定语言。
这个需要配置bean,把默认的AcceptHeaderLocaleResolver覆盖掉。
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.US);
return sessionLocaleResolver;
}
因为语言环境是存在session里面。如果需要改变语言环境。配置一个拦截器监听改变。
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("language");
return localeChangeInterceptor;
}
上面的拦截器从request中获取language参数来改变语言环境。如:127.0.0.1:8080/tests?language=zh_CN。 其他几个就不说了。
三、国际化配置文件。
根据springboot文档。https://docs.spring.io/spring-boot/docs/2.1.4.RELEASE/reference/htmlsingle/#boot-features-internationalization 里面的Internationalization。 需要在配置文件application.yml中配置:
spring.messages.basename=i18n/login
spring.messages.fallback-to-system-locale=false
- 这里spring.messages.basename表示国际化的文件的存储在src\main\resources 文件夹下的什么位置。我这里i18n/login 表示是放在i18n文件夹下面,并且以login开始的配置文件。如下图: spring.messages.basename可以配置多个,以逗号分隔。
- spring.messages.fallback-to-system-locale 表示如果找不到语言,是不是返回服务器系统语言。 比如:Accept-Language=123的header参数。显然是没这个语言的配置文件的。如果spring.messages.fallback-to-system-locale=true,就会找服务器的语言环境对应的配置文件。如果spring.messages.fallback-to-system-locale=false或找login.properties这个默认的配置文件。
四、代码中使用国际化。
就是注入使用MessageSource。使用getMessage方法。
@Component
public class MessageUtils {
@Autowired
private MessageSource messageSource;
/**
* get message
*/
public String get(String msgKey) {
try {
return messageSource.getMessage(msgKey, null, LocaleContextHolder.getLocale());
} catch (Exception e) {
return msgKey;
}
}
}
@Autowired
private MessageUtils messageUtils;
@GetMapping
public String testReq(HttpServletRequest request) {
Locale locale = LocaleContextHolder.getLocale();
System.out.println(RequestContextUtils.getLocale(request));
return messageUtils.get("login.username");
}
最后针对于互联网公司java程序员涉及到的绝大部分难题我做成了文档和架构视频资料免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到且找到一个好的工作,也节省大家在网上搜索资料的时间来学习,也可以关注我一下以后会有更多干货分享。
资料领取方式:Java高级架构;603619042
网友评论