Nacos实现实现SpringBoot国际化的增强国际化的增强
一一. 概述概述
阅读本文之前,你应该了解过SpringBoot的国际化实现与原理,在这里简单介绍下:
1. 国际化国际化
国际化(internationalization),又称为i18n(因为这个单词从i到n有18个英文字母,因此命名)。对于某些应用系统而言,它需要发布到不同的国家地区,因此需要特殊的做法来支
持,也即是国际化。通过国际化的方式,实现界面信息,各种提示信息等内容根据不同国家地区灵活展示的效果。比如在中国,系统以简体中文进行展示,在美国则以美式英文进行
展示。如果使用传统的硬编码方式,是无法做到国际化支持的。
所以通俗来讲,国际化就是为每种语言配置一套单独的资源文件,保存在项目中,由系统根据客户端需要选择合适的资源文件。
2. SpringBoot对国际化的支持对国际化的支持
SpringBoot默认提供了国际化的支持,它通过自动配置类MessageSourceAutoConfiguration实现。
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration
这个类注册了MessageSource,用来获取国际化配置。
@Bean
public MessageSource messageSource() {
MessageSourceProperties properties = messageSourceProperties();
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
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;
}
在SpringBoot代码中实现原生国际化配置仅需要以下三步:
指定国际化资源路径指定国际化资源路径
通过application.properties指定:
spring.messages.basename=classpath:i18n/messages
其中,i18n表示resources路径上的一个文件夹,messages就是这个文件夹下的资源文件名,例如:messages.properties、messages_zh_CN.properties、
messages_en_US.properties 等。
注入国际化注入国际化Resolver对象对象
通过指定LocaleResolver对象,实现国际化策略。
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.CHINA);
return sessionLocaleResolver;
}
使用使用
在resources目录下建立i18n文件夹,文件夹中建立:messages.properties、messages_zh_CN.properties、messages_en_US.properties 三个文件,添加需要的配置即可。
同时,在需要使用的Bean中注入MessageSource对象,通过getMessage方法使用
String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;
3. SpringBoot 国际化存在的问题与不足国际化存在的问题与不足
通过以上三个步骤,我们实现了SpringBoot的原生国际化。但是在使用过程中,我们也发现了一些不足,这主要有:
配置是存储在jar包中的,不够灵活。
绝大部分公司系统都做了微服务化,应用太多,希望有一个地方可以统一管理配置。
希望配置读取是高效的,及时的。
国际化的工作,前后端都不应该过多参与,尽量在框架层面解决,而不是应用层传输国际化参数来解决。
4. SpringBoot 国际化增强的目标国际化增强的目标
在实际工作中,我们应该且有必要对国际化做进一步的增强,让它更能满足要求。基于上述的问题,我们做了一些改进,最终达到的效果如下:
1. 配置中心存储应用的国际化配置,配置支持动态刷新,实时生效。
2. 实现高效的配置读取。
3. 简化前后端的工作量。
因此,本文的后半部分将介绍如何通过Nacos实现SpringBoot国际化的增强。
二二. 实施过程实施过程
1. 总体设计总体设计
根据需要,我们会将应用服务的配置存储到配置中心,每次客户端需要获取配置时,应用服务再到配置中心去拉取对应的配置,并最终返回。方案如下: