2

为什么当 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

4

2 回答 2

5

该消息仅针对en_US区域设置定义,因为它是在message_en_US.properties文件中定义的。en_US从区域设置(Locale.US)切换到时会出现不同行为的原因 en是,如果在请求的区域设置中找不到消息,默认情况下ReloadableResourceBundleMessageSource会回退到系统区域设置。

在第一种情况下,whenen_US是默认值,则始终会找到消息,因为请求的本地是en_US或当不是时,消息源会回退到en_US,其中定义了消息。

当默认语言环境为en时,只有en_US查询有效,因为它在正确的属性文件中查找。对于所有其他人,在相应的属性文件中找不到该消息,并且在后备语言环境中也找不到该消息en

于 2010-07-28T16:47:30.223 回答
2

这是因为它找不到更少的国家/语言特定的属性文件messages_en.propertiesmessages.properties.

如果您想为所有语言提供一个默认en捆绑包,而不考虑国家/地区,那么您应该有一个messages_en.properties. 如果您想拥有所有语言的默认捆绑包,那么您应该拥有一个messages.properties.

messages_en_US.properties实际上,只有当您有多种英语方言(如en_UKand )时,它才有用en_US,但是您实际上也应该为另一种英语“方言”提供另一种方言。应该命名messages_en.properties其中之一,然后可以将其用作未指定国家/地区的访问者的“默认”英文包。

于 2010-07-27T17:33:11.997 回答