gpt4 book ai didi

java - 无法获得特定国家/地区的本地化响应

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:38:45 26 4
gpt4 key购买 nike

我有一个 spring boot 应用程序,我们正在努力支持多种语言和国家。

这些是我们目前计划支持的代码。en、es、fr、en-gb、es-mx、zh、ja。

我正在努力让一些字段响应本地化。当我在我的本地(eclipse)中运行应用程序并检查 postman 的响应时,我可以看到它正在获取国家特定文件并正确给出响应,但是当我将我的更改推送到 AWS 服务器时,它不是,它只是选择特定语言的文件并忽略国家代码。

例如,如果我将 Accept-Language 设置为 da,es-MX;q=0.8 我希望在 es-MX 中得到响应(我们不支持 da),但它只是在 es 中给出响应(我有es 和 es-MX 文件)并忽略国家代码 MX。

但是,如果我将 Accept-Language 作为 fr,es-MX;q=0.8,它会获取 messages_fr.properties 文件并以法语给出响应,这正是我所期望的。

下面是我的类(class)。

@Configuration
@ComponentScan("com.hsf")
@EnableWebMvc
public class ApplicationConfig extends WebMvcConfigurerAdapter {

@Value("${spring.application.name}")
String appName;

@Bean
public LocaleResolver localeResolver() {
return new SmartLocaleResolver();
}

@Bean
public DispatcherServlet dispatcherServlet() {
final DispatcherServlet servlet = new DispatcherServlet();
servlet.setDispatchOptionsRequest(true);
return servlet;
}

@Bean
public ReloadableResourceBundleMessageSource messageSource() {
final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:i18n/messages");
// If true, the key of the message will be displayed if the key is not
// found, instead of throwing an exception
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
// The value 0 means always reload the messages to be developer friendly
messageSource.setCacheSeconds(10);
return messageSource;
}

}

此类解析 Accept-Language header 并设置 Locale。

public class SmartLocaleResolver extends AcceptHeaderLocaleResolver {

@Override
public Locale resolveLocale(HttpServletRequest request) {
try {
List<LanguageRange> list = Locale.LanguageRange.parse(request.getHeader("Accept-Language"));
if (!list.isEmpty()) {
for (LanguageRange s : list) {
if (ApplicationConstants.LOCALE.contains(s.getRange())) {
return Locale.forLanguageTag(s.getRange());
}
}
}
} catch (IllegalArgumentException e) {
throw e;
}
return request.getLocale();
}
}

我的 ApplicationConstants 类中有以下常量

public static final List<String> LOCALE              = Collections
.unmodifiableList(Arrays.asList("en", "es", "fr", "es-mx", "zh", "ja"));

这是 MessageHandler 类

@Component
public class MessageHandler {
@Autowired
private MessageSource messageSource;

public String localizeMessage(String errorCode, Object args[]) {
Locale locale = LocaleContextHolder.getLocale();
String message = messageSource.getMessage(errorCode, args, locale);
return message;

}

public String localizeMessage(String errorCode) {
return localizeMessage(errorCode, null);
}

}

对此有什么想法吗?

最佳答案

看来你只是重新实现了 Locale 的 lookup() 方法:

    List<Locale> locales = Arrays.asList(new Locale("en"),
new Locale("es"),
new Locale("fr"),
new Locale("es", "MX"),
new Locale("zh"),
new Locale("ja"));
List<Locale.LanguageRange> ranges = Locale.LanguageRange.parse("da,es-MX;q=0.8");
Locale best = Locale.lookup(ranges, locales);
System.out.println("best = " + best); // prints best = es_MX

ranges = Locale.LanguageRange.parse("fr,es-MX;q=0.8");
best = Locale.lookup(ranges, locales);
System.out.println("best = " + best); // prints best = fr

关于java - 无法获得特定国家/地区的本地化响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37034449/

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