استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تاريخ الإصدارات
- "استخدام الوسيط البرمجي وخطافات remix-intlayer"v9.5.519/9/2026
- "التوثيق الأولي لـ Remix 3"v9.5.09/9/2026
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
ترجم موقع Remix 3 الخاص بك باستخدام Intlayer
يوضح هذا الدليل كيفية دمج Intlayer للتدويل السلس في تطبيقات Remix 3 مع التوجيه المدرك للغة، وتصريحات المحتوى الآمنة من حيث النوع، ومكونات JSX المعروضة على الخادم، ودعم بيئات التشغيل المتعددة عبر Node.js و Bun و Deno و Cloudflare Workers.
ما هو Remix 3؟
يمثل Remix 3 تحولاً معماريًا جوهريًا نحو إطار عمل ويب معياري ومستقل عن بيئة التشغيل ومبني بالكامل على معايير الويب. بدلاً من الارتباط بحزم برمجية معينة أو واجهات برمجة تطبيقات خادم خاصة، يتم توزيع Remix 3 كحزم تركيبية أحادية الغرض:
remix/fetch-router(أوremix/router): توجيه خفيف ومتوافق مع المعايير مبني على Fetch API (RequestوResponse).remix/ui: نموذج مكونات JSX (jsxImportSource: "remix/ui"). المكون عبارة عن دالة إعداد تستقبل Handle وتعيد دالة عرض، مما يجعله يشبه React ولكنه يحتفظ بالحالة في نطاقات إغلاق JavaScript عادية.remix/middleware/render: يثبتcontext.render(<Page />)في كل طلب، مما يرسل شجرة JSX كاستجابة HTMLResponseمتدفقة.remix/node-fetch-server: محولات خادم لـ Node.js، مع دعم أصلي لـ Bun و Deno وبيئات الحافة (edge).remix/cookie: تحليل وتسلسل ملفات تعريف الارتباط بطريقة مشفرة وآمنة.
بالاقتران مع Intlayer وحزمة remix-intlayer، وهي وسيط برمجي للغة بالإضافة إلى نفس خطافات useIntlayer / useDictionary / useLocale الموجودة في react-intlayer، والمرتبطة بسياق طلب Remix، ستحصل على نظام تدويل متكامل يوفر أماناً أثناء وقت التجميع، وترجمات مؤتمتة بالذكاء الاصطناعي، وعرضاً على الخادم بدون أعباء إضافية، وتوجيهاً سلساً للغات.
جدول المحتويات
لماذا تختار Intlayer على البدائل؟
مقارنة بالحلول التقليدية مثل i18next أو أدوات تحميل الترجمة المخصصة، يقدم Intlayer تجربة مطور متكاملة ومحسنة لمعمارية الويب الحديثة:
تم تصميم Intlayer للعمل بسلاسة مع معايير الويب (Request و Response و Headers و URL). يتم توصيل remix-intlayer بموجّه Fetch في Remix 3 كوسيط برمجي خفيف الوزن، حيث يستخرج اللغة من مسارات URL أو ملفات تعريف الارتباط أو ترويسات Accept-Language ويكشفها لبقية الطلب والمعالجات والواجهات ومكونات remix/ui، دون الحاجة إلى تمريرها يدوياً.
وداعًا لمفاتيح JSON الفضفاضة وأعطال وقت التشغيل الناتجة عن فقدان المفاتيح. يفرض Intlayer عمليات فحص TypeScript عبر جميع اللغات المصرح بها، مما يحذرك في وقت البناء إذا كانت الترجمة مفقودة أو غير صالحة.
يقوم Remix 3 بعرض مكونات JSX على الخادم وبث HTML إلى العميل. تتم كتابة النص المحلل للغة المطلوبة فقط في دفق الإخراج. لا حاجة لحزم ترطيب العميل أو كتالوجات الترجمة الضخمة إلا إذا تم تمييز المكون صراحةً كـ clientEntry.
يضع Intlayer تصريحات المحتوى (.content.ts) بجانب منطق المسار، مما يقلل سياق الرموز (Tokens) المطلوب للنماذج اللغوية الكبيرة (LLMs). تتيح لك أوامر CLI المضمنة مثل intlayer fill و intlayer test أتمتة الترجمات في خطوط أنابيب CI/CD بالتكلفة المباشرة لمزود الذكاء الاصطناعي الخاص بك.
بالإضافة إلى سير العمل المعتمد على الكود، يوفر Intlayer محررًا مرئيًا مستضافًا ذاتيًا و نظام إدارة محتوى عن بُعد يسمح للمحررين والمترجمين بتحديث المحتوى دون إعادة نشر الكود.
دليل خطوة بخطوة
شاهد قالب التطبيق على GitHub.
تثبيت التبعيات
قم بتثبيت
intlayerوremix-intlayerوremix(الإصدار 3) باستخدام مدير الحزم المفضل لديك:bashنسخ الكودنسخ الكود إلى الحافظة
intlayer: محرك التدويل الأساسي الذي يوفر إدارة التكوين، والتصريح عن القواميس (t(),Dictionary)، وأدوات CLI، ومفسر وقت التشغيل.remix-intlayer: تكامل Remix 3: وسيط الموجهintlayer()الذي يحدد لغة كل طلب، وخطافاتuseIntlayerوuseDictionaryوuseLocaleالتي تقرأها في أي مكان لاحق.remix: حزمة إطار عمل Remix 3 الموحدة التي تصدرremix/routerوremix/routesوremix/uiوremix/middleware/renderوremix/node-fetch-server.
تكوين Intlayer
البنية
في هذه البنية، يتم تسجيل برمجية
intlayer()الوسيطة الخاصة بـremix-intlayerفيcreateRouter()قبل برمجيةrender()الوسيطة. وهي تقوم بإزالة بادئة اللغة قبل مطابقة الموجه، بحيث يتم التصريح عن المسارات مرة واحدة فيsrc/routes.tsبدون مقطع:locale، وتشغل بقية الطلب داخل نطاقAsyncLocalStorage، وهو ما يتيح لـuseIntlayer/useLocaleقراءة اللغة بدون وسيطات في معالجات المسار وعروضremix/ui. توضع تصريحات المحتوى بجانب العروض الخاصة بك فيsrc/:bashنسخ الكودنسخ الكود إلى الحافظة
التكوين
أنشئ ملف
intlayer.config.tsفي جذر مشروعك لتحديد اللغات المدعومة وإعدادات التدويل:intlayer.config.tsنسخ الكودنسخ الكود إلى الحافظة
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, Locales.ARABIC], defaultLocale: Locales.ENGLISH, }, }; export default config;لمزيد من خيارات التكوين، يرجى مراجعة وثائق التكوين.
التصريح عن محتواك متعدد اللغات
صرح عن محتواك المترجم في ملف
.content.ts:src/home.content.tsنسخ الكودنسخ الكود إلى الحافظة
import { t, type Dictionary } from "intlayer"; const homeContent = { key: "home", content: { title: t({ ar: "مرحبًا بك في Remix 3", en: "Welcome to Remix 3", fr: "Bienvenue sur Remix 3", es: "Bienvenido a Remix 3", }), description: t({ ar: "تطبيق تركيبي مبني على معايير الويب مع دعم تدويل أصلي.", en: "A composable, web-standard application with native i18n.", fr: "Une application composable basée sur les standards web avec i18n native.", es: "Una aplicación componible basada en estándares web con i18n nativa.", }), switchLanguage: t({ ar: "تغيير اللغة:", en: "Switch language:", fr: "Changer de langue :", es: "Cambiar idioma:", }), }, } satisfies Dictionary; export default homeContent;يدعم Intlayer أيضًا تنسيقات JSON و YAML و CommonJS. راجع وثائق التصريح عن المحتوى.
بناء قواميس Intlayer
قم بتجميع تعريفات القواميس لإنشاء أنواع TypeScript وسجلات وقت التشغيل:
bashنسخ الكودنسخ الكود إلى الحافظة
يقوم هذا الأمر بتجميع المحتوى في دليل
.intlayer، مما يتيح الإكمال التلقائي لـ TypeScript والبحث السريع في القواميس.إضافة وسيط Intlayer البرمجي
يوفر Remix 3 مسار وسائط برمجية قابلاً للتكوين عبر
createRouter({ middleware: [...] }).توفر
remix-intlayerالوسيط البرمجيintlayer(). لكل طلب وارد، يحدد اللغة باستخدام:- عنوان URL، في كل وضع توجيه باستثناء
no-prefix: بادئة المسار (مثال:/arأو/en) أو معلمة البحث?locale=. - اللغة المحفوظة بواسطة العميل: ملف تعريف ارتباط التخزين (
INTLAYER_LOCALE) أو الترويسة المخصصة (x-intlayer-locale). - تفاوض
Accept-Languageالقياسي، مع الرجوع إلىdefaultLocaleالمكون لديك.
يتم تخزين النتيجة في سياق طلب Remix كـ
context.intlayer(أوcontext.get(Intlayer))، معlocaleوdefaultLocaleوavailableLocales. ثم يشغّل الوسيط بقية الطلب داخل نطاقAsyncLocalStorageالمرتبط بهذا السياق، مما يتيح لخطافات الحزمة قراءة اللغة بدون وسيطات، في معالجات المسارات والعروض ومكوناتremix/uiعلى حد سواء:typescriptنسخ الكودنسخ الكود إلى الحافظة
يعمل
useIntlayer("home", "fr")أوuseIntlayer("faq", { item: 2 })على تجاوز لغة الطلب لاستدعاء واحد، ويقرأuseDictionary(homeContent)قاموساً مستورداً بدلاً من المفتاح. خارج الطلب، ترجع الخطافات إلى اللغة الافتراضية.يُعد الوسيط البرمجي أيضاً قواميس Intlayer عند بدء تشغيل الخادم، لذلك لن يؤدي فقدان
intlayer buildإلى ترك السجل فارغاً.اضبط
routing.enableProxy: falseفيintlayer.config.tsللإبقاء على تحديد اللغة فقط والتعامل مع التوجيه بنفسك. يتركintlayer({ ignore })الطلبات المطابقة دون تعديل (بادئة API على سبيل المثال)، بينما يتحكمintlayer({ isDevServer })فيما إذا كانت اللغة المخزنة تحدد عمليات إعادة التوجيه في الوضع التلقائي الافتراضي لـenableProxy.- عنوان URL، في كل وضع توجيه باستثناء
تعريف مسارات آمنة من حيث النوع
حدد مسارات تطبيقك باستخدام
route()منremix/routes:src/routes.tsنسخ الكودنسخ الكود إلى الحافظة
import { route } from "remix/routes"; export const routes = route({ // مسار اللغة الافتراضية home: "/", // مسار مترجم مع مقطع ديناميكي :locale localizedHome: "/:locale", });يوفر استخدام
route()إنشاء عناوين URL آمنة من حيث النوع في جميع أنحاء تطبيقك:typescriptنسخ الكودنسخ الكود إلى الحافظة
عرض الصفحات المترجمة باستخدام JSX
يقدم Remix 3 واجهة المستخدم باستخدام مكونات JSX من
remix/ui. المكون عبارة عن دالة إعداد تستقبلHandleوتعيد دالة عرض. يتم تشغيل الإعداد مرة واحدة لكل نسخة، ويعمل العرض مع كل تحديث، وتُقرأ الخصائص عبرhandle.props.ابدأ بهيكل
Documentمشترك يحدد سمات<html lang="..." dir="...">من اللغة المحددة بواسطة الوسيط البرمجي:src/views/document.tsxنسخ الكودنسخ الكود إلى الحافظة
import { getHTMLTextDir } from "intlayer"; import { useLocale } from "remix-intlayer"; import type { Handle, RemixNode } from "remix/ui"; type DocumentProps = { title: string; children?: RemixNode; }; export const Document = (handle: Handle<DocumentProps>) => () => { const { title, children } = handle.props; const { locale } = useLocale(); return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <head> <meta charSet="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>{title}</title> </head> <body>{children}</body> </html> ); };ثم أنشئ الصفحة الرئيسية. تقرأ القاموس المترجم باستخدام
useIntlayerوتعرض محوّل لغات:src/views/home.tsxنسخ الكودنسخ الكود إلى الحافظة
import { getLocaleName, getLocalizedUrl, getPathWithoutLocale } from "intlayer"; import { useIntlayer, useLocale } from "remix-intlayer"; import { Document } from "./document"; export const HomePage = () => () => { const { locale, availableLocales } = useLocale(); const home = useIntlayer("home"); const pathWithoutLocale = getPathWithoutLocale(); return ( <Document title={home.title}> <header> <nav aria-label="Languages"> <span>{home.switchLanguage}</span> <ul> {availableLocales.map((localeItem) => { const isActive = localeItem === locale; return ( <li key={localeItem} class="p-1"> <a href={getLocalizedUrl(pathWithoutLocale, localeItem)} class={isActive ? "active" : undefined} aria-current={isActive ? "page" : undefined} > {getLocaleName(localeItem, locale)} </a> </li> ); })} </ul> </nav> </header> <main> <h1>{home.title}</h1> <p>{home.description}</p> </main> </Document> ); };إن JSX في Remix ليس React: يُكتب
classكما هو (ويُقبلclassNameأيضاً)، ويتم تشغيل عمليات إعادة العرض بشكل صريح باستخدامhandle.update(). يتم تخطي القيم المحشوة تلقائياً. خطافات Intlayer هي دوال عادية تقرأ نطاق الطلب، لذا يمكن استدعاؤها من دالة الإعداد أو دالة العرض على حد سواء.ربط الموجه والخادم
أضف البرمجية الوسيطة
render()منremix/middleware/renderبجانب برمجية Intlayer الوسيطة. حيث تقوم بتثبيتcontext.render(node, init)في كل طلب، مما يرسل شجرة JSX كاستجابة HTMLResponse(مع إضافة<!DOCTYPE html>في البداية وتعيين ترويسةContent-Type):src/router.tsxنسخ الكودنسخ الكود إلى الحافظة
import { isDeclaredLocale } from "intlayer"; import { intlayer } from "remix-intlayer"; import { render } from "remix/middleware/render"; import { createRouter } from "remix/router"; import { routes } from "./routes"; import { HomePage } from "./views/home"; // 1. Initialize router with Intlayer + render middleware export const router = createRouter({ middleware: [intlayer(), render()], }); // 2. Map route handlers router.map(routes, { actions: { // Default locale route home(context) { return context.render(<HomePage />); }, // Localized route localizedHome(context) { if (!isDeclaredLocale(context.params.locale)) { return new Response("Not Found", { status: 404 }); } return context.render(<HomePage />); }, }, });يقبل
context.renderمعاملاً اختيارياًResponseInitكوسيط ثانٍ، على سبيل المثالcontext.render(<NotFoundPage />, { status: 404 }). تظل اللغة المحددة قابلة للوصول من المعالج كـcontext.intlayer.locale، على سبيل المثال لإنشاء استجابةResponse.json.أخيرًا، قم بإتاحة الموجه من خلال معالج
fetchقياسي. يعمل نفس الموجه بسلاسة على Node.js و Bun و Deno و Cloudflare Workers:src/server.tsنسخ الكودنسخ الكود إلى الحافظة
import * as http from "node:http"; import { createRequestListener } from "remix/node-fetch-server"; import { router } from "./router"; const PORT = Number(process.env.PORT || 3000); // Node.js const server = http.createServer( createRequestListener((request) => router.fetch(request)) ); server.listen(PORT, () => { console.log(`الخادم يعمل على http://localhost:${PORT}`); }); // Bun / Deno / Cloudflare Workers export default { port: PORT, fetch(request: Request) { return router.fetch(request); }, };تدقيق وملء الترجمات تلقائيًا
يوفر Intlayer أداة سطر أوامر (CLI) لتدقيق الترجمات المفقودة وملئها تلقائيًا باستخدام الذكاء الاصطناعي:
bashنسخ الكودنسخ الكود إلى الحافظة
تكوين TypeScript
وجّه JSX نحو بيئة تشغيل remix/ui وتأكد من أن ملف tsconfig.json الخاص بك يتضمن أنواع .intlayer المنشأة:
نسخ الكود إلى الحافظة
jsxImportSource: "remix/ui"هو ما يجعل<HomePage />يتم تحليله إلىcreateElementالخاص بـ Remix بدلاً من React.
الخاتمة
مع Remix 3 و Intlayer، لديك بنية برمجية خفيفة الوزن ومكتوبة بالكامل من حيث الأنواع وقابلة للنقل عبر بيئات التشغيل المختلفة وتلتزم بمعايير الويب المفتوحة. يمكن لتطبيقك التوسع بسهولة من صفحات تسويقية محلية بسيطة إلى خدمات موزعة عالميًا ومعروضة على الحافة.
