إن عائلة الوظائف gettext التي توفرها غنو هي من أفضل طرق ترجمة البرامج، يسمح ngettext بالتعامل مع رسال تشبه
Copying XXX File(s)
جار نسخ XXX ملف/ملفاتبطريقة أكثر آدمية (غير مصطنعة)، ففي هذا المثال يتم استبدال صيغ المعدود لكلمة "file" أو "ملف" بالصيغة المناسبة بحسب قيمة العدد XXX. يوضح كتيب غنو لمكتبة سي أمثلة وقوالب لعدة لغات، بعضها له صيغة واحدة بغض النظر عن العدد، ولغات أخرى قد تصل إلى أربع صيغ للمعدود. اللغة العربية ليست من بين اللغات المذكورة هناك. سبب الإرباك في اللغة العربية هو أننا لا نملك قواعد معرفة مسبقاً لصيغ المعدود، فما هو مشهور هو صيغ العدد وليس صيغ المعدود. على أي حال فإن ذلك من مرونة اللغة العربية، فسنرى التنوع الكبير والخيارات الأكثر الموجودة أمامنا.
بصفتي رياضي فإن هذا هو أول حل كان يجب أن أفكر به، لكنه كان الأخير (ربما لأننا نحن الرياضيون نتجاهل هذا الحل بعد أن نصل إليه؛ ها ها) الصيغة هي بالتأكيد كتالي
nplurals=1; plural=0وهي تعني أن لدينا صيغة واحدة (وهو عدد قليل برأي المتواضع)
جار نقل 0 من الملفات جار نقل 1 من الملفات جار نقل 2 من الملفات جار نقل 3 من الملفات جار نقل 11 من الملفات جار نقل 99 من الملفات جار نقل 100 من الملفات جار نقل 101 من الملفات جار نقل 103 من الملفاتفالأخيرة تقرأ "جار نقل ثلاثة ومئة من الملفات"، وهذا الحل صحيح قواعدياً لكنه يبدو مصطنعاً وغير طبيعي. يا لها من لغة مرنة!
وهو حل مؤقت صيغته:
nplurals=4; plural=n==1 ? 0 : n==2 ? 1 : n>=3 && n<=10 ? 2 : 3موزعة
جار نقل 0 ملف جار نقل ملف واحد (1) جار نقل ملفين إثنين (2) جار نقل 3 ملفات جار نقل 11 ملف جار نقل 99 ملف جار نقل 101 ملف جار نقل 103 ملفالأخيرة صحيح حيث تقرأ "جار نقل ثلاثة ومئة ملف" وليس "جار نقل مئة وثلاث ملفات".
قام فريق عرب-آيز 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
الصيغة هي
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;موزعة كتالي:
جار نقل 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 التقليدية.