为什么Thymeleaf International只与ResourceBundleMessageSource一起工作



所以在帮助回答这个问题 百里香叶 + 弹簧 (不是启动) - 如何显示来自消息源的消息

我发现如果你使用ReloadableResourceBundleMessageSource它将无法正常工作。百里香叶会显示??app.name_pt_BR??而不是预期的结果。

@Bean(name = "messageSource")
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("/i18n/messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

当我切换到下面时,它按预期工作。

@Bean(name = "messageSource")
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("/i18n/messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

为什么无法使用 ReloadableResourceBundleMessageSource?

为此问题添加代码:GitHub

找到了答案!

根据 javadocs for ReloadableResouceBundleMessageSource

特定于 Spring 的 MessageSource 实现,它使用指定的基名称访问资源包,参与 Spring 应用程序上下文的资源加载。与基于 JDK 的 ResourceBundleMessageSource 相比,此类使用属性实例作为消息的自定义数据结构,通过 Spring 资源句柄中的 PropertiesPersister 策略加载它们。此策略不仅能够根据时间戳更改重新加载文件,还可以加载具有特定字符编码的属性文件。它还将检测 XML 属性文件。

请注意,设置为"basenames"属性的basenames的处理方式与ResourceBundleMessageSource的"basenames"属性略有不同。它遵循基本的 ResourceBundle 规则,即不指定文件扩展名或语言代码,但可以引用任何 Spring 资源位置(而不是仅限于类路径资源)。使用"classpath:"前缀,仍然可以从类路径加载资源,但在这种情况下,"-1"以外的"cacheSeconds"值(永久缓存)可能无法可靠地工作。

对于典型的 Web 应用程序,消息文件可以放入 WEB-INF 中:例如,"WEB-INF/messages"基本名称将罚款"WEB-INF/messages.properties"、"WEB-INF/messages_en.properties"等排列以及"WEB-INF/

messages.xml"、"WEB-INF/messages_en.xml"等。 请注意,由于顺序查找,先前资源包中的消息定义将覆盖更高资源包中的消息定义。

此 MessageSource 可以在 ApplicationContext 之外轻松使用:它将使用 DefaultResourceLoader 作为默认值,如果在上下文中运行,则只需被 ApplicationContext 的资源加载器覆盖。它没有任何其他特定的依赖项。

所以解决方法是提供路径。

@Bean
public MessageSource messageSource()
{
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

以包含setBasename()上的路径

@Bean
public MessageSource messageSource()
{
    ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setFallbackToSystemLocale(false);
    messageSource.setCacheSeconds(0);
    messageSource.setDefaultEncoding("UTF-8");
    return messageSource;
}

相关内容

  • 没有找到相关文章

最新更新