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