我的webapp有一个智能的Java翻译器,所以我不能在ZK中使用简单的基于标签的i18n。相反,应该调用带有两个参数的智能翻译器方法-键和语言,但当前的语言应该从某个webapp作用域获取。
如果有一个EL函数会非常有用
<textbox value="${x:translate('some.i18n.key')}"/>
它使用给定的字符串参数和会话中的当前语言代码调用我的智能翻译器方法。
我能做的就是定义一个两个参数的translate
方法
<?xel-method prefix="x" name="translate"
class="mypackage.Translator"
signature="java.lang.Class translate(java.lang.String,java.lang.String)"?>
并将其用作
<textbox value="${x:translate('qqq',sessionScope.get('LANGUAGE'))}"/>
但是每次写入第二个参数并不是一个好的解决方案。它可以写得更短一些,如
<textbox value="${x:translate('qqq',LANGUAGE)}"/>
或者选择更短的密钥而不是LANGUAGE
,但我对更紧凑的形式感兴趣。
有没有可能定义这样一个函数来隐式获取第二个参数?或者以某种方式从EL调用会话/桌面/页面范围内的对象的方法?
发布于 2020-03-30 12:28:39
我们使用带有ZK的MVVM模式,而翻译是zk引用进入视图模型的一个方面。为了减少它的影响,我们做到了:
创建了一个转换器界面:
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);
}
和一个翻译器实现:
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。
然后使用它,如下所示。在视图模型中:
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文件中:
<window viewModel="@id('vm')" @init('com.example.SomeScreenVM')>
<label value="@load(vm.translate('hello'))"/>
</window>
发布于 2020-03-30 11:57:44
定制标记库是您需要的解决方案。它存在于ZK中:https://www.zkoss.org/wiki/ZUML_Reference/ZUML/Processing_Instructions/taglib/Custom_Taglib
发布于 2020-03-30 14:49:59
我可以(错过)使用EL的map支持来调用对象的非静态、单参数方法。
首先,我需要一个实现java.util.Map
的translator对象,它可以翻译其get()
方法中的字符串:
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中使用它:
<zscript>
desktopScope.put("tr",new mypackage.Translator(sessionScope.get("language")));
</zscript>
<textbox value="${tr.some_key}"/>
<textbox value="${tr['some.hierarchical.key']}"/>
这确实不是一个清晰的解决方案,但它使得处理ZUL文件变得相当简单。
https://stackoverflow.com/questions/60920344
复制相似问题