首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用EL在ZK中实现翻译功能

如何使用EL在ZK中实现翻译功能
EN

Stack Overflow用户
提问于 2020-03-30 04:30:17
回答 3查看 163关注 0票数 1

我的webapp有一个智能的Java翻译器,所以我不能在ZK中使用简单的基于标签的i18n。相反,应该调用带有两个参数的智能翻译器方法-键和语言,但当前的语言应该从某个webapp作用域获取。

如果有一个EL函数会非常有用

代码语言:javascript
运行
复制
<textbox value="${x:translate('some.i18n.key')}"/>

它使用给定的字符串参数和会话中的当前语言代码调用我的智能翻译器方法。

我能做的就是定义一个两个参数的translate方法

代码语言:javascript
运行
复制
 <?xel-method prefix="x" name="translate"
     class="mypackage.Translator"
     signature="java.lang.Class translate(java.lang.String,java.lang.String)"?>

并将其用作

代码语言:javascript
运行
复制
 <textbox value="${x:translate('qqq',sessionScope.get('LANGUAGE'))}"/>

但是每次写入第二个参数并不是一个好的解决方案。它可以写得更短一些,如

代码语言:javascript
运行
复制
 <textbox value="${x:translate('qqq',LANGUAGE)}"/>

或者选择更短的密钥而不是LANGUAGE,但我对更紧凑的形式感兴趣。

有没有可能定义这样一个函数来隐式获取第二个参数?或者以某种方式从EL调用会话/桌面/页面范围内的对象的方法?

EN

回答 3

Stack Overflow用户

发布于 2020-03-30 12:28:39

我们使用带有ZK的MVVM模式,而翻译是zk引用进入视图模型的一个方面。为了减少它的影响,我们做到了:

创建了一个转换器界面:

代码语言:javascript
运行
复制
public interface Translator {
    String translate(String key);

    // used where the string to be translation includes placeholders
    // total_qty=Total qty: {1}
    String translate(String key, String... params);
}

和一个翻译器实现:

代码语言:javascript
运行
复制
public class ZKTranslator implements Translator {

    @Override
    public String translate(String s) {
        String translation = Labels.getLabel(s);
        if (translation == null)
            return s;
        return translation;
    }

    @Override
    public String translate(String key, String... params) {
        String translation = Labels.getLabel(key, params);
        if (translation == null)
            return key;
        return translation;
    }
}

这个实现可以引用会话来检索一种语言,或者在初始化时将该语言传递给ZKTranslator。

然后使用它,如下所示。在视图模型中:

代码语言:javascript
运行
复制
public class SomeScreenVM {
    private Translator translator;

    @Init
    public void init() {
        // get language from session possibly
        translator = new ZKTranslator(); // or new ZKTtanslator(language);
    }

    public String translate(String s) {
        return translator.translate(s);
    }
}

在您的zul文件中:

代码语言:javascript
运行
复制
<window viewModel="@id('vm')" @init('com.example.SomeScreenVM')>
    <label value="@load(vm.translate('hello'))"/>
</window>
票数 2
EN

Stack Overflow用户

发布于 2020-03-30 11:57:44

定制标记库是您需要的解决方案。它存在于ZK中:https://www.zkoss.org/wiki/ZUML_Reference/ZUML/Processing_Instructions/taglib/Custom_Taglib

票数 0
EN

Stack Overflow用户

发布于 2020-03-30 14:49:59

我可以(错过)使用EL的map支持来调用对象的非静态、单参数方法。

首先,我需要一个实现java.util.Map的translator对象,它可以翻译其get()方法中的字符串:

代码语言:javascript
运行
复制
    public class Translator implements Map<String, String> {

        private String language;

        public Translator(String language) {
            super();
            this.language = language;
        }

        @Override
        public String get(Object arg0) {
            return translate(arg0.toString(), language);
        }
        ...
    }

然后我可以把一个翻译器放到桌面作用域中,并在EL中使用它:

代码语言:javascript
运行
复制
<zscript>
    desktopScope.put("tr",new mypackage.Translator(sessionScope.get("language")));
</zscript>

 <textbox value="${tr.some_key}"/>
 <textbox value="${tr['some.hierarchical.key']}"/>

这确实不是一个清晰的解决方案,但它使得处理ZUL文件变得相当简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60920344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档