دليل · الانتقال
الانتقال من i18next
هل أنت في الإنتاج بالفعل مع i18next؟ @sonenta/react-i18next هو بديل مباشر (drop-in) لـ react-i18next, واجهة useTranslation() وt() نفسها: تبدّل الموفّر فقط فتأتي ترجماتك مباشرةً من الـ CDN. أحضِر ملفات locales/ الموجودة لديك إلى Sonenta بأمر واحد، ثم أبقِ شيفرتك كما هي. ينشئ الاستيراد المفاتيح المفقودة، ويحدّث كل ترجمة، وهو عديم التأثير الجانبي تمامًا: فيمكنك إعادة تشغيله من الـ CI دون خوف. إليك المسار الكامل: التثبيت، الاستيراد، النشر، التحقق، وربط الـ SDK.
قبل أن تبدأ
ثلاثة أشياء، وستكون جاهزًا للاستيراد:
- مشروع. أنشئ واحدًا في لوحة التحكم وانسخ
project_uuidالخاص به. - مفتاح API بنطاق
mcp:*. تمر الـ CLI عبر سطح MCP, فمفتاح مقيّد بالمشروع يُرجع403. يشرح مرجع الـ CLI كيفية إنشاء واحد. - Node 18+ وملفات i18next الموجودة لديك، مرتّبة بصيغة
<lang>/<namespace>.json(تُعالَج التراتيب غير المعتادة أيضًا).
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 متزامنًا مع مستودعك, فهو لا ينشئ إلا ما هو مفقود ولا يحدّث إلا ما تغيّر فعلًا.
ما يعالجه المستورِد
- متداخل أو مُسطّح. كلتا صيغتي JSON تُستورَدان إلى المفاتيح نفسها, دون أي معالجة مسبقة.
- الجموع. تصير قواميس الجمع وفق CLDR (
{ one, other, … }، معotherالإلزامي) مفاتيح جمع تلقائيًا. - مرونة لكل ملف. يُبلَّغ عن لغة أو نطاق أسماء غير معروف كخطأ لكل وحدة, ومع ذلك ينجح بقية الاستيراد.
- فحوص المسرد. تمرّ الترجمات المستورَدة عبر مسردك؛ وتُسرَد المخالفات، وتُتخطّى عند الإنفاذ الصارم.
- تنظيف المفاتيح المفقودة. تُحلّ أحداث المفاتيح المفقودة المفتوحة للمفاتيح المستورَدة فور وصول القيم.