spring java 国际化_SpringBoot实现国际化实战

本文详细介绍了如何通过Properties文件配置国际化原理,并重点讲解了如何在Spring MVC中替换默认的AcceptHeaderLocaleResolver,创建并使用自定义的LocaleResolver。涉及内容包括配置文件设置、Thymeleaf国际化绑定和自定义解析器的实现步骤。
摘要由CSDN通过智能技术生成

国际化

原理

通过Properties文件配置,配置完后通过Thymeleaf中的#{} 来取代原来的静态资源。例如:

语言环境解析器接口

spring:

# 关闭模板引擎的缓存

thymeleaf:

cache: false

messages:

encoding: UTF-8

## 配置国际化绑定的文件 不绑定会乱码

basename: i18n.login

package org.springframework.web.servlet;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;

public interface LocaleResolver {

//解析语言环境

Locale resolveLocale(HttpServletRequest var1);

void setLocale(HttpServletRequest var1, @Nullable HttpServletResponse var2, @Nullable Locale var3);

}

在SpringMvc自动配置类中语言环境解析器代码如下

public class WebMvcAutoConfiguration {

//**语言环境解析器**

public LocaleResolver localeResolver() {

if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {

return new FixedLocaleResolver(this.mvcProperties.getLocale());

} else {

// AcceptHeaderLocaleResolver 默认的**语言环境解析器**

AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();

localeResolver.setDefaultLocale(this.mvcProperties.getLocale());

return localeResolver;

}

}

}

默认使用的语言环境解析器

package org.springframework.web.servlet.i18n;

import java.util.ArrayList;

import java.util.Enumeration;

import java.util.Iterator;

import java.util.List;

import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.lang.Nullable;

import org.springframework.util.StringUtils;

import org.springframework.web.servlet.LocaleResolver;

public class AcceptHeaderLocaleResolver implements LocaleResolver {

private final List supportedLocales = new ArrayList(4);

@Nullable

private Locale defaultLocale;

public AcceptHeaderLocaleResolver() {

}

public void setSupportedLocales(List locales) {

this.supportedLocales.clear();

this.supportedLocales.addAll(locales);

}

public List getSupportedLocales() {

return this.supportedLocales;

}

public void setDefaultLocale(@Nullable Locale defaultLocale) {

this.defaultLocale = defaultLocale;

}

@Nullable

public Locale getDefaultLocale() {

return this.defaultLocale;

}

//!!!

public Locale resolveLocale(HttpServletRequest request) {

Locale defaultLocale = this.getDefaultLocale();

if (defaultLocale != null && request.getHeader("Accept-Language") == null) {

return defaultLocale;

} else {

Locale requestLocale = request.getLocale();

List supportedLocales = this.getSupportedLocales();

if (!supportedLocales.isEmpty() && !supportedLocales.contains(requestLocale)) {

Locale supportedLocale = this.findSupportedLocale(request, supportedLocales);

if (supportedLocale != null) {

return supportedLocale;

} else {

return defaultLocale != null ? defaultLocale : requestLocale;

}

} else {

return requestLocale;

}

}

}

@Nullable

private Locale findSupportedLocale(HttpServletRequest request, List supportedLocales) {

Enumeration requestLocales = request.getLocales();

Locale languageMatch = null;

Locale locale;

label38:

do {

while(requestLocales.hasMoreElements()) {

locale = (Locale)requestLocales.nextElement();

if (supportedLocales.contains(locale)) {

continue label38;

}

if (languageMatch == null) {

Iterator var6 = supportedLocales.iterator();

while(var6.hasNext()) {

Locale candidate = (Locale)var6.next();

if (!StringUtils.hasLength(candidate.getCountry()) && candidate.getLanguage().equals(locale.getLanguage())) {

languageMatch = candidate;

break;

}

}

}

}

return languageMatch;

} while(languageMatch != null && !languageMatch.getLanguage().equals(locale.getLanguage()));

return locale;

}

//!!!

public void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale) {

throw new UnsupportedOperationException("Cannot change HTTP accept header - use a different locale resolution strategy");

}

}

自定义语言环境解析器

我们自定义语言环境解析器,然后在引入到WebMvc配置类中,来替代原有的语言环境解析器。

我们只需要实现LocaleResolver接口即可

/**

* 自定义 语言环境解析器

*/

public class MyLocaleResolver implements LocaleResolver {

//解析请求

@Override

public Locale resolveLocale(HttpServletRequest httpServletRequest) {

//获取请求中的语言参数

Locale locale = null;

final String language = httpServletRequest.getParameter("Language"); //例如 zh_CN en_US

System.out.println("------->"+language);

if(!StringUtils.isEmpty(language)){ // return target == null || target.length() == 0;

final String[] s = language.split("_");

// s[0]:国家 s[1]:地区

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

return locale;

}

locale = Locale.getDefault(); // 如果没有请求参数就是默认的

return locale;

}

@Override

public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

}

}

将自定义的语言环境解析器,加入SpringMvc自动配置类中

在自动配置类中需要将自定义的MyLocaleResolver类取代WebMvcAutoConfiguration中对应的方法

/**

* 定义一个WebMvcConfigurer 的实现类,可以重写SpringMvc的配置

* 在这个类中 定义的组件,然后将它交给springboot,springboot就会自动装配

*/

@Configuration

public class MyMvcConfig implements WebMvcConfigurer {

//自定义国际化组件 重写了 WebMvcAutoConfiguration 类中的 localeResolver 方法

@Bean

public LocaleResolver localeResolver(){

return new MyLocaleResolver();

}

}

效果图展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值