您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot 12 国际化

时间:2020-09-03 13:08:22  来源:  作者:

建立多语言网站,可以获得更多用户流量。多语言网站被称为国际化(i18n),与本地化相反。

你比如京东、淘宝这类电商网站就是国际化的电商网站,它支持多国语言。

注意: 国际化是一个由18个字符组成的单词,第一个字符为i,最后一个字符为n,因此通常缩写为 i18n。

Spring通过为不同的语言环境使用Spring拦截器,语言环境解析器和资源包,为国际化(i18n)提供了广泛的支持。在本文中,我将知道您使用Spring Boot构建了一个简单的多语言网站。

你可以预览一下示例:

在示例中,语言环境信息位于URL的参数上。语言环境信息将存储在Cookie中,并且用户不会在接下来的页面中重新选择语言。

  • http://localhost:8080/SomeContextPath/login1?lang=zh
  • http://localhost:8080/SomeContextPath/login1?lang=en

URL上的语言环境信息的另一个示例:

  • http://localhost:8080/SomeContextPath/zh/login2
  • http://localhost:8080/SomeContextPath/en/login2

12.1 创建Spring Boot项目

Spring Boot 12 国际化

 

我在这里为以下语言创建2个属性文件:中文、英语。

i18n / messages_zh.properties

label.password=密码
label.submit=登陆label.title= 登陆页面label.userName=用户名

如果你的eclipse中显示如下编码形式:

label.password=\u5BC6\u7801
label.submit=\u767B\u9646label.title= \u767B\u9646\u9875\u9762label.userName=\u7528\u6237\u540D

修改首选项中的content Types下的:

Spring Boot 12 国际化

 

 

第二步配置.proerties文件右键属性配置,设置其字符编码

Spring Boot 12 国际化

 

i18n / messages_en.properties

label.password= Password
label.submit= Loginlabel.title= Login Pagelabel.userName= User Name

Eclipse支持使用消息编辑器来编辑文件的信息。

12.2 拦截器和LocaleResolver

Spring Boot 12 国际化

 

您需要声明2个Spring bean,包括localeResolver和messageResource。

LocaleResolver指定如何获取用户将使用的语言环境信息。CookieLocaleResolver将从Cookie读取语言环境信息,以查找用户以前使用的语言。

MessageResource 将加载属性文件内容

Spring Boot 12 国际化

 

在Controller处理请求之前,它必须经过拦截器,您需要在该拦截器中注册LocaleChangeInterceptor,拦截器处理用户的语言环境更改。

WebMvcConfig.JAVA

package me.laocat.i18n.config;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean(name = “localeResolver”)
public LocaleResolver getLocaleResolver() {
// Cookie本地化解析器
CookieLocaleResolver resolver = new CookieLocaleResolver();
resolver.setCookieDomain(“myAppLocaleCookie”);
// 60 分钟
resolver.setCookieMaxAge(60 * 60);
return resolver;
}
@Bean(name = “messageSource”)
public MessageSource getMessageResource() {
// 可重新加载的资源包消息源
ReloadableResourceBundleMessageSource messageResource = new ReloadableResourceBundleMessageSource();
// 读 i18n/messages_xxx.properties file.
// 例如: i18n/messages_en.properties
messageResource.setBasename(“classpath:i18n/messages”);
messageResource.setDefaultEncoding(“UTF-8”);
return messageResource;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 本地化修改拦截器
LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
localeInterceptor.setParamName(“lang”);
registry.addInterceptor(localeInterceptor).addPathPatterns(“/*”);
}
}

12.3 控制器和视图

Spring Boot 12 国际化

 

I18nController.java(在参数上设置本地化)

package me.laocat.i18n;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class I18nController {
@RequestMapping(value = { “/”, “/login1” })
public String staticResource(Model model) {
return “login1”;
}}

login1.html (Thymeleaf 视图)

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
   <head>
      <meta charset="UTF-8">
      <title th:utext="#{label.title}"></title>
   </head>
   <body>
      <div style="text-align: right;padding:5px;margin:5px 0px;background:#ccc;">
         <a th:href="@{/login1?lang=en}">Login (En)</a>
          |          <a th:href="@{/login1?lang=zh}">Login (Zh)</a>
      </div>
      <form method="post" action="">
         <table>
            <tr>
               <td>
                  <strong th:utext="#{label.userName}"></strong>
               </td>
               <td><input name="userName" /></td>
            </tr>
            <tr>
               <td>
                  <strong  th:utext="#{label.password}"></strong>
               </td>
               <td><input name="password" /></td>
            </tr>
            <tr>
               <td colspan="2">
                  <input type="submit" th:value="#{label.submit}" />
               </td>
            </tr>
         </table>
      </form>
   </body>
</html>

12.4 URL上的语言环境信息

如果您要构建一个多语言网站,其语言环境信息位于URL上。您需要更改一些配置:

  • http://localhost:8080/SomeContextPath/en/login2
  • http://localhost:8080/SomeContextPath/zh/login2

创建2个类UrlLocaleInterceptor和UrlLocaleResolver

UrlLocaleInterceptor.java

package me.laocat.i18n.interceptors;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import org.springframework.web.servlet.support.RequestContextUtils;
public class UrlLocaleInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);if (localeResolver == null) {
throw new IllegalStateException(“找不到LocaleResolver:不在DispatcherServlet请求中??”);
}// 从LocaleResolver获取区域设置
Locale locale = localeResolver.resolveLocale(request);
localeResolver.setLocale(request, response, locale);
return true;
}
}

UrlLocaleResolver.java

package me.laocat.i18n.resolver;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
@Configuration
public class UrlLocaleResolver implements LocaleResolver {
private static final String URL_LOCALE_ATTRIBUTE_NAME = “URL_LOCALE_ATTRIBUTE_NAME”;
@Bean(name = “messageSource”)
@Override
public Locale resolveLocale(HttpServletRequest request) {
// ==> /SomeContextPath/en/…
// ==> /SomeContextPath/zh/…
// ==> /SomeContextPath/WEB-INF/pages/…
String uri = request.getRequestURI();
System.out.println(“URI=” + uri);
String prefixEn = request.getServletContext().getContextPath() + “/en/”;
String prefixZh = request.getServletContext().getContextPath() + “/zh/”;
Locale locale = null;
// English
if (uri.startsWith(prefixEn)) {
locale = Locale.ENGLISH;
}
// China
else if (uri.startsWith(prefixZh)) {
locale = new Locale(“zh”, “CN”);
}
if (locale != null) {
request.getSession().setAttribute(URL_LOCALE_ATTRIBUTE_NAME, locale);
}
if (locale == null) {
locale = (Locale) request.getSession().getAttribute(URL_LOCALE_ATTRIBUTE_NAME);
if (locale == null) {
locale = Locale.ENGLISH;
}
}
return locale;
}
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
// Nothing
}
}

重新更改WebMvcConfig中的Interceptor配置 

WebMvcConfig.java

package me.laocat.i18n.config;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.CookieLocaleResolver;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
import me.laocat.i18n.interceptors.UrlLocaleInterceptor;
import me.laocat.i18n.resolver.UrlLocaleResolver;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Bean(name = “localeResolver”)
public LocaleResolver getLocaleResolver() {
// Cookie本地化解析器
// CookieLocaleResolver resolver = new CookieLocaleResolver();
// resolver.setCookieDomain(“myAppLocaleCookie”);
// 60 分钟
// resolver.setCookieMaxAge(60 * 60);
LocaleResolver resolver = new UrlLocaleResolver();
return resolver;
}
@Bean(name = “messageSource”)
public MessageSource getMessageResource() {
// 可重新加载的资源包消息源
ReloadableResourceBundleMessageSource messageResource = new ReloadableResourceBundleMessageSource();
// 读 i18n/messages_xxx.properties file.
// 例如: i18n/messages_en.properties
messageResource.setBasename(“classpath:i18n/messages”);
messageResource.setDefaultEncoding(“UTF-8”);
return messageResource;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 本地化修改拦截器
// LocaleChangeInterceptor localeInterceptor = new LocaleChangeInterceptor();
// localeInterceptor.setParamName(“lang”);
// registry.addInterceptor(localeInterceptor).addPathPatterns(“/*”);
UrlLocaleInterceptor localeInterceptor = new UrlLocaleInterceptor();
registry.addInterceptor(localeInterceptor).addPathPatterns(“/en/*”, “/zh/*”);
}
}

控制器:

I18nController2.java(URL上的语言环境)

package me.laocat.i18n.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class I18nController2 {
@RequestMapping(value = “/{locale:en|zh}/login2”)
public String login2(Model model) {
return “login2”;
}}

login2.html (Thymeleaf 视图)

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
   <head>
      <meta charset="UTF-8">
      <title th:utext="#{label.title}"></title>
   </head>
   <body>
      <div style="text-align: right;padding:5px;margin:5px 0px;background:#ccc;">
         <a th:href="@{/en/login2}">Login (English)</a>
          |          <a th:href="@{/zh/login2}">Login (China)</a>
      </div>
      <form method="post" action="">
         <table>
            <tr>
               <td>
                  <strong th:utext="#{label.userName}"></strong>
               </td>
               <td><input name="userName" /></td>
            </tr>
            <tr>
               <td>
                  <strong  th:utext="#{label.password}"></strong>
               </td>
               <td><input name="password" /></td>
            </tr>
            <tr>
               <td colspan="2">
                  <input type="submit" th:value="#{label.submit}" />
               </td>
            </tr>
         </table>
      </form>
   </body>
</html>

运行应用程序:

http://localhost:8080/zh/login2

12.5 多语言网站,内容存储在数据库中

上面的多语言网站示例无法满足您的需求。您需要具有多种语言的新闻网站,并且其内容存储在数据库中。您可以使用多个数据源的解决方案,其中每个数据源都是一个包含语言内容的数据库。

Spring Boot 12 国际化


Tags:Spring Boot   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言一个基于spring boot的JAVA开源商城系统,是前后端分离、为生产环境多实例完全准备、数据库为b2b2c商城系统设计、拥有完整下单流程和精美设计的java开源商城系统https://...【详细内容】
2021-09-17  Tags: Spring Boot  点击:(119)  评论:(0)  加入收藏
在 Java 和 Kotlin 中, 除了使用Spring Boot创建微服务外,还有很多其他的替代方案。 名称 版本 发布时间 开发商 GitHub ...【详细内容】
2021-08-06  Tags: Spring Boot  点击:(173)  评论:(0)  加入收藏
大家都知道,MyBatis 框架是一个持久层框架,是 Apache 下的顶级项目。Mybatis 可以让开发者的主要精力放在 sql 上,通过 Mybatis 提供的映射方式,自由灵活的生成满足需要的 sql 语句。使用简单的 XML 或注解来配置和映射原...【详细内容】
2021-07-06  Tags: Spring Boot  点击:(96)  评论:(0)  加入收藏
首先,先看 SpringBoot 的主配置类:@SpringBootApplicationpublicclassStartEurekaApplication{publicstaticvoidmain(String[] args){SpringApplication.run(StartEurekaAppli...【详细内容】
2021-06-11  Tags: Spring Boot  点击:(144)  评论:(0)  加入收藏
今天又要给大家介绍一个 Spring Boot 中的组件 --HandlerMethodReturnValueHandler。在前面的文章中(如何优雅的实现 Spring Boot 接口参数加密解密?),松哥已经和大家介绍过如何...【详细内容】
2021-03-24  Tags: Spring Boot  点击:(297)  评论:(0)  加入收藏
环境:SpringBoot2.3.9.RELEASE + SpringBootAdmin2.3.1说明:如果使用SpringBootAdmin2.4.*版本那么SpringBoot的版本也必须是2.4.*否则启动报错。Spring Boot Admin(SBA)是一个...【详细内容】
2021-03-22  Tags: Spring Boot  点击:(350)  评论:(0)  加入收藏
要让项目实现 ssl 免密登录,首先需要开启 https 。所以先从 Spring Boot 如何开启 https 说起。创建服务端证书为了开启 https ,我们需要一份证书。实际开发中,会在网上申请一...【详细内容】
2021-01-07  Tags: Spring Boot  点击:(158)  评论:(0)  加入收藏
短信发送”功能在企业应用系统开发中应该说算是很常见的了,典型的案例 如 “用户登录时可以通过手机号接收平台发送的验证码进行登录”、“用户通过手机号接收平台发送的短信...【详细内容】
2020-12-31  Tags: Spring Boot  点击:(185)  评论:(0)  加入收藏
在平常的开发过程中,我们经常需要对接口响应时间进行优化,但是呢个人感觉每次都去看浏览器的网络请求比较麻烦,因此,小编自己自己手写代码实现在控制台打印接口响应时间,这样非常...【详细内容】
2020-12-23  Tags: Spring Boot  点击:(713)  评论:(0)  加入收藏
前言在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。那么何为限流呢?顾...【详细内容】
2020-12-15  Tags: Spring Boot  点击:(121)  评论:(0)  加入收藏
▌简易百科推荐
近日只是为了想尽办法为 Flask 实现 Swagger UI 文档功能,基本上要让 Flask 配合 Flasgger, 所以写了篇 Flask 应用集成 Swagger UI 。然而不断的 Google 过程中偶然间发现了...【详细内容】
2021-12-23  Python阿杰    Tags:FastAPI   点击:(6)  评论:(0)  加入收藏
文章目录1、Quartz1.1 引入依赖<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version></dependency>...【详细内容】
2021-12-22  java老人头    Tags:框架   点击:(11)  评论:(0)  加入收藏
今天来梳理下 Spring 的整体脉络啦,为后面的文章做个铺垫~后面几篇文章应该会讲讲这些内容啦 Spring AOP 插件 (了好久都忘了 ) 分享下 4ye 在项目中利用 AOP + MybatisPlus 对...【详细内容】
2021-12-07  Java4ye    Tags:Spring   点击:(14)  评论:(0)  加入收藏
&emsp;前面通过入门案例介绍,我们发现在SpringSecurity中如果我们没有使用自定义的登录界面,那么SpringSecurity会给我们提供一个系统登录界面。但真实项目中我们一般都会使用...【详细内容】
2021-12-06  波哥带你学Java    Tags:SpringSecurity   点击:(18)  评论:(0)  加入收藏
React 简介 React 基本使用<div id="test"></div><script type="text/javascript" src="../js/react.development.js"></script><script type="text/javascript" src="../js...【详细内容】
2021-11-30  清闲的帆船先生    Tags:框架   点击:(19)  评论:(0)  加入收藏
流水线(Pipeline)是把一个重复的过程分解为若干个子过程,使每个子过程与其他子过程并行进行的技术。本文主要介绍了诞生于云原生时代的流水线框架 Argo。 什么是流水线?在计算机...【详细内容】
2021-11-30  叼着猫的鱼    Tags:框架   点击:(21)  评论:(0)  加入收藏
TKinterThinter 是标准的python包,你可以在linx,macos,windows上使用它,你不需要安装它,因为它是python自带的扩展包。 它采用TCL的控制接口,你可以非常方便地写出图形界面,如...【详细内容】
2021-11-30    梦回故里归来  Tags:框架   点击:(26)  评论:(0)  加入收藏
前言项目中的配置文件会有密码的存在,例如数据库的密码、邮箱的密码、FTP的密码等。配置的密码以明文的方式暴露,并不是一种安全的方式,特别是大型项目的生产环境中,因为配置文...【详细内容】
2021-11-17  充满元气的java爱好者  博客园  Tags:SpringBoot   点击:(25)  评论:(0)  加入收藏
一、搭建环境1、创建数据库表和表结构create table account(id INT identity(1,1) primary key,name varchar(20),[money] DECIMAL2、创建maven的工程SSM,在pom.xml文件引入...【详细内容】
2021-11-11  AT小白在线中  搜狐号  Tags:开发框架   点击:(29)  评论:(0)  加入收藏
SpringBoot开发的物联网通信平台系统项目功能模块 功能 说明 MQTT 1.SSL支持 2.集群化部署时暂不支持retain&will类型消 UDP ...【详细内容】
2021-11-05  小程序建站    Tags:SpringBoot   点击:(55)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条