1

我在 Clazz 类有一个枚举 FooBar,其中包含 FOO 和 BAR,如下所示:

class Clazz {
    enum FooBar{
        FOO,
        BAR
    }
}

我现在想使用 wicketgetString()方法来本地化值FOOBAR. 我能做的最好的就是在 i18n 文件中定义

 Clazz.FooBar.FOO=foo
 Clazz.FooBar.BAR=bar

我用这段代码得到值

 fooBar = FooBar.FOO;
 getString("Clazz.FooBar." + fooBar.name());

我听说这可以在不Clazz.FooBar添加 i18n 查询字符串的情况下实现,但是要调用的方法会有所不同。这该怎么做?

4

5 回答 5

1

您可以将此方法放在基本页面/面板中:

public String getString(Enum<?> value) {
    Class<?> enclosingClass = value.getClass().getEnclosingClass();
    String key = (enclosingClass == null ? "" : enclosingClass.getSimpleName() + ".")
            + value.getClass().getSimpleName() + "." + value.name();
    return getString(key);
}

然后你可以简单地调用它

getString(Clazz.FooBar.FOO);

它将返回您在属性文件中定义的内容。

于 2012-08-09T17:00:24.823 回答
1

我不建议您将枚举常量名称直接存储在属性文件中,原因很简单,两个不同的枚举可以拥有相同的名称。

下面是我想出的代码

class Clazz {
enum FooBar {
    //StrId are keys from property file e.g. below
    FOO("com.abc.classz.foobar.FOO"), BAR("com.abc.classz.foobar.BAR");

    private final String strId;

    private FooBar(String id) {
        this.strId = id;
    }

    // toString can also be used here I am just keen on having seperate
    // method
    public String getName() {
        //Load Value for strId from properties file
        return null;
    }
}
}

这将使您的枚举和您的 i18n 目的分开且清晰。

于 2012-08-13T18:01:16.743 回答
0

请参见下面的示例 Enum 类。您可能希望根据自己的需要对其进行更多自定义。

    public enum FooBar {

    foo("foobar.foo"),
    bar("foobar.bar");

    private String key;

    ErrorCodeEnum(final String key) {
        this.key = key;     
    }



    public String toString() {
        return key;
    }
}

然后您可以使 toString 方法直接返回键,以便您可以使用

 getString(ErrorCodeEnum.ERROR1);

或者您可以直接覆盖 toString 方法,如下所示

 public enum FooBar {

    foo, bar;

     public String toString(){
        return getClass().getName()+"."+name();
     }
  }
于 2012-08-01T11:43:42.957 回答
0

你可以简单地定义

FOO=foo
BAR=bar

在您的属性中并通过以下方式访问它

getString(fooBar.name());

还是我错过了一些观点?

于 2012-08-01T17:04:57.747 回答
0

我正在寻找一个叫做EnumChoiceRenderer. 主要思想是为例如 DropDownChoise 元素提供 EnumChoiceRenderer,您可以提供我在问题中提出的那种参数。好的,在这个解决方案中,您只能提供

     FooBar.BAR=bar
     FooBar.FOO=foo

在您的资源文件中,但这是我在业余时间对此进行更多调查时能找到的最接近的。

PS。点击本答案开头的 EnumChoiseRenderer 可查看本解决方案的文章。

于 2012-08-01T18:45:29.623 回答