SpringBoot实现国际化
发布日期:2021-05-04 20:40:33 浏览次数:23 分类:原创文章

本文共 6056 字,大约阅读时间需要 20 分钟。

在哔哩哔哩一位up主视频中学到的!

国际化

原理

通过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<Locale> supportedLocales = new ArrayList(4);    @Nullable    private Locale defaultLocale;    public AcceptHeaderLocaleResolver() {       }    public void setSupportedLocales(List<Locale> locales) {           this.supportedLocales.clear();        this.supportedLocales.addAll(locales);    }    public List<Locale> 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<Locale> 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<Locale> supportedLocales) {           Enumeration<Locale> 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就会自动装配 */@Configurationpublic class MyMvcConfig implements WebMvcConfigurer {       //自定义国际化组件  重写了 WebMvcAutoConfiguration 类中的  localeResolver 方法     @Bean    public LocaleResolver localeResolver(){           return new MyLocaleResolver();    }}

效果图展示

在这里插入图片描述

上一篇:OpenGL 入门第一课 视窗以及三角形
下一篇:Spring+SpringMVC+Mybatis 整合入门

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2025年03月12日 07时17分22秒