Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как сделать транскрипцию (https://javascript.ru/forum/dom-window/78853-kak-sdelat-transkripciyu.html)

Янковиц 13.11.2019 19:02

Как сделать транскрипцию
 
Добрый день. Нужно сделать транскрипцию с турецкого языка. Вот 2 textarea:
<textarea id="decoder-form__txt" name="input" placeholder="Ваш текст на турецком языке"></textarea>
<textarea id="decoder-form__result" placeholder="Как читается по-русски"></textarea>


Вот скрипт:
<script>
document.getElementById('decoder-form__txt').onkeyup = function() {
	var text = this.value;
	// Буква Ğ
	var tr = "İğ Eğ Öğ Üğ iğ eğ öğ üğ".split(/ +/g);
	var ru = "Ий Эй Ой Юй ий ей ой юй".split(/ +/g);
	for(var x = 0; x < tr.length; x++) {
		text = text.split(tr[x]).join(ru[x]);
	}
	
	// Сочетания Y с гласными
	var tr = "Ya Ye Yu Yü ya ye yu yü".split(/ +/g);
	var ru = "Я  Е  Ю  Ю  ья ье ю  ю".split(/ +/g);
	for(var x = 0; x < tr.length; x++) {
		text = text.split(tr[x]).join(ru[x]);
	}
	
	// Циркумфлекс
	var tr = "Gâ Kâ Lâ gâ kâ lâ Gû Kû Lû gû kû lû".split(/ +/g);
	var ru = "Гя Кя Ля гя кя ля Гю Кю Лю гю кю лю".split(/ +/g);
	for(var x = 0; x < tr.length; x++) {
		text = text.split(tr[x]).join(ru[x]);
	}
	
	// остальные буквы
	var tr = "A Â B C  Ç D E F G Ğ H I İ Î J K L M N O Ö P R S Ş T U Û Ü V Y Z a â b c  ç d e f g ğ h ı i î j k l m n o ö p r s ş t u û ü v y z".split(/ +/g);
	var ru = "А А Б ДЖ Ч Д Е Ф Г Г Х Ы И И Ж К Л М Н О Ё П Р С Ш Т У У Ю М Й З а а б дж ч д е ф г г х ы и и ж к л м н о ё п р с ш т у у ю м й з".split(/ +/g);
	for(var x = 0; x < tr.length; x++) {
		text = text.split(tr[x]).join(ru[x]);
	}
	document.getElementById('decoder-form__result').innerHTML = text;
}
</script>


Столкнулся с проблемой. При положении в начале слова, буква может иметь другой звук. В частности нужно:
1. В начале слова и после гласных ye → е, ya → я, yu (yü) → ю: Bahtiyar → Бахтияр, сейчас выводит Бахтиьяр
2. В начале слова и после гласной действуют правила e → э, ı → и, ö → о, ü → у

Прошу помощи.

Янковиц 13.11.2019 19:05

В общем-то всё работает, единственно нужно прописать правила для определения сочетаний букв в начале слова. При этом слова могут начинаться с большой и маленькой букв.

рони 13.11.2019 19:38

Цитата:

Сообщение от Янковиц
Bahtiyar → Бахтияр, сейчас выводит Бахтиьяр

так у вас ya это ья, строки 12 и 13, может надо убрать ь?

Янковиц 13.11.2019 19:44

Нельзя, так как если сочетание букв в центре, то читается как "ья". С этим я разберусь, нужно именно перехватить начало слов. Тестирую:
Etmek - пока Етмек, а надо Этмек

рони 13.11.2019 20:24

Янковиц,
делайте через RegExp и обьект замены

рони 13.11.2019 20:43

Янковиц,
var obj  = {e : 'э'};//дописать в нижнем регистре
var reg = /(^|\s+)(e|r)/gim; // r заменить на нужые с|и|м|в|о|л|ы
var value = 'Etmek';
function fn(value)
{
   return value.replace(reg, function(a, b, c) {
var caps = c.charAt(0) != (c = c.toLowerCase()).charAt(0);
if(c in obj) c = obj[c];
if(caps) c = c.toUpperCase();
return b + c
})
}
value = fn(value);
alert(value);
value = 'etmek'
value = fn(value);
alert(value);

рони 13.11.2019 20:49

Янковиц,
var obj  = {ya : 'я'};//дописать в нижнем регистре
var reg = /(i|u|o)(ya|r)/gim; // r заменить на нужые символы
var value = 'Bahtiyar';
function fn(value)
{
   return value.replace(reg, function(a, b, c) {
var caps = c.charAt(0) != (c = c.toLowerCase()).charAt(0);
if(c in obj) c = obj[c];
if(caps) c = c.toUpperCase();
return b + c
})
}
value = fn(value);
alert(value);

Malleys 13.11.2019 21:46

У вас получается, что düğün → дюйюн. Это в каком турецком так?

Цитата:

Сообщение от Янковиц
В начале слова и после гласной действуют правила e → э, ı → и, ö → о, ü → у

Ничего подобного в стандартном турецком языке нет!Например, ö не взаимозаменяема с o, сравните onu с önü, например тут — https://forvo.com/search/%C3%B6n%C3%BC/tr/

Цитата:

Сообщение от Янковиц
В начале слова и после гласной действуют правила... ı → и

Нет! Сравните ılık с ilikhttps://forvo.com/search/%C4%B1l%C4%B1k/tr/ т. е. ваш алгоритм из сообщения №1 показывает правильно — ılık [ылык], ilik [илик]

Malleys 13.11.2019 22:11

Эта ваша русская транскрипция имеет массу проблем, поскольку русский алфавит не способен передать все тонкости звучания турецкого языка. Используйте для транскрипции Международный Фонетический Алфавит (вы его видели, например, транскрипция в английском словаре) при помощи которого можно указать все тонкости произношения стандартного турецкого языка. Иначе это будет «лец ми спик фром май харт», только по турецки!


Часовой пояс GMT +3, время: 08:02.