Javascript Translit


Небольшое исследование, проведенное на тему правильной транслитерации url для сайта показало, что основные поисковые системы для российского сегмента Интернет - Яндекс и Google, несколько по-разному переводят русские буквы в английские аналоги.

Яндекс более вариативен, например всеми любимую букву "х" он сможет распознать, если она представлена любым из следующих английских вариантов "h,x,kh", Google предпочитает однозначное толкование - "h", однако вхождение поискового запроса в url типа "kharkov.ru" будет зачтено, при этом "k" просто отбросится. Таким образом для обоих поисковых систем транслитерация url домена, посвященного городу Харькову, с точки зрения SEO, будет идентичной. А вот для слова "сходка" подобный вариант с Google уже не пройдет.

Этот краткий экскурс в особенности транслитерации был затеян с одной целью - объяснить постановку решаемой задачи. Итак, имеем как минимум два варианта преобразования русских букв с возможным расширением количества толкований и толкователей, поэтому при реализации будет уместно использование массивов.

Далее, следует максимально синхронизировать оба набора символов, чтобы их воспринимали обе поисковые системы. После серии экспериментов по транслитерации, проведенных в Яндексе и Google, получим два набора, которые имеют всего два различия для букв "ж" и "щ".

Не знаю как вы, а я ёжиков уважаю, поэтому отдам должное ещё и русской букве "ё", а вот твердый и мягкий знаки, к сожалению, пришлось отбросить - при транслитерации url они бесполезны.


function translite(str) {
	var space = '-';
	str = str.toLowerCase();
		var transl = {
		'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'zh',
		'з': 'z', 'и': 'i', 'й': 'j', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n',
		'о': 'o', 'п': 'p', 'р': 'r','с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h',
		'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'sh','ъ': '~', 'ы': 'y', 'ь': '~', 'э': 'e', 'ю': 'yu', 'я': 'ya'
		}
	var link = '';
	for (var i = 0; i < str.length; i++) {
		if(/[а-яё]/.test(str.charAt(i))) { //если текущий символ - русская буква, то меняем его
		link += transl[str.charAt(i)];
			} else if (/[a-z0-9]/.test(str.charAt(i))) {
				link += str.charAt(i); //если текущий символ - английская буква или цифра, то оставляем как есть
			} else {
		if (link.slice(-1) !== space) link += space; // если не то и не другое то вставляем space
		}
	}
	return(link.replace(/~/g,''));
}

Translit для JavaScript

Про транслитерацию в интернете написано много, но Хабрахабр'е не нашел, решил написать код прямой и обратной транслитерации полностью соответствующий стандарту ISO 9:1995 7.79-2000 системы А и Б на JavaScript.

ПОЛЕЗНО  Смена action в form средствами jquery

Поддерживает Русский, Белорусский, Украинский, Болгарский, Македонский языки.
Используется в России, Армении, Азербайджане, Белоруссии, Казахстане, Киргизии, Таджикистане, Туркмении, Узбекистане.

Впечатление от использования: код упростить, конечно, можно, не хватает фонетических правил, но приходится придерживаться стандарта.

/*******************************************************************************
* @Name   : "translit(a, b, c)"                      // Имя
* @Params :   a  - транслируемая строка              // Параметры запуска
              b  - флаг обратного направления
              c  - [012345] system A = 0; system B = (1-RUS|2-BEL|3-UKR|4-BOL|5-MAK;)
* @Descrp : Прямая и обратная транслитерация         // Описание
             по стандарту ISO 9 или ISO 9:1995
             ГОСТ 7.79-2000 системы А и Б.     
* @ExtURL : ru.wikipedia.org/wiki/ISO_9              // Внешний URL
* #Guid   : {E7088033-479F-47EF-A573-BBF3520F493C}   // GUID
* @Exampl : "example()"                              // Пример использования
* GPL applies. No warranties XGuest[02.12.2013/06:39:59] translit [ver.0.0.0.2]
*******************************************************************************/
function translit(a, b, c) {
       // Символы кириллицы
 var d =  ["\u0449", "\u044F", "\u0454", "\u1123", "\u0456", "\u0457", "\u0451", "\u044E", "\u0436", "\u0447", "\u0448", "\u1139", "\u045F", "\u0491", "\u0453", "\u0455", "\u045C", "\u0459", "\u045A", "\u044D", "\u044A", "\u044B", "\u045E", "\u1131", "\u1141", "\u0446", "\u0430", "\u0431", "\u0432", "\u0433", "\u0434", "\u0435", "\u0437", "\u0438", "\u0439", "\u0458", "\u0456", "\u043A", "\u043B", "\u043C", "\u043D", "\u043E", "\u043F", "\u0440", "\u0441", "\u0442", "\u0443", "\u0444", "\u0445", "\u044C", "\u2019", "\u2116"],
 /* Транслитерация славянских алфавитов по системе А (с использованием диакритики) */
    e =  [["\u015D", "\u00E2", "\u00EA", "\u011B", , "\u00EF", "\u00EB", "\u00FB", "\u017E", "\u010D", "\u0161", "f\u0300", "d\u0302", "g\u0300", "\u01F5", "\u1E91", "\u1E31", "l\u0302", "n\u0302", "\u00E8", "\u02BA", "y", "\u01D4", "\u01CE", "\u1EF3", "c", "a", "b", "v", "g", "d", "e", "z", "i", "j", "j\u030C", "\u00EC", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "\u02B9", "\u02BC", "#"],
 /* Транслитерация славянских алфавитов по системе Б (с использованием буквосочетаний) */
 /* RUS */["shh", "ya", , "ye", "i`", , "yo", "yu", "zh", "ch", "sh", "fh", ,, ,, ,, , "e`", "``", "y`", ,, "yh", "cz", "a", "b", "v", "g", "d", "e", "z", "i", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* BEL */[ , "ya", ,, ,, "yo", "yu", "zh", "ch", "sh", ,, ,, ,, ,, "e`", , "y`", "u`", ,, "cz", "a", "b", "v", "g", "d", "e", "z", , "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* UKR */["shh", "ya", "ye", ,, "yi", , "yu", "zh", "ch", "sh", ,, "g`", ,, ,, ,, ,, ,, , "cz", "a", "b", "v", "g", "d", "e", "z", "y`", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* BOL */["sth", "ya", , "ye", "i`", ,, "yu", "zh", "ch", "sh", "fh", ,, ,, ,, ,, "a`", ,, "o`", "yh", "cz", "a", "b", "v", "g", "d", "e", "z", "i", "j", , "i", "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", "`", "'", "#"],
 /* MAK */[ , ,, ,, ,, , "zh", "ch", "sh", , "dh", , "g`", "z`", "k`", "l`", "n`", ,, ,, ,, "cz", "a", "b", "v", "g", "d", "e", "z", "i", , "j", , "k", "l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "x", , "'", "#"]
         ], f;
 c = (typeof c === "undefined")?1:c;               // Таблица по умолчанию
 if (b){                                           // Направление транслитерации
  f = e; e = d; d = f[c];
  if (c) {
   a = a.replace(/(c(?=[ieyjIEYJ]))/g, "cz");      // Обратное преобразование буквосочетаний
   a = a.replace(/(C(?=[ieyjIEYJ]))/g, "CZ");
  };
 } else {
  a = a.replace(/(i(?=.[^\ufffd\ufffd\ufffd\ufffd\ufffd\ufffd\s]+))/ig, "$1`");
  e = e[c];
 }
 for (f = 0;f < d.length;f++) {                    // Транслитерация
  if (!d[f]||!e[f]) continue;
  a = a.replace(new RegExp(d[f], "g"), e[f]);
  a = a.replace(new RegExp(d[f].toUpperCase(), "g"), e[f].toUpperCase());
 }
 if (!b) {
  a = a.replace(/cz(?=[ieyjIEYJ])/g, "c");         // Прямое преобразование буквосочетаний
  a = a.replace(/CZ(?=[ieyjIEYJ])/g, "C");
 }
 return a;
}

Проверка функции:

example();
function example() {
'use strict';
 var a = "Съешь ещё этих мягких французских булок, да выпей же чаю!",
// var a = "мірь",                                 // Старославянский
 b = translit(a,"");
 c = translit(b,true);
 console.log("Транслируемая строка:\n{0}\nТранслированная строка:\n{1}\nОбратная трансляция:\n{2}",a, b, c);
}

найдено на хабре