我想根据特定的语言返回API响应。
该API返回了List<Element>
,我想根据语言环境返回Element.name
和Element.type
。
public class Element {
private String name;
private String type;
//
}
API:
@RequestMapping(value = "/getElements", method = RequestMethod.GET)
public List<Element> getElements() {
return someService.getElements();
}
我尝试过的解决方案:
通过使用 ResourceBundleMessageSource
@Configuration
public class CustomLocaleResolver extends AcceptHeaderLocaleResolver
implements WebMvcConfigurer {
private List<Locale> LOCALES = Arrays.asList(
new Locale("en"),
new Locale("fr"));
@Override
public Locale resolveLocale(HttpServletRequest request) {
String headerLang = request.getHeader("Accept-Language");
return headerLang == null || headerLang.isEmpty()
? Locale.getDefault()
: Locale.lookup(Locale.LanguageRange.parse(headerLang), LOCALES);
}
@Bean
public ResourceBundleMessageSource messageSource() {
ResourceBundleMessageSource rs = new ResourceBundleMessageSource();
rs.setBasename("messages");
rs.setDefaultEncoding("UTF-8");
rs.setUseCodeAsDefaultMessage(true);
return rs;
}
}
属性文件: messages.properties
hello=Hello World!
welcome=Welcome to this guide!
messages_fr.properties
hello=Bonjour le Monde!
welcome=Bienvenue dans ce guide!
可以将字符串转换如下:
@Component
public class Translator {
private static ResourceBundleMessageSource messageSource;
@Autowired
Translator(ResourceBundleMessageSource messageSource) {
Translator.messageSource = messageSource;
}
public static String toLocale(String msg) {
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(msg, null, locale);
}
}
主要问题是该方法一次只能转换一个字符串
如果根据提供的区域设置对列表进行迭代以转换响应,则将花费大量时间。而且,我需要更改每种现有方法的响应。
无论是返回元素还是列表,我都需要一种通用的方法来根据语言环境转换所有API响应