Spring框架为Java应用提供了强大的国际化支持。本文深入探讨Spring国际化的实现细节,包括资源文件的创建、加载机制和使用方法。我们将介绍命名规则、配置选项和最佳实践,帮助开发者构建全球化应用。无论您是初学者还是希望深化理解,本文都将为您提供宝贵见解,开启Spring应用的多语言、多文化之门。
国际化资源文件用于不同语言的翻译,放置到resources下。命名规则如下:
basename_languageCode_countryCode/regionCode.properties,比如:messages_zh_CN.properties
其中:
• basename:基础名称,通常是通用的资源文件名,例如 messages。
• languageCode:表示语言的小写 ISO 639 语言代码,例如 en 表示英语,zh 表示中文。
• countryCode/regionCode:表示国家的大写 ISO 3166 国家/区域代码,例如 US 表示美国,CN 表示中国。
其中languageCode和countryCode是可选的,越详细匹配的时候就可以更精准。
注意各个部分是以下划线进行连接的,和语言区域代码的中横线链接(如:zh-CN)有区别。
Spring默认会加载basename为messages的国际化资源,可通过如下属性来配置加载的行为:
spring:
messages:
basename: messages #默认值messages
encoding: UTF-8 #解析编码,默认UTF-8
cache-duration: 30s #默认长期缓存
fallback-to-system-locale: true # 当找不到指定的语言资源时,是否回退到系统默认语言。默认值为 true。
always-use-message-format: false # 是否始终将消息作为 `MessageFormat` 处理。如果是 false,则仅在消息包含参数时才使用 `MessageFormat`。
use-code-as-default-message: false # 当找不到消息时,是否使用消息代码作为默认消息。默认值为 false,意味着在找不到资源时不会使用消息代码,而是返回 null。
若需要自定义其他加载行为,比如默认语言区域,或需要加载更多的其他自定义国际化资源,可以声明定制化的加载器,具体如下:
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:message/message");
messageSource.setCacheSeconds(10);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setDefaultLocale(Locale.ENGLISH); //设置默认区域
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
messageSource.getMessage(code, params, locale);//获取code在locale区域的信息
通常,在Spring处理请求时,会根据用户的语言区域来设置locale参数,Spring已经内置了对区域参数的解析(accept-language请求头),直接基于LocaleContextHolder使用即可,如下:
messageSource.getMessage(code, params, LocaleContextHolder.getLocale());
Spring解析当前请求的语言区域的流程如下: