Guida · Migrazione
Migrare da i18next
Già in produzione con i18next? @sonenta/react-i18next è un sostituto diretto (drop-in) di react-i18next, stessa API useTranslation() e t(): basta cambiare il provider e le vostre traduzioni arrivano in tempo reale dal CDN. Portate i vostri file locales/ esistenti in Sonenta con un solo comando, poi lasciate il vostro codice così com'è. L'import crea le chiavi mancanti, aggiorna ogni traduzione ed è completamente idempotente: potete rilanciarlo dalla CI senza timori. Ecco l'intero percorso: installare, importare, pubblicare, verificare, collegare l'SDK.
Prima di iniziare
Tre cose, e siete pronti a importare:
- Un progetto. Createne uno nella dashboard e copiatene il
project_uuid. - Una chiave API con scope
mcp:*. La CLI passa attraverso la superficie MCP, una chiave limitata al progetto restituisce403. La referenza CLI spiega come generarne una. - Node 18+ e i vostri file i18next esistenti, disposti come
<lang>/<namespace>.json(anche le disposizioni atipiche sono gestite).
1. Installare e inizializzare
Installate la CLI globalmente, generate una config che punta al vostro progetto ed esportate la vostra chiave.
terminal 1# one global install, gives you the `sonenta` command (Node >= 18)2npm i -g @sonenta/cli 4# scaffold sonenta.config.json and point it at your project5sonenta init --project <project_uuid> 7# the CLI talks to the MCP surface, use an mcp:* scoped key8export SONENTA_TOKEN=snt_live_<prefix>.<secret> sonenta init scrive un sonenta.config.json che potete committare. In CI, saltate init e passate --project più la variabile d'ambiente SONENTA_TOKEN. sonenta e SONENTA_* sono canonici; il vecchio comando sonenta e le variabili SONENTA_* funzionano ancora durante la transizione.
2. Anteprima, poi import
L'import legge il percorso di ogni file per dedurne lingua e namespace: un albero locales/ convenzionale non richiede alcuna opzione. Fate prima un dry-run per vedere il piano, poi rimuovete --dry-run per applicarlo.
your repo 1# the importer infers (language, namespace) from each path:2# <lang>/<namespace>.json3locales/4├─ en/5│ ├─ common.json → language en · namespace common6│ └─ checkout.json → language en · namespace checkout7└─ fr/8 ├─ common.json → language fr · namespace common9 └─ checkout.json → language fr · namespace checkout terminal 1# preview first, no writes, prints exactly what WOULD change2sonenta import "./locales/**/*.json" --dry-run 4# the real run, idempotent, safe to repeat5sonenta import "./locales/**/*.json" 7✓ common · checkout (en, fr)8 keys 312 created · 0 reused9 translations 624 created · 0 updated · 0 unchanged10 errors 0 · glossary 0 violations 12# non-standard layout? override the inference per file:13sonenta import strings.fr.json --language fr --namespace common Gli alberi possono essere annidati o piatti, entrambi si importano in modo identico. --status imposta lo stato in ingresso (draft o translated, predefinito translated); --version punta a una versione non predefinita. I plurali espressi come dizionario CLDR ({ one, other }) vengono memorizzati automaticamente come forme plurali.
3. Pubblicare sul CDN
L'import riempie il progetto; la pubblicazione lo rende servibile. Tagliate una release e i bundle si propagano sul CDN globale da cui legge l'SDK.
terminal 1# cut a CDN release so the SDK and your build can fetch it2sonenta releases publish 4→ released "main" · propagating to cdn.sonenta.com Le release sono istantanee immutabili di una versione. Ripubblicate ogni volta che importate nuovi contenuti, sia l'SDK sia la vostra build statica recuperano l'ultima release.
4. Verificare il bundle
Confermate che il contenuto è online. Un bundle pubblicato è un semplice file JSON pubblico per lingua e namespace, recuperatene uno direttamente, oppure aprite il progetto nella dashboard.
terminal 1# the published bundle is public, no auth needed2curl -s https://cdn.sonenta.com/p/<project_uuid>/main/latest/fr/common.json Un 404 su una lingua? Non fa ancora parte delle lingue del progetto, oppure la release non si è propagata, attendete qualche secondo e riprovate.
5. Puntare il vostro SDK su Sonenta
Sostituite il vostro backend i18next con il provider Sonenta. Le vostre chiamate t(), le chiavi e i namespace restano identici, le traduzioni ora provengono dal bundle CDN che avete appena pubblicato.
main.tsx 1// src/main.tsx, point @sonenta/react-i18next at the same project2import { SonentaProvider } from "@sonenta/react-i18next"; 4<SonentaProvider5 projectUuid="<project_uuid>"6 token={import.meta.env.VITE_SONENTA_TOKEN}7 defaultLocale="fr"8 namespaces={["common", "checkout"]}9>10 <App />11</SonentaProvider> Chiavi che contengono punti (una versione, un prezzo, un riferimento biblico)? Impostate keySeparator={false} e passate il progetto a flat, vedi la guida Chiavi piatte o annidate. Altrimenti il valore predefinito annidato funziona così com'è.
Rilanciabile in qualsiasi momento
sonenta import è idempotente: reimportare contenuti identici non cambia nulla (0 create, 0 aggiornate, N invariate). Collegatelo alla CI per mantenere Sonenta sincronizzato con il vostro repository, crea solo ciò che manca e aggiorna solo ciò che è realmente cambiato.
Cosa gestisce l'import
- Annidato o piatto. Entrambe le forme JSON si importano verso le stesse chiavi, nessuna pre-elaborazione.
- Plurali. I dizionari di plurali CLDR (
{ one, other, … }, conotherobbligatorio) diventano automaticamente chiavi plurali. - Resilienza per file. Una lingua o un namespace sconosciuto viene segnalato come errore per unità, il resto dell'import va comunque a buon fine.
- Controlli del glossario. Le traduzioni importate passano attraverso il vostro glossario; le violazioni vengono elencate e saltate in caso di applicazione rigorosa.
- Pulizia delle chiavi mancanti. Gli eventi di chiave mancante aperti per le chiavi importate si risolvono non appena arrivano i valori.