定制区域信息解析器
在完成上一步中多语言国际化文件的编写和配置后,就可以正式在前端页面中结合Thymeleaf模板相关属性进行国际化语言设置和展示了,不过这种实现方式默认是使用请求头中的语言信息(浏览器语言信息)自动进行语言切换的,有些项目还会提供手动语言切换的功能,这就需要定制区域解析器了
​ 在项目中创建名为com.lagou.config的包,并在该包下创建一个用于定制国际化功能区域信息解析器的自定义配置类MyLocalResovel

package com.lagou.config;

import
org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

import org.springframework.lang.Nullable;

import
org.springframework.util.StringUtils;

import
org.springframework.web.servlet.LocaleResolver;

import
javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.util.Locale;

@Configuration

public class MyLocaleResovel implements
LocaleResolver {

// 自定义区域解析方式

@Override

public Locale resolveLocale(HttpServletRequest httpServletRequest) {

// 获取页面手动切换传递的语言参数l

String l = httpServletRequest.getParameter("l");

// 获取请求头自动传递的语言参数Accept-Language

String header =
httpServletRequest.getHeader("Accept-Language");

Locale locale=null;

// 如果手动切换参数不为空,就根据手动参数进行语言切换,否则默认根据请求头信息切换

if(!StringUtils.isEmpty(l)){

String[] split = l.split("_");

locale=new Locale(split[0],split[1]);

}else {

// Accept-Language: en-US,en;q=0.9

,zh-CN;q=0.8,zh;q=0.7

String[] splits = header.split(",");

String[] split = splits[0].split("-");

locale=new Locale(split[0],split[1]);

}

return locale;

}

@Override

public void setLocale(HttpServletRequest httpServletRequest, @Nullable

   
HttpServletResponse

httpServletResponse, @Nullable Locale locale) {

}

// 将自定义的MyLocalResovel类重新注册为一个类型LocaleResolver的Bean组件

@Bean

public LocaleResolver localeResolver(){

return new MyLocalResovel();

}

}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
MyLocalResolver自定义区域解析器配置类实现了LocaleResolver接口,并重写了其中的resolveLocale()方法进行自定义语言解析,最后使用@Bean注解将当前配置类注册成Spring容器中的一个类型为LocaleResolver的Bean组件,这样就可以覆盖默认的LocaleResolver组件。其中,在resolveLocale()方法中,根据不同需求(手动切换语言信息、浏览器请求头自动切换语言信息)分别获取了请求参数l和请求头参数Accept-Language,然后在请求参数l不为空的情况下就以l参数携带的语言为标准进行语言切换,否则就定制通过请求头信息进行自动切换。
需要注意的是,在请求参数l的语言手动切换组装时,使用的是下划线“_”进行的切割,这是由多语言配置文件的格式决定的(例如login_zh_CN.properties);而在请求头参数Accept-Language的语言自动切换组装时,使用的是短横线“-”进行的切割,这是由浏览器发送的请求头信息样式决定的(例如Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7)
学习让人快乐,学习更让人觉得无知!学了1个多月的《Java工程师高薪训练营》,才发现自己对每个技术点的认知都很肤浅,根本深不下去,立个Flag:每天坚持学习一小时,一周回答网上3个技术问题,把自己知道都分享出来。


孙辣椒
1 声望0 粉丝