استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده
بدءاً من الدمج مع خادم MCP Intlayer ، يمكن لمساعدك الذكي الاسترجاع من جميع المستندات مباشرة من ChatGPT ، DeepSeek ، Cursor ، VSCode ، إلخ.
عرض الوثائق الخاصة بالخادم MCPهذه الوثيقة غير محدثة، تم تحديث النسخة الأساسية في 1 نوفمبر 2025.
الانتقال إلى الوثيقة الإنجليزيةتاريخ الإصدارات
- بداية السجلv7.0.029/6/2025
تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.
اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزيةإذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.
رابط GitHub للتوثيقنسخ الـ Markdown من المستند إلى الحافظة
ترجمة موقع Next.js 16 الخاص بك باستخدام Intlayer | التدويل (i18n)
شاهد قالب التطبيق على GitHub.
جدول المحتويات
ما هو Intlayer؟
Intlayer هي مكتبة دولية (i18n) مبتكرة ومفتوحة المصدر مصممة لتبسيط دعم اللغات المتعددة في تطبيقات الويب الحديثة. يتكامل Intlayer بسلاسة مع أحدث إطار عمل Next.js 16، بما في ذلك App Router القوي الخاص به. تم تحسينه للعمل مع مكونات الخادم (Server Components) لتحقيق عرض فعال وهو متوافق تمامًا مع Turbopack.
مع Intlayer، يمكنك:
- إدارة الترجمات بسهولة باستخدام قواميس إعلانية على مستوى المكون.
- توطين البيانات الوصفية، والمسارات، والمحتوى بشكل ديناميكي.
- الوصول إلى الترجمات في كل من مكونات جانب العميل وجانب الخادم.
- ضمان دعم TypeScript مع أنواع مولدة تلقائيًا، مما يحسن الإكمال التلقائي واكتشاف الأخطاء.
- الاستفادة من الميزات المتقدمة، مثل الكشف الديناميكي عن اللغة وتبديلها.
يتوافق Intlayer مع Next.js 12 و 13 و 14 و 16. إذا كنت تستخدم Next.js Page Router، يمكنك الرجوع إلى هذا الدليل. بالنسبة لـ Next.js 12 و 13 و 14 مع App Router، راجع هذا الدليل.
دليل خطوة بخطوة لإعداد Intlayer في تطبيق Next.js
الخطوة 1: تثبيت التبعيات
قم بتثبيت الحزم اللازمة باستخدام npm:
npm install intlayer next-intlayerintlayer
الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، والترجمة، وإعلان المحتوى، والترجمة البرمجية، وأوامر CLI.
next-intlayer
الحزمة التي تدمج Intlayer مع Next.js. توفر موفري السياق وخطافات (hooks) للتدويل في Next.js. بالإضافة إلى ذلك، تتضمن إضافة Next.js لدمج Intlayer مع Webpack أو Turbopack، بالإضافة إلى وكيل لاكتشاف اللغة المفضلة للمستخدم، وإدارة ملفات تعريف الارتباط، والتعامل مع إعادة توجيه عناوين URL.
الخطوة 2: تكوين مشروعك
أنشئ ملف تكوين لتحديد لغات تطبيقك:
نسخ الكود إلى الحافظة
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 في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع توثيق التهيئة.
الخطوة 3: دمج Intlayer في تهيئة Next.js الخاصة بك
قم بتكوين إعداد Next.js الخاص بك لاستخدام Intlayer:
نسخ الكود إلى الحافظة
import type { NextConfig } from "next";import { withIntlayer } from "next-intlayer/server";const nextConfig: NextConfig = { /* خيارات التهيئة هنا */};export default withIntlayer(nextConfig);يتم استخدام مكون Next.js الإضافي withIntlayer() لدمج Intlayer مع Next.js. يضمن بناء ملفات إعلان المحتوى ومراقبتها في وضع التطوير. كما يحدد متغيرات بيئة Intlayer ضمن بيئات Webpack أو Turbopack. بالإضافة إلى ذلك، يوفر أسماء مستعارة لتحسين الأداء ويضمن التوافق مع مكونات الخادم.
دالة withIntlayer() هي دالة وعد (Promise). تسمح بتحضير قواميس intlayer قبل بدء البناء. إذا كنت ترغب في استخدامها مع مكونات إضافية أخرى، يمكنك انتظارها باستخدام await. مثال:
const nextConfig = await withIntlayer(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;إذا كنت ترغب في استخدامه بشكل متزامن، يمكنك استخدام دالة withIntlayerSync(). مثال:
const nextConfig = withIntlayerSync(nextConfig);const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);export default nextConfigWithOtherPlugins;الخطوة 4: تعريف مسارات اللغة الديناميكية
قم بإزالة كل شيء من RootLayout واستبداله بالكود التالي:
src/app/layout.tsxنسخ الكودنسخ الكود إلى الحافظة
import type { PropsWithChildren, FC } from "react";import "./globals.css";const RootLayout: FC<PropsWithChildren> = ({ children }) => ( // لا يزال بإمكانك تغليف العناصر الفرعية بمزودين آخرين، مثل `next-themes`، `react-query`، `framer-motion`، إلخ. <>{children}</>);
export default RootLayout;
```jsx {3} fileName="src/app/layout.mjx" codeFormat="esm"import "./globals.css";const RootLayout = ({ children }) => ( // لا يزال بإمكانك تغليف العناصر الفرعية بمزودين آخرين، مثل `next-themes`، `react-query`، `framer-motion`، إلخ. <>{children}</>);export default RootLayout;يتيح ترك مكون RootLayout فارغًا تعيين سمات lang و dir إلى وسم <html>.
لتنفيذ التوجيه الديناميكي، قم بتوفير المسار للغة بإضافة تخطيط جديد في دليل [locale] الخاص بك:
نسخ الكود إلى الحافظة
import type { NextLayoutIntlayer } from "next-intlayer";import { Inter } from "next/font/google";import { getHTMLTextDir } from "intlayer";const inter = Inter({ subsets: ["latin"] });const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { const { locale } = await params; return ( <html lang={locale} dir={getHTMLTextDir(locale)}> <body className={inter.className}>{children}</body> </html> );};export default LocaleLayout;يتم استخدام جزء المسار [locale] لتحديد اللغة المحلية. مثال: /en-US/about سيشير إلى en-US و /fr/about إلى fr.
في هذه المرحلة، ستواجه الخطأ: Error: Missing <html> and <body> tags in the root layout.. هذا متوقع لأن ملف /app/page.tsx لم يعد قيد الاستخدام ويمكن حذفه. بدلاً من ذلك، سيقوم جزء المسار [locale] بتنشيط صفحة /app/[locale]/page.tsx. ونتيجة لذلك، ستكون الصفحات متاحة عبر مسارات مثل /en، /fr، /es في متصفحك. لتعيين اللغة الافتراضية كصفحة الجذر، راجع إعداد proxy في الخطوة 7.
ثم، قم بتنفيذ دالة generateStaticParams في تخطيط التطبيق الخاص بك.
نسخ الكود إلى الحافظة
export { generateStaticParams } from "next-intlayer"; // السطر الذي يجب إدراجهconst LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => { /*... بقية الكود */};export default LocaleLayout;يضمن generateStaticParams أن يقوم تطبيقك ببناء الصفحات اللازمة مسبقًا لجميع اللغات، مما يقلل من حسابات وقت التشغيل ويحسن تجربة المستخدم. لمزيد من التفاصيل، راجع توثيق Next.js حول generateStaticParams.
يعمل Intlayer مع export const dynamic = 'force-static'; لضمان بناء الصفحات مسبقًا لجميع اللغات.
الخطوة 5: إعلان المحتوى الخاص بك
قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:
نسخ الكود إلى الحافظة
import { t, type Dictionary } from "intlayer";const pageContent = { key: "page", content: { getStarted: { main: t({ 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,mjx,cjs,cjx}).
لمزيد من التفاصيل، راجع توثيق إعلان المحتوى.
الخطوة 6: استخدام المحتوى في كودك
يمكنك الوصول إلى قواميس المحتوى الخاصة بك في جميع أنحاء تطبيقك:
نسخ الكود إلى الحافظة
import type { FC } from "react";import { ClientComponentExample } from "@components/ClientComponentExample";import { ServerComponentExample } from "@components/ServerComponentExample";import { type NextPageIntlayer, IntlayerClientProvider } from "next-intlayer";import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";const PageContent: FC = () => { const content = useIntlayer("page"); return ( <> <p>{content.getStarted.main}</p> {/* المحتوى الرئيسي لبدء الاستخدام */} <code>{content.getStarted.pageLink}</code>{" "} {/* رابط الصفحة لبدء الاستخدام */} </> );};const Page: NextPageIntlayer = async ({ params }) => { const { locale } = await params; return ( <IntlayerServerProvider locale={locale}> <PageContent /> <ServerComponentExample /> <IntlayerClientProvider locale={locale}> <ClientComponentExample /> </IntlayerClientProvider> </IntlayerServerProvider> );};export default Page;- IntlayerClientProvider يُستخدم لتوفير اللغة للمكونات على جانب العميل. يمكن وضعه في أي مكون أبوي، بما في ذلك التخطيط (layout). ومع ذلك، يُنصح بوضعه في التخطيط لأن Next.js يشارك كود التخطيط عبر الصفحات، مما يجعله أكثر كفاءة. باستخدام IntlayerClientProvider في التخطيط، تتجنب إعادة تهيئته لكل صفحة، مما يحسن الأداء ويحافظ على سياق تعريب متسق في جميع أنحاء تطبيقك.
IntlayerServerProvider يُستخدم لتوفير اللغة لأطفال الخادم (server children). لا يمكن تعيينه في التخطيط.
لا يمكن للتخطيط والصفحة مشاركة سياق خادم مشترك لأن نظام سياق الخادم يعتمد على مخزن بيانات لكل طلب (عبر آلية React's cache)، مما يؤدي إلى إعادة إنشاء كل "سياق" لأجزاء مختلفة من التطبيق. وضع المزود في تخطيط مشترك سيكسر هذا العزل، مما يمنع الانتشار الصحيح لقيم سياق الخادم إلى مكونات الخادم الخاصة بك.
لا يمكن للتخطيط والصفحة مشاركة سياق خادم مشترك لأن نظام سياق الخادم يعتمد على مخزن بيانات لكل طلب (عبر آلية ذاكرة التخزين المؤقت لـ React)، مما يؤدي إلى إعادة إنشاء كل "سياق" لأجزاء مختلفة من التطبيق. وضع المزود في تخطيط مشترك سيكسر هذا العزل، مما يمنع الانتشار الصحيح لقيم سياق الخادم إلى مكونات الخادم الخاصة بك.
نسخ الكود إلى الحافظة
"use client";import type { FC } from "react";import { useIntlayer } from "next-intlayer";export const ClientComponentExample: FC = () => { const content = useIntlayer("client-component-example"); // إنشاء إعلان المحتوى المرتبط return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> );};نسخ الكود إلى الحافظة
import type { FC } from "react";import { useIntlayer } from "next-intlayer/server";export 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، إلخ، يجب عليك استدعاء قيمة الدالة، مثل:
<img src={content.image.src.value} alt={content.image.value} />
لمعرفة المزيد عن الخطاف useIntlayer، راجع التوثيق.
(اختياري) الخطوة 7: تكوين الوكيل لاكتشاف اللغة
قم بإعداد وكيل لاكتشاف اللغة المفضلة للمستخدم:
نسخ الكود إلى الحافظة
export { intlayerProxy as proxy } from "next-intlayer/proxy";export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",};يُستخدم intlayerProxy لاكتشاف اللغة المفضلة للمستخدم وإعادة توجيهه إلى عنوان URL المناسب كما هو محدد في التكوين. بالإضافة إلى ذلك، يتيح حفظ اللغة المفضلة للمستخدم في ملف تعريف الارتباط (كوكي).
إذا كنت بحاجة إلى ربط عدة بروكسيات معًا (على سبيل المثال، intlayerProxy مع المصادقة أو بروكسيات مخصصة)، يوفر Intlayer الآن أداة مساعدة تسمى multipleProxies.
import { multipleProxies, intlayerProxy } from "next-intlayer/proxy";import { customProxy } from "@utils/customProxy";export const proxy = multipleProxies([intlayerProxy, customProxy]);(اختياري) الخطوة 8: تدويل بيانات التعريف الخاصة بك
في حال رغبتك في تدويل بيانات التعريف الخاصة بك، مثل عنوان الصفحة، يمكنك استخدام دالة generateMetadata المقدمة من Next.js. بداخلها، يمكنك استرجاع المحتوى من دالة getIntlayer لترجمة بيانات التعريف الخاصة بك.
نسخ الكود إلى الحافظة
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;نسخ الكود إلى الحافظة
import { getIntlayer, getMultilingualUrls } from "intlayer";import type { Metadata } from "next";import type { LocalPromiseParams } from "next-intlayer";export const generateMetadata = async ({ params,}: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const metadata = getIntlayer("page-metadata", locale); /** * ينشئ كائن يحتوي على جميع الروابط لكل لغة. * * مثال: * ```ts * getMultilingualUrls('/about'); * * // يعيد * // { * // en: '/about', * // fr: '/fr/about', * // es: '/es/about', * // } * ``` */ const multilingualUrls = getMultilingualUrls("/"); const localizedUrl = multilingualUrls[locale as keyof typeof multilingualUrls]; return { ...metadata, alternates: { canonical: localizedUrl, languages: { ...multilingualUrls, "x-default": "/" }, }, openGraph: { url: localizedUrl, }, };};// ... بقية الكودلاحظ أن الدالة getIntlayer المستوردة من next-intlayer تُعيد المحتوى الخاص بك مغلفًا في IntlayerNode، مما يسمح بالتكامل مع المحرر البصري. بالمقابل، الدالة getIntlayer المستوردة من intlayer تُعيد المحتوى الخاص بك مباشرةً بدون خصائص إضافية.
بدلاً من ذلك، يمكنك استخدام دالة getTranslation لإعلان بيانات التعريف الخاصة بك. ومع ذلك، يُنصح باستخدام ملفات إعلان المحتوى لأتمتة ترجمة بيانات التعريف الخاصة بك وفصل المحتوى في مرحلة ما.
نسخ الكود إلى الحافظة
import { type IConfigLocales, getTranslation, getMultilingualUrls,} from "intlayer";import type { Metadata } from "next";import type { LocalPromiseParams } from "next-intlayer";export const generateMetadata = async ({ params,}: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale); return { title: t<string>({ en: "My title",بدلاً من ذلك، يمكنك استخدام دالة `getTranslation` لإعلان بيانات التعريف الخاصة بك. ومع ذلك، يُوصى باستخدام ملفات إعلان المحتوى لأتمتة ترجمة بيانات التعريف الخاصة بك وفصل المحتوى في مرحلة ما.```typescript fileName="src/app/[locale]/layout.tsx or src/app/[locale]/page.tsx" codeFormat="typescript"import { type IConfigLocales, getTranslation, getMultilingualUrls,} from "intlayer";import type { Metadata } from "next";import type { LocalPromiseParams } from "next-intlayer";export const generateMetadata = async ({ params,}: LocalPromiseParams): Promise<Metadata> => { const { locale } = await params; const t = <T>(content: IConfigLocales<T>) => getTranslation(content, locale); return { title: t<string>({ en: "My title", fr: "Mon titre", es: "Mi título", }), description: t({ en: "My description", fr: "Ma description", es: "Mi descripción", }), };};// ... بقية الكودتعرّف على المزيد حول تحسين بيانات التعريف في الوثائق الرسمية لـ Next.js.
(اختياري) الخطوة 9: تعريب ملف sitemap.xml و robots.txt الخاص بك
لتعريب ملفي sitemap.xml و robots.txt، يمكنك استخدام دالة getMultilingualUrls المقدمة من Intlayer. تتيح لك هذه الدالة إنشاء روابط متعددة اللغات لخريطة الموقع الخاصة بك.
نسخ الكود إلى الحافظة
import { getMultilingualUrls } from "intlayer";import type { MetadataRoute } from "next";const sitemap = (): MetadataRoute.Sitemap => [ { url: "https://example.com", alternates: { languages: { ...getMultilingualUrls("https://example.com"), "x-default": "https://example.com", }, }, }, { url: "https://example.com/login", alternates: { languages: { ...getMultilingualUrls("https://example.com/login"), "x-default": "https://example.com/login", }, }, }, { url: "https://example.com/register", alternates: { languages: { ...getMultilingualUrls("https://example.com/register"), "x-default": "https://example.com/register", }, }, },];export default sitemap;نسخ الكود إلى الحافظة
import type { MetadataRoute } from "next";import { getMultilingualUrls } from "intlayer";const getAllMultilingualUrls = (urls: string[]) => urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);// دالة للحصول على جميع عناوين URL متعددة اللغات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.
(اختياري) الخطوة 10: تغيير لغة المحتوى الخاص بك
لتغيير لغة المحتوى الخاص بك في Next.js، الطريقة الموصى بها هي استخدام مكون Link لإعادة توجيه المستخدمين إلى الصفحة المحلية المناسبة. يتيح مكون Link التحميل المسبق للصفحة، مما يساعد على تجنب إعادة تحميل الصفحة بالكامل.
نسخ الكود إلى الحافظة
"use client";import type { FC } from "react";import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl,} from "intlayer";import { useLocale } from "next-intlayer";import Link from "next/link";export 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)} key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} replace // سيضمن أن زر "العودة" في المتصفح يعيد التوجيه إلى الصفحة السابقة > <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 المقدمة من الخطاف useLocale. هذه الدالة لن تسمح بتحميل الصفحة مسبقًا. راجع توثيق الخطاف useLocale لمزيد من التفاصيل.
يمكنك أيضًا تعيين دالة في خيار onLocaleChange لتشغيل دالة مخصصة عند تغيير اللغة.
نسخ الكود إلى الحافظة
"use client";import { useRouter } from "next/navigation";import { useLocale } from "next-intlayer";import { getLocalizedUrl } from "intlayer";// ... بقية الكودconst router = useRouter();const { setLocale } = useLocale({ onLocaleChange: (locale) => { router.push(getLocalizedUrl(pathWithoutLocale, locale)); },});return ( <button onClick={() => setLocale(Locales.FRENCH)}> التغيير إلى الفرنسية </button>);مراجع التوثيق:
(اختياري) الخطوة 11: إنشاء مكون رابط محلي
لضمان أن تنقل تطبيقك يحترم اللغة الحالية، يمكنك إنشاء مكون Link مخصص. يقوم هذا المكون تلقائيًا بإضافة بادئة اللغة الحالية إلى عناوين URL الداخلية، بحيث عندما ينقر المستخدم الناطق بالفرنسية على رابط إلى صفحة "حول"، يتم توجيهه إلى /fr/about بدلاً من /about.
هذا السلوك مفيد لعدة أسباب:
- تحسين محركات البحث وتجربة المستخدم: تساعد عناوين URL المترجمة محركات البحث على فهرسة الصفحات الخاصة بكل لغة بشكل صحيح وتوفر للمستخدمين محتوى بلغتهم المفضلة.
- الاتساق: باستخدام رابط مترجم في جميع أنحاء تطبيقك، تضمن أن التنقل يبقى ضمن اللغة الحالية، مما يمنع التبديلات غير المتوقعة في اللغة.
- قابلية الصيانة: تركيز منطق الترجمة في مكون واحد يبسط إدارة عناوين URL، مما يجعل قاعدة الشيفرة الخاصة بك أسهل في الصيانة والتوسيع مع نمو تطبيقك.
فيما يلي تنفيذ لمكون Link محلي في TypeScript:
نسخ الكود إلى الحافظة
"use client";import { getLocalizedUrl } from "intlayer";import NextLink, { type LinkProps as NextLinkProps } from "next/link";import { useLocale } from "next-intlayer";import type { PropsWithChildren, FC } from "react";/** * دالة مساعدة للتحقق مما إذا كان عنوان URL معين خارجيًا. * إذا كان عنوان URL يبدأ بـ http:// أو https://، فإنه يعتبر خارجيًا. */export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? "");/** * مكون رابط مخصص يقوم بتعديل خاصية href بناءً على اللغة الحالية. * بالنسبة للروابط الداخلية، يستخدم `getLocalizedUrl` لإضافة بادئة اللغة إلى الرابط (مثلاً: /fr/about). * هذا يضمن أن التنقل يبقى ضمن نفس سياق اللغة. */export const Link: FC<PropsWithChildren<NextLinkProps>> = ({ href, children, ...props}) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href.toString()); // إذا كان الرابط داخليًا وتم توفير href صالح، احصل على الرابط المحلي. const hrefI18n: NextLinkProps["href"] = href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href; return ( <NextLink href={hrefI18n} {...props}> {children} </NextLink> );};كيف يعمل
- كشف الروابط الخارجية:
تحديد الروابط الخارجية:
تقوم الدالة المساعدة checkIsExternalLink بتحديد ما إذا كان الرابط URL خارجيًا. تُترك الروابط الخارجية دون تغيير لأنها لا تحتاج إلى تعريب.استرجاع اللغة الحالية:
يوفر الخطاف useLocale اللغة الحالية (مثلًا fr للفرنسية).تعريب الرابط:
بالنسبة للروابط الداخلية (أي غير الخارجية)، يتم استخدام getLocalizedUrl لإضافة بادئة اللغة الحالية تلقائيًا إلى الرابط. هذا يعني أنه إذا كان المستخدم يستخدم اللغة الفرنسية، فإن تمرير /about كـ href سيُحوَّل إلى /fr/about.إرجاع الرابط:
يُرجع المكون عنصر <a> بالرابط المعرب، مما يضمن أن التنقل يتوافق مع اللغة الحالية.
من خلال دمج مكون Link هذا في تطبيقك، تحافظ على تجربة مستخدم متماسكة وواعية للغة، مع الاستفادة أيضًا من تحسين محركات البحث وسهولة الاستخدام.
(اختياري) الخطوة 12: الحصول على اللغة الحالية في إجراءات الخادم
إذا كنت بحاجة إلى اللغة النشطة داخل إجراء خادم (مثلًا، لتوطين رسائل البريد الإلكتروني أو تنفيذ منطق يعتمد على اللغة)، استدعِ getLocale من next-intlayer/server:
نسخ الكود إلى الحافظة
"use server";import { getLocale } from "next-intlayer/server";export const myServerAction = async () => { const locale = await getLocale(); // قم بشيء ما باستخدام اللغة};تتبع دالة getLocale استراتيجية متدرجة لتحديد لغة المستخدم:
- أولاً، يتحقق من رؤوس الطلب عن قيمة لغة قد تم تعيينها بواسطة البروكسي
- إذا لم يتم العثور على لغة في الرؤوس، يبحث عن لغة مخزنة في الكوكيز
- إذا لم يتم العثور على كوكيز، يحاول اكتشاف اللغة المفضلة للمستخدم من إعدادات المتصفح
- كخيار أخير، يعود إلى اللغة الافتراضية المكونة في التطبيق
هذا يضمن اختيار اللغة الأنسب بناءً على السياق المتاح.
(اختياري) الخطوة 13: تحسين حجم الحزمة الخاصة بك
عند استخدام next-intlayer، يتم تضمين القواميس في الحزمة لكل صفحة بشكل افتراضي. لتحسين حجم الحزمة، يوفر Intlayer إضافة SWC اختيارية تستبدل بشكل ذكي استدعاءات useIntlayer باستخدام الماكروز. هذا يضمن تضمين القواميس فقط في الحزم الخاصة بالصفحات التي تستخدمها فعليًا.
لتمكين هذا التحسين، قم بتثبيت حزمة @intlayer/swc. بمجرد التثبيت، سيقوم next-intlayer بالكشف تلقائيًا عن الإضافة واستخدامها:
npm install @intlayer/swc --save-devملاحظة: هذا التحسين متاح فقط لـ Next.js 13 وما فوق.
ملاحظة: هذه الحزمة غير مثبتة بشكل افتراضي لأن ملحقات SWC لا تزال تجريبية في Next.js. قد يتغير هذا في المستقبل.
مراقبة تغييرات القواميس على Turbopack
عند استخدام Turbopack كخادم تطوير مع أمر next dev، لن يتم اكتشاف تغييرات القواميس تلقائيًا بشكل افتراضي.
يحدث هذا القيد لأن Turbopack لا يمكنه تشغيل ملحقات webpack بالتوازي لمراقبة التغييرات في ملفات المحتوى الخاصة بك. للتغلب على هذا، ستحتاج إلى استخدام أمر intlayer watch لتشغيل كل من خادم التطوير ومراقب بناء Intlayer في نفس الوقت.
نسخ الكود إلى الحافظة
{ // ... تكوينات package.json الحالية الخاصة بك "scripts": { // ... تكوينات السكربتات الحالية الخاصة بك "dev": "intlayer watch --with 'next dev'", },}إذا كنت تستخدم next-intlayer@<=6.x.x، تحتاج إلى الاحتفاظ بعلم --turbopack لجعل تطبيق Next.js 16 يعمل بشكل صحيح مع Turbopack. نوصي باستخدام next-intlayer@>=7.x.x لتجنب هذا القيد.
تكوين TypeScript
يستخدم Intlayer تعزيز الوحدات (module augmentation) للاستفادة من TypeScript وجعل قاعدة الكود الخاصة بك أقوى.


تأكد من أن تكوين TypeScript الخاص بك يتضمن الأنواع التي تم إنشاؤها تلقائيًا.
نسخ الكود إلى الحافظة
{ // ... تكوينات TypeScript الحالية الخاصة بك "include": [ // ... تكوينات TypeScript الحالية الخاصة بك ".intlayer/**/*.ts", // Include the auto-generated types ],}تكوين Git
يوصى بتجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب الالتزام بها في مستودع Git الخاص بك.
للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف .gitignore الخاص بك:
نسخ الكود إلى الحافظة
# تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer.intlayerإضافة VS Code
لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت إضافة Intlayer الرسمية لـ VS Code.
تقدم هذه الإضافة:
- الإكمال التلقائي لمفاتيح الترجمة.
- كشف الأخطاء في الوقت الحقيقي للترجمات المفقودة.
- معاينات داخلية للمحتوى المترجم.
- إجراءات سريعة لإنشاء الترجمات وتحديثها بسهولة.
لمزيد من التفاصيل حول كيفية استخدام الإضافة، راجع توثيق إضافة Intlayer لـ VS Code.
التقدم أكثر
للتقدم أكثر، يمكنك تنفيذ المحرر المرئي أو إخراج محتواك باستخدام نظام إدارة المحتوى (CMS).