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 essere a
  • Quando è 1, il testo dovrebbe essere b
  • 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}}
.

È stato utile?

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" ))
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top