我需要在XPages应用程序中支持多种语言。大多数文档使用以下模式存储某种形式的历史记录:作者-动词-主题-日期,例如“迈克尔·迈尔斯(Michael Myers)于1978年10月25日购买了一把刀。”
为了获得我的语言支持,我想设置翻译机制并翻译动词和主语。我考虑将字符串存储在属性文件中。
所以我想将历史记录存储在我的历史记录字段中: 迈克尔·迈尔斯(Michael Myers)1978年10月25日#买了@@ a刀@。
此字段是一个多值字段,因此输出将是一个向量,但我通过$ U.toArray()xsnippet函数将其转换为Array,因此可以在其上使用反向显示。
我想通过重复控件显示历史记录。看起来像这样:
<xp:repeat id="rptHistory" rows="1000" var="obj" indexVar="idx">
<xp:this.value><![CDATA[#{javascript:var $U = {
/*
/* function that always returns an array for the input value
*/
toArray : function(input) {
try {
if (typeof input === "undefined" || input === null) {
//return empty array
return [];
}
if (typeof input === "string") {
//convert string to array (or empty array)
return ( input.length > 0 ? [input] : [] );
}
if (typeof input === "java.util.Vector") {
//Normally we would use toArray here, but this returns an Object array.
//If you try to use that in a doc.replaceItemValue call, it fails.
//sample code:
//var v = getComponent("input1").getValue(); //returns a Vector if the component contains multiple values
//v = $U.toArray(v) //returns an array of Objects
//doc.replaceItemValue("someOtherField", v); //fails
//the solution I used here is to create a JS array and copy the all the Vector's values
var a = [];
var it = input.iterator();
while (it.hasNext() ) {
a.push( it.next() );
}
return a;
}
if (typeof input.toArray !== "undefined") {
return input.toArray();
}
if ( input.constructor === Array ) {
//return input if it's already an array
return input;
}
//return input as an array
return [ input ];
} catch(e) {
print("$U.toArray: " + e.toString());
}
}
}
var coll = compositeData.log;
if(compositeData.sort == "descending"){
var result = $U.toArray(coll);
uidArray = result;
uidArray.reverse();
uidReversed = uidArray;
return uidReversed;
}else{
return coll;
}
}]]></xp:this.value>
<xp:panel tagName="div">
<small>
<xp:text escape="true"
value="#{javascript:obj}" />
</small>
</xp:panel>
</xp:repeat>
在计算的文本控件中,我需要提供翻译。
有人猜出如何找到我要寻找的字符串吗?
我尝试设置一个正则表达式,但是不确定如何执行此操作
<xp:text escape="true">
<xp:this.value><![CDATA[#{javascript:var str = obj;
var regexp = new RegExp("^#.*#$");
return regexp.replace(str, "---")}]]></xp:this.value>
</xp:text>
答案 0 :(得分:0)
我现在使用:
var str = obj;
var regexp = /\@(.*?)\@/;
var translations = regexp.exec(str);
if (null != translations){
for (i = 0; i < translations.length; i++) {
if(null != regexp.exec(str)){
trans = regexp.exec(str)[0];
//verb first
if (null != trans){
str = regexp.replace(str, history[trans]);
}
}
}
}
return str;
转换字符串按如下方式存储在属性文件中:
@verb_bought@=köpte
@subj_knife@=ett kniv
因此,1978年10月25日存储的字符串Michael Myers @ verb_bought @ @ subj_knife @在1978年10月25日成为Michael Myersköpteett kniv