Utilisation de select avec le format de message
-
12-12-2019 - |
Question
j'utilise Format du message (partie de la intl
extension) en PHP.L'extension utilise ICU 4.6.1.
Cependant, le problème ne vient pas de PHP.
Je voudrais formater un morceau de chaîne en prenant une décision sur le premier jeton {0}
:
- Quand
{0}
est0
, le texte doit êtrea
- Lorsqu'il est
1
, le texte doit êtreb
- Pour tous les autres cas, le texte doit être
c
Je comprends que cela pourrait être fait avec plural
, =0
pour le 0
cas, mais d'après mes tests, cela ne semble pas fonctionner, probablement parce que les décalages et les pluriels personnalisés ont été introduits dans la version 4.8.
J'essaie donc d'accomplir cela en utilisant select
:
{0, select, 0 {a} other {{0,plural,one{b}other{c}}}}
Cependant, pour une raison quelconque, le formateur de message n'a pas pu formater ce qui précède et renvoie false
(impossible de formater).
pourquoi est-ce le cas?Y a-t-il un problème avec ma syntaxe ?
Mise à jour rapide :Après quelques recherches, il semble que je ne puisse pas utiliser select pour faire correspondre les valeurs commençant par un nombre.Existe-t-il des moyens de contourner ce problème ?
Autre mise à jour :Mise à jour vers ICU 49.1.2 et intl
3.0.0a2.Je peux maintenant utiliser =0
, =1
, etc., mais cela a cessé de fonctionner (fonctionnait auparavant) :
{0}{0, plural, one{a} other{b}}
où comme cela fonctionne:
{0, plural, one{a} other{b}}
La solution
J'ai fini par mettre à jour vers la dernière version de intl
et USI 49.1.2.
Cependant, une fois cela fait, cela ne fonctionnerait plus :
{0}{0, plural, one{a} other{b}}
Mais cela a fonctionné :
{0, plural, =0{a} one{# b} other {# c}}
Autres conseils
Le select
le type d'argument est une correspondance exacte de chaîne.Vous devez vous assurer que vous transmettez une valeur d'argument de chaîne, puis avoir des clauses qui correspondent.Évitez d'utiliser des pluriels pour une correspondance exacte de la casse, car chaque langue a ses propres règles sur ce que one
moyens.
Ce qui suit devrait vous donne ce que vous voulez, mais j'en sais beaucoup plus sur le format que sur l'implémentation PHP.
MessageFormatter::formatMessage($locale,
'{0, select, _0 {a} _1 {b} other {c}}',
array( "_$value" ))