Advertisement
Paranoich

Google translate

Nov 16th, 2015
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.10 KB | None | 0 0
  1. /*Initialization Code*/
  2.  
  3. var btn = this;
  4.  
  5. btn.lastClick = {
  6. X: 0,
  7. Y: 0
  8. };
  9. addEventListener("mouseup", function(e) {
  10. if (e && e.button == 0 && e.view.top == content) {
  11. var lc = btn.lastClick;
  12. lc.X = e.clientX;
  13. lc.Y = e.clientY;
  14. }
  15. }, false);
  16.  
  17. var safeHTMLParser = function(code) {
  18. var gUnescapeHTML = Cc["@mozilla.org/feed-unescapehtml;1"].getService(Ci.nsIScriptableUnescapeHTML);
  19. var doc = document.implementation.createDocument(xhtmlns, "html", null);
  20. var body = document.createElementNS(xhtmlns, "body");
  21. doc.documentElement.appendChild(body);
  22. body.appendChild(gUnescapeHTML.parseFragment(code, false, null, body));
  23. return doc;
  24. };
  25.  
  26. var createWindow = function(text, status, title, id, pos, size){
  27. var win = document.commandDispatcher.focusedWindow.top == content ? document.commandDispatcher.focusedWindow : content;
  28. var doc = win.document, wId = 'ujs_window'+(id || ''), w = doc.getElementById(wId);
  29. var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()};
  30. if(w)w.closeWin();
  31. w = doc.createElement('div');
  32. w.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:3px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof w.style.borderRadius === 'string' ? 'background-color:#f3f5f7;padding-top:4px;border-radius:4px;box-shadow:0 0 12px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");'));
  33. w.id = wId;
  34. w.closeWin = function(){
  35. doc.removeEventListener('keydown', keyDown, false);
  36. this.parentNode.removeChild(this);
  37. };
  38. w.addEle = function(str, style){
  39. var ele = doc.createElement('div');
  40. ele.setAttribute('style', style);
  41. if(str){
  42. ele.innerHTML = str;
  43. for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
  44. el = all[i];
  45. if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
  46. el.parentNode.removeChild(el);
  47. }else{
  48. for(var att = el.attributes, j = att.length; j--;){
  49. if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
  50. }
  51. }
  52. }
  53. };
  54. return this.appendChild(ele);
  55. };
  56. var img = doc.createElement('div');
  57. img.setAttribute('style', 'display:block;float:right;width:18px;height:18px;padding:0;margin:0;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=");background:-o-skin("Caption Close Button Skin");');
  58. img.title = (win.navigator.language.indexOf('ru') == 0) ? '\u0417\u0430\u043A\u0440\u044B\u0442\u044C' : 'Close';
  59. img.addEventListener('click', function(){this.parentNode.closeWin()}, false);
  60. w.appendChild(img);
  61. w.addEle(title, 'display:table;color:#000;font:16px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
  62. var cnt = w.addEle(text, 'display:block;border:1px solid #aaa;margin:2px 0 1px 0;padding:4px;background-color:#fafcfe;color:#000;font:14px Times New Roman;width:240px;height:120px;overflow:auto;cursor:text;');
  63. w.addEle(status, 'display:table;color:#555;font:10px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
  64. w.addEventListener('mousedown', function(e){
  65. if(e.target == w){
  66. e.preventDefault();
  67. var grabX = e.clientX, grabY = e.clientY, origX = parseInt(w.style.left), origY = parseInt(w.style.top);
  68. var mouseMove = function(ev){
  69. w.style.left = origX+ev.clientX-grabX+'px';
  70. w.style.top = origY+ev.clientY-grabY+'px';
  71. };
  72. doc.addEventListener('mousemove', mouseMove, false);
  73. doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false);
  74. }
  75. }, false);
  76. doc.documentElement.appendChild(w);
  77.  
  78. if(size){
  79. cnt.style.height = size.height;
  80. cnt.style.width = size.width;
  81. }else{
  82. for(var i = 3; i < 10; i++){
  83. if(cnt.scrollHeight > cnt.offsetHeight || cnt.scrollWidth > cnt.offsetWidth){
  84. cnt.style.height = 50*i+'px';
  85. cnt.style.width = 100*i+'px';
  86. }else break;
  87. }
  88. };
  89. var docEle = doc.compatMode == 'CSS1Compat' ? doc.documentElement : doc.body;
  90. var mX = docEle.clientWidth-w.offsetWidth, mY = docEle.clientHeight-w.offsetHeight;
  91. if(mX < 0){cnt.style.width = parseInt(cnt.style.width)+mX+'px'; mX = 0};
  92. if(mY < 0){cnt.style.height = parseInt(cnt.style.height)+mY+'px'; mY =0};
  93. var hW = parseInt(w.offsetWidth/2);
  94. w.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
  95. w.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
  96. w.style.visibility = 'visible';
  97. doc.addEventListener('keydown', keyDown, false);
  98. };
  99.  
  100. var getSel = function (w) {
  101. var s, d = w.document;
  102. if (d.selection) {
  103. var r = d.selection.createRange();
  104. s = r ? r.text : ''
  105. } else {
  106. s = d.getSelection().toString();
  107. if (!s) {
  108. var e, t = d.getElementsByTagName('textarea'), u = d.getElementsByTagName('input'), i = t.length;
  109. while(e = (i > 0) ? t[--i] : u[-i--])try{
  110. if (e.offsetHeight > 0 && (s = e.value.substring(e.selectionStart, e.selectionEnd))) break
  111. }catch(x){}
  112. }
  113. };
  114. if (!s) for (var j = 0, f; f = w.frames[j]; j++) {
  115. try {
  116. if (s = getSel(f)) break
  117. } catch(x) {}
  118. };
  119. return s
  120. };
  121.  
  122. var ujs_google_translate = function (dir){
  123. var win = content, lng = win.navigator.language.slice(0, 2), txt = getSel(win);
  124. if (txt) {
  125. var xhr = new XMLHttpRequest();
  126. var encTxt = 'text=' + encodeURIComponent(txt), post = encTxt.length > 1024, l = dir.split('|');
  127. var url = 'http://translate.google.com/?' + (post ? '' : encTxt + '&') + 'sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&ujs=gtt';
  128.  
  129. xhr.open(post ? 'POST' : 'GET', url, true);
  130. if(post)xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  131. xhr.onreadystatechange = function() {
  132. try{
  133. if (xhr.readyState == 4 && xhr.status == 200) {
  134. var result = '', status = '', tmp = safeHTMLParser(xhr.responseText);
  135. var r = tmp.querySelector('#result_box');
  136. if (r) {
  137. var p = r.getElementsByTagName('span');
  138. for(var i = 0, n; n = p[i]; i++){
  139. n.setAttribute('style', 'background-color:inherit;color:inherit;font-size:inherit;font-family:serif;');
  140. };
  141. result = r.innerHTML;
  142. };
  143. var sl = tmp.querySelector('#nc_sl'), dl = tmp.querySelector('#nc_dl'), tl = tmp.querySelector('#nc_tl');
  144. if(sl && dl && tl){
  145. status = ((dl.value || sl.value)+' -\u203A '+tl.value).toUpperCase();
  146. };
  147. createWindow(result, status, '<a href="'+url.replace(/&/g,'&amp;')+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt', btn.lastClick);
  148. }
  149. } catch (x){};
  150. };
  151. xhr.send(post ? encTxt : null);
  152. } else {
  153. win.open('http://translate.google.com/translate?u='+escape(win.location.href)+'&hl='+lng+'&langpair='+dir+'&tbb=1');
  154. };
  155. };
  156.  
  157.  
  158. btn.onclick = function(e){if(e.button == 0)ujs_google_translate('auto|ru')};
  159.  
  160. var contextMenu = document.getElementById("contentAreaContextMenu");
  161. var nextEleMenu = document.getElementById("context-inspect");
  162.  
  163. var menuId = "context-ext-google-translate";
  164. var menuItem = document.getElementById(menuId);
  165. if (menuItem) {
  166. contextMenu.removeChild(menuItem.nextElementSibling);
  167. contextMenu.removeChild(menuItem.nextElementSibling);
  168. contextMenu.removeChild(menuItem);
  169. };
  170.  
  171. menuItem = document.createElement("menuitem");
  172. menuItem.setAttribute("id", menuId);
  173. menuItem.setAttribute("label", "Перевести на русский");
  174. menuItem.setAttribute("class", "menuitem-iconic");
  175. menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAABBUlEQVR4Ac2RMU4DMRREB2MqihQpAkUaqnAduuQw4Sx03CGcJYIiDYqQ0lCsZ77535ZFcgAkRuPvV7zd/dLiz3N1PFb8hmRckrfELZrF9ONQ1B6Yz0MyM7S0O6zGkVprh/3+Kw/JzkHSpRpJKZkpr9fYbOx0cjVsCbWG31oHBM9mtt0q73ZcrdLhAMlYQKkUI22aqsNo8HKZAMQhvVaKSHWj2Q2aPU3mJQFY7nuHyvYFduP83WF3AJRfcPNYnr/Lp1G1uK4m9sno1LaUbnX/htf8BNzoneUD5NhjvLCMhURQSQ93QCZwXYjFwg3I0NZKrvoknQPMIHkt/jRAQKMeG2yX89/mB4EJbKbZxIhFAAAAAElFTkSuQmCC");
  176. menuItem.addEventListener("command", function(){ujs_google_translate('auto|ru')}, false);
  177. contextMenu.insertBefore(menuItem, nextEleMenu);
  178.  
  179. menuItem = document.createElement("menuitem");
  180. menuItem.setAttribute("label", "Перевести на английский");
  181. menuItem.setAttribute("class", "menuitem-iconic");
  182. menuItem.setAttribute("image", "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAABnRSTlMAAAAAAABupgeRAAAB5UlEQVR4AWOgPZg0c9+Oq2+qpx9LaQaiw4mNB27efbs2uXFNQh2Q4Zm9zSNth23MhqjGnXMC86vnHmUS4udxv7OvOd2yPE7PTlfCTk9GVVEoyJA7WI8dyPA0k3U1l+jJMV7CeThpTZeoKDdDUsvBPSff/V+6/P/Bvf///2+bdvU/EKRm/k9IBNIlfZe+LFrzvbsbyJ636pKkyQyQhoUb7tZNvPpw3/0/TfX/ISAm5n94BIiRm/n/xYsLd946ei4vajoiqDuRAejQf//+o4PQ0P9+fmhiQGVnrr1kXJNYG2zEzXDxDsPv3wy/fkFJoOTPn39+/fr/69e/37//AUX+/mXRkO458wWHDba2f8wswCyQ3N+/f//8/fP7z5+TV18w2Mdt6plzPiptx5Wr7/+/ffMzOR6kysjkt74hWMPfp06O+2dulZCeFZKwnkE4m8E8bN3i9aCQ+dxY96GrK6bkGJD9R1v3l6Y20NVW9kt+/v//ZdbcFwkxTVPPMQimM8XEqkb7a/zoqLxkH9v4zVyI5+///wyMmtKMmhJAnbLqQjHxaw5r2orOmZN5uj470Zahat6BKS7JzpmLBHXm8GhM5lCdcP7ai1ZpixZxk9NXXjKIFzOIFjAI54oY1vXuue5qmscw+AAAW0tKxtPoicEAAAAASUVORK5CYII=");
  183. menuItem.addEventListener("command", function(){ujs_google_translate('auto|en')}, false);
  184. contextMenu.insertBefore(menuItem, nextEleMenu);
  185.  
  186. contextMenu.insertBefore(document.createElement("menuseparator"), nextEleMenu);
  187.  
  188. addEventListener('keydown', function (e){
  189. if(e.shiftKey && !e.ctrlKey && e.altKey && e.keyCode == 84)ujs_google_translate('auto|ru');
  190. }, false);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement