سؤال

أنا أستخدم رسالة (جزء من intl تمديد) في بي إتش بي.يستخدم الامتداد وحدة العناية المركزة 4.6.1.

ومع ذلك ، فإن المشكلة ليست مع فب.

أود تنسيق قطعة من السلسلة عن طريق اتخاذ قرار بشأن الرمز المميز الأول {0}:

  • عندما {0} هو 0, ، يجب أن يكون النص a
  • عندما يكون 1, ، يجب أن يكون النص b
  • بالنسبة لجميع الحالات الأخرى ، يجب أن يكون النص c

أنا أفهم أن هذا يمكن القيام به مع plural, =0 من أجل 0 الحالة ، ولكن من خلال الاختبار الذي أجريته ، لا يبدو أنها تعمل ، على الأرجح لأنه تم تقديم الإزاحات وصيغ الجمع المخصصة في 4.8.

أنا بالتالي ، في محاولة لتحقيق ذلك باستخدام select:

{0, select, 0 {a} other {{0,plural,one{b}other{c}}}}

ومع ذلك ، لسبب ما ، لم يتمكن منسق الرسالة من تنسيق ما ورد أعلاه وإرجاعه false (تعذر التنسيق).

لماذا هذا هو الحال?هل هناك مشكلة مع بناء الجملة بلدي?


تحديث سريع:بعد بعض الحفر ، يبدو أنه لا يمكنني استخدام التحديد لمطابقة القيم التي تبدأ برقم.هل هناك أي طرق حول هذا?

تحديث آخر:تحديث إلى وحدة العناية المركزة 49.1.2 و intl 3.0. 0 أ2.يمكنني الآن استخدام =0, =1, ، إلخ ، لكن هذا توقف عن العمل (كان يعمل سابقا):

{0}{0, plural, one{a} other{b}}

حيث يعمل هذا:

{0, plural, one{a} other{b}}
هل كانت مفيدة؟

المحلول

انتهى بي الأمر بالترقية إلى أحدث إصدار من intl وحدة العناية المركزة 49.1.2.

ومع ذلك ، بمجرد الانتهاء من ذلك ، لن ينجح هذا:

{0}{0, plural, one{a} other{b}}

لكن هذا نجح:

{0, plural, =0{a} one{# b} other {# c}}

نصائح أخرى

ال select نوع الوسيطة هو تطابق سلسلة بالضبط.ستحتاج إلى التأكد من أنك تقوم بتمرير قيمة وسيطة سلسلة ، ثم لديك جمل تتطابق.تجنب استخدام صيغ الجمع لمطابقة الحالة بالضبط ، لأن كل لغة لها قواعدها الخاصة لما one يعني.

ما يلي ينبغي تعطيك ما تريد ، ولكن أنا أعرف أكثر من ذلك بكثير عن شكل من تنفيذ فب.

MessageFormatter::formatMessage($locale,
  '{0, select, _0 {a} _1 {b} other {c}}',
  array( "_$value" ))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top