springboot2 Thymeleaf国际化(原理及实践)

在这里插入图片描述

一、自动根据请求头获取相关国际化页面
1、原理
public class MessageSourceAutoConfiguration {
    
    //国际化信息配置类,从请求头中获取国际化信息

	@Bean
	@ConfigurationProperties(prefix = "spring.messages")
	public MessageSourceProperties messageSourceProperties() {
    
    
		return new MessageSourceProperties(){
    
    
			//默认从类路径下的message.properties文件获取国际化信息
			private String basename = "messages";
			...//还有省略
		};
	}

	@Bean
	public MessageSource messageSource(MessageSourceProperties properties) {
    
    
		ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
		if (StringUtils.hasText(properties.getBasename())) {
    
    //设置国际化资源文件的basename(去掉语言国家代码的)
			messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(StringUtils.trimAllWhitespace(properties.getBasename())));
		}
		if (properties.getEncoding() != null) {
    
    //设置编码格式,默认UTF_8
			messageSource.setDefaultEncoding(properties.getEncoding().name());
		}
		messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
		Duration cacheDuration = properties.getCacheDuration();
		if (cacheDuration != null) {
    
    
			messageSource.setCacheMillis(cacheDuration.toMillis());
		}
		messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
		messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
		return messageSource;
	}
2、导入thymeleaf的pom文件
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
3、login.html页面
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"> //xmlns:th 这个是导入关于thymeleaf约束及提示
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
	<meta name="description" content="">
	<meta name="author" content="">
	<title>Signin Template for Bootstrap</title>
	<!-- Bootstrap core CSS  href="asserts/css/bootstrap.min.css"-->
	<link  th:href="@{asserts/css/bootstrap.min.css}"  rel="stylesheet">//使用@导入链接地址内容
	<!-- Custom styles for this template -->
	<link th:href="@{asserts/css/signin.css}" rel="stylesheet">
</head>

<body class="text-center">
	<form class="form-signin" th:action="@{/login}" method="post">//使用@提交地址
		<img class="mb-4" th:src="@{asserts/img/bootstrap-solid.svg}" alt="" width="72" height="72">
		<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.loginMessage}">Please sign in</h1>
		<p style="color: red" th:text="${mes}" th:if="${not #strings.isEmpty(mes)}"></p>
		<label class="sr-only" th:text="#{login.Username}">Username</label>//使用#获取国际化信息
		<input type="text" name="username" class="form-control" placeholder="Username" th:placeholder="#{login.Username}" required="" autofocus="">
		<label class="sr-only" th:text="#{login.Password}">Password</label>
		<input type="password" name="password" class="form-control" th:placeholder="#{login.Password}" placeholder="Password" required="">
		<div class="checkbox mb-3">
			<label>
	        <input type="checkbox" value="remember-me"> [[#{
    
    login.Remember}]]//[[]]获取国际化信息
	      </label>
		</div>
		<button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.Signin}">Sign in</button>
		<p class="mt-5 mb-3 text-muted">© 2017-2018</p>
		<a class="btn btn-sm" th:href="@{/index.html(l='ch_CN')}">中文</a>//携带参数
		<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
	</form>

</body>

</html>
4、配置国际化信息

加粗样式

5、application.properties配置
spring.thymeleaf.cache=false //禁用thymeleaf缓存,然后在html页面按住ctrl+F9就可以实时刷新页面数据
spring.messages.basename=i18n.login//使用templates目录下的login.properties文件中获取国际化信息

二、根据用户点击选择语言

在这里插入图片描述

1、原理
public class WebMvcAutoConfiguration {
    
    //web前段自动配置类
	@Bean
	@ConditionalOnMissingBean//如果没有LocaleResolver的bean则注入
	@ConditionalOnProperty(prefix = "spring.mvc", name = "locale")
	public LocaleResolver localeResolver() {
    
    //用来切换语言信息
		if (this.mvcProperties.getLocaleResolver() == WebMvcProperties.LocaleResolver.FIXED) {
    
    
			return new FixedLocaleResolver(this.mvcProperties.getLocale());
		}
		AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
		localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
		return localeResolver;
	}
2、编写主配置类
@Configuration//核心配置類
//SpringBoot2以后实现WebMvcConfigurer接口可以自己定义Handler,Interceptor,ViewResolver,MessageConverter
public class MainConfiguration implements WebMvcConfigurer {
    
     
    @Override //添加视图解析器
    public void addViewControllers(ViewControllerRegistry registry) {
    
    
    //接收到"/"路径就跳转到 templates/login.html页面
        registry.addViewController("/").setViewName("login");
        registry.addViewController("/index.html").setViewName("login");
        registry.addViewController("/main.html").setViewName("dashboard");
    }
    @Bean//注册到容器一个自定义的LocaleResolver 
    public LocaleResolver localeResolver() {
    
    //必须注入这个才行LocaleResolver 
	       return new MyLocalResolver();
    }

}
3、编写controller
//@ResponseBody 记得不能写这个不然或被转成json,不会被模板引擎解析
@Controller
public class loginController {
    
    

    @RequestMapping("/login")//@RequestParam("username")设置必须要输入username,不然报错
    public String login(@RequestParam("username") String username ,String password, 
    			HttpSession session, HttpServletRequest request, Map map){
    
    

        if (null != username && "123456".equals(password) ){
    
    
            session.setAttribute("username",username);
            return "redirect:/main.html";//重定向到这个ip为/main.html指定的页面
        }else
            map.put("mes","账号或者密码错误!~~");
            return  "login";
    }
}

4、编写切换的区域信息的的LocaleResolve
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.LocaleResolver;
import java.util.Locale;

public class MyLocalResolver implements LocaleResolver {
    
    
    @Override
    public Locale resolveLocale(HttpServletRequest request) {
    
    

        String language = request.getParameter("l");
        Locale locale = Locale.getDefault();//没有就获取系统自带的区域信息

        if (!StringUtils.isEmpty(language)){
    
    
            String[] split = language.split("_");
            locale = new Locale(split[0],split[1]);//这里注意,必须设置语言和地区,只设置语言不行
        }
        return locale;
    }

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

    }
}

猜你喜欢

转载自blog.csdn.net/jue6628/article/details/99705338