在一个实体中,我有一个用英语和法语翻译的枚举字段。
在同一个实体中,我有一个用作 toString 的计算字段,因此我想根据用户的语言环境,用英语或法语翻译的枚举值来构建计算字段。
我的问题:在实体扩展中编写的计算字段的 getter 中,如何获取用户的语言环境并翻译枚举值?
在一个实体中,我有一个用英语和法语翻译的枚举字段。
在同一个实体中,我有一个用作 toString 的计算字段,因此我想根据用户的语言环境,用英语或法语翻译的枚举值来构建计算字段。
我的问题:在实体扩展中编写的计算字段的 getter 中,如何获取用户的语言环境并翻译枚举值?
你必须让你的扩展知道它的执行上下文。您可以在扩展中实现几个接口,以便它们被注入其运行上下文的元素。
org.jspresso.framework.model.component.IComponentFactoryAware接收ICompoentFactory实例org.jspresso.framework.security.ISubjectAware接收登录的实例Subjectorg.jspresso.framework.application.backend.session.IApplicationSessionAware接收当前实例IApplicationSessionorg.jspresso.framework.model.entity.IEntityLifecycleHandlerAware接收一个实例IEntityLifecycleHandler为了满足您的用例,必须实现第四个接口。IEntityLifecycleHandler您的扩展将通过以下方法注入一个实例:
void setEntityLifecycleHandler(IEntityLifecycleHandler);
只需将此实例作为实例参数存储在您的扩展实现中,然后通过安全地将其转换为org.jspresso.framework.application.IController.
例如 :
public String getI18nLabel() {
String translationKey = "ENUM_NAME." + getComponent().getEnumValue();
IController controller = (IController) lifecycleHandler;
return controller.getTranslation(translationKey, controller.getLocale());
}
请记住,枚举的 I18N 资源包键的模式是在上面的代码中${ENUM_NAME}.${ENUM_VALUE}作为translationKey局部变量计算的。