package jcore.jsonrpc.test; import java.io.Serializable; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import jcore.google.api.translate.Translate; /*** * JSON-RPC翻译服务对象 * @author 夏天 * */ public class A implements Serializable { private HttpServletRequest request = null; private static final long serialVersionUID = -5362330504532103641L; // 用static单实例模式,以便多Web用户共享已经翻译过的字符串的cache private static A _this = new A(); private static A getInstance() { return _this; } public A(){}
public A setRequest(HttpServletRequest r) { this.request = r; return this; }
// 翻译的cache private Map map = new HashMap();
/*** * JRPC中翻译语言的支持,如果翻译过程中出现网络错误就返回原文本 * @param szStr 待翻译的文本 * @param from 待翻译的文本的语言 * @param to 将要翻译的语言 * @return */ public String Translate(String szStr, String from, String to) { try { A oA = getInstance(); Map m = oA.getMap(); synchronized(m) { String szKey = szStr + "_" + to, szNew = (String)m.get(szKey); if(null == szNew) m.put(szKey, szNew = Translate.translate(szStr, from, to)); return szNew; } } catch (Exception e) { } return szStr; }
public HttpServletRequest getRequest() { return this.request; } // Click为测试的方法,实际应用应该删除它 public List Click() { List lst = new ArrayList(); lst.add(new Date()); Map map = new HashMap(); map.put("name", "mete"); map.put("nm01", "mete=meet"); map.put("nm02", "mete=miracle + talent"); lst.add(map); lst.add(new String[]{ "多种复合对象的访问", "你可以尝试在javascript中直接访问这些返回的符合对象的方法", "如同访问Java对象一样", "而不需要做任何特别的编码,只写java代码就可以了"}); return lst; } public Map getMap() { return map; } } 网站多语言实时翻译轻量级JavaScript框架设计如下:
// 功能描述:网站多语言应用级框架封装 // 返回信息:JSON-RPC client for Java的对象 // 使用指南:fnTranslate().trs("en"); // 应用范围:各种Web客户端 function fnTranslate() { if(this == window)return new fnTranslate(); var navigator = window.navigator // 浏览器多语言支持 this.szCurLang = this.szLanguage || (this.szLanguage = (navigator.language || navigator.userLanguage).replace(/\-cn$/i, '')); // 浏览器级缓存 this.cache || (this.cache = []); // 通常使用的人员定义fnTranslate.config如何就可以开始 // fnTranslate().trs("en")了 var config = fnTranslate.config, // 默认的语言已经缓存过 bFirst = !!this.cache[this.szLanguage]; var objs = null; // 对配置中的XPath进行获取对象,并cache起来,以提高效率 if(!bFirst || !!this.cache.objs) { objs = (this.cache.objs = []); var arrStr, i; arrStr = (this.cache[this.szLanguage] = []); for(i = config.length - 1; i > -1; i--) { J(config[i]).each(function() { objs.push(this); }); } for(i = objs.length - 1; i > -1; i--) { arrStr.push(objs[i].textContent || objs[i].innerText); } // 默认语言 this.cache.szStr = arrStr.join(fnTranslate.config.split); } objs = this.cache.objs; var _this = this; this.trs = function(szLang) { var arrTrs = [], szTrs = ""; // 如果等于默认的语言,直接使用缓存完成翻译 if(_this.cache[szLang]) { // 只有曾经触发过翻译才执行 if(fnTranslate.bT && szLang != _this.szCurLang) { arrTrs = _this.cache[_this.szCurLang = szLang]; var j = 0; // 完成翻译, 在for之外执行if效率更高 for(i = objs.length - 1; i > -1; i--,j++) arrTrs[j]&& (objs[i].innerHTML = arrTrs[j]); } } else { // 同步翻译返回结果 new JsonRpcClient().myTrs.Translate(function(s) { _this.cache[_this.szCurLang = szLang] = arrTrs = (szTrs = s).split(fnTranslate.config.split); var j = 0; fnTranslate.bT = true; // 完成翻译, 在for之外执行if效率更高 for(i = objs.length - 1; i > -1; i--,j++) arrTrs[j]&& (objs[i].innerHTML = arrTrs[j]); }, _this.cache.szStr, _this.szLanguage, szLang); } }; } // 这里针对本书的示例配置为:"h1,th,option,button,span" // 根据需求的不同,你可以设计为多个Xpath表达式,例如: // "table/td/div[classname=MyTest]" fnTranslate.config = [ "h1,th,option,button,span" ]; fnTranslate.config.split = "|"; var oMyTrs = fnTranslate(), oTrsto = _id("myTrsTo");
|