Цемна стронэ Моцы

в 22:00, , рубрики: javascript, natural language processing, speedcubing, starwars, Unicode, изучение языков, Лайфхаки для гиков, Научно-популярное, польский язык, пятничное, фильмы

Початково рыцер Еди, под вплывем Дартха Сидиоуса прешедл на цемна стронэ Моцы и прыял тытул „Дартх Вадер”.

Вы поняли что-то из предыдущего предложения? Это польский язык. Это не перевод, это польский язык как он есть, просто записаный кириллицей. Вчера, я случайно оказался на польском сайте, там всё было написано по польски, ничего не понятно, и мне вдруг стало любопытно, что если конвертировать польский текст в кириллицу, смогу ли я, внезапно, понимать его? Ну хоть на сколько-то понимать. Готового такого конвертера я нигде не нашел, ни на гитхабе ни в переводчиках типа Гугла. Пришлось написать самому.


Перевод и оригинал фразы вынесеной в начало статьи:

Поначалу рыцарь Джедай, под влиянием Дарта Сидиуса перешёл на тёмную сторону Силы и принял титул „Дарт Вэйдер”.

Początkowo rycerz Jedi, pod wpływem Dartha Sidiousa przeszedł na ciemną stronę Mocy i przyjął tytuł „Darth Vader”. (Wikipedia)

Мой уровень польского нулевой, правил чтения я не знал. При виде слов вроде przyjaciółka i towarzysz у меня наступала когнитивная перезагрузка.

В основном я опирался на статью Польский алфавит в Википедии. Цель была сделать текст интуитивно читаемым без всякой подготовки со стороны читателя. Но мне также хотелось сохранить прозрачность транскрипции, чтобы было понятно из какой буквы в латинице получилась та или иная буква в кириллице. В идеале мне хотелось сделать конвертер симметричным, то есть, чтобы можно было бы, в теории, конвертировать полученную кириллицу обратно в латиницу без потерь. Отсюда возникла необходимость сопровождать некоторые буквы диакритическими знаками, то есть закорючками сверху или снизу. При чтении их можно игнорировать, но при желании они могут дать читателю дополнительную информацию.

Быч в Рыме и не видзеч папежа.

Перевод и оригинал

Быть в Риме и не увидеть Папу.

Być w Rzymie i nie widzieć papieża.

Весь конвертор получился в 100 строк кода на JavaScript. (В следущий раз уложусь в положеные для подобных случаев 30). В основном код выглядит примерно так:

else if (item == 'S') {
  if (next == 'Z' || next == 'z') { o += 'Ш'; skip = true }
  else o += 'С'
}

Оказалось, что przyjaciółka i towarzysz можно записать на кириллице какпṗыяцӱл̥ка и товаṗыш, то есть в переводе приятельница и товарищ.

Возьмем, скажем, польское буквосочетание RZ , оно не имеет ничего общего с алгоритмами сжатия данных, читается, условнно-относительно, как русское Ж , и, при этом, лексически соответствует русской букве Р, что легко видно на слове rzeka, то есть река. Если транслировать RZ в Ж, то потеряется лексическое узнавание, как вам слово жека? а если в Р, то она будет не отличима от обычного R и потеряется фонетика. И как это отображать в кириллице? В итоге я решил использовать Р с точкой сверху . Аналогично были подобраны диакритические знаки для других случаев.

Трауматыччне̥ дзецињство и мл̥одоċч, страх, запровадзил̥ы Анакина на стронӭ зл̥а.

Перевод и оригинал

Трваматичное детство и молодость, страх, спровадили Анакина на сторону зла.

Traumatyczne dzieciństwo i młodość, strach, zaprowadziły Anakina na stronę zła. (Wikipedia)

Специально "запровадзил̥ы" перевожу как "спровадили", а не как "довели", для сохранения максимального интуитивного сходства с оригинальной лексикой и грамматикой.

Не буду разбирать все кейсы, но просто для примера: буква "ł" читается так: делаем губы будто хотим произнести "у" но произносим "в". Но лексически это родственник русской буквы "л", это видно на примере слов siła(сила), było(было), stało(стало), słuchaj (слушай), поэтому хотелось, чтобы буква выглядела как "л", но при этом было понятно, что произносится она, как минимум, с польским акцентом, поэтому был выбран такой вид с диакритиком "круг снизу", как "л̥". В итоге, в кириллице эти слова выглядят как сил̥а, был̥о, стал̥о, сл̥ухай, что, с одной стороны, облегчает их интуитивное узнавание, а с другой, сохраняет отличие от обычной "L/l".

Под конец жыця поврӧцил̥ на яснå стронӭ моцы и зе̥пхнåл̥ све̥го мистṗа до ре̥актора Гвязды Ċмерци ратуяц све̥го сына и тым самым пṗыврӧцил̥ рӧвновагӭ моцы.

Перевод и оригинал

Под конец жизни поворотился на ясную сторону Мощи и запинал своего мастера в реактор Звезды Смерти, спасая своего сына, и тем самым восстановил равновесие Мощи.

Опять же, более естественно для нас было бы сказать "обратился", а не "повротился", "светлая", а не "ясная", "Сила", а не "Мощь", но смысл передаётся почти без изменений даже почти полными кальками с польского.

Pod koniec życia powrócił na jasną stronę mocy i zepchnął swego mistrza do reaktora Gwiazdy Śmierci ratując swego syna i tym samym przywrócił równowagę mocy. (Wikipedia)

В свёртке исходный код функции которая получает польский текст на латинице и возвращает польский текст на кириллице. Код максимально и утрировано примитивен, не оптимизирован по скорости исполнения, не печёт пирожков, и, ни в коем случае, не является образцом правильного JavaScript. В нём нет комментариев, не поставлены точки с запятой и использованы var (запрещено на территории планеты Земля) вместо рекомендуемого const.

Функция конверсии на JavaScript, 100 строк
function pl_lat2cyr(txt) {
	var basic_p = 'ABDFGHKLMNOPTUWYZabdfghklmnoptuwyz'
  	+ 'ÓóŻżŃńĆ挜ŹźĄąĘęVv'
  var basic_r = 'АБДФГХКЛМНОПТУВЫЗабдфгхклмноптувыз'
  	+ 'ӦӧЖжЊњҸҹĊċӜӝÅåӬӭВв'
  var cons_p = 'BCDFGHJKLMNPRSTWZbcdfghjklmnprstwzŁłŻżŃńĆ挜Źź'
  var o = ''
  var skip = false
  
  for (var index = 0; index < txt.length; index++) {
    if (skip) {
      skip = false
      continue
    }
    var item = txt[index]
    var j = basic_p.indexOf(item)
    var next = txt[index + 1]

    if (next == null) next = ''
    if (j >= 0) {
      o += basic_r[j]
    }
    else if (item == 'Ł') { o += 'Л̥' } // Љљ
    else if (item == 'ł') { o += 'л̥' }
    else if (item == 'E') { o += 'Е̥' } // Ээ
    else if (item == 'e') { o += 'е̥' }
    else if (item == 'C') {
      if (next == 'Z' || next == 'z') { o += 'ч'; skip = true }
      else if (next == 'H' || next == 'h') { o += 'Х'; skip = true }
      else o += 'Ц'
    }
    else if (item == 'c') {
      if (next == 'Z' || next == 'z') { o += 'ч'; skip = true }
      else if (next == 'H' || next == 'h') { o += 'х'; skip = true }
      else o += 'ц'
    }

    else if (item == 'S') {
      if (next == 'Z' || next == 'z') { o += 'Ш'; skip = true }
      else o += 'С'
    }
    else if (item == 's') {
      if (next == 'Z' || next == 'z') { o += 'ш'; skip = true }
      else o += 'с'
    }

    else if (item == 'R') { //Ṗṗ
      if (next == 'Z' || next == 'z') { o += 'Ṗ'; skip = true }
      else o += 'Р'
    }
    else if (item == 'r') { //ṗҏ
      if (next == 'Z' || next == 'z') { o += 'ṗ'; skip = true }
      else o += 'р'
    }

    else if (item == 'I') {
      if (next == 'A' || next == 'a') { o += 'Я'; skip = true }
      else if (next == 'E' || next == 'e') { o += 'Е'; skip = true }
      else if (next == 'Ą' || next == 'ą') { o += 'Я'; skip = true }
      else if (next == 'Ę' || next == 'ę') { o += 'Ē'; skip = true }
      else if (next == 'Ó' || next == 'ó') { o += 'Ӱ'; skip = true }
      else if (next == 'U' || next == 'u') { o += 'Ю'; skip = true }
      else o += 'И'
    }
    else if (item == 'i') {
      if (next == 'A' || next == 'a') { o += 'я'; skip = true }
      else if (next == 'E' || next == 'e') { o += 'е'; skip = true }
      else if (next == 'Ą' || next == 'ą') { o += 'я'; skip = true }
      else if (next == 'Ę' || next == 'ę') { o += 'ē'; skip = true }
      else if (next == 'Ó' || next == 'ó') { o += 'ӱ'; skip = true }
      else if (next == 'U' || next == 'u') { o += 'ю'; skip = true }
      else o += 'и'
    }

    else if (item == 'J') {
      if (next == 'A' || next == 'a') { o += 'Я'; skip = true }
      else if (next == 'E' || next == 'e') { o += 'Е'; skip = true }
      else if (next == 'Ą' || next == 'ą') { o += 'Я'; skip = true }
      else if (next == 'Ę' || next == 'ę') { o += 'Ē'; skip = true }
      else if (next == 'Ó' || next == 'ó') { o += 'Ӱ'; skip = true }
      else if (next == 'U' || next == 'u') { o += 'Ю'; skip = true }
      else o += 'Й'
    }
    else if (item == 'j') {
      if (next == 'A' || next == 'a') { o += 'я'; skip = true }
      else if (next == 'E' || next == 'e') { o += 'е'; skip = true }
      else if (next == 'Ą' || next == 'ą') { o += 'я'; skip = true }
      else if (next == 'Ę' || next == 'ę') { o += 'ē'; skip = true }
      else if (next == 'Ó' || next == 'ó') { o += 'ӱ'; skip = true }
      else if (next == 'U' || next == 'u') { o += 'ю'; skip = true }
      else o += 'й'
    }

    else o += item;
  }

	return o
}

Если у вас есть идеи, как улучшить работу этой функции с точки зрения лингвистики и фонетики, пишите или делайте пул реквест. Ссылка в конце статьи.

Котлин – статычне тыпованы ēзык програмованя дзял̥аяцы на машыне виртуалне̥й Явы, ктӧры ест гл̥ӧвне розвияны пṗе̥з програмистӧв JetBrains. Назва ēзыка походзи од выспы Котлин недале̥ко Пе̥те̥рсбурга. Котлин ест запроектованы з мыċлå о пе̥л̥не̥й инте̥ропе̥рацыйноċци з ēзыками дзял̥аяцыми на машыне виртуалне̥й Явы.

Перевод и оригинал

Kotlin - статически типизированный язык программирования, работающий на виртуальной машине Java, который в основном разрабатывается разработчиками JetBrains. Название языка происходит от острова Котлин под Санкт-Петербургом. Kotlin разработан для полной совместимости с языками, работающими на виртуальной машине Java. (Google Translate)

Kotlin – statycznie typowany język programowania działający na maszynie wirtualnej Javy, który jest głównie rozwijany przez programistów JetBrains. Nazwa języka pochodzi od wyspy Kotlin niedaleko Petersburga. Kotlin jest zaprojektowany z myślą o pełnej interoperacyjności z językami działającymi na maszynie wirtualnej Javy. (Wikipedia)

В использовании латиницы есть одна особенность, практически невозможно, просто так, взять и отличить вставки на английском в польский текст, от самого польского текста. Отсюда, перлы вроде Еди, вместо Jedi или Дартх Ваде̥р, вместо Darth Vader. То есть, можно, конечно, их отличать программно, в теории, но для этого нужен словарь, как минимум, а то и какой-то грамматический искуственный интеллект, чтобы разбирать неочевидные случаи. Например, оказалось, что поляки пишут "online" прямо по-английски, а не "onlajn", как вроде бы надо по правилам фонетики польского языка.

Барбара Брылска (ур. 5 Червца 1941 в Скотниках) – полска акторка филмова. Една з найвыбитнейшых полских акторек повоенных. В латах 60. и 70. XX веку уходзила за сымбол сексбомбы полскего кина.

Перевод и оригинал

Барбара Брыльская (родилась 5 июня 1941 года в Скотниках) - польская киноактриса. Одна из самых ярких польских послевоенных актрис. В 1960-х и 1970-х годах она считалась символом секс-бомбы польского кино. (Google)

Barbara Brylska (ur. 5 czerwca 1941 w Skotnikach) – polska aktorka filmowa. Jedna z najwybitniejszych polskich aktorek powojennych. W latach 60. i 70. XX wieku uchodziła za symbol seksbomby polskiego kina. (Wikipedia)

Мне нравится это читать. Хотя, признаюсь, не имею понятия насколько это похоже на реальное польское произношение, или, вообще, на что это похоже.

В року 1983 фирма Atari впровадзила на рынек 2 улепшоне моделе компутера – Atari 600XL и 800XL

Перевод и оригинал

В 1983 году Atari выпустила две улучшенные модели компьютеров - Atari 600XL и 800XL. (Google)

W roku 1983 firma Atari wprowadziła na rynek 2 ulepszone modele komputera – Atari 600XL i 800XL (Wikipedia)

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

Чтобы установить расширение
FireFox

Зайти в дополнения/расширения, нажать на шестерёнку, потом Debug Add-on, потом Load Temporary Add-on, и выбрать папку со скачаным и распакованым расширением. У меня FireFox не локализован на русский язык, потому названия на английском.

Chrome

More Tools -> Extensions -> Developer mode -> Load unpacked.

У меня Chrome не локализован на русский язык, потому названия на английском.

Цемна стронэ Моцы - 1

Какие можно сделать выводы? Польский язык в кириллице не стал, внезапно, понятен без перевода, но, в тоже время степень понятности польского языка в кириллической форме меня удивила. Я совершенно не ожидал, что лексически и грамматически у меня будет такой коэффициент распознования.

Стоит заметить, что лично мне, восприятие польского на слух даётся так же трудно, как и чтение польского языка латиницей, но опять же, это потому, что мои познания в этом языке равны нулю. По крайне мере были равны нулю ещё вчера, а после нескольких часов чтения по-польски в кириллице, у меня начали возникать всякие семантические и ассоциативные связи, может быть, таким способом даже можно втянуться в обучение языку.

Пишите ваше мнение в комментах, насколько вы смогли уловить смысл фраз и незнакомых, но родственных лексических единиц, то есть, в основном, слов. Если вы знаете польский, белорусский, украинский или другой славянский язык, ваше мнение тоже очень интересно, наверное, вы будете воспринимать польский иначе.

А это скриншот сайта с которого и началась эта статья, именно туда меня занесло в самом начале и мне стало интересно прочитать текст, прямо по-польски, без перевода:

Цемна стронэ Моцы - 2

Дисклаймер: я не утверждаю, что данная работа чем-то полезна. Я не призываю никого отказываться от изучения или использования латинской транскрипции польского языка. Я не преследовал никаких целей кроме любопытства. Я не утверждаю, что мой конвертор делает всё правильно и соблюдает все правила и исключения, хотя я постарался максимально полно отразить фонетику польского языка опираясь на справочники и статьи. Если существуют другие способы записывать польский кириллицей -- я их не нашёл.

Исходный код конвертера и веб-расширение находятся тут

Использованые ссылки:
Darth Vader в польской Википедии
Barbara Brylska в польской Википедии
Польский алфавит в Википедии
Польский алфавит для начинающих на сайте nowlasnie.com
Символы Unicode в Википедии
Страничка про Atari в польской Википедии
Сообщение о новом мировом рекорде в сборке Кубика Рубика на speedcubing.pl

Автор: Яков Судейкин (Нивин)

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js