„Replit“ programą padarote daugiakalbę prijungdami jos Git saugyklą prie GitHub ir laikydami vertimo katalogus toje saugykloje kaip įkeltus failus. „Replit“ jau saugo kiekvieną Agento kontrolinį tašką kaip Git įrašą, todėl saugykla egzistuoja dar prieš pagalvojant apie kalbas; darbas yra ją perkelti į GitHub ir leisti katalogams grįžti per tą pačią istoriją. globalize.now yra dirbtiniu intelektu paremta lokalizacijos infrastruktūra: ji sukuria raktus ir lokalės failus, o juos pateikia vykdymo laiko biblioteka, kurią jūsų programa jau naudoja. Vykdymo kelyje nėra jokio prietaisų skydelio, ir niekas neverčia puslapio po jo įkėlimo.
Kodėl prašymas Agentui išversti programą neveikia?
Nes nėra į ką versti. Kai paprašote „Replit Agent“ sukurti prietaisų skydelį, jis įrašo <h2>Your bookings</h2> į komponentą, o ne paiešką kataloge. Kiekviena antraštė, mygtukas, tuščia būsena, pranešimas (toast) ir validacijos klaida atsiranda JSX kaip literalas ta kalba, kuria pateikėte užklausą.
Todėl vėliau paprašius Agento „išversti programą į afrikanų kalbą“, gaunate vieną iš dviejų pusėtinų rezultatų: antrą komponentų kopiją su pakeistu tekstu arba rankomis sukurtą translations objektą, apimantį tik tuos ekranus, kuriuos Agentas netyčia peržiūrėjo. Nė vienas iš jų nėra lokalės sluoksnis. Kita funkcija vėl atkeliauja anglų kalba. Tą patį pasikartojimą aprašėme straipsnyje Cursor nuolat prideda literalias eilutes; „Replit Agent“ elgiasi lygiai taip pat, nes jis išsprendžia jam pateiktą užklausą, o ne už jos slypinčią architektūrą.
Sprendimas yra struktūrinis: suteikite eilutėms raktus, sudėkite vertimus į failus ir priverskite vykdymo laiką skaityti iš tų failų. Būtent tai reiškia „daugiakalbė“ kodo bazės atžvilgiu, ir tai — vienkartinis pakeitimas.
Ką iš tikrųjų generuoja „Replit Agent“?
Įprastą interneto projektą — ir tai gera žinia. „Replit“ kuruojami programų tipai kuriami remiantis „React“ su „ShadCN UI“ priekinėje dalyje, dažniausiai kartu su „Express“ serveriu tame pačiame projekte, viskas „TypeScript“ kalba. Nuo 2025 m. rugsėjo Agentas taip pat veikia su bet kuriuo jūsų atsineštu karkasu, įskaitant importuotas GitHub saugyklas, todėl galimas „Next.js“ ar „Vue“ projektas; numatytasis kelias vis dar yra „React“ stekas.
Lokalizacijai svarbus tik vienas faktas — stekas, ir tai standartinė terpė. „React“ kartu su „Vite“ ir „TypeScript“ yra labiausiai palaikomas derinys i18n ekosistemoje: i18next, „Lingui“ ir react-intl visos tiesiogiai orientuotos į jį. Jei Agentas vietoj to sukūrė jums „Next.js“ programą, renkatės tarp next-intl, react-i18next ir „Lingui“, o tas palyginimas pateiktas atskirame straipsnyje.
Kas skiriasi nuo tik priekinės dalies kūrimo įrankio — tai antroji projekto pusė. „Replit“ programa dažniausiai turi serverį, o serveriai taip pat turi eilučių. Daugiau apie tai žemiau.
Kur „Replit“ programoje yra Git saugykla?
Ji jau ten yra. „Replit“ versijų valdymo pagrindas yra Git, o Agento kontroliniai taškai yra tos saugyklos įrašai (commits). Kiekvieną kartą, kai Agentas baigia funkciją ir pasiūlo jums grįžimo tašką, jis jau atliko įrašą. Paties „Replit“ dokumentacija rekomenduoja pereiti prie įprastų Git įrašų ilgalaikiam sekimui, kai dirbate su išorinėmis saugyklomis — būtent tokia situacija čia ir yra.
Norėdami perkelti ją į GitHub:
- Pridėkite Git įrankį iš projekto redaktoriaus skilties Tools.
- Prijunkite savo GitHub paskyrą prie prijungtų paslaugų (connected services), tada prijunkite saugyklą Git skydelyje. Jei projektas dar niekada nebuvo inicijuotas, skydelis pasiūlys tai padaryti pirmiausia.
- Atlikite „push“. Skydelis siunčia pakeitimus vienu paspaudimu ir išlieka sinchronizuotas su viskuo, ką paleidžiate „Shell“, todėl
git push origin maintaip pat veikia.
„Replit“ taip pat palaiko GitLab ir Bitbucket, ir tas pats procesas galioja jiems. Svarbu ne pati platforma, o tai, kad saugykla dabar yra ten, kur lokalizacijos užduotis gali atverti „pull request“.
Padarykite tai prieš liesdami bent vieną eilutę. Lokalizacijos darbas yra failų darbas, o pakeitimų peržiūra (diff) — tinkamiausia vieta jį peržiūrėti.
Ką „Replit“ programai reiškia „be prietaisų skydelio“?
Tai reiškia, kad išverstos eilutės yra failai saugykloje, o programa juos pateikia kaip bet kurį kitą išteklių. Jokios script žymos, jokio išorinio užklausimo puslapio įkėlimo metu, jokios trečiosios šalies paskyros tarp lankytojo ir jūsų teksto.
Alternatyva — vykdymo laiko valdiklis, kuris pakeičia tekstą po puslapio atvaizdavimo. Jo trūkumai yra struktūriniai: pirmasis atvaizdavimas yra anglų kalba, išverstas tekstas nepatenka į HTML, kurį pirmiausia perskaito naršymo robotai, trečiosios šalies skriptas atsiranda jūsų produkcinėje aplinkoje, o jūsų eilutės saugomos tiekėjo saugykloje, todėl pasitraukimas reiškia eksportą. „Lovable“ atveju šis argumentas pateiktas straipsnyje „Lovable“ programos lokalizavimas be prietaisų skydelio ir nepakitęs galioja „Replit“.
Yra viena su „Replit“ susijusi priežastis, kodėl tai čia dar svarbiau. „Replit“ pati diegia (deploy) jūsų programą, todėl veikianti kopija jūsų „Replit“ domene yra tokia, kokia projekto būsena buvo diegimo metu. Valdiklis šį diegimą verstų iš išorės. Katalogai saugykloje reiškia, kad diegimas jau apima visas kalbas, o „Replit“ peržiūra rodo jums vokišką versiją dar prieš jai pasirodant viešai.
Kompromisas realus ir vertas paminėti: teksto pakeitimas reiškia įrašą (commit) ir pakartotinį diegimą, o ne mygtuko „išsaugoti“ paspaudimą. Vienam kūrėjui, kuriančiam iš „Replit“, tai nesukelia jokių problemų; tam, kas tikisi redaguoti gyvą tekstą neliesdamas projekto, tai yra apribojimas.
Kaip veikia saugykloje grindžiama sąranka?
Prijunkite saugyklą globalize.now aplikacijoje. Konversija paleidžiama vieną kartą per visą kodo bazę: užkoduoti tekstai virsta katalogo vienetais su raktais, o komponentai pradeda juos skaityti iš vykdymo laiko bibliotekos, o ne laikyti kaip literalus. Tai vienkartinis veiksmas, o ne kažkas, kas kartojasi vėliau.
Po konversijos push užduotys išverčia naujus katalogo vienetus, kol aplikacija auga. Paprašykite Agento sukurti naują nustatymų puslapį, atlikite push — nauji vienetai bus išversti, o esami liks nepakitę. Katalogai grįžta kaip pateikti (committed) failai — JSON arba PO, priklausomai nuo vykdymo laiko bibliotekos — pull request'e, kurį peržiūrite kaip ir bet kurį kitą pakeitimą.
Dvi ribos, nes kategorija yra neaiški. globalize.now nepakeičia vykdymo laiko bibliotekos — i18next, Lingui ir next-intl toliau atlieka savo darbą. Ir tai nėra vertimo variklis, konkuruojantis su DeepL. Tai tarpinis sluoksnis, kuris sukuria raktus ir lokalės failus. Apžvalga kūrėjams paaiškina mechaniką.
Kaip vertimai grįžta atgal į Replit?
Per tą patį Git skydelį, tik priešinga kryptimi. Tai žingsnis, kuris skiriasi nuo Bolt ar Lovable, nes Replit taip pat yra vieta, kur aplikacija veikia.
- Peržiūrėkite ir sujunkite (merge) pull request GitHub'e.
- Replit Git skydelyje pasirinkite Pull. Jei jūs ar Agentas tarpu keitėte tuos pačius failus, skydelis pažymės konfliktus, ir juos išspręsite redaktoriuje prieš užbaigdami sujungimą.
- Iš naujo įdiekite (redeploy). Katalogai dabar yra projekto dalis, todėl diegimas apims visas kalbas.
Vienas niuansas, būdingas būtent Replit: Agento kontroliniai taškai (checkpoints) atkuria visą projekto būseną, įskaitant failus. Jei grįšite prie kontrolinio taško, sukurto prieš atsisiunčiant (pull) vertimo šaką, katalogai grįš kartu su juo. Traktuokite sujungimą kaip svarbų etapą — leiskite Agentui po jo sukurti kontrolinį tašką ir grįžkite prie jo, o ne prie ankstesnio.
Kokie tekstai gyvena serveryje?
Tie, kurių front end'as niekada nemato kaip JSX. Replit aplikacija su Express back end'u turi antrą tekstų sluoksnį: API klaidų pranešimus, validacijos atsakymus, el. laiškų temas, pranešimų tekstus, CSV antraštes — viską, ką serveris suformatuoja prieš išsiųsdamas. Front-end katalogas jų nepasiekia, o widget'as jų visai nemato, nes jie niekada nepatenka į DOM.
Modelis toks pat kaip kliento pusėje, tik pritaikytas serverio pusei. Suteikite serveriui vykdymo laiko bibliotekos kopiją, nuskaitykite lankytojo lokalę iš užklausos (Accept-Language antraštė arba lokalės laukas naudotojo įraše) ir formuokite atsakymus iš katalogo, o ne iš tekstų literalų. Raktų vardų erdvė (namespace) lieka bendra, todėl errors.booking.overlap reiškia tą patį ir toast'e, ir 409 atsakyme.
Praleiskite šį žingsnį, ir aplikacija atrodys daugiakalbė iki pirmos klaidos, o tada prabils angliškai.
Ką reikėtų patikrinti prieš pridedant antrą kalbą?
Peržiūrėkite šiuos punktus prieš konversiją, nes kiekvieną dabar išspręsti pigiau, nei kai jau veikia penkios kalbos:
- Sujungtos eilutės.
"Welcome back, " + user.namevertėjas negali pertvarkyti. Vietoj to naudokite interpoliaciją. - Daugiskaitos formos. Anglų kalba turi dvi formas, lenkų — tris, arabų — šešias. Ternarinis operatorius ant
count === 1yra neteisingas daugumoje kalbų. - Datos, skaičiai ir valiuta. Naudokite
Intl, o ne teksto formatavimą, tiek kliento, tiek serverio pusėje. - Išdėstymas. Vokiečių ir suomių tekstai būna ilgesni už anglų. Fiksuoto pločio mygtukai lūžta, o Tailwind klasės atrodo gerai, kol dar neatvyko tikras tekstas.
- Rašymas iš dešinės į kairę. Jei planuose yra arabų ar hebrajų kalba, apsispręskite dabar. RTL pritaikymas atgaline data yra brangiausias variantas.
- Katalogų nuokrypis (drift). Kai tik atsiranda katalogai, raktas, pridėtas vienoje lokalėje, bet ne kitose, tampa tylia klaida. Kodėl vertimo failai išsiskiria (drift) paaiškina, kaip tai nutinka ir ką su tuo daro push užduotis.
Kainodara taikoma vienai darbo erdvei (workspace), be mokesčio už vartotoją ir be mokesčio už kalbą, todėl kalbų skaičius — tai produkto sprendimas, o ne biudžeto eilutė. Aktualius skaičius rasite kainodaros puslapyje. Toks pat apžvalgos formatas kitiems kūrimo įrankiams pateiktas vibe coders apžvalgoje, kuri yra geras pradžios taškas.
Nuo ko pradėti
Jei jūsų Replit projektas jau prijungtas prie GitHub, kitas žingsnis — konversija tos saugyklos atžvilgiu, o ne sprendimas dėl įrankių pasirinkimo. Jei dar neprijungtas, Git skydelis yra žingsnis prieš tai.
globalize.now paverčia užkoduotą programos tekstą į vertimui paruoštus lokalės failus ir juos atnaujina, kai jūs diegiate naujus pakeitimus.
Išbandyti globalize.now nemokamai