Veiledning · Migrering
Migrer fra i18next
Allerede i produksjon med i18next? @sonenta/react-i18next er en drop-in-erstatning for react-i18next — samme useTranslation()- og t()-API: du bytter bare provider, og oversettelsene dine kommer live fra CDN. Ta de eksisterende locales/-filene dine inn i Sonenta med én enkelt kommando, og behold koden din nøyaktig som den er. Importen oppretter de manglende nøklene, upserter hver oversettelse, og er fullstendig idempotent: du kan kjøre den på nytt fra CI uten frykt. Her er hele stien: installere, importere, publisere, verifisere, koble til SDK-en.
Før du begynner
Tre ting, så er du klar til å importere:
- Et prosjekt. Opprett ett i dashbordet og kopier dets
project_uuid. - En API-nøkkel med
mcp:*-scope. CLI-en går mot MCP-flaten — en prosjektbegrenset nøkkel returnerer403. CLI-referansen dekker hvordan du genererer en. - Node 18+ og dine eksisterende i18next-filer, lagt opp som
<lang>/<namespace>.json(uvanlige oppsett håndteres også).
1. Installer og initialiser
Installer CLI-en globalt, generer en config som peker mot prosjektet ditt, og eksporter nøkkelen din.
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 skriver en sonenta.config.json du kan committe. I CI hopper du over init og sender --project pluss miljøvariabelen SONENTA_TOKEN. sonenta og SONENTA_* er kanoniske; den eldre sonenta-kommandoen og SONENTA_*-variablene fungerer fortsatt i overgangsperioden.
2. Forhåndsvis, deretter importer
Importøren leser stien til hver fil for å utlede språk og namespace, så et konvensjonelt locales/-tre trenger ingen flagg. Kjør en dry-run først for å se planen, og fjern deretter --dry-run for å anvende den.
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 Trær kan være nestede eller flate — begge importeres identisk. --status setter innkommende status (draft eller translated, standard translated); --version sikter mot en ikke-standard versjon. Flertallsformer uttrykt som en CLDR-dict ({ one, other }) lagres automatisk som flertallsformer.
3. Publiser til CDN
Importen fyller prosjektet; publiseringen gjør det serverbart. Skjær en release, og bundlene propagerer til det globale CDN-et som SDK-en leser fra.
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 Releaser er uforanderlige snapshots av en versjon. Republiser hver gang du importerer nytt innhold — både SDK-en og det statiske bygget ditt henter den nyeste releasen.
4. Verifiser bundlen
Bekreft at innholdet er live. En publisert bundle er en enkel, offentlig JSON-fil per språk og namespace — hent en direkte, eller åpne prosjektet i dashbordet.
terminal 1# the published bundle is public — no auth needed2curl -s https://cdn.sonenta.com/p/<project_uuid>/main/latest/fr/common.json 404 på et språk? Det er ikke ett av prosjektets språk ennå, eller releasen har ikke propagert — vent noen sekunder og prøv igjen.
5. Pek SDK-en din mot Sonenta
Bytt ut i18next-backenden din med Sonenta-provideren. Dine t()-kall, nøkler og namespaces forblir de samme — oversettelsene kommer nå fra CDN-bundlen du nettopp publiserte.
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> Nøkler som inneholder punktum (en versjon, en pris, en skriftstedsreferanse)? Sett keySeparator={false} og bytt prosjektet til flat — se veiledningen Flate eller nestede nøkler. Ellers fungerer den nestede standarden som den er.
Kjørbar på nytt når som helst
sonenta import er idempotent: å reimportere identisk innhold endrer ingenting (0 opprettet, 0 oppdatert, N uendret). Koble det inn i CI for å holde Sonenta synkronisert med repoet ditt — det oppretter kun det som mangler og oppdaterer kun det som faktisk har endret seg.
Hva importøren håndterer
- Nestet eller flat. Begge JSON-formene importeres til de samme nøklene — ingen forhåndsbehandling.
- Flertallsformer. CLDR-flertallsdicter (
{ one, other, … }, medotherobligatorisk) blir automatisk til flertallsnøkler. - Robusthet per fil. Et ukjent språk eller namespace rapporteres som en feil per enhet — resten av importen lander likevel.
- Glossar-sjekker. Importerte oversettelser går gjennom glossaret ditt; brudd listes opp, og hoppes over ved streng håndheving.
- Opprydding av manglende nøkler. Åpne hendelser for manglende nøkler for de importerte nøklene løses så snart verdiene kommer.