前言
在项目开发中,可能遇到国际化的问题,而支持国际化却是一件很头疼的事。但spring boot给出了一个非常理想和方便的方案。
一、准备工作
pom.xml:
4.0.0 com.example spring-boot-14 0.0.1-SNAPSHOT jar spring-boot-14 Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 1.5.3.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools runtime org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin
App.java:
package com.example;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }}
创建国际化配置文件:LocaleConfig.java
package com.example;import java.util.Locale;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.LocaleResolver;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;import org.springframework.web.servlet.i18n.SessionLocaleResolver;@Configuration@EnableAutoConfiguration@ComponentScanpublic class LocaleConfig extends WebMvcConfigurerAdapter { @Bean public LocaleResolver localeResolver() { SessionLocaleResolver slr = new SessionLocaleResolver(); // 默认语言 slr.setDefaultLocale(Locale.US); return slr; } @Bean public LocaleChangeInterceptor localeChangeInterceptor() { LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); // 参数名 lci.setParamName("lang"); return lci; } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); }}
MainController.java:
package com.example;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;/** * 控制器 博客出处:http://www.cnblogs.com/GoodHelper/ * */@Controllerpublic class MainController { @GetMapping("/") public String index() { return "index"; }}
在resources目录增加两个properties文件,分别为:
messages_en_US.properties:
hello=hello
messages_zh_CN.properties:
hello=\u4F60\u597D
二、前端调用
在thymeleaf模板引擎中使用#{}的标签就能调用messages中的内容
index.html:
玩转spring boot——国际化 玩转spring boot——国际化
from 刘冬的博客
English(US) 简体中文 点击访问原版博客(www.cnblogs.com/GoodHelper)
项目结构如下:
运行效果:
三、后端渲染
修改MainController类:
package com.example;import java.util.Locale;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.MessageSource;import org.springframework.context.i18n.LocaleContextHolder;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;/** * 控制器 博客出处:http://www.cnblogs.com/GoodHelper/ * */@Controllerpublic class MainController { @Autowired private MessageSource messageSource; @GetMapping("/") public String index(Model model) { Locale locale = LocaleContextHolder.getLocale(); model.addAttribute("world", messageSource.getMessage("world", null, locale)); return "index"; }}
其中,MessageSource类可以获取messages的内容。
index.html:
玩转spring boot——国际化 玩转spring boot——国际化
from 刘冬的博客
English(US) 简体中文 点击访问原版博客(www.cnblogs.com/GoodHelper)
一个使用了#{}标签直接调用messages的内容,另一个使用了${}标签来获取后台的值
运行效果:
总结
国际化就已经实现了,然而更完美的做法是当第一次请求时,在后台通过Request获取到一个初始的语言。当获取到的语言和用户所需要的语言不一直时,才需要在前端UI再去设置哪个语言是用户所需要的。
代码下载:https://github.com/carter659/spring-boot-14.git
如果你觉得我的博客对你有帮助,可以给我点儿打赏,左侧微信,右侧支付宝。
有可能就是你的一点打赏会让我的博客写的更好:)