gettext

في مجال الحوسبة ، يُعدّ gettext نظامًا للتدويل والترجمة (i18n وl10n) يُستخدم عادةً لكتابة برامج متعددة اللغات على أنظمة تشغيل شبيهة بنظام يونكس . من أهم مزايا gettext فصله بين البرمجة والترجمة. [ 4 ] يُعدّ GNU gettext التطبيق الأكثر شيوعًا لـ gettext ، [ 5 ] والذي أصدره مشروع جنو عام 1995. مكتبة وقت التشغيل هي libintl . يوفر gettext خيار استخدام سلاسل نصية مختلفة لأي عدد من صيغ الجمع للأسماء، لكن هذه الميزة لا تدعم الجنس النحوي . امتدادات أسماء الملفات الرئيسية التي يستخدمها هذا النظام هي .POT (قالب الكائن المحمول)، و .PO (الكائن المحمول)، و.MO (كائن الآلة). [ 6 ]

تاريخ

في البداية، لم يوفر معيار POSIX أي وسيلة لترجمة الرسائل. طُرح اقتراحان في أواخر ثمانينيات القرن العشرين، وهما gettext من Uniforum عام 1988 وcatgets من X/Open عام 1989 (XPG-3 § 5). نفذت شركة Sun Microsystems أول gettext عام 1993. [ 1 ] لم يتفق مطورو Unix وPOSIX فعليًا على نوع الواجهة التي يجب استخدامها (الخيار الآخر هو catgets من X/Open)، لذا قامت العديد من مكتبات C ، بما في ذلك glibc ، بتنفيذ كليهما. [ 7 ] اعتبارًا من أغسطس 2019 كان إدراج دالة gettext ضمن معيار POSIX لا يزال محل نقاش في مجموعة أوستن ، على الرغم من أن منافستها القديمة قد توقفت عن الاستخدام. وشملت المخاوف التي أثيرت اعتمادها على إعدادات اللغة المحددة مسبقًا ( متغير عام عرضة لمشاكل تعدد الخيوط) ودعمها لامتدادات لغة C الأحدث التي تتضمن سلاسل نصية عريضة. [ 8 ]

قرر مشروع جنو أن أسلوب الرسالة كمفتاح في برنامج gettext أبسط وأكثر سهولة في الاستخدام. (تتطلب معظم الأنظمة الأخرى، بما في ذلك catgets، من المطور ابتكار أسماء "مفاتيح" لكل سلسلة نصية). [ 9 ] أصدروا برنامج GNU gettext، وهو تطبيق برمجي مجاني للنظام، في عام 1995. [ 2 ] ومنذ ذلك الحين، تم نقل برنامج gettext، سواءً كان من مشروع جنو أم لا، إلى العديد من لغات البرمجة. [ 10 ] حتى أن بساطة لغة po ودعمها الواسع النطاق من قبل المحررات أدى إلى اعتمادها في سياقات غير برمجية، مثل المستندات النصية أو كوسيط بين تنسيقات الترجمة الأخرى، مع ظهور محولات مثل po4a (po لأي شيء) وTranslate Toolkit لتوفير هذا الجسر. [ 11 ] [ 12 ]

عملية

برمجة

سير عمل نموذجي لـ gettext. تُظهر نسخة de.po على اليسار "تجديدًا" للترجمات عبر msgmerge.

الواجهة الأساسية لدالة gettext هي gettext(const char*)الدالة التي تقبل سلسلة نصية يراها المستخدم بلغتها الأصلية، وهي عادةً الإنجليزية. ولتوفير وقت الكتابة وتقليل فوضى الكود، يُشار إلى هذه الدالة عادةً بالاسم المستعار_ التالي : [ 13 ]

printf ( gettext ( "اسمي هو %s. \n " ), my_name ); printf ( _ ( "اسمي هو %s. \n " ), my_name ); // نفس الشيء، ولكن أقصر

gettext()ثم يستخدم السلاسل النصية المُقدمة كمفاتيح للبحث عن الترجمات، ويعيد السلسلة الأصلية في حال عدم توفر ترجمة. وهذا يختلف عن أنظمة POSIXcatgets() [ 14 ] وAmigaOS [ 15 ] أو Microsoft Windows، حيث يُستخدم مُعرّف برمجي (غالبًا ما يكون عددًا صحيحًا). ولمعالجة الحالات التي قد يحمل فيها النص الأصلي نفسه معاني مختلفة، تحتوي دالة gettext على دوال تقبل سلسلة نصية إضافية تُسمى " السياق".GetString()LoadString()cgettext()

xgettextيُشغَّل البرنامج على المصادر لإنتاج .potملف (قالب كائن محمول)، يحتوي على قائمة بجميع السلاسل النصية القابلة للترجمة المستخرجة من المصادر. ///تُستخدم التعليقات التي تبدأ بـ `-` لإعطاء المترجمين تلميحات، مع إمكانية ضبط بادئات أخرى لتضييق نطاق البحث. إحدى هذه البادئات الشائعة هي `-` TRANSLATORS:.

على سبيل المثال، قد يبدو ملف الإدخال الذي يحتوي على تعليق كما يلي:

/// المترجمون: %s يحتوي على اسم المستخدم كما هو محدد في الإعدادات printf ( _ ( "اسمي هو %s. \n " ), my_name );

xgettextيتم تشغيله باستخدام الأمر التالي:

xgettext -c /

يبدو ملف .pot الناتج على النحو التالي مع التعليق (لاحظ أن xgettext يتعرف على السلسلة كسلسلة تنسيق printf بلغة C ):

#. المترجمون: %s يحتوي على اسم المستخدم كما هو محدد في الإعدادات #، بتنسيق C #: src/name.c:36 msgid "اسمي هو %s.\n" msgstr ""

في لغة برمجة POSIX shell script ، توفر مكتبة gettext gettext.shالعديد من الوظائف التي توفرها في لغات برمجة مشابهة. [ 16 ] كما تحتوي GNU bash على بنية مبسطة $"msgid"لوظيفة gettext البسيطة، على الرغم من أنها تعتمد على مكتبة C لتوفير هذه gettext()الوظيفة. [ 17 ]

الترجمة

يستخلص المترجم .poملفًا (كائنًا محمولًا) من القالب باستخدام msginitالبرنامج، ثم يُكمل الترجمات. [ 18 ]msginit يُهيئ الترجمات، فعلى سبيل المثال، بالنسبة لترجمة إلى اللغة الفرنسية، سيكون الأمر المطلوب تشغيله كما يلي: [ 6 ]

msginit --locale=fr --input=name.pot

سيؤدي هذا إلى إنشاء ملف fr.po. ثم يقوم المترجم بتحرير الملف الناتج، إما يدويًا أو باستخدام أداة ترجمة مثل Poedit ، أو Emacs مع وضع تحرير .poالملفات الخاص به. سيبدو الإدخال المحرر كما يلي:

#: src/name.c:36 msgid "اسمي %s.\n" msgstr "Je m'appelle %s.\n"

أخيرًا، تُجمَّع ملفات .po إلى ملفات msgfmtثنائية .mo(كائنات آلية). قد يستخدم برنامج GNU gettext امتداد اسم ملف خاص به .gmoعلى الأنظمة التي تستخدم تطبيقًا آخر لبرنامج gettext. [ 19 ] هذه الملفات جاهزة الآن للتوزيع مع حزمة البرامج.

يمكن لبرنامج GNU msgfmtأيضًا إجراء بعض الفحوصات المتعلقة بسلسلة التنسيق المستخدمة في لغة البرمجة. كما يسمح بإخراج البيانات بتنسيقات خاصة بلغات أخرى غير MO؛ [ 20 ] المكافئ في X/Open هو gencat.

في المراحل اللاحقة من عملية التطوير، msgmergeيمكن استخدام هذه الأداة لتحديث ترجمة قديمة إلى قالب أحدث. كما تتوفر msgunfmtأداة لعكس تجميع .moالملفات، بالإضافة إلى العديد من الأدوات المساعدة الأخرى للمعالجة الدفعية.

جري

يقوم المستخدم، في أنظمة من نوع Unix ، بتعيين متغير البيئةLC_MESSAGES ، وسيقوم البرنامج بعرض السلاسل باللغة المختارة، إذا كان هناك .moملف مخصص لها.

يمكن لمستخدمي توزيعات جنو استخدام متغير البيئة LANGUAGEبدلاً من ذلك. ويكمن الفرق الرئيسي بينه وبين متغير يونكس في أنه يدعم لغات متعددة، مفصولة بنقطتين رأسيتين، كخيار احتياطي. [ 21 ]

صيغة الجمع

تُعنى هذه ngettext()الواجهة بحساب عدد مرات ظهور الاسم في السلسلة النصية. وكما هو الحال مع اصطلاح gettext()، غالبًا ما يُشار إليها باسم بديل N_في الاستخدام العملي. انظر إلى نموذج الكود التالي:

// المعاملات: المفرد الإنجليزي، الجمع الإنجليزي، عدد صحيح printf ( ngettext ( "%d رسالة مترجمة " , "%d رسائل مترجمة " , n ), n );

يحتوي رأس ""ملف PO (سلسلة نصية فارغة) على بعض البيانات الوصفية، إحداها صيغة الجمع المستخدمة في اللغة، والتي تُحدد عادةً باستخدام عامل ثلاثي على غرار لغة C. لنفترض أننا نريد ترجمة النص إلى اللغة السلوفينية :

msgid "" msgstr "" "..." " اللغة: sl\n" " صيغ الجمع: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n%100==4 ? 3 : 0);\n"

بما أن هناك الآن أربعة أشكال للجمع، فإن صيغة الجمع النهائية ستبدو كالتالي:

#: src/msgfmt.c:876 #, c-format msgid "%d مترجمة رسالة" msgid_plural "%d رسائل مترجمة" msgstr[ 0 ] "%d رسالة مترجمة" msgstr[ 1 ] "%d رسالة مترجمة" msgstr[ 2 ] "%d رسالة مترجمة" msgstr[ 3 ] "%d تم إرساله مسبقًا"

يُقدّم اتحاد يونيكود قواعد الجمع المرجعية للغات . [ 22 ] كما يقوم برنامج msginit بتعبئة القاعدة المناسبة مسبقًا عند إنشاء ملف للغة محددة. [ 18 ]

التطبيقات

بالإضافة إلى لغة C ، يتوفر برنامج gettext بالتطبيقات التالية: C# لكل من ASP.NET [ 23 ] [ 24 ] و WPF ، [ 25 ] و Perl ، [ 26 ] و PHP ، [ 27 ] و Python ، [ 28 ] و R ، [ 29 ] و Scala ، [ 30 ] و Node.js. [ 31 ]

يدعم برنامج GNU gettext لغة Objective-C بشكلٍ أصلي، لكنه لا يدعم لغة Swift حتى الآن. يُعد POLocalizedString أحد تطبيقات gettext الشائعة الاستخدام على منصات Cocoa هذه. [ 32 ] كما يُوفر فريق Microsoft Outlook لنظام iOS مكتبة LocalizedStringsKit بواجهة برمجة تطبيقات تُشبه gettext. [ 33 ]

انظر أيضاً

مراجع

  1. 1 2 "حول gettext" . gnu.org . تم الاطلاع عليه في 9 مايو 2024 .
  2. 1 2 "تاريخ دالة gettext() وغيرها؟ - comp.unix.solaris" . Compgroups.net . مؤرشف من الأصل في 23 مارس 2012. تم الاطلاع عليه في 3 أبريل 2016 .
  3. برونو هايبيل (29 يناير 2026). "إصدار gettext-1.0 [ مستقر ] " . تم الاطلاع عليه بتاريخ 29 يناير 2026 .
  4. مارتينديل، ليندا (1 نوفمبر 2002). "سد الفجوة الرقمية في جنوب إفريقيا | مجلة لينكس" . linuxjournal.com . مجلة لينكس . تم الاطلاع عليه بتاريخ 17 سبتمبر 2019 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  5. تيخوميروف، أوليكسي يي (1 نوفمبر 2002). "مقدمة في برمجة التدويل | مجلة لينكس" . linuxjournal.com . مجلة لينكس . تم الاطلاع عليه بتاريخ 17 سبتمبر 2019 .{{cite web}}: CS1 maint: deprecated archiveal service ( link )
  6. 1 2 "كيفية الترجمة باستخدام ملفات GetText PO و POT" . Icanlocalize.com . تم الاطلاع عليه في 3 أبريل 2016 .
  7. "ترجمة الرسائل" . مكتبة GNU C.
  8. "0001122: يجب أن يتضمن نظام POSIX الدالة gettext() وما شابهها - متتبع عيوب مجموعة أوستن" . متتبع عيوب مجموعة أوستن .
  9. "وجهة نظر المبرمج" . gettext 0.10.35 . 30 أبريل 1998.
  10. "أدوات GNU gettext: قائمة لغات البرمجة" .
  11. "po4a" . po4a.org .
  12. "مجموعة الأدوات الأساسية لمهندسي التوطين" . مجموعة أدوات الترجمة .
  13. "أدوات GNU gettext: كيف تظهر العلامات في المصادر" . www.gnu.org . مؤرشف من الأصل في 25 مارس 2024. تم الاطلاع عليه في 3 أبريل 2024 .
  14. "حول catgets" . gnu.org . تم الاطلاع عليه بتاريخ 24 أكتوبر 2017 .
  15. "دليل AmigaOS: وحدات وحزم بايثون - ويكي توثيق AmigaOS" . wiki.amigaos.net . تم الاطلاع عليه بتاريخ 9 يوليو 2023 .
  16. "أدوات GNU gettext: sh" .
  17. "أدوات GNU gettext: bash" .
  18. 1 2 "أدوات GNU gettext: ملفات PO" . Gnu.org . تم الاطلاع عليه في 3 أبريل 2016 .
  19. "ملفات تنقل الترجمات" . Gnu.org . تم الاطلاع عليه بتاريخ 22 أبريل 2014 .
  20. "استدعاء msgfmt" . أدوات GNU gettext .
  21. "أدوات GNU gettext: متغيرات بيئة اللغة" . Gnu.org . تم الاطلاع عليه في 3 أبريل 2016 .
  22. "قواعد جمع اللغات" . unicode.org .
  23. "أرشيف جوجل كود - تخزين طويل الأمد لاستضافة مشاريع جوجل كود" . Code.google.com . تم الاطلاع عليه بتاريخ 3 أبريل 2016 .
  24. "turquoiseowl/i18n: تدويل ذكي لـ ASP.NET" . GitHub.com . تم الاطلاع عليه في 3 أبريل 2016 .
  25. "NGettext.Wpf - دعم التدويل المناسب لـ WPF (عبر NGettext)" . GitHub . 16 أغسطس 2019.
  26. "libintl-perl - مكتبة تدويل للغة بيرل تهدف إلى التوافق مع نظام ترجمة الرسائل Uniforum كما هو مُطبق على سبيل المثال في GNU Gettext" . github.com . تم الاطلاع عليه بتاريخ 14 سبتمبر 2017 .
  27. "Gettext" . php.net . تم الاطلاع عليه بتاريخ 24 أكتوبر 2017 .
  28. "gettext – خدمات التدويل متعددة اللغات – وثائق بايثون 3.7.0" . docs.python.org . تم الاطلاع عليه بتاريخ 21 سبتمبر 2018 .
  29. "gettext: ترجمة الرسائل النصية" . rdrr.io. تم ​​الاطلاع عليه بتاريخ 13 نوفمبر 2021 .
  30. "makkarpov/scalingua: مكتبة بسيطة لتدويل النصوص تشبه مكتبة gettext للغة Scala" . github.com . تم الاطلاع عليه بتاريخ 28 أبريل 2016 .
  31. "DanielBaulig/node-gettext: نسخة معدلة من مكتبة Gettext الخاصة بجوشوا آي. ميلر بلغة جافا سكريبت لـ node.js" . GitHub.com . تم الاطلاع عليه بتاريخ 3 أبريل 2016 .
  32. "hulab/POLocalizedString: gettext for iOS/OS X/watchOS/tvOS" . GitHub . hulab. 19 سبتمبر 2019.
  33. "microsoft/LocalizedStringKit: إنشاء ملفات .strings مباشرةً من التعليمات البرمجية الخاصة بك" . GitHub . Microsoft. 12 فبراير 2020.