zoukankan      html  css  js  c++  java
  • SpringBoot中的国际化

    在国际化项目中,需要考虑对特定语言环境下的前端请求,返回特定语言的操作结果信息。如在中文环境下,后端返回操作成功信息:“操作成功”;在英文环境下,后端返回操作成功信息:“success”;

    本文将以UAC项目为例,讲解在SpringBoot项目中如何实现国际化。

    一、项目国际化配置

    1. 添加国际化处理器

      在项目中添加信息国际化处理器:MessageSourceHandler;

      MessageSourceHandler源码:

    package com.uac.handler;
    
    import org.springframework.context.MessageSource;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    
    /**
    * @author wxy
    */
    @Component
    public class MessageSourceHandler {
       @Resource
       private HttpServletRequest request;
       @Resource
       private MessageSource messageSource;
    
       public String getMessage(String messageKey) {
           return messageSource.getMessage(messageKey, null, request.getLocale());
       }
    }
    

      其中MessageSource为SpringBoot自带组件;引入HttpServletRequest目的是从前端请求中获取当前请求的语言环境信息。

    2. 添加国际化配置文件

      在项目resources目录下新增名为i18n的文件夹,i18n(其来源是英文单词 internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称。在i18n目录下添加Resource Bundle,如下图:

    resourceBundle.png

      可根据项目实际情况增加语种,本例中默认语种设为中文,另增加了英语和繁体中文,共三个语种配置文件;在项目后期开发过程中如需增加新的语种,在Resource Bundle中新增对应语种的配置文件即可。

      默认语种messages.properties配置国际化字段:

    message.success=操作成功
    message.fail=操作失败
    

      美式英语messages_en_US.properties中国际化配置:

    message.success=success
    message.fail=request was aborted
    

      繁体中文messages_zh_TW.properties中国际化配置:

    message.success=操作成功
    message.fail=請求失敗
    

      在项目配置文件 application.yml 中填写国际化配置文件的相对路径,表示读取i18n文件夹下前缀为messages的配置文件,编码设置为UTF-8以防止出现中文乱码情况,所有语种的messages.properties配置文件也要设置为以UTF-8编码格式保存。

      application.yml中国际化配置:

    spring:
      messages:
        basename: i18n/messages
        encoding: UTF-8
    

    二、返回值枚举类中使用国际化

      返回值枚举类中定义的message为messages.properties中的定义的key。通过静态内部类的方式将国际化处理器MessageSourceHandler 注入,在getMessage()方法中调用国际化处理器:return messageSourceHandler.getMessage(message),实现根据请求中的特定语言环境动态返回相应的操作信息。

      定义返回枚举类国际化配置:

    package com.uac.enumeration;
    
    import com.uac.handler.MessageSourceHandler;
    import lombok.Getter;
    import lombok.Setter;
    import org.springframework.stereotype.Component;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.Resource;
    import java.util.EnumSet;
    
    /**
    * @author linksfield
    */
    public enum RespEnum {
       success("0000", "message.success"),
       fail("9999", "message.fail");
    
       @Getter
       private String code;
       private String message;
       @Setter
       private MessageSourceHandler messageSourceHandler;
    
       public String getMessage() {
           return messageSourceHandler.getMessage(message);
       }
    
       /**
        * 通过静态内部类的方式注入bean,并赋值到枚举中
        */
       @Component
       public static class ReportTypeServiceInjector {
           // 引入国际化处理类
           @Resource
           private MessageSourceHandler messageSourceHandler;
    
           @PostConstruct
           public void postConstruct() {
               for (RespEnum resp : EnumSet.allOf(RespEnum.class)) {
                   resp.setMessageSourceHandler(messageSourceHandler);
               }
           }
       }
    
       RespEnum(String code, String message) {
           this.code = code;
           this.message = message;
       }
    }
    
    

    三、多模块项目中配置国际化

      在多个module组成的SpringBoot项目中,可以为每个module单独配置属于自己的国际化资源。

    1. 模块单独添加国际化配置文件

      每个module单独配置一套配置文件;需要注意的是:配置文件basename不能出现重复,否则会出现配置文件被其他模块的同名配置文件屏蔽的情况!这里建议使用各个module的模块名作为配置文件的basename,既避免出现重复,又逻辑清晰优雅。

    2. 配置查找国际化资源路径

      在程序入口所在包下application.yml配置文件中,配置所引用的module中的国际化路径,通过“,”来配置多个module的国际化资源文件。如下所示:

      application.yml中多module国际化配置:

    spring:
      messages:
        basename: i18n/common,i18n/publicRes,i18n/roleRight,i18n/userMng
        encoding: UTF-8
    
  • 相关阅读:
    p1012拼数题解
    LeetCode OJ :Unique Binary Search Trees II(唯一二叉搜索树)
    UVA 11827 Maximum GCD
    LightOJ1336 Sigma Function(约数和为偶数的个数)
    LightOJ 1197 Help Hanzo(区间素数筛选)
    LightOJ 1236
    BZOJ3339 Rmq Problem
    COJ983 WZJ的数据结构(负十七)
    LCA的五种解法
    hdu4223(dp)
  • 原文地址:https://www.cnblogs.com/weixinya/p/12893531.html
Copyright © 2011-2022 走看看