JavaScript замены слов

  • 3 Ответов
  • 553 Просмотров

0 Пользователей и 1 Гость просматривают эту тему.

*

Оффлайн JLang

JavaScript замены слов
« : 11.03.2015, 15:18:39 »
Для создания полезной штуки необходимо немного (или много? без понятия) исправить следующий код.
Это для перевода компонентов без языковых строк.
Код: javascript
<script language="JavaScript" type="text/javascript">
function repl(a) {
    var b = {
'Search': 'Поиск',
'Media': 'Медиа',
'Title': 'Заголовок',
'Upload': 'Загрузить'
    };
    for (var c in b) {
        var d = RegExp(c, 'g');
        a = a.replace(d, b[c])
    }
    return a
};

window.onload = function () {
    all_elements = document.getElementsByTagName('*');
    i = 0;
    for (s = all_elements.length; i < s; i++) if (all_elements[i].tagName != 'SCRIPT') {
        j = 0;
        for (s_ = all_elements[i].childNodes.length; j < s_; j++)
        if (all_elements[i].childNodes[j].nodeType == 3)
        all_elements[i].childNodes[j].data = repl(all_elements[i].childNodes[j].data)
    }
};
</script>

Абсолютно не понимаю js. Ни функций, ни синтаксиса. Мудрю уже долгое время, но воз и ныне там.
Прошу помощи (как и куда) вставить функцию setTimeout или setInterval, чтобы сценарий запускал функцию window.onload = function () { (её пока никак не назвал, но планирую perevod() ) с заданным интервалом времени.
Так же попутный вопрос и хотелка (что в идеале   :D)
Правильно ли это - запускать функцию такого поиска и замены с периодичностью в 2 секунды при наличии в заданном массиве, допустим 100 фраз, слов?
И хотелка - возможно ли запускать эту функцию не по временному интервалу, а по событию, т.е. клике мыши в любом месте экрана или нажатии любой кнопки. Кнопка onclick="perevod()" не вариант.
Сейчас сценарий работает, но во многих моментах необходимо нажать ту самую onclick="perevod()" но без неё, автоматически  ;D если понимаете о чём я.
Буду благодарен любой помощи (даже поддержке, типа - ну, удачи.  :dry:)
« Последнее редактирование: 11.03.2015, 15:47:13 от JLang »

*

Оффлайн fsv

Re: JavaScript замены слов
« Ответ #1 : 11.03.2015, 16:29:02 »
Цитировать
Правильно ли это - запускать функцию такого поиска и замены с периодичностью в 2 секунды при наличии в заданном массиве, допустим 100 фраз, слов?
я бы начал с 50мс
100 слов – Неправильно, это мелочь
100 фраз – зависит от длины строки.
Правильнее было бы после каждой итерации цикла проверять затраченное время. Если оно не вышло за лимит (50мс), следующая итерация. Если вышло, запуск рекурсивно продолжения через таймаут, чтобы дать возможность выполнения других скриптов в очереди.

Цитировать
Это для перевода компонентов без языковых строк.
Если компонент собственный, нечего обходить все теги в документе, сужайте поиск набора элементов.
Или парсите англоязычный сайт?

Цитировать
Буду благодарен любой помощи (даже поддержке, типа - ну, удачи.
Нууу… УДАЧИ!
« Последнее редактирование: 12.03.2015, 00:18:47 от fsv »
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

Оффлайн JLang

Re: JavaScript замены слов
« Ответ #2 : 13.03.2015, 02:14:06 »
Аллилуюшка! Спустя всего то два дня нашёл решение  ;D в этом мега сложном вопросе
Пришлось убрать window.onload, назвать функцию perevod() и добавить в самом конце setInterval(perevod, 250);
И всё заработало! Поверить не могу, как просто... Но как сложно.

я бы начал с 50мс
100 слов – Неправильно, это мелочь
100 фраз – зависит от длины строки.
fsv, спасибо. Поступил по первому вашему совету на 25мс. Слов, конечно не 100, а в разы меньше. И оказывается на глаз практически не заметна подмена. Расчитывая на 2 секунды минимум - мерцание бы напрягало.
Вы ещё писали "после каждой итерации цикла проверять затраченное время" Если не сложно, пожалуйста, подскажите как это сделать. В виде кода. С такими страшными словами, боюсь никогда не осилить.
Сейчас конечный вариант выглядит так:
Спойлер
[свернуть]

Если компонент собственный, нечего обходить все теги в документе, сужайте поиск набора элементов.
Или парсите англоязычный сайт?
Компонент не собственный и к сожалению понятия не имею как ограничивать поиск.
У меня маленькое хобби, в свободное время и при наличии желания делаю русификаторы компонентов.
А некоторые не имеют своих языковых строк. Поэтому думал-думал и придумал такой способ их перевода с прописью JavaScript в языковой ini файл, ведь любой компонент по идее имеет(или может подключить) ru-RU.com_component.ini
Этот скрипт нашёл случайно, под свои нужды исправил (так же после недельных поисков) буквально две буковки))
« Последнее редактирование: 13.03.2015, 02:32:49 от JLang »

*

Оффлайн fsv

Re: JavaScript замены слов
« Ответ #3 : 13.03.2015, 03:51:29 »
Цитировать
и добавить в самом конце setInterval(perevod, 250);
И всё заработало!
у вас сейчас переводит сразу всю страницу,
Спойлер
[свернуть]

Цитировать
Вы ещё писали "после каждой итерации цикла проверять затраченное время" Если не сложно, пожалуйста, подскажите как это сделать. В виде кода.
Пример универсальной функции. Подгоняйте под свою ситуацию, прокомментировал для ясности.
Код: javascript
// пакетная обработка элементов массива с проверкой времени
// функция принимает аргументы: обрабатываемый массив, функцию обработки каждого элемента массива и функцию обратного вызова

function timedProcessArray(items, process, callback){
    var todo = items.concat();      // создать копию оригинального массива, используется в качестве очереди
    setTimeout(function(){
        var start = +new Date();    // преобразование объекта Date в числовое представление
        do {
            process(todo.shift());  // извлечь очередной элемент массива (с его удалением из массива) и обработать его
        } while (todo.length > 0 && (+new Date() - start < 50));
        if (todo.length > 0){
            setTimeout(arguments.callee, 25);  // arguments.callee указывает на анонимную функцию, в которой в данный момент находится поток выполнения
        } else {
            callback(items);
        }
    }, 25);
}
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения