Небольшое исследование, проведенное на тему правильной транслитерации 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.
Поддерживает Русский, Белорусский, Украинский, Болгарский, Македонский языки.
Используется в России, Армении, Азербайджане, Белоруссии, Казахстане, Киргизии, Таджикистане, Туркмении, Узбекистане.
Впечатление от использования: код упростить, конечно, можно, не хватает фонетических правил, но приходится придерживаться стандарта.
/*******************************************************************************
* @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);
}

