Un agente di coding localizza una funzionalità: punteggi di confidenza, revisione e traccia, passo dopo passo
La localizzazione tramite agente di coding significa che l’assistente IA che scrive la vostra funzionalità ne collega anche le stringhe: aggiunge le chiamate t(), segnala le nuove chiavi e riceve indietro le traduzioni. La parte interessante è ciò che succede dopo. L’abbiamo fatto una volta, davvero, sulla nostra app demo Taskly: Claude Code ha aggiunto una funzione di snooze, ha segnalato undici chiavi a Locize tramite MCP e le ha riavute in sei lingue circa undici secondi dopo, ogni traduzione con un punteggio di confidenza e una motivazione. Questo articolo mostra ogni passo con l’output reale: cosa hanno intercettato i punteggi, cosa non hanno visto, cosa ha corretto l’agente da solo, cosa ha cambiato comunque la revisione, e cosa dice la traccia alla fine.
Il perché di questo schema (e quando saltarlo) è in quando gli agenti di codice traducono la vostra app. Questo è il come.
- 11 chiavi segnalate dall’agente, 69 traduzioni IA tornate in 6 lingue (tedesco, spagnolo, francese, italiano, giapponese, portoghese), circa 11 secondi dalla segnalazione alla pubblicazione, valutazione inclusa.
- 0 su 69 con un punteggio sotto la soglia di revisione predefinita di 0,7. Il punteggio più basso (0,7) ed entrambi i punteggi di 0,8 sono andati tutti alla stessa stringa: "Wake up".
- Cosa non hanno visto i punteggi: un termine tedesco usato in modo incoerente tra le chiavi, un bug nel modo in cui il codice dell’agente costruiva una frase, e una stringa tedesca con punteggio 1,0 che la revisione ha comunque riscritto. L’agente ha intercettato il primo; la revisione gli altri due.
- La traccia: ogni valore finisce con uno stato di revisione nell’export di provenienza (qui: 9 revisionati da una persona, 1 modificato da una persona, 11 scritti dall’agente, 59 output macchina che nessuno ha ancora controllato), quindi "una persona ha controllato questo" è qualcosa che potete mostrare per ogni stringa, e lo stesso vale per la sua assenza.
La configurazione
- L’app: Taskly, una piccola app di to-do in Vite, React e TypeScript, internazionalizzata con i18next e react-i18next. Testo di partenza in inglese, sei lingue di destinazione nel progetto Locize (il repository ne include cinque; il portoghese è stato aggiunto in Locize), un namespace di circa cento chiavi, una guida di stile informale e un glossario che finora protegge solo il nome del prodotto.
- L’agente: Claude Code nell’app desktop di Claude, con il server MCP di Locize aggiunto come connettore (
https://mcp.locize.app, accesso OAuth). Nella CLI di Claude Code lo stesso server si aggiunge conclaude mcp add --transport http locize https://mcp.locize.app, poi/mcpper accedere. Cursor e gli altri client MCP funzionano allo stesso modo. - Le impostazioni del progetto: traduzione automatica attiva, Quality Estimation attiva, più il Review AI workflow che instrada le traduzioni IA a bassa confidenza nelle proposte di revisione.
- Un branch: l’agente ha creato un branch del progetto per la funzionalità (
create_branch), così le nuove stringhe restano fuori dal progetto principale finché non vengono revisionate e unite con il merge. Al momento della creazione, un branch eredita dal progetto la traduzione automatica, Quality Estimation e il Review AI workflow.
Passo 1: il contesto prima della bozza
Prima di scrivere qualsiasi stringa, l’agente ha chiesto al progetto le sue regole: get_styleguide ha restituito tone: informal, audience: personal use, e get_glossary ha restituito un solo termine, il nome del prodotto, da mantenere come "Taskly" in ogni lingua. Niente su "snooze". Questa lacuna conta più avanti.
Passo 2: scrivere il codice, segnalare le chiavi
La funzionalità: posticipare un’attività a più tardi oggi, a domani mattina o alla settimana prossima, mostrare quando torna, contare le attività posticipate nella barra laterale e riportare indietro un’attività in anticipo. L’agente ha scritto il componente con chiamate t() e chiavi annidate sotto snooze:
const OPTIONS = ['laterToday', 'tomorrowMorning', 'nextWeek'] as const
<button onClick={() => setOpen(true)}>{t('snooze.action')}</button>
<h3>{t('snooze.menuTitle')}</h3>
{OPTIONS.map((o) => (
<button key={o} onClick={() => snooze(task, o)}>{t(`snooze.${o}`)}</button>
))}
<span>{t('snooze.snoozedUntil', { date: formatShortDate(task.snoozedUntil) })}</span>
<span>{t('snooze.count', { count: snoozedCount })}</span>
<button onClick={() => wake(task)}>{t('snooze.wakeUp')}</button>
{snoozed.length === 0 && <p>{t('snooze.empty')}</p>}
// after snoozing
toast(t('snooze.toast', { title: task.title, when: t(`snooze.${o}`).toLowerCase() }))Poi ha segnalato le undici chiavi inglesi con report_missing_keys, ognuna con una frase di contesto per chi traduce (persona o IA):
{
"snooze.wakeUp": {
"value": "Wake up",
"context": { "text": "Button on a snoozed task. Brings the task back to the active list right now." }
},
"snooze.toast": {
"value": "Snoozed “{{title}}”. We’ll nudge you {{when}}.",
"context": { "text": "Toast after snoozing a task. {{title}} is the task title. {{when}} is one of the snooze option labels in lower case, for example: tomorrow morning." }
}
}report_missing_keys aggiunge solo chiavi, non sovrascrive mai. Segnalarle nella lingua di riferimento basta: da lì prosegue la traduzione automatica.
Passo 3: cosa è tornato
Circa undici secondi dopo tutte e sei le lingue erano tradotte, valutate e (poiché la versione di sviluppo pubblica automaticamente) sulla CDN. 69 valori da 11 chiavi inglesi, perché le forme plurali seguono ogni lingua, non il testo di partenza inglese:
| Lingua | Valori | Forme plurali di snooze.count |
|---|---|---|
| Tedesco | 11 | one, other |
| Spagnolo, francese, italiano, portoghese | 12 ciascuna | one, many, other |
| Giapponese | 10 | solo other |
L’agente ha scritto due forme inglesi. Francese, italiano, spagnolo e portoghese hanno una terza categoria CLDR, many (usata per numeri molto grandi come un milione), e il giapponese ne ha una sola. Locize ha creato le forme di cui ogni lingua ha bisogno; un agente che scrive i file di lingua a mano deve saperlo.
Passo 4: i punteggi di confidenza
Ogni traduzione IA ha ricevuto una confidenza tra 0 e 1 e una motivazione di una frase. Dal 13 ottobre 2026 l’agente può leggere entrambe con get_translations e raw: true (qeScore, qeScoreReason), quindi non deve aspettare che una persona apra l’editor.
| Punteggio | Valori |
|---|---|
| 1,0 | 53 |
| 0,95 | 4 |
| 0,9 | 9 |
| 0,8 | 2 |
| 0,7 | 1 |
| sotto 0,7 | 0 |
Niente è stato instradato nelle proposte di revisione: l’instradamento avviene sotto la soglia (0,7 di default) o quando il valutatore segnala un problema grave, e nessuna delle due cose è successa. Le motivazioni indicavano comunque le stringhe più deboli:
| Chiave | Lingua | Traduzione | Punteggio | Motivazione (valutatore) |
|---|---|---|---|---|
snooze.wakeUp | Spagnolo | Despertar | 0,7 | Traduzione letterale di "Wake up"; "Reactivar" è più idiomatico nella gestione delle attività |
snooze.wakeUp | Tedesco | Aufwecken | 0,8 | Traduzione letterale; "Aktivieren" o "Wiederherstellen" si adatta meglio a un’interfaccia per attività |
snooze.wakeUp | Giapponese | 起こす | 0,8 | Un po’ innaturale; 今すぐ戻す si adatta meglio a un’app per attività |
snooze.action | Tedesco | Schlummern | 0,9 | Tecnicamente corretto, ma "Zurückstellen" è più idiomatico per la gestione delle attività |
Francese, italiano e portoghese hanno reso "Wake up" correttamente senza aiuto (Réactiver e Riattiva a 1,0, Retomar a 0,9). Lì la frase di contesto ha fatto il suo lavoro; nelle altre tre lingue il pulsante è comunque diventato un invito a svegliare qualcuno.
Passo 5: l’agente rivede, e intercetta ciò che i punteggi non hanno visto
Leggendo i punteggi, l’agente ha trovato qualcosa che nessun punteggio singolo mostra: il tedesco usava due termini per la stessa azione. Cinque chiavi dicevano "Schlummern", il toast diceva "pausiert", e il valutatore aveva dato a quel toast 0,9, "alta qualità". Quality Estimation valuta una stringa alla volta, quindi la coerenza tra le chiavi non è qualcosa che può vedere.
La traduzione IA variava anche da un’esecuzione all’altra. Avevamo già segnalato una volta le stesse chiavi con lo stesso contesto (le chiavi sono state rimosse e segnalate di nuovo con i nomi annidati): quella prima esecuzione aveva scelto "Zurückstellen", la seconda "Schlummern". Nessuna delle due è sbagliata; rilasciarle entrambe sì. Senza una voce di glossario, la bozza varia da un’esecuzione all’altra: è la modalità di guasto che l’articolo di categoria descrive, e il motivo per cui la voce di glossario più sotto è la vera soluzione.
L’agente ha inviato le sue revisioni con update_translations e quality: "AI": il tedesco coerentemente "Zurückstellen" (toast compreso), e "Wake up" come Reaktivieren, Reactivar e 今すぐ戻す. Dichiarate come output IA, le revisioni restano nella coda di revisione invece di contare come approvate. Poi ha avviato una revisione IA (start_ai_review) per valutarle di nuovo, perché ogni modifica fa cadere il vecchio punteggio:
- 10 valori controllati, 10 valutati, 0 messi in dubbio, 1746 AI token.
- Il tedesco ora ottiene 1,0 ovunque tranne Reaktivieren (0,9); lo spagnolo Reactivar 1,0, il giapponese 今すぐ戻す 0,9.
- Una nota onesta a margine: al secondo passaggio il valutatore ha osservato che "Aufwecken" sarebbe stato "più giocoso/diretto". Al primo passaggio aveva definito la stessa parola una traduzione letterale. Chi assegna i punteggi smista, non giudica.
La soluzione alla causa principale è una voce di glossario per "snooze" in ogni lingua. Il server MCP legge soltanto il glossario, quindi aggiungere il termine è un passo che spetta a una persona, ed è giusto così: la terminologia è una decisione, non una bozza.
Passo 6: la revisione
I valori tedeschi sono passati per la coda di revisione dell’editor: ognuno accanto al suo testo di partenza, alla frase di contesto dell’agente e alla guida di stile. Nove sono stati confermati così com’erano. Due cose erano sfuggite sia al valutatore sia all’agente:
- Una stringa con punteggio 1,0, "Traduzione perfetta": "Later today" era diventato "Heute später". Tedesco corretto, ma come opzione di menu "Später heute" suona più naturale, quindi la revisione l’ha cambiato. La modifica ha rimosso il punteggio, perché un punteggio descrive solo il testo per cui è stato calcolato.
- Un bug nel codice dell’agente stesso. Il toast inserisce in una frase un’etichetta di opzione tradotta, messa in minuscolo: va bene per "tomorrow morning", è sbagliato in tedesco, dove i sostantivi hanno la maiuscola: "Wir erinnern dich nächste woche." Nessun punteggio può vederlo, perché ogni stringa è corretta di per sé. La correzione va nel codice: un toast per opzione, usando il context di i18next invece della concatenazione di stringhe.
// before: toast(t('snooze.toast', { title, when: t(`snooze.${o}`).toLowerCase() }))
toast(t('snooze.toast', { context: o, title: task.title }))
// keys: snooze.toast_laterToday, snooze.toast_tomorrowMorning, snooze.toast_nextWeekIl toast tedesco è rimasto non confermato: il suo testo va bene, ma la chiave sta per essere sostituita dalle chiavi con context qui sopra.
È questa la divisione del lavoro che l’esecuzione suggerisce: il valutatore classifica le singole stringhe, l’agente controlla la coerenza sull’intero lotto e corregge ciò che gli viene indicato, e la revisione intercetta ciò che è giusto preso da solo e sbagliato nell’uso.

Passo 7: la traccia
L’export di provenienza (panoramica del progetto, menu contestuale della versione, provenance (CSV + JSON)) ha dato a ogni chiave del branch uno stato di revisione. Per gli 80 valori della funzionalità, gli 11 testi di partenza inglesi e le 69 traduzioni:
| Stato di revisione | Valori | Di cosa si trattava |
|---|---|---|
agentEdited | 11 | I testi di partenza inglesi che l’agente ha segnalato. L’agente ha scritto anche il testo di partenza, e la traccia lo dice |
humanReviewed | 9 | Valori tedeschi confermati nella revisione, ognuno con il punteggio di confidenza al momento della decisione |
humanEdited | 1 | "Später heute" |
machineOnly | 59 | Tutte le altre traduzioni: spagnolo, francese, italiano, giapponese e portoghese, le revisioni dell’agente e il toast tedesco. Ognuna indica l’agente come chi l’ha avviata e resta nella coda di revisione |
Due righe dal JSON, accorciate, senza il nome del revisore:
[{
"language": "de", "key": "snooze.wakeUp", "value": "Reaktivieren", "quality": "AI",
"reviewStatus": "humanReviewed",
"lastHumanAction": {
"type": "reviewConfirmed", "occurredAt": "2026-10-13T14:26:54.518Z",
"value": "Reaktivieren", "matchesCurrentValue": true,
"qeScore": 0.9, "qeScoreReason": "Meaning is clear, though 'Aufwecken' could have been more playful/direct, 'Reaktivieren' is professional."
}
},
{
"language": "es", "key": "snooze.wakeUp", "value": "Reactivar", "quality": "AI",
"reviewStatus": "machineOnly",
"lastHumanAction": {
"type": "machineWritten", "occurredAt": "2026-10-13T14:04:58.246Z",
"by": { "agent": "Claude (OAuth)" }, "quality": "AI"
},
"needsReview": true, "qeScore": 1
}]I 59 valori solo macchina sono la parte onesta della traccia: l’agente ha corretto "Wake up" in spagnolo e in giapponese, i punteggi dicono che le correzioni sono buone, e nessuno che legga lo spagnolo o il giapponese le ha ancora guardate. L’export non arrotonda per eccesso.
Cosa è servito, e a cosa fare attenzione
- Costo: traduzione e valutazione girano sul provider IA del progetto: AI token di Locize, oppure la vostra chiave OpenAI, Gemini o Mistral. La valutazione raddoppia circa le chiamate IA di un’esecuzione di traduzione; il nuovo controllo di 10 valori rivisti è costato 1746 token.
- Soglia: a 0,7 niente è stato instradato in questa esecuzione, perché le stringhe brevi di interfaccia con contesto ottengono punteggi alti. Se per alcune lingue volete che tutto passi davanti a una persona, attivate lì le proposte di revisione e fate in modo che l’agente passi
autoTranslateReview: trueareport_missing_keys: le traduzioni automatiche avviate tramite MCP o API diventano proposte solo con quel flag. - Pubblicazione: la versione di sviluppo ha pubblicato ogni passo automaticamente. Rilasciate in produzione da una versione separata dopo la revisione; la guida al workflow per l’articolo 50 copre la configurazione della revisione e il motivo per cui la revisione deve essere l’ultimo intervento.
- Le scritture dell’agente sono contrassegnate: le scritture tramite il server MCP portano il contrassegno dell’agente nella cronologia (il nome del client che ha effettuato l’accesso, "Claude (OAuth)" nella nostra esecuzione), così l’export non le riporta come scritture di una persona.
Provatelo sul vostro progetto
- Collegate il server MCP al vostro agente.
- Nelle impostazioni del progetto, attivate la traduzione automatica, Quality Estimation e il Review AI workflow.
- Chiedete all’agente di costruire la funzionalità su un branch, segnalare le chiavi con una frase di contesto ciascuna, rileggere punteggi e motivazioni, e correggere ciò che può prima che guardiate voi.
- Revisionate nell’editor, poi scaricate l’export di provenienza.
Se il vostro agente scrive già le vostre stringhe, questo è il modo più breve per vedere cosa rilascia. Create un progetto gratuito, collegate il server MCP e lasciate che la prossima funzionalità ci passi attraverso.
Domande frequenti
Come faccio a far localizzare una funzionalità a Claude Code o Cursor con Locize?
Collegate il server MCP di Locize, lasciate che l’agente scriva il codice con chiamate t() e segnali le nuove chiavi con report_missing_keys e una frase di contesto per chiave. Con la traduzione automatica attiva, le chiavi tornano in ogni lingua di destinazione; con Quality Estimation attiva, ogni traduzione IA riceve un punteggio di confidenza e una motivazione che l’agente legge con get_translations e raw: true. Un branch tiene le stringhe fuori dal progetto principale finché non ne fate il merge, dopo la revisione.
Quality Estimation intercetta ogni traduzione sbagliata? No. Valuta ogni stringa per conto suo, quindi non vede l’incoerenza tra le chiavi né il codice che costruisce frasi da pezzi tradotti. Nella nostra esecuzione nessuna delle 69 traduzioni IA ha avuto un punteggio sotto 0,7, le motivazioni indicavano comunque le stringhe più deboli, e la revisione ha comunque cambiato una stringa con punteggio 1,0. Quality Estimation decide dove una persona guarda per prima; non sostituisce lo sguardo.
Cosa mostra l’export di provenienza per le traduzioni scritte da un agente IA? Il testo che l’agente ha inviato come output IA viene riportato come output macchina, con l’agente indicato come chi lo ha avviato; il testo confermato da una persona come revisionato da una persona; il testo modificato da una persona come modificato da una persona. Le scritture e le conferme dell’agente non dichiarate come output macchina vengono riportate come agentEdited e agentConfirmed, mai come azione di una persona.
Perché l’agente segnala le chiavi invece di modificare i file di lingua? Perché i file non hanno memoria né traccia. Le chiavi segnalate vengono tradotte con il glossario e la guida di stile come contesto, valutate, di default tenute nella coda di revisione finché una persona non le conferma, e ogni azione viene registrata nella cronologia.
Le traduzioni IA vanno online prima che qualcuno le revisioni?
Solo dove lo permettete. Nella nostra esecuzione la versione di sviluppo ha pubblicato automaticamente, ed è ciò che volete durante lo sviluppo. La produzione è una versione separata che pubblicate dopo la revisione. Oppure attivate le proposte di revisione per una lingua e fate in modo che l’agente passi autoTranslateReview: true quando segnala le chiavi, così il valore effettivo cambia solo quando una persona accetta.
Stanco di gestire le traduzioni a mano?
Locize è il backend di gestione delle traduzioni creato dal team di i18next: distribuzione via CDN, traduzione con AI, editing in-context, senza nuovi deploy.
Inizia la prova gratuita di 14 giorni