国际化

支持 国际化消息

配置

spring:
  application:
    name: macula-oauth2
  messages:
    # 配置国际化消息 location
    basename: classpath*:i18n/messages 

定义国际化消息文件

resource 目录下 定义 需要的国际化消息文件:

i18n/macula-base/messages.properties

i18n/macula-base/messages_zh_CN.properties

i18n/macula-base/messages_JAPANESE.properties

i18n/macula-base/messages.properties

test.msg = i18n测试

i18n/macula-base/messages_zh_CN.properties :

test.msg = i18n测试

i18n/macula-base/messages_JAPANESE.properties :

test.msg = i18テスト

框架内部自动配置

启动时,获取 配置文件中对应的 国际化消息 basename,构建 MessageSource, 以用于支持信息的国际化和包含参数的信息的替换

public MessageSource messageSource(MessageSourceProperties properties) {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    if (StringUtils.hasText(properties.getBasename())) {
        messageSource.setBasenames(StringUtils.commaDelimitedListToStringArray(
                StringUtils.trimAllWhitespace(properties.getBasename())));
    }
    if (properties.getEncoding() != null) {
        messageSource.setDefaultEncoding(properties.getEncoding().name());
    }
    messageSource.setFallbackToSystemLocale(properties.isFallbackToSystemLocale());
    Duration cacheDuration = properties.getCacheDuration();
    if (cacheDuration != null) {
        messageSource.setCacheMillis(cacheDuration.toMillis());
    }
    messageSource.setAlwaysUseMessageFormat(properties.isAlwaysUseMessageFormat());
    messageSource.setUseCodeAsDefaultMessage(properties.isUseCodeAsDefaultMessage());
    return messageSource;
}

消息转换 API工具

内部定义 API 应用上下文工具 , 请求指定国际化消息字段时, 通过获取当前用户的Locate (语言环境) ,获取对应环境的国际化消息

public class ApiApplicationContext implements ApplicationContextAware {
   
    public static String getMessage(String code) {
      return getMessage(code, (Object[]) null);
    }
     /**
     * 获取i18n字符串,如果不存在则原样返回,Locale是采用用户信息中的, 如果不存在,则使用系统默认
     *
     * @param code i18n的编码
     * @param args 参数值
     * @return i18n字符串
     */
    public static String getMessage(String code, Object[] args) {
        Locale locale = getCurrentUserLocale();
        if (null == locale) {
            // 获取操作系统默认的地区
            locale = Locale.getDefault();
        }
        return getMessage(code, args, code, locale);
    }

使用案例:

getMessage(“test.msg”) , 获取国际化消息配置中对应的字段消息, 如果不存在 则原样返回

public LockedException createLockedException(UserSessionEntity userSession) {
  if (userSession.getLockedTime() != null) {
    Date lockedTime = userSession.getLockedTime();
    Date unlockTime = new Date(lockedTime.getTime() + settings.getKeepLockedTime() * MINS);
    Date now = new Date();
    if (unlockTime.after(now)) {
      long remainMinutes = (unlockTime.getTime() - now.getTime()) / 1000 / 60;
      long remainSeconds = (unlockTime.getTime() - now.getTime()) / 1000 % 60;
      return new LockedException(getMessage("test.msg",new Object[]{remainMinutes, remainSeconds}));
    }
  }
  return new LockedException(getMessage("test.msg"));
}