【发布时间】:2019-04-17 22:35:39
【问题描述】:
我有一个 Spring Boot (2.1.3.RELEASE) 应用程序,它使用 Jersey 来定义(RESTful)端点。我正在尝试根据用户代理发送的语言环境读取和传播一些消息。
我已经配置了这些 bean:
@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 等。
【问题讨论】:
-
我建议你在
AcceptHeaderLocaleResolver类的resolveLocale方法中设置一个断点,这样你就可以看到发生了什么,或许还能弄清楚为什么它没有按照你的预期解决。 -
确实,我在发帖之前尝试过这样的事情;它永远不会停止在那个方法上,而是在启动时。
标签: java spring-boot internationalization