Devlog #82 – Polska lokalizacja, faza 1: 89 nowych stron, trójstanowy przełącznik języków i mapa witryny z 2247 adresami URL

MySimulator jest dwujęzyczny (EN + UK) od wersji v1.0. W wersji v1.1.8 po cichu dodaliśmy trzecią lokalizację: PL. Pakiet obejmuje 89 nowych polskich stron — stronę główną z rozszerzonym znacznikiem FAQPage, sortowalny hub kategorii i 80 stron kategorii — a także kuratorskie tłumaczenia titlePl + descriptionPl wbudowane w warstwę danych, trójstanowy pasek nawigacji z cyklem EN → UK → PL oraz hreflang="pl" wbudowany w 174 istniejące strony. Mapa witryny urosła z 2158 do 2247 adresów URL.

v1.1.8 — PL faza 1 (wydanie infrastrukturalne)
89
Nowych stron PL
80
Przetłumaczonych kategorii
174
Aktualizacji hreflang
2247
Adresów URL w mapie witryny

Dlaczego polski i dlaczego właśnie teraz?

Witryna ma sporą polską publiczność czytającą wersję angielską (Google Search Console pokazuje pl-PL na 5. miejscu wśród krajów pod względem wyświetleń), a polska terminologia naukowa ma dobrze ugruntowane konwencje akademickie, które tłumaczenie maszynowe zazwyczaj wypacza („Inżynieria Materiałowa”, a nie „Inżynieria Materiałów”; „Dynamika Płynów”, a nie „Dynamika Cieczy”). Wykonanie tego jako jednego wydania infrastrukturalnego, zamiast rozpraszania tłumaczeń po cotygodniowych falach, utrzymuje warstwę lokalizacji chirurgicznie czystą.

Co faktycznie obejmuje „faza 1”

Faza 1 to warstwa punktów wejścia — każda strona, na którą polski czytelnik prawdopodobnie trafi z wyszukiwania organicznego:

Faza 1 celowo nie tłumaczy 559 stron symulacji ani 295 artykułów. Będzie to zadanie fazy 2 (plan na Q3 2026), ponieważ wartość tłumaczenia na stronę dla punktu wejścia („Fizyka kwantowa”) jest dużo wyższa niż tłumaczenie jednej konkretnej, niszowej symulacji („protokół BB84”).

Warstwa tłumaczeń

Tłumaczenia żyją w danych, nie w szablonach. Każdy wiersz w shared/data/categories.json ma teraz dwa dodatkowe pola obok swoich ukraińskich odpowiedników:

{
  "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."
}

Tłumaczenia są kuratorskie, nie generowane maszynowo. Mała próbka decyzji, które miały znaczenie:

ID kategoriiAngielskiPolski (wybrany)Dlaczego nie dosłowne MT
materials-scienceMaterials ScienceInżynieria MateriałowaPolska akademia stosuje ujęcie inżynierskie dla tej dziedziny; „Materiałoznawstwo” istnieje, ale jest przestarzałe.
fluid-dynamicsFluid DynamicsDynamika Płynów„Płyny” obejmuje zarówno ciecze, jak i gazy; „Cieczy” wykluczałoby gazy.
chronobiologyChronobiologyChronobiologiaBezpośrednie zapożyczenie; „Biologia rytmów” zaciemniałaby nazwę dziedziny.
networksNetworksSieciSamo „Sieci”, a nie „Sieci komputerowe”, bo kategoria obejmuje też sieci społeczne/biologiczne/transportowe.
perceptionPerceptionPercepcjaZarówno „Percepcja”, jak i „Postrzeganie” działają; „Percepcja” to termin z podręczników kognitywistyki.
game-mathGame MathMatematyka GierDopełniacz („Matematyka Gier”) to naturalne złożenie, a nie „Matematyka Gra”.

Trójstanowy przełącznik w pasku nawigacji

Przed v1.1.8 przełącznik języka w pasku nawigacji był pojedynczym przyciskiem przełączającym EN ↔ UK na podstawie bieżącej ścieżki. Dodanie trzeciej lokalizacji wymusiło decyzję projektową: rozwijana lista, trzy pigułki czy cykl? Wygrał cykl — ten sam pojedynczy przycisk, ale teraz przechodzący EN → UK → PL → EN przy każdym kliknięciu. Dwa powody:

Cykl jest przechylony w stronę EN, bo to najpełniejsza lokalizacja — jeśli przewiniesz obok swojego celu, jedno kolejne kliknięcie prowadzi do EN, gdzie strona zawsze istnieje.

// 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;
}

Chirurgia hreflang na 174 istniejących stronach

Dodanie trzeciej lokalizacji to nie tylko tworzenie nowych plików; każda istniejąca strona EN i UK, która ma polskiego bliźniaka, potrzebuje <link rel="alternate" hreflang="pl"> w swoim head, inaczej Google nie połączy klastra. Skrypt add_pl_hreflang.js:

  1. Przechodzi przez indeks główny, indeks UK, hub kategorii, wszystkie 80 kategorii EN + 80 UK oraz 14 par stron statycznych.
  2. Wykrywa istniejące znaczniki hreflang="pl" i pomija, jeśli są już poprawne.
  3. Usuwa wszelkie błędne znaczniki PL (np. wskazujące na niewłaściwy cel).
  4. Wstawia nowy znacznik zaraz po hreflang="uk", jeśli obecny, z powrotem do wstawienia po hreflang="en", z powrotem do wstawienia przed </head>.

Idempotentny z założenia: uruchomienie dwukrotnie nie zmienia żadnego pliku. Zaktualizowano 174 strony, 0 już poprawnych (pierwsze uruchomienie), 4 pliki brakujące (to były bliźniacy UK, którzy nigdy nie istnieli dla niektórych stron statycznych).

Mapa witryny: 2158 → 2247 adresów URL

scripts/gen_sitemap.js automatycznie podchwycił PL, bo istniejąca pętla dla każdej lokalizacji sprawdza teraz pl/<path>/index.html obok wariantów EN i UK. Każdy wpis URL ma towarzyszący <xhtml:link rel="alternate" hreflang="pl">, gdy polski bliźniak istnieje.

Adresy URL PL są emitowane z priorytetem o 0,05–0,10 niższym niż ich odpowiedniki EN (więc 0,8 dla kategorii PL wobec 0,9 EN) jako miękki sygnał, że lokalizacja jest zaślepką fazy 1. Pięć podmap witryny daje teraz łącznie 2247 adresów URL: sitemap_categories.xml (240, +80), sitemap_sims.xml (1118), sitemap_articles.xml (555), sitemap_blog.xml (224), sitemap_static.xml (28, +6).

FAQPage jako akcelerator wyników wyszukiwania

Rozszerzone wyniki FAQPage w języku polskim pozostają relatywnie niedowykorzystane dla zapytań naukowo-edukacyjnych, co czyni je dobrym wczesnym zakładem dla fazy 1. Polska strona główna ma 8 wpisów FAQ obejmujących pytania, które pojawiają się w mailach wsparcia i na Discordzie: „Czy trzeba coś instalować?”, „Czy te symulacje są naukowo poprawne?”, „Czy mogę używać symulacji w szkole?”. Każda odpowiedź liczy 100–300 słów, aby przejść próg jakości Google; razem stanowią najbardziej czytelny pojedynczy dokument o tym, do czego służy MySimulator, w dowolnym języku.

Co odłożono do fazy 2 (Q3 2026)

Kolejność wpływu (szacowana na podstawie współczynników konwersji EN→UK faza 1→2): strony symulacji dają 5–10× większy wolumen kliknięć niż strony kategorii, artykuły dają 2–3× więcej (dłuższy czas przebywania, mniej odrzuceń), a strony tagów wypełniają długi ogon.

Zmienione pliki

Pięć nowych skryptów wystarczyło, aby przeprowadzić całe wydanie; wszystko inne jest generowane:

Uruchomienie node scripts/add_pl_translations.js && node scripts/gen_pl_pages.js && node scripts/add_pl_hreflang.js && node scripts/gen_sitemap.js odtwarza całe wydanie wyłącznie z warstwy danych.

Co dalej

Fala 62 wraca do symulacji w przyszłym tygodniu — prawdopodobnie dynamika płynów i mechanika statystyczna. Przygotowania do fazy 2 PL (aktualizacja indeksu wyszukiwania, narzędzia do tłumaczenia symulacji) będą przebiegać cicho, równolegle; spodziewajcie się, że faza 2 wyląduje mniej więcej na granicy Q3 2026.

← Devlog #81: Fala 61 Wszystkie wpisy →