Domanda

Stiamo localizzando il testo dell'interfaccia utente per un'applicazione Web in esecuzione su Java 5 e abbiamo un dilemma su come produrre messaggi definiti nei file delle proprietà, il tipo utilizzato da java.util.Properties .

Alcuni messaggi includono un segnaposto che verrà riempito usando java.text.MessageFormat . Ad esempio:

search.summary = Your search for {0} found {1} items.

MessageFormat è fastidioso, perché una singola citazione è un carattere speciale, nonostante sia comune nel testo inglese. Devi digitare due per una singola citazione letterale:

warning.item = This item''s {0} is not valid.

Tuttavia, tre quarti dei circa 1000 messaggi dell'applicazione non includono un segnaposto. Ciò significa che possiamo emetterli direttamente, evitando MessageFormat e lasciare da soli le virgolette singole:

help.url = The web page's URL

Domanda: dovremmo usare MessageFormat per tutti i messaggi, per una sintassi coerente, o evitare MessageFormat dove possiamo, quindi la maggior parte dei messaggi non ha bisogno di scappare?

Esistono chiaramente pro e contro in entrambi i modi.

Nota che la documentazione API per MessageFormat riconosce il problema e suggerisce una non soluzione:

  

Le regole per l'uso delle virgolette all'interno   modelli di formato del messaggio purtroppo   hanno dimostrato di essere un po 'confuso.   In particolare, non è sempre ovvio   ai localizzatori se virgolette singole   bisogno di essere raddoppiato o no. Assicurarsi   informare i localizzatori sulle regole,   e dirglielo (per esempio, usando   commenti nella fonte del pacchetto di risorse   file) quali stringhe verranno elaborate   di MessageFormat.

È stato utile?

Soluzione

Basta scrivere la propria implementazione di MessageFormat senza questa fastidiosa funzionalità. Puoi guardare il codice di SLF4J Logger .

Hanno la loro versione del formattatore dei messaggi che può essere usata come segue:

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);

I segnaposto vuoti potrebbero essere utilizzati con l'ordinamento predefinito e numerati per alcuni casi di localizzazione in cui lingue diverse fanno permutazioni di parole o parti di frasi.

Altri suggerimenti

Alla fine abbiamo deciso di affiancare il problema delle virgolette singole usando sempre & # 8216; ricci & # 8217; cita:

warning.item = This item\u2019s {0} is not valid.

Usa il carattere `invece di 'per il preventivo. Lo usiamo continuamente senza problemi.

Usa MessageFormat solo quando ne hai bisogno, altrimenti gonfiano il codice e non hanno alcun valore aggiuntivo.

Secondo me, la coerenza è importante per questo genere di cose. I file delle proprietà e MessageFormat presentano già molte limitazioni. Se trovi questi problemi potresti & Quot; compilare & Quot; i tuoi file delle proprietà per generare quelli correttamente formati. Ma direi di usare MessageFormat ovunque. In questo modo, man mano che mantieni il codice non devi preoccuparti di quali stringhe sono formattate e quali no. Diventa più semplice da gestire, poiché puoi trasferire l'elaborazione dei messaggi a una libreria e non preoccuparti dei dettagli ad alto livello.

Un'altra alternativa ... Quando si carica il file delle proprietà, basta avvolgere l'inputstream in un FilterInpuStream che raddoppia ogni singola citazione.

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