--- createdAt: 2026-07-30 updatedAt: 2026-07-30 title: المحتوى بناءً على الاختيار description: تعرّف على كيفية استخدام المحتوى المستند إلى الاختيار في Intlayer لعرض محتوى ديناميكي استنادًا إلى قيمة نصية عشوائية. اتبع هذا التوثيق لتنفيذ محتوى شبيه بـ switch في مشروعك. keywords: - محتوى بناءً على الاختيار - Select Content - محتوى Switch - ICU select - عرض ديناميكي - التوثيق - Intlayer - Next.js - JavaScript - React slugs: - doc - concept - content - select history: - version: 9.1.0 date: 2026-07-30 changes: "تم تقديم محتوى يعتمد على الاختيار" author: aymericzip --- # المحتوى المستند إلى الاختيار (Select) / Intlayer ## كيف يعمل Select في Intlayer، يتم تحقيق المحتوى المستند إلى الاختيار من خلال الدالة `select` التي تقوم بتعيين قيم نصية عشوائية لمحتواها المقابل. هذا يعادل رسالة `{value, select, …}` في ICU، أو تعليمة `switch` في الكود الخاص بتطبيقك. استخدم `select` عندما يكون المُميّز (discriminant) عبارة عن سلسلة نصية حرة: حالة (status)، خطة (plan)، منصة (platform)، أو دور (role). أما بالنسبة للمُميّزات الأخرى، يوفر Intlayer عقدًا مخصصة: | المُميّز | العقدة | | --------------------- | ---------- | | كمية | `enu()` | | قيمة منطقية (Boolean) | `cond()` | | جنس | `gender()` | | أي نص آخر | `select()` | ## إعداد المحتوى المستند إلى الاختيار لإعداد المحتوى المستند إلى الاختيار في مشروع Intlayer الخاص بك، قم بإنشاء وحدة محتوى تتضمن تعريفات الاختيار الخاصة بك. فيما يلي أمثلة بتنسيقات متعددة. ```typescript fileName="**/*.content.ts" contentDeclarationFormat={["typescript", "esm", "commonjs"]} import { select, type Dictionary } from "intlayer"; const myPostContent = { key: "my_key", content: { publishStatus: select({ draft: "This post is a draft", published: "This post is live", scheduled: "This post is scheduled", fallback: "Unknown status", // اختياري }), }, } satisfies Dictionary; export default myPostContent; ``` ```json5 fileName="**/*.content.json" contentDeclarationFormat="json" { "$schema": "https://intlayer.org/schema.json", "key": "my_key", "content": { "publishStatus": { "nodeType": "select", "select": { "draft": "This post is a draft", "published": "This post is live", "scheduled": "This post is scheduled", "fallback": "Unknown status", // اختياري }, }, }, } ``` > إذا لم يتم الإعلان عن `fallback`، فسيتم اعتبار المفتاح الأخير المعلن كخيار احتياطي عند عدم تطابق القيمة المقدمة مع أي حالة معلنة: نفس عقد `cond()` و `gender()`. ### سلامة الأنواع (Type Safety) يتم استنتاج المعامل المقبول من الحالات المعلنة: - بدون `fallback`، سيتم قبول الحالات المعلنة فقط: يعتبر الخطأ الإملائي خطأ في النوع (type error). - مع `fallback`، يُقبل أي نص (حيث يغطي الخيار الاحتياطي القيم غير المتطابقة) بينما تستمر الحالات المعلنة في توفير ميزة الإكمال التلقائي (autocompletion). ## لماذا لا تستخدم كائنًا بسيطًا؟ من المغري أن تقوم بتعريف كائن بسيط والوصول إليه باستخدام القيمة أثناء وقت التشغيل: ```tsx // ❌ لا تفعل هذا const { publishStatus } = useIntlayer("my_key"); return

{publishStatus[publishType]}

; ``` يحلل مترجم (compiler) Intlayer كود المصدر الخاص بك لاستبعاد المحتوى غير المستخدم ولضغط (minify) المفاتيح المتبقية. لا يمكن تقييم الوصول الديناميكي المحسوب (`obj[expr]`) بشكل ثابت، لذلك سيتم تحديد الفرع بأكمله كأنه غامض (opaque): سيبقى في الحزمة (bundle) وتبقى مفاتيحه بدون ضغط. عند استخدام `select()`، يتم معالجة الحالة داخل استدعاء دالة بدلاً من الوصول كخاصية. يرى المترجم ذلك كوصول ثابت لحقل واحد، ويحسّن العقدة تمامًا كما يفعل مع `enu()`، `cond()` أو `gender()`: ```tsx // ✅ افعل هذا const { publishStatus } = useIntlayer("my_key"); return

{publishStatus(publishType)}

; ``` ## استخدام المحتوى المستند إلى الاختيار لاستخدام المحتوى المستند إلى الاختيار داخل مكون React، قم باستيراد واستخدام الخطاف `useIntlayer` من حزمة `react-intlayer`. يقوم هذا الخطاف بجلب المحتوى للمفتاح المحدد ويسمح لك بتمرير قيمة لاختيار الإخراج المناسب. ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]} import type { FC } from "react"; import { useIntlayer } from "react-intlayer"; const PostStatus: FC = () => { const { publishStatus } = useIntlayer("my_key"); return (

{ /* المخرجات: This post is a draft */ publishStatus("draft") }

{ /* المخرجات: This post is live */ publishStatus("published") }

{ /* المخرجات: Unknown status */ publishStatus("Archived") }

); }; export default PostStatus; ```
لاستخدام المحتوى المستند إلى الاختيار داخل مكونات العميل (client components) في Next.js، قم بجلبه باستخدام الخطاف `useIntlayer`. إليك مثال: ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]} "use client"; import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; const PostStatus: FC = () => { const { publishStatus } = useIntlayer("my_key"); return (

{publishStatus("draft")}

{publishStatus("published")}

); }; export default PostStatus; ```
لاستخدام المحتوى المستند إلى الاختيار داخل مكونات Vue، قم بجلبه باستخدام الخطاف `useIntlayer`. إليك مثال: ```vue fileName="**/*.vue" ``` لاستخدام المحتوى المستند إلى الاختيار داخل مكونات Svelte، قم بجلبه باستخدام الخطاف `useIntlayer`. يتم الوصول إلى store باستخدام `$`. إليك مثال: ```svelte fileName="**/*.svelte"

{$content.publishStatus("draft")}

{$content.publishStatus("published")}

```
لاستخدام المحتوى المستند إلى الاختيار داخل مكونات Preact، قم بجلبه باستخدام الخطاف `useIntlayer`. إليك مثال: ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]} import type { FC } from "preact"; import { useIntlayer } from "preact-intlayer"; const PostStatus: FC = () => { const { publishStatus } = useIntlayer("my_key"); return (

{publishStatus("draft")}

{publishStatus("published")}

); }; export default PostStatus; ```
لاستخدام المحتوى المستند إلى الاختيار داخل مكونات SolidJS، قم بجلبه باستخدام الخطاف `useIntlayer`. إليك مثال: ```tsx fileName="**/*.tsx" codeFormat={["typescript", "esm"]} import type { Component } from "solid-js"; import { useIntlayer } from "solid-intlayer"; const PostStatus: Component = () => { const { publishStatus } = useIntlayer("my_key"); return (

{publishStatus("draft")}

{publishStatus("published")}

); }; export default PostStatus; ```
لاستخدام المحتوى المستند إلى الاختيار داخل مكونات Angular، قم بجلبه باستخدام الخطاف `useIntlayer`. إليك مثال: ```typescript fileName="app.component.ts" codeFormat="typescript" import { Component } from "@angular/core"; import { useIntlayer } from "angular-intlayer"; @Component({ selector: "app-post-status", template: `

{{ content().publishStatus("draft") }}

{{ content().publishStatus("published") }}

`, }) export class PostStatusComponent { content = useIntlayer("my_key"); } ```
لاستخدام المحتوى المستند إلى الاختيار في `vanilla-intlayer`، قم بجلبه باستخدام الخطاف `useIntlayer`. إليك مثال: ```typescript fileName="**/*.ts" codeFormat={["typescript", "esm"]} import { installIntlayer, useIntlayer } from "vanilla-intlayer"; installIntlayer(); const content = useIntlayer("my_key").onChange((newContent) => { document.getElementById("status")!.textContent = newContent.publishStatus("draft"); }); // العرض الأولي document.getElementById("status")!.textContent = content.publishStatus("draft"); ```
## دمج Select مع العقد الأخرى تحتوي كل حالة على عقدة محتوى كاملة، لذلك يمكن تركيب `select` مع `t()`، `insert()`، `md()` وغيرها: ```typescript fileName="**/*.content.ts" codeFormat="typescript" import { insert, select, t, type Dictionary } from "intlayer"; const myPostContent = { key: "my_key", content: { publishStatus: select({ draft: insert( t({ en: "{{name}} saved a draft", fr: "{{name}} a enregistré un brouillon", ar: "حفظ {{name}} مسودة", }) ), published: insert( t({ en: "{{name}} published the post", fr: "{{name}} a publié l’article", ar: "نشر {{name}} المقال", }) ), fallback: insert( t({ en: "{{name}} updated the post", fr: "{{name}} a mis à jour l’article", ar: "قام {{name}} بتحديث المقال", }) ), }), }, } satisfies Dictionary; export default myPostContent; ``` ```tsx publishStatus("draft")({ name: "Alice" }); // المخرجات: حفظ Alice مسودة ``` ## الترحيل من `select` الخاص بـ ICU الرسائل التي تستخدم معامل `select` في ICU يتم استيرادها كعقد `select`: ```text {publishType, select, draft {draft} published {published} other {Unknown}} ``` ستصبح: ```typescript select( { draft: "draft", published: "published", fallback: "Unknown", }, "publishType" ); ``` تم إعادة تسمية الحالة `other` في ICU إلى `fallback`، وهو الاسم القياسي في Intlayer لجميع الحالات غير المتطابقة. يسجل المعامل الثاني اسم المتغير الخاص بـ ICU لكي يتم إرجاع الرسالة كجملة ICU كما هي تمامًا في وقت التصدير. > لاحظ أن الرسالة بـ `select` في ICU التي تكون حالاتها قيم جنس (`male` / `female` / `other`) ستُستورد بدلاً من ذلك كعقدة [`gender`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/dictionary/gender.md). ## الموارد الإضافية للحصول على معلومات أكثر تفصيلًا حول التكوين والاستخدام، راجع الموارد التالية: - [توثيق واجهة سطر الأوامر (CLI) الخاصة بـ Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/cli/index.md) - [توثيق Intlayer مع React](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_with_create_react_app.md) - [توثيق Intlayer مع Next.js](https://github.com/aymericzip/intlayer/blob/main/docs/docs/ar/intlayer_with_nextjs_15.md) تقدم هذه الموارد رؤى أعمق حول كيفية إعداد واستخدام Intlayer داخل بيئات وأطر عمل متنوعة.