التدويل (i18n) في C++: دليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

التدويل (i18n) في C++: من الأساسيات إلى التقنيات المتقدمة



التدويل (اختصاراً i18n من الكلمة الإنجليزية "internationalization"، حيث يمثل الرقم 18 عدد الحروف بين الحرف الأول 'i' والحرف الأخير 'n') هو عملية تصميم البرمجيات بحيث يمكن تكييفها مع لغات وخصائص إقليمية مختلفة دون تغيير الكود. في لغة C++، لهذه المهمة خصوصيتها: فاللغة لا توفر أدوات مدمجة للعمل مع الترجمات، ولكن توجد عدة مكتبات قوية تحل هذه المشكلة.



لماذا يعتبر i18n مهماً لمشاريع C++؟



تطبيقات C++ الحديثة نادراً ما تقتصر على لغة واحدة. البرامج المكتبية، الألعاب، الحلول الخادمة - كلها تتطلب دعم عدة لغات محلية. المشاكل الرئيسية التي يحلها i18n:



  • العمل مع ترميزات الأحرف - الانتقال من ASCII إلى UTF-8 وUTF-16 وترميزات متعددة البايت الأخرى؛
  • تنسيق الأرقام والتواريخ والعملات - تستخدم الدول المختلفة فواصل وتنسيقات مختلفة؛
  • ترتيب الكلمات في الجمل - اللغة العربية تتطلب تصريفات، بينما الإنجليزية تتطلب أدوات تعريف؛
  • الجمع - تختلف قواعد تكوين الجمع (في العربية هناك صيغتان للجمع، في الإنجليزية صيغتان).


المكتبات الرئيسية لـ i18n في C++



1. GNU gettext - الكلاسيكية



GNU gettext هي المكتبة الأكثر شيوعاً للتدويل في C وC++. تستخدم ملفات ترجمة منفصلة (.po/.mo) وتسمح بعزل السلاسل النصية عن الكود.



مثال أساسي على الاستخدام:



#include <iostream>#include <libintl.h>#include <locale.h>

#define _(str) gettext(str)

int main() { setlocale(LC_ALL, ""); bindtextdomain("myapp", "./locale"); textdomain("myapp");

std::cout << _("Hello, world!") << std::endl; std::cout << _("File not found") << std::endl; return 0;}


لاستخراج السلاسل النصية، تُستخدم الأداة xgettext التي تفحص الكود المصدري وتنشئ ملف .pot. ثم يعمل المترجمون على ملفات .po.



المزايا:

  • سهولة التكامل؛
  • مجتمع ضخم والعديد من الأدوات (Poedit, Lokalize)؛
  • دعم الجمع من خلال ngettext()؛
  • يعمل على أي منصة.


العيوب:

  • لا يدعم الترجمات السياقية دون حيل إضافية؛
  • يتطلب مرحلة بناء منفصلة لتوليد ملفات .mo.


2. Boost.Locale - نهج C++ الحديث



توفر مكتبة Boost.Locale واجهة أكثر حداثة وأماناً من حيث الأنواع. وهي مبنية فوق ICU (المكونات الدولية لـ Unicode) أو اللغات المحلية للنظام.



مثال على العمل مع الترجمات:



#include <boost/locale.hpp>#include <iostream>

int main() { using namespace boost::locale; generator gen; std::locale loc = gen("ru_RU.UTF-8"); std::locale::global(loc); // إنشاء مترجم translator tr; std::cout << tr("Hello, world!") << std::endl; std::cout << tr("Today is {1}", "Monday") << std::endl; // الجمع std::cout << tr("You have {1} message", "You have {1} messages", 5) << std::endl; return 0;}


المزايا:

  • دعم أصلي لـ UTF-8؛
  • تنسيق التواريخ والأرقام والعملات؛
  • دعم الترجمات السياقية؛
  • يعمل مع std::string و std::wstring.


العيوب:

  • الاعتماد على Boost (مكتبة ثقيلة)؛
  • أدوات أقل للمترجمين.


3. ICU - المعيار الصناعي



ICU (المكونات الدولية لـ Unicode) هي مكتبة ناضجة وشاملة توفر دعماً كاملاً لـ Unicode والتدويل. على عكس gettext وBoost.Locale، لا تقتصر ICU على الترجمات البسيطة، بل توفر مجموعة كاملة من الأدوات للعمل مع النصوص متعددة اللغات.

توصيات