انتقل إلى المحتوى

ترجم الرسائل كاملة
بسلاسل t-string في Python

تربط gettext-tstrings سلاسل t-string في Python 3.14+ بكتالوجات gettext القياسية وأدوات Babel. تبقى القيم والتنسيق في شيفرة التطبيق، ويتعامل المترجمون مع رسائل كاملة وعناصر نائبة بسيطة على هيئة {name}:

import gettext

from gettext_tstrings import Translator

_ = Translator(gettext.translation("messages", localedir="locales"))
name = "Ada"
print(_(t"Hello {name}"))  # with a Japanese catalog: こんにちは Ada

يحتوي الكتالوج على Hello {name}. ويمكن للترجمة أن تغيّر موضع {name} أو تكرره. فإن حذفت العنصر النائب أو غيّرت اسمه أو أضافت إليه تنسيقاً، أبلغ التحقق من الكتالوج عن الخطأ. وإن بلغ إدخال غير صالح بيئة الإنتاج رغم ذلك، سجّلت المكتبة تحذيراً وعرضت رسالة المصدر بدلاً من إيقاف التطبيق.

ابدأ الدرس التعليمي في خمس دقائق قارن البدائل

نسخة alpha · Python 3.14+ · كتالوجات PO/MO القياسية · بلا تبعيات خارجية وقت التشغيل

هذا الموقع يطبّق ما يوثّقه: فكل طبعة لغوية — التنقل والتسميات وتقرير البناء المعتمد على صيغ الجمع — تُعرض من كتالوجات PO بواسطة gettext-tstrings نفسها.

هل هذه المكتبة مناسبة لك؟

مناسبة اليوم إذا كان تطبيقك يعمل على Python 3.14 أو أحدث؛ وكنت تستخدم gettext وBabel بالفعل، أو تريد اعتماد سير عمل PO/MO الخاص بهما؛ وكنت تريد صيغة t-string بعناصر نائبة مسمّاة تُفحص قبل عرضها.

ليست مناسبة بعد إذا كنت تحتاج Python 3.13 أو أقدم؛ أو كنت تحتاج Python API مستقراً — فهذه نسخة alpha، والمواصفة هي الجزء الذي استقر منها؛ أو كان جُلّ نصك القابل للترجمة يعيش في لغة قوالب لا في شيفرة Python.

ألديك كتالوجات بالفعل؟ ستظل تعمل. تنتج _("Hello {name}").format(name=name) وtr(t"Hello {name}") قيمة msgid نفسها، فتنجو الترجمات الموجودة من التحوّل — والترحيل يمر بالنقلة كاملة.

ما الذي يُسمح للكتالوج بقوله

لا تستطيع الترجمة تغيير بنية الرسالة التي تترجمها. هذا هو الوعد كله، وبقية هذا الموقع تتفرّع عنه. يمكن للترجمة أن تغيّر موضع {name} أو تكرره، وأن تعيد كتابة كل كلمة أخرى حوله. ولا يمكنها حذف العنصر النائب، ولا اختراع عنصر جديد، ولا النفاذ من خلاله إلى كائناتك، ولا إضافة تنسيق من عندها.

تتحقق المكتبة من ذلك عند الدخول — حين تُجمَّع الكتالوجات — ثم مرة أخرى وقت العرض، وهذا هو الفرق بين خطأ يُكتشف في المراجعة وخطأ يكتشفه مستخدم.

جديد على gettext؟ سير العمل كله في أربع جمل

gettext هو الطريقة القياسية لترجمة البرمجيات، في Python وخارجها. توسم شيفرتك الرسائل القابلة للترجمة؛ ويجمعها مستخرج في ملف قالب (.pot)؛ ويملأ مترجم — ليس مبرمجاً في الغالب — ملف كتالوج واحداً (.po) لكل لغة، يُجمّع إلى ملف .mo ثنائي يحمّله تطبيقك وقت التشغيل. الاسم المتعارف عليه لدالة الترجمة هو _، فتُقرأ _(t"Hello {name}") على أنها «ترجم هذه الرسالة». يمر الدرس التعليمي بالمسار كاملاً — وسم، استخراج، ترجمة، تجميع، تشغيل — في نحو خمس دقائق.

المشكلة التي يحلها

تكون f-string قد أُجري عليها الاستيفاء قبل أن تراها أي مكتبة — فتكون f"Hello {name}" قد صارت "Hello Ada"، وترجمة الأجزاء المحيطة بالقيمة تكسر قواعد معظم اللغات. أما t-string (PEP 750) فتحفظ النص الثابت والقيم المقيّمة وتعبيرات المصدر والتحويلات ومواصفات التنسيق منفصلة، وهذا هو الفصل الذي يحتاجه كتالوج الرسائل. وتوضّح ما الذي يغيّره ذلك بالمقارنة مع %(name)s و.format() وسلاسل $.

لا يحدد gettext أو Babel كيفية تحويل t-string إلى رسالة. تختار هذه المكتبة قاعدة واضحة، وتوثقها في مواصفة ذات إصدارات، وتوفر حزمة اختبارات توافق.

قواعد التصميم

  • ترجمة الرسائل الكاملة لا أجزاء الجمل.
  • قبول أسماء متغيرات بسيطة فقط مثل {name}.
  • إبقاء !r و:.2f تحت سيطرة التطبيق وخارج الكتالوج.
  • السماح للترجمات بإعادة ترتيب العناصر النائبة المعروفة وتكرارها، مع منعها من الوصول إلى الخصائص أو إضافة تنسيق.
  • إعادة استخدام ملفات POT وPO وMO والأدوات الحالية.

وفي المقابل، هذه قائمة بما تتركه المكتبة عمداً: فهي لا توطّن الأعداد ولا العملات ولا التواريخ — نسّق تلك أولاً عبر Babel؛ ولا تهرّب المخرجات المعروضة من أجل HTML أو الصدفة أو الطرفية؛ ولا تستطيع الحكم على صحة الترجمة، بل على سلامة عناصرها النائبة فقط.

التثبيت

python -m pip install gettext-tstrings

يتطلب Python 3.14 أو أحدث. العرض بلا تبعيات خارجية ويستخدم gettext من المكتبة القياسية فقط.

يعمل الاستخراج والتحقق من الكتالوج عبر Babel. ثبّت الإضافة التالية حيثما يعمل pybabel، وهو عادةً بيئة تطوير أو CI لا صورة إنتاج:

python -m pip install "gettext-tstrings[babel]"

الخطوة التالية

ابدأ من هنا — من دون افتراض أي خبرة في gettext:

  • الدرس التعليمي — من مجلد فارغ إلى ترجمة يابانية عاملة في خمس خطوات، مع عرض كل أمر ومخرجاته.
  • لماذا t-strings؟ — الرسالة نفسها بأربع طرق، وما يسلّمه كل من %(name)s و.format() وسلاسل $ إلى الكتالوج.

استخدمها — المراجع العملية:

  • الدليل — API وقت التشغيل: أي مدخل تستخدم، وصيغ الجمع، ولغة كل طلب، والسلاسل المؤجلة، والتعامل مع الكتالوج الخاطئ.
  • الاستخراج — مرجع pybabel: الإعداد وأسماء الدوال المخصصة وكيف تتحقق الأدوات الحالية من هذه الكتالوجات مجاناً.
  • في الإنتاج — الحلقة كما يديرها فريق: دورة التحديث، وإدخالات fuzzy، وبوابات CI، ومنصات الترجمة، والشحن.
  • الترحيل — اعتماد هذه المكتبة في مشروع يملك كتالوجات بالفعل، موضع استدعاء بعد آخر.
  • للمترجمين — صفحة واحدة تسلّمها لمن يحرّر ملفات .po.

افهمها — من التاريخ إلى التنفيذ:

  • الخلفية — لماذا توجد هذه المكتبة: ثلاثون عاماً من gettext، ومقترحا PEP، ونقاش المكتبة القياسية الذي أُغلق دون إجابة.
  • المزالق — ما الذي كسرته ترجمة هذا الموقع إلى خمس وثلاثين لغة فعلياً، وأي نصف منه تستطيع أداة التقاطه.
  • كيف تعمل — من كائن القالب في PEP 750 إلى السلسلة المعروضة، والذواكر المؤقتة التي تجعل الفحص رخيصاً.

المرجع — العقود:

  • API — كل ما تصدّره الحزمة، في صفحة واحدة.
  • المواصفة — اتفاقية t-string ↔ msgid كعقد مستقر ذي إصدارات مع حزمة توافق قابلة للقراءة آلياً.

الحالة

إصدار الحزمة 0.1.0a8
استقرار API alpha — قد يتغير Python API بعد
المواصفة v1، مع حزمة توافق
Python 3.14 فما فوق؛ مُختبَر على 3.14 و3.14t (بلا قفل عام) و3.15
Babel 2.18 فما فوق، وحيثما يعمل pybabel فقط
اعتماديات وقت التشغيل لا شيء — gettext من المكتبة القياسية
صيغة الكتالوج POT وPO وMO العادية
التغييرات CHANGELOG

المشروع في مرحلة alpha. العقد صغير عن قصد، والمواصفة هي الجزء المستقر منه، أما Python API فقد يتغير بعد. نحتاج قبل إصدار مستقر إلى حالات لغوية أوسع، وقياس أداء مستمر، ومراجعة للـAPI ممن يستخدمون gettext وBabel بجدية، واختبارات توافق عبر كل إصدار مدعوم من Python وBabel.

نرحب بـالمشكلات وطلبات السحب — فمرحلة alpha هي بالضبط الوقت الذي تستحق فيه الواجهة النقاش.

شارك في المجتمع