صيغ المعدود في العربية عبر GNU ngettext

حقوق النسخ محفوظة 2007، عرب-آيز, مؤيد صالح السعدي<alsadi [AT] gmail [DOT] com>

هذه الوثيقة تصدر وفق رخصة GNU FDL

Arabic plural forms for GNU ngettext

copyright (c) 2004, Arabeyes.org, Muayyad Saleh Alsadi<alsadi [AT] gmail [DOT] com>

This document is released under terms of GNU FDL

إن عائلة الوظائف gettext التي توفرها غنو هي من أفضل طرق ترجمة البرامج، يسمح ngettext بالتعامل مع رسال تشبه

Copying XXX File(s)
جار نسخ XXX ملف/ملفات
بطريقة أكثر آدمية (غير مصطنعة)، ففي هذا المثال يتم استبدال صيغ المعدود لكلمة "file" أو "ملف" بالصيغة المناسبة بحسب قيمة العدد XXX. يوضح كتيب غنو لمكتبة سي أمثلة وقوالب لعدة لغات، بعضها له صيغة واحدة بغض النظر عن العدد، ولغات أخرى قد تصل إلى أربع صيغ للمعدود. اللغة العربية ليست من بين اللغات المذكورة هناك. سبب الإرباك في اللغة العربية هو أننا لا نملك قواعد معرفة مسبقاً لصيغ المعدود، فما هو مشهور هو صيغ العدد وليس صيغ المعدود. على أي حال فإن ذلك من مرونة اللغة العربية، فسنرى التنوع الكبير والخيارات الأكثر الموجودة أمامنا.

الحل البديهي: صيغة واحدة للمعدود

بصفتي رياضي فإن هذا هو أول حل كان يجب أن أفكر به، لكنه كان الأخير (ربما لأننا نحن الرياضيون نتجاهل هذا الحل بعد أن نصل إليه؛ ها ها) الصيغة هي بالتأكيد كتالي

nplurals=1; plural=0
وهي تعني أن لدينا صيغة واحدة (وهو عدد قليل برأي المتواضع) أمثلة
جار نقل 0 من الملفات
جار نقل 1 من الملفات
جار نقل 2 من الملفات
جار نقل 3 من الملفات
جار نقل 11 من الملفات
جار نقل 99 من الملفات
جار نقل 100 من الملفات
جار نقل 101 من الملفات
جار نقل 103 من الملفات
فالأخيرة تقرأ "جار نقل ثلاثة ومئة من الملفات"، وهذا الحل صحيح قواعدياً لكنه يبدو مصطنعاً وغير طبيعي. يا لها من لغة مرنة!

حل عرب-آيز الحالي: 4 صيغ

وهو حل مؤقت صيغته:

nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : n>=3 && n<=10 ? 2 : 3
موزعة
جار نقل 0 ملف
جار نقل ملف واحد (1)
جار نقل ملفين إثنين (2)
جار نقل 3 ملفات
جار نقل 11 ملف
جار نقل 99 ملف
جار نقل 101 ملف
جار نقل 103 ملف
الأخيرة صحيح حيث تقرأ "جار نقل ثلاثة ومئة ملف" وليس "جار نقل مئة وثلاث ملفات".

حل عرب-آيز التقليدي الغني: 6 صيغ

قام فريق عرب-آيز Arabeyes.org باستقراء قاعدة من 6 صيغ هي

nplurals=6; plural=n == 0 ? 0 : n == 1 ? 1 : n == 2 ? 2 : n >= 3 && n <= 10 ?
3 : n >= 11 && n <= 99 ? 4 : 5;
وهو يعني أن لدينا 6 صيغ (وهذا كثير في رأي المتواضع) موزعة كالتالي: كنت أظن (مخطأً) أن الأخيرة خطأ فهي إن كانت متبوعة بمفرد كانت كالتي قبلها وإن كانت متبوعة بجمع كانت خطأ. الفرق هو الحركات (التشكيل). الرسائل تبدو ذكية وطبيعية:
printf (ngettext ("copying %d file\n", "copying %d files\n", n), n);
فبعد ترجمتها تعطي
لم يتم نقل الملف بعد
جار نقل ملف واحد
جار نقل ملفين إثنين
جار نقل 3 ملفات
جار نقل 11 ملفاً
جار نقل 99 ملفاً
جار نقل 101 ملفٍ
جار نقل 103 ملفٍ
كما أنني كنت أظن أن الأخيرة خطأ، لكني كنت مخطأً مرة أخرى حيث أنها تقرأ من اليمين لليسار "ثلاثة ومئة".

إنها أفضل الصيغ المرشحة، لكنها قد تتسبب بمشاكل برمجية كما في:

printf (ngettext (
		"%s is copying %d file from %s to %s\n",
		"%s is copying %d files from %s to %s\n",
		n),
	pname, n ,"/some/where","/else/where");
فهي قد تتسبب في SEGFAULT عند القيم 0 و 1 و 2 بسبب حذف %d أثناء الترجمة مما يؤدي إلى تمرير العدد الصحيح إلى مكان السلسلة النصية '%s' الأولى. يمكن حل المشكلة مع 0 و 1 بطريقة سهلة أما الحل عند 2 فيمكن للمترجم الذكي الإلتفاف على المشكلة وذلك بوضع العدد بين قوسين فتصبح النتيجة
برنامج test ينقل 0 ملف من ‎/some/where‎ إلى ‎/else/where‎
برنامج test ينقل 1 ملف من ‎/some/where‎ إلى ‎/else/where‎
برنامج test ينقل ملفين إثنين (2) من ‎/some/where‎ إلى ‎/else/where‎
برنامج test ينقل 3 ملفات من ‎/some/where‎ إلى ‎/else/where‎
برنامج test ينقل 11 ملفاً من ‎/some/where‎ إلى ‎/else/where‎
برنامج test ينقل 103 ملفٍ من ‎/some/where‎ إلى ‎/else/where‎

حل معاصر: صيغتان

لقد استقرأت حلاً آخر بشكل مستقل، وهو يستند على الطريقة الشائعة المتداولة كتابةً وقراءةً حالياً وهي أن نقرأ الأرقام من اليسار لليمين إلا في أول منزلتين، وهي بالمناسبة طريقة صحيحة حيث أن تلك الأرقام تكون معطوفة على بعضها، قال تعالى: {ولبثوا في كهفهم ثلاث مائة سنين وازدادوا تسعا} آية 25 من سورة الكهف.

الصيغة هي

nplurals=2; plural=(n>9)?(n % 100 >2 && n % 100 < 11):(n >2);
والصيغتان هما: وهي تعطي نتيجة آمنة برمجياً، لكنها عند بعض القيمة تبدو مصطنعة:
جار نقل 0 ملف
جار نقل 1 ملف
جار نقل 2 ملف
جار نقل 3 ملفات
جار نقل 11 ملف
جار نقل 101 ملف
جار نقل 103 ملفات
جار نقل 127 ملف
إنها تبدو آلية عند 2 لكنها ليست خطأ (فإعرابها تمييز) ويمكن اعتبارها توسيع صحيح للغتنا المرنة. إنها من أبسط القواعد، فهي بصيغتين، لا تعطل البرامج، ولا تحتاج طرق إلتفافية، أما إن كنت ترى أن 2 ملفاً مصطنعة فكذلك وضعها بين قوسين في الحلول الأخرى.

ملاحظة: سكن تسلم، لا تضع أي علامة إعراب على أخر الصيغة فهي قد تكون مجرورة بالإضافة كما في 1000 ملفٍ أو تكون تمييز كما في 11 ملفاً

حل تقليدي مبسط: صيغتان

قمت بتعديل الحل الأخير ليستوعب طريقة القراءة من اليمين لليسار

nplurals=2; plural=(n<=2 || n>=11)?0:1;
موزعة كتالي: وهي تعطي نتائج نظيفة وكنها كسابقتها تظهر مصطنعة عند 2 انظر المثال:
جار نقل 0 ملف
جار نقل 1 ملف
جار نقل 2 ملف
جار نقل 3 ملفات
جار نقل 10 ملفات
جار نقل 11 ملف
جار نقل 99 ملف
جار نقل 103 ملف
وقد وضحنا أن ذلك مقبول لكن ما هو غير مقبول فيها تماماً كسابقتها هو الحاجة للتسكين.

الحل التقليدي النهائي: ثلاث صيغ

استناداً للحل السداسي من عرب-آيز قمت بتعديله لأزيل بعض الحالات الخاصة (التي أرى أن لا حاجة لها) ليبقى 3 حالات:

nplurals=3; plural=(n>99)?1:(n > 2 && n < 11)?2:0;
موزعة: وهو يعطي

جار نقل 0 ملفاً
جار نقل 1 ملفاً
جار نقل 2 ملفاً
جار نقل 3 ملفات
جار نقل 10 ملفات
جار نقل 11 ملفاً
جار نقل 99 ملفاً
جار نقل 100 ملفٍ
جار نقل 103 ملفٍ
مرة أخرى الحالات الحمراء 0 و 1 و 2 ليست خطأ، أما "ثلاثة ومئة ملفٍ" فهي وإن كانت صحيحة فهي غير مشهورة.

الخلاصة

إن لغتنا العربية مرنة جداً حيث يمكننا أن نستعمل الكثير من القواعد من 1 وحتى 6 صيغ. أيها الأنسب أنا لا أعلم، إليك جدول بالقواعد وأين تبدو كل واحدة مصطنعة.
القواعدالنقدمثال
one formغير بشريجار نقل 1 من الملفات
4 formsحذف العدد أو تعويضه داخل الأقواس في الحالات الأولى وحذف التشكيل-
6 formsحذف العدد أو تعويضه داخل الأقواس في الحالات الأولىلم يتم نقل أي ملف (0) أو جار نقل ملف واحد (1) أو جار نقل ملفين إثنين (2)
2 modern formsحالة الصفر والواحد والإثنين وحركات التشكيل إضافة إلى أنها ليست أصيلة بل مبتدعة في القراءة من اليسار لليمين بل والخلط كما في 127جار نقل 0 ملف ، جار نقل 2 ملف
2 classic formsالحالات الأولى حتى الإثنين وحركات التشكيل إلا أنها تتوافق مع الطريقة الأصيلة في القراءةجار نقل 0 ملف ، جار نقل 2 ملف
3 classical formsالحالات الثلاث الأولى لكنها تحل مشكلة التشكيل وبطريقة أصيلةجار نقل 0 ملفاً ، جار نقل 2 ملفاً
أنا أفضل الأخير (ذو الصيغ الثلاثة).

لقد وجدت أنه من المهم أن أوفر ثلاث نصوص تنفيذية للتحويل من: الصيغ 4 القديمة إلى 6 وآخر من 6 إلى 2 الحديثة أو 3 التقليدية.