Получить локаль на основе Accept-Language в Spring Boot - PullRequest
1 голос
/ 18 апреля 2019

У меня есть приложение Spring Boot (2.1.3.RELEASE), которое использует Джерси для определения (RESTful) конечных точек. Я пытаюсь прочитать и распространить некоторые сообщения в зависимости от локали, которую отправляют пользовательские агенты.

Я настроил эти бины:

@Bean
public LocaleResolver localeResolver() {
  final AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
  resolver.setSupportedLocales(Arrays.asList(Locale.GERMANY, Locale.US));
  resolver.setDefaultLocale(Locale.ENGLISH);
  return resolver;
}

@Bean
public MessageSource messageSource() { // Not sure if this is needed
  final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
  messageSource.setDefaultEncoding(StandardCharsets.UTF_8.name());
  messageSource.setBasenames("classpath:/messages");
  messageSource.setUseCodeAsDefaultMessage(true);
  messageSource.setCacheSeconds(5);
  return messageSource;
}

... а также связки (внутри ../src/main/resources/), такие как: messages.properties (запасной вариант), messages_en_US.properties, messages_de_DE.properties и т. Д.

Теперь проблема в том, что я не уверен, как «прочитать» локаль, отправленную пользовательскими агентами, чтобы правильно прочитать сообщения из пакетов. Я внедряю MessageSource ms и программно читаю сообщения типа:

final Locale locale = ???
ms.getMessage("message.duplicate-token", null, locale);

Есть какие-нибудь подсказки?

Я пробовал LocaleContextHolder.getLocale(), но всегда en_US. Если я жестко закодирую соответствующую локаль для вызова getMessage, я смогу получить правильное сообщение (я). Так что я знаю, что настройка / настройка по большей части работает.


Клиенты отправляют локаль, используя заголовок Accept-Language - и такие значения, как: de-DE, en-US и т. Д.

1 Ответ

2 голосов
/ 18 апреля 2019

Вам необходимо добавить LocaleChangeInterceptor и настроить bean-компонент следующим образом: См. Интернационализация Spring Boot для получения дополнительной информации

@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
    LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
    lci.setParamName("lang");
    return lci;
}

Если вы хотите использовать только заголовок «Accept-Language», вы можете расширить AcceptHeaderLocaleResolver и настроить:

package com.deb.demo.config;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;

import org.springframework.util.StringUtils;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;

public class CustomLocaleResolver extends AcceptHeaderLocaleResolver {


    List<Locale> LOCALES = Arrays.asList(new Locale("en"),new Locale("es"),new Locale("fr"));


  @Override
  public Locale resolveLocale(HttpServletRequest request) {
     if (StringUtils.isEmpty(request.getHeader("Accept-Language"))) {
         return Locale.getDefault();
       }
     List<Locale.LanguageRange> list = Locale.LanguageRange.parse(request.getHeader("Accept-Language"));
     Locale locale = Locale.lookup(list,LOCALES);
      return locale;
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...