استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
تاريخ الإصدارات
- "تحديث استخدام واجهة برمجة تطبيقات useIntlayer في Solid للوصول المباشر إلى الخصائص"v8.9.0٤/٥/٢٠٢٦
- "إضافة أمر init"v7.5.9٣٠/١٢/٢٠٢٥
- "بداية السجل"v5.5.10٢٩/٦/٢٠٢٥
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةIf you have an idea for improving this documentation, please feel free to contribute by submitting a pull request on GitHub.
GitHub link to the documentationCopy doc Markdown to clipboard
ترجمة موقعك الإلكتروني المبني بـ Vite و React باستخدام Intlayer | التدويل (i18n)
جدول المحتويات
لماذا Intlayer على البدائل؟
بالمقارنة مع الحلول الرئيسية مثل react-i18next أو i18next، يعد Intlayer حلاً يأتي مزودًا بتحسينات متكاملة مثل:
تغطية كاملة لـ Vite و React
تم تحسين Intlayer للعمل بشكل مثالي مع Vite وReact من خلال تقديم نطاق المحتوى على مستوى المكونات والترجمات المحملة البطيئة وجميع الميزات اللازمة لتوسيع نطاق التدويل (i18n).
حجم البندل
بدلاً من تحميل ملفات JSON ضخمة إلى صفحاتك، قم بتحميل المحتوى الضروري فقط. يساعد Intlayer في تقليل أحجام البندل وصفحاتك بنسبة تصل إلى 50%.
الصيانة
يؤدي تحديد نطاق محتوى تطبيقك إلى تسهيل الصيانة للتطبيقات واسعة النطاق. يمكنك تكرار أو حذف مجلد ميزات واحد دون العبء العقلي لمراجعة قاعدة بيانات المحتوى بالكامل. بالإضافة إلى ذلك، تتم كتابة Intlayer بالكامل لضمان دقة المحتوى الخاص بك.
وكيل الذكاء الاصطناعي
يؤدي تحديد موقع المحتوى المشترك إلى تقليل السياق المطلوب بواسطة نماذج اللغات الكبيرة (LLMs). يأتي Intlayer أيضًا مزودًا بمجموعة من الأدوات، مثل CLI لاختبار الترجمات المفقودة،LSP، MCP ومهارات الوكيل، لجعل تجربة المطور (DX) أكثر سلاسة للذكاء الاصطناعي وكلاء.
الأتمتة
استخدم الأتمتة للترجمة في مسار CI/CD الخاص بك باستخدام LLM من اختيارك على حساب مزود الذكاء الاصطناعي الخاص بك. يقدم Intlayer أيضًا مترجمًا لأتمتة استخراج المحتوى، بالإضافة إلى منصة ويب للمساعدة في الترجمة في الخلفية.
أداء
يمكن أن يؤدي ربط ملفات JSON الضخمة بالمكونات إلى حدوث مشكلات في الأداء والتفاعل. يعمل Intlayer على تحسين تحميل المحتوى الخاص بك في وقت الإنشاء.
التحجيم مع عدم وجود مطور
أكثر من مجرد حل i18n، يوفر Intlayer [محررًا مرئيًا] مستضافًا ذاتيًا](/ar/doc/concept/editor) وكامل CMS لمساعدتك في إدارة المحتوى متعدد اللغات في الوقت الفعلي، مما يجعل التعاون مع المترجمين ومؤلفي النصوص وأعضاء الفريق الآخرين سلسًا. يمكن تخزين المحتوى محليًا و/أو عن بعد.
دليل خطوة بخطوة لإعداد Intlayer في تطبيق Vite و React
انظر نموذج التطبيق على GitHub.
تثبيت التبعيات
قم بتثبيت الحزم اللازمة باستخدام npm:
bashنسخ الكودنسخ الكود إلى الحافظة
npm install intlayer react-intlayernpm install vite-intlayer --save-devnpx intlayer initintlayer الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، والترجمة، وإعلان المحتوى، والترجمة البرمجية، وأوامر CLI.
react-intlayer الحزمة التي تدمج Intlayer مع تطبيق React. توفر مزودي السياق (context providers) وخطافات (hooks) لتدويل React.
vite-intlayer تتضمن إضافة Vite لدمج Intlayer مع مجمّع Vite، بالإضافة إلى وسيط (middleware) لاكتشاف اللغة المفضلة للمستخدم، وإدارة الكوكيز، والتعامل مع إعادة توجيه URL.
تكوين مشروعك
قم بإنشاء ملف تكوين لتحديد لغات تطبيقك:
intlayer.config.tsنسخ الكودنسخ الكود إلى الحافظة
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // لغاتك الأخرى ], defaultLocale: Locales.ENGLISH, }, }; export default config;من خلال ملف التهيئة هذا، يمكنك إعداد عناوين URL محلية، وإعادة توجيه الوسيط، وأسماء ملفات تعريف الارتباط، وموقع وامتداد إعلانات المحتوى الخاصة بك، وتعطيل سجلات Intlayer في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع توثيق التهيئة.
دمج Intlayer في تهيئة Vite الخاصة بك
أضف مكون intlayer الإضافي إلى تهيئتك.
vite.config.tsنسخ الكودنسخ الكود إلى الحافظة
import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import { intlayer } from "vite-intlayer"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [react(), intlayer()], });يتم استخدام مكون Vite الإضافي
intlayer()لدمج Intlayer مع Vite. يضمن بناء ملفات إعلان المحتوى ويراقبها في وضع التطوير. كما يعرّف متغيرات بيئة Intlayer داخل تطبيق Vite. بالإضافة إلى ذلك، يوفر أسماء مستعارة لتحسين الأداء.إعلان المحتوى الخاص بك
قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:
src/app.content.tsxنسخ الكودنسخ الكود إلى الحافظة
import { t, type Dictionary } from "intlayer"; import type { ReactNode } from "react"; const appContent = { key: "app", content: { viteLogo: t({ en: "Vite logo", fr: "Logo Vite", es: "Logo Vite", }), reactLogo: t({ en: "React logo", fr: "Logo React", es: "Logo React", }), title: "Vite + React", count: t({ en: "count is ", fr: "le compte est ", es: "el recuento es ", }), edit: t<ReactNode>({ en: ( <> حرر <code>src/App.tsx</code> واحفظ لاختبار HMR </> ), fr: ( <> Éditez <code>src/App.tsx</code> et enregistrez pour tester HMR </> ), es: ( <> Edita <code>src/App.tsx</code> y guarda para probar HMR </> ), }), readTheDocs: t({ en: "انقر على شعارات Vite و React لمعرفة المزيد", fr: "Cliquez sur les logos Vite et React pour en savoir plus", es: "Haga clic en los logotipos de Vite y React para obtener más información", }), }, } satisfies Dictionary; export default appContent;يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك بمجرد تضمينها في دليل
contentDir(افتراضيًا،./src). ويجب أن تطابق امتداد ملف إعلان المحتوى (افتراضيًا،.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).لمزيد من التفاصيل، راجع توثيق إعلان المحتوى.
إذا كان ملف المحتوى الخاص بك يتضمن كود TSX، يجب أن تفكر في استيراد
import React from "react";في ملف المحتوى الخاص بك.استخدام Intlayer في الكود الخاص بك
قم بالوصول إلى قواميس المحتوى الخاصة بك في جميع أنحاء تطبيقك:
src/App.tsxنسخ الكودنسخ الكود إلى الحافظة
import { useState, type FC } from "react"; import reactLogo from "./assets/react.svg"; import viteLogo from "/vite.svg"; import "./App.css"; import { IntlayerProvider, useIntlayer } from "react-intlayer"; const AppContent: FC = () => { const [count, setCount] = useState(0); const content = useIntlayer("app"); return ( <> <div> <a href="https://vitejs.dev" target="_blank"> <img src={viteLogo} className="logo" alt={content.viteLogo.value} /> </a> <a href="https://react.dev" target="_blank"> <img src={reactLogo} className="logo react" alt={content.reactLogo.value} /> </a> </div> <h1>{content.title}</h1> <div className="card"> <button onClick={() => setCount((count) => count + 1)}> {content.count} {count} </button> <p>{content.edit}</p> </div> <p className="read-the-docs">{content.readTheDocs}</p> </> ); }; const App: FC = () => ( <IntlayerProvider> <AppContent /> </IntlayerProvider> ); export default App;إذا كنت ترغب في استخدام المحتوى الخاص بك في خاصية من نوع
string، مثلalt،title،href،aria-label، إلخ، يجب عليك استدعاء قيمة الدالة، مثل:htmlنسخ الكودنسخ الكود إلى الحافظة
<img src="{content.image.src.value}" alt="{content.image.value}" /><img src="{content.image.src.toString()}" alt="{content.image.toString()}" /><img src="{String(content.image.src)}" alt="{String(content.image)}" />لمعرفة المزيد عن الخطاف
useIntlayer، راجع التوثيق.إذا كان تطبيقك موجودًا بالفعل، يمكنك استخدام مترجم Intlayer، بالإضافة إلى أمر الاستخراج، لتحويل آلاف المكونات في ثانية واحدة.
تغيير لغة المحتوى الخاص بك
اختياريلتغيير لغة المحتوى الخاص بك، يمكنك استخدام الدالة
setLocaleالمقدمة من الخطافuseLocale. تتيح لك هذه الدالة تعيين لغة التطبيق وتحديث المحتوى وفقًا لذلك.src/components/LocaleSwitcher.tsxنسخ الكودنسخ الكود إلى الحافظة
import type { FC } from "react"; import { Locales } from "intlayer"; import { useLocale } from "react-intlayer"; const LocaleSwitcher: FC = () => { const { setLocale } = useLocale(); return ( <button onClick={() => setLocale(Locales.English)}> تغيير اللغة إلى الإنجليزية </button> ); };لمعرفة المزيد عن الخطاف
useLocale، راجع التوثيق.إضافة التوجيه المحلي إلى تطبيقك
اختياريالغرض من هذه الخطوة هو إنشاء مسارات فريدة لكل لغة. هذا مفيد لتحسين محركات البحث (SEO) ولعناوين URL الصديقة لمحركات البحث. مثال:
plaintextنسخ الكودنسخ الكود إلى الحافظة
- https://example.com/about- https://example.com/es/about- https://example.com/fr/aboutبشكل افتراضي، لا يتم إضافة بادئة للمسارات للغة الافتراضية. إذا كنت ترغب في إضافة بادئة للغة الافتراضية، يمكنك تعيين الخيار
middleware.prefixDefaultإلىtrueفي إعداداتك. راجع توثيق الإعدادات لمزيد من المعلومات.لإضافة التوجيه المحلي إلى تطبيقك، يمكنك إنشاء مكون
LocaleRouterالذي يلف مسارات تطبيقك ويتعامل مع التوجيه بناءً على اللغة. إليك مثالًا باستخدام React Router:src/components/LocaleRouter.tsxنسخ الكودنسخ الكود إلى الحافظة
import { localeMap } from "intlayer"; // دوال مساعدة وأنواع من 'intlayer' import type { FC, PropsWithChildren } from "react"; // أنواع React للمكونات الوظيفية والخصائص import { IntlayerProvider } from "react-intlayer"; // مزود سياق التدويل import { BrowserRouter, Route, Routes } from "react-router-dom"; // مكونات الموجه لإدارة التنقل /** * مكون راوتر يقوم بإعداد مسارات خاصة بكل لغة. * يستخدم React Router لإدارة التنقل وعرض المكونات المترجمة. */ export const LocaleRouter: FC<PropsWithChildren> = ({ children }) => ( <BrowserRouter> <Routes> {localeMap(({ locale, urlPrefix }) => ( <Route // نمط المسار لالتقاط اللغة (مثل /en/، /fr/) ومطابقة جميع المسارات التالية path={`${urlPrefix}/*`} key={locale} element={ <IntlayerProvider locale={locale}>{children}</IntlayerProvider> } // يلف الأطفال بإدارة اللغة /> ))} </Routes> </BrowserRouter> );ملاحظة: إذا كنت تستخدم
routing.mode: 'no-prefix' | 'search-params'، فمن المحتمل ألا تحتاج إلى استخدام دالةlocaleMap.ثم يمكنك استخدام مكون
LocaleRouterفي تطبيقك:src/App.tsxنسخ الكودنسخ الكود إلى الحافظة
import { LocaleRouter } from "./components/LocaleRouter"; import type { FC } from "react"; // ... مكون AppContent الخاص بك const App: FC = () => ( <LocaleRouter> <AppContent /> </LocaleRouter> );بالتوازي، يمكنك أيضًا استخدام
intlayerProxyلإضافة التوجيه من جانب الخادم إلى تطبيقك. سيقوم هذا المكون الإضافي بالكشف تلقائيًا عن اللغة الحالية بناءً على عنوان URL وتعيين ملف تعريف الارتباط المناسب للغة. إذا لم يتم تحديد لغة، فسيحدد المكون الإضافي اللغة الأنسب بناءً على تفضيلات لغة متصفح المستخدم. إذا لم يتم الكشف عن أي لغة، فسيتم إعادة التوجيه إلى اللغة الافتراضية.يرجى ملاحظة أنه لاستخدام
intlayerProxyفي بيئة الإنتاج، تحتاج إلى نقل حزمةvite-intlayerمنdevDependenciesإلىdependencies.vite.config.tsنسخ الكودنسخ الكود إلى الحافظة
import { defineConfig } from "vite"; import react from "@vitejs/plugin-react-swc"; import { intlayer, intlayerProxy } from "vite-intlayer"; // https://vitejs.dev/config/ export default defineConfig({ plugins: [ intlayerProxy(), // should be placed first react(), intlayer(), ], });تغيير عنوان URL عند تغيير اللغة
اختياريلتغيير عنوان URL عند تغيير اللغة، يمكنك استخدام الخاصية
onLocaleChangeالمقدمة من الخطافuseLocale. وبالتوازي، يمكنك استخدام الخطافينuseLocationوuseNavigateمن مكتبةreact-router-domلتحديث مسار عنوان URL.src/components/LocaleSwitcher.tsxنسخ الكودنسخ الكود إلى الحافظة
import { useLocation, useNavigate } from "react-router-dom"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "react-intlayer"; import { type FC } from "react"; const LocaleSwitcher: FC = () => { const { pathname, search } = useLocation(); // الحصول على مسار عنوان URL الحالي. مثال: /fr/about?foo=bar const navigate = useNavigate(); const { locale, availableLocales, setLocale } = useLocale({ onLocaleChange: (locale) => { // بناء عنوان URL مع اللغة المحدّثة // مثال: /es/about?foo=bar const pathWithLocale = getLocalizedUrl(`${pathname}${search}`, locale); // تحديث مسار URL navigate(pathWithLocale); }, }); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <a href={getLocalizedUrl(location.pathname, localeItem)} hrefLang={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={(e) => { e.preventDefault(); setLocale(localeItem); }} key={localeItem} > <span> {/* اللغة - مثلاً FR */} {localeItem} </span> <span> {/* اللغة بلغتها الأصلية - مثلاً Français */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* اللغة باللغة الحالية - مثلاً Francés مع تعيين اللغة الحالية إلى Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* اللغة بالإنجليزية - مثلاً French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </a> ))} </div> </div> ); };مراجع التوثيق:
فيما يلي الخطوة التاسعة المحدثة مع توضيحات إضافية وأمثلة كود محسنة:
تبديل سمات اللغة والاتجاه في وسم HTML
اختياريعندما يدعم تطبيقك لغات متعددة، من الضروري تحديث سمات
langوdirفي وسم<html>لتتوافق مع اللغة الحالية. يضمن ذلك:- سهولة الوصول: تعتمد برامج قراءة الشاشة وتقنيات المساعدة على سمة
langالصحيحة لنطق المحتوى وتفسيره بدقة. - عرض النص: تضمن سمة
dir(الاتجاه) عرض النص بالترتيب الصحيح (مثلًا من اليسار إلى اليمين للإنجليزية، ومن اليمين إلى اليسار للعربية أو العبرية)، وهو أمر أساسي لسهولة القراءة. - تحسين محركات البحث (SEO): تستخدم محركات البحث سمة
langلتحديد لغة الصفحة، مما يساعد في تقديم المحتوى المحلي المناسب في نتائج البحث.
من خلال تحديث هذه السمات ديناميكيًا عند تغيير اللغة، تضمن تجربة متسقة وسهلة الوصول للمستخدمين عبر جميع اللغات المدعومة.
تنفيذ الـ Hook
قم بإنشاء hook مخصص لإدارة سمات HTML. يستمع الـ hook لتغييرات اللغة ويحدث السمات وفقًا لذلك:
src/hooks/useI18nHTMLAttributes.tsxنسخ الكودنسخ الكود إلى الحافظة
import { useEffect } from "react"; import { useLocale } from "react-intlayer"; import { getHTMLTextDir } from "intlayer"; /** * يقوم بتحديث سمات `lang` و `dir` لعنصر <html> بناءً على اللغة الحالية. * - `lang`: يُعلم المتصفحات ومحركات البحث بلغة الصفحة. * - `dir`: يضمن ترتيب القراءة الصحيح (مثل 'ltr' للإنجليزية، 'rtl' للعربية). * * هذا التحديث الديناميكي ضروري لعرض النص بشكل صحيح، وللوصولية، وتحسين محركات البحث. */ export const useI18nHTMLAttributes = () => { const { locale } = useLocale(); useEffect(() => { // تحديث خاصية اللغة إلى اللغة الحالية. document.documentElement.lang = locale; // تعيين اتجاه النص بناءً على اللغة الحالية. document.documentElement.dir = getHTMLTextDir(locale); }, [locale]); };استخدام الـ Hook في تطبيقك
قم بدمج الـ hook في المكون الرئيسي الخاص بك بحيث يتم تحديث خصائص HTML في كل مرة يتغير فيها اللغة:
src/App.tsxنسخ الكودنسخ الكود إلى الحافظة
import type { FC } from "react"; import { IntlayerProvider, useIntlayer } from "react-intlayer"; import { useI18nHTMLAttributes } from "./hooks/useI18nHTMLAttributes"; import "./App.css"; const AppContent: FC = () => { // تطبيق الـ hook لتحديث خصائص lang و dir في وسم <html> بناءً على اللغة الحالية. useI18nHTMLAttributes(); // ... بقية مكونك }; const App: FC = () => ( <IntlayerProvider> <AppContent /> </IntlayerProvider> ); export default App;بتطبيق هذه التغييرات، سيقوم تطبيقك بـ:
- ضمان أن خاصية اللغة (
lang) تعكس اللغة المحلية الحالية بشكل صحيح، وهو أمر مهم لتحسين محركات البحث وسلوك المتصفح. - ضبط اتجاه النص (
dir) وفقًا للغة المحلية، مما يعزز من قابلية القراءة وسهولة الاستخدام للغات ذات اتجاهات قراءة مختلفة. - توفير تجربة أكثر سهولة في الوصول، حيث تعتمد تقنيات المساعدة على هذه الخصائص لتعمل بشكل مثالي.
- سهولة الوصول: تعتمد برامج قراءة الشاشة وتقنيات المساعدة على سمة
إنشاء مكون رابط محلي
اختياريلضمان أن تحترم تنقلات تطبيقك اللغة الحالية، يمكنك إنشاء مكون
Linkمخصص. يقوم هذا المكون تلقائيًا بإضافة بادئة اللغة الحالية إلى عناوين URL الداخلية، بحيث عند نقر مستخدم يتحدث الفرنسية على رابط لصفحة "حول"، يتم توجيهه إلى/fr/aboutبدلاً من/about.هذا السلوك مفيد لعدة أسباب:
- تحسين محركات البحث وتجربة المستخدم: تساعد عناوين URL المترجمة محركات البحث على فهرسة الصفحات الخاصة بكل لغة بشكل صحيح وتوفر للمستخدمين محتوى بلغتهم المفضلة.
- الاتساق: باستخدام رابط مترجم في جميع أنحاء تطبيقك، تضمن أن التنقل يبقى ضمن اللغة الحالية، مما يمنع التبديلات غير المتوقعة في اللغة.
- قابلية الصيانة: توحيد منطق التوطين في مكون واحد يبسط إدارة عناوين URL، مما يجعل قاعدة الكود الخاصة بك أسهل في الصيانة والتطوير مع نمو تطبيقك.
فيما يلي تنفيذ لمكون
Linkمخصص يدعم التوطين باستخدام TypeScript:src/components/Link.tsxنسخ الكودنسخ الكود إلى الحافظة
import { getLocalizedUrl } from "intlayer"; import { forwardRef, type DetailedHTMLProps, type AnchorHTMLAttributes, } from "react"; import { useLocale } from "react-intlayer"; export interface LinkProps extends DetailedHTMLProps< AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement > {} /** * دالة مساعدة للتحقق مما إذا كان عنوان URL معين خارجيًا. * إذا بدأ عنوان URL بـ http:// أو https://، يعتبر خارجيًا. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * مكون رابط مخصص يقوم بتعديل خاصية href بناءً على اللغة الحالية. * بالنسبة للروابط الداخلية، يستخدم `getLocalizedUrl` لإضافة بادئة اللغة إلى الرابط (مثل /fr/about). * هذا يضمن أن التنقل يبقى ضمن نفس سياق اللغة. */ export const Link = forwardRef<HTMLAnchorElement, LinkProps>( ({ href, children, ...props }, ref) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href); // إذا كان الرابط داخليًا وتم توفير href صالح، احصل على الرابط المحلي. const hrefI18n = href && !isExternalLink ? getLocalizedUrl(href, locale) : href; return ( <a href={hrefI18n} ref={ref} {...props}> {children} </a> ); } ); Link.displayName = "Link";كيف يعمل
كشف الروابط الخارجية:
تقوم الدالة المساعدةcheckIsExternalLinkبتحديد ما إذا كان الرابط URL خارجيًا. يتم ترك الروابط الخارجية كما هي لأنها لا تحتاج إلى تعريب.استرجاع اللغة الحالية:
يوفر الخطافuseLocaleاللغة الحالية (مثلًاfrللفرنسية).تعريب الرابط:
بالنسبة للروابط الداخلية (أي غير الخارجية)، يتم استخدامgetLocalizedUrlلإضافة بادئة اللغة الحالية تلقائيًا إلى الرابط. هذا يعني أنه إذا كان المستخدم يتصفح باللغة الفرنسية، فإن تمرير/aboutكـhrefسيُحوَّل إلى/fr/about.إرجاع الرابط:
يعيد المكون عنصر<a>مع عنوان URL المحلي، مما يضمن أن التنقل متسق مع اللغة المختارة.
من خلال دمج هذا المكون
Linkعبر تطبيقك، تحافظ على تجربة مستخدم متماسكة وواعية باللغة، مع الاستفادة أيضًا من تحسين محركات البحث وسهولة الاستخدام.استخراج محتوى مكوناتك
اختياريإذا كان لديك قاعدة بيانات كود موجودة، فقد يكون تحويل آلاف الملفات مستهلكًا للوقت.
لتسهيل هذه العملية، يقترح Intlayer مترجمًا / مستخرجًا لتحويل مكوناتك واستخراج المحتوى.
لإعداده، يمكنك إضافة قسم
compilerفي ملفintlayer.config.tsالخاص بك:intlayer.config.tsنسخ الكودنسخ الكود إلى الحافظة
import { type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { // ... بقية التكوين الخاص بك compiler: { /** * يشير إلى ما إذا كان يجب تمكين المترجم. */ enabled: true, /** * يحدد مسار ملفات المخرجات */ output: ({ fileName, extension }) => `./${fileName}${extension}`, /** * يشير إلى ما إذا كان يجب حفظ المكونات بعد تحويلها. بهذه الطريقة، يمكن تشغيل المترجم مرة واحدة فقط لتحويل التطبيق، ثم يمكن إزالته. */ saveComponents: false, /** * بادئة مفتاح القاموس */ dictionaryKeyPrefix: "", }, }; export default config;قم بتشغيل المستخرج لتحويل مكوناتك واستخراج المحتوى
bashنسخ الكودنسخ الكود إلى الحافظة
npx intlayer extract
تكوين TypeScript
يستخدم Intlayer توسيع الوحدات (module augmentation) للاستفادة من TypeScript وجعل قاعدة الشيفرة الخاصة بك أقوى.


تأكد من أن تكوين TypeScript الخاص بك يتضمن الأنواع التي تم إنشاؤها تلقائيًا.
نسخ الكود إلى الحافظة
{ // ... تكوينات TypeScript الحالية الخاصة بك "include": [ // ... تكوينات TypeScript الحالية الخاصة بك ".intlayer/**/*.ts", // تضمين الأنواع التي تم إنشاؤها تلقائيًا ],}تكوين Git
يوصى بتجاهل الملفات التي تم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب الالتزام بها في مستودع Git الخاص بك.
للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف .gitignore الخاص بك:
نسخ الكود إلى الحافظة
# تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer.intlayer(اختياري) خريطة الموقع و robots.txt (توليد وقت البناء)
يوفّر Intlayer الدالتين generateSitemap وgetMultilingualUrls لتنسيق مخرجات جاهزة للزحّافات (sitemap.xml متعدد اللغات وrobots.txt) وكتابتها تلقائياً إلى public/. عادةً تشغّل سكربت Node صغير قبل Vite (مثلاً خطافات npm predev / prebuild).
خريطة الموقع
يولّد مولّد خرائط المواقع إعدادات اللغات ويضيف البيانات الوصفية المناسبة.
تدعم الخريطة مساحة الاسمxhtml:link(hreflang). بدلاً من قائمة عناوين مسطحة، يربط Intlayer بين جميع النسخ اللغوية لكل صفحة في الاتجاهين (مثل/aboutو/fr/aboutأو/about?lang=frوفقًا لوضع التوجيه).
Robots.txt
استخدم getMultilingualUrls لتشمل قواعد Disallow كل المتغيرات المحلية للمسارات الحساسة.
1. أضف generate-seo.mjs في جذر المشروع
نسخ الكود إلى الحافظة
import fs from "fs";import path from "path";import { fileURLToPath } from "url";import { generateSitemap, getMultilingualUrls } from "intlayer";const __dirname = path.dirname(fileURLToPath(import.meta.url));const SITE_URL = (process.env.SITE_URL || "http://localhost:5173").replace( /\/$/, "");const pathList = [ { path: "/", changefreq: "daily", priority: 1.0 }, { path: "/about", changefreq: "monthly", priority: 0.7 },];const sitemapXml = generateSitemap(pathList, { siteUrl: SITE_URL });fs.writeFileSync(path.join(__dirname, "public", "sitemap.xml"), sitemapXml);const getAllMultilingualUrls = (urls) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)));const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);const robotsTxt = [ "User-agent: *", "Allow: /", ...disallowedPaths.map((path) => `Disallow: ${path}`), "", `Sitemap: ${SITE_URL}/sitemap.xml`,].join("\n");fs.writeFileSync(path.join(__dirname, "public", "robots.txt"), robotsTxt);console.log("SEO files generated successfully.");يجب تثبيت حزمة intlayer. عيّن SITE_URL في بيئة الإنتاج (مثلاً في CI).
يُفضّلgenerate-seo.mjsلـ ESM في Node. إن استخدمتgenerate-seo.jsففعّل"type": "module"فيpackage.jsonأو ESM بطريقة أخرى.
2. شغّل السكربت قبل Vite
نسخ الكود إلى الحافظة
{ "scripts": { "dev": "vite", "prebuild": "node generate-seo.mjs", "build": "vite build", "preview": "vite preview" }}عدّل الأوامر إن كنت تستخدم pnpm أو yarn. يمكن استدعاء السكربت من CI أيضاً.
إضافة VS Code
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت إضافة Intlayer الرسمية لـ VS Code.
تقدم هذه الإضافة:
- الإكمال التلقائي لمفاتيح الترجمة.
- الكشف عن الأخطاء في الوقت الحقيقي للترجمات المفقودة.
- معاينات داخلية للمحتوى المترجم.
- إجراءات سريعة لإنشاء الترجمات وتحديثها بسهولة.
لمزيد من التفاصيل حول كيفية استخدام الإضافة، راجع توثيق إضافة Intlayer لـ VS Code.
التقدم أكثر
للتقدم أكثر، يمكنك تنفيذ المحرر المرئي أو إخراج محتواك باستخدام نظام إدارة المحتوى (CMS).