ICU MessageFormat on Unicode standard ühe tõlgitava stringi kirjutamiseks, mis kohandub arvule, soole ja teistele muutujatele, ning seda on ikka veel raske tõlkida, sest süntaks loodi koodi, mitte selle lokaliseerijate jaoks. Standard on eksisteerinud üle kümne aasta, ja kõige rohkem takerduvad selle taha mittetehnilised tõlkijad, kes vahivad pesastatud looksulge. globalize.now on AI-põhine lokaliseerimisinfrastruktuur, mis asub sellest probleemist ühe taseme allpool: see ekstraheerib stringid ja genereerib locale-failid, kus need ICU mustrid elavad, ning hoiab need sünkroonis iga Git push'i järel.
Mis on ICU MessageFormat?
ICU MessageFormat on süntaks sõnumi väljendamiseks, mille lõplik sõnastus sõltub käitusaegsetest andmetest. Selle asemel, et fragmente koodis kokku liita, kirjutate ühe mustri ja laske vormindajal valida iga lokaali jaoks õige haru.
Kõige levinum kasutus on mitmuse moodustamine:
{count, plural,
one {You have # message}
other {You have # messages}
}
# asendatakse arvuga ning one / other harud kaardistavad keele mitmusekategooriad. Inglise keelel on neid kaks; poola, vene ja araabia keelel rohkem. ICU käsitleb ka sugu ja muid valikuid select kaudu:
{gender, select,
male {He liked your post}
female {She liked your post}
other {They liked your post}
}
Seepärast saigi ICU-st de facto mitmuse standard: see viib grammatilise keerukuse andmetesse, mis võivad keeleti erineda, selle asemel et jätta see haruloogikasse, mis toimib ainult ühe keele jaoks, mille jaoks see kirjutati. Käitusaegsed teegid nagu FormatJS, i18next ja next-intl mõistavad seda kõik.
Miks on ICU MessageFormat'i nii raske tõlkida?
Seda on raske tõlkida, sest süntaks loodi arendajatele, aga inimesed, kes tegelikult stringe tõlgivad, tavaliselt arendajad ei ole.
Tõlkija, kes avab locale-faili, ei näe „Teil on 3 sõnumit.“ Ta näeb looksulge, märksõnu plural ja select, mitmusekategooriaid, mida ta ei pruugi ära tunda, ning # kohatäidet, mis näeb välja nagu kirjaviga. Üks kustutatud sulg või üks ümbernimetatud kategooria ning string annab käitusajal vea, selle asemel et renderduda. Struktuur, mis muudab ICU arendajatele võimsaks, on täpselt sama struktuur, mis muudab selle keeleteadlase käes hapraks.
See on lõhe, millega lokaliseerimistööstus on aastaid vaikimisi elanud. Enamik tööriistu käsitlevad seda, näidates toorest mustrit ning lootes, et tõlkija ei puuduta valet märki, või peites mitmusevormid eraldi redaktori taha, mis siiski nõuab tõlkijalt mitmusekategooriate mõistmist. Ükski tootja pole täielikult ületanud vahemaad standardi keerukuse ja mittetehnilise tõlkija mõttemaailma vahel.
Mis muutus MessageFormat 2.0-ga?
MessageFormat 2.0 on süntaksi täielik ümberdisain, ja 2025. aastal sai sellest mustandi asemel stabiilne standard.
MF2 jõudis Final Candidate staatusesse 2025. aasta märtsis ning on nüüd CLDR-i stabiilne osa, avaldatud Unicode LDML tehnilise standardi osana ning täiustatud LDML 47 ja 48 väljalasetega. Referentsimplementatsioon järgib standardit alates 2026. aasta alguses avaldatud LDML 48.2 versioonist. Uus süntaks eraldab sisendid vastavuslogikast ja toetab nimetatud vormindusfunktsioone, mis muudab keerulised sõnumid loetavamaks:
.input {$count :number}
.match $count
one {{You have {$count} message}}
* {{You have {$count} messages}}
Eesmärk on muster, mida on lihtsam laiendada ja mis on pisut vähem tõrges lugeda kui algsed pesastatud looksulud.
Kas MessageFormat 2.0 lahendab tõlkijaprobleemi?
Veel mitte, kahel põhjusel.
Esiteks parandab MF2 süntaksi ergonoomikat, kuid see on ikkagi süntaks. Tõlkija puutub endiselt kokku .match, mitmusevõtmete ja looksulgudega. Kognitiivne koormus on väiksem kui MF1-l, kuid see pole kadunud, ja mittetehniline tõlkija saab endiselt sõnumi katki teha, muutes vale tokeni.
Teiseks ei kasuta seda toodangus peaaegu keegi. Kasutuselevõtt jääb 2026. aastani piiratuks: TC39 protsess JavaScripti poole jaoks soovib, et umbes kümmekond organisatsiooni kasutaks MF2-te toodangus, enne kui see edasi liigub, ja seda lävendit pole veel saavutatud. Praktikas töötab enamik täna toodetavaid rakendusi endiselt algupärase ICU MessageFormat'iga selliste teekide kaudu nagu FormatJS ja i18next. Seega ei lahenda tõlkijale suunatud probleemi standard ise, vaid see, kus süntaks luuakse ja hooldatakse.
Kus läheb ICU MessageFormat AI-genereeritud rakendustes katki?
See läheb katki juba varakult, sest AI koodigeneraatorid harva loovad korrektset ICU-t üldse.
Kui ehitate Cursoriga, Claude Code'iga või Lovable'iga, kipub genereeritud kood käsitlema arve naiivsel viisil:
// What an AI coding tool often generates
const label = count + " " + (count === 1 ? "message" : "messages");
See loogika on korrektne inglise keele jaoks ja vale enamiku teiste keelte jaoks, sest see eeldab täpselt kahte mitmusevormi. See sisestab lause ka otse rakenduse koodi, mistõttu locale-failis puudub ICU muster, mida tõlkija saaks üldse lokaliseerida. String jääb lokaliseerimiskihile nähtamatuks, kuni keegi märkab toodangus katkist grammatikat. AI tööriistad dubleerivad ka võtmeid ja hajutavad kõvakodeeritud teksti üle komponentide, mistõttu isegi meeskonnad, kes soovivad ICU-t kasutada, jäävad stringidega, mis kunagi tõlgitavasse faili ei jõuagi. globalize.now arendajate ülevaade on üles ehitatud selleks, et püüda kinni just seda tüüpi stringid enne, kui need toodangusse jõuavad.
Kuidas peaksid arendajad ICU MessageFormat'i 2026. aastal käsitlema?
Käsitlege ICU-t genereeritud infrastruktuurina, mitte käsitsi kirjutatud sisuna.
Praktiline reegel: arendajad ja tehisintellekti tööriistad ei tohiks koodis kirjutada mitmuse liitmislauseid ning tõlkijad ei peaks käsitsi muutma toorest ICU süntaksit. ICU muster kuulub locale faili, mis luuakse ja hoitakse ajakohasena automaatselt ning renderdatakse käitusajal sellise teegi abil nagu FormatJS, i18next või next-intl. See tagab, et süntaks on korrektne juba loomise hetkel ja püsib järjepidevana kõigis lokaalides ka siis, kui rakendus areneb. Kui kaalud, kuhu ICU sinu käitusaja kihi kõrval sobitub, vaata globalize.now vs i18next võrdlust, mis selgitab, kuidas infrastruktuur ja käitusaeg tööd omavahel jaotavad.
Just sellel kihil globalize.now töötab. See eraldab hoidlast hardcoded stringid, genereerib võtmed ja locale failid, kus ICU mustrid asuvad, ning sünkroonib need uuesti iga Git push'i järel, nii et struktuur püsib korrektsena ilma käsitsi eksportimiseta. See ei püüa asendada tõlkija redaktorit ega sinu käitusaja teeki – see tagab, et need ICU-kujulised failid, millest need tööriistad sõltuvad, tõepoolest eksisteerivad ja püsivad sünkroonis. Vibe-kooderite juhend käib sama seadistuse läbi Lovable'i, Bolti ja Replit'iga ehitatud rakenduste jaoks ning laiem töövoog on kirjeldatud globalize.now avalehel.
globalize.now muudab rakenduse koodis olevad tekstid tõlkeks valmis lokaale failideks ja hoiab neid ajakohasena, kui sa uusi versioone välja lasid.
Proovi globalize.now tasuta