前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringMVC-国际化

SpringMVC-国际化

原创
作者头像
BNTang
发布2023-10-01 20:10:49
1570
发布2023-10-01 20:10:49
举报

概述

SpringMVC 根据 Accept-Language 参数判断客户端的本地化类型,这个参数在请求头中,当接受到请求时,SpringMVC 会在上下文中查找一个本地化解析器(LocalResolver)找到后使用它获取请求所对应的本地化类型信息,就是会找到对应类型信息的 properties 的内容给加载到页面当中进行展示

默认实现过程

要先创建国际化的资源文件,首先创建两个资源文件如下图,直接 new File 即可,强调一下注意编码,设置编码的方式可参考该链接进行配置:https://www.cnblogs.com/BNTang/articles/13376151.html

两个文件的名称分别为 language_en_US.propertieslanguage_zh_CN.properties 当你新建完成之后目录结构会自动的如下图一样的,en_US 这一段内容可不能瞎写,这是 I18N 的标准,前面可以自己定义,后面都不行,每个国家都有对应的写法

文件新建完毕之后任意点击一个文件在左下角会出现如下的两个选项,选择 Resource Bundle

选择之后如下图,进行配置即可

配置完成之后你在切换到 Text 模式你会发现,其实就是在原生的 properties 文件里面添加 key-value 配置而已如下图

最终两个资源文件的内容如下,首先是 language_en_US.properties

代码语言:text
复制
introduce=This is I18N Demo
welcome=welcome

紧接着就是 language_zh_CN.properties 文件的内容如下

代码语言:text
复制
introduce=这是一个国际化示例
welcome=欢迎 Jonathan_Lee

紧接着修改 SpringMVC 的核心配置文件添加新的配置,也就是本次所介绍的 i18N 的相关配置内容啦

注意:id 为 messageSource

代码语言:html
复制
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <!--basename:国际化资源文件的前缀-->
    <property name="basename" value="language"/>
</bean>

然后在添加 JSTL 的 jar 包

在页面当中编写标签,编写完成之后,启动工程,访问 http://localhost:8080/ 首先它是根据你浏览器语言来的,我这里默认加载的是 zh_CN` 的文件,你可以在浏览器中进行切换语言然后在进行刷新即可发现内容变了,在这里我是通过了 Controller 跳转到对应的 显示页面的具体 Controller 的代码内容我放在下面了可以进行参考

代码语言:java
复制
/**
 * @author BNTang
 */
@Controller
public class MyController {
   @RequestMapping("local")
    public String local(){
       return "local";
   }
}

注意一下我 local 页面的位置,在前面的 SpringMVC-默认加载的组件 章节中我讲解了如何配置视图解析器来映射到这个位置,不懂的可以回去看看

代码语言:java
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>国际化</title>
</head>
<body>
<fmt:message key="welcome"/>
<fmt:message key="introduce"/>
</body>
</html>

如上的准备工作都完毕了之后,启动工程进行测试,我第一次启动工程发现默认给我加载的是 language_zh_CN.properties 资源文件的内容

那么这是什么原理呢,因为我浏览器设置语言默认是 中文(简体) 看了第一次加载之后我把语言改为 英语(美国) 然后在刷新一下页面在重新加载发现加载的内容又换了

原理

如果没有显式的定义本地化解析器,SpringMVC 会使用 AcceptHeaderLocaleResolver 根据 HTTP 请求头的 Accept-Language 参数确定本地化类型

中英文的切换

概述

默认情况是通过 AccepHeaderLocaleResolver 来从浏览器当中获取语言信息,可以从请求参数中获取本次请求对应的本地化类型。获取到本地类型后, 给写入到session 当中

实现

首先修改 SpringMVC 核心配置文件,添加的内容如下

代码语言:html
复制
<!--配置 session 本地解析器-->
<bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver"/>
<mvc:interceptors>
    <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
        <property name="paramName" value="language"/>
    </bean>
</mvc:interceptors>

然后在修改一下中英文切换时的资源文件内容,也就是我们之前上面新建的那两个文件,修改一下内容

首先修改 language_en_US.properties 配置文件的内容

代码语言:text
复制
language.cn=China
language.en=English
welcome=welcome
introduce=This is I18N Demo

在紧接着修改 language_zh_CN.properties 配置文件的内容

代码语言:text
复制
language.cn=中文
language.en=英文
welcome=欢迎光临
introduce=这是一个国际化示例

然后在修改 index.jsp 添加两个 a 标签来发送请求进行中英文的切换

代码语言:java
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>国际化</title>
</head>
<body>

<a href="?language=zh_CN"><fmt:message key="language.cn"/></a>
<br/>
<a href="?language=en_US"><fmt:message key="language.en"/></a>

<fmt:message key="welcome"/>
<fmt:message key="introduce"/>
</body>
</html>

启动工程,然后分别点击两个不同的按钮效果如下,首先点击的是中文

在紧接着我又点击了一下英文效果如下

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • 默认实现过程
  • 原理
  • 中英文的切换
    • 概述
      • 实现
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com