Форум русской поддержки Joomla!® CMS
06.12.2016, 10:05:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

JavaScript замены слов

 (Прочитано 391 раз)
0 Пользователей и 1 Гость смотрят эту тему.
JLang
Осваиваюсь на форуме
***

Репутация: +17/-0
Offline Offline

Пол: Мужской
Сообщений: 107



« : 11.03.2015, 14:18:39 »

Для создания полезной штуки необходимо немного (или много? без понятия) исправить следующий код.
Это для перевода компонентов без языковых строк.
Код
<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() ) с заданным интервалом времени.
Так же попутный вопрос и хотелка (что в идеале   Cheesy)
Правильно ли это - запускать функцию такого поиска и замены с периодичностью в 2 секунды при наличии в заданном массиве, допустим 100 фраз, слов?
И хотелка - возможно ли запускать эту функцию не по временному интервалу, а по событию, т.е. клике мыши в любом месте экрана или нажатии любой кнопки. Кнопка onclick="perevod()" не вариант.
Сейчас сценарий работает, но во многих моментах необходимо нажать ту самую onclick="perevod()" но без неё, автоматически  Grin если понимаете о чём я.
Буду благодарен любой помощи (даже поддержке, типа - ну, удачи.  dry)
« Последнее редактирование: 11.03.2015, 14:47:13 от JLang » Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2238


« Ответ #1 : 11.03.2015, 15:29:02 »

Цитировать
Правильно ли это - запускать функцию такого поиска и замены с периодичностью в 2 секунды при наличии в заданном массиве, допустим 100 фраз, слов?
я бы начал с 50мс
100 слов – Неправильно, это мелочь
100 фраз – зависит от длины строки.
Правильнее было бы после каждой итерации цикла проверять затраченное время. Если оно не вышло за лимит (50мс), следующая итерация. Если вышло, запуск рекурсивно продолжения через таймаут, чтобы дать возможность выполнения других скриптов в очереди.

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

Цитировать
Буду благодарен любой помощи (даже поддержке, типа - ну, удачи.
Нууу… УДАЧИ!
« Последнее редактирование: 11.03.2015, 23:18:47 от fsv » Записан
JLang
Осваиваюсь на форуме
***

Репутация: +17/-0
Offline Offline

Пол: Мужской
Сообщений: 107



« Ответ #2 : 13.03.2015, 01:14:06 »

Аллилуюшка! Спустя всего то два дня нашёл решение  Grin в этом мега сложном вопросе
Пришлось убрать window.onload, назвать функцию perevod() и добавить в самом конце setInterval(perevod, 250);
И всё заработало! Поверить не могу, как просто... Но как сложно.

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

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

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2238


« Ответ #3 : 13.03.2015, 02:51:29 »

Цитировать
и добавить в самом конце setInterval(perevod, 250);
И всё заработало!
у вас сейчас переводит сразу всю страницу,
Показать текстовый блок

Цитировать
Вы ещё писали "после каждой итерации цикла проверять затраченное время" Если не сложно, пожалуйста, подскажите как это сделать. В виде кода.
Пример универсальной функции. Подгоняйте под свою ситуацию, прокомментировал для ясности.
Код
// пакетная обработка элементов массива с проверкой времени
// функция принимает аргументы: обрабатываемый массив, функцию обработки каждого элемента массива и функцию обратного вызова
 
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);
}
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet