Не найдено сообщений под кодом user.status.A для локали en_us
Я пытаюсь сохранить отдельные файлы для разных типов "сообщений" (пользовательских сообщений, меток полей / кнопок, значений данных). В этой попытке я пытаюсь получить описание различных значений данных. Например, UserStatus "A" может отображаться как Active или Activo.
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="defaultEncoding" value="UTF-8"/>
<property name="basenames">
<list>
<value>WEB-INF/locale/messages/messages</value>
<value>WEB-INF/locale/fields/fields</value>
<value>WEB-INF/locale/values/values</value>
</list>
</property>
</bean>
! [Расположение файлов значений.][1]
Вот соответствующие записи в файле values_en_us.properties:
user.status.A = Active
user.status.I = Inactive
user.status.P = Pending
Я хотел бы создать Enum для каждого типа значения, из которого я могу получить локализованное значение. В приведенном ниже коде я жестко закодировал значения, передаваемые в сообщение get, чтобы уменьшить количество переменных при попытке отладки этого.
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Locale;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public enum UserStatusEnum {
A,I,P;
private static HashMap<LocaleEnum, EnumMap<UserStatusEnum, String>> userStatuses = new HashMap<LocaleEnum, EnumMap<UserStatusEnum, String>>();
public static EnumMap<UserStatusEnum, String> getUserStatuses(LocaleEnum locale) {
return userStatuses.get(locale);
}
// Pre-load the descriptive values.
static {
String description = null;
ApplicationContext appCtx = new ClassPathXmlApplicationContext("spring-config.xml");
for (LocaleEnum locale : LocaleEnum.values()) {
EnumMap<UserStatusEnum, String> localeSpecificUserStatuses = new EnumMap<UserStatusEnum, String>(UserStatusEnum.class);
for (UserStatusEnum status : UserStatusEnum.values()) {
//description = appCtx.getMessage("user.status."+status, null, new Locale(locale.toString()));
description = appCtx.getMessage("user.status.A", null, new Locale("en_us"));
if (description != null) {
localeSpecificUserStatuses.put(status, description);
}
description=null;
}
userStatuses.put(locale, localeSpecificUserStatuses);
}
}
}
Когда этот код запускается, я получаю следующее сообщение:
org.springframework.context.NoSuchMessageException: No message found under code 'user.status.A' for locale 'en_us'.
В этой строке кода:
description = appCtx.getMessage("user.status.A", null, new Locale("en_us"));
Приложение уже показывает мои пользовательские сообщения об ошибках приложения, которые есть в сообщениях, локализованных файлах, но в этом случае ApplicationContext уже доступен. Поскольку я могу получить доступ к содержимому файлов messages_en_us.property, я предполагаю, что конфигурация верна. Однако классы, которые получают содержимое сообщений, создаются экземпляром Spring.
Enums не создаются Spring, поэтому я предполагаю, что я делаю что-то не так в том, как я получаю дескриптор ApplicationContext или как я его использую.
Вся помощь очень ценится.
Благодарю вас
РЕДАКТИРОВАТЬ: После просмотра значений appCtx в режиме отладки я вижу, что messageSource> basenames по крайней мере содержит мои данные конфигурации.
[WEB-INF/locale/messages/messages, WEB-INF/locale/fields/fields, WEB-INF/locale/values/values]
Хотя я нигде не вижу целых имен файлов с расширением.
1 ответ
Используйте следующий конструктор для Locale
public Locale(String language,
String country)
пример:
description = appCtx.getMessage("user.status.A", null, new Locale("en","US"));
Вам не нужно заканчивать свой файл с помощью en_us. По умолчанию это en_us.