باستخدام تحديد مع مساجيفورمات
-
12-12-2019 - |
سؤال
أنا أستخدم رسالة (جزء من 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" ))