如何利用Spring Boot框架开发一个全球化的应用程序

本文详细介绍了如何利用Spring Boot框架开发全球化应用程序,包括Thymeleaf模板引擎对多语言的支持,Spring Boot中时间日期格式化,以及RESTful API的多语言支持。文章通过自定义区域解析器、设置资源文件、Thymeleaf模板和日期格式化方法,展示了Spring Boot在多语言环境下的应用实践。
摘要由CSDN通过智能技术生成

Spring Boot 主要通过 Maven 或 Gradle 这样的构建系统以继承方式添加依赖,同时继承了 Spring 框架中的优秀元素,减少了 Spring MVC 架构中的复杂配置,内置 Tomcat,Jetty 容器,使用 Java application 运行程序,而不是传统地把 WAR 包置于 Tomcat 等容器中运行,从而简化加速开发流程。此外,Spring Boot 学习简单、轻量级、容易扩展。基于这些优秀的特点,Spring Boot 成为了蓬勃发展的快速应用开发领域的领导者。

在互联网日益发展的当今时代,一个应用程序需要在全球范围内使用势在必然。传统的程序设计方法将可翻译信息如菜单按钮的标签、提示信息、帮助文档等文字信息硬编码在程序代码中,但这些已经不能很好的适应全球化发展,而且程序的扩展性差,维护成本高。一个能支持全球化的应用程序,必须实现单一可执行的程序,动态地使用资源(Single Source Single Executable)。

对于一个能支持全球化的应用程序来说,需要考虑下面三方面的设计,如图 1 所示。

图 1. 多语言应用程序模型

如何利用Spring Boot框架开发一个全球化的应用程序

  • 区域模型的定制化(Locale Model): Locale 模型是一个多语言应用程序的基础,用来确定界面语言以及日期时间等的格式化方式,通常包括语言环境(Language Locale)和文化环境(Cultural Locale)。一个应用程序的 Locale 获取有下面几种常见的方式:
  • 取自用户当前操作系统的区域设置: Locale.getDefault();。
  • 取自用户浏览器设定的语言区域。
  • 应用程序自定义的语言选择界面。
  • 其他更高级的方式,例如根据用户输入法自动选择语言区域,从而显示对应的界面语言等。

一个应用程序具体选择哪种方式获取区域信息(Locale),这需要取决于该应用程序的用户需求。

  • 资源文件的外部化: 这里主要指界面语言,根据用户选择的 Locale 模型,自动地显示与之对应的界面语言,让客户感觉这个产品是为他们而设计的。
  • 日期时间等多元文化的支持: 包括货币、日历、时间、日期、排序、界面方向性(Bi-directional) 等符合各个国家自己习惯的显示方式。

下面主要从上述三方面分别介绍基于 Spring Boot 应用程序如何支持多语言的,包括 RESTful 消息和内容的国际化支持。

Spring Boot 中的区域模型介绍在自定义应用程序区域模型(Locale)之前,需要了解一下 Spring Boot 中区域解析器的原理。基于 Spring 框架的应用程序中,用户的区域信息是通过区域解析器 LocaleResolver 来识别的,LocaleResolver 是 Spring 框架基于 Web 提供的区域解析器接口,允许通过 HTTP 请求和响应修改区域设置,如清单 1 所示。

清单 1. Spring 框架中的区域解析器

public interface LocaleResolver {
    Locale resolveLocale(HttpServletRequest request);
    void setLocale(HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Locale locale);
}

LocaleResolver 在 Spring 框架中有四种具体的实现:

  • 按 HTTP 请求头部解析区域(AcceptHeaderLocaleResolver): Spring 采用的默认区域解析器就是基于请求头部,它通过检验 HTTP 请求的 accept-language 头部来解析区域,这个头部是由用户的 Web 浏览器设定决定的。
  • 按会话属性解析区域(SessionLocaleResolver): 它通过检验用户会话中预置的属性来解析区域。如果该会话属性不存在,它会根据 accept-language HTTP 头部确定默认区域。
  • 按 Cookie 解析区域(CookieLocaleResolver): 如果 Cookie 存在,它会根据 accept-languageHTTP 头部确定默认区域。
  • FixedLocaleResolver: 此解析器始终返回固定的默认区域设置,通常取自 JVM 的默认区域设置。

除了 Spring 框架中提供的四种实现外,还可以创建自定义的区域解析器。在 Spring Boot 自动配置中可以看到清单 2 的代码。

//向容器中加入了 LocaleResolver 对象
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(
        prefix = "spring.mvc",
        name = {"locale"}
    )
    public LocaleResolver localeResolver() {
        if (this.mvcProperties.getLocaleResolver() == org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties.LocaleResolver.FIXED) {
            return new FixedLocaleResolver(this.mvcProperties.getLocale());
     } else {
            AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
            localeResolver.setDefaultLocale(this.mvcProperties.getLocale());
            return localeResolver;
        }
    }

        
当我们的应用程序需要自定义区域解析器(LocaleResovler)的时候,可以通过下面几个步骤实现。

第一步:自定义区域解析器

自定义区域解析器是对 Spring 中 LocaleResolver 接口的实现,可以基于应用程序的实际需求,取自于用户自定义的语言选择界面、用户操作系统或者浏览器的语言设定。清单 3 是一个示例,首先判断用户请求中是否含有 lang 这个参数,如果有,就使用这个参数所带的区域信息;如果没有,就取自浏览器请求头部中的 accept-language 信息。

清单 3. 自定义区域解析器

public class CustomLocaleResolver implements LocaleResolver{
 
@Override
public Locale resolveLocale(HttpServletRequest request) {
        String paramLanguage = request.getParameter("lang");
        if(!StringUtils.isEmpty(paramLanguage)){
            String[] splits = paramLanguage.split("-");
            return new Locale(splits[0], splits[1]);
        }else{
            String acceptLanguage = request.getHeader("Accept-Language").split(",")[0];
            String[] splits = acceptLanguage.split("-");
            return new Locale(splits[0], splits[1]);
        }
        // 如果想使用当前系统的语言,则使用Locale.getDefault()
   } 
 
@Override
public void setLocale(HttpServletRequest request, HttpServletResponse response, Locale locale) {
    }
}

第二步: 将自定义的区域解析器添加到 IOC 容器中

通常添加在自定义的 config 文件中,下面的例子将自定义的 CustomLocaleResolver 通过 @Bean

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

清单 4. 自定义区域解析器添加到 IOC

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

如此,在程序中就可以调用我们自定义的区域解析器。

Thymeleaf 模板引擎对多语言的支持

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 模板支持多语言的步骤如下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值