Steven
Steven7 min čítania

Dodanie tridsiatich jazykov bez záchrannej siete

GeekBye v1.8.3 zapojil react-i18next a preložil celú aplikáciu do 30 jazykov. Časť s knižnicou bola rutina. Zaujímavé je to, čo chýbalo: žiadna kontrola parity kľúčov a žiadny extraktor reťazcov — tak natvrdo zadrátovaná angličtina presiakla, do produkcie sa dostal dánsky preklep a changelog sa nevedel zhodnúť, či aplikácia hovorí 28, 29 alebo 30 jazykmi.

Inžinierstvo
i18n
Desktop
Vydania GeekBye
Dodanie tridsiatich jazykov bez záchrannej siete

Niektoré vydania sú feature. GeekBye v1.8.3 vyzerá ako jedno z nich — „aplikácia teraz hovorí 30 jazykmi" — ale feature bola tá ľahká časť a nie je o nej tento post. Medzi 17. a 19. februárom 2026 dva pull requesty zapojili react-i18next do aplikácie, zrefaktorovali každý natvrdo zadrátovaný anglický reťazec na volanie prekladu a zbalili tridsať súborov lokalizácie. To je skutočná práca, ale je to ten druh práce, ktorý má knižnica z princípu robiť rutinou. Zaujímavé inžinierstvo je všetko, čo vydanie _ne_postavilo — záchranná sieť, ktorá by chytila to, čo vyexpedovalo pokazené.

Zapojenie bolo ľahkých 80%

Infraštruktúrny commit pridal react-i18next nad i18next a urobil konvenčnú vec: i18n/index.ts, ktorý volá initReactI18next, staticky importuje všetkých tridsať lokalizačných JSON-ov a registruje ich pod jedným objektom resources. Žiadne lenivé načítavanie — každý jazyk ide v bundli. Prekladové reťazce žijú v src/i18n/locales/*.json ako ploché mapy s bodkovými mennými priestormi: sidebar.meetings, startMeeting.start, jeden kľúč na jeden reťazec.

Migrácia z natvrdo zadrátovanej angličtiny na t('key') bola urobená poctivo, skupina komponentov za skupinou, a celý ten prechod sa dá vyčítať z logu commitov: najprv bočný panel, navigácia a chat; potom nastavenia, login a onboarding; potom stretnutia, dashboard, toasty a tooltipy navbaru. Každý commit nahradil dávku doslovných reťazcov volaniami prekladu. Dvadsaťdeväť neanglických súborov pristálo v jednom commite — deväťtisícriadkový výsyp, ktorý preložil anglický zdroj do všetkého od bulharčiny po vietnamčinu.

Nič z toho nie je ťažké spraviť správne, lebo spraviť to zle je hlučné: chýbajúci provider spadne, pokazený JSON sa neparsuje, zlý import zlomí build. Knižnica ti dáva zábradlia pre mechanické chyby. Čo ti nedáva, je zábradlie pre chybu, ktorá sa naozaj stala.

Tri nastavenia jazyka a prečo je to správne

Než sa dostaneme k tomu, čo sa pokazilo, jedna vec, ktorú v1.8.3 spravil presne správne, lebo je to rozlíšenie, ktoré veľa aplikácií splošťuje, a nemalo by. Po tomto vydaní má GeekBye tri nezávislé nastavenia jazyka:

  • Jazyk odpovedí AI (output_language) — v akom jazyku odpovedá asistent. Najstaršie z troch, z novembra 2025.
  • Jazyk transkripcie (transcriptLanguage) — do akého jazyka rečový engine prepisuje tvoj mikrofón. Zapojený o pár vydaní skôr, vo v1.7.6.
  • Jazyk aplikácie (app_language) — jazyk tlačidiel, menu a onboardingu. Novinka vo v1.8.3.

Sú to naozaj rôzne osi. Vývojár v Berlíne môže chcieť nemecké rozhranie, anglické odpovede AI (lebo to je jazyk dokumentácie, ktorú vkladá) a anglickú transkripciu (lebo stretnutie je po anglicky). Zlúčiť to do jedného nastavenia „jazyk" by bolo pre toho človeka nesprávne a krok onboardingu pridaný v tomto vydaní predkladá všetky tri ako samostatné rozbaľovacie zoznamy presne z toho dôvodu.

Pekný detail je cesta aktualizácie. Jednorazová migrácia skopíruje output_language každého existujúceho používateľa do nového kľúča app_language pri prvom spustení po aktualizácii a provider rozlišuje jazyk cez reťaz fallbackov — app_language, potom output_language, potom 'en'. Takže používatelia, ktorí už aplikácii povedali, že chcú španielske odpovede AI, sa zobudili do španielskeho rozhrania namiesto toho, aby boli resetovaní na angličtinu a nútení loviť to nastavenie. Zasiať nové nastavenie zo spríbuzneného starého je malá láskavosť, ktorá stojí jednu migráciu a ušetrí každému, kto aktualizuje, drobné pichnutie.

Prekreslenie onboardingu, ktoré nechcelo

Je tu jeden skutočný bug, ktorý stojí za vytiahnutie z i18n práce, lebo je to pasca Reactu, do ktorej narazí každý, kto robí prepínanie jazyka za behu. Sprievodca onboardingom stavia časť svojich zoznamov možností vnútri useMemo. Keď zmeníš jazyk na samom kroku výberu jazyka, rozhranie sa má okamžite prekresliť v novom jazyku — a nerobilo to, lebo t nebolo v poli závislostí memo. Prekladová funkcia mení identitu, keď sa zmení jazyk; ak je tvoja memoizovaná hodnota postavená z t, ale od neho nezávisí, React ti veselo podá zastaranú verziu v predošlom jazyku. Oprava sa v logu objaví dvakrát — raz pre sprievodcu, raz pre rozbaľovací zoznam v nastaveniach — čo ti hovorí, že je to ten druh chyby, ktorú robíš na každom mieste, kde memoizuješ preložený obsah, kým sa nenaučíš vždy uviesť t.

Onboarding niesol aj vrásku, ktorú changelog nespomína: keďže toto je white-label kódová báza, sú dva stromy onboardingu na preklad — sprievodca GeekBye a sprievodca Pavleur — žijúce pod paralelnými mennými priestormi kľúčov onboarding.* a onboarding.pavleur.*. Každý reťazec onboardingu bol preložený dvakrát, do dvoch hlasov značky, vo všetkých dvadsiatich deviatich jazykoch.

Čo build nevedel, že mu chýba

Tu je časť, ktorá z toho robí lekciu namiesto checklistu. v1.8.3 nemal žiadny automatický spôsob, ako extrahovať natvrdo zadrátované reťazce, ani CI kontrolu parity kľúčov naprieč lokalizáciami. Takže definíciou „hotovo" bolo „niekto navštívil komponenty, ktoré si pamätal, a obalil reťazce, ktoré videl". Táto definícia presakuje.

Dva týždne po vydaní pristál upratovací commit so správou „translate all hardcoded English strings across 10 components into 30 languages." Desať komponentov — formulár na nahlásenie problému, karty súhrnu a metrík, karta reportu, obsah transkriptu a chatu, výzva o limite používania, správy chatu, tlačidlo kopírovania kódu, plávajúce akčné tlačidlá — vyexpedovalo vo v1.8.3 stále hovoriac ku každému po anglicky, v každom jazyku. Nikomu build nespadol. Žiadny test nesčervenel. Nemecký používateľ jednoducho videl angličtinu v karte reportu a jediným detektorom bol človek, ktorý sa na to napokon pozrel.

Tá istá neprítomnosť vyprodukovala menšie trápnosti. Dánsky preklad vyexpedoval s nesprávnym slovom — Luk application helt namiesto Luk applikationen helt — a bol opravený v neskoršom vydaní, lebo nebola brána rodeného recenzenta ani spôsob, ako to mal pipeline vedieť. Kľúče „zavrieť aplikáciu" chýbali v úvodnej dávke a boli doplnené o dni neskôr. A každá jediná feature, ktorá vyexpedovala potom — preset modifikačných klávesov, stlmenie mikrofónu, čipy súhrnu, priehľadnosť prekrytia — ťahala za sebou vlastný commit „prelož nové kľúče do 29 lokalít", navždy, lebo nič nepresadzovalo invariant automaticky.

Neporiadok sa dá dokonca zmerať v správach commitov. Tie isté tridsať súborov lokalizácie sú opisované, vydanie za vydaním, ako „30 jazykov", „29 jazykov" a — v jednom commite — „28 lokalít". Nič sa nepridalo ani neubralo; je tridsať súborov pri každom tagu od v1.8.3 po v2. Číslo kolíše, lebo nebol jediný zdroj pravdy o tom, „koľko jazykov dodávame", takže každý autor commitu rátal ručne, niekedy zarátajúc angličtinu ako jazyk a niekedy ako zdroj. Changelog, ktorý si nevie udržať vlastný počet stabilný, je malý, poctivý signál, že vec, ktorú opisuje, nepresadzuje stroj.

Mína pluralizácie

Ešte jedna vec hodná označenia, nie preto, že sa pokazila hlučne, ale preto, že je to ten druh bugu, ktorý toto nastavenie pozýva a pred ktorým ťa nevaruje. Pluralizácia v týchto súboroch lokalizácie sa robí ručne, párovými kľúčmi: meetings.meetingCount a meetings.meetingCountPlural, profiles.filesAttached a filesAttachedPlural. To je čisté anglické rozdelenie jednotné/množné. Je tiež nesprávne pre kus jazykov, ktoré aplikácia teraz tvrdí, že podporuje. Ruština, poľština a čeština majú tri alebo štyri tvary množného čísla podľa čísla — „1 súbor", „2 súbory", „5 súborov" a „21 súborov" môžu brať rôzne koncovky slov. Schéma dvoch kľúčov jednotné/množné to nevie vyjadriť, takže tie počty sa renderujú gramaticky krivo. i18next má naozajstný mechanizmus množného čísla presne na toto; ručné páry ho obchádzajú a žiadny commit tú medzeru nepriznáva. Je to pluralizačný ekvivalent úniku natvrdo zadrátovaných reťazcov: neviditeľný pre build, viditeľný len pre rodeného hovoriaceho.

Tri veci, ktoré nás toto vydanie naučilo

  1. Knižnica je ľahkých 80%; nástroje sú ťažkých 20%. Zapojiť react-i18next a hromadne preložiť reťazce je vyriešený problém. Držať tridsať súborov v parite navždy nie je — a potrebuje extraktor natvrdo zadrátovaných reťazcov a CI kontrolu chýbajúcich kľúčov, ani jeden z ktorých ti knižnica nedodá. Postav ich skôr, než vyhlásiš „plné i18n", inak si vyhlásil invariant, ktorý nemáš ako udržať.
  2. Rozdeľ nastavenia jazyka, ktoré sú naozaj rôzne. Jazyk rozhrania, jazyk transkripcie a jazyk odpovedí AI sú tri osi a v1.8.3 mal pravdu, že dal každej vlastný kľúč — a ešte väčšiu pravdu, že zasial nové zo spríbuzneného starého cez migráciu, takže aktualizácia používateľov nič nestála.
  3. Počet v tvojom changelogu je metrika disciplíny. Keď je ten istý set súborov 28, 29 a 30 jazykov naprieč tromi commitmi, problém nie je číslo — je to chýbajúci zdroj pravdy. Ak stroj neráta tvoje jazyky, nikto ich neráta dvakrát rovnako.

Pre predchádzajúcu kapitolu príbehu v1 — prepracovanie dashboardu okolo jedného vlnového grafu (v1.8.2); a pre celý oblúk — anatómiu dodávania softvéru do dokonalosti.