我有一个启用了i18n功能的应用程序。
所以我有多个文件

messages.properties
messages_en.properties
messages_fr.properties


但是对于我的前端应用程序,我需要一次读取所有值,因此它们将被缓存在客户端。

结果,在发出请求时,我需要读取特定语言环境的所有值。

我已经尝试过MessageSource,但是它只能返回一个条目,但是我需要以MapInputStream的形式获取所有值,以便在返回客户端之前将它们转换为JSON

请提出一种我可以读取特定位置的特定“属性”捆绑包的所有值的方法。

谢谢

最佳答案

定义以下类:

import java.util.*;
import java.util.stream.Collectors;

public class MessagesResourceBundle {
    private static final String BASE_NAME = "messages";
    private static final List<String> LOCALES = Arrays.asList("en", "fr");
    private Map<Locale, Map<String, String>> allMessages;

    public MessagesResourceBundle() {
        allMessages = new HashMap<>();
        List<Locale> locales = LOCALES.stream().map(Locale::new).collect(Collectors.toList());
        locales.add(Locale.ROOT);
        locales.stream().map(l -> ResourceBundle.getBundle(BASE_NAME, l))
                .forEach(bundle -> {
                    Map<String, String> messages = new HashMap<>();
                    Collections.list(bundle.getKeys()).forEach(key -> messages.put(key, bundle.getString(key)));
                    allMessages.put(bundle.getLocale(), messages);
                });
    }

    public Map<Locale, Map<String, String>> getAllMessages() {
        return Collections.unmodifiableMap(allMessages);
    }
}


然后在您的@SpringBootApplication类(或带有@Configuration注释的类)中,定义以下方法:

@Bean
public MessagesResourceBundle messagesResourceBundle() {
    return new MessagesResourceBundle();
}


然后,您可以将其注入要使用的类中。

08-05 00:54