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

标签 java jsf internationalization enums

再次讨论过的事情before我想分享“我的”解决方案并寻求增强功能、其他方法或最佳实践。

我有几个需要国际化的枚举(我需要将枚举值翻译成某些语言以便在 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)

开设类(class)

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>

将标签库添加到您的 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">

而且 - 瞧 - 您现在可以在 jsf 中访问翻译后的枚举值:

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

关于java - 多个枚举的国际化(枚举值的翻译),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15633007/

相关文章:

java - 如何在 I18n 中使用 Spring?

java - 为什么我们必须为 JTable 使用 TableModel?

java - 给定一组输入和一个结果,我将如何获得用于获得结果的方程式?

javascript - 调用 h :commandButton submit 后关闭模态面板

java - 根据条件单击按钮时显示确认弹出窗口

internationalization - 我可以得到特定词典的整个 i18n 标签吗

java - 如何以编程方式从另一个 Android 应用程序访问/检测特定的 Activity 变量?

java - 你会在 MySQL 中映射 Java/Hibernate 中的 BigDecimal 什么类型?

jsf - 如何将 bean 属性从一个 View 传递到另一个 View

ruby-on-rails - 在语言环境文件中使用辅助方法?