التدويل (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
مكتبة GNU gettext للغة C++
\n\nGNU gettext هي الأداة الأكثر شيوعاً للتدويل في عالم Unix/Linux، وتعمل بشكل ممتاز مع C++ أيضاً. توفر واجهة برمجة تطبيقات بسيطة وأدوات قوية لاستخراج وإدارة الترجمات.
\n\nالتثبيت والإعداد
\n\nلاستخدام gettext في مشروع C++، يجب تثبيت الحزمة libintl وتضمين ملف الرأس:
#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
- استخراج السلاسل النصية:
xgettext --keyword=_ main.cpp -o messages.po\n - تحرير ملف .po - إضافة الترجمات يدوياً أو عبر Poedit. \n
- التجميع إلى .mo:
msgfmt messages.po -o locale/ru/LC_MESSAGES/myapp.mo\n
دعم الجمع (Pluralization)
\n\nيدعم Gettext صيغ الجمع المتعددة من خلال الدالة ngettext:
int count = 5;\nprintf(ngettext("%d file deleted", "%d files deleted", count), count);\n\nمكتبة ICU (International Components for Unicode)
\n\nICU هي مكتبة قوية من IBM، توفر مجموعة كاملة من أدوات التدويل: دعم Unicode، الفرز مع مراعاة الإعدادات المحلية، تنسيق الأرقام والتواريخ والعملات، العمل مع المناطق الزمنية وغيرها الكثير. بالنسبة لـ C++، يتم استخدام واجهة C++ API من الحزمة icu4c.
تثبيت ICU
\n\nعلى Ubuntu/Debian: sudo apt install libicu-dev
\nعلى macOS: brew install icu4c
تنسيق الأرقام والتواريخ
\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