当Locale.getDefault()返回 en 时,为什么spring“ReloadableResourceBundleMessageSource”无法找到与代码关联的正确消息,但是当它返回 en_US时能够找到正确的消息
默认语言区域:en_US
key: CODE_1, Locale: Locale.US = Hit
key: CODE_1, Locale: Locale.CANADA = Hit
key: CODE_1, Locale: fr_CA = Hit
key: CODE_1, Locale: null (use default) = Hit
默认语言区域:en
key: CODE_1, Locale: Locale.US = Hit
key: CODE_1, Locale: Locale.CANADA = CODE_1
key: CODE_1, Locale: fr_CA = CODE_1
key: CODE_1, Locale: null (use default) = CODE_1
我只有一个在类路径中有CODE_1的包 message_en_US.properties
答案 0 :(得分:5)
仅为en_US
语言环境定义消息,因为它是在message_en_US.properties
文件中定义的。从区域设置en_US
(Locale.US)切换到en
时,您获得不同行为的原因是ReloadableResourceBundleMessageSource默认情况下fallback对系统区域设置{}为{}}在请求的区域设置中找不到。
在第一种情况下,当en_US
是默认值时,始终会找到该消息,因为请求的本地是en_US
,否则,消息源会回退{en_US
1}},定义消息的位置。
当默认语言环境为en
时,只有en_US
查询有效,因为它正在查找正确的属性文件。对于所有其他人,在相应的属性文件中找不到该消息,并且在备用语言环境en
中也找不到该消息。
答案 1 :(得分:2)
这是因为它找不到更少的国家/语言特定属性文件messages_en.properties
和messages.properties
。
如果您希望所有en
种语言的默认捆绑包,无论哪个国家/地区都有,那么您应该拥有messages_en.properties
。如果您希望所有语言都有默认捆绑包,那么您应该拥有messages.properties
。
messages_en_US.properties
实际上只有在您拥有en_UK
和en_US
等多种英语方言时才有用,但是您应该为另一种英语方言提供另一种方言”。其中一个应该命名为messages_en.properties
,然后可以将其用作未指定国家/地区的访问者的“默认”英语包。