春季靴国际化总是喜欢英语lang OS

时间:2018-08-17 12:13:05

标签: java spring spring-boot internationalization

我有一个Spring Boot应用程序,其中包含国际化所需的bean。

 @Bean
    public LocaleResolver localeResolver() {
        CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
        cookieLocaleResolver.setCookieName(CookieNames.LANG);
        cookieLocaleResolver.setDefaultLocale(new Locale(Lang.DEFAULT_LANG.getLabel())); //label is "ru"
        cookieLocaleResolver.setCookieMaxAge(this.localeAgeCookie);
        return cookieLocaleResolver;
    }

    @Bean
    public MessageSource messageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasenames("classpath:i18n/messages");
        messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
        return messageSource;
    }

    @Bean
    public MessageSourceAccessor messageSourceAccessor() {
        return new MessageSourceAccessor(messageSource());
    }

并且有俄语(messages.properties)和英语(messages_en.properties)文件消息,默认选择俄语。
我通过调用以下方法使用POST请求而不是拦截器来更改语言。

public static void setLocale(HttpServletRequest request, HttpServletResponse response, Lang lang) {
    final LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
    localeResolver.setLocale(request, response, Locale.forLanguageTag(lang.getLabel()));

}

问题在于我打电话给

 messageSourceAccessor.getMessage(key)

,  并且密钥位于messages和messages_en文件中,即使我在查询中强制使用语言环境,我也总是从messages_en收到消息:

messageSourceAccessor.getMessage(key, new Locale("ru")).

我注意到我的基于俄语lang的操作系统的同事没有这种问题。但是在生产上,我有英文操作系统。 如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您可以尝试使用系统参数启动应用程序 user.language=ru user.country=RU

注意:我不确定ru和RU是否是好的价值,但您可能比我更了解

答案 1 :(得分:0)

解决方案非常简单。更改消息源的属性 fallbackToSystemLocale 就足够了。

 messageSource.setFallbackToSystemLocale(false);