SpringBoot+thymeleaf的国际化操作+彩蛋

发布于 2020-05-04  87 次阅读


今天意外得知了这种玩法,写在这里

先上效果

step0 开始前对idea的设置

在setting中找到file encoding这一项,更改默认编码为utf-8,否则后面会出现乱码

Step1 配置文件

在classpath下新建三个properties文件,在application.yml文件中声明配置文件目录

spring:
  thymeleaf:
    cache: false #关闭模板引擎的缓存
  messages:
    basename: i18n.login #国际化文件的位置

在三个配置文件中分别定义需要显示的文字

#login_zh_CN.properties
login.btn=登录
login.password=密码
login.remeber=记住我
login.tip=请登录
login.username=用户名
#login_en_US.properties
login.btn=Sign in
login.password=Password
login.remeber=remeber me
login.tip=Please sign in
login.username=Username
#login.properties
login.btn=登录
login.password=密码
login.remeber=记住我
login.tip=请登录
login.username=用户名

Step2 在thymeleaf的模板上进行修改

把需要中英转化的地方全部使用th:attribute =“#{XXX.XXX}”的方式替换,在用于切换中英的链接地址上加上类似于?Language=zh_CN的参数,后端会根据参数进行语言切换

			<a class="btn btn-sm" th:href="@{/index.html(l=zh_CN)}">中文</a> //在thymeleaf中,@{}用于替换固定链接和访问静态资源
			<a class="btn btn-sm" th:href="@{/index.html(l=en_US)}">English</a>

用变量的形式显示文字

<label class="sr-only" th:text="#{login.username}">Username</label>
<input type="text" class="form-control" th:placeholder="#{login.username}" required="" autofocus="">
<label class="sr-only" th:text="#{login.password}">Password</label>
<input type="password"  class="form-control" th:placeholder="#{login.password}" required="">

step3 添加后端支持本地化的配置类

public class MyLocaleResovler implements LocaleResolver { //实现LocaleResovler接口
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String language = httpServletRequest.getParameter("l"); //通过拿到前端请求时所带的参数
        Locale aDefault = Locale.getDefault(); //拿到默认的语言选项
        //如果请求连接携带了国际化的参数,
        if (!StringUtils.isEmpty(language))
        {
            String[] s = language.split("_");
            //zh_CN
           aDefault = new Locale(s[0], s[1]);
            //国家,地区
        }
        return aDefault;
    }
    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {}
}

在视图配置类中添加方法,重启项目

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Bean
    public LocaleResolver localeResolver()
    {
        return new MyLocaleResovler(); //返回前面已经实现好的配置类
    }
}

彩蛋

既然都已经讲到了WebMvcConfigurer,那么再加一个今天学到的知识点吧,不通过controller把静态文件路由出去。

其实很简单,就是在实现了WebMvcConfigurer接口的配置类中实现addviewController方法,配置路由即可

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
    }
}

 


忍耐无法忍耐的事物,才是真正的忍耐。