国际化
支持 国际化消息
配置
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"));
}