#java #spring #spring-boot #internationalization #locale
#java #весна #spring-boot #интернационализация #локали
Вопрос:
Я следовал некоторым руководствам по интернационализации в Spring Boot.
(https://www.youtube.com/watch?v=Y7pHhui0cD4 и https://www.baeldung.com/spring-boot-internationalization)
Я зашел так далеко, чтобы настроить его следующим образом:
@Configuration
public class InternationalizationConfiguration {
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
sessionLocaleResolver.setDefaultLocale(Locale.GERMAN);
return sessionLocaleResolver;
}
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("messages");
messageSource.setUseCodeAsDefaultMessage(true);
return messageSource;
}
}
и использовать его в RestConroller следующим образом:
@RestController
public class ExperimentalControllerImpl implements ExperimentalController{
@Autowired
ResourceBundleMessageSource messageSource;
@Override
public String testI18n(@RequestHeader("Accept-Language") String locale) {
StringBuilder builder = new StringBuilder();
builder.append(messageSource.getMessage(Messages.HELLO, null, new Locale(locale)));
builder.append("n");
builder.append(messageSource.getMessage(Messages.HOW_ARE_YOU, null, new Locale(locale)));
return builder.toString();
}
}
Это работает нормально…..
Но как мне получить информацию о локали из заголовка запроса на мой уровень обслуживания или уровни репозитория?
Существует ли наилучшая практика хранения информации о том, какой язык отправляется запросом, чтобы я мог получить к ней доступ в своих сервисах и репозиториях? Я думаю, что значение должно быть специфичным для запроса / потока. Передача его в качестве параметра метода на другой уровень кажется довольно некрасивой.
С уважением, из Германии
Комментарии:
1. Код — это код, а не картинки. (Кроме того, ссылка на эти «некоторые учебные пособия», поскольку кажется, что они могут быть не совсем надежными; Boot уже выполняет часть того, что вы опубликовали.)
2. В вашем контроллере вы уже делаете это неправильно. Просто введите
Locale
в метод. Если вам это нужно где-то еще, используйтеLocalContextHolder.getLocale()
. ОднакоMessageSource
он уже делает это внутренне, поэтому вместо того, чтобы передавать его, просто передайтеnull
.3. Привет, Дейнум, вводишь Локализацию в Метод?
public String testI18n(Local locale) {}
не работает. Введенный языковой стандарт всегда ‘de’, даже когда я помещаю ‘en’ в заголовок моего запроса (Accept-Language), вероятно, потому, что он используется по умолчанию.LocalContextHolder.getLocale()
доставляет «де» тоже все время. Мне нужна локаль, которая отправляется в запросе, чтобы генерировать интернационализированные сообщения об исключениях на уровне сервиса. Что я делаю не так?