前面准备工作(1-3)
一、准备好dao以及pojo
二、准备好静态资源以及导入thymeleaf依赖
三、将静态资源放置到static目录中,然后使用thymeleaf的语法格式来进行对url静态资源的指定
注意点:如果不适用thymeleaf中的语法来指定url,那么一旦在配置文件中更改server.servlet.context-path=/changlu虚拟目录,那么我们访问对应网址时,静态资源就不会跟随着加了虚拟目录一样增加。
原本:href="/js" 替换:th:href="@{/css/...}" 使用时需要html引入头部声明xmlns:th="http://www.thymeleaf.org"
关闭模板引擎的缓存(yaml配置文件):spring.thymeleaf.cache=false
自定义配置类中添加跳转路径,重写:
@Configuration public class MyMvcConfig implements WebMvcConfigurer{ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); registry.addViewController("/index.html").setViewName("index"); } }
四、页面国际化
参考文章:SpringBoot日记——国际化篇
1、IDEA中创建i18n目录
通过在i18n目录中设置properteis文件
确保idea中的fileEncoding中都是UTF-8
Idea大概创建步骤
再添加一个login_zh_CN.properties就会进行合并,因为他们的前缀相同,idea就会识别login适配不同的版本
若是想在Bundle中再创建只需要右击选择如下,再添加对应的后缀即可为添加了不同版本
IDEA有一个操作更加来控制login三个版本不同的值
点击+好选择对应的key名
特别人性化,这样我们就能够进行一个键多个配置文件的值修改了!!!
2、配置文件配置国际化
MessageSourceAutoConfiguration类中messageSourceProperties()方法中返回的实体类是MessageSourceProperties
这个实体类中的basename属性是用来管理国际化文件的,默认是message。
那么若是想要自定义国际化,那么就要更改其配置在配置文件中:
# 配置i18n的真实路径 spring.messages.basename=i18.login
3、使用thymeleaf语法来显示国际化
当我们配置好对应的国际化之后,来使用thymeleaf语法来显示国际化的内容
使用语法:#{}
对于之后中英文进行自动转换同样需要发送请求,下面是两个超链接:
<!-- 使用@{}表示链接 ()中的内容表示url的参数 也就是url?key=value中?后的内容 --> <a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>| <a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
效果:
4、自定义配置LocalResolver
我们首先自定义一个配置类MyLocaleResolver:
package com.changlu.config; import org.springframework.context.annotation.Configuration; 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 MyLocaleResolver implements LocaleResolver { @Override public Locale resolveLocale(HttpServletRequest httpServletRequest) { String l = httpServletRequest.getParameter("l"); //获取默认的Locale Locale locale = Locale.getDefault(); //判断是否有参数 if(!StringUtils.isEmpty(l)){ //将对应中英文参数进行分割,并创建新的Locale,填充语言与城市 String[] split = l.split("_"); locale = new Locale(split[0],split[1]); } return locale; } @Override public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) { } }
为了使这个配置类进行生效,我们继续在MyMvcConfig中让自定义国际化配置生效:
@Configuration public class MyMvcConfig implements WebMvcConfigurer{ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); registry.addViewController("/index.html").setViewName("index"); registry.addViewController("/404.html").setViewName("404"); registry.addViewController("/dashboard.html").setViewName("dashboard"); registry.addViewController("/list.html").setViewName("list"); } //自定义的国际化组件就生效了! @Bean public LocaleResolver localeResolver(){ return new MyLocaleResolver(); } }
效果展示:
原理分析
对于我们浏览器发送请求,都是会发送对应的请求语言,这跟我们对浏览器的设置是有关系的:
对于服务器端,那么我们也会有一个对应的方法来去进行获取这个请求的语言并进行自动配置,这个在springmvc中已经帮我们配置好了,对于springboot同样也已经做了自动配置,依旧是在WebMvcAutoConfiguration这个自动配置类里:
里面有一个自动配置的javaConfig,用于自动配置LocaleResolver
注意看红框,通过AcceptHeaderLocaleResolver获取到的实例来进行返回,我们来看下这个类
那么我们只需要把其中的resolveLocale()重写为自己指定的国际化并进行配置即可!!!
关键就是我们要定义一个自己的LocaleResolver类,并实现其方法即可,这也就是我为什么要自定义其类并通过@Bean来进行spring的自动装配!!!
普通使用
只需要在resources目录添加一个messages.properties,其中设置key与value,例如footer.qq=QQ:93997488
在template中只需要使用thymeleaf语法如th:text="#{footer.qq}"即可获取到,国际化则需要在yaml中设置包名。