derevnia / Duolingo Language Switcher

// ==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)
                }
            }
        }
    })
});