【问题标题】:How to translate an Enum dynamically in Spring?如何在 Spring 中动态翻译枚举?
【发布时间】:2017-10-25 03:30:05
【问题描述】:

春季新品!我正在尝试动态翻译像 Gender 这样的枚举,但我不知道如何。假设我有一个性别对象......

公共枚举性别{ 女性, 男性; }

我有一个控制器,它会用它来填充一个jsp,就像这样......

 @RequestMapping(value = "/edit-profile-about3", method = RequestMethod.GET)
        public ModelAndView editProfileAbout3(ModelAndView modelAndView) {

            SiteUser user = getUser();

            Profile profile = profileService.getUserProfile(user);

            Profile webProfile = new Profile();
            webProfile.safeCopyFrom(profile);

            List<Gender> gender = new ArrayList<Gender>(EnumSet.allOf(Gender.class));
           modelAndView.getModel().put("gender", gender);
           modelAndView.setViewName("app.editprofileabout3");
            return modelAndView;
        }

现在我不想在我的 JSP 中显示值 MALE 和 FEMALE 大写,就像它们从枚举中显示的那样,而是像英语中的男性和女性或西班牙语中的 Hombre 和 Mujer 一样::: p>

<form:form modelAttribute="profile" class="sky-form" id="sky-form4">

                                    <dl class="dl-horizontal">
                                        <dt>Gender:</dt>
                                        <dd>
                                            <form:radiobuttons path="gender" items="${gender}" />
                                        </dd>
                                    </dl>
<button class="btn-u btn-u-default" type="button" value="Cancel">Cancelar</button>
<button class="btn-u" type="submit" name="submit" value="Save">Guardar</button>
</form:form>`

我该怎么做?我认为这不是属性国际化,因为 jsp 使用 MALE FEMALE 动态收取表单:radiobuttons path="gender" items="${gender}" 并且我希望在它到达 JSP 之前将其翻译(换句话说, 我不能使用属性同时翻译两个枚举,对吧?当我得到我的 POST 控制器的答案时,我想得到 MALE、FEMALE,但可能是 show Hombre、Mujer(翻译)。 谢谢

【问题讨论】:

  • 也就是说,你需要将 Spring MVC 应用程序国际化。以下是其中一个示例:mkyong.com/spring-mvc/spring-mvc-internationalization-example
  • 你确定吗?使用 form:radiobuttons path="gender" items="${gender}" 时可以翻译所有枚举吗?谢谢
  • JSP 正在服务器端呈现,在此过程中,可以从属性中获取翻译,以将已翻译项目的页面返回给用户。
  • 怎么样?我有这个表格:radiobuttons path="gender" items="${gender}。按照你的例子......我应该使用 items="welcome.springmvc.gender.male" 和 items="welcome.springmvc.gender。女性”?放两行,每个枚举一个

标签: java jsp spring-mvc internationalization


【解决方案1】:

根据docs

1.12 枚举常量的序列化

枚举常量的序列化方式与普通可序列化不同 或可外化的对象。枚举常量的序列化形式 仅由其名称组成;常量的字段值不是 呈现在表格中。要序列化枚举常量,ObjectOutputStream 写入枚举常量的 name 方法返回的值。到 反序列化一个枚举常量,ObjectInputStream 读取该常量 流中的名称;然后通过以下方式获得反序列化的常数 调用 java.lang.Enum.valueOf 方法,传递常量的枚举 类型连同接收到的常量名称作为参数。和其他一样 可序列化或可外部化的对象,枚举常量可以用作 随后出现的反向引用的目标 序列化流。

枚举常量序列化的过程不能 定制:任何特定于类的 writeObject、readObject、 定义的 readObjectNoData、writeReplace 和 readResolve 方法 枚举类型在序列化和反序列化期间被忽略。 同样,任何 serialPersistentFields 或 serialVersionUID 字段 声明也被忽略——所有枚举类型都有一个固定的 serialVersionUID 为 0L。记录可序列化的字段和数据 枚举类型是不必要的,因为类型没有变化 发送的数据。

所以,如果Enum 只是被序列化,您必须将 Enum 名称更改为您想要的大小写(所有大写字母只是惯例)。如果 Enum 只是被转换为字符串,那么 Enum 就像一个类,所以你可以像这样重写 toString 方法。 (以及构造函数和值持有者)

public static enum GENDER {
    MALE("Male", "Hombre"), FEMALE("Female", "Mujer");

    GENDER (String en, String sp) {
        en_value = en;
        sp_value = sp;
    }

    private String en_value;
    private String sp_value;

    @Override
    public String toString() {
        return en_value;
    }

    public String toEnglish() {
        return en_value;
    }

    public String toSpanish() {
        return sp_value;
    }
}

【讨论】:

  • @Miguel 希望它也被翻译。在这种情况下,toString() 的方法很可能不起作用。
  • 你能解释一下它在Controller和JSP中的显示方式(小写)吗?你有任何文件吗?谢谢
  • @Miguel 添加了更多信息。序列化的工作方式与我想象的不同,所以“正确”的方式取决于 GENDER 是序列化还是字符串化。不过,在这两种情况下,只需更改 Enum 名称即可。
  • @Tezra。谢谢,但是您的示例可以更具体吗?解释 Controller 和 JSP(以 Male=Hombre 和 Female=Mujer 为例)
  • @Miguel 我无法运行它来测试,我也无法判断 @RequestMapping 是对数据进行序列化,还是将其转换为字符串......但你可能应该只传递一个字符串,并有一个翻译键(服务器端或客户端)将键值转换为适当的用户语言。
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-24
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
相关资源
最近更新 更多