كيفية ترجمة ملفات PO دون التسبب في تعطل تطبيقك
TABLE OF CONTENTS
تبدو ملفات PO كأنها ملفات نصية بسيطة حتى يؤدي وجود %s مترجم بشكل خاطئ، أو غياب صيغة الجمع، أو تعديل في msgid إلى تعطيل تطبيقك. استخدم سير العمل هذا لترجمة العبارات الموجهة للمستخدم مع الحفاظ على بنية gettext سليمة.
لا تقم بلصق الملف بالكامل في مترجم نصوص عادي. ملف PO قريب من كود المصدر: الكلمات قابلة للترجمة، لكن بنية الملف، والوسوم النائبة، والتعليقات، ومؤشرات الجمع يجب أن تبقى دون تغيير.
الطريقة الأولى: استخدم مترجم ملفات PO
اختر هذه الطريقة إذا كنت تريد مسودة أولى سريعة وآمنة ولا ترغب في تعديل أزواج msgid / msgstr يدويًا.
-
قم بعمل نسخة احتياطية من ملف
.poالأصلي. احتفظ بنسخة نظيفة في مستودعك قبل إرسال أي شيء إلى المترجم. إذا حدث خطأ في الملف المترجم، ستحتاج إلى نسخة سليمة للمقارنة. -
افتح أداة ترجمة تدعم ملفات PO. استخدم أداة مصممة خصيصًا لملفات gettext، مثل OpenL PO Translator، وهي أداة ترجمة مستندات بنظام الدفع مقابل الاستخدام. يجب أن تقوم الأداة الداعمة لملفات PO بترجمة العبارات المستهدفة مع الحفاظ على العبارات المصدرية، والتعليقات، والوسوم النائبة، وبنية الملف كما هي. إذا كنت لا تزال تختار الأداة المناسبة، قارن الخيارات في دليل أفضل مترجم PO.
-
قم برفع ملف
.po. استخدم ملف اللغة الذي يحتوي على مدخلاتmsgidوmsgstr. إذا كان لديك فقط قالب.pot، أنشئ ملف.poللغة الهدف أولاً، ثم ارفع ملف.po. -
اختر لغة المصدر واللغة الهدف. طابق لغة المصدر مع النص الموجود داخل
msgid، وليس مع لغة واجهة الإدارة لديك. على سبيل المثال، إذا كان الملف يحتوي على عباراتmsgidبالإنجليزية وتحتاج إلى إخراج بالإسبانية، اختر الترجمة من الإنجليزية إلى الإسبانية. -
قم بتنزيل الملف المترجم. احفظه وفقًا لتسمية اللغات التي يتوقعها إطار العمل الخاص بك. غالبًا ما تستخدم إضافات ووردبريس نمط اسم النطاق النصي مع رمز اللغة، بينما يخزن Django الملفات عادةً تحت
locale/<language>/LC_MESSAGES/. -
راجع السلاسل النصية الخطرة أولاً. ابحث في الملف المترجم عن الرموز
%,{,},<,>,msgid_plural,msgctxt, و#, fuzzy. هذه هي المدخلات الأكثر احتمالاً للتأثير على سلوك التطبيق أثناء التشغيل. -
اختبر الملف المترجم في تطبيقك. قم بتحميل اللغة محلياً وتصفح الشاشات التي تستخدم السلاسل المترجمة. ملف PO لا يُعتبر منتهياً بمجرد ترجمته؛ بل يُعتبر منتهياً عندما يستمر التطبيق في العرض بشكل صحيح.
الطريقة الثانية: ترجمة ملفات PO باستخدام Poedit
اختر هذه الطريقة عندما تحتاج إلى مراجعة بشرية، أو توافق مع WordPress، أو سير عمل دقيق لكل مدخل على حدة.
-
افتح الملف في Poedit. Poedit هو محرر ترجمة مخصص لملفات PO وصيغ التوطين الأخرى؛ المحرر الأساسي مجاني، مع ميزات Pro مدفوعة لسير العمل المكثف. بالنسبة لـ WordPress، يوضح دليل Polyglots الرسمي أن Poedit يمكنه إنشاء ملفات
.poو.moمن ملف POT ويدعم صيغ الجمع وUTF-8. -
حدث الملف من قالب POT إذا تغير المصدر. إذا قام المطورون بتغيير نص التطبيق، قم بتحديث ملف
.poمن أحدث ملف.potقبل الترجمة. هذا يجعل السلاسل الجديدة والمحذوفة والمبهمة مرئية بدلاً من إرسال نص واجهة مستخدم قديم دون علم. -
ترجم فقط حقل
msgstr. حقلmsgidهو السلسلة المصدر التي يستخدمها تطبيقك للبحث عن الترجمة. في سير عمل gettext المعتاد، يجب على المترجمين تحريرmsgstrوليسmsgid. -
حافظ على العناصر النائبة كما هي تماماً. لا تترجم أو تغير المسافات حول المتغيرات مثل
%s,%d,%1$s,{name},%(count)s,:nameأو علامات HTML. إذا كان ترتيب الكلمات يجب أن يتغير، انقل العنصر النائب كوحدة واحدة. -
تعامل مع صيغ الجمع كترجمات منفصلة. يمكن أن يحتوي مدخل الجمع على
msgid,msgid_plural، وعدة قيمmsgstr[n]. املأ كل خانة جمع مطلوبة للغة الهدف بدلاً من نسخ نفس الجملة في كل مكان. -
احفظ وقم بترجمة ملف
.moإذا كان تطبيقك يحتاج إليه. بعض بيئات العمل تقرأ ملفات.poمباشرة أثناء التطوير، لكن WordPress والعديد من إعدادات gettext تستخدم ملفات.moالمترجمة أثناء التشغيل. يمكن لـ Poedit ترجمة ملف.moتلقائيًا عند الحفظ؛ أما Django فيمكنه ترجمة الرسائل باستخدام الأمرdjango-admin compilemessages. -
قم بحل جميع التحذيرات قبل الرفع. في Poedit، غالبًا ما تشير أيقونات التحذير إلى عناصر نائبة معطلة، أو متغيرات مفقودة، أو عدم تطابق في صيغ الجمع. أصلح هذه المشكلات قبل استيراد الترجمة إلى WordPress أو Django أو Drupal أو فرع الإصدار الخاص بك.
الطريقة الثالثة: استخدام منصة تعريب
اختر هذه الطريقة عندما يحتاج عدة مترجمين أو مراجعين أو مديري إصدارات للعمل على نفس ملفات PO.
-
استورد ملف PO إلى منصة تدعم gettext. تدعم منصات التعريب مثل Weblate سير عمل ملفات PO. غالبًا ما تكون منصات التعريب الجماعي منتجات مدفوعة، رغم أن Weblate يوفر أيضًا خيارًا مفتوح المصدر يمكن استضافته ذاتيًا. تختلف طريقة تعامل هذه المنصات مع التعليقات، والرؤوس، والسلاسل غير المؤكدة، والعناصر النائبة، لذا تحقق من إعدادات التنسيق قبل رفع ملفات الإنتاج.
-
فعّل فحوصات العناصر النائبة والوسوم. قم بتشغيل قواعد ضمان الجودة الخاصة بالعناصر النائبة بأسلوب printf، والمتغيرات المسماة، ووسوم HTML/XML، وصيغ الجمع. هذه الفحوصات تكتشف الأخطاء التي لا يمكن لمدققي الإملاء العاديين رؤيتها.
-
اجعل تعليقات المطورين مرئية. يمكن أن تحمل تعليقات PO سياقًا مثل مراجع المصدر، أو ملاحظات المطور المستخرجة، أو العلامات، أو السلاسل المصدرية السابقة. يحتاج المترجمون إلى هذه الملاحظات عندما يكون هناك تسمية واجهة مستخدم قصيرة مثل “Open” والتي قد تكون فعلًا أو صفة أو أمر قائمة.
-
استخدم ذاكرة الترجمة مع المراجعة. تعتبر ذاكرة الترجمة مفيدة للسلاسل المتكررة في واجهة المستخدم، لكنها قد تنسخ ترجمة قديمة إلى سياق جديد. راجع السلاسل المعاد استخدامها عندما يتغير
msgctxtأو مراجع المصدر أو سياق واجهة المستخدم المحيط. -
صدّر ملفات 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 مترجم
- قم بتشغيل التحقق من gettext إذا كان مثبتًا لديك.
msgfmt --check --check-format -o /tmp/messages.mo path/to/messages.po
يقوم هذا الأمر بفحص الصياغة، والرؤوس، وسلاسل التنسيق، ثم يكتب كتالوجًا مؤقتًا مترجمًا إذا كان الملف صالحًا.
- قم بترجمة الملف بالطريقة التي يتوقعها إطار العمل الخاص بك.
django-admin compilemessages
بالنسبة لمشاريع Django، يقوم الأمر compilemessages بترجمة ملفات .po التي تم إنشاؤها بواسطة makemessages إلى ملفات .mo لدعم gettext.
- ابحث عن الترجمات الفارغة.
grep -n 'msgstr ""' path/to/messages.po
قد تكون الحقول الفارغة في msgstr مقصودة لبعض المدخلات غير المترجمة، لكن يجب ألا تفاجئك أثناء الإصدار.
- ابحث عن السلاسل الغامضة (fuzzy).
grep -n '#, fuzzy' path/to/messages.po
يجب مراجعة السلاسل الغامضة من قبل شخص قبل الإصدار. بشكل افتراضي، لا يستخدم msgfmt الترجمات الغامضة إلا إذا قمت بالترجمة باستخدام الخيار --use-fuzzy، لذا قد تتصرف المدخلات الغامضة مثل السلاسل غير المترجمة في الكتالوج النهائي.
- اختبر واجهة المستخدم الحقيقية. افتح الشاشات التي تحتوي على النماذج، وعدد الجمع، ورسائل الخطأ، وقوائم الحسابات، وتدفقات الدفع. فحص ملفات 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.
المصادر
- دليل GNU gettext: ملفات PO — الشرح الرسمي من gettext حول تنسيق ملف PO.
- دليل GNU gettext: إدخالات ملف PO — المصدر الخاص بـ
msgid، وmsgstr، والتعليقات، والرايات، وبنية الإدخال. - دليل GNU gettext: الإدخالات بصيغ الجمع — المصدر الخاص ببنية الإدخالات بصيغ الجمع.
- دليل GNU gettext: استدعاء msgfmt — المصدر الخاص بـ
msgfmt --checkوالتحقق من صحة صيغ التنسيق. - OpenL PO Translator — صفحة منتج OpenL لترجمة ملفات
.poمع الحفاظ على العناصر النائبة والمتغيرات. - Poedit — الموقع الرسمي لـ Poedit لمحرر ترجمة ملفات PO وعرض Pro.
- دليل WordPress Polyglots: Poedit — إرشادات ووردبريس حول استخدام Poedit، وملفات POT، وملفات PO، وتجميع MO، وتحذيرات العناصر النائبة.
- توثيق Django: الترجمة — سير عمل Django لملفات الرسائل والترجمة.
- توثيق Django: compilemessages — مرجع أوامر Django لتحويل ملفات
.poإلى ملفات.mo. - توثيق Drupal: ملفات PO و POT — شرح Drupal لملفات
.poو.pot، والسياق، وصيغ الجمع، والتعليقات، والمتغيرات. - توثيق Weblate: GNU gettext PO — ملاحظات منصة الترجمة حول رؤوس ملفات PO، والسلاسل المصدرية السابقة، والسلاسل المهملة، وملفات MO الناتجة.