Не найдено сообщений под кодом 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.

Другие вопросы по тегам