当默认语言环境为“en”时,ReloadableResourceBundleMessageSource无法找到消息

时间:2010-07-20 15:46:53

标签: java spring internationalization locale resourcebundle

当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

2 个答案:

答案 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.propertiesmessages.properties

如果您希望所有en种语言的默认捆绑包,无论哪个国家/地区都有,那么您应该拥有messages_en.properties。如果您希望所有语言都有默认捆绑包,那么您应该拥有messages.properties

messages_en_US.properties实际上只有在您拥有en_UKen_US等多种英语方言时才有用,但是您应该为另一种英语方言提供另一种方言”。其中一个应该命名为messages_en.properties,然后可以将其用作未指定国家/地区的访问者的“默认”英语包。