Языковая политика

Личные блоги => cetsalcoatle => Topic started by: cetsalcoatle on 31 December 2025, 01:01:40

Title: Транслитератор украинского
Post by: cetsalcoatle on 31 December 2025, 01:01:40
Code: [Select]
function translitUA(text) {
  const vowels = "аеєиіїоуюяАЕЄИІЇОУЮЯ";
  const isVowel = ch => vowels.includes(ch);

  const baseMap = {
    "а":"a","б":"b","в":"v","г":"h","ґ":"g","д":"d",
    "е":"e","ж":"ž","з":"z","и":"y","і":"i","й":"j",
    "к":"k","л":"l","м":"m","н":"n","о":"o","п":"p",
    "р":"r","с":"s","т":"t","у":"u","ф":"f","х":"x",
    "ц":"c","ч":"č","ш":"š","щ":"ś",
    "А":"A","Б":"B","В":"V","Г":"H","Ґ":"G","Д":"D",
    "Е":"E","Ж":"Ž","З":"Z","И":"Y","І":"I","Й":"J",
    "К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P",
    "Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"X",
    "Ц":"C","Ч":"Č","Ш":"Š","Щ":"Ś"
  };

  let result = "";
  let prevChar = "";

  for (let i = 0; i < text.length; i++) {
    const ch = text[i];
    const lower = ch.toLowerCase();

    // Ї — всегда ji
    if (lower === "ї") {
      result += (ch === "Ї") ? "Ji" : "ji";
    }

    // Я
    else if (lower === "я") {
      const out = (!prevChar || isVowel(prevChar)) ? "ja" : "ǎ";
      result += (ch === "Я") ? out.toUpperCase() : out;
    }

    // Є
    else if (lower === "є") {
      const out = (!prevChar || isVowel(prevChar)) ? "je" : "ě";
      result += (ch === "Є") ? out.toUpperCase() : out;
    }

    // Ю
    else if (lower === "ю") {
      const out = (!prevChar || isVowel(prevChar)) ? "ju" : "ǔ";
      result += (ch === "Ю") ? out.toUpperCase() : out;
    }

    // Йо / ьо
    else if (
      (lower === "о") &&
      (prevChar === "й" || prevChar === "ь" || prevChar === "Й" || prevChar === "Ь")
    ) {
      // уже обработали й / ь, заменяем o
      result += (!prevChar || isVowel(prevChar)) ? "o" : "ǒ";
    }

    // Мягкий знак
    else if (lower === "ь") {
      result += "í";
    }

    // Обычные буквы
    else if (baseMap[ch]) {
      result += baseMap[ch];
    }

    // Всё остальное
    else {
      result += ch;
    }

    prevChar = ch;
  }

  return result;
}
Интересно, оно работает? :what? У меня просто под рукой редактора кода нет. :dunno:
Title: Re: Транслитератор украинского
Post by: Upliner on 31 December 2025, 01:21:12
А что непонятно? Вроде даже прокомментировано адекватно.
Title: Re: Транслитератор украинского
Post by: cetsalcoatle on 31 December 2025, 01:41:57
А что непонятно? Вроде даже прокомментировано адекватно.
Да вроде всё понятно, просто это код сгенерированный GPT (и на мой непрофессиональный взгляд довольно классно), вопрос в том, можно ли его проверить без редактора кода?
Title: Re: Транслитератор украинского
Post by: Bhudh on 01 January 2026, 01:23:20
Это же JavaScript, открываете консоль браузера и проверяете.
Title: Re: Транслитератор украинского
Post by: Bhudh on 01 January 2026, 01:26:07
Оригинал:
Сучасні USB на ноутбуках стали більш енергоощадливі, через що бувають казуси, як-от проблема зі зовнішнім CD-приводом у мене. Вирішення дійсно одне: додаткове живлення, якщо конструкція передбачує.

Результат:
Quote from:
Sučasni USB na noutbukax staly bilíš enerhoośadlyvi, čerez śo buvajutí kazusy, ǎk-ot problema zi zovnišnim CD-pryvodom u mene. Vyrišennǎ dijsno odne: dodatkove žyvlennǎ, ǎkśo konstrukcija peredbačuje.
Title: Re: Транслитератор украинского
Post by: cetsalcoatle on 01 January 2026, 02:27:52
Оригинал:

Результат:
Спасибо! :up:
Чёт он косячит, должно было быть jak-ot и jakśo.
И в потоке í и i сливаются, возможно стоит "ь" обставить без изменений, но в целом мне нравится.
Title: Re: Транслитератор украинского
Post by: Квас on 01 January 2026, 12:58:57
(и на мой непрофессиональный взгляд довольно классно)
Я бы сказал - совсем не классно, по-джуниорски. :) Много бизнес-логики засунуто в самую низкоуровневую часть реализации (цепочка else if-ов внутри цикла с какими-то мутабельными переменными); много копипасты. Поэтому трудно понять, что делает алгоритм, и проблематично его поддерживать.

Технический момент: создавать строку с помощью += есть антипаттерн. Каждый промежуточный результат уходит в мусор, что означает квадратичный мусор. Когда строку создают из большого числа частей, их собирают в массив и применяют join.