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

国际化

原理

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



spring:# 关闭模板引擎的缓存thymeleaf:cache: falsemessages: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);@Nullableprivate 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;}@Nullablepublic 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;}}}@Nullableprivate 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 {//解析请求@Overridepublic Locale resolveLocale(HttpServletRequest httpServletRequest) {//获取请求中的语言参数Locale locale = null;final String language = httpServletRequest.getParameter("Language"); //例如 zh_CN  en_USSystem.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;}@Overridepublic void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {}
}

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

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

/*** 定义一个WebMvcConfigurer 的实现类,可以重写SpringMvc的配置* 在这个类中 定义的组件,然后将它交给springboot,springboot就会自动装配*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {//自定义国际化组件  重写了 WebMvcAutoConfiguration 类中的  localeResolver 方法 @Beanpublic LocaleResolver localeResolver(){return new MyLocaleResolver();}}

效果图展示

SpringBoot实现国际化相关推荐

  1. SpringBoot - 资源国际化

    SpringBoot - 资源国际化 2018年06月19日 11:00:31 流烟默 阅读数:344 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net ...

  2. SpringBoot 实现国际化 SpringBoot配置国际化 SpringBoot 国际化 springboot实现国际化 springboot配置国际化 springboot国际化代码实现

    SpringBoot 实现国际化,不使用 spring i18n实现方式 配置 全局语言地区拦截器配置 将拦截器注册 多语言实现 多语言接口 中文语言接口实现类 英文语言接口实现类 初始化 使用 配置 ...

  3. SpringBoot项目国际化

    SpringBoot项目国际化 1. 创建国际化文件Resource Bundle 项目结构图: springboot项目工程详细结构 国际化文件结构图: springboot国际化文件 在Intel ...

  4. 自学SpringBoot之国际化配置相关的坑

    前两天在b站上自学SpringBoot的国际化配置时,浏览器总是报乱码的错,类似??login.tip_zh_CN??, 由于b站上基本都是使用Ideal,我用的是sts2.2.5版本,难免遇到不同, ...

  5. SpringBoot -> 国际化(i18n)

    文章目录 上结果 1.准备工作 配置文件编写 配置文件生效探究 配置页面国际化值 配置国际化解析 总结:我可能骗了你们,这个看了我都总结不出什么东西 上结果 1.准备工作 先在IDEA中统一设置pro ...

  6. SpringBoot2.1.5(18)--- 国际化配置,SpringBoot Locale 国际化使用方法

    在项目中,很多时候需要国际化的支持,这篇文章要介绍一下springboot项目中多语言国际化的使用. 本文项目结构如图: springboot默认就支持国际化的,而且不需要你过多的做什么配置,只需要在 ...

  7. Springboot与国际化(i18n)

    文章目录 一.什么是国际化? 二.前端联合后端实现国际化. 三.服务端国际化(Springboot内置国际化) 一.什么是国际化? 国际化就是在不修改内部代码的情况下,根据不同语言及地区显示相应的语言 ...

  8. springboot引入国际化

    福兮祸所伏,祸兮福所倚 编写国际化文件  我的默认放在i18n的文件下 login.properties是默认文件  login_en_US.properties是英文    login_en_US. ...

  9. springboot配置国际化资源文件 使用themself模板进行解析

    2019独角兽企业重金招聘Python工程师标准>>> @ConfigurationProperties(prefix = "spring.messages") ...

最新文章

  1. cron计划任务使用
  2. 【原创】大叔案例分享(3)用户行为分析--见证scala的强大
  3. java datainputstream_Java DataInputStream readUnsignedByte()方法
  4. TensorFlow(十)定义图变量的方法
  5. JSONP 跨域共享信息
  6. linux终端友好,Linux 中一种友好的 find 替代工具
  7. git commit提交代码时提示LF与CRLF转换问题 error
  8. 青海师大c语言研究生专业课,2016年青海师范大学计算机应用技术C语言程序设计考研复试题库...
  9. 精准设计类素材方向,搜索把握细节
  10. [Java2入门经典]第9章 访问文件和目录
  11. v8go 库手动编译 v8 golang 库手动编译
  12. 电信收费计费系统BI项目
  13. 三、FreeNas实现SMB共享、FTP搭建实验报告
  14. 苹果一体机电脑计算机图标找不到,mac电脑airplay图标不见了怎么办
  15. debugger for mysql_debugger for mysql
  16. 致远OA漏洞学习——A6版本Session泄漏伪造漏洞
  17. MITxPro平台 Base SPOC-MachineLearning, Modeling, and Simulation Principles 课后习题参考答案
  18. 鸿蒙电视如何播放手机上的歌,鸿蒙这么用 荣耀智慧屏联动手机的正确打开方式...
  19. 给git-bash安装某些应用(make,wget,hugo,xpdf,nano)
  20. 思想的沉淀,精辟,杨澜如是说

热门文章

  1. 正则表达式知识详解(转自晴天碧日)
  2. sass、gulp应用
  3. snort的详细配置
  4. Oracle-Decode()函数和CASE语句的不同
  5. 小程序中利用Moment.js格式时间
  6. 机器视觉支架制作(带效果测试)
  7. 部分Dell 740 不支持 Xen Server?
  8. Ubuntu 9.10 升级到ext4
  9. centos 6 mysql 5.7.13 编译安装_Centos 6.5 下面 源码编译 安装 Mysql 5.7.13
  10. 怎样呵护友谊_呵护真正的友情,助力漫长的人生