【问题标题】:No message found under code 'email.subject' for locale 'en_US'在区域设置“en_US”的代码“email.subject”下未找到消息
【发布时间】:2020-01-10 15:46:17
【问题描述】:

我有用于不同本地化的属性资源文件。我将我的默认语言环境设置为这样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 而不是 @ 987654326@?

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

【问题讨论】:

    标签: java spring localization


    【解决方案1】:

    我将我的默认语言环境设置为这样 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");

    【讨论】:

    • 我没有单独调用 Locale.forLanguageTag() - 它是方法 setLocale() 中的一个参数。但是该方法是在一些不相关的 bean 上调用的(我后来发现)——我没有在全局范围内设置任何东西。所以你的回答对我有用:)谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多