🏠 Home 

TesterTV_Translit (Beta)

A quick way to converting text from one writing system to another. In this case english to russian.


Install this script?
// ==UserScript==
// @name         TesterTV_Translit (Beta)
// @namespace    https://greasyfork.org/ru/scripts/479202-testertv-translit-beta
// @version      2023.11.06
// @license      GNU GPLv3 or later
// @description  A quick way to converting text from one writing system to another. In this case english to russian.
// @author       TesterTV
// @match        *://*/*
// @grant        GM_setClipboard
// ==/UserScript==
// Check if the current page is embedded
var isEmbedded = window.self !== window.top;
// If not embedded than...
if (!isEmbedded) {
//********************************************************************************************************************
//***                                              Main Button 🇹                                                  ***
//********************************************************************************************************************
// Create a new button element
const TranslitButton = document.createElement('button');
// Set the CSS styles for positioning the button
TranslitButton.style.position = 'fixed';
TranslitButton.style.top = '60px';
TranslitButton.style.right = '10px';
TranslitButton.style.zIndex = '9999';
TranslitButton.innerText = '🇹';
TranslitButton.style.position = 'fixed';
TranslitButton.style.background = 'none';
TranslitButton.style.border = 'none';
// Append the button to the document body
document.body.appendChild(TranslitButton);
//********************************************************************************************************************
//***                                              Main Textarea 📝                                               ***
//********************************************************************************************************************
// Create a new textarea element
const TranslitTextarea = document.createElement('textarea');
// Set the CSS styles for positioning the textarea
TranslitTextarea.style.position = 'fixed';
TranslitTextarea.style.top = '66px';
TranslitTextarea.style.right = '36px';
TranslitTextarea.style.width = '400px';
TranslitTextarea.style.height = '400px';
TranslitTextarea.style.zIndex = '9999';
TranslitTextarea.placeholder = 'Enter text here...';
TranslitTextarea.style.background = '#303236';
TranslitTextarea.style.border = '1px solid grey';
TranslitTextarea.style.color = 'white';
TranslitTextarea.style.fontSize = '16px';
TranslitTextarea.style.fontFamily = 'Arial, Helvetica, sans-serif';
TranslitTextarea.style.display = 'none';
TranslitTextarea.style.outline = 'none';
// Append the textarea to the document body
document.body.appendChild(TranslitTextarea);
//********************************************************************************************************************
//***                                    Field for number of letters 🔠                                           ***
//********************************************************************************************************************
// Create an extra field to display the number of letters
const LettersNumberField = document.createElement('div');
LettersNumberField.style.position = 'fixed';
LettersNumberField.style.top = '476px';
LettersNumberField.style.right = '36px';
LettersNumberField.style.color = 'grey';
LettersNumberField.style.textShadow = '2px 2px 4px rgba(0, 0, 0, 0.5)';
LettersNumberField.style.zIndex = '9999';
LettersNumberField.innerText = 'length: 0'
LettersNumberField.style.display = 'none';
// Append the extra field to the document body
document.body.appendChild(LettersNumberField);
// Update number of letters in field
TranslitTextarea.addEventListener('input', function() {
// Update the extra field with the height value
LettersNumberField.innerText = "length: " + TranslitTextarea.value.length;
if (LettersNumberField.innerText === 'length: 0') {LettersNumberField.innerText = "";}
});
//********************************************************************************************************************
//***                                   Main Textarea - Listener event 📝👂                                       ***
//********************************************************************************************************************
// Add click event listener to the button
TranslitButton.addEventListener('mouseover', function() {
// Toggle the visibility of the textarea
LettersNumberField.style.display = 'block';
TranslitTextarea.style.display = 'block';
TranslitTextarea.focus();
});
// Add event listener to hide textarea and copy text to clipboard when clicking on the webpage
document.addEventListener('click', () => {
// Check if the textarea is visible
if (TranslitTextarea.style.display !== 'none') {
// Copying the text, if it exists, to the clipboard
if (TranslitTextarea.value !== '') {
try {GM_setClipboard(TranslitTextarea.value);} catch (error) {}
try {navigator.clipboard.writeText(TranslitTextarea.value);} catch (error) {}
}
// Clear and close textarea
TranslitTextarea.value = '';
LettersNumberField.innerText = "length: " + TranslitTextarea.value.length
TranslitTextarea.style.display = 'none';
LettersNumberField.style.display = 'none';
}
});
// Add event listeners to prevent action when clicking on tabs, buttons,...
TranslitTextarea.addEventListener('click', (e) => {
e.stopPropagation(); // Stop event propagation
});
//********************************************************************************************************************
//***                                        Arrays for transliteration 📚                                        ***
//********************************************************************************************************************
const array1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
const array2 = ['а', 'б', 'ц', 'д', 'е', 'ф', 'г', 'х', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'я', 'р', 'с', 'т', 'у', 'в', 'щ', 'х', 'ы', 'з', 'А', 'Б', 'Ц', 'Д', 'Е', 'Ф', 'Г', 'Х', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Я', 'Р', 'С', 'Т', 'У', 'В', 'Щ', 'Х', 'Ы', 'З'];
// Create a lookup table object for faster symbol lookup
const lookupTable = {};
for (let i = 0; i < array1.length; i++) {
lookupTable[array1[i]] = array2[i];
}
//********************************************************************************************************************
//***                                              Functionality ⚙️                                               ***
//********************************************************************************************************************
// Listen for input event on the textarea
TranslitTextarea.addEventListener('input', function() {
// Get the current value of the textarea
const value = TranslitTextarea.value;
// Replace all occurrences of symbols using the lookup table
TranslitTextarea.value = value.replaceAll(/[a-zA-Z]/g, (match) => lookupTable[match]);
TranslitTextarea.value = TranslitTextarea.value.replace("йо", "ё").replace("ЙО", "Ё").replace("Йо", "Ё").replace("йО", "Ё");
TranslitTextarea.value = TranslitTextarea.value.replace("ыо", "ё").replace("ЫО", "Ё").replace("Ыо", "Ё").replace("ЫО", "Ё");
TranslitTextarea.value = TranslitTextarea.value.replace("ö", "ё").replace("Ö", "Ё");
TranslitTextarea.value = TranslitTextarea.value.replace("зх", "ж").replace("ЗХ", "Ж").replace("Зх", "Ж").replace("зХ", "Ж");
TranslitTextarea.value = TranslitTextarea.value.replace("цх", "ч").replace("ЦХ", "Ч").replace("Цх", "Ч").replace("цХ", "Ч");
TranslitTextarea.value = TranslitTextarea.value.replace("сх", "ш").replace("СХ", "Ш").replace("Сх", "Ш").replace("сХ", "Ш");
TranslitTextarea.value = TranslitTextarea.value.replace("шх", "щ").replace("ШХ", "Щ").replace("Шх", "Щ").replace("шХ", "Щ");
TranslitTextarea.value = TranslitTextarea.value.replace("#", "ъ").replace("##", "Ъ");
TranslitTextarea.value = TranslitTextarea.value.replace("твз", "ъ").replace("ТВЗ", "Ъ").replace("ТВз", "Ъ").replace("ТвЗ", "Ъ").replace("Твз", "Ъ").replace("тВЗ", "Ъ").replace("тВз", "Ъ").replace("твЗ", "Ъ");
TranslitTextarea.value = TranslitTextarea.value.replace("'", "ь").replace("''", "Ь");
TranslitTextarea.value = TranslitTextarea.value.replace("мйз", "ь").replace("МЙЗ", "Ь").replace("МЙз", "Ь").replace("МйЗ", "Ь").replace("Мйз", "Ь").replace("мЙЗ", "Ь").replace("мЙз", "Ь").replace("мйЗ", "Ь");
TranslitTextarea.value = TranslitTextarea.value.replace("йе", "э").replace("ЙЕ", "Э").replace("Йе", "Э").replace("йЕ", "Э");
TranslitTextarea.value = TranslitTextarea.value.replace("ä", "э").replace("Ä", "Э");
TranslitTextarea.value = TranslitTextarea.value.replace("йу", "ю").replace("ЙУ", "Ю").replace("Йу", "Ю").replace("йУ", "Ю");
TranslitTextarea.value = TranslitTextarea.value.replace("ыу", "ю").replace("ЫУ", "Ю").replace("Ыу", "Ю").replace("ыУ", "Ю");
TranslitTextarea.value = TranslitTextarea.value.replace("ü", "ю").replace("Ü", "Ю");
TranslitTextarea.value = TranslitTextarea.value.replace("йа", "я").replace("ЙА", "Я").replace("Йа", "Я").replace("йА", "Я");
TranslitTextarea.value = TranslitTextarea.value.replace("ыа", "я").replace("ЫА", "Я").replace("Ыа", "Я").replace("ыА", "Я");
TranslitTextarea.value = TranslitTextarea.value.replace("č", "ч").replace("Č", "Ч");
TranslitTextarea.value = TranslitTextarea.value.replace("ž", "ж").replace("Ž", "Ж");
TranslitTextarea.value = TranslitTextarea.value.replace("š", "ш").replace("Š", "Ш");
TranslitTextarea.value = TranslitTextarea.value.replace("шод", "сход");
});
}