代码之家  ›  专栏  ›  技术社区  ›  Peter Kozlovsky

Spring boot国际化在英语语言操作系统中总是更喜欢英语

  •  0
  • Peter Kozlovsky  · 技术社区  · 6 年前

    我有一个带有国际化所需bean的spring boot应用程序。

     @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)
    

    密钥同时位于消息和消息文件中,即使在查询中强制使用以下语言环境,我也始终从消息中获取消息:

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

    如何解决这个问题?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Peter Kozlovsky    6 年前

    解决办法很简单。足以改变财产 回退到系统区域设置 消息源的。

     messageSource.setFallbackToSystemLocale(false);
    
        2
  •  1
  •   bilak    6 年前

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