كيفية ترجمة ملفات PO دون التسبب في تعطل تطبيقك

OpenL Team 7/3/2026
كيفية ترجمة ملفات PO دون التسبب في تعطل تطبيقك

TABLE OF CONTENTS

تبدو ملفات PO كأنها ملفات نصية بسيطة حتى يؤدي وجود %s مترجم بشكل خاطئ، أو غياب صيغة الجمع، أو تعديل في msgid إلى تعطيل تطبيقك. استخدم سير العمل هذا لترجمة العبارات الموجهة للمستخدم مع الحفاظ على بنية gettext سليمة.

لا تقم بلصق الملف بالكامل في مترجم نصوص عادي. ملف PO قريب من كود المصدر: الكلمات قابلة للترجمة، لكن بنية الملف، والوسوم النائبة، والتعليقات، ومؤشرات الجمع يجب أن تبقى دون تغيير.

الطريقة الأولى: استخدم مترجم ملفات PO

اختر هذه الطريقة إذا كنت تريد مسودة أولى سريعة وآمنة ولا ترغب في تعديل أزواج msgid / msgstr يدويًا.

  1. قم بعمل نسخة احتياطية من ملف .po الأصلي. احتفظ بنسخة نظيفة في مستودعك قبل إرسال أي شيء إلى المترجم. إذا حدث خطأ في الملف المترجم، ستحتاج إلى نسخة سليمة للمقارنة.

  2. افتح أداة ترجمة تدعم ملفات PO. استخدم أداة مصممة خصيصًا لملفات gettext، مثل OpenL PO Translator، وهي أداة ترجمة مستندات بنظام الدفع مقابل الاستخدام. يجب أن تقوم الأداة الداعمة لملفات PO بترجمة العبارات المستهدفة مع الحفاظ على العبارات المصدرية، والتعليقات، والوسوم النائبة، وبنية الملف كما هي. إذا كنت لا تزال تختار الأداة المناسبة، قارن الخيارات في دليل أفضل مترجم PO.

  3. قم برفع ملف .po. استخدم ملف اللغة الذي يحتوي على مدخلات msgid و msgstr. إذا كان لديك فقط قالب .pot، أنشئ ملف .po للغة الهدف أولاً، ثم ارفع ملف .po.

  4. اختر لغة المصدر واللغة الهدف. طابق لغة المصدر مع النص الموجود داخل msgid، وليس مع لغة واجهة الإدارة لديك. على سبيل المثال، إذا كان الملف يحتوي على عبارات msgid بالإنجليزية وتحتاج إلى إخراج بالإسبانية، اختر الترجمة من الإنجليزية إلى الإسبانية.

  5. قم بتنزيل الملف المترجم. احفظه وفقًا لتسمية اللغات التي يتوقعها إطار العمل الخاص بك. غالبًا ما تستخدم إضافات ووردبريس نمط اسم النطاق النصي مع رمز اللغة، بينما يخزن Django الملفات عادةً تحت locale/<language>/LC_MESSAGES/.

  6. راجع السلاسل النصية الخطرة أولاً. ابحث في الملف المترجم عن الرموز %, {, }, <, >, msgid_plural, msgctxt, و #, fuzzy. هذه هي المدخلات الأكثر احتمالاً للتأثير على سلوك التطبيق أثناء التشغيل.

  7. اختبر الملف المترجم في تطبيقك. قم بتحميل اللغة محلياً وتصفح الشاشات التي تستخدم السلاسل المترجمة. ملف PO لا يُعتبر منتهياً بمجرد ترجمته؛ بل يُعتبر منتهياً عندما يستمر التطبيق في العرض بشكل صحيح.

الطريقة الثانية: ترجمة ملفات PO باستخدام Poedit

اختر هذه الطريقة عندما تحتاج إلى مراجعة بشرية، أو توافق مع WordPress، أو سير عمل دقيق لكل مدخل على حدة.

  1. افتح الملف في Poedit. Poedit هو محرر ترجمة مخصص لملفات PO وصيغ التوطين الأخرى؛ المحرر الأساسي مجاني، مع ميزات Pro مدفوعة لسير العمل المكثف. بالنسبة لـ WordPress، يوضح دليل Polyglots الرسمي أن Poedit يمكنه إنشاء ملفات .po و .mo من ملف POT ويدعم صيغ الجمع وUTF-8.

  2. حدث الملف من قالب POT إذا تغير المصدر. إذا قام المطورون بتغيير نص التطبيق، قم بتحديث ملف .po من أحدث ملف .pot قبل الترجمة. هذا يجعل السلاسل الجديدة والمحذوفة والمبهمة مرئية بدلاً من إرسال نص واجهة مستخدم قديم دون علم.

  3. ترجم فقط حقل msgstr. حقل msgid هو السلسلة المصدر التي يستخدمها تطبيقك للبحث عن الترجمة. في سير عمل gettext المعتاد، يجب على المترجمين تحرير msgstr وليس msgid.

  4. حافظ على العناصر النائبة كما هي تماماً. لا تترجم أو تغير المسافات حول المتغيرات مثل %s, %d, %1$s, {name}, %(count)s, :name أو علامات HTML. إذا كان ترتيب الكلمات يجب أن يتغير، انقل العنصر النائب كوحدة واحدة.

  5. تعامل مع صيغ الجمع كترجمات منفصلة. يمكن أن يحتوي مدخل الجمع على msgid, msgid_plural، وعدة قيم msgstr[n]. املأ كل خانة جمع مطلوبة للغة الهدف بدلاً من نسخ نفس الجملة في كل مكان.

  6. احفظ وقم بترجمة ملف .mo إذا كان تطبيقك يحتاج إليه. بعض بيئات العمل تقرأ ملفات .po مباشرة أثناء التطوير، لكن WordPress والعديد من إعدادات gettext تستخدم ملفات .mo المترجمة أثناء التشغيل. يمكن لـ Poedit ترجمة ملف .mo تلقائيًا عند الحفظ؛ أما Django فيمكنه ترجمة الرسائل باستخدام الأمر django-admin compilemessages.

  7. قم بحل جميع التحذيرات قبل الرفع. في Poedit، غالبًا ما تشير أيقونات التحذير إلى عناصر نائبة معطلة، أو متغيرات مفقودة، أو عدم تطابق في صيغ الجمع. أصلح هذه المشكلات قبل استيراد الترجمة إلى WordPress أو Django أو Drupal أو فرع الإصدار الخاص بك.

الطريقة الثالثة: استخدام منصة تعريب

اختر هذه الطريقة عندما يحتاج عدة مترجمين أو مراجعين أو مديري إصدارات للعمل على نفس ملفات PO.

  1. استورد ملف PO إلى منصة تدعم gettext. تدعم منصات التعريب مثل Weblate سير عمل ملفات PO. غالبًا ما تكون منصات التعريب الجماعي منتجات مدفوعة، رغم أن Weblate يوفر أيضًا خيارًا مفتوح المصدر يمكن استضافته ذاتيًا. تختلف طريقة تعامل هذه المنصات مع التعليقات، والرؤوس، والسلاسل غير المؤكدة، والعناصر النائبة، لذا تحقق من إعدادات التنسيق قبل رفع ملفات الإنتاج.

  2. فعّل فحوصات العناصر النائبة والوسوم. قم بتشغيل قواعد ضمان الجودة الخاصة بالعناصر النائبة بأسلوب printf، والمتغيرات المسماة، ووسوم HTML/XML، وصيغ الجمع. هذه الفحوصات تكتشف الأخطاء التي لا يمكن لمدققي الإملاء العاديين رؤيتها.

  3. اجعل تعليقات المطورين مرئية. يمكن أن تحمل تعليقات PO سياقًا مثل مراجع المصدر، أو ملاحظات المطور المستخرجة، أو العلامات، أو السلاسل المصدرية السابقة. يحتاج المترجمون إلى هذه الملاحظات عندما يكون هناك تسمية واجهة مستخدم قصيرة مثل “Open” والتي قد تكون فعلًا أو صفة أو أمر قائمة.

  4. استخدم ذاكرة الترجمة مع المراجعة. تعتبر ذاكرة الترجمة مفيدة للسلاسل المتكررة في واجهة المستخدم، لكنها قد تنسخ ترجمة قديمة إلى سياق جديد. راجع السلاسل المعاد استخدامها عندما يتغير msgctxt أو مراجع المصدر أو سياق واجهة المستخدم المحيط.

  5. صدّر ملفات PO وقم بإجراء فحوصات محلية. لا تثق في التصدير بشكل أعمى. أعد الملف المترجم إلى التطبيق، وقم بترجمته إذا لزم الأمر، واختبر الشاشات قبل الدمج.

قواعد ملفات PO التي يجب ألا تخرقها أبدًا

PO itemهل يُترجم؟مثال آمنلماذا هو مهم
msgidلاmsgid "Save changes"التطبيق يستخدم هذه السلسلة المصدرية كمفتاح بحث في العديد من سير عمل gettext.
msgstrنعمmsgstr "Guardar cambios"هذا هو النص بلغة الهدف الذي يراه المستخدمون.
msgctxtلاmsgctxt "button"السياق يوضح السلاسل المصدرية المتطابقة.
%s, %d, %1$sلاHello, %s -> Hola, %sالكود التشغيلي يستبدل هذه العناصر النائبة بقيم حية أثناء التنفيذ.
{name}, %(count)s, :nameلاWelcome, {name}يجب أن تتطابق المتغيرات المسماة مع كود التطبيق.
علامات HTMLغالبًا لا<strong>Warning</strong>تُترجم النص فقط، وليس صياغة الوسم.
msgid_pluralلاmsgid_plural "%d files"صيغة الجمع المصدرية تتبع مسار الكود الأصلي.
msgstr[0], msgstr[1]نعم، بحذرmsgstr[0] "%d file"لكل لغة هدف قواعد جمع خاصة بها.
#, fuzzyراجع أولاً#, fuzzyتعني “fuzzy” أن الترجمة قد تكون قديمة أو غير مؤكدة.
#. تعليقات المطورينغالبًا لا#. Button labelهذه الملاحظات تساعد المترجمين على فهم السياق.

مثال سريع: ترجمة PO آمنة مقابل ترجمة معطوبة

هنا إدخال gettext عادي:

#. %s هو اسم العرض للمستخدم.
#, c-format
msgid "Welcome back, %s"
msgstr ""

ترجمة إسبانية آمنة تبقي %s دون تغيير:

#. %s هو اسم العرض للمستخدم.
#, c-format
msgid "Welcome back, %s"
msgstr "Bienvenido de nuevo, %s"

ترجمة معطوبة تغير العنصر النائب:

msgid "Welcome back, %s"
msgstr "Bienvenido de nuevo, % s"

تلك المسافة الصغيرة قد تكون مؤثرة. أداة GNU msgfmt --check-format مصممة لاكتشاف عدم تطابق صيغ العناصر النائبة مثل أخطاء %، كما أن Poedit يحذر أيضًا من مشاكل العناصر النائبة الشائعة. لقائمة أوسع من السلاسل التي يجب أن تبقى دون تغيير، استخدم دليلنا حول ما لا يجب ترجمته.

كيفية التحقق من ملف PO مترجم

  1. قم بتشغيل التحقق من gettext إذا كان مثبتًا لديك.
msgfmt --check --check-format -o /tmp/messages.mo path/to/messages.po

يقوم هذا الأمر بفحص الصياغة، والرؤوس، وسلاسل التنسيق، ثم يكتب كتالوجًا مؤقتًا مترجمًا إذا كان الملف صالحًا.

  1. قم بترجمة الملف بالطريقة التي يتوقعها إطار العمل الخاص بك.
django-admin compilemessages

بالنسبة لمشاريع Django، يقوم الأمر compilemessages بترجمة ملفات .po التي تم إنشاؤها بواسطة makemessages إلى ملفات .mo لدعم gettext.

  1. ابحث عن الترجمات الفارغة.
grep -n 'msgstr ""' path/to/messages.po

قد تكون الحقول الفارغة في msgstr مقصودة لبعض المدخلات غير المترجمة، لكن يجب ألا تفاجئك أثناء الإصدار.

  1. ابحث عن السلاسل الغامضة (fuzzy).
grep -n '#, fuzzy' path/to/messages.po

يجب مراجعة السلاسل الغامضة من قبل شخص قبل الإصدار. بشكل افتراضي، لا يستخدم msgfmt الترجمات الغامضة إلا إذا قمت بالترجمة باستخدام الخيار --use-fuzzy، لذا قد تتصرف المدخلات الغامضة مثل السلاسل غير المترجمة في الكتالوج النهائي.

  1. اختبر واجهة المستخدم الحقيقية. افتح الشاشات التي تحتوي على النماذج، وعدد الجمع، ورسائل الخطأ، وقوائم الحسابات، وتدفقات الدفع. فحص ملفات PO يكشف مشاكل الملف؛ أما اختبار واجهة المستخدم فيكشف الصياغة غير المناسبة، وتجاوز النص، والسياق المفقود.

أي طريقة يجب أن تستخدم؟

الحالةأفضل طريقةالسبب
تحتاج إلى مسودة أولية سريعة لملف PO واحدمترجم ملفات POأسرع طريقة مع الحفاظ على البنية
تدير إضافة أو قالب ووردبريسPoeditسير عمل ووردبريس المألوف مع تحويل إلى .mo
تدير تطبيق Djangoمترجم PO أو Poedit، ثم compilemessagesالترجمة قد تكون سريعة، لكن التجميع عبر الإطار لا يزال مطلوبًا
لديك العديد من اللغات والمراجعينمنصة تعريبتوزيع أفضل، وسجل تغييرات، وضبط جودة ومراجعة محكم
تترجم نصوصًا موجهة للمطورينمراجعة بشرية بعد الترجمة الآليةمصطلحات الشيفرة، والحقول المؤقتة، والسياق أكثر أهمية
تقوم بتعريب ملفات JSON أو ملفات i18n للواجهات الأمامية أيضًااستخدم سير عمل خاص بالتنسيققواعد PO لا تنطبق دائمًا على JSON أو YAML أو رسائل ICU

إذا كان مشروعك يخلط بين ملفات gettext PO وملفات JSON locale، ترجم كل تنسيق باستخدام أداة تدرك بنيته. ملفات PO تدور حول msgid وmsgstr؛ أما تعريب JSON فيعتمد على المفاتيح والقيم. لهذا النوع من سير العمل، راجع دليلنا حول أفضل مترجمي JSON في 2026.

الأسئلة الشائعة

هل يمكنني ترجمة ملفات PO باستخدام Google Translate؟

يمكنك نسخ قيم msgstr الفردية إلى مترجم عام، لكن رفع أو لصق ملف PO كامل في مترجم نصي عادي أمر محفوف بالمخاطر. قد يغير المترجمون العامون msgid أو التعليقات أو هروب علامات الاقتباس أو مؤشرات الجمع أو الحقول المؤقتة. استخدم مترجمًا يدعم PO، أو Poedit، أو منصة تعريب مخصصة.

ما الفرق بين .po و .pot و .mo؟

.pot هو القالب المستخرج من الشيفرة المصدرية. عادةً يحتوي على النصوص الأصلية فقط دون ترجمات مكتملة. .po هو ملف الترجمة القابل للتحرير للغة مستهدفة واحدة. .mo هو الكتالوج الثنائي المجمع الذي تقوم العديد من تطبيقات gettext بتحميله أثناء التشغيل.

هل يجب أن أترجم msgid؟

لا، ليس في سير العمل العادي. قم بترجمة msgstr. يصف دليل GNU gettext أن msgid هو النص الأصلي غير المترجم، وmsgstr هو الترجمة؛ حيث يتم إنتاج وإدارة سلاسل msgid بواسطة أدوات gettext.

كيف أتحقق من صحة ملف PO؟

شغّل الأمر msgfmt --check --check-format إذا كان gettext متوفراً، أو افتح الملف في Poedit، أو استخدم أدوات التحقق من الجودة في منصة الترجمة الخاصة بك. بعد ذلك، قم بتجميع الملف واختباره داخل التطبيق. التحقق من الصحة ضروري، لكنه لا يغني عن اختبار واجهة المستخدم.

ماذا يحدث إذا أفسدت عنصرًا نائبًا (placeholder)؟

في أفضل الأحوال، سيعرض التطبيق نصًا غريبًا. في أسوأ الأحوال، سيظهر خطأ في وقت التشغيل لأن النص المترجم لم يعد يتطابق مع المتغيرات التي يمررها الكود. يجب نقل العناصر النائبة فقط كوحدات كاملة، ولا ينبغي ترجمتها أو تعديلها جزئيًا.

هل يمكن لـ OpenL ترجمة ملفات PO؟

نعم. OpenL PO Translator مصمم خصيصًا لملفات gettext .po ويؤكد أنه يحافظ على العناصر النائبة والمتغيرات دون تغيير أثناء الترجمة إلى أكثر من 100 لغة. يستخدم نظام ترجمة مستندات بالدفع مقابل الاستخدام، لذا يمكنك الاعتماد عليه للحصول على مسودة أولية سريعة عندما تكون المحافظة على بنية ملف PO أهم من الترجمة اليدوية الكاملة. إذا كان لديك فقط قالب .pot، أنشئ ملف .po للغة الهدف قبل استخدام OpenL.

المصادر