代码' user.status.A'对于语言环境' en_us'

时间:2014-09-08 00:40:08

标签: java spring spring-mvc messages applicationcontext

我正在尝试为不同类型的“消息”(用户消息,字段标签/按钮,数据值)维护单独的文件。在这次尝试中,我试图获得不同数据值的描述。例如,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&gt; basenames至少包含我的配置数据。

[WEB-INF/locale/messages/messages, WEB-INF/locale/fields/fields, WEB-INF/locale/values/values]

虽然我没有在任何地方看到带有文件扩展名的整个文件名。

1 个答案:

答案 0 :(得分:-1)

对Locale使用以下构造函数

public Locale(String language,
  String country)

示例:

description = appCtx.getMessage("user.status.A", null, new Locale("en","US"));

您不必使用en_us结束文件。默认值为en_us。