API响应国际化返回List <Element> Spring Boot

时间:2019-12-16 05:47:08

标签: java rest api spring-boot internationalization

我想根据特定的语言返回API响应。 该API返回了List<Element>,我想根据语言环境返回Element.nameElement.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响应

0 个答案:

没有答案