Prieš išleisdami programą, kurią Codex, Claude Code ar Cursor išvertė vienu promptu, patikrinkite septynis dalykus: ar ilgi tekstai telpa, ar daugiskaitos formos atitinka kiekvieną kalbą, ar išliko kintamieji, ar terminai nuoseklūs, ar tonas skamba tinkamai gimtakalbiui, ar kiekvienas raktas egzistuoja kiekvienoje lokalėje ir ar kitas funkcionalumas apskritai bus išverstas. globalize.now yra DI pagrįsta lokalizavimo infrastruktūra, ir dauguma problemų, kurias matome po vienkartinio vertimo, yra mechaninės. Tai gera žinia: mechanines problemas galima patikrinti.

Pirmasis vertimas retai kada būna problema. Šiuolaikiniai agentai greitai pateikia skaitomus vertimus. Tačiau viename prompte nėra jokio žingsnio, kuris patikrintų rezultatą — būtent tą žingsnį ir atlieka šios patikros.

Ar tekstas telpa po vertimo?

Dažnai ne, o pirmieji nukenčia mygtukai. W3C rekomendacijose dėl teksto dydžio vertime pažymima, kad kuo trumpesnis šaltinio pranešimas, tuo didesnė tikėtina jo plėtra, todėl dviejų žodžių mygtuko etiketė proporcingai išauga labiau nei pastraipa. Taip pat nurodoma, kad sudurtiniai daiktavardžiai tokiose kalbose kaip vokiečių gali nesiskirstyti į eilutes, o kai kuriems rašmenims reikia daugiau horizontalios ar vertikalios erdvės nei lotyniškam tekstui.

Agentas, versdamas eilutes JSON faile, niekada nemato ekrano, todėl nežino, kad „Save changes“ dabar užpildo mygtuką nuo krašto iki krašto. Paleiskite programą ilgiausioje jūsų palaikomoje lokalėje, išbandykite pagrindinius scenarijus ir ieškokite nukirsto teksto, į kelias eilutes persikėlusių mygtukų tekstų ir sutrumpintų lentelių antraščių. Jei palaikote kalbas, rašomas iš dešinės į kairę, atlikite tą pačią patikrą su viena iš jų; arabų kalbos ir RTL vadovas Lovable programoms aptaria kryptį, kurios vien perpildymo patikros neaptinka.

Ilgalaikis sprendimas yra išdėstymas, o ne trumpesni vertimai: leiskite konteineriams augti, venkite fiksuoto teksto pločio ir nebetrumpinkite žodžių, kad tilptų. Šią dalį paprašykite atlikti agento, nes tai kodas.

Ar daugiskaitos formos atitinka tikslinę kalbą?

Patikrinkite tai anksti, nes klaida pasireiškia tyliai. Unicode CLDR apibrėžia šešias daugiskaitos kategorijas: zero, one, two, few, many ir other. Anglų kalba naudoja tik one ir other. Rusų kalba naudoja one, few, many ir other. Velso kalba naudoja visas šešias, o i18next dokumentacijoje arabų kalba taip pat pateikiama su visais šešiais daugiskaitos raktais.

Agentas, nukopijavęs anglišką porą į rusų ar arabų failą, sukuria katalogą, kuris be klaidų nuskaitomas ir atvaizduojamas, bet rodo neteisingą formą kiekvienam skaičiui, kuriam reikia faile nesančios kategorijos. Klaidos nebus. Naudodami i18next, atminkite, kad kintamasis privalo būti pavadintas tiksliai count, o dokumentacijoje nurodyta, kad jo nesant, grįžimo prie paprasto rakto nėra. Tas pats agentas, komponente parašęs count === 1 ? 'item' : 'items', tą pačią klaidą padaro dar prieš prasidedant vertimui; kas yra ICU MessageFormat ir kodėl jis klaidina DI sugeneruotas programas aptaria sintaksės pusę.

Patikra mechaninė: kiekvienai lokalei palyginkite daugiskaitos raktus su kategorijomis, kurių reikalauja ta kalba.

Ar išliko interpoliacijos kintamieji?

Ne visada, ir tai išsprendžia skriptas. Interpoliacijos kintamieji, tokie kaip {{name}} ar {count}, kiekviename vertime turi atsirasti tiksliai taip, kaip parašyti. Agentai, versdami ilgą failą, kartais perfrazuoja kintamąjį, išmeta jį, kai sakinys be jo skamba geriau, arba išverčia žymės turinį. Rezultatas atvaizduojamas kaip tuščia vieta, tiesioginis riestinis skliaustas arba programos strigtis.

Palyginkite kiekvienos išverstos eilutės kintamųjų rinkinį su jos šaltinio eilute. Šis trumpas Node skriptas tai padaro, taip pat nurodo raktus, kurie egzistuoja anglų kalba, bet nėra kitoje lokalėje:

import fs from "node:fs";

const [src, ...targets] = process.argv.slice(2);
const read = (f) => JSON.parse(fs.readFileSync(f, "utf8"));
const vars = (s) =>
  [...String(s).matchAll(/\{\{?\s*[\w.]+\s*\}?\}/g)].map((m) => m[0]).sort().join(",");

const base = read(src);
let problems = 0;
for (const file of targets) {
  const loc = read(file);
  for (const [key, text] of Object.entries(base)) {
    if (!(key in loc)) { console.log(file, "missing", key); problems++; continue; }
    if (typeof text === "string" && vars(text) !== vars(loc[key])) {
      console.log(file, "variable mismatch", key); problems++;
    }
  }
}
process.exit(problems ? 1 : 0);

Paleiskite jį kaip node check-locales.mjs locales/en.json locales/de.json locales/ru.json CI aplinkoje. Skriptas daro prielaidą, kad raktų failai vieno lygio; jei jūsų katalogas įdėtinis, pritaikykite ciklą.

Ar terminologija nuosekli?

Viename atsakyme ji nuosekli, o per kelis nukrypsta. Jei didelės programos vertimas išskaidytas keliuose failuose, sesijose ar partijose, niekas neužtikrina, kad „workspace“, „project“ ir jūsų produkto pavadinimas kaskart bus išversti vienodai. Galiausiai mygtuke parašyta viena, o pagalbos puslapyje – kita.

Užsirašykite terminus vieną kartą: produktų pavadinimų, funkcijų pavadinimų ir žodžių, kurių negalima versti, žodynėlį, ir priverskite vertimo žingsnį jį perskaityti. globalize.now sugeneruoja bendrą žodynėlį konvertuojant kodo bazę, todėl terminai egzistuoja kaip duomenys dar prieš prasidedant bet kokiam vertimui. Be įrankio minimumas yra trumpas žodynėlio failas, į kurį nurodoma agento instrukcijose; AGENTS.md taisyklių straipsnis parodo, kur tos instrukcijos saugomos.

Ar skamba tinkamai gimtakalbiui?

Tai vienintelė patikra, kurios skriptas atlikti negali. Registras, formalumo lygis ir didžiosios raidės yra tai, dėl ko vienkartiniai vertimai skamba kaip mašininiai: netinkamas kreipinio formalumo lygis, mygtukai liepiamąja nuosaka, skambantys kaip įsakymai, antraštė didžiosiomis raidėmis kalboje, kurioje tai suvokiama kaip rėkimas.

Neperžiūrinėkite kiekvienos eilutės. Pasirinkite po vieną kalbą iš kiekvienos jūsų palaikomos kalbų šeimos ir paprašykite gimtakalbio perskaityti pirmojo paleidimo ekranus, apmokėjimo ar registracijos srautą ir klaidų pranešimus. Būtent šiuose ekranuose tonas kainuoja vartotojus. Įrašykite jų pataisymus į žodynėlį, kad kitas paleidimas prasidėtų nuo jų.

Ar kiekvienas raktas egzistuoja ir ar kiekviena eilutė pateko į katalogą?

Dvi skirtingos spragos ekrane atrodo vienodai. Raktas gali egzistuoti anglų kalba, bet trūkti vienoje lokalėje — tai pagauna aukščiau pateiktas skriptas. Arba eilutė gali būti įrašyta tiesiai komponento kode ir niekada nepatekti į katalogą, todėl joks vertimas jos neaprėptų. Agentai antrojo pobūdžio atvejus dažniau palieka atributuose, pranešimuose ir klaidų žinutėse nei matomame tekste; kodėl agentai nuolat prideda tiesiai kode įrašytų eilučių aptaria šį šabloną ir lint taisyklę, kuri jį pagauna.

Perjunkite programą į ne anglišką lokalę ir peržiūrėkite ją spausdami per visus ekranus. Bet koks likęs angliškas tekstas yra arba trūkstamas raktas, arba eilutė, kuri niekada nepateko į sistemą, ir šių atvejų sprendimai skiriasi.

Ar bus išverstas kitas funkcionalumas?

Tik jei vertimas yra kodo išleidimo proceso dalis, ir tai yra patikra, kurios vieno prompto paleidimas neišlaiko. Promptas išvertė programą tokią, kokia ji buvo tą popietę. Kita jūsų agento sukurta funkcija atsiras anglų kalba, tuose pačiuose failuose, ir lokalės atsiliks su kiekviena nauja funkcija. Kodėl vertimų failai išsisinchronizuoja aprašo, kaip tai kaupiasi.

Čia vienkartinis požiūris ir nuolatinis procesas (pipeline) skiriasi. Lokalizavimas, persikeliantis aukščiau į kūrimo ciklą išdėsto šio požiūrio pagrindimą; praktiškai tai reiškia, kad konvertavimas vyksta vieną kartą, o vėlesni pakeitimai verčiami ten, kur jie daromi. Su globalize.now programoje prijungiate saugyklą, kodo bazė konvertuojama vieną kartą, o vėliau push užduotys išverčia naujus katalogo vienetus, o rezultatai pateikiami kaip pakeitimai, kuriuos peržiūrite ir sujungiate. Vykdymo laiko biblioteka ir katalogo formatas lieka jūsų. Komandos, jau turinčios vertėją žmogų, išsaugo tą peržiūros žingsnį; jis tiesiog nustoja būti vieninteliu dalyku tarp tik angliško kodo ir išleidimo.

Jei norite viską palikti savo skriptuose, minimumas yra aukščiau pateiktas skriptas, paleidžiamas CI, ir taisyklė, kad naujos eilutės eitų per katalogą. Kaip lokalizuoti DI sugeneruotą programą žingsnis po žingsnio apžvelgia visą kelią, o Claude Code vadovas aptaria būtent tą agentą.

Nuo ko pradėti?

Paleiskite skriptą savo dabartiniams lokalių failams šiandien; tai užtrunka minutę ir parodo, ar struktūra yra patikima. Tada atidarykite programą ilgiausioje lokalėje ir peržiūrėkite pirmojo paleidimo eigą spausdami per ekranus. Jei išleidote DI sukurtą programą ir norite, kad konvertavimą, vertimą ir vėlesnius atnaujinimus tvarkytų įrankis, o ne jūs ranka, vibe coders puslapis pateikia apžvalgą, kūrėjų žinynas aprašo agentų konfigūracijas, o kainodara yra atskirame puslapyje.

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