تخطَّ إلى المحتوى
Sonenta

دليل · الانتقال

الانتقال من i18next

هل أنت في الإنتاج بالفعل مع i18next؟ @sonenta/react-i18next هو بديل مباشر (drop-in) لـ react-i18next — واجهة useTranslation() وt() نفسها: تبدّل الموفّر فقط فتأتي ترجماتك مباشرةً من الـ CDN. أحضِر ملفات locales/ الموجودة لديك إلى Sonenta بأمر واحد، ثم أبقِ شيفرتك كما هي. ينشئ الاستيراد المفاتيح المفقودة، ويحدّث كل ترجمة، وهو عديم التأثير الجانبي تمامًا: فيمكنك إعادة تشغيله من الـ CI دون خوف. إليك المسار الكامل: التثبيت، الاستيراد، النشر، التحقق، وربط الـ SDK.

قبل أن تبدأ

ثلاثة أشياء، وستكون جاهزًا للاستيراد:

1. التثبيت والتهيئة

ثبّت الـ CLI عالميًا، وولّد إعدادًا يشير إلى مشروعك، وصدّر مفتاحك.

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 ملف sonenta.config.json يمكنك إيداعه. في الـ CI، تخطَّ init ومرّر --project إضافةً إلى متغيّر البيئة SONENTA_TOKEN. sonenta وSONENTA_* هي المعتمدة؛ وما زال أمر sonenta القديم ومتغيّرات SONENTA_* يعملان خلال فترة الانتقال.

2. المعاينة، ثم الاستيراد

يقرأ المستورِد مسار كل ملف ليستنتج لغته ونطاق أسمائه، لذا لا تحتاج شجرة locales/ التقليدية إلى أي خيارات. نفّذ تشغيلًا تجريبيًا أولًا لرؤية الخطة، ثم احذف --dry-run لتطبيقها.

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

قد تكون الأشجار متداخلة أو مُسطّحة — وكلاهما يُستورَد بصورة متطابقة. يضبط --status الحالة الواردة (draft أو translated، الافتراضي translated)؛ ويستهدف --version إصدارًا غير افتراضي. تُخزَّن الجموع المُعبَّر عنها كقاموس CLDR ({ one, other }) كصيغ جمع تلقائيًا.

3. النشر إلى الـ CDN

يملأ الاستيراد المشروع؛ والنشر يجعله قابلًا للتقديم. أصدر نسخة فتنتشر الحزم على الـ CDN العالمي الذي يقرأ منه الـ 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

الإصدارات لقطات ثابتة لإصدار. أعد النشر كلما استوردت محتوى جديدًا — فكلٌّ من الـ SDK وبنائك الثابت يجلبان أحدث إصدار.

4. التحقق من الحزمة

تأكّد من أن المحتوى منشور. الحزمة المنشورة هي مجرد ملف JSON عام لكل لغة ونطاق أسماء — اجلب واحدًا مباشرةً، أو افتح المشروع في لوحة التحكم.

terminal
1# the published bundle is public — no auth needed2curl -s https://cdn.sonenta.com/p/<project_uuid>/main/latest/fr/common.json

حصلت على 404 على لغة؟ إنها ليست من لغات المشروع بعد، أو أن الإصدار لم ينتشر — انتظر بضع ثوانٍ وأعد المحاولة.

5. توجيه الـ SDK إلى Sonenta

استبدِل واجهة i18next الخلفية بموفّر Sonenta. تبقى نداءات t() ومفاتيحك ونطاقات أسمائك كما هي — وتأتي الترجمات الآن من حزمة الـ CDN التي نشرتها لتوّك.

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>

مفاتيح تحتوي على نقاط (إصدار، أو سعر، أو مرجع كتابي)؟ عيّن keySeparator={false} وحوّل المشروع إلى مُسطّح — انظر دليل المفاتيح المُسطّحة أو المتداخلة. خلاف ذلك، يعمل الافتراضي المتداخل كما هو.

قابل لإعادة التشغيل في أي وقت

sonenta import عديم التأثير الجانبي: إعادة استيراد محتوى متطابق لا تغيّر شيئًا (0 created, 0 updated, N unchanged). اربطه بالـ CI لإبقاء Sonenta متزامنًا مع مستودعك — فهو لا ينشئ إلا ما هو مفقود ولا يحدّث إلا ما تغيّر فعلًا.

ما يعالجه المستورِد

بعد ذلك