
Trīsdesmit valodu piegāde bez drošības tīkla
GeekBye v1.8.3 pieslēdza react-i18next un iztulkoja visu lietotni 30 valodās. Bibliotēkas daļa bija rutīna. Interesantākais ir tas, kā trūka: nebija atslēgu paritātes pārbaudes un nebija virkņu ekstraktora — tāpēc cietkodēts angļu teksts izslīdēja cauri, dāņu drukas kļūda tika piegādāta, un izmaiņu žurnāls nespēja vienoties, vai lietotne runā 28, 29 vai 30 valodās.
Daži laidieni ir funkcija. GeekBye v1.8.3 izskatās pēc tādas — "lietotne tagad runā 30 valodās" — bet funkcija bija vieglā daļa, un šis raksts nav par to. Laikā no 2026. gada 17. līdz 19. februārim divi pull request pieslēdza lietotnei react-i18next, pārrakstīja katru cietkodēto angļu virkni par tulkojuma izsaukumu un iepakoja trīsdesmit lokalizācijas failus. Tas ir īsts darbs, bet tāda veida darbs, ko bibliotēka ir radīta padarīt par rutīnu. Interesantā inženierija ir viss, ko laidiens neuzbūvēja — drošības tīkls, kas būtu noķēris to, ko tas piegādāja salauztu.
Pieslēgšana bija vieglie 80%
Infrastruktūras komits pievienoja react-i18next virs i18next un izdarīja konvencionālo: i18n/index.ts, kas izsauc initReactI18next, statiski importē visus trīsdesmit lokalizācijas JSON failus un reģistrē tos zem viena resources objekta. Nekādas slinkās ielādes — katra valoda tiek piegādāta komplektā. Tulkojuma virknes dzīvo src/i18n/locales/*.json kā plakanas, ar punktiem nošķirtas kartes: sidebar.meetings, startMeeting.start, viena atslēga uz vienu virkni.
Migrācija no cietkodētā angļu teksta uz t('key') tika izdarīta godīgi, pa komponentu grupai vienu pēc otras, un šo secību var izlasīt komitu žurnālā: vispirms sānjosla, navigācija un tērzēšana; tad iestatījumi, pieslēgšanās un onboarding; tad tikšanās, panelis, uznirstošie paziņojumi un navbar rīku padomi. Katrs komits aizstāja partiju burtisku virkņu ar tulkojuma izsaukumiem. Divdesmit deviņi ne-angļu faili nolaidās vienā komitā — deviņu tūkstošu rindu piliens, kas iztulkoja angļu avotu visā, no bulgāru līdz vjetnamiešu valodai.
Neko no tā nav grūti izdarīt pareizi, jo izdarīt to nepareizi ir skaļi: trūkstošs provider izraisa avāriju, nepareizi noformēts JSON netiek parsēts, slikts imports salauž būvējumu. Bibliotēka dod tev aizsargmargas mehāniskajām kļūdām. Ko tā tev nedod, ir aizsargmarga kļūdai, kas patiešām notika.
Trīs valodu iestatījumi, un kāpēc tas ir pareizi
Pirms nonākam pie tā, kas salūza, viena lieta, ko v1.8.3 izdarīja pilnīgi pareizi, jo tā ir atšķirība, ko daudzas lietotnes saplacina, lai gan nevajadzētu. Pēc šī laidiena GeekBye ir trīs neatkarīgi valodu iestatījumi:
- AI atbildes valoda (
output_language) — valoda, kurā asistents atbild. Vecākais no trim, no 2025. gada novembra. - Transkripta valoda (
transcriptLanguage) — valoda, kurā runas dzinis transkribē tavu mikrofonu. Ieviesta pāris laidienus agrāk, v1.7.6. - Lietotnes valoda (
app_language) — pogu, izvēļņu un onboarding valoda. Jauna v1.8.3.
Tās ir patiešām atšķirīgas asis. Izstrādātājs Berlīnē varētu vēlēties vācisku saskarni, angliskas AI atbildes (jo tā ir valoda dokumentācijai, ko viņš ielīmē) un anglisku transkripciju (jo tikšanās notiek angliski). Šo salikšana vienā "valodas" iestatījumā būtu nepareiza šai personai, un onboarding solis, kas pievienots šajā laidienā, tieši šī iemesla dēļ parāda visus trīs kā atsevišķas nolaižamās izvēlnes.
Jaukais pieskāriens ir jaunināšanas ceļš. Vienreizēja migrācija pirmajā palaišanā pēc atjaunināšanas kopē katra esošā lietotāja output_language jaunajā app_language atslēgā, un provider atrisina valodu caur atkāpšanās ķēdi — app_language, tad output_language, tad 'en'. Tāpēc lietotāji, kas jau bija pateikuši lietotnei, ka vēlas spāniskas AI atbildes, pamodās spāniskā saskarnē, tā vietā, lai tiktu atiestatīti uz angļu valodu un spiesti meklēt iestatījumu. Jaunas preferences sēšana no radniecīgas vecās ir maza laipnība, kas maksā vienu migrāciju un ietaupa katram jaunotājam sīku kairinājumu.
Onboarding pārzīmēšana, kas atteicās notikt
Ir viena īsta kļūda, ko vērts izcelt no i18n darba, jo tā ir React lamatas, kurās iekritīs ikviens, kas veic valodas pārslēgšanu izpildlaikā. Onboarding vednis dažus savus opciju sarakstus veido useMemo iekšpusē. Kad tu maini valodu pašā valodas solī, saskarnei vajadzētu nekavējoties pārzīmēties jaunajā valodā — un tā nedarīja, jo t nebija memo atkarību masīvā. Tulkojuma funkcija maina savu identitāti, kad mainās valoda; ja tava memoizētā vērtība ir veidota no t, bet nav no tā atkarīga, React laipni pasniedz tev novecojušo, iepriekšējās valodas versiju. Labojums žurnālā parādās divreiz — reizi vednim, reizi iestatījumu nolaižamajam sarakstam — kas pasaka, ka tā ir tāda veida kļūda, ko tu izdari katrā vietā, kur memoizē tulkoto saturu, kamēr iemācies vienmēr uzskaitīt t.
Onboardingam bija arī sarežģījums, ko izmaiņu žurnāls nepiemin: tā kā šī ir vairākzīmolu koda bāze, ir divi onboarding koki, kas jātulko — GeekBye vednis un Pavleur vednis — kas dzīvo zem paralēlām onboarding.* un onboarding.pavleur.* atslēgu telpām. Katra onboarding virkne tika iztulkota divreiz, divās zīmolu balsīs, visās divdesmit deviņās valodās.
Ko būvējums nezināja, ka tam trūkst
Lūk, daļa, kas padara šo par mācību, nevis kontrolsarakstu. v1.8.3 nebija automatizēta veida, kā izvilkt cietkodētās virknes, un nebija CI pārbaudes atslēgu paritātei starp lokalizācijām. Tāpēc "pabeigts" definīcija bija "kāds apmeklēja komponentus, ko atcerējās, un ietina virknes, ko redzēja." Šī definīcija ir caura.
Divas nedēļas pēc laidiena nolaidās sakopšanas komits ar ziņojumu "translate all hardcoded English strings across 10 components into 30 languages." Desmit komponenti — problēmu ziņošanas forma, kopsavilkuma un metriku cilnes, atskaites cilne, transkripta un tērzēšanas saturs, lietojuma limita uzvedne, tērzēšanas ziņas, koda kopēšanas poga, peldošās darbību pogas — bija piegādāti v1.8.3, joprojām runājot ar visiem angliski, katrā valodā. Neviena būvējums nesalūza. Neviens tests nekļuva sarkans. Vācu lietotājs vienkārši redzēja angļu valodu atskaites cilnē, un vienīgais detektors bija cilvēks, kas galu galā uz to paskatījās.
Tā pati prombūtne radīja mazākos apkaunojumus. Dāņu tulkojums tika piegādāts ar nepareizu vārdu — Luk application helt Luk applikationen helt vietā — un tika izlabots vēlākā laidienā, jo nebija dzimtās valodas recenzenta vārtu un nebija veida, kā cauruļvadam to zināt. "Quit app" atslēgas trūka sākotnējā partijā un tika aizpildītas dienas vēlāk. Un katra atsevišķā funkcija, kas tika piegādāta pēc tam — modifikatora taustiņu iestatījums, mikrofona izslēgšana, kopsavilkuma čipi, pārklājuma necaurspīdība — vienmēr vilka aiz sevis savu "iztulko jaunās atslēgas 29 lokalizācijās" komitu, jo nekas neizpildīja invariantu automātiski.
Nekārtību var pat izmērīt komitu ziņojumos. Tie paši trīsdesmit lokalizācijas faili laidienu pēc laidiena tiek aprakstīti kā "30 valodas", "29 valodas" un — vienā komitā — "28 lokalizācijas". Nekas netika pievienots vai noņemts; katrā tagā no v1.8.3 līdz v2 ir trīsdesmit faili. Skaitlis dreifē, jo nebija vienota patiesības avota par to, "cik valodas mēs piegādājam", tāpēc katrs komita autors skaitīja ar roku, dažreiz iekļaujot angļu valodu kā valodu un dažreiz kā avotu. Izmaiņu žurnāls, kas nespēj noturēt savu paša skaitu stabilu, ir mazs, godīgs signāls, ka to, ko tas apraksta, mašīna neizpilda.
Daudzskaitļa slēptais drauds
Vēl viena lieta, ko vērts atzīmēt, ne tāpēc, ka tā salūza skaļi, bet tāpēc, ka tā ir tāda veida kļūda, ko šī uzbūve pieaicina un par ko tā tevi nebrīdinās. Daudzskaitlis šajos lokalizācijas failos tiek veidots manuāli, ar pārī saliktām atslēgām: meetings.meetingCount un meetings.meetingCountPlural, profiles.filesAttached un filesAttachedPlural. Tas ir tīrs angļu vienskaitļa/daudzskaitļa dalījums. Tas ir arī nepareizs daļai valodu, ko lietotne tagad apgalvo atbalstot. Krievu, poļu un čehu valodā ir trīs vai četras daudzskaitļa formas atkarībā no skaitļa — "1 fails", "2 faili", "5 faili" un "21 fails" var pieņemt dažādas vārda galotnes. Divu atslēgu vienskaitļa/daudzskaitļa shēma to nevar izteikt, tāpēc šie skaitļi tiek atveidoti gramatiski nepareizi. i18next ir īsts daudzskaitļa mehānisms tieši šim; manuālie pāri to apiet, un neviens komits neatzīst šo trūkumu. Tas ir daudzskaitļa ekvivalents cietkodēto virkņu problēmai: neredzams būvējumam, redzams tikai dzimtās valodas runātājam.
Trīs lietas, ko šis laidiens mums iemācīja
- Bibliotēka ir vieglie 80%; rīki ir grūtie 20%.
react-i18nextpieslēgšana un virkņu masveida tulkošana ir atrisināta problēma. Trīsdesmit failu paritātes uzturēšana mūžīgi nav — un tai vajadzīgs ekstraktors cietkodētajām virknēm un CI pārbaude trūkstošajām atslēgām, no kuriem nevienu bibliotēka tev nepiegādā. Uzbūvē tos pirms apgalvo "pilnu i18n", citādi esi apgalvojis invariantu, ko nekādi nevari noturēt. - Sadali valodu iestatījumus, kas patiešām ir atšķirīgi. Saskarnes valoda, transkripta valoda un AI atbildes valoda ir trīs asis, un v1.8.3 rīkojās pareizi, dodot katrai savu atslēgu — un vēl pareizāk, sējot jauno no radniecīgas vecās caur migrāciju, tā ka jaunināšana lietotājiem neizmaksāja neko.
- Tava izmaiņu žurnāla skaits ir disciplīnas rādītājs. Kad viens un tas pats failu kopums ir 28, 29 un 30 valodas trijos komitos, problēma nav skaitlis — problēma ir trūkstošais patiesības avots. Ja mašīna neskaita tavas valodas, neviens tās neskaita divreiz vienādi.
Iepriekšējai nodaļai v1 stāstā — paneļa pārveidošanu ap vienu viļņa grafiku (v1.8.2); un visai lokai — programmatūras piegādes līdz pilnībai anatomiju.