SpringBoot 切换国际化
git:https://github.com/xiaozhuanfeng/demoProj
代码结构:
application.properties:
spring.messages.basename=i18n/sprMesgs
说明:默认情况下,国际化资源文件的基础名为messages,且存放在classpath根路径下,即messages.properties、messages_zh_CN.properties、messages_en_US.properties等等,这样就无需在配置文件中设置spring.messages.basename=...了,但是如果基础名不为messages或者不在classpath根路径下,则需要手动添加spring.messages.basename=文件名.自定义的基础名,如果有多个就用逗号分隔。例如:spring.messages.basename=i18n/sprMesgs。
本例就是不用messages.XXX开头,上述具体可参照源码文件:MessageSourceAutoConfiguration.class。
Spring 采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的头部信息accept-language来解析区域。这个头部是由用户的wb浏览器底层根据底层操作系统的区域设置进行设定的。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。
代码获取国际化信息:
org.springframework.context.MessageSource
方法:messageSource.getMessage("welcome", null,locale);
获取locale两种方法:
Locale locale = LocaleContextHolder.getLocale();//建议
Locale locale1= RequestContextUtils.getLocale(request);
例如:
//代码中获取国际化信息 Locale locale = LocaleContextHolder.getLocale(); String msg = messageSource.getMessage("welcome.backhome", null,locale); System.out.println("获取国际化信息"+msg);
下面看切换国际化:
在Spring MVC应用程序中,用户的区域是通过区域解析器来识别的,它必须是实现LocaleResolver接口。Spring MVC提供了几个LocaleResolver实现,让你可以按照不同的条件来解析区域。Spring采用的默认区域解析器是AcceptHeaderLocaleResolver。它通过检验HTTP请求的accept-language头部来解析区域。这个头部是由用户的web浏览器根据底层操作系统的区域设置进行设定。请注意,这个区域解析器无法改变用户的区域,因为它无法修改用户操作系统的区域设置。这里采用SessionLocaleResolver实现页面切换国际化。
新增一个加载类:
package com.example.demo.config; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import java.util.Locale; @Configuration public class MvcConfig { private final Logger log = LoggerFactory.getLogger(getClass()); @Bean public LocaleResolver localeResolver() { log.info("SessionLocaleResolver is start.... "); //会话区域解析器也就是说,你设置完只针对当前的会话有效,session失效,还原为默认状态 SessionLocaleResolver srl = new SessionLocaleResolver(); //设置默认区域 srl.setDefaultLocale(Locale.CHINA); return srl; } }
html页面:
<div> <span>3、文字国际化表达式</span><br/> <form action="/changeLanguage2" method="get"> <!-- <span th:text="'语言 '+${lang}"></span><br/>--> <select name="lang"> <option value=""></option> <option th:selected="${lang=='zh'}" value="zh">中文</option> <option th:selected="${lang=='en'}" value="en">English</option> </select> <button>切换语言</button> </form> <br/> <span th:text="#{welcome.backhome}"></span><br/> </div>
Controller:
package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.LocaleResolver; import org.springframework.web.servlet.i18n.SessionLocaleResolver; import org.springframework.web.servlet.support.RequestContextUtils; import javax.servlet.http.HttpServletRequest; import java.util.Locale; @Controller public class I18nController { @RequestMapping(value = "changeLanguage1") public String changeLan1(HttpServletRequest req, String lang) { if ("en".equals(lang)) { req.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, Locale.US); } else { req.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME, Locale.CHINA); } return "redirect:/demo/example1"; } @RequestMapping(value = "changeLanguage2") public String changeLan2(HttpServletRequest req, String lang) { LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(req); if ("en".equals(lang)) { localeResolver.setLocale(req, null, Locale.US); } else { localeResolver.setLocale(req, null, Locale.CHINA); } return "redirect:/demo/example1"; } }
跳转页面Controller:
package com.example.demo.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import java.util.Locale; import java.util.Map; @Controller @RequestMapping(value = "/demo") public class DemoController { private final Logger log = LoggerFactory.getLogger(getClass()); @RequestMapping("/example1") private String example1(HttpServletRequest request, Map<String, Object> map) { //.....省略 //1、代码中获取国际化信息 Locale locale = LocaleContextHolder.getLocale(); //2、从Session中获取语言环境 //locale = (Locale)req.getSession().getAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME); //System.out.println("当前语言环境:"+locale.getLanguage()); map.put("lang",locale.getLanguage()); return "web_demo1"; } }
测试: