1 国际化信息理解
国际化是什么,简单地说就是,在不修改内部代码的情况下,根据不同语言及地区显示相应的语言界面
国际化信息也称为本地化信息。Java 通过 java.util.Locale
类来表示本地化对象,它通过 “语言类型” 和 “国家/地区” 来创建一个确定的本地化对象 。
java.util.Locale public Locale(@NotNull String language,@NotNull String country)
举个例子吧,比如在发送一个具体的请求的时候,在header(请求头)中设置一个键值对:“Accept-Language”:“zh”,通过Accept-Language对应值,服务器就可以决定使用哪一个区域的语言,找到相应的资源文件,格式化处理,然后返回给客户端。
2 官方解释
2.1 Spring 官方解释
spring定义了访问国际化信息的MessageSource接口,并提供了几个易用的实现类
ApplicationContext
接口扩展了一个称为MessageSource
的接口,因此提供了国际化(“ i18n”)功能。 Spring还提供了HierarchicalMessageSource
接口,该接口可以分层解析消息。 这些接口一起提供了Spring影响消息解析的基础。 这些接口上定义的方法包括:
-
String getMessage(String code,Object [] args,String default,Locale loc):用于从
MessageSource
检索消息的基本方法。 如果找不到针对指定语言环境的消息,则使用默认消息。 使用标准库提供的MessageFormat
功能,传入的所有参数都将成为替换值。 -
String getMessage(String code,Object [] args,Locale loc):
与先前的方法基本相同,但有一个区别:无法指定默认消息。 如果找不到该消息,则抛出NoSuchMessageException
。 -
String getMessage(MessageSourceResolvable resolvable,Locale locale):上述方法中使用的所有属性也都包装在一个名为
MessageSourceResolvable
的类中,您可以将其与该方法一起使用。
加载ApplicationContext
时,它将自动搜索在上下文中定义的MessageSource
Bean。 Bean必须具有名称 messageSource(固定名称)。
Spring提供了两个MessageSource
实现,即ResourceBundleMessageSource
和StaticMessageSource
。 两者都实现HierarchicalMessageSource以便进行嵌套消息传递。StaticMessageSource
很少使用,但是提供了将消息添加到源中的编程方式。
2.2 SpringBoot 官方解释
Spring Boot支持本地化消息,因此您的应用程序可以迎合不同语言首选项的用户。 默认情况下,Spring Boot在类路径的根目录下查找消息资源包(默认情况下为messages.properties)的存在。
当已配置资源的默认属性文件可用时(即默认情况下为messages.properties),将应用自动配置。 如果您的资源包仅包含特定于语言的属性文件,则需要添加默认文件。 如果找不到与任何配置的基本名称匹配的属性文件,将没有自动配置的MessageSource。
可以使用spring.messages命名空间配置资源包的基本名称以及其他几个属性,如以下示例所示:
// spring.messages.basename支持以逗号分隔的位置列表,可以是包限定符,也可以是从类路径根目录解析的资源
// spring.messages.basename=message,config/i18n/message
spring.messages.basename=messages,config.i18n.messages
// 是否退回到系统语言环境
spring.messages.fallback-to-system-locale=false
MessageSource国际化配置中有几个常见的参数
basename:默认的扫描的国际化文件名为messages,即在resources建立messages_xx.properties文件,可以通过逗号指定多个,如果不指定包名默认从classpath下寻找。
encoding:默认的编码为UTF-8,也可以改为GBK等等
cacheSeconds:加载国际化文件的缓存时间,单位为秒,默认为永久缓存。
fallbackToSystemLocale:当找不到当前语言的资源文件时,如果为