NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Duolingo Language Switcher // @namespace https://www.duolingo.com/derevnia // @version 1.12 // @description Сhange the letters in your preferred language(ru+en) on duolingo.com // @include https://www.duolingo.com/* // @updateURL https://openuserjs.org/install/derevnia/Duolingo_Language_Switcher.user.js // @downloadURL https://openuserjs.org/install/derevnia/Duolingo_Language_Switcher.user.js // @author derevnia // @grant none // ==/UserScript== $(document).ready(function() { var d = [{ code: 'en', chars: '`qwertyuiop[]asdfghjkl;\'zxcvbnm,.~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>' }, { code: 'ru', chars: 'ёйцукенгшщзхъфывапролджэячсмитьбюЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ' }]; var f = function(a, b) { var c; for (var i = 0; i < d.length; i++) { if (d[i].code === a) { c = d[i]; break } } if (c === null) return true; for (i = 0; i < b.length; i++) { if (c.chars.indexOf(b[i]) == -1) { return false } } return true }; $(document).keyup(function(e) { function getCaret(a) { if (a.selectionStart) { return a.selectionStart } else if (document.selection) { a.focus(); var r = document.selection.createRange(); if (r === null) { return 0 } var b = a.createTextRange(), rc = b.duplicate(); b.moveToBookmark(r.getBookmark()); rc.setEndPoint('EndToStart', b); return rc.text.length } return 0 } function setSelectionRange(a, b, c) { if (a.setSelectionRange) { a.focus(); a.setSelectionRange(b, c) } else if (a.createTextRange) { var d = a.createTextRange(); d.collapse(true); d.moveEnd('character', c); d.moveStart('character', b); d.select() } } var h = document.getElementById('text-input'); var l = document.getElementById('word-input'); var a = $('#text-input,#word-input'); if (h) { q1 = getCaret(h) } if (l) { q2 = getCaret(l); if (typeof(a.attr('lang')) == 'undefined') { l.setAttribute('lang', 'en') } } if (a.is(':focus')) { if (!f(a.attr('lang'), a.val())) { if (a.attr('lang') == 'ru') { var g = {'`':'ё','q':'й','w':'ц','e':'у','r':'к','t':'е','y':'н','u':'г','i':'ш','o':'щ','p':'з','[':'х',']':'ъ','a':'ф','s':'ы','d':'в','f':'а','g':'п','h':'р','j':'о','k':'л','l':'д',';':'ж','\'':'э','z':'я','x':'ч','c':'с','v':'м','b':'и','n':'т','m':'ь','\,':'б','.':'ю','~':'Ё','Q':'Й','W':'Ц','E':'У','R':'К','T':'Е','Y':'Н','U':'Г','I':'Ш','O':'Щ','P':'З','{':'Х','}':'Ъ','A':'Ф','S':'Ы','D':'В','F':'А','G':'П','H':'Р','J':'О','K':'Л','L':'Д',':':'Ж','"':'Э','Z':'Я','X':'ч','C':'С','V':'М','B':'И','N':'Т','M':'Ь','<':'Б','>':'Ю'}; var b = a.val(); var r = ''; for (var i = 0; i < b.length; i++) { r += g[b.charAt(i)] || b.charAt(i) } a.val(r) } else { var j = {'й':'q','ц':'w','у':'e','к':'r','е':'t','н':'y','г':'u','ш':'i','щ':'o','з':'p','х':'[','ъ':']','ф':'a','ы':'s','в':'d','а':'f','п':'g','р':'h','о':'j','л':'k','д':'l','ж':';','э':'\'','я':'z','ч':'x','с':'c','м':'v','и':'b','т':'n','ь':'m','б':',','ю':'.','Й':'Q','Ц':'W','У':'E','К':'R','Е':'T','Н':'Y','Г':'U','Ш':'I','Щ':'O','З':'P','Х':'{','Ъ':'}','Ф':'A','Ы':'S','В':'D','А':'F','П':'G','Р':'H','О':'J','Л':'K','Д':'L','Ж':':','Э':'"','Я':'Z','Ч':'X','С':'C','М':'V','И':'B','Т':'N','Ь':'M','Б':'<','Ю':'>'}; var k = a.val(); var s = ''; for (var p = 0; p < k.length; p++) { s += j[k.charAt(p)] || k.charAt(p) } a.val(s) } if (h) { function setCaretToPos(a, b) { setSelectionRange(a, b, b) } setCaretToPos(h, q1) } if (l) { function setCaretToPos(a, b) { setSelectionRange(a, b, b) } setCaretToPos(l, q2) } } } }) });