# 国际化

1.10.0版本后端增加了国际化支持

# 配置

在每个maven模块的resources下增加文件i18n/{path}/{name}_{lang}_{region}.properties:

  1. {path}为子目录名,可建立多级.
  2. {name}为文件名,不能包含下划线(_)
  3. {lang}为语言,如: zh,en
  4. {region}为地区,如: CN,US

例:

--resources
-----|---i18n
-----|----|---module1
-----|----|----|--messages_zh_CN.properties
-----|----|----|--messages_en_US.properties

WARNING

不同的模块使用的路径+文件名不能相同.

文件内容格式:

validation.username_must_be_not_empty=用户名不能为空
validation.data_does_not_exist=数据不存在,ID:{0}

# 异常

在API请求抛出异常时,message设置为对应的key,如:

throw new IllegalArgumentException("validation.username_must_be_not_empty");

在需要参数化动态生成消息的时候,需要使用实现I18nSupportException的接口.并传入args,如:

throw new I18nSupportException("validation.data_does_not_exist",id);

# 枚举

在API调用时,平台会将实现了EnumDict接口的枚举序列化为一个对象:

{
    "value":"枚举标识",
    "text":"说明"
}

text支持使用国际化来展示.

使用: 枚举实现接口I18nEnumDict即可.在序列化时,会使用{className}.{enumName}作为key进行转换. 例如:

com.domain.dict.DeviceState.java

package com.domain.dict;
  
   @AllArgsConstructor
   @Getter
   @Dict("device-state")
   public enum DeviceState implements I18nEnumDict<String>  {
       notActive("未启用"),
       offline("离线"),
       online("在线");
  
       private final String text;
  
       @Override
       public String getValue() {
           return name();
       }
   }

resources/i18n/my-module/message_zh_CN.properties

 com.domain.dict.DeviceState.notActive=未启用
 com.domain.dict.DeviceState.offline=离线
 com.domain.dict.DeviceState.online=在线

# jsr303

正常使用jsr303相关注解即可.

如果注解中指定了message,并且没有使用jsr303的国际化,则会使用这个message作为key进行国际化. 如果没有指定message,则使用validation.property_validate_failed={0}{1}进行国际化提示. {0}为实体类属性名,{1}为jsr303的消息.

如果需要将实体类属性名也进行国际化,需要在启动参数中添加-Di18n.validation.property.enabled=true. 然后在国际化配置文件中增加{className}.{property}的key即可.

# 编程式使用

具体查看工具类 LocaleUtils (opens new window).