استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
هذه الوثيقة غير محدثة، تم تحديث النسخة الأساسية في 29 أغسطس 2026.
الانتقال إلى الوثيقة الإنجليزيةتاريخ الإصدارات
- "تحديث استخدام واجهة برمجة تطبيقات useIntlayer في Solid للوصول المباشر إلى الخصائص"v8.9.04/5/2026
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
ترجمة موقع Next.js 14 و App Router الخاص بك باستخدام Intlayer | Internationalization (i18n)
جدول المحتويات
لماذا Intlayer على البدائل؟
بالمقارنة مع الحلول الرئيسية مثل next-intl أو i18next، يعد Intlayer حلاً يأتي مزودًا بتحسينات متكاملة مثل:
تم تحسين Intlayer للعمل مع مكونات الخادم من أجل العرض الفعال وهو متوافق تمامًا مع Turbopack. إنه لا يمنع العرض الثابت ويوفر برامج وسيطة بالإضافة إلى جميع الميزات اللازمة لتوسيع نطاق التدويل (i18n).
يتوافق Intlayer مع Next.js 12 و13 و14 و15 و16. إذا كنت تستخدم جهاز توجيه الصفحات Next.js، فيمكنك الرجوع إلى هذا الدليل. يعد التوجيه المحلي مفيدًا لتحسين محركات البحث وحجم البندل والأداء. إذا لم تكن بحاجة إليه، يمكنك الرجوع إلى هذا الدليل. بالنسبة إلى Next.js 12 و13 و14 و15 مع جهاز توجيه التطبيقات، راجع هذا الدليل.
بدلاً من تحميل ملفات JSON ضخمة إلى صفحاتك، قم بتحميل المحتوى الضروري فقط. يساعد Intlayer في تقليل أحجام البندل وصفحاتك بنسبة تصل إلى 50%.
يؤدي تحديد نطاق محتوى تطبيقك * إلى تسهيل الصيانة * للتطبيقات واسعة النطاق. يمكنك تكرار أو حذف مجلد ميزات واحد دون العبء العقلي لمراجعة قاعدة بيانات المحتوى بالكامل. بالإضافة إلى ذلك، تتم كتابة Intlayer بالكامل لضمان دقة المحتوى الخاص بك.
يؤدي تحديد موقع المحتوى المشترك * إلى تقليل السياق المطلوب * بواسطة نماذج اللغات الكبيرة (LLMs). يأتي Intlayer أيضًا مزودًا بمجموعة من الأدوات، مثل CLI لاختبار الترجمات المفقودة،LSP، MCP وagent skills، لجعل تجربة المطور (DX) أكثر سلاسة للذكاء الاصطناعي وكلاء.
استخدم الأتمتة للترجمة في مسار CI/CD الخاص بك باستخدام LLM من اختيارك على حساب مزود الذكاء الاصطناعي الخاص بك. يقدم Intlayer أيضًا مترجمًا لأتمتة استخراج المحتوى، بالإضافة إلى منصة ويب للمساعدة في الترجمة في الخلفية.
يمكن أن يؤدي ربط ملفات JSON الضخمة بالمكونات إلى حدوث مشكلات في الأداء والتفاعل. يعمل Intlayer على تحسين تحميل المحتوى الخاص بك في وقت الإنشاء.
أكثر من مجرد حل i18n، يوفر Intlayer [محررًا مرئيًا] مستضافًا ذاتيًا](/ar/doc/concept/editor) وكامل CMS لمساعدتك في إدارة المحتوى متعدد اللغات في الوقت الفعلي، مما يجعل التعاون مع المترجمين ومؤلفي النصوص وأعضاء الفريق الآخرين سلسًا. يمكن تخزين المحتوى محليًا و/أو عن بعد.
دليل خطوة بخطوة لإعداد Intlayer في تطبيق Next.js
انظر إلى Application Template على GitHub.
تثبيت التبعيات
قم بتثبيت الحزم اللازمة باستخدام npm:
bashنسخ الكودنسخ الكود إلى الحافظة
علامة
--interactiveاختيارية. استخدمintlayer-cli initإذا كنت وكيل ذكاء اصطناعي.سيقوم هذا الأمر باكتشاف بيئتك وتثبيت الحزم المطلوبة. على سبيل المثال:
bashنسخ الكودنسخ الكود إلى الحافظة
intlayer
الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، الترجمة، إعلان المحتوى، الترجمة، وأوامر CLI.
next-intlayer
الحزمة التي تدمج Intlayer مع Next.js. توفر موفري السياق وخطافات لتدويل Next.js. بالإضافة إلى ذلك، تتضمن مكون إضافي لـ Next.js لدمج Intlayer مع Webpack أو Turbopack، بالإضافة إلى وسيط لاكتشاف اللغة المفضلة للمستخدم، إدارة الكوكيز، والتعامل مع إعادة توجيه URL.
تكوين مشروعك
Here is the final structure that we will make:
bashنسخ الكودنسخ الكود إلى الحافظة
If you don't want locale routing, intlayer can be used as a simple provider / hook. See this guide for more details.
قم بإنشاء ملف تكوين لتحديد لغات تطبيقك:
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 في تكوين Next.js الخاص بك
قم بتكوين إعداد Next.js الخاص بك لاستخدام Intlayer:
next.config.mjsنسخ الكودنسخ الكود إلى الحافظة
يتم استخدام مكون
withIntlayer()الإضافي لـ Next.js لدمج Intlayer مع Next.js. يضمن بناء ملفات إعلان المحتوى ومراقبتها في وضع التطوير. يحدد متغيرات بيئة Intlayer داخل بيئات Webpack أو Turbopack. بالإضافة إلى ذلك، يوفر أسماء مستعارة لتحسين الأداء ويضمن التوافق مع مكونات الخادم.دالة
withIntlayer()هي دالة promise. إذا كنت تريد استخدامها مع plugins أخرى، يمكنك الانتظار لها. مثال:tsxنسخ الكودنسخ الكود إلى الحافظة
تكوين الوسيط لاكتشاف اللغة
قم بإعداد الوسيط لاكتشاف اللغة المفضلة للمستخدم:
src/middleware.tsنسخ الكودنسخ الكود إلى الحافظة
export { intlayerMiddleware as middleware } from "next-intlayer/middleware"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };يتم استخدام
intlayerMiddlewareلاكتشاف اللغة المفضلة للمستخدم وإعادة توجيههم إلى عنوان URL المناسب كما هو محدد في التكوين. بالإضافة إلى ذلك، يتيح حفظ اللغة المفضلة للمستخدم في كوكيز.منذ Intlayer v9، تحترم هذه الوسيطة خيار
routing.enableProxy(trueبشكل افتراضي). عيّنrouting.enableProxy: falseفي إعدادك لتحويله إلى pass-through بدون حذف هذا الملف. انظر إلى ملاحظات الإصدار v9.قم بتعديل معلمة
matcherلتطابق مسارات تطبيقك. لمزيد من التفاصيل، راجع وثائق Next.js حول تكوين المطابقة.إذا كنت بحاجة إلى ربط عدة middlewares معًا (على سبيل المثال،
intlayerMiddlewareمع المصادقة أو middlewares مخصصة)، يوفر Intlayer الآن دالة مساعدة تُسمىmultipleMiddlewares.tsنسخ الكودنسخ الكود إلى الحافظة
تحديد مسارات اللغة الديناميكية
قم بإزالة كل شيء من
RootLayoutواستبدله بالكود التالي:src/app/layout.tsxنسخ الكودنسخ الكود إلى الحافظة
import type { PropsWithChildren, FC } from "react"; import "./globals.css"; const RootLayout: FC<PropsWithChildren> = ({ children }) => children; export default RootLayout;الحفاظ على مكون
RootLayoutفارغًا يسمح بتعيين سماتlangوdirإلى علامة<html>.لتنفيذ التوجيه الديناميكي، قم بتوفير المسار للغة عن طريق إضافة تخطيط جديد في دليل
[locale]الخاص بك:src/app/[locale]/layout.tsxنسخ الكودنسخ الكود إلى الحافظة
موفر
IntlayerProviderواحد يغطي نصي الشجرة: فهو يزرع سياق الخادم ذو النطاق المحدد بالطلب والذي تقرأه خطافات الخادم، ويثبت موفر العميل بحيث تتلقى مكونات العميل نفس اللغة.src/app/[locale]/layout.tsxنسخ الكودنسخ الكود إلى الحافظة
يتم استخدام جزء المسار
[locale]لتحديد اللغة المحلية. على سبيل المثال:/ar/aboutيشير إلىarو/fr/aboutيشير إلىfr.في هذه المرحلة، ستواجه الخطأ:
Error: Missing <html> and <body> tags in the root layout.. هذا متوقع لأن ملف/app/page.tsxلم يعد قيد الاستخدام ويمكن إزالته. بدلاً من ذلك، سيقوم جزء المسار[locale]بتفعيل صفحة/app/[locale]/page.tsx. وبالتالي، ستكون الصفحات متاحة عبر مسارات مثل/en،/fr،/esفي متصفحك. لتعيين اللغة الافتراضية كصفحة الجذر، ارجع إلى إعدادmiddlewareفي الخطوة 4.ثم قم بتنفيذ وظيفة
generateStaticParamsفي تخطيط التطبيق الخاص بك.src/app/[locale]/layout.tsxنسخ الكودنسخ الكود إلى الحافظة
export { generateStaticParams } from "next-intlayer"; // السطر للإدراج const LocaleLayout: Next14LayoutIntlayer = ({ children, params: { locale }, }) => { /*... بقية الكود */ }; export default LocaleLayout;تضمن
generateStaticParamsأن يقوم تطبيقك ببناء الصفحات الضرورية مسبقًا لجميع اللغات المحلية، مما يقلل من الحساب أثناء وقت التشغيل ويحسن تجربة المستخدم. لمزيد من التفاصيل، راجع وثائق Next.js حول generateStaticParams.إعلان المحتوى الخاص بك
قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:
src/app/[locale]/page.content.tsنسخ الكودنسخ الكود إلى الحافظة
import { t, type Dictionary } from "intlayer"; const pageContent = { key: "page", content: { getStarted: { main: t({ ar: "ابدأ بالتعديل", en: "Get started by editing", fr: "Commencez par éditer", es: "Comience por editar", }), pageLink: "src/app/page.tsx", }, }, } satisfies Dictionary; export default pageContent;يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان في تطبيقك طالما تم تضمينها في دليل
contentDir(افتراضيًا،./src). وتطابق امتداد ملف إعلان المحتوى (افتراضيًا،.content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}). لمزيد من التفاصيل، راجع وثائق إعلان المحتوى.لمزيد من التفاصيل، راجع وثائق إعلان المحتوى.
استخدام المحتوى في الكود الخاص بك
الوصول إلى قواميس المحتوى الخاصة بك في جميع أنحاء التطبيق الخاص بك:
src/app/[locale]/page.tsxنسخ الكودنسخ الكود إلى الحافظة
import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type Next14PageIntlayer } from "next-intlayer"; import { useIntlayer } from "next-intlayer"; const Page: Next14PageIntlayer = ({ params: { locale } }) => { const content = useIntlayer("page", locale); return ( <> <p> {content.getStarted.main} <code>{content.getStarted.pageLink}</code> </p> <ServerComponentExample /> <ClientComponentExample /> </> ); }; export default Page;IntlayerProviderيتم تثبيته مرة واحدة فقط، في تخطيط الإعدادات المحلية. يوفر الإعدادات المحلية لكل من مكونات الخادم والعميل، لذا لا تحتاج الصفحات إلى التفاف نفسها بعد الآن.- خوادم الخادم تحل الإعدادات المحلية بهذا الترتيب: الإعدادات المحلية المُمررة في موقع الاستدعاء، ثم سياق الخادم الذي تم وضعه بواسطة المزود، ثم الإعدادات المحلية المرسلة عبر الطلب (رأس
x-intlayer-localeالذي تم تعيينه بواسطة وكيل Intlayer، ثم ملف تعريف الارتباط للإعدادات المحلية). هذه الخطوة الأخيرة هي ما يحافظ على صحة المحتوى على تنقل من جانب العميل يعيد تصيير جزء الصفحة فقط، حيث لا يعاد تشغيل التخطيط — ومعه المزود —.
src/app/[locale]/page.tsxنسخ الكودنسخ الكود إلى الحافظة
import { ClientComponentExample } from "@components/ClientComponentExample"; import { ServerComponentExample } from "@components/ServerComponentExample"; import { type Next14PageIntlayer } from "next-intlayer"; import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server"; const Page: Next14PageIntlayer = ({ params: { locale } }) => { const content = useIntlayer("page", locale); return ( <> <p> {content.getStarted.main} <code>{content.getStarted.pageLink}</code> </p> <IntlayerServerProvider locale={locale}> <ServerComponentExample /> <ClientComponentExample /> </IntlayerServerProvider> </> ); }; export default Page;IntlayerClientProviderتُستخدم لتوفير اللغة المحلية لمكونات الجانب العميل. يمكن وضعها في أي مكون رئيسي، بما في ذلك التخطيط. ومع ذلك، يُوصى بوضعها في التخطيط لأن Next.js يشارك كود التخطيط عبر الصفحات، مما يجعله أكثر كفاءة. باستخدامIntlayerClientProviderفي التخطيط، تتجنب إعادة تهيئته لكل صفحة، مما يحسن الأداء ويحافظ على سياق توطين متسق في جميع أنحاء التطبيق الخاص بك.IntlayerServerProviderتُستخدم لتوفير اللغة المحلية للأطفال على الخادم. لا يمكن تعيينها في التخطيط.
لا يمكن لـ Layout و Page مشاركة سياق خادم مشترك لأن نظام سياق الخادم يعتمد على مخزن بيانات لكل طلب (عبر آلية React's cache)، مما يسبب إعادة إنشاء كل "سياق" لأجزاء مختلفة من التطبيق. وضع المزود في تخطيط مشترك سيكسر هذا العزل، مما يمنع الانتشار الصحيح لقيم سياق الخادم إلى مكونات الخادم الخاصة بك.
src/components/ClientComponentExample.tsxنسخ الكودنسخ الكود إلى الحافظة
"use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // إنشاء إعلان محتوى ذو صلة return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };src/components/ServerComponentExample.tsxنسخ الكودنسخ الكود إلى الحافظة
import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // إنشاء إعلان محتوى ذي صلة return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };next-intlayerهو مسار الاستيراد متساوي الشكل: شرط تصديرreact-serverيعطي مكونات الخادم تنفيذ الإعدادات المحلية المحيطة، بينما مكونات العميل تحصل على الإعدادات المدعومة بالسياق. نفس الاستدعاء يعمل على كلا الجانبين.src/components/ServerComponentExample.tsxنسخ الكودنسخ الكود إلى الحافظة
import type { FC } from "react"; import { useIntlayer } from "next-intlayer/server"; const ServerComponentExample: FC = () => { const content = useIntlayer("server-component-example"); // إنشاء إعلان محتوى ذو صلة return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };إذا كنت تريد استخدام المحتوى الخاص بك في سمة
string، مثلalt،title،href،aria-label، إلخ، يجب عليك استدعاء قيمة الوظيفة، مثل:tsxنسخ الكودنسخ الكود إلى الحافظة
لمعرفة المزيد عن الخطاف
useIntlayer، راجع التوثيق.تدويل البيانات الوصفية الخاصة بك
اختياريفي حال كنت ترغب في تدويل بياناتك الوصفية، مثل عنوان صفحتك، يمكنك استخدام دالة
generateMetadataالتي توفرها Next.js. داخلها، يمكنك استرداد المحتوى من دالةgetIntlayerلترجمة بياناتك الوصفية.src/app/[locale]/metadata.content.tsنسخ الكودنسخ الكود إلى الحافظة
import { type Dictionary, t } from "intlayer"; import { Metadata } from "next"; const metadataContent = { key: "page-metadata", content: { title: t({ en: "Create Next App", fr: "Créer une application Next.js", es: "Crear una aplicación Next.js", }), description: t({ en: "Generated by create next app", fr: "Généré par create next app", es: "Generado por create next app", }), }, } satisfies Dictionary<Metadata>; export default metadataContent;لاحظ أن دالة
getIntlayerالمستوردة منnext-intlayerتُرجع محتواك مُغلفًا فيIntlayerNode، مما يسمح بالتكامل مع محرر بصري. على النقيض من ذلك، فإن دالةgetIntlayerالمستوردة منintlayerتُرجع محتواك مباشرةً بدون خصائص إضافية.لمعرفة المزيد عن تحسين البيانات الوصفية راجع التوثيق الرسمي لـ Next.js.
تدويل ملف sitemap.xml و robots.txt
اختياريلتدويل ملف
sitemap.xmlوrobots.txt، يمكنك استخدام وظيفةgetMultilingualUrlsالمقدمة من Intlayer. تتيح لك هذه الوظيفة إنشاء روابط متعددة اللغات لخريطة الموقع.src/app/sitemap.tsنسخ الكودنسخ الكود إلى الحافظة
src/app/robots.tsنسخ الكودنسخ الكود إلى الحافظة
import type { MetadataRoute } from "next"; import { getMultilingualUrls } from "intlayer"; const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]); const robots = (): MetadataRoute.Robots => ({ rules: { userAgent: "*", allow: ["/"], disallow: getAllMultilingualUrls(["/login", "/register"]), }, host: "https://example.com", sitemap: `https://example.com/sitemap.xml`, }); export default robots;تعرف على المزيد حول تحسين خريطة الموقع في الوثائق الرسمية لـ Next.js. تعرف على المزيد حول تحسين robots.txt في الوثائق الرسمية لـ Next.js.
تغيير لغة المحتوى الخاص بك
اختياريلتغيير لغة المحتوى الخاص بك في Next.js، الطريقة الموصى بها هي استخدام مكون
Linkلإعادة توجيه المستخدمين إلى الصفحة المحلية المناسبة. يتيح مكونLinkجلب الصفحة مسبقًا، مما يساعد على تجنب إعادة تحميل الصفحة بالكامل.src/components/LocaleSwitcher.tsxنسخ الكودنسخ الكود إلى الحافظة
"use client"; import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocale } from "next-intlayer"; import { type FC } from "react"; import Link from "next/link"; const LocaleSwitcher: FC = () => { const { locale, pathWithoutLocale, availableLocales, setLocale } = useLocale(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <Link href={getLocalizedUrl(pathWithoutLocale, localeItem)} hrefLang={localeItem} key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(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> </Link> ))} </div> </div> ); };طريقة بديلة هي استخدام دالة
setLocaleالمتوفرة من خلال hookuseLocale. هذه الدالة لن تسمح بجلب الصفحة مسبقاً. انظر إلى وثائق hookuseLocaleللمزيد من التفاصيل.يمكنك أيضًا تعيين دالة في خيار
onLocaleChangeلتشغيل دالة مخصصة عند تغيير اللغة.src/components/LocaleSwitcher.tsxنسخ الكودنسخ الكود إلى الحافظة
مراجع التوثيق:
إنشاء مكون رابط محلي
اختياريلضمان أن التنقل في تطبيقك يحترم اللغة الحالية، يمكنك إنشاء مكون
Linkمخصص. يقوم هذا المكون تلقائيًا بإضافة بادئة لعناوين URL الداخلية باللغة الحالية. على سبيل المثال، عندما ينقر مستخدم يتحدث الفرنسية على رابط إلى صفحة "حول"، يتم توجيهه إلى/ar/aboutبدلاً من/about.هذا السلوك مفيد لعدة أسباب:
- تحسين محركات البحث وتجربة المستخدم: تساعد عناوين URL المحلية محركات البحث على فهرسة الصفحات الخاصة باللغة بشكل صحيح وتقديم محتوى للمستخدمين بلغتهم المفضلة.
- الاتساق: باستخدام رابط محلي في جميع أنحاء تطبيقك، تضمن أن التنقل يظل ضمن اللغة الحالية، مما يمنع التبديل غير المتوقع للغة.
- سهولة الصيانة: تبسيط منطق التوطين في مكون واحد يجعل إدارة عناوين URL أسهل، مما يجعل قاعدة الكود الخاصة بك أسهل في الصيانة والتوسيع مع نمو تطبيقك.
فيما يلي تنفيذ مكون
Linkالمحلي باستخدام TypeScript:src/components/Link.tsxنسخ الكودنسخ الكود إلى الحافظة
"use client"; import { getLocalizedUrl } from "intlayer"; import NextLink, { type LinkProps as NextLinkProps } from "next/link"; import { useLocale } from "next-intlayer"; import { forwardRef, PropsWithChildren, type ForwardedRef } from "react"; /** * وظيفة مساعدة للتحقق مما إذا كان عنوان URL معين خارجيًا. * إذا بدأ عنوان URL بـ http:// أو https://، فإنه يعتبر خارجيًا. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * مكون رابط مخصص يتكيف مع خاصية href بناءً على اللغة الحالية. * بالنسبة للروابط الداخلية، يستخدم `getLocalizedUrl` لإضافة بادئة للعنوان باللغة (مثل /ar/about). * يضمن ذلك أن يظل التنقل ضمن سياق اللغة نفسها. */ export const Link = forwardRef< HTMLAnchorElement, PropsWithChildren<NextLinkProps> >(({ href, children, ...props }, ref: ForwardedRef<HTMLAnchorElement>) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href.toString()); // إذا كان الرابط داخليًا وتم توفير href صالح، احصل على عنوان URL المحلي. const hrefI18n: NextLinkProps["href"] = href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href; return ( <NextLink href={hrefI18n} ref={ref} {...props}> {children} </NextLink> ); }); Link.displayName = "Link";كيف يعمل
اكتشاف الروابط الخارجية:
تحدد وظيفة المساعدةcheckIsExternalLinkما إذا كان عنوان URL خارجيًا. يتم ترك الروابط الخارجية دون تغيير لأنها لا تحتاج إلى توطين.استرجاع اللغة الحالية:
يوفر الخطافuseLocaleاللغة الحالية (مثلarللعربية).توطين عنوان URL:
بالنسبة للروابط الداخلية (أي غير الخارجية)، يتم استخدامgetLocalizedUrlلإضافة بادئة تلقائيًا للعنوان باللغة الحالية. هذا يعني أنه إذا كان المستخدم يستخدم اللغة العربية، فإن تمرير/aboutكـhrefسيحولها إلى/ar/about.إرجاع الرابط:
يقوم المكون بإرجاع عنصر<a>مع عنوان URL المحلي، مما يضمن أن التنقل يتماشى مع اللغة.
من خلال دمج هذا المكون
Linkفي جميع أنحاء تطبيقك، تحافظ على تجربة مستخدم متماسكة وواعية باللغة مع الاستفادة أيضًا من تحسين محركات البحث وسهولة الاستخدام.تحسين حجم البندل
اختياريإذا كنت بحاجة إلى الـ locale النشط داخل Server Action (على سبيل المثال، لتوطين رسائل البريد الإلكتروني أو تشغيل منطق يعتمد على الـ locale)، استدعِ
getLocaleمنnext-intlayer/server:src/app/actions/getLocale.tsنسخ الكودنسخ الكود إلى الحافظة
تتبع دالة
getLocaleاستراتيجية متسلسلة لتحديد لغة المستخدم:- أولاً، تتحقق من رؤوس الطلب (request headers) للبحث عن قيمة لغة قد تكون تم تعيينها بواسطة middleware
- إذا لم يتم العثور على لغة في الرؤوس، تبحث عن لغة مخزنة في cookies
- إذا لم يتم العثور على cookie، تحاول الكشف عن اللغة المفضلة للمستخدم من إعدادات المتصفح الخاصة به
- كملاذ أخير، تعود إلى لغة التطبيق الافتراضية المعتمدة
هذا يضمن اختيار اللغة الأنسب بناءً على السياق المتاح.
تحسين حجم حزمتك
اختياريnext-intlayerका उपयोग करते समय, डिफ़ॉल्ट रूप से प्रत्येक पृष्ठ के लिए शब्दकोश बंडल में शामिल होते हैं। बंडल आकार को अनुकूलित करने के लिए, Intlayer एक वैकल्पिक SWC प्लगइन प्रदान करता है जो मैक्रोज़ का उपयोग करकेuseIntlayerकॉल को बुद्धिमानी से बदलता है। यह सुनिश्चित करता है कि शब्दकोश केवल उन पृष्ठों के बंडल में शामिल हों जो वास्तव में उनका उपयोग करते हैं।इस अनुकूलन को सक्षम करने के लिए,
@intlayer/swcपैकेज इंस्टॉल करें। एक बार इंस्टॉल हो जाने पर,next-intlayerस्वचालित रूप से प्लगइन का पता लगाएगा और उसका उपयोग करेगा:bashنسخ الكودنسخ الكود إلى الحافظة
ملاحظة: هذا التحسين متاح فقط لـ Next.js 13 وما فوق.
ملاحظة: لم يتم تثبيت هذه الحزمة افتراضيًا لأن مكونات SWC لا تزال تجريبية على Next.js. قد يتغير ذلك في المستقبل.
ملاحظة: إذا قمت بتعيين الخيار كـ
importMode: 'dynamic'أوimportMode: 'fetch'(في تكوينdictionary)، فسيعتمد على Suspense، لذلك ستضطر إلى التفاف استدعاءاتuseIntlayerالخاصة بك في حدودSuspense. هذا يعني أنك لن تتمكن من استخدامuseIntlayerمباشرة على المستوى الأعلى من مكون Page / Layout الخاص بك.
تكوين TypeScript
يستخدم Intlayer تعزيز الوحدة (module augmentation) للاستفادة من TypeScript وجعل قاعدة الشيفرة الخاصة بك أقوى.


تأكد من أن تكوين TypeScript الخاص بك يتضمن الأنواع التي تم إنشاؤها تلقائيًا.
نسخ الكود إلى الحافظة
تكوين Git
يوصى بتجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب الالتزام بها في مستودع Git الخاص بك.
للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف .gitignore الخاص بك:
نسخ الكود إلى الحافظة
إضافة VS Code
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت إضافة Intlayer الرسمية لـ VS Code.
تقدم هذه الإضافة:
- الإكمال التلقائي لمفاتيح الترجمة.
- الكشف عن الأخطاء في الوقت الحقيقي للترجمات المفقودة.
- معاينات داخلية للمحتوى المترجم.
- إجراءات سريعة لإنشاء الترجمات وتحديثها بسهولة.
لمزيد من التفاصيل حول كيفية استخدام الإضافة، راجع توثيق إضافة Intlayer لـ VS Code.
التقدم أكثر
للتقدم أكثر، يمكنك تنفيذ المحرر المرئي أو إخراج محتواك باستخدام نظام إدارة المحتوى (CMS).
الأسئلة الشائعة
لا ينطبق حقل i18n في next.config.js على App Router، لذا فإن طبقة التوطين هي دائمًا اختيار للمكتبة:
next-intl: مكتبة رسائل شائعة لـ App Router، تُحمل ملفات JSON في وقت التشغيل.next-i18next: الحل التقليدي لـ Pages Router.Intlayer: الحل الأكثر تقدمًا. يُعلن عن المحتوى بجانب المكون، ويُترجم وقت البناء، مع فحص صارم لأنواع TypeScript، وترجمة بالذكاء الاصطناعي، ومحرر مرئي، ونظام CMS.
يضمن الإعلان لكل مكون أن الصفحة تُحمل السلاسل التي تعرضها فقط بدلاً من الكتالوج بأكمله. انظر لماذا Intlayer و المقارنة المعيارية.
أقل بكثير من الحلول القائمة على فضاءات الأسماء (namespaces)، لأن الصفحة لا تُحمّل أبدًا كتالوجًا لا تعرضه. تحل مكونات الخادم المحتوى مباشرة على الخادم، ويستبدل مترجم وقت البناء استدعاءات useIntlayer بإدخالات القاموس الدقيقة التي يستخدمها المكون. تقسم القواميس الديناميكية الباقي حسب اللغة، مما يقلل الحزمة بنسبة تصل إلى 50%. انظر تحسين الحزم و المقارنة المعيارية.
نعم، هناك مساران. يمكنك ترحيل المحتوى تدريجيًا باستخدام دليل ترحيل i18next أو دليل ترحيل next-intl. أو يمكنك الاحتفاظ بواجهة برمجة التطبيقات الحالية بالكامل: تكشف محولات التوافق نفس واجهات next-intl و i18next تمامًا ولكنها مدعومة بقواميس Intlayer.
نعم. تحافظ مكونة مزامنة JSON على ملفات /messages/{locale}/{namespace}.json الخاصة بك كمصدر الحقيقة وتُنشئ قواميس Intlayer منها، في كلا الاتجاهين. وتقوم مكونة مزامنة PO بنفس الشيء لكتالوجات gettext، وتسمح لك الملفات المقسمة حسب اللغة بتقسيم المحتوى حسب اللغة بدلاً من تجميع كل اللغات في ملف واحد.
لا. قم بتشغيل npx intlayer extract وسيقرأ Intlayer ملفات المصدر الخاصة بك، ويسحب السلاسل النصية الموجهة للمستخدم ويكتب ملف .content بجانب كل منها، بحيث تراجع diff بدلاً من نسخ السلاسل إلى كتالوج يدويًا. راجع أمر extract.
لأتمتة كاملة، يقوم Intlayer Compiler بالشيء نفسه في وقت البناء على كود JSX و TSX و Vue و Svelte، منشئًا القواميس عند كل تغيير دون الحاجة إلى إدارة المفاتيح يدويًا.
خمس أدوات، كلها اختيارية:
- امتداد VS Code: الانتقال من مفتاح
useIntlayerإلى ملف المحتوى المصرح به، استخراج المحتوى من المكون، وتشغيل build و fill و test و push و pull من لوحة الأوامر أو علامة تبويب Intlayer. - خادم LSP: نفس التجربة في أي محرر يدعم LSP، مع الانتقال إلى التعريف وعروض القيمة المترجمة عند التمرير والإكمال التلقائي للمفاتيح. يدعم أيضًا استدعاءات
i18nextوreact-i18nextوnext-intlوuse-intl. - خادم MCP: يكشف وثائق Intlayer و CLI إلى Cursor و VS Code و Claude Desktop و Claude Code و ChatGPT.
- Agent skills: مهارات مخصصة مثل
intlayer-configوintlayer-cliوintlayer-content. - ESLint plugin: قاعدة
no-raw-textترصد النصوص المكتوبة مباشرة بدون تدويل.
