Dovrei usare java.text.MessageFormat per i messaggi localizzati senza segnaposto?
-
20-08-2019 - |
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.
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.