Peter Kozlovsky
Peter Kozlovsky

Reputation: 743

Spring boot internationalization always prefers English in english lang OS

I have spring boot app with the beans needed for internationalization.

 @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());
    }

And there are files messages in Russian (messages.properties) and English(messages_en.properties), Russian is selected as default.
Language I change with POST request instead of interceptor by calling the following method.

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

}

The problem is that when i call

 messageSourceAccessor.getMessage(key)

, and the key is located in both messages and messages_en files, I always get a message from messages_en even if I force the locale in the query like:

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

I noticed that my colleague on the Russian lang based OS, there is no such problem. But on production and I have English OS. How to solve this problem?

Upvotes: 2

Views: 1867

Answers (2)

Peter Kozlovsky
Peter Kozlovsky

Reputation: 743

Solution is quite simple. It was enough to change the property fallbackToSystemLocale of the message source.

 messageSource.setFallbackToSystemLocale(false);

Upvotes: 5

bilak
bilak

Reputation: 4932

You can try to start your application with system parameters user.language=ru user.country=RU

note: I'm not sure if ru and RU are good values but that you probably know better than me

Upvotes: 1

Related Questions