Девлог #82 – Польська локалізація, фаза 1: 89 нових сторінок, трипозиційний перемикач мов і карта сайту з 2247 URL-адрес

MySimulator двомовний (EN + UK) з версії v1.0. У v1.1.8 ми тихо додали третю локаль: PL. Пакет складається з 89 нових польських сторінок — головної з розміткою розширеного сніпета FAQPage, сортованого хабу категорій та 80 сторінок категорій — плюс кураторські переклади titlePl + descriptionPl, вбудовані в шар даних, трипозиційний навбар з циклом EN → UK → PL, та hreflang="pl", вбудований у 174 наявні сторінки. Карта сайту зросла з 2158 до 2247 URL-адрес.

v1.1.8 — PL фаза 1 (реліз інфраструктури)
89
Нових сторінок PL
80
Перекладених категорій
174
Оновлень hreflang
2247
URL-адрес у карті сайту

Чому польська і чому саме зараз?

Сайт має чималу польську аудиторію, що читає англійську версію (Google Search Console показує pl-PL на 5-му місці за кількістю показів серед країн), а польська наукова термінологія має добре усталені академічні конвенції, які машинний переклад часто спотворює («Inżynieria Materiałowa», а не «Inżynieria Materiałów»; «Dynamika Płynów», а не «Dynamika Cieczy»). Виконання цього як єдиного інфраструктурного релізу, а не розсіювання перекладів по щотижневих хвилях, зберігає шар локалі хірургічно чистим.

Що насправді охоплює «фаза 1»

Фаза 1 — це шар точок входу — кожна сторінка, на яку польський читач, ймовірно, потрапить з органічного пошуку:

Фаза 1 свідомо не перекладає 559 сторінок симуляцій чи 295 статей. Це буде зусиллям фази 2 (план на Q3 2026), тому що цінність перекладу на сторінку для точки входу («Fizyka kwantowa») набагато вища, ніж переклад однієї конкретної нішевої симуляції («протокол BB84»).

Шар перекладу

Переклади живуть у даних, а не в шаблонах. Кожен рядок у shared/data/categories.json тепер має два додаткових поля поруч зі своїми українськими відповідниками:

{
  "id": "fluid-dynamics",
  "title": "Fluid Dynamics",
  "titleUk": "Гідродинаміка",
  "titlePl": "Dynamika Płynów",
  "description": "SPH, MPM, Navier-Stokes equations...",
  "descriptionUk": "SPH, MPM, рівняння Нав'є-Стокса...",
  "descriptionPl": "SPH, MPM, równania Naviera-Stokesa, fale strzemienne, turbulencja."
}

Переклади кураторські, а не машинно згенеровані. Невеликий приклад рішень, які мали значення:

ID категоріїАнглійськаПольська (обрано)Чому не буквальний МП
materials-scienceMaterials ScienceInżynieria MateriałowaПольська академічна спільнота використовує інженерне формулювання для цієї галузі; «Materiałoznawstwo» існує, але застаріле.
fluid-dynamicsFluid DynamicsDynamika Płynów«Płyny» охоплює як рідини, так і гази; «Cieczy» виключило б гази.
chronobiologyChronobiologyChronobiologiaПряме запозичення; «Biologia rytmów» затуманило б назву галузі.
networksNetworksSieciПросте «Sieci», а не «Sieci komputerowe», тому що категорія охоплює також соціальні/біологічні/транспортні мережі.
perceptionPerceptionPercepcjaОбидва варіанти, «Percepcja» і «Postrzeganie», підходять; «Percepcja» — термін у підручниках з когнітивних наук.
game-mathGame MathMatematyka GierРодовий відмінок («Matematyka Gier») — природний складений термін, а не «Matematyka Gra».

Трипозиційний перемикач у навбарі

До v1.1.8 перемикач мов у навбарі був однією кнопкою, що перемикала EN ↔ UK на основі поточного шляху. Додавання третьої локалі змусило зробити вибір дизайну: випадаючий список, три пігулки чи цикл? Переміг цикл — та сама одна кнопка, але тепер вона проходить EN → UK → PL → EN при кожному кліку. Дві причини:

Цикл зміщений у бік EN, тому що це найповніша локаль — якщо ви прокрутите повз свою ціль, ще один клік приводить до EN, де сторінка завжди присутня.

// shared/components.js
function getLangHrefs() {
  const rootUrl = new URL(_base || "./", window.location.href).href;
  const noLang = currRelPath.replace(/^(uk|pl)\//, "");
  const hrefs = {
    en: rootUrl + noLang,
    uk: rootUrl + "uk/" + noLang,
    pl: rootUrl + "pl/" + noLang,
  };
  const cycle = { en: "uk", uk: "pl", pl: "en" };
  hrefs.next = hrefs[cycle[_lang] || "uk"];
  return hrefs;
}

Хірургія hreflang на 174 наявних сторінках

Додавання третьої локалі — це не лише створення нових файлів; кожна наявна сторінка EN та UK, яка має польського близнюка, потребує <link rel="alternate" hreflang="pl"> у своєму head, інакше Google не зв'яже кластер. Скрипт add_pl_hreflang.js:

  1. Проходить по кореневому індексу, індексу UK, хабу категорій, усіх 80 категоріях EN + 80 UK та 14 парах статичних сторінок.
  2. Виявляє наявні теги hreflang="pl" і пропускає, якщо вже коректні.
  3. Видаляє будь-які неправильні теги PL (наприклад, що вказують на неправильну ціль).
  4. Вставляє новий тег одразу після hreflang="uk", якщо присутній, з поверненням до вставки після hreflang="en", з поверненням до вставки перед </head>.

Ідемпотентний за побудовою: запуск двічі не змінює жодного файлу. Оновлено 174 сторінки, 0 уже коректних (перший запуск), 4 файли відсутні (це були близнюки UK, яких ніколи не існувало для деяких статичних сторінок).

Карта сайту: 2158 → 2247 URL-адрес

scripts/gen_sitemap.js автоматично підхопив PL, тому що наявний цикл для кожної локалі тепер перевіряє pl/<path>/index.html на додачу до варіантів EN та UK. Кожен запис URL має супутній <xhtml:link rel="alternate" hreflang="pl">, коли польський близнюк існує.

URL-адреси PL видаються з пріоритетом на 0.05-0.10 нижчим за їхні відповідники EN (тож 0.8 для категорії PL проти 0.9 EN) як м'який сигнал того, що локаль — заглушка фази 1. П'ять підкарт сайту тепер загалом дають 2247 URL-адрес: sitemap_categories.xml (240, +80), sitemap_sims.xml (1118), sitemap_articles.xml (555), sitemap_blog.xml (224), sitemap_static.xml (28, +6).

FAQPage як прискорювач результатів пошуку

Розширені сніпети FAQPage польською мовою залишаються відносно недовикористаними для науково-освітніх запитів, що робить їх хорошою раннею ставкою для фази 1. Польська головна сторінка має 8 записів FAQ, що охоплюють питання, які виникають у листах підтримки й Discord: «Czy trzeba coś instalować?», «Czy te symulacje są naukowo poprawne?», «Czy mogę używać symulacji w szkole?». Кожна відповідь займає 100-300 слів, щоб пройти поріг якості Google; разом вони — найбільш читабельний єдиний документ про призначення MySimulator, будь-якою мовою.

Що відкладено до фази 2 (Q3 2026)

Порядок впливу (оцінений за коефіцієнтами конверсії EN→UK фаза 1→2): сторінки симуляцій дають у 5-10 разів більший обсяг кліків, ніж сторінки категорій, статті дають у 2-3 рази більше (довше перебування, менше відмов), а сторінки тегів заповнюють довгий хвіст.

Зачеплені файли

П'яти нових скриптів було достатньо, щоб провести весь реліз; усе решта генерується:

Запуск node scripts/add_pl_translations.js && node scripts/gen_pl_pages.js && node scripts/add_pl_hreflang.js && node scripts/gen_sitemap.js відтворює весь реліз лише з шару даних.

Що далі

Хвиля 62 повертається до симуляцій наступного тижня — ймовірно, гідродинаміка й статистична механіка. Підготовка до фази 2 PL (оновлення пошукового індексу, інструментарій перекладу симуляцій) відбуватиметься тихо паралельно; очікуйте, що фаза 2 приземлиться приблизно на межі Q3 2026.

← Девлог #81: Хвиля 61 Усі дописи →