为什么我需要 Spring 启动 `messages.properties` 而不仅仅是 `messages_en.properties`?

Why do I need Spring Boot `messages.properties` instead of just `messages_en.properties`?

我正在关注 this guide,它说要将默认消息文件命名为 messages.properties。为什么我不能将其命名为 messages_en.properties 并将默认语言环境设置为英语?

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver slr = new SessionLocaleResolver();
    slr.setDefaultLocale(Locale.ENGLISH);
    return slr;
}

这不起作用(每次重命名 message.properties 时都必须硬停止并重新启动服务器 - 动态重新加载无法获取更改)。它会打印出带有 <spring:message code="oops" text="default"/> 标签的 default 文本,因为它找不到 messages_en.properties.

事实上,当我将浏览器的默认语言设置为法语并messages_fr.properties,并重新启动服务器时,它也找不到法语的密钥。

不使用 Thymeleaf。无需允许用户选择语言。

参考:https://docs.spring.io/spring-boot/docs/1.5.17.RELEASE/reference/htmlsingle/(世界只有一个实例'internationalization',且仅与应用程序属性有关)。

我改用 AcceptHeaderLocaleResolver 修复了它。

@Bean
public LocaleResolver localeResolver() {
    AcceptHeaderLocaleResolver ahlr = new AcceptHeaderLocaleResolver();
    ahlr.setDefaultLocale(Locale.ENGLISH);
    return ahlr;
}

我以为指南说它将在 session、cookie 或 header 中搜索语言环境,但他们只是说不同的 sub-classes 分别实现了这些功能。

The LocaleResolver interface has implementations that determine the current locale based on the session, cookies, the Accept-Language header, or a fixed value.

我通过设置 application property 解决了实时重新加载问题,至少对于调试:

spring.messages.cache-seconds=1

我还设置了这个 属性 以免弄乱我的 src/main/resources 文件夹,所以我可以将所有消息文件移动到 locales/ sub-directory。

spring.messages.basename=locales/messages