在区域设置 'en_US' 的代码 'email.subject' 下找不到消息

No message found under code 'email.subject' for locale 'en_US'

我有 属性 个不同本地化的资源文件。我像这样设置我的默认语言环境 Locale.forLanguageTag("en")

我这样检索 属性:messageSource.getMessage("email.subject", null, Locale.getDefault().stripExtensions());

但是,我的应用程序失败并出现错误 No message found under code 'email.subject' for locale 'en_US'. 我的 属性 文件有后缀 _en,所以我知道它找不到它 - 但我的问题是:为什么它搜索语言环境 en_US 而不是 en

对于其他语言(没有此区域后缀),它工作正常。

I set my default locale like this Locale.forLanguageTag("en").

方法 forLanguageTag 设置默认语言环境。 Locale.setDefault(Locale) 可以(仅适用于 JVM 的当前实例)。

我的猜测是您的默认语言环境是 en_US,虽然它可能 看起来 好像您的代码出于某种原因添加了一个区域,但它实际上并没有设置新的默认语言环境并保留原来的 en_US.

我设置了一个小测试来说明一下:

public class MessageSourceTest {

    @Rule
    public ExpectedException expEx = ExpectedException.none();

    @Test
    public void test() {

        expEx.expectMessage("No message found under code 'email.subject' for locale 'en_CA'");

        Locale.setDefault(Locale.CANADA);

        Locale.forLanguageTag("en");

        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:nonexistingResourceBundleButDoesntMatter");
        messageSource.getMessage("email.subject", null, Locale.getDefault().stripExtensions());
    }
}

异常是指 Locale.setDefault(Locale.CANADA) 设置的语言环境,而不是方法调用 Locale.forLanguageTag("en");