JSFiddle - React, Tailwind, and code Playground

HTML

Рука

JavaScript

lang=(function init_lang(){
    var BODY=document.body,            //тело документа
        LANG_HASH={},                //собственно, результирующий хэш
        LANG_HASH_LIST=[],            //список загружаемых словарей
        LANG_HASH_INDEX={},            //список имён словарей
        LANG_HASH_USER={},            //пользовательский словарь
        LANG_HASH_SYSTEM={},        //системный словарь
        LANG_QUEUE_TO_UPDATE=[],    //очередь элементов для обновления
        LANG_PROPS_TO_UPDATE={},    //перечень имён для обновления
        LANG_UPDATE_LAST=-1,        //индекс последнего обновлённого элемента
        LANG_UPDATE_INTERVAL=0,        //интервал обновления
        LANG_JUST_DELETE=false;        //неперестраивание хэша при удалении словаря
    var hash_rebuild=function hash_rebuild(){    //функция перестраивания хэша
            var obj={};
            obj=lang_mixer(obj,LANG_HASH_USER);
            for(var i=0,l=LANG_HASH_LIST.length;i<l;i++)
                obj=lang_mixer(obj,LANG_HASH_LIST[i]);
            LANG_HASH=lang_mixer(obj,LANG_HASH_SYSTEM);
        },
        lang_mixer=function lang_mixer(obj1,obj2){    //функция расширения свойствами
            for(var k in obj2)
                obj1[k]=obj2[k];
            return obj1;
        },
        lang_update=function lang_update(data){    //функция, инициирующая обновление
            switch(typeof data){
                default:
                    return;
                case "string":
                    LANG_PROPS_TO_UPDATE[data]=1;
                break;
                case "object":
                    lang_mixer(LANG_PROPS_TO_UPDATE,data);
            }
            LANG_UPDATE_LAST=0;
            if(!LANG_UPDATE_INTERVAL)
                LANG_UPDATE_INTERVAL=setInterval(lang_update_processor,100);
        },
        lang_update_processor=function lang_update_processor(){    //функция обновления
            var date=new Date;
            for(var l=LANG_QUEUE_TO_UPDATE.length,
       ...