// ==UserScript== // @id vk.com-7af28330-d5e1-4496-806c-38a99cf0e28d@scriptish // @name Vkontakte chat translator // @version 1.20140226170245 // @namespace https://greasyfork.org/scripts/66 // @author Kilowatt // @description Автоматический перевод входящих и исходящих сообщений на сайте ВКонтакте в разделе "Диалоги". Сервис перевода - Google Translate. // @grant GM_xmlhttpRequest // @include https://vk.com/im* // @include https://vk.com/al_im* // @include http://vk.com/im* // @include http://vk.com/al_im* // @match https://vk.com/im* // @match https://vk.com/al_im* // @match http://vk.com/im* // @match http://vk.com/al_im* // @run-at document-end // @updateURL https://greasyfork.org/scripts/66/code.meta.js // @downloadURL none // ==/UserScript== var MyLang; function translateText(phrase, callback, reverse) { document.getElementById('GoogleTranslateSelect').style.background = "url(https://vk.com/images/upload.gif)"; GM_xmlhttpRequest( { method: 'GET', url: (reverse ? "http://translate.google.ru/translate_a/t?client=t&sl=auto&tl="+MyLang+"&q=" + phrase : "http://translate.google.ru/translate_a/t?client=t&sl="+MyLang+"&tl="+document.getElementById('GoogleTranslateSelect').value+"&q="+phrase ), onload: (function() { var _callback = callback; return function(data) { document.getElementById('GoogleTranslateSelect').style.background = "transparent"; var response = JSON.parse(data.responseText.replace(/(,)+/g,",").replace(/\[,/g,"[")); var translationArray = response[0]; var translationText = ""; for (var i in translationArray) translationText += translationArray[i][0]; //console.log(translationText); _callback(translationText); } })(), onerror: function(e) { console.log(e); } } ); } function TranslateHandler() { if (document.getElementById('GoogleTranslateCheckbox').checked) translateText(unsafeWindow.Emoji.editableVal(unsafeWindow.IM.getTxt()), function(response) { unsafeWindow.IM.getTxt().innerHTML = response; // TODO: превратить все unicode-смайлики в HTML unsafeWindow.IM.send(); }); else unsafeWindow.IM.send(); } // вешаем переводчика на ентер в поле ввода unsafeWindow.removeEvent(unsafeWindow.IM.getTxt(), 'keydown'); unsafeWindow.IM.getTxt().addEventListener("keydown", function(ev){ if (ev.keyCode == 10 || ev.keyCode == 13 && !(ev.ctrlKey || ev.metaKey && browser.mac)) { TranslateHandler(); } }); // вешаем переводчика на кнопку "отправить" document.getElementById('im_send').onclick = function(){ TranslateHandler(); }; // Обработчик входящего сообщения unsafeWindow.IM.getTable(unsafeWindow.cur.peer).addEventListener('DOMNodeInserted', function(e){ if (document.getElementById('GoogleTranslateCheckbox').checked && e.relatedNode.tagName == "TR" && e.relatedNode.className.indexOf('im_in')>-1) { var msg_text = e.relatedNode.getElementsByClassName('im_msg_text')[0]; if (msg_text != undefined) translateText(msg_text.textContent, function(response){ msg_text.textContent = response; }, true); } }); // Построение панельки переводчика (внизу справа) var GoogleTranslateDiv = document.createElement('div'); GoogleTranslateDiv.style.position = "fixed"; GoogleTranslateDiv.style.bottom = 0; GoogleTranslateDiv.style.right = 0; GoogleTranslateDiv.style.background = "white"; GoogleTranslateDiv.style.border = "1px solid blue"; GoogleTranslateDiv.innerHTML = '
'+ 'Translate'; document.body.appendChild(GoogleTranslateDiv); // определение моего языка (MyLang) var VkLanguages = []; VkLanguages[3] = 'en'; VkLanguages[0] = 'ru'; VkLanguages[1] = 'uk'; VkLanguages[4] = 'es'; VkLanguages[12] = 'pt'; VkLanguages[73] = 'pt'; VkLanguages[6] = 'de'; VkLanguages[16] = 'fr'; VkLanguages[7] = 'it'; VkLanguages[61] = 'nl'; VkLanguages[57] = 'az'; VkLanguages[18] = 'zh-CN'; VkLanguages[80] = 'Монгол'; //??? VkLanguages[15] = 'pl'; VkLanguages[10] = 'Magyar'; //??? VkLanguages[64] = 'da'; VkLanguages[60] = 'sv'; VkLanguages[55] = 'no'; VkLanguages[53] = 'sl'; VkLanguages[71] = 'sk'; VkLanguages[9] = 'hr'; VkLanguages[11] = 'sr'; VkLanguages[72] = 'Bosanski'; VkLanguages[8] = 'bg'; VkLanguages[5] = 'Suomi'; VkLanguages[22] = 'Eesti'; VkLanguages[56] = 'lv'; VkLanguages[19] = 'lt'; VkLanguages[14] = 'el'; VkLanguages[59] = 'Shqip'; VkLanguages[54] = 'ro'; VkLanguages[21] = 'cs'; VkLanguages[17] = '한국어'; VkLanguages[20] = '日本語'; VkLanguages[98] = 'العربية'; VkLanguages[74] = 'فارسی'; VkLanguages[85] = 'اردو'; VkLanguages[90] = 'پنجابی'; VkLanguages[76] = 'हिन्दी'; VkLanguages[83] = 'नेपाली'; VkLanguages[78] = 'বাংলা'; VkLanguages[94] = 'ಕನ್ನಡ'; VkLanguages[77] = 'සිංහල'; VkLanguages[69] = 'id'; VkLanguages[79] = 'te'; VkLanguages[68] = 'ภาษาไทย'; VkLanguages[119] = '臺灣話'; VkLanguages[81] = 'ဗမာစာ'; VkLanguages[75] = 'Tiếng Việt'; VkLanguages[99] = 'עברית'; VkLanguages[95] = 'Kiswahili'; VkLanguages[97] = 'ru'; VkLanguages[87] = 'ru'; VkLanguages[66] = 'Moldovenească'; VkLanguages[114] = 'be'; VkLanguages[2] = 'be'; VkLanguages[82] = 'tr'; VkLanguages[63] = 'ქართული'; VkLanguages[58] = 'Հայերեն'; VkLanguages[65] = 'O‘zbek'; VkLanguages[62] = 'Türkmen'; VkLanguages[70] = 'Тоҷикӣ'; VkLanguages[50] = 'ru'; VkLanguages[91] = 'Ирон'; VkLanguages[102] = 'ru'; VkLanguages[101] = 'ru'; VkLanguages[107] = 'ru'; VkLanguages[108] = 'ru'; VkLanguages[110] = 'ГIалгIай мотт'; VkLanguages[52] = 'ru'; VkLanguages[344] = 'ru'; VkLanguages[555] = 'eo'; for (i in unsafeWindow.StaticFiles) if (i.indexOf('lang')==0) MyLang = VkLanguages[i.split('_')[0].split('lang')[1]];