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'

したがって、基本的には、列挙型クラスでキーを取得するときにtoString、フォーマット用の引数も適用する必要がありますが、これは後でその列挙型を使用する場合にのみ行います...

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
  • コンストラクターにキーを渡し、メンバーフィールドに格納します
  • 次のようなメソッドを記述します。

    public String toDisplayString(String ... args){...}

  • switchステートメントを削除します

于 2012-04-05T18:56:39.030 に答える