Spring框架为Java应用提供了强大的国际化支持。本文深入探讨Spring国际化的实现细节,包括资源文件的创建、加载机制和使用方法。我们将介绍命名规则、配置选项和最佳实践,帮助开发者构建全球化应用。无论您是初学者还是希望深化理解,本文都将为您提供宝贵见解,开启Spring应用的多语言、多文化之门。

1. 添加国际化资源文件

国际化资源文件用于不同语言的翻译,放置到resources下。命名规则如下:

basename_languageCode_countryCode/regionCode.properties,比如:messages_zh_CN.properties

其中:

basename:基础名称,通常是通用的资源文件名,例如 messages。

languageCode:表示语言的小写 ISO 639 语言代码,例如 en 表示英语,zh 表示中文。

countryCode/regionCode:表示国家的大写 ISO 3166 国家/区域代码,例如 US 表示美国,CN 表示中国。

其中languageCodecountryCode是可选的,越详细匹配的时候就可以更精准。

注意各个部分是以下划线进行连接的,和语言区域代码的中横线链接(如:zh-CN)有区别。

2. 国际化资源文件的加载

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;
    }

3. 国际化资源的使用

messageSource.getMessage(code, params, locale);//获取code在locale区域的信息

通常,在Spring处理请求时,会根据用户的语言区域来设置locale参数,Spring已经内置了对区域参数的解析(accept-language请求头),直接基于LocaleContextHolder使用即可,如下:

messageSource.getMessage(code, params, LocaleContextHolder.getLocale());

Spring解析当前请求的语言区域的流程如下: