<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Lemon Technologies</title>
    <description>The latest articles on DEV Community by Lemon Technologies (@lemon_technologies).</description>
    <link>https://dev.to/lemon_technologies</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4166829%2Fb5aff262-8307-414a-bb15-b0018b0066ed.png</url>
      <title>DEV Community: Lemon Technologies</title>
      <link>https://dev.to/lemon_technologies</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lemon_technologies"/>
    <language>en</language>
    <item>
      <title>⁧دعم العربية (RTL) في Next.js 16 — ٦ أخطاء شائعة وكيف تتجنبها⁩</title>
      <dc:creator>Lemon Technologies</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:21:09 +0000</pubDate>
      <link>https://dev.to/lemon_technologies/dm-lrby-rtl-fy-nextjs-16-6-kht-shy-wkyf-ttjnbh-1flh</link>
      <guid>https://dev.to/lemon_technologies/dm-lrby-rtl-fy-nextjs-16-6-kht-shy-wkyf-ttjnbh-1flh</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                                        ،السلام عليكم 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;⁧معظم تطبيقات SaaS تُبنى بالإنجليزية أولًا، ثم تُضاف العربية في النهاية… فينهار كل شيء: الهوامش في الجهة الخاطئة، الأيقونات معكوسة، التواريخ غير مفهومة.⁩&lt;/p&gt;

&lt;p&gt;⁧أثناء بناء قالب SaaS بـ Next.js 16 الداعم ل عشر ١٠ لغات منها العربية، واجهت هذه المشاكل واحدة تلو الأخرى. إليك الحلول التي اعتمدتها.⁩&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/BnKl1ft4p2Q" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;
&lt;h2&gt;
  
  
  ⁧1. ضبط &lt;code&gt;dir&lt;/code&gt; و &lt;code&gt;lang&lt;/code&gt; على مستوى &lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;⁩
&lt;/h2&gt;

&lt;p&gt;⁧لا تضع &lt;code&gt;dir="rtl"&lt;/code&gt; على عناصر متفرقة. اضبطه مرة واحدة في الـ layout حسب اللغة:⁩&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// app/[locale]/layout.tsx&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RTL_LOCALES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;he&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fa&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ur&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;LocaleLayout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;children&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ReactNode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;RTL_LOCALES&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;has&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rtl&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ltr&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt; &lt;span class="na"&gt;lang&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;dir&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;body&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;⁧خاصية &lt;code&gt;lang&lt;/code&gt; مهمة أيضًا: قارئات الشاشة تعتمد عليها لنطق النص بشكل صحيح.⁩&lt;/p&gt;
&lt;h2&gt;
  
  
  ⁧2. توقف عن استخدام &lt;code&gt;left&lt;/code&gt; و &lt;code&gt;right&lt;/code&gt;⁩
&lt;/h2&gt;

&lt;p&gt;⁧الخطأ الأكثر شيوعًا هو &lt;code&gt;ml-4&lt;/code&gt; أو &lt;code&gt;pr-2&lt;/code&gt; أو &lt;code&gt;left-0&lt;/code&gt;. استخدم الخصائص المنطقية (logical properties) التي تنقلب تلقائيًا:⁩&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;⁧استخدم⁩&lt;/th&gt;
&lt;th&gt;⁧بدلًا من⁩&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ms-4&lt;/code&gt; / &lt;code&gt;me-4&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;ml-4&lt;/code&gt; / &lt;code&gt;mr-4&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;ps-2&lt;/code&gt; / &lt;code&gt;pe-2&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;pl-2&lt;/code&gt; / &lt;code&gt;pr-2&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;start-0&lt;/code&gt; / &lt;code&gt;end-0&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;left-0&lt;/code&gt; / &lt;code&gt;right-0&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;text-start&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;text-left&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rounded-s-lg&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;rounded-l-lg&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;border-s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;border-l&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;⁧وفي CSS العادي: &lt;code&gt;margin-inline-start&lt;/code&gt; بدلًا من &lt;code&gt;margin-left&lt;/code&gt;.⁩&lt;/p&gt;
&lt;h2&gt;
  
  
  ⁧3. الأيقونات الاتجاهية يجب أن تنعكس… وليس كلها⁩
&lt;/h2&gt;

&lt;p&gt;⁧أسهم "التالي" و"السابق" يجب أن تنعكس. أما أيقونات مثل البحث أو الإعدادات أو علامة ✓ فلا:⁩&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ChevronRight&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"rtl:-scale-x-100"&lt;/span&gt; &lt;span class="na"&gt;aria-hidden&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"true"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ⁧4. الأرقام والتواريخ: استخدم &lt;code&gt;Intl&lt;/code&gt;⁩
&lt;/h2&gt;

&lt;p&gt;⁧لا تكتب التنسيق يدويًا. واجعل نظام الأرقام قرارًا واعيًا: في تونس والجزائر تُستخدم الأرقام اللاتينية (123)، وفي المشرق ومصر وفلسطين غالبًا الأرقام الهندية (١٢٣).⁩&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;NumberFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ar-TN&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;currency&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;29.99&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Intl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DateTimeFormat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ar&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;dateStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;long&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;numberingSystem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;latn&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ⁧5. خط عربي حقيقي⁩
&lt;/h2&gt;

&lt;p&gt;⁧الخطوط اللاتينية لا تحتوي غالبًا على حروف عربية، فيستخدم المتصفح خطًا احتياطيًا رديئًا. حمّل خطًا عربيًا عبر &lt;code&gt;next/font&lt;/code&gt;:⁩&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;IBM_Plex_Sans_Arabic&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;next/font/google&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;arabic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;IBM_Plex_Sans_Arabic&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;subsets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;arabic&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;400&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;600&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;⁧ونصيحة: زد &lt;code&gt;line-height&lt;/code&gt; قليلًا للعربية، فالحروف تحتاج مساحة أكبر عموديًا.⁩&lt;/p&gt;
&lt;h2&gt;
  
  
  ⁧6. النصوص المختلطة (عربي + إنجليزي)⁩
&lt;/h2&gt;

&lt;p&gt;⁧أسماء المستخدمين، البريد الإلكتروني، أسماء المنتجات… قد تظهر بترتيب خاطئ داخل جملة عربية. الحل: &lt;code&gt;&amp;lt;bdi&amp;gt;&lt;/code&gt; أو &lt;code&gt;dir="auto"&lt;/code&gt; لأي محتوى يُدخله المستخدم:⁩&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;مرحبًا &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;bdi&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;bdi&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;، لديك 3 إشعارات&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"auto"&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"title"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  ⁧اختبار سريع⁩
&lt;/h2&gt;

&lt;p&gt;⁧قبل كل إصدار: بدّل اللغة إلى العربية وتصفّح التطبيق كاملًا. أي عنصر "يلتصق" بالجهة الخاطئة هو غالبًا &lt;code&gt;left&lt;/code&gt; أو &lt;code&gt;right&lt;/code&gt; منسي.⁩&lt;/p&gt;


&lt;h2&gt;
  
  
  ⁧الخلاصة⁩
&lt;/h2&gt;

&lt;p&gt;⁧دعم RTL ليس ترجمة فقط، بل قرار تصميمي يُتخذ من اليوم الأول. كلما تأخرت، زادت الكلفة.⁩&lt;/p&gt;
&lt;h2&gt;
  
  
  ⁧عن المشروع: SaaS Starter⁩
&lt;/h2&gt;

&lt;p&gt;⁧كل ما ذكرته في هذا المقال مطبَّق في &lt;strong&gt;SaaS Starter&lt;/strong&gt;، القالب الذي نطوّره في &lt;strong&gt;Lemon Technologies&lt;/strong&gt;. فكرته بسيطة: كل مشروع SaaS يبدأ بنفس الأسابيع من العمل المتكرر قبل كتابة أول ميزة حقيقية، فلماذا نعيد بناءه في كل مرة؟ SaaS Starter يمنحك هذا الأساس جاهزًا ومختبرًا، لتركّز على منتجك أنت.⁩&lt;/p&gt;

&lt;p&gt;⁧يتضمن القالب:⁩&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⁧&lt;strong&gt;Next.js 16&lt;/strong&gt; مع TypeScript و PostgreSQL و Prisma⁩&lt;/li&gt;
&lt;li&gt;⁧&lt;strong&gt;تسجيل الدخول والمصادقة&lt;/strong&gt; عبر NextAuth v5⁩&lt;/li&gt;
&lt;li&gt;⁧&lt;strong&gt;الدفع والاشتراكات&lt;/strong&gt; عبر Lemon Squeezy، مع إدارة ضريبة القيمة المضافة الأوروبية تلقائيًا⁩&lt;/li&gt;
&lt;li&gt;⁧&lt;strong&gt;الفرق والأدوار والدعوات&lt;/strong&gt; لتطبيقات B2B⁩&lt;/li&gt;
&lt;li&gt;⁧&lt;strong&gt;تكامل جاهز مع الذكاء الاصطناعي&lt;/strong&gt; عبر Anthropic API⁩&lt;/li&gt;
&lt;li&gt;⁧&lt;strong&gt;10 لغات&lt;/strong&gt;: العربية، الأردية، الأويغورية، التركية العثمانية، التركية، الإنجليزية، الفرنسية، الألمانية، الإسبانية، الهولندية، مع دعم كامل لـ RTL منذ البداية&lt;/li&gt;
&lt;li&gt;⁧&lt;strong&gt;إمكانية الوصول&lt;/strong&gt; وفق معيار WCAG 2.1 AA⁩&lt;/li&gt;
&lt;li&gt;⁧&lt;strong&gt;Storybook&lt;/strong&gt; لتوثيق المكوّنات، و &lt;strong&gt;GitHub Actions&lt;/strong&gt; للـ CI/CD⁩
⁩&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⁧نؤمن في Lemon Technologies بأن الويب يجب أن يعمل بكل اللغات وفي كل الاتجاهات. &lt;strong&gt;Every language. Every direction.&lt;/strong&gt;⁩&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://www.bedrockkit.com/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fsaas-starter.pages.dev%2Fassets%2Fog.png" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://www.bedrockkit.com/" rel="noopener noreferrer" class="c-link"&gt;
            SaaS Starter — Next.js 16 SaaS Boilerplate with Auth, Billing &amp;amp; Teams
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            A production-ready Next.js 16 SaaS boilerplate: eight OAuth providers, organization-scoped billing with Lemon Squeezy and Stripe, teams with seat limits, a Claude AI playground, and ten languages including right-to-left. One-time purchase, full source code.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.bedrockkit.com%2Fassets%2Ffavicon.svg" width="32" height="32"&gt;
          bedrockkit.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
⁧القالب متاح بترخيصين: &lt;strong&gt;فردي&lt;/strong&gt; للمطوّرين المستقلين، و&lt;strong&gt;تجاري&lt;/strong&gt; للشركات (حتى 10 مطوّرين).⁩&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lemon-technologies.lemonsqueezy.com/checkout/buy/763d94c7-daa7-425f-835d-2ed72f65667b?utm_source=devto" rel="noopener noreferrer"&gt;⁧اكتشف SaaS Starter ←⁩&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⁧هل واجهت مشاكل أخرى مع RTL في مشاريعك؟ شاركها في التعليقات.⁩&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>react</category>
      <category>arabic</category>
      <category>i18n</category>
    </item>
  </channel>
</rss>
