0

我有一个枚举,我试图将其国际化,例如:

public enum ActivityEnum {
PROJECT_CREATED, PROJECT_EDITED, PROJECT_DONATION;

@Override
public String toString() {
    switch (this) {
    case PROJECT_CREATED:
        return Messages.get("activity.project.created");
    case PROJECT_EDITED:
        return Messages.get("activity.project.edited");
    case PROJECT_DONATION:
        return Messages.get("activity.project.donation");
        default: return super.toString();
    }
}

private ActivityEnum activityEnum;

public ActivityEnum getActivityEnum() {
    return activityEnum;
}

public void setActivityEnum(ActivityEnum activityEnum) {
    this.activityEnum = activityEnum;
}

}

现在,请注意我的 messages.properties 中定义的键包含字符串格式化程序,例如:

activity.project.created = User <%s> created project <%s>

好吧,问题是当我在代码中的其他地方对这个枚举做一些事情时,它会抛出一个异常,比如:

MissingFormatArgumentException occured : Format specifier 's'

所以基本上它希望当我在toStringenum 类中获得密钥时,也应用 args 进行格式化,但这我只在以后使用该枚举时才这样做......

activity.summary = String.format(activityEnum.toString(), args);

你能给我一个关于如何处理这个问题的建议吗?

更新

如果我使用经典方式,一切都很好:

PROJECT_CREATED("User <%s> created project <%s>"), PROJECT_EDITED(
        "User <%s> edited project <%s>"), PROJECT_DONATION(
        "User <%s> made a donation of <%d> to project <%s>");

但这没有国际化。

4

1 回答 1

1
  • 在构造函数中传递密钥并将其存储在成员字段中
  • 写一个方法,如:

    公共字符串 toDisplayString(String... args){ ... }

  • 摆脱 switch 语句

于 2012-04-05T18:56:39.030 回答