Vkontakte chat translator

Automatic translation of incoming and outgoing messages on the site VKontakte. Translation service - Google Translate.

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @id             vk.com-7af28330-d5e1-4496-806c-38a99cf0e28d@scriptish
// @name           Vkontakte chat translator
// @version        1.0
// @namespace      http://userscripts.org/users/Kilowatt
// @author         Kilowatt
// @description    Automatic translation of incoming and outgoing messages on the site VKontakte. Translation service - 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
// ==/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 = '<select id="GoogleTranslateSelect" style="background: transparent;">'+
	'<option value="af">Afrikaans</option>'+
	'<option value="sq">Albanian</option>'+
	'<option value="ar">Arabic</option>'+
	'<option value="az">Azerbaijani</option>'+
	'<option value="eu">Basque</option>'+
	'<option value="bn">Bengali</option>'+
	'<option value="be">Belarusian</option>'+
	'<option value="bg">Bulgarian</option>'+
	'<option value="ca">Catalan</option>'+
	'<option value="zh-CN">Simpl. Chinese</option>'+
	'<option value="zh-TW">Trad. Chinese</option>'+
	'<option value="hr">Croatian</option>'+
	'<option value="cs">Czech</option>'+
	'<option value="da">Danish</option>'+
	'<option value="nl">Dutch</option>'+
	'<option value="en" selected>English</option>'+
	'<option value="eo">Esperanto</option>'+
	'<option value="et">Estonian</option>'+
	'<option value="tl">Filipino</option>'+
	'<option value="fi">Finnish</option>'+
	'<option value="fr">French</option>'+
	'<option value="gl">Galician</option>'+
	'<option value="ka">Georgian</option>'+
	'<option value="de">German</option>'+
	'<option value="el">Greek</option>'+
	'<option value="gu">Gujarati</option>'+
	'<option value="ht">Сreole Haitian</option>'+
	'<option value="iw">Hebrew</option>'+
	'<option value="hi">Hindi</option>'+
	'<option value="hu">Hungarian</option>'+
	'<option value="is">Icelandic</option>'+
	'<option value="id">Indonesian</option>'+
	'<option value="ga">Irish</option>'+
	'<option value="it">Italian</option>'+
	'<option value="ja">Japanese</option>'+
	'<option value="kn">Kannada</option>'+
	'<option value="ko">Korean</option>'+
	'<option value="la">Latin</option>'+
	'<option value="lv">Latvian</option>'+
	'<option value="lt">Lithuanian</option>'+
	'<option value="mk">Macedonian</option>'+
	'<option value="ms">Malay</option>'+
	'<option value="mt">Maltese</option>'+
	'<option value="no">Norwegian</option>'+
	'<option value="fa">Persian</option>'+
	'<option value="pl">Polish</option>'+
	'<option value="pt">Portuguese</option>'+
	'<option value="ro">Romanian</option>'+
	'<option value="ru">Russian</option>'+
	'<option value="sr">Serbian</option>'+
	'<option value="sk">Slovak</option>'+
	'<option value="sl">Slovenian</option>'+
	'<option value="es">Spanish</option>'+
	'<option value="sw">Swahili</option>'+
	'<option value="sv">Swedish</option>'+
	'<option value="ta">Tamil</option>'+
	'<option value="te">Telugu</option>'+
	'<option value="th">Thai</option>'+
	'<option value="tr">Turkish</option>'+
	'<option value="uk">Ukrainian</option>'+
	'<option value="ur">Urdu</option>'+
	'<option value="vi">Vietnamese</option>'+
	'<option value="cy">Welsh</option>'+
	'<option value="yi">Yiddish</option>'+
'</select><br/>'+
'<input type="checkbox" id="GoogleTranslateCheckbox">Translate</input>';

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]];