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

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

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

ابدأ الدورة

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

\n\n

التدويل (اختصاراً i18n - من "internationalization"، حيث 18 هو عدد الحروف بين الحرف الأول والأخير) هو عملية تصميم البرمجيات بحيث يمكن تكييفها بسهولة مع لغات ومناطق مختلفة دون إجراء تغييرات على الكود المصدري. بالنسبة للغة C++، التي تُستخدم تقليدياً في التطبيقات عالية الأداء ومتعددة المنصات، فإن التنفيذ الصحيح لـ i18n أمر بالغ الأهمية. في هذه المقالة، سنستعرض الأساليب الرئيسية والمكتبات والأمثلة العملية لتوطين تطبيقات C++.

\n\n

المفاهيم الأساسية لـ i18n

\n\n

قبل الانتقال إلى الأدوات، من المهم فهم المفاهيم الأساسية:

\n\n
    \n
  • التوطين (l10n) - تكييف النص المترجم، وتنسيقات التواريخ والأرقام والعملات لمنطقة معينة.
  • \n
  • الإعدادات المحلية (Locale) - مجموعة من القواعد (اللغة، المنطقة، الترميز) التي تحدد تنسيق البيانات.
  • \n
  • Unicode و UTF-8 - معيار ترميز الأحرف، وهو إلزامي للتدويل الحديث.
  • \n
  • الجمع (Pluralization) - العرض الصحيح لأشكال الجمع (مثال: "ملف واحد"، "ملفان"، "10 ملفات").
  • \n
\n\n

مكتبة GNU gettext للغة C++

\n\n

GNU gettext هي الأداة الأكثر شيوعاً للتدويل في عالم Unix/Linux، وتعمل بشكل ممتاز مع C++ أيضاً. توفر واجهة برمجة تطبيقات بسيطة وأدوات قوية لاستخراج وإدارة الترجمات.

\n\n

التثبيت والإعداد

\n\n

لاستخدام gettext في مشروع C++، يجب تثبيت الحزمة libintl وتضمين ملف الرأس:

\n\n
#include <libintl.h>\n#include <locale.h>\n\n#define _(STRING) gettext(STRING)
\n\n

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

\n\n
#include <iostream>\n#include <libintl.h>\n#include <locale.h>\n\nint main() {\n    setlocale(LC_ALL, "");\n    bindtextdomain("myapp", "./locale");\n    textdomain("myapp");\n\n    std::cout << _("Hello, world!") << std::endl;\n    std::cout << _("File not found") << std::endl;\n    return 0;\n}
\n\n

إنشاء ملفات الترجمة

\n\n

تتضمن العملية ثلاث خطوات:

\n\n
    \n
  1. استخراج السلاسل النصية: xgettext --keyword=_ main.cpp -o messages.po
  2. \n
  3. تحرير ملف .po - إضافة الترجمات يدوياً أو عبر Poedit.
  4. \n
  5. التجميع إلى .mo: msgfmt messages.po -o locale/ru/LC_MESSAGES/myapp.mo
  6. \n
\n\n

دعم الجمع (Pluralization)

\n\n

يدعم Gettext صيغ الجمع المتعددة من خلال الدالة ngettext:

\n\n
int count = 5;\nprintf(ngettext("%d file deleted", "%d files deleted", count), count);
\n\n

مكتبة ICU (International Components for Unicode)

\n\n

ICU هي مكتبة قوية من IBM، توفر مجموعة كاملة من أدوات التدويل: دعم Unicode، الفرز مع مراعاة الإعدادات المحلية، تنسيق الأرقام والتواريخ والعملات، العمل مع المناطق الزمنية وغيرها الكثير. بالنسبة لـ C++، يتم استخدام واجهة C++ API من الحزمة icu4c.

\n\n

تثبيت ICU

\n\n

على Ubuntu/Debian: sudo apt install libicu-dev
\nعلى macOS: brew install icu4c

\n\n

تنسيق الأرقام والتواريخ

\n\n
#include <unicode/numfmt.h>\n#include <unicode/datefmt.h>\n#include <iostream>\n\nint main() {\n    // تنسيق الرقم للإعدادات المحلية ru_RU\n    icu::UnicodeString pattern;\n    icu::NumberFormat* fmt = icu::NumberFormat::createInstance(\n        icu::Locale("ru", "RU"), status);\n    icu::UnicodeString result;\n    fmt->format(1234567.89, result);\n    \n    std::string utf8;\n    result.toUTF8String(utf8);\n    std::cout << "الرقم: " << utf8 << std::endl; // 1                    

توصيات