الرئيسيةبيئة اختبارمعرض الأعمالتطبيقوثيقةمدونة
    • Englishالإنجليزية
      EN
    • русскийالروسية
      RU
    • 日本語اليابانية
      JA
    • françaisالفرنسية
      FR
    • 한국어الكورية
      KO
    • 中文الصينية
      ZH
    • españolالإسبانية
      ES
    • Deutschالألمانية
      DE
    • العربيةالعربية
      AR
    • italianoالإيطالية
      IT
    • British Englishالإنجليزية (المملكة المتحدة)
      EN-GB
    • portuguêsالبرتغالية
      PT
    • हिन्दीالهندية
      HI
    • Türkçeالتركية
      TR
    • polskiالبولندية
      PL
    • Indonesiaالإندونيسية
      ID
    • Tiếng Việtالفيتنامية
      VI
    • українськаالأوكرانية
      UK
    /
    تصفية المستندات حسب الإطار
    Alt+←
    لماذا Intlayer؟
    ابدأ
    مفهوم
    • كيف يعمل Intlayer
    • التكوين
    • TestFillBuildWatchExtractLoginPushPullConfigurationListVersionEditorLiveDebugDoc ReviewDoc TranslateSDK
    • المحرر المرئي
    • CMS
    • تكامل CI/CD
    • ترجمةجمعتعدادشرطجنسإدراجملفتداخلMarkdownHTMLجلب الوظيفة
    • ملف لكل لغة
    • محرر
    • الملء التلقائي
    • اختبار
    • تحسين الحزمة
    بيئة
    • Next.js 14 وموجه التطبيق
      Next.js 15
      Next.js بدون locale URL
      Next.js وموجه الصفحة
      المترجم
    • Tanstack Start Solid
    • Astro و React
      Astro و Svelte
      Astro و Vue
      Astro و Solid
      Astro و Preact
      Astro و Lit
      Astro و Vanilla JS
    • React Router v7
      React Router v7 (fs-routes)
      Compiler
    • Nuxt و Vue
    • Vite و Solid
    • SvelteKit
    • Vite و Preact
    • Vite و Vanilla JS
    • Vite و Lit
    • Angular 19 (Webpack)
      Analog
    • React CRA
    • React Native و Expo
    • Express.js
      NestJS
      Fastify
      Hono
      Adonis
    • Lynx و React
    Plugins
    • JSON
    • gettext (.po)
    امتداد VS Code
    وكيل
    • خادم MCP
    • مهارات الوكيل
    إصدارات
    • v8
    • v7
    • v6
    مؤشر أداء
    • Next.js
    • TanStack
    • Vue
    • Solid
    • Svelte
    مدونة
    طرح سؤال
    1. Documentation
    2. مفهوم
    3. Custom_url_rewrites
    \n\n ```\n\n \n \n \n ```tsx\n import { useRewriteURL } from \"solid-intlayer\";\n\n const Layout = (props) => {\n useRewriteURL();\n return <>{props.children};\n };\n ```\n\n \n \n \n ```svelte\n \n\n ```\n\n \n\n\n## تكامل Router و Proxies\n\nوكلاء الخادم الخاصين بـ Intlayer (Vite و Next.js) يتعاملون تلقائيًا مع إعادة الكتابة المخصصة لضمان تناسق SEO.\n\n1. **إعادة الكتابة الداخلية**: عندما يزور المستخدم /fr/a-propos، يقوم الوكيل داخليًا بتعيينه إلى /fr/about حتى يتطابق الإطار الخاص بك مع المسار الصحيح.\n2. **إعادة التوجيه الموثوقة**: إذا كتب المستخدم يدويًا /fr/about، يصدر الوكيل إعادة توجيه 301/302 إلى /fr/a-propos، مما يضمن أن محركات البحث تؤرشف نسخة واحدة فقط من الصفحة.\n\n### تكامل Next.js\n\nيتم التعامل مع تكامل Next.js بالكامل عبر الـ middleware `intlayerProxy`.\n\n```typescript fileName=\"middleware.ts\"\nimport { intlayerProxy } from \"next-intlayer/middleware\";\nimport { NextRequest } from \"next/server\";\n\nexport function middleware(request: NextRequest) {\n return intlayerProxy(request);\n}\n```\n\n### التكامل مع Vite\n\nبالنسبة لـ SolidJS و Vue و Svelte، يقوم ملحق Vite `intlayerProxy` بإدارة عمليات إعادة الكتابة أثناء التطوير.\n\n```typescript fileName=\"vite.config.ts\"\nimport { defineConfig } from \"vite\";\nimport { intlayerProxy } from \"vite-intlayer\";\n\nexport default defineConfig({\n plugins: [intlayerProxy()],\n});\n```\n\n## الميزات الرئيسية\n\n### 1. إعادة كتابة متعددة السياقات\n\nيقوم كل مُنسق بإنشاء `RewriteObject` يحتوي على قواعد متخصصة لمستهلكين مختلفين:\n\n- `url`: مُحسّن لتوليد عناوين URL على جانب العميل (يزيل مقاطع اللغة).\n- `nextjs`: يحافظ على `[locale]` لوسيط Next.js.\n- `vite`: يحافظ على `:locale` لوكلاء Vite.\n\n### 2. التطبيع التلقائي للأنماط\n\nيقوم Intlayer داخليًا بتطبيع كافة تراكيب الأنماط (مثل تحويل `[param]` إلى `:param`) بحيث يظل التطابق متسقًا بغض النظر عن إطار العمل المصدر.\n\n### 3. عناوين URL المعتمدة في تحسين محركات البحث (SEO)\n\nمن خلال فرض إعادة التوجيه من المسارات canonical إلى الأسماء المستعارة الجذابة (pretty aliases)، يمنع Intlayer مشكلات المحتوى المكرر ويحسّن اكتشاف الموقع.\n\n## الأدوات الأساسية\n\n- `getLocalizedUrl(url, locale)`: ينشئ عنوان URL مخصّصًا للّغة مع مراعاة قواعد إعادة الكتابة.\n- `getCanonicalPath(path, locale)`: يُرجع المسار الداخلي canonical المقابل لعنوان URL المخصّص للّغة.\n- `getRewritePath(pathname, locale)`: يكشف ما إذا كان اسم المسار بحاجة إلى تصحيح ليطابق اسمه المحلي الأكثر جاذبية (prettier localized alias).\n","about":"تعرّف على كيفية تكوين واستخدام إعادة كتابة روابط URL المخصصة في Intlayer لتحديد مسارات خاصة بكل لغة.","url":"https://intlayer.org/ar/doc/concept/custom_url_rewrites","datePublished":"13-08-2024","dateModified":"26-01-2026","keywords":"إعادة كتابة روابط URL مخصصة, Routing, Internationalization, i18n","license":"https://raw.githubusercontent.com/aymericzip/intlayer/refs/heads/main/LICENSE","audience":{"@type":"Audience","audienceType":"المطورون ومديرو المحتوى"}}
    إنشاء:2024-08-13آخر تحديث:2026-01-26
    استخدم هذه الصفحة والموفر AI الذي تريده
    ChatGPT
    Claude
    DeepSeek
    Google AI mode
    Gemini
    Perplexity
    Mistral
    Grok

    استخدم مساعدك المفضل للملخص واستخدم هذه الصفحة والموفر AI الذي تريده

    تاريخ الإصدارات

    1. "تنفيذ إعادة كتابة URL مركزية مع مُنسقين مخصصين لكل إطار عمل واستخدام الـ hook المسمى useRewriteURL."
      v8.0.025‏/1‏/2026

    تمت ترجمة محتوى هذه الصفحة باستخدام الذكاء الاصطناعي.

    اعرض آخر نسخة المحتوى الأصلي باللغة الإنكليزية
    تعديل هذه الوثيقة

    إذا كان لديك فكرة لتحسين هذه الوثيقة، فلا تتردد في المساهمة من خلال تقديم طلب سحب على GitHub.

    رابط GitHub للتوثيق
    نسخ

    نسخ الـ Markdown من المستند إلى الحافظة

    تنفيذ إعادة كتابة روابط URL مخصصة

    يدعم Intlayer إعادة كتابة روابط URL المخصصة، مما يتيح لك تحديد مسارات خاصة بكل لغة تختلف عن بنية /locale/path الافتراضية. هذا يسمح بعناوين URL مثل /about للإنجليزية و/a-propos للفرنسية مع الحفاظ على منطق التطبيق الداخلي بصيغته المعيارية.

    التكوين

    يتم تكوين عمليات إعادة الكتابة المخصصة في قسم routing من ملف intlayer.config.ts الخاص بك باستخدام مُنسِّقات خاصة بكل إطار عمل. توفّر هذه المُنسِّقات الصياغة الصحيحة للراوتر الذي تفضّله.

    intlayer.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { Locales, type IntlayerConfig } from "intlayer";import { nextjsRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-no-default",    rewrite: nextjsRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
    intlayer.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { Locales, type IntlayerConfig } from "intlayer";import { reactRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: reactRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { Locales, type IntlayerConfig } from "intlayer";import { tanstackRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: tanstackRouterRewrite({      "/$locale/about": {        fr: "/$locale/a-propos",        es: "/$locale/acerca-de",      },      "/$locale/products/$id": {        fr: "/$locale/produits/$id",        es: "/$locale/productos/$id",      },    }),  },};export default config;
    intlayer.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { Locales, type IntlayerConfig } from "intlayer";import { vueRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ... (إعدادات أخرى)  routing: {    mode: "prefix-all",    rewrite: vueRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { Locales, type IntlayerConfig } from "intlayer";import { svelteKitRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: svelteKitRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
    intlayer.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { Locales, type IntlayerConfig } from "intlayer";import { solidRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: solidRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
    intlayer.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { Locales, type IntlayerConfig } from "intlayer";import { nuxtRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // إعدادات إضافية  routing: {    mode: "prefix-all",    rewrite: nuxtRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;

    المنسقات المتاحة

    • nextjsRewrite: لـ Next.js App Router. يدعم [slug]، [...slug] (1+)، و[[...slug]] (0+).
    • svelteKitRewrite: لـ SvelteKit. يدعم [slug]، [...path] (0+)، و[[optional]] (0-1).
    • reactRouterRewrite: لـ React Router. يدعم :slug و* (0+).
    • vueRouterRewrite: لـ Vue Router 4. يدعم :slug، :slug? (0-1)، :slug* (0+)، و:slug+ (1+).
    • solidRouterRewrite: لـ Solid Router. يدعم :slug و*slug (0+).
    • tanstackRouterRewrite: لـ TanStack Router. يدعم $slug و * (0+).
    • nuxtRewrite: لـ Nuxt 3. يدعم [slug] و [...slug] (0+).
    • viteRewrite: مُنسّق عام لأي مشروع قائم على Vite. يوحّد صياغة إعداد البروكسي الخاص بـ Vite.

    أنماط متقدمة

    يقوم Intlayer داخليًا بتوحيد هذه الأنماط إلى صيغة موحّدة، مما يسمح بمطابقة المسارات وتوليدها بشكل متقدم:

    • مقاطع اختيارية: [[optional]] (SvelteKit) أو :slug? (Vue/React) مدعومة.
    • مطابقة شاملة (صفر أو أكثر): [[...slug]] (Next.js)، [...path] (SvelteKit/Nuxt)، أو * (React/TanStack) تسمح بمطابقة عدة مقاطع.
    • مطابقة شاملة إلزامية (واحد أو أكثر): [...slug] (Next.js) أو :slug+ (Vue) تضمن وجود مقطع واحد على الأقل.

    تصحيح URL على جانب العميل: useRewriteURL

    لضمان أن يعكس شريط عنوان المتصفح دائمًا عنوان URL المحلي "الجميل"، توفر Intlayer الـ hook useRewriteURL. يقوم هذا الـ hook بتحديث الـ URL بصمت باستخدام window.history.replaceState عندما يصل المستخدم إلى مسار canonical.

    الاستخدام في الأطر

    tsx
    نسخ الكود

    نسخ الكود إلى الحافظة

    'use client';import { useRewriteURL } from "next-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // يصحح تلقائيًا /fr/about إلى /fr/a-propos  return <>{children}</>;};
    tsx
    نسخ الكود

    نسخ الكود إلى الحافظة

    'use client';import { useRewriteURL } from "react-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // يصحح تلقائيًا /fr/about إلى /fr/a-propos  return <>{children}</>;};
    vue
    نسخ الكود

    نسخ الكود إلى الحافظة

    <script setup>import { useRewriteURL } from "vue-intlayer";useRewriteURL();</script>
    tsx
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { useRewriteURL } from "solid-intlayer";const Layout = (props) => {  useRewriteURL();  return <>{props.children}</>;};
    svelte
    نسخ الكود

    نسخ الكود إلى الحافظة

    <script>import { useRewriteURL } from "svelte-intlayer";useRewriteURL();</script>

    تكامل Router و Proxies

    وكلاء الخادم الخاصين بـ Intlayer (Vite و Next.js) يتعاملون تلقائيًا مع إعادة الكتابة المخصصة لضمان تناسق SEO.

    1. إعادة الكتابة الداخلية: عندما يزور المستخدم /fr/a-propos، يقوم الوكيل داخليًا بتعيينه إلى /fr/about حتى يتطابق الإطار الخاص بك مع المسار الصحيح.
    2. إعادة التوجيه الموثوقة: إذا كتب المستخدم يدويًا /fr/about، يصدر الوكيل إعادة توجيه 301/302 إلى /fr/a-propos، مما يضمن أن محركات البحث تؤرشف نسخة واحدة فقط من الصفحة.

    تكامل Next.js

    يتم التعامل مع تكامل Next.js بالكامل عبر الـ middleware intlayerProxy.

    middleware.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { intlayerProxy } from "next-intlayer/middleware";import { NextRequest } from "next/server";export function middleware(request: NextRequest) {  return intlayerProxy(request);}

    التكامل مع Vite

    بالنسبة لـ SolidJS و Vue و Svelte، يقوم ملحق Vite intlayerProxy بإدارة عمليات إعادة الكتابة أثناء التطوير.

    vite.config.ts
    نسخ الكود

    نسخ الكود إلى الحافظة

    import { defineConfig } from "vite";import { intlayerProxy } from "vite-intlayer";export default defineConfig({  plugins: [intlayerProxy()],});

    الميزات الرئيسية

    1. إعادة كتابة متعددة السياقات

    يقوم كل مُنسق بإنشاء RewriteObject يحتوي على قواعد متخصصة لمستهلكين مختلفين:

    • url: مُحسّن لتوليد عناوين URL على جانب العميل (يزيل مقاطع اللغة).
    • nextjs: يحافظ على [locale] لوسيط Next.js.
    • vite: يحافظ على :locale لوكلاء Vite.

    2. التطبيع التلقائي للأنماط

    يقوم Intlayer داخليًا بتطبيع كافة تراكيب الأنماط (مثل تحويل [param] إلى :param) بحيث يظل التطابق متسقًا بغض النظر عن إطار العمل المصدر.

    3. عناوين URL المعتمدة في تحسين محركات البحث (SEO)

    من خلال فرض إعادة التوجيه من المسارات canonical إلى الأسماء المستعارة الجذابة (pretty aliases)، يمنع Intlayer مشكلات المحتوى المكرر ويحسّن اكتشاف الموقع.

    الأدوات الأساسية

    • getLocalizedUrl(url, locale): ينشئ عنوان URL مخصّصًا للّغة مع مراعاة قواعد إعادة الكتابة.
    • getCanonicalPath(path, locale): يُرجع المسار الداخلي canonical المقابل لعنوان URL المخصّص للّغة.
    • getRewritePath(pathname, locale): يكشف ما إذا كان اسم المسار بحاجة إلى تصحيح ليطابق اسمه المحلي الأكثر جاذبية (prettier localized alias).
    لماذا Intlayer؟
    Alt+→

    في هذه الصفحة

      المناقشات مجهولة الهوية ويتم مراجعتها بانتظام لمعالجة المشكلات الشائعة. لا تتردد في مشاركة أفكار الميزات أو التعليقات على الوثائق أو أي شيء يتعلق بـ Intlayer, نستخدم هذه المدخلات لتشكيل خارطة الطريق وتحسين المنتج.

      import { Locales, type IntlayerConfig } from "intlayer";import { nextjsRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-no-default",    rewrite: nextjsRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { reactRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: reactRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { tanstackRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: tanstackRouterRewrite({      "/$locale/about": {        fr: "/$locale/a-propos",        es: "/$locale/acerca-de",      },      "/$locale/products/$id": {        fr: "/$locale/produits/$id",        es: "/$locale/productos/$id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { vueRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ... (إعدادات أخرى)  routing: {    mode: "prefix-all",    rewrite: vueRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { svelteKitRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: svelteKitRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { solidRouterRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // ...  routing: {    mode: "prefix-all",    rewrite: solidRouterRewrite({      "/:locale/about": {        fr: "/:locale/a-propos",        es: "/:locale/acerca-de",      },      "/:locale/products/:id": {        fr: "/:locale/produits/:id",        es: "/:locale/productos/:id",      },    }),  },};export default config;
      import { Locales, type IntlayerConfig } from "intlayer";import { nuxtRewrite } from "intlayer/routing";const config: IntlayerConfig = {  // إعدادات إضافية  routing: {    mode: "prefix-all",    rewrite: nuxtRewrite({      "/[locale]/about": {        fr: "/[locale]/a-propos",        es: "/[locale]/acerca-de",      },      "/[locale]/products/[id]": {        fr: "/[locale]/produits/[id]",        es: "/[locale]/productos/[id]",      },    }),  },};export default config;
      'use client';import { useRewriteURL } from "next-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // يصحح تلقائيًا /fr/about إلى /fr/a-propos  return <>{children}</>;};
      'use client';import { useRewriteURL } from "react-intlayer";const MyLayout = ({ children }) => {  useRewriteURL(); // يصحح تلقائيًا /fr/about إلى /fr/a-propos  return <>{children}</>;};
      <script setup>import { useRewriteURL } from "vue-intlayer";useRewriteURL();</script>
      import { useRewriteURL } from "solid-intlayer";const Layout = (props) => {  useRewriteURL();  return <>{props.children}</>;};
      <script>import { useRewriteURL } from "svelte-intlayer";useRewriteURL();</script>
      import { intlayerProxy } from "next-intlayer/middleware";import { NextRequest } from "next/server";export function middleware(request: NextRequest) {  return intlayerProxy(request);}
      import { defineConfig } from "vite";import { intlayerProxy } from "vite-intlayer";export default defineConfig({  plugins: [intlayerProxy()],});