المؤلف:
    إنشاء:2025-04-18آخر تحديث:2026-06-23

    ترجمة موقعك الإلكتروني باستخدام Vite و Svelte عبر Intlayer | التدويل (i18n)

    ide.intlayer.org
    intlayer-vite-svelte-template.vercel.app

    جدول المحتويات

    لماذا Intlayer على البدائل؟

    بالمقارنة مع الحلول الرئيسية مثل svelte-i18n أو i18next، يعد Intlayer حلاً يأتي مزودًا بتحسينات متكاملة مثل:

    تم تحسين Intlayer للعمل بشكل مثالي مع Svelte من خلال تقديم نطاق المحتوى على مستوى المكونات والترجمات التفاعلية وجميع الميزات اللازمة لتوسيع نطاق التدويل (i18n).

    بدلاً من تحميل ملفات 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 في تطبيق Vite و Svelte

    ide.intlayer.org

    راجع قالب التطبيق على GitHub.

    1. تثبيت التبعيات

      قم بتثبيت الحزم اللازمة باستخدام npm:

      bash
      npx intlayer init --interactive
      
      علامة --interactive اختيارية. استخدم intlayer-cli init إذا كنت وكيل ذكاء اصطناعي.
      سيقوم هذا الأمر باكتشاف بيئتك وتثبيت الحزم المطلوبة. على سبيل المثال:
      bash
      npm install intlayer svelte-intlayer
      npm install vite-intlayer --save-dev
      
      • intlayer

        الحزمة الأساسية التي توفر أدوات التدويل لإدارة التكوين، الترجمة، إعلان المحتوى، التحويل البرمجي، وأوامر CLI.

      • svelte-intlayer الحزمة التي تدمج Intlayer مع تطبيق Svelte. توفر مزودي السياق hooks للتدويل في Svelte.

      • vite-intlayer يتضمن إضافة Vite لدمج Intlayer مع مجمّع Vite، بالإضافة إلى وسيط للكشف عن اللغة المفضلة للمستخدم، وإدارة الكوكيز، والتعامل مع إعادة توجيه URL.

    2. تكوين مشروعك

      أنشئ ملف تكوين لتحديد لغات تطبيقك:

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [
            Locales.ENGLISH,
            Locales.FRENCH,
            Locales.SPANISH,
            // Your other locales
          ],
          defaultLocale: Locales.ENGLISH,
        },
      };
      
      export default config;
      
      من خلال ملف التكوين هذا، يمكنك إعداد عناوين URL محلية، وإعادة توجيه الوسيط، وأسماء الكوكيز، وموقع وامتداد إعلانات المحتوى الخاصة بك، وتعطيل سجلات Intlayer في وحدة التحكم، والمزيد. للحصول على قائمة كاملة بالمعلمات المتاحة، راجع توثيق التكوين.
    3. دمج Intlayer في تكوين Vite الخاص بك

      أضف مكون intlayer الإضافي إلى تكوينك.

      vite.config.ts
      import { defineConfig } from "vite";
      import { svelte } from "@sveltejs/vite-plugin-svelte";
      import { intlayer } from "vite-intlayer";
      
      // https://vitejs.dev/config/
      export default defineConfig({
        plugins: [svelte(), intlayer()],
      });
      
      يُستخدم مكون Vite الإضافي intlayer() لدمج Intlayer مع Vite. يضمن بناء ملفات إعلان المحتوى ويراقبها في وضع التطوير. كما يعرّف متغيرات بيئة Intlayer داخل تطبيق Vite. بالإضافة إلى ذلك، يوفر ألقابًا لتحسين الأداء.
    4. إعلان المحتوى الخاص بك

      قم بإنشاء وإدارة إعلانات المحتوى الخاصة بك لتخزين الترجمات:

      src/app.content.tsx
      import { t, type Dictionary } from "intlayer";
      
      const appContent = {
        key: "app",
        content: {
          title: t({
            en: "Hello World",
            fr: "Bonjour le monde",
            es: "Hola mundo",
          }),
        },
      } satisfies Dictionary;
      
      export default appContent;
      
      يمكن تعريف إعلانات المحتوى الخاصة بك في أي مكان داخل تطبيقك بمجرد تضمينها في دليل contentDir (افتراضيًا، ./src). ويجب أن تتطابق مع امتداد ملف إعلان المحتوى (افتراضيًا، .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}).
      لمزيد من التفاصيل، راجع توثيق إعلان المحتوى.
    5. استخدام Intlayer في الكود الخاص بك

      src/App.svelte
      <script>
        import { useIntlayer } from "svelte-intlayer";
      
        const content = useIntlayer("app");
      </script>
      
      <div>
      
      
      <!-- عرض المحتوى كمحتوى بسيط -->
      <h1>{$content.title}</h1>
      <!-- لعرض المحتوى قابل للتحرير باستخدام المحرر -->
      <h1>{@const Title = $content.title}<Title /></h1>
      <!-- لعرض المحتوى كسلسلة نصية -->
      <div aria-label={$content.title.value}></div>
      <div aria-label={$content.title.toString()}></div>
      <div aria-label={String($content.title)}></div>
      
      إذا كان تطبيقك موجودًا بالفعل، يمكنك استخدام مترجم Intlayer، بالإضافة إلى أمر الاستخراج، لتحويل آلاف المكونات في ثانية واحدة.
    6. تغيير لغة المحتوى الخاص بك

      اختياري
      src/App.svelte
      <script lang="ts">
      import  { getLocaleName } from 'intlayer';
      import { useLocale } from "svelte-intlayer";
      
      // الحصول على معلومات اللغة ودالة setLocale
      const { locale, availableLocales, setLocale } = useLocale();
      
      // التعامل مع تغيير اللغة
      const changeLocale = (event: Event) => {
        const target = event.target as HTMLSelectElement;
        const newLocale = target.value;
        setLocale(newLocale);
      };
      </script>
      
      <div>
        <select value={$locale} on:change={changeLocale}>
          {#each availableLocales ?? [] as loc}
            <option value={loc}>
              {getLocaleName(loc)}
            </option>
          {/each}
        </select>
      </div>
      
    7. عرض Markdown

      اختياري

      يدعم Intlayer عرض محتوى Markdown مباشرة في تطبيق Svelte الخاص بك. بشكل افتراضي، يتم التعامل مع Markdown كنص عادي. لتحويل Markdown إلى HTML غني، يمكنك دمج @humanspeak/svelte-markdown، أو أي محلل Markdown آخر.

      لرؤية كيفية إعلان محتوى markdown باستخدام حزمة intlayer، راجع وثيقة markdown.
      src/App.svelte
      <script>
        import { setIntlayerMarkdown } from "svelte-intlayer";
      
        setIntlayerMarkdown((markdown) =>
         // عرض محتوى الماركداون كسلسلة نصية
         return markdown;
        );
      </script>
      
      <h1>{$content.markdownContent}</h1>
      
      يمكنك أيضًا الوصول إلى بيانات الـ front-matter الخاصة بالماركداون باستخدام الخاصية content.markdownContent.metadata.xxx.
    8. إعداد محرر intlayer / نظام إدارة المحتوى

      اختياري

      لإعداد محرر intlayer، يجب عليك اتباع توثيق محرر intlayer.

      لإعداد نظام إدارة المحتوى (CMS) الخاص بـ intlayer، يجب عليك اتباع توثيق نظام إدارة المحتوى intlayer.

    9. إضافة التوجيه المحلي (localized Routing) لتطبيقك

      اختياري

      للتعامل مع التوجيه المحلي في تطبيق Svelte الخاص بك، يمكنك استخدام svelte-spa-router مع localeFlatMap من Intlayer لتوليد المسارات لكل لغة.

      أولاً، قم بتثبيت svelte-spa-router:

      bash
      npm install svelte-spa-router
      npx intlayer init
      

      ثم، أنشئ ملف Router.svelte لتعريف المسارات الخاصة بك:

      src/Router.svelte
      <script lang="ts">
      import { localeFlatMap } from "intlayer";
      import Router from "svelte-spa-router";
      import { wrap } from "svelte-spa-router/wrap";
      import App from "./App.svelte";
      
      const routes = Object.fromEntries(
          localeFlatMap(({locale, urlPrefix}) => [
          [
              urlPrefix || '/',
              wrap({
                  component: App as any,
                  props: {
                      locale,
                  },
              }),
          ],
          ])
      );
      </script>
      
      <Router {routes} />
      

      قم بتحديث ملف main.ts لتركيب مكون Router بدلاً من App:

      src/main.ts
      import { mount } from "svelte";
      import Router from "./Router.svelte";
      
      const app = mount(Router, {
        target: document.getElementById("app")!,
      });
      
      export default app;
      

      أخيرًا، قم بتحديث ملف App.svelte الخاص بك لاستقبال الخاصية locale واستخدامها مع useIntlayer:

      src/App.svelte
      <script lang="ts">
      import type { Locale } from 'intlayer';
      import { useIntlayer } from "svelte-intlayer";
      import Counter from './lib/Counter.svelte';
      import LocaleSwitcher from './lib/LocaleSwitcher.svelte';
      
      export let locale: Locale;
      
      $: content = useIntlayer('app', locale);
      </script>
      
      <main>
        <div class="locale-switcher-container">
          <LocaleSwitcher currentLocale={locale} />
        </div>
      
        <!-- ... بقية تطبيقك ... -->
      </main>
      

      تكوين التوجيه على جانب الخادم (اختياري)

      بالتوازي، يمكنك أيضًا استخدام intlayerProxy لإضافة التوجيه من جانب الخادم إلى تطبيقك. سيقوم هذا الإضافة تلقائيًا باكتشاف اللغة الحالية بناءً على عنوان URL وتعيين ملف تعريف الارتباط الخاص باللغة المناسبة. إذا لم يتم تحديد لغة، فسيحدد الإضافة اللغة الأنسب بناءً على تفضيلات لغة متصفح المستخدم. إذا لم يتم اكتشاف أي لغة، فسيتم إعادة التوجيه إلى اللغة الافتراضية.

      ملاحظة: لاستخدام intlayerProxy في بيئة الإنتاج، تحتاج إلى نقل حزمة vite-intlayer من devDependencies إلى dependencies.
      منذ Intlayer v9، يتم توضيب intlayerProxy() مباشرة في plugin intlayer() وتفعيله بشكل افتراضي من خلال خيار routing.enableProxy (true افتراضياً). تسجيله بشكل منفصل كما هو موضح أدناه أصبح اختيارياً الآن — يتم الاحتفاظ به لأغراض التوافقية العكسية وللإعدادات التي تحتاج إلى التحكم في ترتيب plugins. اضبط routing.enableProxy: false للعزوف عن ذلك. انظر إلى ملاحظات الإصدار v9.
      vite.config.ts
      import { defineConfig } from "vite";
      import { svelte } from "@sveltejs/vite-plugin-svelte";
      import { intlayer } from "vite-intlayer";
      
      typescript {3,7} fileName="vite.config.ts" codeFormat="typescript"
      import { defineConfig } from "vite";
      import { svelte } from "@sveltejs/vite-plugin-svelte";
      import { intlayer } from "vite-intlayer";
      
      // https://vitejs.dev/config/
      export default defineConfig({
        plugins: [intlayerProxy(), // should be placed first
       svelte(), intlayer()],
      });
      
    10. تغيير عنوان URL عند تغيير اللغة

      اختياري

      للسماح للمستخدمين بتغيير اللغة وتحديث عنوان URL وفقًا لذلك، يمكنك إنشاء مكون LocaleSwitcher. سيستخدم هذا المكون getLocalizedUrl من intlayer و push من svelte-spa-router.

      src/lib/LocaleSwitcher.svelte
      <script lang="ts">
      import { getLocaleName, getLocalizedUrl } from "intlayer";
      import { useLocale } from "svelte-intlayer";
      import { push } from "svelte-spa-router";
      
      export let currentLocale: string | undefined = undefined;
      
      // الحصول على معلومات اللغة
      const { locale, availableLocales } = useLocale();
      
      // التعامل مع تغيير اللغة
      const changeLocale = (event: Event) => {
        const target = event.target as HTMLSelectElement;
        const newLocale = target.value;
        const currentUrl = window.location.pathname;
        const url = getLocalizedUrl( currentUrl, newLocale);
        push(url);
      };
      </script>
      
      <div class="locale-switcher">
        <select value={currentLocale ?? $locale} onchange={changeLocale}>
          {#each availableLocales ?? [] as loc}
            <option value={loc}>
              {getLocaleName(loc)}
            </option>
          {/each}
        </select>
      </div>
      
    11. الروابط المترجمة

      اختياري

      لأغراض SEO، من المستحسن إضافة بادئة locale إلى مساراتك (على سبيل المثال، /about, /fr/about).

      src/lib/components/Link.svelte
      <script lang="ts">
        import { getLocalizedUrl } from "intlayer";
        import { useLocale } from "svelte-intlayer";
      
        export let href = "";
        const { locale } = useLocale();
      
        // مساعد لإضافة البادئة إلى عنوان URL
        $: localizedHref = getLocalizedUrl(href, $locale);
      </script>
      
      <a href={localizedHref}>
        <slot />
      </a>
      
    12. استخراج محتوى مكوناتك

      اختياري

      إذا كان لديك قاعدة بيانات كود موجودة، فقد يكون تحويل آلاف الملفات مستهلكًا للوقت.

      لتسهيل هذه العملية، يقترح 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
      
      Since v9, the intlayerCompiler is included in the intlayer plugin. So you don't need to add it manually.
      babel.config.js
      const {
        intlayerExtractBabelPlugin,
        getExtractPluginOptions,
      } = require("@intlayer/babel");
      
      module.exports = {
        presets: ["next/babel"],
        plugins: [
          // استخراج المحتوى من المكونات إلى القواميس
          [intlayerExtractBabelPlugin, getExtractPluginOptions()],
        ],
      };
      
      bash
      npm run build # أو npm run dev
      

    (اختياري) خريطة الموقع و 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 في جذر المشروع

    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

    package.json
    {
      "scripts": {
        "dev": "vite",
        "prebuild": "node generate-seo.mjs",
        "build": "vite build",
        "preview": "vite preview"
      }
    }
    

    عدّل الأوامر إن كنت تستخدم pnpm أو yarn. يمكن استدعاء السكربت من CI أيضاً.

    تكوين Git

    يوصى بتجاهل الملفات التي يتم إنشاؤها بواسطة Intlayer. هذا يسمح لك بتجنب إضافتها إلى مستودع Git الخاص بك.

    للقيام بذلك، يمكنك إضافة التعليمات التالية إلى ملف .gitignore الخاص بك:

    bash
    # تجاهل الملفات التي تم إنشاؤها بواسطة Intlayer
    .intlayer
    

    إضافة VS Code

    لتحسين تجربة التطوير الخاصة بك مع Intlayer، يمكنك تثبيت امتداد Intlayer الرسمي لـ VS Code.

    التثبيت من سوق VS Code

    يوفر هذا الامتداد:

    • الإكمال التلقائي لمفاتيح الترجمة.
    • الكشف عن الأخطاء في الوقت الحقيقي للترجمات المفقودة.
    • معاينات داخلية للمحتوى المترجم.
    • إجراءات سريعة لإنشاء التراجم وتحديثها بسهولة.

    لمزيد من التفاصيل حول كيفية استخدام الامتداد، راجع توثيق امتداد Intlayer لـ VS Code.


    التعمق أكثر

    للمضي قدمًا، يمكنك تنفيذ المحرر المرئي أو إخراج محتواك باستخدام نظام إدارة المحتوى (CMS).

    الأسئلة الشائعة

    لا يفرض Vite أي رأي بشأن تدويل التطبيقات (i18n)، لذا يعود الخيار لمنظومة Svelte:

    • svelte-i18n أو typesafe-i18n: حلول تعتمد على متاجر Svelte.
    • Intlayer: إعلان بجانب المكون، ترجمة وقت البناء، استجابة Svelte كاملة، وترجمة بالذكاء الاصطناعي.

    انظر لماذا Intlayer.

    أقل بكثير من الحلول القائمة على فضاءات الأسماء، لأن الصفحة لا تُحمل أبدًا كتالوجًا لا تعرضه. يستبدل مترجم وقت البناء استدعاءات useIntlayer بإدخالات القاموس الدقيقة التي يستخدمها المكون، وتفصل القواميس الديناميكية الباقي حسب اللغة، مما يقلل الحزمة بنسبة تصل إلى 50%. انظر تحسين الحزم و المقارنة المعيارية.

    إلى حد كبير نعم. اتبع دليل ترحيل Svelte I18n.

    نعم. تحافظ مكونة مزامنة JSON على ملفات /messages/{locale}/{namespace}.json الخاصة بك كمصدر الحقيقة وتُنشئ قواميس Intlayer منها، في كلا الاتجاهين. وتقوم مكونة مزامنة PO بنفس الشيء لكتالوجات gettext، وتسمح لك الملفات المقسمة حسب اللغة بتقسيم المحتوى حسب اللغة بدلاً من تجميع كل اللغات في ملف واحد.

    لا. قم بتشغيل npx intlayer extract وسيقرأ Intlayer ملفاتك، ويسحب السلاسل النصية الموجهة للمستخدم، ويكتب ملف .content بجانب كل منها، حتى تراجع diff بدلاً من نسخ السلاسل إلى كتالوج يدويًا.

    لأتمتة كاملة، يقوم Intlayer Compiler بالشيء نفسه في وقت البناء: يمسح الكود عند كل تغيير، وينشئ القواميس ويزامنها مع HMR.

    هناك حدان يجدر معرفتهما قبل تشغيل المترجم. إنه يعمل عن طريق التحليل الثابت، وبالتالي فإن السلاسل التي تظهر فقط في وقت التشغيل، مثل رموز أخطاء API أو حقول نظام إدارة المحتوى، تظل بعيدة عن متناوله. كما يتعين عليه التمييز بين النصوص الموجهة للمستخدم ومنطق التطبيق مثل className="active" أو رمز الحالة، الأمر الذي يتطلب بعض الملاحظات التوضيحية في قاعدة التعليمات البرمجية الكبيرة. يتجنب أمر الاستخراج كلا الأمرين من خلال إبقائك متحكمًا في العملية.

    خمس أدوات، كلها اختيارية:

    • امتداد 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 ترصد النصوص المكتوبة مباشرة بدون تدويل.