gpt4 book ai didi

java - Spring MessageSource 回退到显式语言环境

转载 作者:行者123 更新时间:2023-11-30 06:45:07 25 4
gpt4 key购买 nike

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>

在一些spring boot应用中,使用了i18n。这是配置:

@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename(translationsPath);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setFallbackToSystemLocale(false);
messageSource.setCacheSeconds(5);
return messageSource;
}

@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
localeResolver.setDefaultLocale(Locale.ENGLISH);
return localeResolver;
}

需要从 header Accept-language 获取区域设置,如果出现以下情况,则回退到“en”:

  • 标题丢失,
  • 标题有错误的值,
  • 缺少语言环境的配置。

前两点由提供的 LocaleResolver 解决(参见配置)。但是,我不知道如何实现第 3 点:可重新加载的翻译配置列表封装在 ReloadableResourceBundleMessageSource 中,我看不出如何让它在某些不存在的情况下退回到“en”语言环境配置。

setFallbackToSystemLocale 选项,但系统区域设置 != "en"区域设置。此外,MessageSource 仅使用系统区域设置来解析来自翻译配置的 token ,而不是用于本地化消息本身,这会导致与本地化数字的差异。

我可能会尝试通过在 LocaleResolver 上使用 setSupportedLocales 来限制支持的语言环境列表,但在我的情况下这不是合适的解决方案,因为翻译配置列表是应该在运行时改变。

有没有办法让 ReloadableResourceBundleMessageSource 回退到显式语言环境?

最佳答案

通过围绕 MessageSource 编写一个包装器以有点肮脏的方式解决了这个问题。这与所请求的不完全相同:如果请求的 token 不存在(这与“配置不存在”接近但不同),则将使用后备语言环境。此外,它会吞下异常并将它们用于流量控制,这并不好。

final class FallbackMessageSource implements MessageSource {
private final MessageSource delegate;
private final Locale fallbackLocale;

public FallbackMessageSource(MessageSource delegate, Locale fallbackLocale) {
this.delegate = delegate;
this.fallbackLocale = fallbackLocale;
}

@Override
public String getMessage(String code, Object[] args, String defaultMessage, Locale locale) {
try {
return delegate.getMessage(code, args, defaultMessage, locale);
} catch(NoSuchMessageException ex) {
return delegate.getMessage(code, args, defaultMessage, fallbackLocale);
}
}

@Override
public String getMessage(String code, Object[] args, Locale locale) throws NoSuchMessageException {
try {
return delegate.getMessage(code, args, locale);
} catch(NoSuchMessageException ex) {
return delegate.getMessage(code, args, fallbackLocale);
}
}

@Override
public String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException {
try {
return delegate.getMessage(resolvable, locale);
} catch(NoSuchMessageException ex) {
return delegate.getMessage(resolvable, fallbackLocale);
}
}
}

关于java - Spring MessageSource 回退到显式语言环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49561374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com