定制区域信息解析器

定制区域信息解析器
定制区域信息解析器

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

​ 在项目中创建名为com.lagou.config的包,并在该包下创建一个用于定制国际化功能区域信息解析器的自定义配置类

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();

    }

}

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值