У меня есть приложение, в котором включена функция i18n. Итак, у меня есть несколько файлов
messages.properties
messages_en.properties
messages_fr.properties
Но для моего внешнего приложения мне нужно прочитать все значения сразу, поэтому они будут кэшироваться на стороне клиента.
В результате мне нужно прочитать все значения для конкретной локали при выполнении запроса.
Я пробовал MessageSource, но он может возвращать только одну запись, но мне нужно получить все значения в форме Map или InputStream, чтобы они были преобразованы в 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();
}
Затем вы можете ввести его в класс, который хотите использовать.