0

Ест такой скрипт который меняет одно текст на другую

(function() {
  if (!$('.translate').size()) return;
  var words = [
    ['Форум', 'Forum'],
    ['Форума', 'Forumun'],
    ['форум', 'forum'],
    ['форума', 'forumun'],
    ['Темы', 'Mövzular'],
    ['Тема', 'Mövzu'],
    ['темы', 'mövzular'],
    ['тема', 'mövzu']

]; $('.translate').each(function() { var html = this.innerHTML; for (i = 0, j = words.length; i < j; i++) { html = html.replace(new RegExp(words[i][0], 'gi'), words[i][1]); } this.innerHTML = html; }); })();

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<div class="translate">
  <div>Форум</div>
  <div>Форума</div>
  <div>форум</div>
  <div>форума</div>
  <div>Темы</div>
  <div>Тема</div>
  <div>темы</div>
  <div>тема</div>


</div>

Но как видно что написанный текст с маленькими буквами не учитывается, порядок должен такой. Слово Форум должен заменятся на Forum Слово Форума должен заменятся на Forumun Слово Форум должен заменятся на forum Слово форума должен заменятся на forumun Слово Темы должен заменятся на Mövzular Слово Тема должен заменятся на Mövzu

еще проблема в том что если ест таких слово пожарное , по рейтингу при смене текста должен получится Yanğın söndürən , ilə reyting а скрипт меняет как попало, допустим вот так

(function() {
  if (!$('.translate').size()) return;
  var words = [
    ['пожарное', 'yanğın söndürən'],
    ['по', 'ilə'],
    ['рейтингу', 'reytinqlə'],

]; $('.translate').each(function() { var html = this.innerHTML; for (i = 0, j = words.length; i < j; i++) { html = html.replace(new RegExp(words[i][0], 'gi'), words[i][1]); } this.innerHTML = html; }); })();

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<div class="eTitile eMessage eBlock translate">
  <div>пожарное</div>
  <div>по</div>
  <div>рейтингу</div>
  <div>поезд</div>
</div>

как нашел первую слово сменил, а слово пожарное сменился по частями iləжарное ну как надо сделать чтоб. если меняем слово форум менялся на forum а если в этом же строке есть еще похоже слово форум по авто слово форум отделено не менялся, а менялся как указываем вот так. Форум на Forum Форум по авто на avtomobil forumu по на ilə

ReinRaus
  • 17,873
  • 3
  • 47
  • 86
Samir Mamedov
  • 123
  • 1
  • 15
  • Для первого случая смените 'gi' на 'g'. Для второго случая могу порекомендовать только длинные слова ставить первыми в массиве, иначе нужно менять подход к замене слов. – Visman Mar 05 '16 at 09:45
  • @Visman Спасибо за помощь! про порядок длинных текстов в начале вставил, получилось. а это помогает 'gi' на 'g' запрет смене не заглавными буквами и с заглавными буквами А,а но есть еще проблема, условия else надо так сделать чтоб, если в скрипте указано слово Привет Петя=Salam Petya и Привет=Salam, менялся только то слово, если в скрипте будет такое смена и= скрипт меняет вот так Пр_və_вет, как избежать с таких случай? условия else если нашел и тогда если привет тогда оставит привет а не так Пр_və_вет – Samir Mamedov Mar 05 '16 at 14:12

1 Answers1

1

Можно сократить количество шаблонов вдвое, если использовать функцию обратного вызова при замене:

var words = [
    ['форум', 'forum'],
    ['форума', 'forumun'],
    ['темы', 'mövzular'],
    ['тема', 'mövzu']
];

var html = "Форум форум подфорум Форума форума темы Темы подтема тема Тема";

for (i = 0, j = words.length; i < j; i++) { var re = new RegExp( "([^а-яё]|^)(" + words[i][0] + ")(?=[^а-яё]|$)", 'gi'); var repl = words[i][1]; html = html.replace( re, function( full, m1, m2 ) { if ( m2.charAt(0).toUpperCase() == m2.charAt(0) ) { return m1 + repl.charAt(0).toUpperCase() + repl.slice(1); } else { return m1 + repl; } } ); }; console.log( html );

Результат:

Forum forum подфорум Forumun forumun mövzular Mövzular подтема mövzu Mövzu

Регулярное выражение сделано с учетом, что исходный язык - русский. Для других языков можно составить регулярное выражение используя вопрос:
Как описать все символы некоторого языка в регулярном выражении? Есть ли готовые решения?


Бонус
Если изначально делать страницу на английском языке, то код будет значительно проще:

var words = [
  ['forum', 'forum'],
  ['forums', 'forumun'],
  ['thread', 'mövzular'],
  ['threads', 'mövzu']
];

var html = "Forum forum subforum Forums forums Thread thread subthread Threads threads";

for (i = 0, j = words.length; i < j; i++) { var re = new RegExp( "\b" + words[i][0] + "\b", 'gi'); var repl = words[i][1]; html = html.replace( re, function( full ) { if ( full.charAt(0).toUpperCase() == full.charAt(0) ) { return repl.charAt(0).toUpperCase() + repl.slice(1); } else { return repl; } } ); }; console.log( html );

Результат:

Forum forum subforum Forumun forumun Mövzular mövzular subthread Mövzu mövzu
ReinRaus
  • 17,873
  • 3
  • 47
  • 86
  • у меня страницы на русском языке, меня подходит первый вариант, но есть маленькие проблемы, это строка не подходит var html = "Форум форум"; из за того что, если на странице есть 10000 и боле слов, их надо написать в эту строку, и в массив перевода, я эту строку не вставил в скрипт, работает отлично, ищет и меняет то что указано, но заглавные буквы не определяет, если указано Форум и форум а мне надо чтоб форум, скрипт как увидеть первую Форум , и на выдаче дает Forum, есть какой не будь другой вариант? вот скрипт – Samir Mamedov Mar 07 '16 at 07:46
  • уже эту тоже поправил gi менял на g теперь переводит БОЛЬШИМИ с большими маленькими с маленькими, и добавил такую строку а-яА-ЯёЁ место этого а-яё – Samir Mamedov Mar 07 '16 at 10:27
  • О_О из за того что, если на странице есть 10000 и боле слов, их надо написать в эту строку . Это пример О_о Способ доставки текста в этот код на Ваш вкус. – ReinRaus Mar 07 '16 at 23:41