دليل المترجم/ملفات po
تستخدم مشاريع الترجمة في عربآيز صيغة ملفات .po ، وهذه المقالة تشرح بنية هذه الملفات وكيفية التعامل معها.
محتويات
- 1 ملفات 'PO' و 'POT'
- 2 بنية ملفات 'PO'
- 3 الملاحظات ضمن 'msgid' ('_:')
- 4 كلمات خاصة ضمن 'msgid' ) 'Comment=' أو 'Name=' أو غيرها)
- 5 أوامر HTML ضمن 'msgid'
- 6 الأسطر الجديدة وعلامات التنقيط ضمن 'msgid'
- 7 نصوص 'msgstr' ذات السرد المتعدد لصيغ الجمع
- 8 مفاتيح الوصول والشرطة السفلى في 'msgid'
- 9 الأسماء والاختصارات بداخل 'msgid'
- 10 الأحرف الخاصة ضمن 'msgid'
ملفات 'PO' و 'POT'
بيئات سطح المكتب الرسومية مثل كدي وجنوم والتطبيقات العديدة التي تشملها مكتوبة بلغات C/C++ البرمجية. ترجمة هذه البيئات تعني ترجمة عشرات الآلاف من النصوص الظاهرة للمستخدم من لغتها الأم -أي الإنجليزية- للغة المطلوبة، وهي العربية. لا يتم هذا عن طريق نسخ الشفرة المصدرية واستبدال كل النص الإنجليزي بمقابله العربي، بل إنه يتم بترجمة النصوص المستخرجة مسبقاً في ملفات عديدة كي تسهل العملية بأكملها. بذلك، يتم استخلاص النصوص الظاهرة للمستخدم من الشفرة المصدرية باستخدام برنامج يسمى 'gettext'. تؤخذ هذه النصوص ثم تخزن في ملف نصّي ذي امتداد '.pot'. يعني هذا الامتداد أن الملف لم يُترجم بعد، أي أنه بصيغته الأصلية. إذا أردت البدء بترجمة ملف من نوع 'POT'، فعليك أولاً إعادة تسميته بنفس الاسم ولكن بامتداد '.po'. لنقل أنك تريد البدء بترجمة الملف 'filename.pot'، فإنك حينها تستخدم الأمر:
$ mv filename.pot filename.po
اعمل على ترجمة الملف وعندما تكون راضياً عن كمّ العمل الذي أنجزته، قم بما يلي:
$ svn delete filename.pot $ svn add filename.po $ svn commit
يعني الامتداد '.po' أن الترجمة بُدأت على هذا الملف، دون أن تعني بالضرورة أنها انتهت. تذكر رجاءً ألا تترجم ملفات 'POT' إطلاقاً. إما أن تكون الملفات التي تقوم بترجمتها ذات امتداد '.po' أو أنك ستجبر على أن تعيد تسميتهم بناءً على ما سبق شرحه. لست مجبراً على تغيير امتداد الملفات 'POT' التي لا تنوي ترجمتها في المستقبل القريب. إعادة التسمية هذه أصبحت تعني نوعاً ما أن الشخص الذي قام بإعادة التسمية يملك الملفات وسيكون عاملاً عليها. إن كان لديك أية أسئلة أو شكوك، راسل قائمة التوثيق البريدية. في وقت التنفيذ، سوف تقوم بيئة سطح المكتب بتحميل النصوص الظاهرة للمستخدم من ملفات 'PO' للغة المطلوبة وتقوم بإظهارها تباعاً دون أي تغيير ظاهر في عمل البرنامج. إذا كانت الترجمة غير مكتملة، فسوف تقوم البيئة بإظهار النص الإنجليزي حيث تفتقد الترجمة. الأقسام اللاحقة سوف تعطيك بعض التعليمات فيما يخص طريقة ترجمة ملفات 'PO'. تذكر أنه بإمكانك دائماً أن تستخدم قائمة الترجمة البريدية عندما يكون لديك أي تساؤلات، حيث أنه من غير الواقعي أن ندعي أن هذه التعليمات تحل كل المشكلات التي قد يواجهها المترجم. نشجّع المترجمين كذلك على مراجعة الملفات المترجمة مسبقاً في مستودع SVN فرصةً جيدةً للتعلم أكثر حول الأمور المدوّنة.
بنية ملفات 'PO'
العنوان الرأسي
تحتوي كل الملفات معلومات مرتبطة بها فيما يتعلق بمن قام بالترجمة، وما هو التشفير المستخدم، بيانات تواريخ متعددة، كوقت الإنشاء والمراجعة ..إلخ. هذه المعلومات كلها تخزن ضمن بداية الملف. هذه المعلومات طبعاً قابلة للتغيير؛ حيث أنها قابلة للتعديل. فيما يلي، عنوان رأسي لملف منشأ جديد:
#, fuzzy msgid "" msgstr "" "Project-Id-Version: desktop files\n" "POT-Creation-Date: 2002-08-14 03:34+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n "
مع كل الملفات الجديدة؛ عليك إزالة السطر "#, fuzzy" وإضافة هذا السطر إلى بداية الملف "# translation of filename.po to Arabic" مستبدلاً "filename.po" بالاسم المناسب للملف الذي تقوم بترجمته، وإضافة معلومات حقوق النشر "# Copyright (C) 2003 Free Software Foundation, Inc." ثم يمكنك إضافة اسمك وعنوانك البريدي بعد سطر حقوق النشر، وستكون هذه لائحة أسماء المترجمين. بعد ذلك، استبدل "Last-Translator:"، "Language-Team:"، "Content-Type:" و "Content-Transfer-Encoding:" بحيث يظهرون كما هو مبين أدناه، ولا تهتم بأي شيء آخر موجود أو غير موجود للوقت الحالي. إن كنت ستستخدم محرر نصوص كي تترجم الملفات، على خلاف أداة الترجمة كيبيبل، فتذكر كذلك أن تقوم بتحديث السطر "PO-Revision-Date:" في كل مرة تحفظ فيها الملف. فيما يلي، مثال على العنوان الرأسي خلال عمل الترجمة، أو بعد الانتهاء منها:
# translation of desktop_kde-i18n.po to Arabic # desktop.po - Arabic Translation. # Copyright (C) 2001,2002,2003 Free Software Foundation, Inc. # Name1 Surname1 <A_address/@domain_1.com>, 2001. # Name2 Surname2 <B_address/@domain_2.net>, 2002 # Name3 Surname3 <C_address/@domain_3.org>, 2002,2003 # msgid "" msgstr "" "Project-Id-Version: desktop_kde-i18n\n" "POT-Creation-Date: 2003-03-02 20:47+0100\n" "PO-Revision-Date: 2003-02-26 21:27+0200\n" "Last-Translator: Name3 Surname3 <C_address/@domain_3.org>\n" "Language-Team: Arabic <support at arabeyes.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: KBabel 1.0.1\n "
الأسطر التي تبدأ بالعلامة '#' هي ملاحظات. إن كنت تستخدم برنامج ترجمة مثل كيبيبل، فإن بعض الحقول الرئيسية مثل "X-Generator:" سيتم إنشاؤها تلقائياً. إن كنت تعمل على ملف 'PO' بدأ أحد آخر بترجمته مسبقاً، وقمت بتغييرات كبيرة، فقم فقط بإضافة اسمك إلى لائحة المترجمين وضع اسمك وعنوانك البريدي في الحقل "Last-Translator:"، بعد التحقق من أن الشخص الذي كان اسمه في الحقل "Last-Translator:" مضاف مسبقاً إلى لائحة المترجمين، وإلا فأضف اسمه إليها. تأكد أيضاً من أن الحقول المذكورة أعلاه تحتوي على القيم الكاملة والصحيحة، وإلا فعدِّلها. تذكر دائماً أن تضيف اسمك إلى لائحة المترجمين. ذلك مهم جداً حتى نعلم من قام بالتعديل الأخير على الملف وللتأكد من أنك تحصل على الجزاء الذي تستحقه لعملك :-)
المحتوي والنصوص
بعد العنوان الرئيسي، يحتوي ملف 'PO' على أسطر من 'msgid' و 'msgstr'، يسبقها في بعض الأحيان ملاحظات حول الموقع بالضبط الذي تظهر فيه هذه النصوص في الشفرة المصدرية (هذا النوع من الملاحظات يبدأ بعلامة "#:" في أول السطر). يكون السطر 'msgid' محتوياً مسبقاً على النص الإنجليزي الذي يجب ترجمته. ما يجب على المترجم عمله هو أن يضيف إلى 'msgstr' ترجمة ما هو مكتوب في 'msgid' باللغة العربية، دون حذف علامة التنصيص ' " '. فيما يلي، أمثلة منتقاة من ملفات 'PO' مختلفة،
#: finddialog.cpp:55 msgid "Galaxies" msgstr "مجرّات"
msgid "" "_: do not use a target symbol\n" "No Symbol" msgstr ""
#: src/acme.h:80 #, fuzzy msgid "Eject key" msgstr "مفتاح الإخراج"
أول 'msgid' مترجم ببساطة، أما السطر الثاني فليس مترجماً بعد، ولذلك يظهر 'msgstr' فارغاً. السطر الثالث مترجم إلا أن المترجم وضع عبارة "#, fuzzy" قبل المجموعة. المؤشر "fuzzy" هو طريقة يستطيع بها المترجم الإشارة إلى أنه غير متأكد من المصطلح وأن المراجعة مطلوبة. العلامة "#," هي ذات أهمية كبيرة، حيث أنها ترتيب أحرف معين. ومن المهم أن تلاحظ أن عبارة "#, fuzzy" يجب أن تسبق السطر 'msgid'.
الملاحظات ضمن 'msgid' ('_:')
نصوص 'msgid' التي تبدأ بـ '_:' تشير إلى وجود ملاحظة لتساعد المترجم أو تعطيه معلومات أكثر حول الرسالة المطلوب ترجمتها. تنتهي الملاحظة بسطر جديد '\n' (new line). لا تترجم ملاحظة المساعدة، ضع ببساطة فقط ترجمة ما يلي الملاحظة و '\n' بناءً على ما فهمته من توجيهها لك. مثال:
#: cupsdconf.cpp:808 cupsdconf.cpp:831 cupsdconf.cpp:847 msgid "" "_: Base\n" "Root" msgstr "" "الجذر"
كلمات خاصة ضمن 'msgid' ) 'Comment=' أو 'Name=' أو غيرها)
ترجم فقط ما يلي الحرف '=' بإبقاء النص دون تغيير، أي لا تقم بترجمة أو تعديل الكلمة "Comment" أو "Name"؛ أبق الكلمات بالإنجليزية. مثال:
#: kde-i18n/vi/messages/entry.desktop:1 msgid "Name=Vietnamese" msgstr "Name=الفييتنامية"
أوامر HTML ضمن 'msgid'
تستخدم بعض التطبيقات مزايا النصوص الغنية (للفقرات، والألوان، والخطوط العريضة.. إلخ) كي تجعل النصوص تظهر بشكل أجمل. يتم هذا باستخدام أوامر HTML كمثل "" على سبيل المثال. من المهم جداً أن تبقي النص المترجم مع كل هذه الأوامر. هذا هو الحال أيضاً بالنسبة لأحرف الطباعة للغة C كمثل "\n" أو "\t" أو "%s" وما شابه ذلك. ترجم النص بين الأوامر فقط. أيضاً، تذكر أنك عندما تستخدم وضع الإدخال ذي الاتجاه الأيمن-إلى-الأيسر -أي أنك تطبع باللغة العربية- قد يبدو التتالي "\n" غريباً. في أي من الوضعين، تذكر أنك يجب أن تبدأ بالحرف "\" ثم "n" بغض النظر عن كيفية ظهورهما على الشاشة. مثال:
#: kio/kio/global.cpp:451 msgid "</p><p>Details of the Request:" msgstr "</p><p>تفاصيل الطّلب:"
الأسطر الجديدة وعلامات التنقيط ضمن 'msgid'
أبق علامات التنقيط في النص المترجم على ما هي عليه في النص الأصلي. يجب أن تتضمن أيضاً الأسطر الجديدة. أي؛ إذا كان هناك عدة نصوص في 'msgid' واحدة، يجب أن تشابه 'msgstr' النص الأصلي من حيث عدد الأسطر، ويجب تجاهل الأسطر التي تبدأ بـ "_:" كما هو مبيّن أعلاه، حيث أنها مجرد ملاحظات. راجع المثال comments.
نصوص 'msgstr' ذات السرد المتعدد لصيغ الجمع
ميزة الصيغ المتعددة هي توفر إمكانية إظهار الكلمات بالصيغ الصحيحة بناءً على الكمية. تميّز الكميات بالعلامة "%n". مثال:
msgid "_n: one cat\n" "%n cats" msgstr "قطّة واحدة\n" "قطّتان\n" "%n قطط\n" "%n قطّة"
سطر 'msgstr' الأول يظهر عندما يكون لدينا قطة مفردة. أما الثاني فيظهر عندما يكون هناك قطتان. والثالث يظهر عندما يكون هناك ثلاث وحتى عشر قطط. أما السطر الأخير فيظهر عندما يكون عدد القطط أكثر من أو مساوٍ لإحدى عشرة قطة. ليس هناك داعٍ لإضافة "_n" في النص المترجم. لا تنسَ أن تستخدم علامة "\n" للفصل بين المدخلات المختلفة.
مفاتيح الوصول والشرطة السفلى في 'msgid'
الأحرف التي يسبقها الحرف ("_") تسمى مفاتيح الوصول أو المسرّعات. يستخدم مفتاح الوصول بغرض الوصول المباشر إلى القائمة بدلاً من اختيارها بواسطة الفأرة أو المؤشر. تجب ترجمة المسرّعات لتتناسب مع لوحة المفاتيح العربية. هذا يعني أنه عليك أن تختار حرفاً من الكلمة، أو الجملة، ليكون مُسرّعاً. حاول ألّا تعيّن الحرف نفسه لمُسرّعين في نفس القائمة؛ يمكنك أن تحزر ذلك من موضع وجود 'msgid' على سبيل المثال. قاعدةً أساسيةً؛ عيّن الحرف الأول من الكلمة مُسرّعاً، وإن كان ذلك الحرف مستخدماً كمفتاح وصول في النص الحالي، عيّن الحرف الثاني، وهلم جرى. رجاءً، حاول أن تكون متناسقاً.
الأسماء والاختصارات بداخل 'msgid'
الأسماء - الناس، الأماكن، بعض البرامج - يمكن ترجمتها حرفياً إلى العربية، والبعض الآخر يمكن ترجمته بالكامل أو جزئياً إلى العربية. الاختصارات كمثل ASCII وHTTP وC++ إلخ، يجب أن تبقى كما هي بالأحرف اللاتينية. وهذا تماماً هو الحال بالنسبة لأسماء التصنيفات، والمتغيرات، إلخ. تذكر أن تقرأ مقاييس التوثيق العربي. إن كنت في شك، راسل قائمة التوثيق 'doc' البريدية.
الأحرف الخاصة ضمن 'msgid'
بعض الأحرف الخاصة مثل "&" يجب أن تدخل مرتين لتخبر المدقق أن يبقيها كما هي. رجاءً قم بترجمة هذا وأخذه بعين الاعتبار عند الحاجة. مثال:
#: rc.cpp:19 msgid "Color && Animation" msgstr "اللّون و الحركة"