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
posted @ 2020-05-15 10:44  新亚  阅读(1081)  评论(0编辑  收藏  举报