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";
}
}

测试:

SpringBoot 切换国际化的更多相关文章

  1. SpringBoot 国际化配置,SpringBoot Locale 国际化

    SpringBoot 国际化配置,SpringBoot Locale 国际化 ================================ ©Copyright 蕃薯耀 2018年3月27日 ht ...

  2. SpringBoot切换Tomcat容器,SpringBoot使用Jetty容器

    SpringBoot切换Tomcat容器, SpringBoot修改为Jetty容器, SpringBoot使用undertow容器, SpringBoot使用Jetty容器 ============ ...

  3. 配置和修改springboot默认国际化文件

    SpringBoot默认国际化文件为:classpath:message.properties,如果放在其它文件夹中,则需要在application.properties配置属性spring.mess ...

  4. SpringBoot的国际化使用

    在项目中,很多时候需要国际化的支持,这篇文章要介绍一下springboot项目中国际化的使用. 在这个项目中前端页面使用的thymeleaf,另外加入了nekohtml去掉html严格校验,如果不了解 ...

  5. SpringBoot整合国际化功能

    (1).编写国际化配置文件 在resources下新建i18n文件夹,并新建以下文件 ①index.properties   username=username ②index_en_US.proper ...

  6. SpringBoot日记——国际化篇

    听起来高大上的国际化,起始就是在利用浏览器语言,或者页面中的中英文切换,将页面的文字在其他语言和中文进行切换,比如: 我们想让这个功能实现,点击中文,页面就是中文的,点击英文就是英文的. 国际化配置 ...

  7. SpringBoot资源国际化

    Springboot根据浏览器实现网站资源国际化 根据浏览器地区主动选择资源 1.创建资源化文件 resource目录下创建messages目录 创建messages_en_US.properties ...

  8. SpringBoot整合国际化I18n

    本文主要实现的功能: 从文件夹中直接加载多个国际化文件 后台设置前端页面显示国际化信息的文件 实现 国际化项目初始化,简单看下项目的目录和文件 在resource下创建国际化文件 messages.p ...

  9. SpringBoot配置国际化

    1).国际化 1).编写国际化配置文件: 2).使用ResourceBundleMessageSource管理国际化资源文件 3).在页面使用fmt:message取出国际化内容 步骤: 1).编写国 ...

随机推荐

  1. 利用AXI-DMA批量发送数据到DMA

    1.1 主函数 int main(void) { XGpio_Initialize(&Gpio, AXI_GPIO_DEV_ID); XGpio_SetDataDirection(&G ...

  2. mysql复习(1)基本CRUD操作

    一.这段时间在学校,把之前的东西都好好捡起来. 0.下面介绍Mysql的最基本的增删改查操作,很多IT工作者都必须掌握的命令,也是IT面试最常考的知识点.在进行增删改查之前,先建立一个包含数据表use ...

  3. 事件流程以及dom2级事件绑定

    事件流程分为三个阶段:捕获阶段.目标阶段.冒泡阶段. 捕获阶段:事件从最顶层元素开始执行,一层层往下,直到精确元素. 目标阶段:事件在精确元素上执行. 冒泡阶段:事件从精确元素开始执行,一层层往上,直 ...

  4. <img> 标签的 src 属性

    src属性 加载的时候就会请求 1.servlet生成一个图片 2.你直接输入servlet的连接看一下,就是一个图片,和我们自己发布到服务器的一样. 3.页面加载时,会访问这个servelt连接,自 ...

  5. GUI学习之十四——QKeySequenceEdit学习总结

    我们在前面总结了3种文本输入控件,这里有一种新的:QKeySequenceEdit,用作对快捷键的采集.结合其内部的API可以实现对自定义快捷键的设置.这节内容大致看一下就好了,我也不知道实际作用有哪 ...

  6. mnist 卷积神经网络

    # from keras.models import Sequential# from keras.layers.core import Dense,Activation,Flatten #creat ...

  7. 基本数据类型、包装类、String类型之间的相互转换

    @Testpublic void test2(){//基本数据类型.包装类-->到String类型的转换,调用String类型的静态方法valueOf()即可int i1 = 12;String ...

  8. bzoj4810 [Ynoi2017]由乃的玉米田 莫队+bitset(+数论)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4810 题解 看数据范围和题目名字应该是根号算法. 因为询问除了区间外,还有第 \(3\) 个参 ...

  9. BZOJ4625 [BJOI2016]水晶 最小割

    题意简述 给你一个三维的坐标系,坐标系上 \((x_i+y_i+z_i)\bmod 3 = 0\) 的点内有能量源.给定 \(n\) 个点含有能量值为 \(c_i\) 的水晶,如果一个水晶位于能量源上 ...

  10. vscode 编写Markdown文件

    vscode使用Markdown文档编写   首先安装vscode工具,具体的使用可以参考之前的博文:<Visual Studio Code教程:基础使用和自定义设置> VScode已经默 ...