i18n调用自己参数_Spring Boot :I18N
什么是 I18N
I18N 是 "国际化" 的简称,对于程序来说,在不修改内部代码的情况下,根据不同语言及地区显示相应的界面
Spring Boot 结合 I18N
1. Spring Boot 加入 Thymeleaf
引入 Thymeleaf 依赖库
org.springframework.boot
spring-boot-starter-thymeleaf
创建模板文件 resources/templates/hello.html
Title
欢迎你登录到阿里巴巴网站
编写Controller
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "/hello";
}
}
2. 页面元素国际化
需求:当访问语言为 zh 时显示中文,当语言为 en 时显示英文
SpringBoot 默认支持国际画的,只需在 resources/ 下定义国际化配置文件即可,名称必须以 messages 开发
定义国际化文件
messages.properties (默认,当找不到语言的配置的时候,使用该文件进行展示)。
welcome = 欢迎你登录到 阿里巴巴网站(default)
messages_zh_CN.properties(中文)
welcome = \u6b22\u8fce\u4f60\u767b\u5f55\u5230\u963f\u91cc\u5df4\u5df4 \u7f51\u7ad9\uff08\u4e2d\u6587\uff09
messages_en_US.properties(英文)
welcome= welcome to login to alibabawebsite(English)
修改模板
测试:访问 http://127.0.0.1:8080/hello 则会显示 欢迎你登录到 阿里巴巴 网站(中文)
3. 默认国际化原理
文件命名必须以 messages 开头,这是因为 MessageSourceAutoConfiguration 类中指定了前缀
SpringMVC 会识别用户的首选地区,根据这个地区显示内容,用户区域通过区域解析器识别,它必须显示 LocaleResolver 接口,默认采用的区域解析器是 AcceptHeaderLocaleResolver,它是验证 HTTP 请求头的头部信息 accept-language 来解析区域,这个头部由用户浏览器底层根据系统的区域进行设定
4. 修改默认 messages 配置前缀
可在 resources 下创建新目录 i18n ,将 messages_xxx.properties 文件到此目录下
#指定message的basename,多个以逗号分隔,如果不加包名的话,默认从classpath路径开始,默认: messages
spring.messages.basename=i18n/messages
#设定加载的资源文件缓存失效时间,-1的话为永不过期,默认为-1
spring.messages.cache-seconds= 3600
5. 代码中使用国际化信息
注入 MessageSource 对象,通过 getMessage 方法获取信息
@RestController
public class HelloController {
@Autowired
private MessageSource messageSource;
@RequestMapping("/hello")
public String hello(){
Locale locale = LocaleContextHolder.getLocale(); //获取区域信息
String welcome = messageSource.getMessage("welcome",null,locale);
return welcome;
}
}
6. 国际化工具类
封装一个国际化工具类优化使用
@Component
public class LocaleMessage {
@Autowired
private MessageSource messageSource;
/**
* @param code:对应文本配置的key.
* @return 对应地区的语言消息字符串
*/
public String getMessage(String code){
return this.getMessage(code,new Object[]{});
}
public String getMessage(String code,String defaultMessage){
return this.getMessage(code,null,defaultMessage);
}
public String getMessage(String code,String defaultMessage,Locale locale){
return this.getMessage(code,null,defaultMessage,locale);
}
public String getMessage(String code,Locale locale){
return this.getMessage(code,null,"",locale);
}
public String getMessage(String code,Object[] args){
return this.getMessage(code,args,"");
}
public String getMessage(String code,Object[] args,Locale locale){
return this.getMessage(code,args,"",locale);
}
public String getMessage(String code,Object[] args,String defaultMessage){
Locale locale = LocaleContextHolder.getLocale();
return this.getMessage(code,args, defaultMessage,locale);
}
public String getMessage(String code,Object[]args,String defaultMessage,Locale locale){
return messageSource.getMessage(code,args, defaultMessage,locale);
}
}
使用方法
@Resource
private LocaleMessageSourceService localeMessageSourceService;
String msg3 = localeMessageSourceService.getMessage("welcome");
7. 会话区域解析器 SessionLocaleResolver
注入 Bean,会话区域解析器只针对当前会话有效
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
//设置默认区域,
slr.setDefaultLocale(Locale.ENGLISH);
return slr;
}
修改模板,可切换中英文
切换为中文
切换为英文
添加相应控制器
@RequestMapping("/changeSessionLanauage")
public String changeSessionLanauage(HttpServletRequest request, String lang){
System.out.println(lang);
if("zh".equals(lang)){
//代码中即可通过以下方法进行语言设置
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("zh","CN"));
}else if("en".equals(lang)){
//代码中即可通过以下方法进行语言设置
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("en","US"));
}
return"redirect:/hello2";
}
下面代码会切换当前会话区域
request.getSession().setAttribute(SessionLocaleResolver.LOCALE_SESSION_ATTRIBUTE_NAME,new Locale("en","US"));
同时作用于 Cookie
@RequestMapping("/changeSessionLanauage")
public String changeSessionLanauage(HttpServletRequest request, HttpServletResponse response, String lang){
System.out.println(lang);
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if("zh".equals(lang)){
localeResolver.setLocale(request, response, new Locale("zh","CN"));
}else if("en".equals(lang)){
localeResolver.setLocale(request, response, new Locale("en","US"));
}
return"redirect:/hello";
}
8. 通过参数修改用户区域
@Configuration
public class MvcConfig 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());
}
}
i18n调用自己参数_Spring Boot :I18N相关推荐
- i18n调用自己参数_i18n国际化的例子
这个可以点击菜单进行中英文切换,每次切换就可以改变sessionStorage.languge,进行改变i18n的参数lang的值,然后重新调用下就可以了. 工程结构: i18n--| |---css ...
- i18n调用自己参数_I18N的前后端实现
所需工具: 1.Vue https://cn.vuejs.org/ 2.Vue-I18N https://www.npmjs.com/package/vue-i ...
- java i18n 实现_Spring Boot i18n(国际化)实现
1. 场景需求 首先,我们要清楚理解自己的需求.在服务国际化场景中一般有两种类型的需求: 产品是 web 项目,在浏览器中访问时能够支持多语言. 服务输出 Api,需要返回的数据支持多语言. 2. 实 ...
- springboot 单测加入参数_Spring Boot集成Elasticsearch实战分享
作者|java梦想口服液|简书 最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结 ...
- mybatis 不生效 参数_Spring Boot(七):你不能不知道的Mybatis缓存机制
缓存的重要性是不言而喻的.使用缓存, 我们可以避免频繁的与数据库进行交互, 尤其是在查询越多.缓存命中率越高的情况下, 使用缓存对性能的提高更明显. 同样地,mybatis作为ORM框架,也必然会支持 ...
- bean validation校验方法参数_Spring Boot 之使用 validation 验证参数
前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了 ...
- 命令行调用springboot服务_Spring Boot命令行界面的使用
Spring Boot提供了命令行界面(Command Line Interface, CLI),可以用来运行和测试Spring Boot应用.Spring Boot及其CLI可以在Spring仓库中 ...
- springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件
上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个 Spring Boot 上传文件的小案例. 1.pom 包配置 我们使用 Spring Boot 版本 2. ...
- idea swagger生成接口文档_Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据...
一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...
最新文章
- html与java接口_html用ajax请求服务器后端java接口跨域问题解决
- Linux--vim的使用
- Ajax调用MVC控制器参数为实体
- 服务器工具个人免费版下载使用,xshell个人免费版,xftp个人免费版
- read name 和 read 在 Bash 中的区别
- WeLive在线客服系统
- Scrapy网络爬虫实战[保存为Json文件及存储到mysql数据库]
- 利用Group Conv在单个CNN中实现集成学习
- 如何打造工业物联网帝国?
- 软工导论测试代码(归档):设备管理系统
- gini指数与cart 决策树
- 专利写作技巧以及流程
- gulp less编译css压缩和js压缩别名输出
- tesstwo深度优化_十年磨一剑:自主可控国产微观交通仿真软件TESS NG研发之路
- 特殊的空格 - ASCII(160)
- IE浏览器图标不见了
- 机器学习中的数学(1):MIT大牛写的综述
- PMP_第5章章节试题
- The JAVA_HOME environment variable does not point to a working 32-bit JDK or JRE.
- Git学习笔记之使用git reset --hard回滚代码(回滚提交记录)