Sest teie i18n-i seadistus elab teie peas ja konfiguratsioonis, mitte koodis, mida agent parajasti näeb. Cursor genereerib komponendi uuesti selle ees oleva konteksti põhjal ning tavaline JSX-i tekst on kiireim toimiv lahendus. Miski hoidlas ei anna sellest märku, seega jõuab literaal tootmisse. globalize.now on AI-põhine lokaliseerimisinfrastruktuur, mis sulgeb selle ahela: ekstraktib uued stringid, genereerib võtmed ja sünkroonib tõlked iga Git push’i järel.
See on tõrkeviis, mille eest keegi teid ei hoiata. i18n-i seadistamine võtab ühe pärastlõuna. Tegelik probleem on selle seadistuse säilitamine ajal, mil agent kirjutab teie komponente kaks korda päevas ümber.
Miks lisab Cursor pärast i18n-i seadistamist endiselt hardcoded strings-e?
Kolm asja kehtivad korraga ja koos tagavad need lekke.
Agent näeb faili, mitte konventsiooni. Kui palute Cursoril lisada seadete paneeli, loeb see muudetavat komponenti ja võib-olla paari naaberkomponenti. Teie lokaalide kataloog, namespace’ide skeem ja reegel, et iga kasutajale nähtav string peab läbima tõlkefunktsiooni, ei ole selles vaateaknas, kui te neid sinna ei lisa.
Tõlkimata tekst on statistiline vaikevalik. Valdav enamik mis tahes mudeli treeningandmetes olevast Reacti koodist kirjutab stringid otse koodi sisse. Kui agent valib nupu sildi jaoks kõige tõenäolisemat järgmist token’it, võidab Save changes pelgalt sageduse tõttu t('settings.save'). Te palute tal iga kord valida harvemini esineva mustri, ilma tagasisideta, kui ta seda ei tee.
Miski ei lähe katki. See on otsustav tegur. Hardcoded string läbib tüübikontrolli. Build õnnestub. See renderdub. Testid läbivad. Teie töövoos pole kuskil punast märget, mis ütleks, et Saksamaal asuv kasutaja näeb kohe ingliskeelset toast-teadet. Viga jääb nähtamatuks, kuni keegi vahetab lokaali ja kerib.
Võrrelge seda puuduva impordi või vale propertüübi tüübiga, mille agent mõne sekundiga parandada saab. Tõlkimata tekst on ainus veaklass, mille teie tööriistaahel vaikselt heaks kiidab – seetõttu on see ka veaklass, mis kuhjub.
Millised stringid lekivad kõige sagedamini?
Need, mis lisati viimasena ja mida kontrolliti kõige vähem.
Vaadake läbi ükskõik milline AI-toega koodibaas, mis alustas mitmekeelsena, ja allesjäänud ingliskeelne tekst paikneb etteaimatavates kohtades:
- Vea- ja eduteated, eriti need, mis lisati mõne muu vea parandamise käigus
- Tühiolekud ja laadimistekst, mis kirjutatakse üks kord ning mida enam kunagi üle ei vaadata
- Vormi valideerimisteated, mis genereeritakse sageli skeemi sees otse koodi
- Ligipääsetavuse atribuudid:
aria-label,alt,title - Kinnitusdialoogid ja hävitava toimingu tekstid
- Kõik, mis asub
catchploki sees
Muster on järjepidev. Põhivood saavad tõlgitud, sest te vaatate need üle. Äärealad muutuvad hardcoded strings-ideks, sest keegi ei ava neid teises lokaalis.
Sellel on ka teise järgu variant. Kui agent lisab olemasoleva tõlgitud koodi kõrvale literaali, võib ta „abivalmilt” välja mõelda võtme, mis ei sobitu teie namespace’i skeemiga, nii et ühes failis on errors.saveFailed ja teises settings_save_error. Nüüd on teil nii tõlkimata stringid kui ka killustunud võtmeruum. Kui olete selle teekonna alguses, käsitleb meie juhend AI-ga loodud rakenduse lokaliseerimisest esmast korrastamist.
Kas .cursor/rules või AGENTS.md suudavad selle peatada?
Need aitavad ja te peaksite ühe neist kirjutama, kuid need on juhised, mitte jõustamismehhanism.
Juhisefailide kiht standardiseerus hiljuti. AGENTS.md sai 2025. aastal alguse tarnijaneutraalse konventsioonina ning nüüd haldab seda Linux Foundationi all tegutsev Agentic AI Foundation. Seda loevad natiivselt Cursor, Codex, Copilot, Gemini CLI, Aider, Windsurf ja Zed, mis tähendab, et üks fail hoidla juurkaustas jõuab iga teie tiimi kasutatava agendini. Cursor toetab ka ulatusega projektireegleid .mdc-failidena kataloogis .cursor/rules/, kus frontmatter määrab kirjelduse, failimustrid ja selle, kas reegel kehtib alati. Praktiline seadistus 2026. aastal on juurkaustas olev AGENTS.md kaasaskantavuse jaoks ning ulatusega Cursori reeglid seal, kus automaatne rakendamine end ära tasub.
Toimiv i18n-i plokk näeb välja selline:
## Internationalization
- Never write user-facing text as a literal in JSX or in a string passed to a UI component.
- All user-facing text goes through the translation function from `next-intl`.
- Keys follow `feature.element.state` in lowerCamelCase, e.g. `settings.save.error`.
- Add the English value to `messages/en.json` only. Never hand-edit other locale files.
- This includes toasts, empty states, validation messages, `aria-label`, `alt` and `title`.
See vähendab lekete määra mõõdetavalt. Nulli see seda ei vii, sest reeglifailid konkureerivad kontekstiaknas kõige muu tähelepanu pärast ning pikad agendisessioonid kalduvad kõrvale. Käsitlege seda kihti sageduse vähendamisena, mitte garantiina.
Kuidas panna tõlkimata string build’i nurjama?
Lisage lintimisreegel, mis käsitleb JSX-is olevat literaali veana, ja käivitage see pidevintegratsioonis.
Tavapärane valik on eslint-plugin-i18next reegel no-literal-string-ist. Vaikimisi valideerib see JSX-i märgenduses oleva lihtteksti, mitte iga failis oleva literaali, mistõttu on seda päris koodibaasis võimalik kasutada ilma valepositiivsete tulemuste müürita. See toetab regulaaravaldistega ignoreerimismustreid, teile teadaolevalt ohutute funktsioonide väljakutsuja välistamist ning ainult märgenduse režiimi.
Alustuseks sobiv konfiguratsioon:
// eslint.config.js
import i18next from 'eslint-plugin-i18next';
export default [
{
files: ['**/*.{jsx,tsx}'],
plugins: { i18next },
rules: {
'i18next/no-literal-string': [
'error',
{
markupOnly: true,
ignoreAttribute: ['data-testid', 'className'],
ignore: ['^[0-9]+$', '^\\s*$'],
},
],
},
},
];
Käivitage see oma töövoos, mitte ainult redaktoris:
npx eslint . --max-warnings=0
Nüüd on nähtamatul veal punane märge. Agent saab tõlkimata stringi kohta sama tagasisideahela, mida ta juba saab tüübivea puhul, mis tähendab, et ta saab oma vea samas sessioonis parandada, selle asemel et jätta see teises lokaalis kasutaja avastada. Kui soovite laiemat ülevaadet i18n-i nullist Cursori projekti ühendamisest, vaadake meie 15-minutilist Cursori ja Next.js-i juhendit ning Cursori integratsioonilehte.
Miks ei piisa ebaõnnestuvast lintimisreeglist?
Sest punane build ütleb teile, et string on olemas. See ei tõlgi seda.
Kui reegel rakendub, peab keegi ikkagi valima võtme, mis sobib teie olemasolevate namespace’idega, lisama ingliskeelse lähteväärtuse ja looma teised lokaalid. Üksi projekti arendades ja mitu korda päevas väljastades lükatakse see töö edasi. Kui seda piisavalt kaua edasi lükata, muutub ausaks lahenduseks faili ignoreerimisnimekirja lisamine – ja siis oletegi tagasi alguses, ainult et lisakonfiguratsiooniga.
See on lünk, mis muudab lahendatud probleemi korduvaks võlaks. Esimene ja teine kiht muudavad probleemi esinemissagedust ning seda, kui kiiresti te sellest teada saate. Kumbki neist ei tee tegelikku tööd.
Milline näeb kolmekihiline seadistus välja?
Juhised, jõustamine, automatiseerimine. Iga kiht püüab kinni selle, mis eelmisest mööda pääses.
Esimene kiht, juhised. Kirjutage i18n-i plokk oma hoidla juurkausta AGENTS.md-faili ja lisage ulatusega .cursor/rules/i18n.mdc, mille failimustrid hõlmavad teie komponentide katalooge. Kulu: 15 minutit, üks kord. Mõju: algusest peale kirjutatakse vähem literaale.
Teine kiht, jõustamine. Lülitage sisse no-literal-string ja pange pidevintegratsioon selle puhul ebaõnnestuma. Kulu: olemasolevas koodibaasis üks pärastlõuna ignoreerimismustrite häälestamiseks. Mõju: ükski literaal ei jõua teie põhiharusse märkamatult ning agent saab end ise parandada.
Kolmas kiht, automatiseerimine. Laske ekstraktimisel, võtmete loomisel ja tõlkimisel toimuda ilma teieta. See on kiht, mida katab globalize.now. See paikneb teie i18n-i runtime’i kohal, mitte ei asenda seda: next-intl või i18next renderdab stringid endiselt. globalize.now tuvastab uue hardcoded text’i, genereerib teie projekti olemasolevate namespace’idega sobivad võtmed, tõlgib need kõigisse seadistatud lokaalidesse ja commit’ib uuendatud lokaalifailid iga Git push’i järel tagasi. Seadistage see üks kord – ühendage hoidla globalize.now-ga – ja ükski käsitsi tehtav samm ei jää vahele. Saate selle ka oma agenti installida käsuga:
npx skills add globalize-now/globalize-skills
Paketid algavad hinnast 5 € kuus; 20-eurone Starter sisaldab iga kuu 20 € väärtuses tõlkekrediiti (umbes 200 000 sõna), kaasatud mahust suurema kasutuse eest arvestatakse sama tähemärgipõhist hinda. Istme- ega keelepõhiseid tasusid pole ning registreerumisega kaasneb 5 € tõlkekrediiti, kaarti pole vaja. Inseneridele mõeldud lisateave on arendajate lehel, lühem versioon AI-tööriistadega väljastajatele aga vibe coder’ite lehel.
Kolme kihi mõte on selles, et ükski neist ei sõltu teie distsipliini püsimisest saja agendisessiooni jooksul. Reeglifail vähendab esinemissagedust, lintimisreegel muudab vead nähtavaks ja sünkroonimine teeb paranduse tasuta. Just see kombinatsioon hoiab mitmekeelse rakenduse mitmekeelsena ajal, mil agent seda pidevalt ümber kirjutab.
Teie i18n-i seadistus pole habras osa. Habras on ahel agendi kirjutatud stringi ja selle lokaalifaili jõudmise vahel. globalize.now sulgeb selle ahela iga push’i järel.
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