我有一个SpringBoot(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
等。
现在的挑战是,我不确定如何"读取"用户代理发送的locale,以便正确地从bundle读取消息。我注入了一个MessageSource ms
,并通过编程读取如下消息:
final Locale locale = ???
ms.getMessage("message.duplicate-token", null, locale);
有线索吗?
我试过LocaleContextHolder.getLocale()
,但它总是en_US
。如果我硬编码getMessage
调用的相应语言环境,我就能够检索到正确的消息。所以我知道设置/配置在大多数情况下都是有效的。
客户端使用Accept-Language
报头和如下值发送区域设置:de-DE
、en-US
等等。
7条答案
按热度按时间cyej8jka1#
您需要添加一个LocaleChangeInterceptor并按如下所示配置bean:更多信息请参考Spring Boot internationalization
如果只想使用“Accept-Language”标头,则可以扩展AcceptHeaderLocaleResolver并自定义:
eh57zj3b2#
我在用豆子
然后又是一个
与
标头保存在LocaleContextHolder中,您可以在需要时使用它。
3mpgtkmj3#
创建自定义AcceptHeaderLocaleResolver
不要忘记在
@Configuration
文件中使用它zpqajqem4#
如果您想在REST控制器级别上获得这个特性,您可以直接在REST方法中获得locale示例。
n53p2ov05#
您创建的LocaleResolver bean只能在SpringMVC中使用,而不能在Jersey容器中使用,使用LocaleResolver的是Spring的DispatcherServlet。
因此,区域上下文保持器。getLocale();将返回不同的本地值,具体取决于是在Jersey控制器还是Spring MVC控制器中调用。
3pvhb19x6#
不需要扩展
AcceptHeaderLocaleResolver
,创建bean定义如下:yrdbyhpb7#
你必须在你的API端点中添加
Accept-Language
标头来获得所需的语言环境输出。然后你必须添加以下配置来解析和设置来自传入请求的Accept-Language
标头值。