Guide · Migrering
Migrera från i18next
Är du redan i produktion med i18next? @sonenta/react-i18next är en drop-in-ersättning för react-i18next — samma useTranslation()- och t()-API, du byter bara ut providern och dina översättningar kommer live från CDN:n. För in dina befintliga locales/-JSON-filer i Sonenta med ett enda kommando, och behåll sedan din kod exakt som den är. Importen skapar de nycklar som saknas, upsertar varje översättning och är fullt idempotent, så du kan köra om den från CI utan oro. Detta är hela vägen: installera, importera, publicera, verifiera, koppla in SDK:t.
Innan du börjar
Tre saker, sedan är du redo att importera:
- Ett projekt. Skapa ett i dashboarden och kopiera dess
project_uuid. - En API-nyckel med scopet
mcp:*. CLI:t körs mot MCP-ytan — en projektbegränsad nyckel returnerar403. CLI-referensen beskriver hur du skapar en. - Node 18+ och dina befintliga i18next-filer, upplagda som
<lang>/<namespace>.json(avvikande upplägg hanteras också).
1. Installera och initiera
Installera CLI:t globalt, skapa en grundkonfiguration som pekar på ditt projekt och exportera din nyckel.
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 som du kan checka in. I CI, hoppa över init och skicka --project plus miljövariabeln SONENTA_TOKEN. sonenta och SONENTA_* är kanoniska; det äldre kommandot sonenta och variablerna SONENTA_* fungerar fortfarande under övergången.
2. Förhandsgranska, importera sedan
Importören läser varje fils sökväg för att härleda dess språk och namespace, så ett konventionellt locales/-träd behöver inga flaggor. Kör en dry-run först för att se planen, ta sedan bort --dry-run för att tillämpa 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äd kan vara nästlade eller platta — båda importeras identiskt. --status sätter den inkommande statusen (draft eller translated, standard translated); --version riktar in sig på en icke-standardversion. Pluraler uttryckta som en CLDR-dict ({ one, other }) lagras automatiskt som pluralformer.
3. Publicera till CDN:n
Importen fyller projektet; publiceringen gör det serverbart. Skär en release och buntarna sprids till den globala CDN:n som SDK:t läser från.
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 är oföränderliga ögonblicksbilder av en version. Publicera om så snart du importerar nytt innehåll — både SDK:t och din statiska build hämtar den senaste releasen.
4. Verifiera bunten
Bekräfta att innehållet är live. En publicerad bunt är en vanlig, publik JSON-fil per språk och namespace — hämta en direkt, eller öppna projektet i dashboarden.
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å en lokal? Den är inte ett av projektets språk ännu, eller så har releasen inte spridits — ge det några sekunder och försök igen.
5. Rikta ditt SDK mot Sonenta
Byt ut din i18next-backend mot Sonenta-providern. Dina t()-anrop, nycklar och namespaces förblir desamma — översättningarna kommer nu från CDN-bunten du just publicerade.
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> Nycklar som innehåller punkter (en version, ett pris, en bibelhänvisning)? Sätt keySeparator={false} och växla projektet till platt — se guiden Platta eller nästlade nycklar. Annars fungerar den nästlade standarden direkt.
Kan köras om när som helst
sonenta import är idempotent: att importera om identiskt innehåll ändrar ingenting (0 skapade, 0 uppdaterade, N oförändrade). Koppla in det i CI för att hålla Sonenta synkat med ditt repo — det skapar bara det som saknas och uppdaterar bara det som faktiskt har ändrats.
Vad importören hanterar
- Nästlad eller platt. Båda JSON-formerna importeras till samma nycklar — ingen förbearbetning.
- Pluraler. CLDR-pluraldictar (
{ one, other, … }, medotherobligatoriskt) blir automatiskt pluralnycklar. - Robusthet per fil. Ett okänt språk eller namespace rapporteras som ett fel per enhet — resten av importen landar ändå.
- Glossarkontroller. Importerade översättningar körs genom ditt glossar; överträdelser listas och hoppas över vid strikt efterlevnad.
- Rensning av saknade nycklar. Öppna händelser för saknade nycklar för de importerade nycklarna löses automatiskt så snart värdena anländer.