Spring Boot - 无法设置默认语言环境

8
我正在开发Spring Boot应用程序(仅限REST控制器)。我的服务器每个请求都包含语言标签。我希望根据此标签以特定语言发送响应。控制器从请求中提取这些标签,并作为Locale实例提供给服务层。我在src/main/resources下创建了属性文件,如下所示:https://istack.dev59.com/fsXPG.webp
我的问题是默认语言问题。无论提供的Locale如何,从属性文件返回的消息始终来自AppResources_pl.properties。我认为问题在于默认语言环境。目前我尝试了两种不同的方法,但还不知道如何将默认属性文件设置为英语。
第一个方法:
ResourceBundle myResources = ResourceBundle.getBundle("AppResources", currentLocale);
String message = myResources.getString("label.error");

第二:

@Bean
    public LocaleResolver localeResolver() {
        SessionLocaleResolver slr = new SessionLocaleResolver();
        slr.setDefaultLocale(Locale.forLanguageTag("en-US"));
        return slr;
    }

    @Bean
    public MessageSource messageSource(){
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("AppResources");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }

并在服务中:

messageSource.getMessage("label.error", null, locale)

双向返回消息,但始终来自AppResources_pl.properties。当提供的语言环境在*.properties文件中未找到时,如何将AppResources.properties设置为默认属性文件?

2个回答

5
我发现在MessageSourceAccessor中默认语言环境为null,所以使用了系统的语言环境。这个问题在最近的版本中出现了,因为约6个月前我使用原始评论中提供的LocaleResolver配置,它很好地工作了。
以下代码行解决了这个问题:return new MessageSourceAccessor(messageSource, Locale.US);(直接传递了Locale)。
@Bean(name = "messageSource")
public ReloadableResourceBundleMessageSource getMessageSource() {
    final ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
    res.setDefaultEncoding("UTF-8");
    res.setFallbackToSystemLocale(false); // will force to use specified locale even if locale for current env is different
    res.addBasenames("classpath:messages/validation", "classpath:messages/messages", "classpath:messages/titles");
    return res;
}


@Bean
public MessageSourceAccessor getMessageSourceAccessor(final MessageSource messageSource) {
    return new MessageSourceAccessor(messageSource, Locale.US);
}

请注意,如果您自动装配MessageSourceAccessor bean并使用getMessage(String code),它将只使用您在此处设置的区域设置,并且不会检查区域设置持有者的区域设置。 - Andrew Lalis

3
您可以尝试以下方法:
/*
 * Create MessageSource bean
 */
@Bean
public MessageSource messageSource() {
  ReloadableResourceBundleMessageSource messageSource = new 
  ReloadableResourceBundleMessageSource();
  messageSource.setBasename("classpath:AppResources");
  messageSource.setDefaultEncoding("UTF-8");
  return messageSource;
}

/*
 * Create LocaleResolver Bean
 */
@Bean
public LocaleResolver localeResolver(){
  CookieLocaleResolver resolver = new CookieLocaleResolver();
  resolver.setDefaultLocale(new Locale("en")); // your default locale
  return resolver;
}

现在我针对每个语言环境代码都收到了这个错误消息:“”在'_'语言环境下,没有找到代码为'error.reportNotFromApp'的消息""。 - Patryk kowalski
你可以在这里设置默认语言环境:resolver.setDefaultLocale(new Locale("defaultLocale")); - yuen26
在/src/main/resources/文件夹中,你是否创建了两个语言对应的2个消息文件:"AppResources_en.properties"和"AppResources_pl.properties"? - yuen26
是的。目前我有三个消息文件:1. AppResources.properties 2. AppResources_pl.properties 和 AppResources_en.properties。 - Patryk kowalski
不,你应该删除AppResources.properties文件。你可以在这里参考我的应用程序:https://github.com/yuen26/logistic/tree/master/src/main/resources - yuen26
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接