首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

Spring Boot 架构中的国际化支持实践

2020-01-11

Spring Boot 首要通过 Maven 或 Gradle 这样的构建体系以承继办法添加依靠,一起承继了 Spring 结构中的优异元素,减少了 Spring MVC 架构中的杂乱装备,内置 Tomcat,Jetty 容器,运用 Java application 运转程序,而不是传统地把 WAR 包置于 Tomcat 等容器中运转,然后简化加快开发流程。此外,Spring Boot 学习简略、轻量级、简略扩展。依据这些优异的特色,Spring Boot 成为了蓬勃开展的快速运用开发范畴的领导者。

在互联网日益开展的当今年代,一个运用程序需求在全球范围内运用势在必定。传统的程序规划办法将可翻译信息如菜单按钮的标签、提示信息、协助文档等文字信息硬编码在程序代码中,但这些现已不能很好的习惯全球化开展,而且程序的扩展性差,保护本钱高。一个能支撑全球化的运用程序,有必要完成单一可执行的程序,动态地运用资源。

关于一个能支撑全球化的运用程序来说,需求考虑下面三方面的规划,如图 1 所示。

Locale 模型是一个多言语运用程序的根底,用来确认界面言语以及日期时刻等的格式化办法,一般包含言语环境和文化环境。一个运用程序的 Locale 获取有下面几种常见的办法:

Locale.getDefault;

一个运用程序详细挑选哪种办法获取区域信息,这需求取决于该运用程序的用户需求。

public interface LocaleResolver {
 Locale resolveLocale;
 void setLocale;
}

LocaleResolver 在 Spring 结构中有四种详细的完成:

除了 Spring 结构中供给的四种完成外,还能够创立自界说的区域解析器。在 Spring Boot 主动装备中能够看到清单 2 的代码。

//向容器中加入了 LocaleResolver 目标
 @Bean
 @ConditionalOnMissingBean
 @ConditionalOnProperty {
 if  == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
 return new FixedLocaleResolver);
 } else {
 AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver;
 localeResolver.setDefaultLocale);
 return localeResolver;
 }

当咱们的运用程序需求自界说区域解析器的时分,能够通过下面几个过程完成。

自界说区域解析器是对 Spring 中 LocaleResolver 接口的完成,能够依据运用程序的实践需求,取自于用户自界说的言语挑选界面、用户操作体系或许浏览器的言语设定。清单 3 是一个示例,首要判别用户恳求中是否含有 lang 这个参数,假如有,就运用这个参数所带的区域信息;假如没有,就取自浏览器恳求头部中的 accept-language 信息。

public class CustomLocaleResolver implements LocaleResolver{
@Override
public Locale resolveLocale {
 String paramLanguage = request.getParameter){
 String[] splits = paramLanguage.split;
 }else{
 String acceptLanguage = request.getHeader.split[0];
 String[] splits = acceptLanguage.split;
 // 假如想运用当时体系的言语,则运用Locale.getDefault
@Override
public void setLocale {
}

一般添加在自界说的 config 文件中,下面的比方将自界说的 CustomLocaleResolver 通过 @Bean

注添加到 IOC 容器,如清单 4 所示。

@Configuration
public class CustomMvcConfigure extends WebMvcConfigurationSupport {
@Bean
public LocaleResolver localeResolver{
return new CustomLocaleResolver;
}

如此,在程序中就能够调用咱们自界说的区域解析器。

Thymeleaf 是一个依据 Apache License 2.0 答应,支撑 XML、XHTML、HTML5 的开源模板引擎,首要用于 Web 或许非 Web 环境中的运用开发,在有网络和无网络的环境下皆可运转,它既能够在浏览器端检查静态页面,也能够显现动态页面。这是因为它支撑 HTML 原型,然后在 HTML 标签里添加额定的特点来到达模板+ 数据的展现办法。浏览器解析 HTML 时会疏忽未界说的标签特点,所以 Thymeleaf 模板能够静态地运转;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显现。

在 Spring MVC 结构中,一般咱们用 JSP 来展现 Web 前端,JSP 本质上也是模板引擎,可是 Spring Boot 官方引荐运用 Thymeleaf 模板引擎,Thymeleaf 完全能够代替 JSP 或许其他模板引擎如 Velocity、FreeMarker 等。尽管 Spring 官方引荐运用 Thymeleaf,可是并不是说 Spring Boot 不支撑 JSP。

在 Spring Boot 项目中运用 Thymeleaf 模板支撑多言语的过程如下:

在咱们的试验中,规划一个简略的登录页面,登录页面有个言语挑选下拉列表,将运用用户选的言语来显现登录页面上的标签,如图 2 所示。

默许状况下,资源文件是直接放在 src/main/resource 目录下,为了完成代码的结构化,咱们在 resource 目录下创立 i18n 文件夹,然后在 i18n 目录下创立资源文件,这种状况下,咱们需求在装备文件 application.properties 中从头指定资源文件的 basename:spring.messages.basename 。资源文件名能够依据自己的项目界说,可是一般的标准是:模块名_言语_国家 .properties ,在本实例中咱们命名为如 log_zh_CN.properties ,资源文件的目录结构如图 3 所示。

对应资源文件中的每一个 property key ,一般都是小写字母最初,用下划线表明这个 key 在程序中的层级结构,而且依照字母次序排序,便于管理和查找,如清单 6 所示。

login_home=Home
login_login=Log In
login_login_page=Login page
login_languge_selector=Language Selector
login_please_select_language_to_display=Please select the language to display
login_password=Password
login_username=Username

在 Spring Boot 架构中运用 Thymeleaf 模板,首要需求在 pom.xml 中引进 Thymeleaf 模板依靠 pring-boot-starter-thymeleaf ,如清单 7 所示。

 dependency 
 groupId org.springframework.boot /groupId 
 artifactId spring-boot-starter-thymeleaf /artifactId 
 /dependency 

此外,还需求在 application.properties 中装备 Thymeleaf 视图解析器,如清单 8 所示。

#============ thymeleaf ====================================
spring.thymeleaf.mode=HTML
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.cache=false

依据事务需求编写 Thymeleaf 模板 HTML 文件,默许的模板映射途径是: src/main/resources/templates ,也能够在 application.properties 中装备自界说的模板途径 spring.thymeleaf.prefix=classpath:/templates/myTemplates/ 。

在 Thymeleaf 模板文件中,将一切的硬编码字符串抽取出来放到资源文件中,然后用资源文件中的键值 #{Property Key} 来表明界面显现的标签信息:

清单 9 是一个简略登录页面的 Thymeleaf 模板内容,其间一切显现的标签信息都抽取到资源文件中,如 th:text= # ,然后依据用户挑选的言语主动读取对应的资源文件中的字符串来显现。

 body 
 div layout:fragment= content th:remove= tag 
 div 'en_US'} value= en_US English /option 
 option th:selected= ${displayLang=='zh_CN'} value= zh_CN 简体中文 /option 
 option th:selected= ${displayLang=='ja_JP'} value= ja_JP 日本語 /option 
 option th:selected= ${displayLang=='zh_TW'} value= zh_TW 繁體中文 /option 
 /select 
 /div /div div /div /div /div 
 /body 

在试验中遇到一个问题,界面字符串悉数显现为 ??Properties_Key_言语?? ,如图 4 所示。

通过一步步排查,原因是在装备文件 application.properties 过错装备了资源文件的途径如图 5 所示。正确的途径为 spring.messages.basename=i18n/login 。

Java 8 供给了更快捷的日期时刻 API 如 LocalDate、LocalTime 和 LocalDateTime,Spring Boot 架构中引荐运用 Java 8 中新的时刻日期 API。LocalDate 较 Date 类的长处体现在以下几个方面:

关于后台 Java 程序中的时刻日期格式化问题,一般会从头定制化时刻日期格式化接口,比方将 Locale 参数、想要显现的款式参数传入进去。清单 10 是格式化时刻日期的接口示例代码,清单 11 是详细完成的示例代码,这儿只列举了几种典型的格式化状况。

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Locale;
public interface I18nFormatter {
 String formaFullDateTime;
 String formatFullDate;
 String formatMediumDateTime;
 String formatMediumDate;
 String formatMediumDateShortTime;
 String formatMediumTime;
 String formatShortDateTime;
 String formatShortDate;
 String formatShortTime;
 String formatShortDateMediumTime;
@Service
public class I18nFormatterImpl implements I18nFormatter { 
@Override
public String formatFullDate {
 DateTimeFormatter dateFormat =DateTimeFormatter.ofLocalizedDate.withLocale;
 return dateFormat.format;
@Override
public String formatMediumDateTime {
 DateTimeFormatter dateFormat = DateTimeFormatter.ofLocalizedDateTime.withLocale;
 return dateFormat.format;

热门文章

随机推荐

推荐文章