كيف تعرض العملات العربية في التطبيقات بشكل صحيح

فريق كودينُشِر في آخرُ تحديثٍ
كيف تعرض العملات العربية في التطبيقات بشكل صحيح

خزّن المبالغ كأعداد صحيحة بأصغر وحدة للعملة، استخدم رمز ISO مثل SAR وAED، واترك التنسيق لدالة جاهزة تعرف لغة المستخدم. هذه الخطوات الثلاث تحلّ معظم مشاكل العملات العربية في التطبيقات قبل أن تظهر أصلًا. الباقي تفاصيل: موضع الرمز، المنازل العشرية، الضريبة، وعملة التسوية في بوابة الدفع. سأشرح كل واحدة منها بلغة يفهمها صاحب المشروع، لا المبرمج وحده. والأمثلة كلها من السوق الخليجي، لأن هناك تفاصيل لا تجدها في أي دليل أجنبي.

كيف أعرض الأسعار بالعملات العربية داخل تطبيقي؟

اختر رمز ISO للعملة (SAR، AED، KWD)، وخزّن المبلغ كعدد صحيح بأصغر وحدة (هللة أو فلس)، ثم نسّق العرض بدالة Intl.NumberFormat مع لغة المستخدم. بعدها اضبط موضع الرمز واتجاه النص، واختبر مبلغًا كبيرًا بثلاث منازل عشرية. لا تخزّن رمز العملة نصًا داخل حقل السعر أبدًا.

لنأخذ مثالًا ملموسًا. متجر إلكتروني في الرياض يعرض سعر 1250.50 ريالًا، والفرق بين الصيغ يأتي من سطر واحد:

  • ar-SA مع currency: 'SAR' تُنتج «١٢٥٠٫٥٠ ر.س.‏» بأرقام هندية.
  • ar-SA-u-nu-latn تُنتج «1,250.50 ر.س.‏» بأرقام لاتينية.
  • en-AE مع currency: 'AED' تُنتج «AED 1,250.50».

الفرق بين الثلاثة ليس تقنيًا بحتًا. إنه تجاري. جرّب سؤال عشرة من عملائك في جدة أو الدمام عن الصيغة التي يقرؤونها أسرع، وستفاجأ بالإجماع تقريبًا. الغالبية في الخليج تفضّل الأرقام اللاتينية مع النص العربي، وهذا ما أوصي به افتراضيًا، مع ترك خيار التبديل في الإعدادات لمن يريد. تناولت هذه المسألة بتفصيل أوسع في مقال الأرقام العربية والهندية.

أهم قاعدة؟ لا تكتب دالة تنسيق خاصة بك. المكتبات القياسية تعرف مواضع الفواصل وعدد المنازل لكل عملة في العالم، وأنت لا تريد صيانة هذا المنطق يدويًا كلما دخلت سوقًا جديدًا. رأيت مشاريع بنت دالة «بسيطة» في أسبوع، ثم قضت ثلاثة أشهر تصلحها.

رموز العملات الخليجية ومنازلها العشرية

هنا تكمن أشهر ثغرة يقع فيها من يبني تطبيقًا لأول مرة. ليست كل العملات من منزلتين عشريتين. الدينار الكويتي والبحريني والريال العماني تُقسَّم إلى ألف وحدة صغرى، أي ثلاث منازل عشرية بحسب معيار ISO 4217.

  • SAR — الريال السعودي، 100 هللة، منزلتان، الرمز الدارج ر.س
  • AED — الدرهم الإماراتي، 100 فلس، منزلتان، د.إ
  • QAR — الريال القطري، 100 درهم، منزلتان، ر.ق
  • KWD — الدينار الكويتي، 1000 فلس، ثلاث منازل، د.ك
  • BHD — الدينار البحريني، 1000 فلس، ثلاث منازل، د.ب
  • OMR — الريال العماني، 1000 بيسة، ثلاث منازل، ر.ع

ماذا يحدث لو تجاهلت هذا؟ منتج بسعر 12.375 دينارًا كويتيًا سيُعرض 12.38، فتخسر أو تكسب فلسًا في كل عملية. فلس واحد لا يهم، صحيح. لكن بعد عشرة آلاف عملية تتحول تسوية الحسابات مع البنك إلى كابوس، وقد تابعت فريقًا أمضى أسبوعًا كاملًا يطارد فرقًا لم يتجاوز مئتي دينار سببه هذا التقريب وحده.

الرمز نفسه قصة ثانية. السعودية طرحت رمزًا رسميًا جديدًا للريال، وهو محرف رسومي خاص لا حروف عربية. إن استخدمته، تأكد أن الخط المستعمل في التطبيق يدعمه، وإلا ظهر لعملائك مربع فارغ صغير في مكان السعر. الحل الآمن اليوم: اعرض «ر.س» نصًا، أو اشتمل خطًا يحتوي المحرف الجديد صراحة واختبره على جهاز أندرويد قديم قبل أي شيء.

خزّن المبالغ بالفلوس والهللات لا بالكسور

القاعدة الذهبية: لا تخزّن السعر رقمًا عشريًا (float). خزّنه عددًا صحيحًا بأصغر وحدة. سعر 99.90 ريالًا يُخزَّن 9990 هللة. وسعر 12.375 دينارًا كويتيًا يُخزَّن 12375 فلسًا.

لماذا كل هذا التشديد؟ لأن الحاسوب لا يمثّل الكسور العشرية تمثيلًا دقيقًا. اجمع 0.1 مع 0.2 في أي لغة برمجة تقريبًا وستحصل على 0.30000000000000004. تبدو طرفة أكاديمية حتى تظهر في فاتورة عميل من أربعين بندًا، فيتصل غاضبًا لأن المجموع لا يطابق حصيلة الأصناف بهللة واحدة. وهو محق.

والمصيدة التي لا يخبرك بها أحد: كثير من الأدوات تفترض أن «أصغر وحدة = المبلغ × 100». صحيح للريال والدرهم، وخاطئ تمامًا للدينار الكويتي. اضرب في 1000 هناك. إن كنت تتعامل مع بوابة دفع، اقرأ توثيقها بنفسك لتعرف هل تتوقع الفلوس أم الدينار العشري؛ أكثر من مشروع خليجي أخطأ بمعامل عشرة وأرسل مبلغًا يساوي عُشر القيمة المطلوبة، واكتشف ذلك بعد أسبوع من المبيعات.

أضف كذلك حقلين منفصلين في قاعدة البيانات لكل معاملة:

  • amount_minor — المبلغ كعدد صحيح
  • currency — رمز ISO من ثلاثة أحرف

مبلغ بلا عملة بيانات ناقصة. رقم 5000 قد يكون خمسين ريالًا أو خمسة دنانير، والفرق بينهما كبير. الفصل بين الحقلين يوفّر عليك مراجعات محاسبية مؤلمة بعد سنة، ويجعل التقارير المالية قابلة للقراءة فعلًا.

موضع الرمز واتجاه النص: تفاصيل RTL التي تُنسى

في الواجهة العربية يوضع رمز العملة بعد الرقم عادة: «١٢٥٠ ر.س». وفي الإنجليزية قبله: «SAR 1,250». تفصيلة صغيرة؟ ربما. لكنها تفرق بين تطبيق يبدو محليًا وآخر يبدو مترجمًا على عجل.

المشكلة الأعقد هي المزج. عندما تضع رقمًا لاتينيًا ورمزًا عربيًا في سطر واحد داخل تصميم من اليمين إلى اليسار، يتدخل خوارزم الاتجاه في المتصفح وقد يقلب الترتيب. النتيجة سعر يظهر «ر.س 1,250-» بإشارة السالب في مكان لا معنى له. الحل المعتاد إدراج محارف التوجيه المناسبة أو عزل المبلغ داخل عنصر له اتجاه محدد صراحة.

ثم تأتي الخصومات. سعر مشطوب بجانب سعر جديد يبدو بسيطًا حتى تضيف نسبة «-25%» في تصميم عربي؛ علامة النسبة والسالب تقفزان إلى الطرف غير المتوقع إن لم تعزل الجزء العددي. اختبر هذه الحالة تحديدًا قبل الإطلاق، وعلى شاشة هاتف صغير لا على شاشة حاسبك الواسعة.

نصيحة من تجربة مباشرة: احجز مساحة أوسع بنحو 20% لحقل السعر في التصميم العربي. مبلغ مثل «1,250,000.000 د.ك» أطول بكثير من نظيره الإنجليزي المختصر، وسيقطع البطاقة أو يدفع زر الشراء خارج الشاشة. تفاصيل الاتجاه شرحتها بتوسّع في دليل دعم RTL في التطبيقات، وهي قراءة مكمّلة لهذا القسم مباشرة.

من أين أجلب أسعار التحويل وكم مرة أحدّثها؟

استخدم مزوّدًا واحدًا موثوقًا لأسعار الصرف أو بيانات البنك المركزي، اجلب الأسعار في الخادم لا داخل التطبيق، واحفظها مؤقتًا بين ساعة و24 ساعة. والأهم: خزّن سعر الصرف المستخدم مع كل عملية شراء، لأن الاسترجاع بعد شهر يحتاج السعر القديم لا سعر اليوم.

الخبر الجيد لمن يستهدف الخليج أن معظم العملات مربوطة بالدولار بسعر ثابت لا يتحرك يوميًا. الريال السعودي مربوط عند 3.75 للدولار منذ 1986، والدرهم الإماراتي عند 3.6725، والريال القطري عند 3.64، والريال العماني عند 0.3845، والدينار البحريني عند 0.376. الدينار الكويتي وحده مربوط بسلة عملات، فيتحرك قليلًا بين فترة وأخرى.

ماذا يعني ذلك عمليًا؟ يمكنك تثبيت أسعار العرض للعملات المربوطة بدل استدعاء واجهة برمجية كل دقيقة، وتوفير تكلفة الاشتراك أصلًا. أما الدينار الكويتي والعملات غير الخليجية كالجنيه المصري والدينار التونسي فتحتاج تحديثًا دوريًا فعليًا.

وتجنّب خطأً شائعًا جدًا: لا تحوّل الأسعار آليًا وتعرضها كما خرجت. تحويل 49 ريالًا يعطي 47.98 درهمًا، ورقم كهذا يبدو غريبًا في أي متجر محترم. اجعل التحويل نقطة بداية فقط، ثم قرّب السعر إلى شكل تجاري مقبول — 49 درهمًا أو 45 درهمًا — واحفظه سعرًا مستقلًا لكل سوق. هكذا يفعل كل متجر خليجي ناجح تراه اليوم، بلا استثناء تقريبًا.

الضريبة والفاتورة: ما يجب أن يظهر بجانب السعر

السعر لا يسافر وحده. نسب ضريبة القيمة المضافة تختلف بين دول المجلس: 15% في السعودية منذ يوليو 2020، 5% في الإمارات وعُمان، 10% في البحرين منذ يناير 2022، بينما لم تطبّق قطر والكويت ضريبة قيمة مضافة حتى الآن. تطبيق واحد يخدم الخليج كله يحتاج إذن منطق ضريبة مرتبطًا بالبلد، لا رقمًا مكتوبًا في الكود ينساه الجميع بعد ستة أشهر.

في السعودية تحديدًا، هيئة الزكاة والضريبة والدخل تطالب بعرض السعر شاملًا الضريبة للمستهلك، وبفاتورة إلكترونية متوافقة مع منظومة «فاتورة» بما فيها رمز الاستجابة السريعة. ليس تفصيلًا جماليًا؛ بل شرط لا يمكن تجاوزه إن كنت تبيع للأفراد.

ما أنصح به في الواجهة:

  • اعرض السعر النهائي بخط كبير شاملًا الضريبة.
  • أسفله بخط أصغر: «شامل ضريبة القيمة المضافة 15%».
  • في سلة الشراء، فصّل المبلغ قبل الضريبة والضريبة والإجمالي في ثلاثة سطور واضحة.

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

بوابات الدفع وعملة التسوية

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

في السعودية تعتمد شبكة «مدى» على الريال، ومعها محافظ مثل STC Pay وApple Pay. الإمارات تتيح خيارات أوسع بالدرهم. البوابات المنتشرة إقليميًا — مثل Moyasar وTap وPayTabs وHyperPay — تدعم عدة عملات لكن بشروط تسوية مختلفة، وبعضها يقتطع عمولة تحويل إضافية إذا اختلفت عملة العرض عن عملة الحساب البنكي.

السؤال الذي يجب أن تطرحه على مندوب البوابة قبل التوقيع: هل أستطيع خصم مبلغ بالدينار الكويتي وتسويته بالريال السعودي؟ وبكم بالضبط؟ الإجابة قد تغيّر خطة التوسع كلها، وقد توفّر عليك آلاف الريالات سنويًا.

مصيدة أخرى مهمة: متاجر التطبيقات. آبل وجوجل تفرضان جدول أسعار وعملات لكل سوق على المشتريات داخل التطبيق، ولا يمكنك تمرير الدفع خارجهما للمحتوى الرقمي. إن كان تطبيقك يبيع اشتراكات، استخدم أسعارهما المحلية بدل تحويل يدوي لن يقبلاه في المراجعة. وللمقارنة بين مزوّدي الدفع وشروطهم، راجع مقارنة بوابات الدفع العربية قبل أن تختار.

قائمة تحقق قبل الإطلاق وكيف تبنيها بدون كود

قبل نشر التطبيق، امشِ على هذه القائمة بنفسك في نصف ساعة:

  • اختبر مبلغًا بالدينار الكويتي بثلاث منازل، وتأكد من عدم التقريب.
  • اختبر مبلغًا كبيرًا مثل 1,250,000 وتأكد أنه لا يقطع البطاقة.
  • اختبر سعرًا بخصم ونسبة مئوية في الواجهة العربية.
  • اختبر مبلغًا صفريًا ومبلغًا مستردًا (سالبًا).
  • بدّل لغة الجهاز من العربية إلى الإنجليزية وتأكد أن الرمز انتقل لموضعه الصحيح.
  • تحقق أن الفاتورة تعرض نسبة الضريبة الصحيحة لكل بلد تبيع فيه.

هل تحتاج مبرمجًا لكل هذا؟ لم يعد ضروريًا. منصات البناء بالذكاء الاصطناعي صارت تعرف تفاصيل السوق الخليجي، فتطلب منها «أضف عرض السعر بالريال السعودي والدرهم والدينار الكويتي مع ضريبة قيمة مضافة متغيرة بحسب البلد» وتحصل على نتيجة قابلة للتعديل فورًا. جرّبت هذا مع متجر صغير في الكويت، وأخذ ضبط العملات دقائق لا أيامًا.

إن كنت تبدأ من الصفر، اقرأ كيف تبني تطبيقك مع codeyy ثم أضف طبقة العملات لاحقًا. وانتبه لنقطة أخيرة: أي تغيير في منطق الأسعار يستدعي اختبارًا كاملًا للسلة والدفع معًا. الأسعار ليست نصًا على شاشة، بل عقد مالي مع عميلك.

الخلاصة عملية جدًا: أعداد صحيحة بأصغر وحدة، رموز ISO، دوال تنسيق قياسية، وأسعار محلية مقرّبة يدويًا لكل سوق بدل التحويل الآلي. اضبط هذه الأربعة وستختفي معظم الشكاوى قبل أن تصل إليك أصلًا. ابدأ بالعملة الأهم لعملائك، أطلق، ثم أضف البقية تدريجيًا. التوسع بعملة واحدة في المرة أسهل بكثير من محاولة دعم ثماني عملات في الإطلاق الأول، وأرخص كذلك.

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

كيف أدعم الدينار الكويتي بثلاث منازل عشرية مع الريال السعودي في تطبيق واحد؟

لا تكتب عدد المنازل يدويًا. خزّن المبلغ عددًا صحيحًا بأصغر وحدة (×1000 للدينار الكويتي و×100 للريال)، واحفظ رمز العملة في حقل منفصل، ثم اترك دالة التنسيق القياسية تقرأ عدد المنازل من معيار ISO 4217. هكذا يعمل التطبيق نفسه في الكويت والسعودية دون شرطيات متفرعة تتكاثر مع كل سوق جديد.

هل أعرض السعر بعملة كل بلد أم بالدولار فقط؟

اعرضه بالعملة المحلية دائمًا. المشتري الخليجي يقرر أسرع حين يرى ريالًا أو درهمًا يعرف قيمته، والعرض بالدولار يضيف حاجزًا ذهنيًا ويعرّض العميل لعمولة تحويل من بنكه. حدّد سعرًا مستقلًا ومقرّبًا لكل سوق، لا رقمًا محوّلًا آليًا ينتهي بكسور غريبة تقلّل الثقة.

ما الفرق بين رمز «ر.س» والرمز الرسمي الجديد للريال السعودي؟

الرمز الجديد محرف رسومي خاص، وليس حروفًا عربية. يعني ذلك أنه لن يظهر إلا إذا كان الخط المستخدم في تطبيقك يدعمه، وإلا رأى العميل مربعًا فارغًا مكان العملة. الأكثر أمانًا حاليًا: استخدم «ر.س» نصًا، أو اشتمل خطًا يحتوي المحرف واختبره على أندرويد وiOS قبل النشر.

كيف أتعامل مع الاسترجاع إذا تغيّر سعر الصرف بعد الشراء؟

احفظ سعر الصرف المستخدم داخل سجل العملية نفسها، مع المبلغ الأصلي وعملته. عند الاسترجاع، استخدم السعر المحفوظ لا سعر اليوم، وأعد المبلغ بالعملة التي دفع بها العميل فعليًا. هذا يمنع فروقًا محاسبية متراكمة، ويجنّبك نقاشات طويلة مع البنك أو مع العميل حول قيمة المبلغ المسترد.

اقرأْ أيضًا