function rus_to_latin ( str ) { | |
var ru = { | |
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', | |
'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', | |
'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', | |
'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', | |
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', | |
'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya' | |
}, n_str = []; | |
str = str.replace(/[ъь]+/g, '').replace(/й/g, 'i'); | |
for ( var i = 0; i < str.length; ++i ) { | |
n_str.push( | |
ru[ str[i] ] | |
|| ru[ str[i].toLowerCase() ] == undefined && str[i] | |
|| ru[ str[i].toLowerCase() ].toUpperCase() | |
); | |
} | |
return n_str.join(''); | |
} | |
/* | |
rus_to_latin( 'Иван Алексеев, известный под сценической кличкой Noize MC записал альбом с показательным названием «Неразбериха». Получилась питательная и где-то даже успокоительная смесь из хип-хопа, гранжа, регги и брейк-бита' ); | |
> Ivan Alekseev, izvestnyi pod scenicheskoi klichkoi Noize MC zapisal albom s pokazatelnym nazvaniem «Nerazberiha». Poluchilas pitatelnaya i gde-to daje uspokoitelnaya smes iz hip-hopa, granja, reggi i breik-bita | |
*/ |
Чуть осовремененая версия, если кто любит "современные штучки"
function rus_to_latin(str) { const ru = new Map([ ['а', 'a'], ['б', 'b'], ['в', 'v'], ['г', 'g'], ['д', 'd'], ['е', 'e'], ['є', 'e'], ['ё', 'e'], ['ж', 'j'], ['з', 'z'], ['и', 'i'], ['ї', 'yi'], ['й', 'i'], ['к', 'k'], ['л', 'l'], ['м', 'm'], ['н', 'n'], ['о', 'o'], ['п', 'p'], ['р', 'r'], ['с', 's'], ['т', 't'], ['у', 'u'], ['ф', 'f'], ['х', 'h'], ['ц', 'c'], ['ч', 'ch'], ['ш', 'sh'], ['щ', 'shch'], ['ы', 'y'], ['э', 'e'], ['ю', 'u'], ['я', 'ya'], ]); str = str.replace(/[ъь]+/g, ''); return Array.from(str) .reduce((s, l) => s + ( ru.get(l) || ru.get(l.toLowerCase()) === undefined && l || ru.get(l.toLowerCase()).toUpperCase() ) , ''); }
Выглядит бодро! 👍
Чуть осовремененая версия, если кто любит "современные штучки"
Компакт версия
function transliterate(word) {
const keys = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',
'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh',
'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya'
}
return word.split("").map((char) => keys[char] || char).join("");
}
Чуть осовремененая версия, если кто любит "современные штучки"
Компакт версия
function transliterate(word) {
const keys = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',
'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh',
'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya'
}
return word.split("").map((char) => keys[char] || char).join("");
}
Не работает с верхним регистром
@cawa-93, думаю, можно просто uppercase keys добавить)) 😅
Чуть осовремененая версия, если кто любит "современные штучки"
function rus_to_latin(str) { const ru = new Map([ ['а', 'a'], ['б', 'b'], ['в', 'v'], ['г', 'g'], ['д', 'd'], ['е', 'e'], ['є', 'e'], ['ё', 'e'], ['ж', 'j'], ['з', 'z'], ['и', 'i'], ['ї', 'yi'], ['й', 'i'], ['к', 'k'], ['л', 'l'], ['м', 'm'], ['н', 'n'], ['о', 'o'], ['п', 'p'], ['р', 'r'], ['с', 's'], ['т', 't'], ['у', 'u'], ['ф', 'f'], ['х', 'h'], ['ц', 'c'], ['ч', 'ch'], ['ш', 'sh'], ['щ', 'shch'], ['ы', 'y'], ['э', 'e'], ['ю', 'u'], ['я', 'ya'], ]); str = str.replace(/[ъь]+/g, ''); return Array.from(str) .reduce((s, l) => s + ( ru.get(l) || ru.get(l.toLowerCase()) === undefined && l || ru.get(l.toLowerCase()).toUpperCase() ) , ''); }
Спасибо за полезный снипет, на всякий приложу для остальных понятную для чтения версию.
const ru = {
а: 'a',
б: 'b',
в: 'v',
г: 'g',
д: 'd',
е: 'e',
є: 'e',
ё: 'e',
ж: 'j',
з: 'z',
и: 'i',
ї: 'yi',
й: 'i',
к: 'k',
л: 'l',
м: 'm',
н: 'n',
о: 'o',
п: 'p',
р: 'r',
с: 's',
т: 't',
у: 'u',
ф: 'f',
х: 'h',
ц: 'c',
ч: 'ch',
ш: 'sh',
щ: 'shch',
ы: 'y',
э: 'e',
ю: 'u',
я: 'ya',
ъ: '',
ь: '',
};
export function rusToLatin(str) {
return Array.from(str).reduce((acc, letter) => {
const lowLetter = letter.toLowerCase();
const en = ru[lowLetter] ?? letter;
const enNormalized = lowLetter === letter ? en : en.toUpperCase();
return acc + enNormalized;
}, '');
}
Не работает с верхним регистром
На основе последнего скрипта - подправил:
const ruKeys = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',
'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh',
'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya'
}
function transliterate(word) {
return word.split("").map((letter) => {
const lowLetter = letter.toLowerCase();
const en = ruKeys[lowLetter] ?? letter;
return lowLetter === letter ? en : en.toUpperCase();
}).join("");
}
Не работает с верхним регистром
На основе последнего скрипта - подправил:
const ruKeys = { 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya' } function transliterate(word) { return word.split("").map((letter) => { const lowLetter = letter.toLowerCase(); const en = ruKeys[lowLetter] ?? letter; return lowLetter === letter ? en : en.toUpperCase(); }).join(""); }
Наверное не стоит оставлять в транслите мягкий и твердый знак и добавить что-то вроде:
...return word.replace(/[ъь]+/g, '').split("").map((letter) => {...
Наверное не стоит оставлять в транслите мягкий и твердый знак и добавить что-то вроде:
...return word.replace(/[ъь]+/g, '').split("").map((letter) => {...
Ну и без regex, для целостности:
в ключах можно обозначить 'ь': '' пустыми строками...которые НЕ undefined и будут заменятся, а всякие спец символы и т.д. типо $ будут пропускатся так как мы не обозначили их в ключах
return str.split("").map(char => typeof keys[char] === "undefined" ? char : keys[char]).join("");
Моя полная версия...скажете длинная но мне нравится доп контроль над символами:
const translit = str => {
const keys = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd',
'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',
'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o',
'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch','ш': 'sh',
'ь': '', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya',
'щ': 'shch', 'ъ': '',
'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D',
'Е': 'E', 'Ё': 'E', 'Ж': 'J', 'З': 'Z', 'И': 'I',
'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N', 'О': 'O',
'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', 'У': 'U',
'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch','Ш': 'Sh',
'Ь': '', 'Ы': 'Y', 'Э': 'E', 'Ю': 'U', 'Я': 'Ya',
'Щ': 'Shch', 'Ъ':''
}
return str.split("").map(char => typeof keys[char] === "undefined" ? char : keys[char]).join("");
}
СПАСИБО!
В последней версии не работает й. Вот рабочая версия на TS, с поддержкой украинских букв. Результат совпадает с текстом в стартовом посте:
const ruKeys: Record<string, string> = {
'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', 'е': 'e', 'ё': 'e', 'ж': 'j', 'з': 'z', 'и': 'i',
'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', 'у': 'u',
'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', 'ш': 'sh', 'щ': 'shch', 'ы': 'y', 'э': 'e', 'ю': 'u', 'я': 'ya',
'й': 'i', 'ъ': '', 'ь': '', 'і': 'i', 'ї': 'yi', 'є': 'ye'
};
function transliterate(word: string) {
return word.split("").map((letter) => {
const lowLetter = letter.toLowerCase();
const en = ruKeys[lowLetter] ?? letter;
return lowLetter === letter ? en : (en.slice(0,1).toUpperCase() + en.slice(1);
}).join("");
}
const test = 'і є ї Щваньъ Алексеев, известный под сценической кличкой Noize MC записал альбом с показательным названием «Неразбериха». Получилась питательная и где-то даже успокоительная смесь из хип-хопа, гранжа, регги и брейк-бита';
const expected = 'i ye yi Shchvan Alekseev, izvestnyi pod scenicheskoi klichkoi Noize MC zapisal albom s pokazatelnym nazvaniem «Nerazberiha». Poluchilas pitatelnaya i gde-to daje uspokoitelnaya smes iz hip-hopa, granja, reggi i breik-bita';
console.log(transliterate(test) == expected);
Чуть осовремененая версия, если кто любит "современные штучки"