Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
//Транслитерация выделенного текста из латиницы в кириллицу.
//Часть кода позаимствована из http://ru.wikipedia.org/wiki/MediaWiki:Wikificator.js
//Часть кода позаимствована X-romix
//Автор: Khanson

var Khanson_Translit_CantWork = 'Translit cannot work in your browser'
var Khanson_Translit_FullText = 'Эта кнопка предназначена для транслитерации текста. Выберите фрагмент текста. Заглавные символы Ь и Ъ кодируются ~ и ~~ соответственно, подсказка по остальным символам будет выведена внизу окна.';
 
//Добавляет кнопку
function addTranslitButton(){
	var toolbar = document.getElementById('toolbar')
	var textbox = document.getElementById('wpTextbox1')
	if (!textbox || !toolbar) return
	var i = document.createElement('img')
	i.src = 'http://upload.wikimedia.org/wikipedia/ru/8/85/Button-translit-ru-en.png'
	i.alt = i.title = 'To latin'
	i.onclick = Khanson_Translit
	i.style.cursor = 'pointer'
	toolbar.appendChild(i)
 
} 
 
//Этот код выполняется в начале.
if (wgAction == 'edit' || wgAction == 'submit'){
  addOnloadHook(addTranslitButton)
}
 
 
//Функция для оформления таблицы
function Khanson_Translit(){
 
 //Проверяем, поддерживает ли браузер регулярные выражения (RegExp)	
 if (('code'.replace(/d/g, 'r') != 'core') 
    || (navigator.appName=='Netscape' && navigator.appVersion.substr (0, 1) < 5))
  { alert(Khanson_CantWork); return }
 
 var txt, hidden = [], hidIdx = 0, wpTextbox1 = document.editform.wpTextbox1
 var winScroll = document.documentElement.scrollTop //remember window scroll
 wpTextbox1.focus()
 
 if (typeof wpTextbox1.selectionStart != 'undefined' 
    && (navigator.productSub > 20031000 || is_safari)) { //Mozilla/Opera/Safari3
 
    var textScroll = wpTextbox1.scrollTop
    var startPos = wpTextbox1.selectionStart
    var endPos = wpTextbox1.selectionEnd
    txt = wpTextbox1.value.substring(startPos, endPos)
    if (txt == '') {alert(Khanson_FullText); ShowHelp(); return}
    else{
 
	  processText()
      wpTextbox1.value = wpTextbox1.value.substring(0, startPos) + txt + wpTextbox1.value.substring(endPos)
    }
    wpTextbox1.selectionStart = startPos
    wpTextbox1.selectionEnd = startPos + txt.length
    wpTextbox1.scrollTop = textScroll
 
 }else if (document.selection && document.selection.createRange) { //IE
 	 //alert("IE");
 
   var range = document.selection.createRange()
   txt = range.text
   if (txt == '') {alert(Khanson_FullText); ShowHelp(); return}
   else{
 
     processText()
	  range.text = txt
     //if (!window.opera) txt = txt.replace(/\r/g,'')
     if (range.moveStart) range.moveStart('character', - txt.length)
     range.select() 
   }
 
 }else // Для браузеров, которые не умеют возвращать выделенный фрагмент, выдаем ошибку
   { alert(Khanson_CantWork); return }
 
 document.documentElement.scrollTop = winScroll // scroll back, for IE/Opera
 
	//Здесь производим замену в переменной txt - это отразится на выделенном фрагменте текста 
	function processText(){
	  //txt = txt.replace(/^\s+|\s+$/g, '')  //Обрезаем пробелы слева и справа
	  //txt = txt.replace(/\n/g, '\n|-\n| ') //Концы строк
	  
	  //a b v g d e yo zh z i j k l m n o p r s t u f kh ts ch sh shch `` y ` e yu ya
	  
	  txt = txt.replace(/Ъ/g, '~~'); 
	  txt = txt.replace(/Ь/g, '~'); 
	  
	      txt = txt.replace(/щ/g, 'sh'); 
	      txt = txt.replace(/Щ/g, 'Shch'); 
		  
	      txt = txt.replace(/ее/g, 'eye');
	      txt = txt.replace(/ий/g, 'y');
              txt = txt.replace(/ый/g, 'y');
              txt = txt.replace(/ое/g, 'oye'); 
              txt = txt.replace(/ьe/g, 'yе'); 
 
              txt = txt.replace(/ья/g, 'ya'); 
              txt = txt.replace(/ьё/g, 'yo'); 
              txt = txt.replace(/ью/g, 'yu');              

              txt = txt.replace(/ъe/g, 'yе'); 
              txt = txt.replace(/ъя/g, 'ya'); 



	  txt = txt.replace(/ё/g, 'yo'); 
	  txt = txt.replace(/ж/g, 'zh'); 
	  txt = txt.replace(/ц/g, 'ts'); 
	  txt = txt.replace(/ч/g, 'ch'); 
	  txt = txt.replace(/ш/g, 'sh'); 
	  txt = txt.replace(/ъ/g, '``'); 
	  txt = txt.replace(/ы/g, 'y'); 
	  txt = txt.replace(/э/g, 'e'); 
	  txt = txt.replace(/ю/g, 'yu'); 
	  txt = txt.replace(/я/g, 'ya'); 
	    
	  txt = txt.replace(/Ё/g, 'Yo'); 
	  txt = txt.replace(/Ж/g, 'Zh'); 
	  txt = txt.replace(/Ц/g, 'Ts'); 
	  txt = txt.replace(/Ч/g, 'Ch'); 
	  txt = txt.replace(/Ш/g, 'Sh'); 
	  txt = txt.replace(/Ы/g, 'Y`'); 
	  txt = txt.replace(/Э/g, 'E'); 
	  txt = txt.replace(/Ю/g, 'Yu'); 
	  txt = txt.replace(/Я/g, 'Ya'); 
	  
	  txt = txt.replace(/а/g, 'a'); 
	  txt = txt.replace(/б/g, 'b'); 
	  txt = txt.replace(/в/g, 'v'); 
	  txt = txt.replace(/г/g, 'g'); 
	  txt = txt.replace(/д/g, 'd'); 
	  txt = txt.replace(/е/g, 'e'); 
	  txt = txt.replace(/з/g, 'z'); 
	  txt = txt.replace(/и/g, 'i'); 
	  txt = txt.replace(/й/g, 'y'); 
	  txt = txt.replace(/к/g, 'k'); 
	  txt = txt.replace(/л/g, 'l'); 
	  txt = txt.replace(/м/g, 'm'); 
	  txt = txt.replace(/н/g, 'n'); 
	  txt = txt.replace(/о/g, 'o'); 
	  txt = txt.replace(/п/g, 'p'); 
	  txt = txt.replace(/р/g, 'r'); 
	  txt = txt.replace(/с/g, 's'); 
	  txt = txt.replace(/т/g, 't'); 
	  txt = txt.replace(/у/g, 'u'); 
	  txt = txt.replace(/ф/g, 'f'); 
	  txt = txt.replace(/х/g, 'kh'); 
	  txt = txt.replace(/ц/g, 'ts'); 
	  txt = txt.replace(/ь/g, '`'); 

	  txt = txt.replace(/А/g, 'A'); 
	  txt = txt.replace(/Б/g, 'B'); 
	  txt = txt.replace(/В/g, 'V'); 
	  txt = txt.replace(/Г/g, 'G'); 
	  txt = txt.replace(/Д/g, 'D'); 
	  txt = txt.replace(/Е/g, 'Ye'); 
	  txt = txt.replace(/З/g, 'Z'); 
	  txt = txt.replace(/И/g, 'I'); 
	  txt = txt.replace(/Й/g, 'J'); 
	  txt = txt.replace(/К/g, 'K'); 
	  txt = txt.replace(/Л/g, 'L'); 
	  txt = txt.replace(/М/g, 'M'); 
	  txt = txt.replace(/Н/g, 'N'); 
	  txt = txt.replace(/О/g, 'O'); 
	  txt = txt.replace(/П/g, 'P'); 
	  txt = txt.replace(/Р/g, 'R'); 
	  txt = txt.replace(/С/g, 'S'); 
	  txt = txt.replace(/Т/g, 'T'); 
	  txt = txt.replace(/У/g, 'U'); 
	  txt = txt.replace(/Ф/g, 'F'); 
	  txt = txt.replace(/Х/g, 'Kh'); 
	  txt = txt.replace(/Ц/g, 'Ts'); 
          
           txt = txt.replace(/Ф/g, 'Ph'); 
	   txt = txt.replace(/ф/g, 'ph');

	  setWpSummary();
	}	

	function ShowHelp(){

	 var select, inputId, isEdit,  maxChars = 250, useMWPreview
	 
	 if (wgAction == 'edit' || wgAction == 'submit'){
	   inputId = 'wpSummary'
	 }else if (wgCanonicalNamespace == 'Special' && wgCanonicalSpecialPageName == 'Movepage'){
	   inputId = 'wpReason'
	  }else if (wgAction == 'protect'){
	   inputId = 'mwProtect-reason'
	 }else return

	 var hlp = document.getElementById("translit_help")
	 if (hlp) return
	 
	 var input = document.getElementById(inputId)
	 if (!input) return
	 
	 //create counter span
	 var cnt = document.createElement('span')
	 cnt.id = 'inputCounter'
	 cnt.style.marginLeft = '3px'
	 input.parentNode.insertBefore(cnt, input.nextSibling)
	 
	 cnt.innerHTML = '<table class="standard" id="translit_help">\
	<tr>\
	<th>А<th>Б<th>В<th>Г<th>Д<th>Е<th>Ё<th>Ж<th>З<th>И<th>Й<th>К<th>Л<th>М<th>Н<th>О<th>П<th>Р<th>С<th>Т<th>У<th>Ф<th>Х<th>Ц<th>Ч<th>Ш<th>Щ<th>Ъ<th>Ы<th>Ь<th>Э<th>Ю<th>Я\
	</tr>\
	<tr>\
	<td>а<td>b<td>v<td>g<td>d<td>e, ye<td>yo<td>zh<td>z<td>i<td>y<td>k<td>l<td>m<td>n<td>о<td>p<td>r<td>s<td>t<td>u<td>f<td>kh<td>ts, с<td>ch<td>sh<td>shch<td>``<td>y`<td>`<td>e`<td>yu<td>уа\
	</tr></table>';

	  
	} 
	
  function setWpSummary(){
     var wpSummary = document.getElementById('wpSummary')
	 if(wpSummary){
	    var temp=wpSummary.value;
	    temp=temp.replace(/\/\*.*?\*\// , ""); //комментарии
	    temp=temp.replace(/[\s]*/ , ""); //пробелы
	    if (temp==""){
	       wpSummary.value=wpSummary.value+" - [[User talk:Khanson/translit ru en.js|translit ru en.js]] - translit";
	    }
	 }
  }
 
}