当前位置: 首页 > 面试题库 >

多个枚举的国际化(枚举值的翻译)

傅花蜂
2023-03-14
问题内容

我有几个需要国际化的枚举(我需要将枚举值转换为某些语言才能在jsf页面中显示)。考试列举:

public enum TransferStatus {
  NOT_TRANSFERRED,
  TRANSFERRED
}

翻译将是例如Not yet transferred/Transferred, all good

转换应存储在MessageBundle(属性文件)中。我正在寻找一个简单,通用的解决方案(最好是无需在所有枚举中编写额外的代码),而该解决方案在jsf方面并不需要太多。仅提及它,当然,两个不同的枚举可能具有相同的枚举值(例如,类似的值COMPLETED在不同的枚举中具有不同的含义)。

我想出的解决方案:

(1)将翻译存储在属性文件中,如下所示:

TransferStatus.NOT_TRANSFERRED = Not yet transferred
TransferStatus.TRANSFERRED = Transferred, all good

(2)制作一个接受枚举并生成查找键的帮助程序类:

public class EnumTranslator {
  public static String getMessageKey(Enum<?> e) {
    return e.getClass().getSimpleName() + '.' + e.name();
  }
}

(3)将此代码添加到每个枚举中:

public String getKey() {
  return EnumTranslator.getMessageKey(this);
}

(4)现在,我可以这样访问枚举的转换值:

<h:outputText value="#{enum[order.transferStatus.key]}" />

可以,但是我不喜欢getKey()在每个枚举中添加相同的方法。那应该有更好的东西!现在轮到你了,所以:-)


问题答案:

好的,现在这是完整且随时可用的解决方案:(感谢@Joop Eggen)

上课

public final class EnumTranslator {
  public static String getMessageKey(Enum<?> e) {
    return e.getClass().getSimpleName() + '.' + e.name();
  }
}

使其成为自定义EL功能

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://example.com/enumi18n</namespace>
<function>
    <function-name>xlate</function-name>
    <function-class>your.package.EnumTranslator</function-class>
    <function-signature>String getMessageKey(java.lang.Enum)</function-signature>
</function>
</facelet-taglib>

将taglib添加到您的web.xml

<context-param>
    <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
    <param-value>/WEB-INF/enumi18n.taglib.xml</param-value>
</context-param>

具有这样的属性文件enum_en.properties和enum_yourlanguage.properties

TransferStatus.NOT_TRANSFERRED = Not transferred
TransferStatus.TRANSFERRED = Transferred

将属性文件作为资源包添加到您的faces-config.xml中

    <resource-bundle>
        <base-name>kk.os.obj.jsf.i18n.enum</base-name>
        <var>enum</var>
    </resource-bundle>

将自定义标签库添加到您的xhtml文件中

<html ... xmlns:l="http://example.com/enumi18n">

并且-voilà-您现在可以在jsf中访问已转换的枚举值:

<h:outputText value="#{enum[l:xlate(order.transferStatus)]}" />


 类似资料:
  • 问题内容: 这不是卡住我的问题,而是我正在寻找一种编写代码的整洁方法。 本质上,我正在编写一个事件驱动的应用程序。用户触发一个事件,该事件被发送到适当的对象,然后这些对象处理事件。现在,我正在编写偶数处理程序方法,并且希望使用switch语句确定如何处理事件。现在,在我研究通用结构时,事件类非常简单: 然后,在另一堂课中,我会看到类似以下内容的内容: 我会 喜欢 做的就是这样的事情(尽管我当然会坚

  • 枚举具有名为'hash value'的属性,该属性是枚举内的索引。

  • 问题内容: 我有一个枚举的类对象(我有一个),我需要获取此枚举表示的枚举值的列表。该静态函数有我需要什么,但我不知道怎么去从类对象访问它。 问题答案:

  • 问题内容: 我想知道在Java中是否可以嵌套枚举。 在这里,我想做的是: 拥有一个由CAT和DOG组成的物种,将允许我访问可用CAT和DOG品种的子枚举。例如,我希望能够测试是否装有CAT或DOG,以及动物是否是PERSAN CAT或PITBULL狗。CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。 这是我要使用的访问模式的示例: 种类: 物种 种狗 品种:

  • 问题内容: 我们有一个带有枚举字段-的实体,我们想使用JPA注释-为它设置默认值。 但是,当我们将实体保存到数据库时,此字段的值为和。对于布尔字段- 正确的默认值()已保存。 如果改为使用:,则会在保存时得到以下异常: 我们做错了什么?为什么它仅适用于布尔值? 问题答案: 当某些SQL代码在未为emailCommunicationStatus列指定任何值的情况下插入一行时,您所做的工作很有用。在这

  • 为什么我在浏览java时看不到