什么是 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相关推荐

  1. i18n调用自己参数_i18n国际化的例子

    这个可以点击菜单进行中英文切换,每次切换就可以改变sessionStorage.languge,进行改变i18n的参数lang的值,然后重新调用下就可以了. 工程结构: i18n--| |---css ...

  2. i18n调用自己参数_I18N的前后端实现

    所需工具: 1.Vue                https://cn.vuejs.org/ 2.Vue-I18N      https://www.npmjs.com/package/vue-i ...

  3. java i18n 实现_Spring Boot i18n(国际化)实现

    1. 场景需求 首先,我们要清楚理解自己的需求.在服务国际化场景中一般有两种类型的需求: 产品是 web 项目,在浏览器中访问时能够支持多语言. 服务输出 Api,需要返回的数据支持多语言. 2. 实 ...

  4. springboot 单测加入参数_Spring Boot集成Elasticsearch实战分享

    作者|java梦想口服液|简书 最近有读者问我能不能写下如何使用 Spring Boot 开发 Elasticsearch(以下简称 ES) 相关应用,今天就讲解下如何使用 Spring Boot 结 ...

  5. mybatis 不生效 参数_Spring Boot(七):你不能不知道的Mybatis缓存机制

    缓存的重要性是不言而喻的.使用缓存, 我们可以避免频繁的与数据库进行交互, 尤其是在查询越多.缓存命中率越高的情况下, 使用缓存对性能的提高更明显. 同样地,mybatis作为ORM框架,也必然会支持 ...

  6. bean validation校验方法参数_Spring Boot 之使用 validation 验证参数

    前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩qq了 ...

  7. 命令行调用springboot服务_Spring Boot命令行界面的使用

    Spring Boot提供了命令行界面(Command Line Interface, CLI),可以用来运行和测试Spring Boot应用.Spring Boot及其CLI可以在Spring仓库中 ...

  8. springboot上传文件同时传参数_Spring Boot 系列:使用 Spring Boot 上传文件

    上传文件是互联网中常常应用的场景之一,最典型的情况就是上传头像等,今天就带着带着大家做一个 Spring Boot 上传文件的小案例. 1.pom 包配置 我们使用 Spring Boot 版本 2. ...

  9. idea swagger生成接口文档_Spring Boot(九)Swagger2自动生成接口文档和Mock模拟数据...

    一.简介 在当下这个前后端分离的技术趋势下,前端工程师过度依赖后端工程师的接口和数据,给开发带来了两大问题: 问题一.后端接口查看难:要怎么调用?参数怎么传递?有几个参数?参数都代表什么含义? 问题二 ...

最新文章

  1. html与java接口_html用ajax请求服务器后端java接口跨域问题解决
  2. Linux--vim的使用
  3. Ajax调用MVC控制器参数为实体
  4. 服务器工具个人免费版下载使用,xshell个人免费版,xftp个人免费版
  5. read name 和 read 在 Bash 中的区别
  6. WeLive在线客服系统
  7. Scrapy网络爬虫实战[保存为Json文件及存储到mysql数据库]
  8. 利用Group Conv在单个CNN中实现集成学习
  9. 如何打造工业物联网帝国?
  10. 软工导论测试代码(归档):设备管理系统
  11. gini指数与cart 决策树
  12. 专利写作技巧以及流程
  13. gulp less编译css压缩和js压缩别名输出
  14. tesstwo深度优化_十年磨一剑:自主可控国产微观交通仿真软件TESS NG研发之路
  15. 特殊的空格 - ASCII(160)
  16. IE浏览器图标不见了
  17. 机器学习中的数学(1):MIT大牛写的综述
  18. PMP_第5章章节试题
  19. The JAVA_HOME environment variable does not point to a working 32-bit JDK or JRE.
  20. Git学习笔记之使用git reset --hard回滚代码(回滚提交记录)

热门文章

  1. MySQL绿色版mysql-5.7.17-winx64简洁安装教程
  2. 团队-团队编程项目作业-开发环境搭建过程
  3. js学习总结----深入扩展-js同步与异步编程
  4. jquery 获取子元素的限制jquery
  5. 百度网盘kbengine - warring项目下载地址
  6. UVA10154 Weights and Measures【0-1背包】
  7. Bailian3180 整数减法【大数】
  8. 竞赛程序设计知识要点图谱
  9. HDU2502 月之数(解法二)【废除!!!】
  10. 边缘独立(marginal independent)的理解及举例