SpringBoot实现国际化
在哔哩哔哩一位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实现国际化相关推荐
- SpringBoot - 资源国际化
SpringBoot - 资源国际化 2018年06月19日 11:00:31 流烟默 阅读数:344 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net ...
- SpringBoot 实现国际化 SpringBoot配置国际化 SpringBoot 国际化 springboot实现国际化 springboot配置国际化 springboot国际化代码实现
SpringBoot 实现国际化,不使用 spring i18n实现方式 配置 全局语言地区拦截器配置 将拦截器注册 多语言实现 多语言接口 中文语言接口实现类 英文语言接口实现类 初始化 使用 配置 ...
- SpringBoot项目国际化
SpringBoot项目国际化 1. 创建国际化文件Resource Bundle 项目结构图: springboot项目工程详细结构 国际化文件结构图: springboot国际化文件 在Intel ...
- 自学SpringBoot之国际化配置相关的坑
前两天在b站上自学SpringBoot的国际化配置时,浏览器总是报乱码的错,类似??login.tip_zh_CN??, 由于b站上基本都是使用Ideal,我用的是sts2.2.5版本,难免遇到不同, ...
- SpringBoot -> 国际化(i18n)
文章目录 上结果 1.准备工作 配置文件编写 配置文件生效探究 配置页面国际化值 配置国际化解析 总结:我可能骗了你们,这个看了我都总结不出什么东西 上结果 1.准备工作 先在IDEA中统一设置pro ...
- SpringBoot2.1.5(18)--- 国际化配置,SpringBoot Locale 国际化使用方法
在项目中,很多时候需要国际化的支持,这篇文章要介绍一下springboot项目中多语言国际化的使用. 本文项目结构如图: springboot默认就支持国际化的,而且不需要你过多的做什么配置,只需要在 ...
- Springboot与国际化(i18n)
文章目录 一.什么是国际化? 二.前端联合后端实现国际化. 三.服务端国际化(Springboot内置国际化) 一.什么是国际化? 国际化就是在不修改内部代码的情况下,根据不同语言及地区显示相应的语言 ...
- springboot引入国际化
福兮祸所伏,祸兮福所倚 编写国际化文件 我的默认放在i18n的文件下 login.properties是默认文件 login_en_US.properties是英文 login_en_US. ...
- springboot配置国际化资源文件 使用themself模板进行解析
2019独角兽企业重金招聘Python工程师标准>>> @ConfigurationProperties(prefix = "spring.messages") ...
最新文章
- cron计划任务使用
- 【原创】大叔案例分享(3)用户行为分析--见证scala的强大
- java datainputstream_Java DataInputStream readUnsignedByte()方法
- TensorFlow(十)定义图变量的方法
- JSONP 跨域共享信息
- linux终端友好,Linux 中一种友好的 find 替代工具
- git commit提交代码时提示LF与CRLF转换问题 error
- 青海师大c语言研究生专业课,2016年青海师范大学计算机应用技术C语言程序设计考研复试题库...
- 精准设计类素材方向,搜索把握细节
- [Java2入门经典]第9章 访问文件和目录
- v8go 库手动编译 v8 golang 库手动编译
- 电信收费计费系统BI项目
- 三、FreeNas实现SMB共享、FTP搭建实验报告
- 苹果一体机电脑计算机图标找不到,mac电脑airplay图标不见了怎么办
- debugger for mysql_debugger for mysql
- 致远OA漏洞学习——A6版本Session泄漏伪造漏洞
- MITxPro平台 Base SPOC-MachineLearning, Modeling, and Simulation Principles 课后习题参考答案
- 鸿蒙电视如何播放手机上的歌,鸿蒙这么用 荣耀智慧屏联动手机的正确打开方式...
- 给git-bash安装某些应用(make,wget,hugo,xpdf,nano)
- 思想的沉淀,精辟,杨澜如是说
热门文章
- 正则表达式知识详解(转自晴天碧日)
- sass、gulp应用
- snort的详细配置
- Oracle-Decode()函数和CASE语句的不同
- 小程序中利用Moment.js格式时间
- 机器视觉支架制作(带效果测试)
- 部分Dell 740 不支持 Xen Server?
- Ubuntu 9.10 升级到ext4
- centos 6 mysql 5.7.13 编译安装_Centos 6.5 下面 源码编译 安装 Mysql 5.7.13
- 怎样呵护友谊_呵护真正的友情,助力漫长的人生