【问题标题】:Spring boot - cannot set default LocaleSpring boot - 无法设置默认语言环境
【发布时间】:2018-06-13 23:42:28
【问题描述】:

我现在正在开发 Spring Boot 应用程序(仅限休息控制器)。对我的服务器的每个请求都包含语言标签。我想根据此标签以特定语言发送响应。控制器从请求中提取这些标签并作为 Locale 实例提供给服务层。我在 src/main/resources 下创建了属性文件,如下所示: https://i.stack.imgur.com/fsXPG.jpg.

我的问题是默认语言。无论提供何种语言环境,从属性文件返回的消息始终来自 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 设置为默认属性文件?

【问题讨论】:

    标签: java spring-boot locale properties-file


    【解决方案1】:

    你可以试试下面的:

    /*
     * 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'下找到消息”
    • 你可以把你的默认区域设置在这里:resolver.setDefaultLocale(new Locale("defaultLocale"));
    • 我做了这个,但仍然从 AppResources_pl.properties 而不是 AppResources_en.properties 或 AppResources.properties 收到消息。
    • 在 /src/main/resources/ 文件夹中,您是否为 2 种语言创建了 2 个消息文件:“AppResources_en.properties”和“AppResources_pl.properties”?
    • 是的。现在我有三个消息文件: 1.AppResources.properties 2. AppResources_pl.properties 和 AppResources_en.properties。
    【解决方案2】:

    我发现MessageSourceAccessor 中的默认语言环境为空,所以使用了系统语言环境。这个问题出现在上一个版本中,因为大约 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),它将仅使用您在此处设置的语言环境,并且不会检查语言环境上下文持有者的语言环境。跨度>
    猜你喜欢
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多