diff --git a/jshERP-web/public/index.html b/jshERP-web/public/index.html index 29822280a..d79a8d54b 100644 --- a/jshERP-web/public/index.html +++ b/jshERP-web/public/index.html @@ -237,8 +237,6 @@ } /* 滚动条优化 end */ - - @@ -295,4 +284,34 @@ - + + + + + + + \ No newline at end of file diff --git a/jshERP-web/public/static/translate.js b/jshERP-web/public/static/translate.js index 6ac139928..998f46b9a 100644 --- a/jshERP-web/public/static/translate.js +++ b/jshERP-web/public/static/translate.js @@ -3,8 +3,10 @@ 国际化,网页自动翻译。 作者:管雷鸣 开原仓库:https://github.com/xnx3/translate - */ +if(typeof(translate) == 'object' && typeof(translate.version) == 'string'){ + throw new Error('translate.js 已经加载过一次了,当前是重复加载,避免你的翻译出现异常,已帮你拦截此次加载。本信息只是给你一个提示,你可以检查一下你的项目中是否出现了重复引入 translate.js ,当然,这个异常并不会影响到你的具体使用,它已经自动帮你处理拦截了这个异常,只不过提示出来是让你知道,你的代码里出现了重复引入的情况。'); +} var translate = { /** * 当前的版本 @@ -12,8 +14,8 @@ var translate = { * 格式:major.minor.patch.date */ // AUTO_VERSION_START - version: '3.12.4.20250110', - // AUTO_VERSION_END + version: '3.13.3.20250210', + // AUTO_VERSION_END /* 当前使用的版本,默认使用v2. 可使用 setUseVersion2(); 来设置使用v2 ,已废弃,主要是区分是否是v1版本来着,v2跟v3版本是同样的使用方式 @@ -179,7 +181,7 @@ var translate = { document.getElementById('translateSelectLanguage').style.width = '94px'; }catch(e){ console.log(e);} */ - }); + }, null); } @@ -852,6 +854,7 @@ var translate = { return doms; } }, + listener:{ //当前页面打开后,是否已经执行完execute() 方法进行翻译了,只要执行完一次,这里便是true。 (多种语言的API请求完毕并已渲染html) //isExecuteFinish:false, @@ -1116,16 +1119,14 @@ var translate = { translate.inProgressNodes[ini].number = translate.inProgressNodes[ini].number - 1; //console.log("inProgressNodes -- number: "+translate.inProgressNodes[ini].number+', text:'+ipnode.nodeValue); if(translate.inProgressNodes[ini].number < 1){ - - - //console.log('ini-'+ini) - translate.inProgressNodes.splice(ini,1); - //console.log("inProgressNodes -- 减去node length: "+translate.inProgressNodes.length+', text:'+ipnode.nodeValue); - // + translate.inProgressNodes.splice(ini,1); + //console.log("inProgressNodes -- 减去node length: "+translate.inProgressNodes.length+', text:'+ipnode.nodeValue); } + break; } } + }, 50, ipnode); translate.element.nodeAnalyse.set(this.nodes[hash][task_index], task.originalText, task.resultText, task['attribute']); @@ -1221,10 +1222,100 @@ var translate = { } } }, + + + /* + 当前状态,执行状态 + 0 空闲(或者执行翻译完毕) + 10 扫描要翻译的node,并读取浏览器缓存的翻译内容进行渲染显示 + 20 浏览器缓存渲染完毕,ajax通过文本翻译接口开始请求,在发起ajax请求前,状态变为20,然后再发起ajax请求 + 至于翻译完毕后进行渲染,这个就不单独记录了,因为如果页面存在不同的语种,不同的语种是按照不同的请求来的,是多个异步同时进行的过程 + */ + state:0, + + /* + 等待翻译队列 v3.12.6 增加 + 当前是否有需要等待翻译的任务,这个目的是为了保证同一时间 translate.execute() 只有一次在执行,免得被新手前端给造成死循环,导致edge翻译给你屏蔽,用户网页还卡死 + 当执行 translate.execute() 时,会先判断状态 translate.state 是否是0空闲的状态,如果空闲,才会执行,如果不是空闲,则不会执行,而是进入到这里进行等待,等待执行完毕后 translate.state 变成0空闲之后,再来执行这里的 + + */ + waitingExecute:{ + + /* + 一维数组形态,存放执行的翻译任务 + 二维对象形态,存放执行传入的 docs + */ + queue:[], + /* + 增加一个翻译任务到翻译队列中 + docs 同 translate.execute(docs) 的传入参数 + */ + add:function(docs){ + //向数组末尾追加 + translate.waitingExecute.queue.push(docs); + //开启一个定时器进行触发 + let intervalId = setInterval(function() { + if(translate.state == 0){ + //清除定时器,结束循环 + clearInterval(intervalId); + var docs = translate.waitingExecute.get(); + translate.execute(docs); + //console.log('stop waitingExecute setInterval'); + } + }, 500); + }, + /* + 从 quque 中取第一个元素,同时将其从queue中删除掉它。 + 如果取的时候 quque已经没有任何元素了,会返回 null, 但是理论上不会出现null + */ + get:function(){ + //使用 shift 方法删除数组的第一个元素,并将第一个元素的值返回 + if(translate.waitingExecute.queue.length > 0){ + return translate.waitingExecute.queue.shift(); + }else{ + console.log('警告, translate.waitingExecute.get 出现异常,quque已空,但还往外取。'); + return null; + } + }, + //当前 translate.translateRequest[uuid] 的是否已经全部执行完毕,这里单纯只是对 translate.translateRequest[uuid] 的进行判断,这里要在 translate.json 接口触发完并渲染完毕后触发,当然接口失败时也要触发 + isAllExecuteFinish:function(uuid){ + + for(var lang in translate.translateRequest[uuid]){ + for(var i = 0; i 0 是执行完了有结果了, + * 1 是执行成功 + * 2 是接口有响应,也是200响应,但是接口响应的结果返回了错误,也就是返回了 {result:0, info:'...'} + * 3 是接口不是200响应码 + * + */ + translateRequest:{ + /* + uuid:[ + 'chinese_simplified':{ + executeFinish:0, + addtime:150001111, + stoptime:150001111, + result:0 + }, + ... + ] + */ + }, + /* 将已成功翻译并渲染的node节点进行缓存记录 key: node节点的唯一标识符,通过 nodeuuid.uuid() 生成 @@ -2582,7 +2743,7 @@ var translate = { //获取当前是什么语种 //var langs = translate.language.get(text); var textRecognition = translate.language.recognition(text); - langs = textRecognition.languageArray; + var langs = textRecognition.languageArray; //console.log('langs'); //console.log(langs); @@ -3873,7 +4034,7 @@ var translate = { translate.selectLanguageTag translate.execute(); //执行翻译 } - }); + }, null); }, util:{ @@ -4080,14 +4241,19 @@ var translate = { }, /** * 将一个 JSONArray 数组,按照文字长度进行拆分。 - * 比如传入的 array 数组的文字长度是6200,传入的 size 是2000,那么就是将 array 数组拆分为多个长度不超出2000的数组返回。 + * 比如传入的 array 数组的文字长度是6200,传入的 stringLength 是2000,那么就是将 array 数组拆分为多个长度不超出2000的数组返回。 + * 如果传入了 maxSize = 5 那么会对拆分后的数组的长度进行判断,如果数组内元素超过5,那么还要进行缩短,拆分后的数组不允许超过这个数 + * 也就是拆分后的数组有两重限制,一是限制转化为文本形式的长度、再就是拆分后本身数组的大小。 + * * 注意,这个长度是指 array.toString() 后的长度,也就是包含了 [""] 这种符号的长度 * @param array 要被拆分的数组,其内都是String类型,传入格式如 ["你好","世界"] - * @param size 要被拆分的长度 + * @param stringLength 要被拆分的数组转化为字符串之后的长度 + * @param maxSize 被拆分的数组最大包含多少个,数组大小最大允许多大,要小于等于这个数。 如果设置为0则是不启用这个,不对拆分后的数组进行判断。 * @return 被拆分后的数组列表 * @author 刘晓腾 */ - split:function(array, size) { + split:function(array, size, maxSize) { + let orgsize = size; let list = []; // 数组长度小于size,直接进行返回 if(JSON.stringify(array).length <= size) { @@ -4145,10 +4311,10 @@ var translate = { // 看看是否以引号开头,如果不是,需要拼两个引号 if (s.startsWith("\"")) { // 拼一个引号,-1 - endIndex = s.length() - 1; + endIndex = s.length - 1; } else { // 拼两个引号,-2 - endIndex = s.length() - 2; + endIndex = s.length - 2; } if (!s.endsWith("\"")) { // 开始不是逗号了,不能-1 @@ -4185,8 +4351,94 @@ var translate = { } } } + // 设置了maxSize,进行处理 + if (maxSize && maxSize > 0) { + list = translate.util._splitMaxSize(list, orgsize, maxSize); + } return list; }, + /** + * 针对split函数中maxSize的处理 + * private + * @param array 已拆分的二维数组 + * @param size 拆分的长度 + * @param maxSize 元素数量 + * @author 刘晓腾 + */ + _splitMaxSize:function(array, size, maxSize) { + // console.log("------ splitMaxSize run ------") + + // 返回的数据 + let list = []; + // 暂存的数组,用来存储每次遍历时超出的数据 + let tmp = []; + + // 遍历二维数组 + array.forEach(function(arr, index) { + // 累加数组 + arr = tmp.concat(arr); + // 计算元素数量 + let length = arr.length; + // 数组中元素数量大于maxSize,对多余的元素进行移除 + if (length > maxSize) { + // 第一个数组,包含前N个元素 + let firstArray = arr.slice(0, maxSize); + // 第二个数组,包含剩下的元素 + let secondArray = arr.slice(maxSize); + + // 处理长度 + let len = 1; + while (JSON.stringify(firstArray).length > size) { + // 长度超过限制,进行处理 + firstArray = arr.slice(0, maxSize - len); + secondArray = arr.slice(maxSize - len); + len++; + if (len >= arr.length+1) { + break; + } + } + + // 第一个数组记录 + list.push(firstArray); + // 第二个数组暂存 + tmp.length = 0; + tmp = secondArray; + } else { + // 没超,只处理长度 + // 处理长度 + let firstArray = arr; + let secondArray = []; + let len = 1; + while (JSON.stringify(firstArray).length > size) { + // 长度超过限制,进行处理 + firstArray = arr.slice(0, maxSize - len); + secondArray = arr.slice(maxSize - len); + len++; + if (len >= arr.length+1) { + break; + } + } + + // 第一个数组记录 + list.push(firstArray); + // 第二个数组暂存 + tmp.length = 0; + tmp = secondArray; + } + + }); + + // 临时数组中还有元素,也要进行处理 + if (tmp.length > 0) { + let tmpl = []; + tmpl.push(tmp); + // 递归处理 + let l = translate.util._splitMaxSize(tmpl, size, maxSize); + list = list.concat(l); + } + + return list; + }, /* 浏览器的语种标识跟translate.js的语种标识的对应 key: 浏览器的语种标识 @@ -4204,6 +4456,7 @@ var translate = { 'nl':'dutch', 'yo':'yoruba', 'en':'english', + 'en-US':'english', 'kok':'gongen', 'la':'latin', 'ne':'nepali', @@ -4363,7 +4616,7 @@ var translate = { }, language:{ - json:[{"id":"ukrainian","name":"УкраїнськаName","serviceId":"uk"},{"id":"norwegian","name":"Norge","serviceId":"no"},{"id":"welsh","name":"color name","serviceId":"cy"},{"id":"dutch","name":"nederlands","serviceId":"nl"},{"id":"japanese","name":"日本語","serviceId":"ja"},{"id":"filipino","name":"Pilipino","serviceId":"fil"},{"id":"english","name":"English","serviceId":"en"},{"id":"lao","name":"ກະຣຸນາ","serviceId":"lo"},{"id":"telugu","name":"తెలుగుQFontDatabase","serviceId":"te"},{"id":"romanian","name":"Română","serviceId":"ro"},{"id":"nepali","name":"नेपालीName","serviceId":"ne"},{"id":"french","name":"Français","serviceId":"fr"},{"id":"haitian_creole","name":"Kreyòl ayisyen","serviceId":"ht"},{"id":"czech","name":"český","serviceId":"cs"},{"id":"swedish","name":"Svenska","serviceId":"sv"},{"id":"russian","name":"Русский язык","serviceId":"ru"},{"id":"malagasy","name":"Malagasy","serviceId":"mg"},{"id":"burmese","name":"ဗာရမ်","serviceId":"my"},{"id":"pashto","name":"پښتوName","serviceId":"ps"},{"id":"thai","name":"คนไทย","serviceId":"th"},{"id":"armenian","name":"Արմենյան","serviceId":"hy"},{"id":"chinese_simplified","name":"简体中文","serviceId":"zh-CHS"},{"id":"persian","name":"Persian","serviceId":"fa"},{"id":"chinese_traditional","name":"繁體中文","serviceId":"zh-CHT"},{"id":"kurdish","name":"Kurdî","serviceId":"ku"},{"id":"turkish","name":"Türkçe","serviceId":"tr"},{"id":"hindi","name":"हिन्दी","serviceId":"hi"},{"id":"bulgarian","name":"български","serviceId":"bg"},{"id":"malay","name":"Malay","serviceId":"ms"},{"id":"swahili","name":"Kiswahili","serviceId":"sw"},{"id":"oriya","name":"ଓଡିଆ","serviceId":"or"},{"id":"icelandic","name":"ÍslandName","serviceId":"is"},{"id":"irish","name":"Íris","serviceId":"ga"},{"id":"khmer","name":"ខ្មែរKCharselect unicode block name","serviceId":"km"},{"id":"gujarati","name":"ગુજરાતી","serviceId":"gu"},{"id":"slovak","name":"Slovenská","serviceId":"sk"},{"id":"kannada","name":"ಕನ್ನಡ್Name","serviceId":"kn"},{"id":"hebrew","name":"היברית","serviceId":"he"},{"id":"hungarian","name":"magyar","serviceId":"hu"},{"id":"marathi","name":"मराठीName","serviceId":"mr"},{"id":"tamil","name":"தாமில்","serviceId":"ta"},{"id":"estonian","name":"eesti keel","serviceId":"et"},{"id":"malayalam","name":"മലമാലം","serviceId":"ml"},{"id":"inuktitut","name":"ᐃᓄᒃᑎᑐᑦ","serviceId":"iu"},{"id":"arabic","name":"بالعربية","serviceId":"ar"},{"id":"deutsch","name":"Deutsch","serviceId":"de"},{"id":"slovene","name":"slovenščina","serviceId":"sl"},{"id":"bengali","name":"বেঙ্গালী","serviceId":"bn"},{"id":"urdu","name":"اوردو","serviceId":"ur"},{"id":"azerbaijani","name":"azerbaijani","serviceId":"az"},{"id":"portuguese","name":"português","serviceId":"pt"},{"id":"samoan","name":"lifiava","serviceId":"sm"},{"id":"afrikaans","name":"afrikaans","serviceId":"af"},{"id":"tongan","name":"汤加语","serviceId":"to"},{"id":"greek","name":"ελληνικά","serviceId":"el"},{"id":"indonesian","name":"IndonesiaName","serviceId":"id"},{"id":"spanish","name":"Español","serviceId":"es"},{"id":"danish","name":"dansk","serviceId":"da"},{"id":"amharic","name":"amharic","serviceId":"am"},{"id":"punjabi","name":"ਪੰਜਾਬੀName","serviceId":"pa"},{"id":"albanian","name":"albanian","serviceId":"sq"},{"id":"lithuanian","name":"Lietuva","serviceId":"lt"},{"id":"italian","name":"italiano","serviceId":"it"},{"id":"vietnamese","name":"Tiếng Việt","serviceId":"vi"},{"id":"korean","name":"한국어","serviceId":"ko"},{"id":"maltese","name":"Malti","serviceId":"mt"},{"id":"finnish","name":"suomi","serviceId":"fi"},{"id":"catalan","name":"català","serviceId":"ca"},{"id":"croatian","name":"hrvatski","serviceId":"hr"},{"id":"bosnian","name":"bosnian","serviceId":"bs-Latn"},{"id":"polish","name":"Polski","serviceId":"pl"},{"id":"latvian","name":"latviešu","serviceId":"lv"},{"id":"maori","name":"Maori","serviceId":"mi"}], + json:[{"id":"ukrainian","name":"Україна","serviceId":"uk"},{"id":"norwegian","name":"Norge","serviceId":"no"},{"id":"welsh","name":"Iaith Weleg","serviceId":"cy"},{"id":"dutch","name":"nederlands","serviceId":"nl"},{"id":"japanese","name":"日本語","serviceId":"ja"},{"id":"filipino","name":"Pilipino","serviceId":"fil"},{"id":"english","name":"English","serviceId":"en"},{"id":"lao","name":"ກະຣຸນາ","serviceId":"lo"},{"id":"telugu","name":"తెలుగుName","serviceId":"te"},{"id":"romanian","name":"Română","serviceId":"ro"},{"id":"nepali","name":"नेपालीName","serviceId":"ne"},{"id":"french","name":"Français","serviceId":"fr"},{"id":"haitian_creole","name":"Kreyòl ayisyen","serviceId":"ht"},{"id":"czech","name":"český","serviceId":"cs"},{"id":"swedish","name":"Svenska","serviceId":"sv"},{"id":"russian","name":"Русский язык","serviceId":"ru"},{"id":"malagasy","name":"Malagasy","serviceId":"mg"},{"id":"burmese","name":"ဗာရမ်","serviceId":"my"},{"id":"pashto","name":"پښتوName","serviceId":"ps"},{"id":"thai","name":"คนไทย","serviceId":"th"},{"id":"armenian","name":"Արմենյան","serviceId":"hy"},{"id":"chinese_simplified","name":"简体中文","serviceId":"zh-CHS"},{"id":"persian","name":"Persian","serviceId":"fa"},{"id":"chinese_traditional","name":"繁體中文","serviceId":"zh-CHT"},{"id":"kurdish","name":"Kurdî","serviceId":"ku"},{"id":"turkish","name":"Türkçe","serviceId":"tr"},{"id":"hindi","name":"हिन्दी","serviceId":"hi"},{"id":"bulgarian","name":"български","serviceId":"bg"},{"id":"malay","name":"Malay","serviceId":"ms"},{"id":"swahili","name":"Kiswahili","serviceId":"sw"},{"id":"oriya","name":"ଓଡିଆ","serviceId":"or"},{"id":"icelandic","name":"ÍslandName","serviceId":"is"},{"id":"irish","name":"Íris","serviceId":"ga"},{"id":"khmer","name":"ភាសា​ខ្មែរName","serviceId":"km"},{"id":"gujarati","name":"ગુજરાતી","serviceId":"gu"},{"id":"slovak","name":"Slovenská","serviceId":"sk"},{"id":"kannada","name":"ಕನ್ನಡ್Name","serviceId":"kn"},{"id":"hebrew","name":"היברית","serviceId":"he"},{"id":"hungarian","name":"magyar","serviceId":"hu"},{"id":"marathi","name":"मराठीName","serviceId":"mr"},{"id":"tamil","name":"தாமில்","serviceId":"ta"},{"id":"estonian","name":"eesti keel","serviceId":"et"},{"id":"malayalam","name":"മലമാലം","serviceId":"ml"},{"id":"inuktitut","name":"ᐃᓄᒃᑎᑐᑦ","serviceId":"iu"},{"id":"arabic","name":"بالعربية","serviceId":"ar"},{"id":"deutsch","name":"Deutsch","serviceId":"de"},{"id":"slovene","name":"slovenščina","serviceId":"sl"},{"id":"bengali","name":"বেঙ্গালী","serviceId":"bn"},{"id":"urdu","name":"اوردو","serviceId":"ur"},{"id":"azerbaijani","name":"azerbaijani","serviceId":"az"},{"id":"portuguese","name":"português","serviceId":"pt"},{"id":"samoan","name":"lifiava","serviceId":"sm"},{"id":"afrikaans","name":"afrikaans","serviceId":"af"},{"id":"tongan","name":"汤加语","serviceId":"to"},{"id":"greek","name":"ελληνικά","serviceId":"el"},{"id":"indonesian","name":"IndonesiaName","serviceId":"id"},{"id":"spanish","name":"Español","serviceId":"es"},{"id":"danish","name":"dansk","serviceId":"da"},{"id":"amharic","name":"amharic","serviceId":"am"},{"id":"punjabi","name":"ਪੰਜਾਬੀName","serviceId":"pa"},{"id":"albanian","name":"albanian","serviceId":"sq"},{"id":"lithuanian","name":"Lietuva","serviceId":"lt"},{"id":"italian","name":"italiano","serviceId":"it"},{"id":"vietnamese","name":"Tiếng Việt","serviceId":"vi"},{"id":"korean","name":"한국어","serviceId":"ko"},{"id":"maltese","name":"Malti","serviceId":"mt"},{"id":"finnish","name":"suomi","serviceId":"fi"},{"id":"catalan","name":"català","serviceId":"ca"},{"id":"croatian","name":"hrvatski","serviceId":"hr"},{"id":"bosnian","name":"bosnian","serviceId":"bs-Latn"},{"id":"polish","name":"Polski","serviceId":"pl"},{"id":"latvian","name":"latviešu","serviceId":"lv"},{"id":"maori","name":"Maori","serviceId":"mi"}], /* 获取map形式的语言列表 key为 translate.service 的 name @@ -4387,12 +4640,10 @@ var translate = { * @param data 请求的参数数据 * @param func 请求完成的回调,传入如 function(data){ console.log(data); } */ - translate:function(path, data, func){ + translate:function(path, data, func, abnormalFunc){ var textArray = JSON.parse(decodeURIComponent(data.text)); - let translateTextArray = translate.util.split(textArray, 48000); - //console.log(translateTextArray); + let translateTextArray = translate.util.split(textArray, 40000, 900); - translate.request.send(translate.service.edge.api.auth, {}, function(auth){ var from = translate.service.edge.language.getMap()[data.from]; var to = translate.service.edge.language.getMap()[data.to]; @@ -4462,10 +4713,7 @@ var translate = { } func(d); - }, 'post', true, {'Authorization':'Bearer '+auth, 'Content-Type':'application/json'}, function(xhr){ - console.log('---------error--------'); - console.log('edge translate service error, http code : '+xhr.status + ', response text : '+xhr.responseText); - }, true); + }, 'post', true, {'Authorization':'Bearer '+auth, 'Content-Type':'application/json'}, abnormalFunc, true); } @@ -4762,8 +5010,9 @@ var translate = { * } * * @param func 请求完成的回调,传入如 function(data){ console.log(data); } + * @param abnormalFunc 响应异常所执行的方法,响应码不是200就会执行这个方法 ,传入如 function(xhr){} 另外这里的 xhr 会额外有个参数 xhr.requestURL 返回当前请求失败的url */ - post:function(path, data, func){ + post:function(path, data, func, abnormalFunc){ var headers = { 'content-type':'application/x-www-form-urlencoded', }; @@ -4779,7 +5028,7 @@ var translate = { //if(url.indexOf('edge') > -1 && path == translate.request.api.translate){ if(translate.service.name == 'client.edge'){ if(path == translate.request.api.translate){ - translate.service.edge.translate(path, data, func); + translate.service.edge.translate(path, data, func, abnormalFunc); return; } if(path == translate.request.api.language){ @@ -4795,7 +5044,7 @@ var translate = { } // ------- edge end -------- - this.send(path, data, func, 'post', true, headers, null, true); + this.send(path, data, func, 'post', true, headers, abnormalFunc, true); }, /** * 发送请求 @@ -4815,16 +5064,21 @@ var translate = { if(data == null || typeof(data) == 'undefined'){ data = {}; } - //加入浏览器默认语种 v3.6.1 增加,以便更好的进行自动切换语种 - data.browserDefaultLanguage = translate.util.browserDefaultLanguage(); - if(typeof(translate.enterprise.key) != 'undefined' && typeof(translate.enterprise.key) == 'string' && translate.enterprise.key.length > 0){ - data.key = translate.enterprise.key; - } - + if(typeof(data) == 'string'){ params = data; //payload 方式 }else{ //表单提交方式 + + //加入浏览器默认语种 v3.6.1 增加,以便更好的进行自动切换语种 + data.browserDefaultLanguage = translate.util.browserDefaultLanguage(); + + //加入key + if(typeof(translate.enterprise.key) != 'undefined' && typeof(translate.enterprise.key) == 'string' && translate.enterprise.key.length > 0){ + data.key = translate.enterprise.key; + } + + //组合参数 for(var index in data){ if(params.length > 0){ params = params + '&'; @@ -4955,7 +5209,7 @@ var translate = { if(typeof(obj) == 'string'){ //案例一的场景,传入单个字符串 - texts[0] = [obj]; + texts[0] = obj; }else{ //不是字符串了,而是对象了,判断是案例二还是案例三 @@ -5009,7 +5263,7 @@ var translate = { } func(data); - }); + }, null); }, listener:{ minIntervalTime:800, // 两次触发的最小间隔时间,单位是毫秒,这里默认是800毫秒。最小填写时间为 200毫秒 @@ -5360,7 +5614,7 @@ var translate = { curTooltipEle.style.top =selectionY+20+"px"; curTooltipEle.style.left = selectionX+50+"px" ; curTooltipEle.style.display = ""; - }); + }, null); }, start:function () { //新建一个tooltip元素节点用于显示翻译 @@ -5531,6 +5785,22 @@ var nodeuuid = { } return uuid; }, + /* + 开启远程调试能力,当你使用中遇到问题,需要向开源作者求助时,可以在你项目中主动调用这个方法,也就是 translate.enableRemoteDebug(); 即可启动远程调试能力 + 开源项目作者就可以对你当前出错的页面进行远程调试排查问题所在。当然前提是你的页面要保持别关闭。 + + 这个能力是通过开源项目 https://github.com/HuolalaTech/page-spy-web 来实现的 + + */ + enableRemoteDebug:function(){ + + /* + + 待同事实现 + */ + + } + } console.log('------ translate.js ------\nTwo lines of js html automatic translation, page without change, no language configuration file, no API Key, SEO friendly! Open warehouse : https://github.com/xnx3/translate \n两行js实现html全自动翻译。 无需改动页面、无语言配置文件、无API Key、对SEO友好!完全开源,代码仓库:https://gitee.com/mail_osc/translate'); diff --git a/jshERP-web/src/App.vue b/jshERP-web/src/App.vue index 586d9a214..52b22f8a5 100644 --- a/jshERP-web/src/App.vue +++ b/jshERP-web/src/App.vue @@ -33,10 +33,6 @@ that.$store.dispatch('setSidebar', true) } }) - //翻译自定义 - translate.nomenclature.append('chinese_simplified','english',` - 管伊佳ERP=GuanYiJia - `) } } diff --git a/jshERP-web/src/components/setting/SettingDrawer.vue b/jshERP-web/src/components/setting/SettingDrawer.vue index d2d58228a..c140d5196 100644 --- a/jshERP-web/src/components/setting/SettingDrawer.vue +++ b/jshERP-web/src/components/setting/SettingDrawer.vue @@ -89,79 +89,79 @@
{{langSetTitle}}
- 简体中文 - 繁體中文 - English - 한국어 - しろうと - Tiếng Việt - हिन्दी - Русский язык - Français - УкраїнськаName - Norge - color name - nederlands - Pilipino - ກະຣຸນາ - తెలుగుQFontDatabase - Română - नेपालीName - Kreyòl ayisyen - český - Svenska - Malagasy - ဗာရမ် - پښتوName - คนไทย - Արմենյան - Persian - Kurdî - Türkçe - български - Malay - Kiswahili - ଓଡିଆ - ÍslandName - Íris - ខ្មែរKCharselect unicode block name - ગુજરાતી - Slovenská - ಕನ್ನಡ್Name - היברית - magyar - मराठीName - தாமில் - eesti keel - മലമാലം - ᐃᓄᒃᑎᑐᑦ - بالعربية - Deutsch - slovenščina - বেঙ্গালী - اوردو - azerbaijani - português - lifiava - afrikaans - 汤加语 - ελληνικά - IndonesiaName - Español - dansk - amharic - ਪੰਜਾਬੀName - albanian - Lietuva - italiano - Malti - suomi - català - hrvatski - bosnian - Polski - latviešu - Maori + 简体中文 + 繁體中文 + English + 한국어 + しろうと + Tiếng Việt + हिन्दी + Русский язык + Français + УкраїнськаName + Norge + color name + nederlands + Pilipino + ກະຣຸນາ + తెలుగుQFontDatabase + Română + नेपालीName + Kreyòl ayisyen + český + Svenska + Malagasy + ဗာရမ် + پښتوName + คนไทย + Արմենյան + Persian + Kurdî + Türkçe + български + Malay + Kiswahili + ଓଡିଆ + ÍslandName + Íris + ខ្មែរKCharselect unicode block name + ગુજરાતી + Slovenská + ಕನ್ನಡ್Name + היברית + magyar + मराठीName + தாமில் + eesti keel + മലമാലം + ᐃᓄᒃᑎᑐᑦ + بالعربية + Deutsch + slovenščina + বেঙ্গালী + اوردو + azerbaijani + português + lifiava + afrikaans + 汤加语 + ελληνικά + IndonesiaName + Español + dansk + amharic + ਪੰਜਾਬੀName + albanian + Lietuva + italiano + Malti + suomi + català + hrvatski + bosnian + Polski + latviešu + Maori