Usando Seleziona con MessageFormat
-
12-12-2019 - |
Domanda
Sto usando messageformat (parte dell'estensione intl
) in PHP. L'estensione utilizza ICU 4.6.1.
Tuttavia, il problema non è con PHP.
Vorrei formattare un pezzo di stringa facendo una decisione sul primo token {0}
:
- .
- Quando
{0}
è0
, il testo dovrebbe esserea
- Quando è
1
, il testo dovrebbe essereb
- Per tutti gli altri casi, il testo dovrebbe essere
c
Compreso che questo potrebbe essere fatto con plural
, =0
per il custodia 0
, ma attraverso i miei test, non sembra funzionare, molto probabilmente perché sono stati introdotti offset e plurali personalizzati in 4.8.
Io sono così, cercando di eseguire ciò usando select
:
{0, select, 0 {a} other {{0,plural,one{b}other{c}}}}
.
Tuttavia, per qualche motivo, il formato del messaggio non è stato in grado di formattare i generatori sopra e restituisce false
(impossibile formattare).
Perché è così il caso? C'è un problema con la mia sintassi?
.
Aggiornamento rapido: dopo alcuni scavo, sembra che non possa usare Selezionare per abbinare i valori che iniziano con un numero. Ci sono modi per aggirare questo?
Un altro aggiornamento: aggiornato a ICU 49.1.2 e intl
3.0.0a2. Ora posso usare =0
, =1
, ecc., Ma questo ha smesso di funzionare (funzionava in precedenza):
{0}{0, plural, one{a} other{b}}
.
Dove funziona:
{0, plural, one{a} other{b}}
. Soluzione
Ho finito l'aggiornamento alla versione più recente di intl
e ICU 49.1.2.
Tuttavia, una volta che è stato fatto, questo non funzionerebbe:
{0}{0, plural, one{a} other{b}}
.
Ma questo funzionava:
{0, plural, =0{a} one{# b} other {# c}}
. Altri suggerimenti
Il tipo di argomento select
è una corrispondenza di stringa esatta.Dovresti assicurarti di superare un valore di argomenti di stringa, e quindi avere clausole che corrispondono.Evitare di usare plurali per corrispondenza esatta, poiché ogni locale ha le proprie regole per ciò che significa one
.
La seguente dovrebbe darti quello che vuoi, ma so molto di più sul formato rispetto all'implementazione PHP.
MessageFormatter::formatMessage($locale,
'{0, select, _0 {a} _1 {b} other {c}}',
array( "_$value" ))
.