springboot中通过实现LocaleResolver来实现国际化

一个简单的例子让大家学会国际化

一个简单的登录页面,点击中文变成中文版,点击英文变成英文版,如下图所示(默认为中文版)
在这里插入图片描述1.首先我们在resources文件下建立一个i18n的文件,在i18n下创建一个login.properties属性文件,里面存放了默认登录条件下的一些属性值

login.tip=请登录
login.user=用户名
login.password=密码
login.rem=记住我
login.but=登录

再建立一个login_en_US.properties属性文件,作为英文版的一些属性值

login.tip=Please sign in
login.user=Username
login.password=Password
login.rem=Remember me
login.but=Login in

再建立一个login_zh_CN.properties属性文件,作为中文版的一些属性值

login.tip=请登录
login.user=用户名
login.password=密码
login.rem=记住我
login.but=登录


2.接下来我们要写一个自己的区域解析器,在此之前,我们先来简单了解一下springboot默认的解析器,查看源码如下,该方法的意思是如果我们的LocaleResolver和固定的一样时,就使用固定的,否则就使用AcceptHeaderLocaleResolver里的,当然了,该方法只有在配置了spring.mvc.locale才会生效
前端的html和自己的解析器

<form class="form-signin"   th:action="@{/user/login}">
			<img class="mb-4" th:src="@{/img/bootstrap-solid.svg}" alt="" width="72" height="72">
			<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>
			<p th:text="${msg}" th:if="${not #strings.isEmpty(msg)}"></p>

			<input type="text" name="username" class="form-control" th:placeholder="#{login.user}" required="" autofocus="">

			<input type="password" name="password" class="form-control" th:placeholder="#{login.password}"  required="">
			<div class="checkbox mb-3">
				<label>
          <input type="checkbox" value="remember-me" th:text="#{login.rem}">
        </label>
			</div>
			<button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.but}">Sign in</button>
			<p class="mt-5 mb-3 text-muted">© 2017-2018</p>
			<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>

当我们点击中文/英文时,l参数会被我们的解析器所拿到,根据参数来选择对应的properties文件
如果没有l参数(即初始界面),会使用默认的properties文件

public class MyLocaleResolver implements LocaleResolver {
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
        String l = request.getParameter("l");

        //没有就使用默认的
        if (!StringUtils.isEmpty(l)){
            String[] s = l.split("_");
            return new Locale(s[0],s[1]);
        }else {
            Locale defaultLocale = Locale.getDefault();

            return defaultLocale;
        }
    }

    @Override
    public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {

    }
}

3.注意点
第一:在application.properties中需要配置spring.messages.basename=i18n.login,此配置指明了消息来源
第二:需要把自己的解析器放到容器里

@Configuration
public class MyConfig implements WebMvcConfigurer {
   
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleResolver();
    }
}

收工


版权声明:本文为weixin_43550933原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。