2016-11-18 1 views
0

Wir verwenden MessageFormat, um Übersetzungen in unserer Anwendung zu verwalten. Wir haben eine Wrapper-Klasse (TranslationWrapper), die den Übersetzungsschlüssel und seine Parameter enthält.Formatieren rekursiv mit Locale in MessageFormat

Wenn eine übersetzte Nachricht angezeigt wird, wird es mit diesem Befehl

String message = new MessageFormat(translationKey, aLocale).format(parameters); 

formated Wo translationKey in einem Format ist ähnlich zu „-Nachricht {0} {1}“, und Parameter, wird ein Objekt-Array, die Werte enthalten, für {0} und {1}.

Da jedes Objekt als Parameter verwendet werden kann, verwenden wir oft unseren TranslationWrapper als Parameter. Dies ermöglicht es uns, lokalisierte Strings zu erstellen, die auf implizierten Übersetzungsschlüsseln basieren.

Für jedes Objekt, das als Parameter übergeben wird, wird die Methode toString() aufgerufen. Die toString()-Methode von TranslationWrapper wird automatisch mit dem Gebietsschema des aktuellen Benutzers übersetzt, aber manchmal möchte ich ein anderes Gebietsschema verwenden.

Da ich diese verschiedenen Locale zum MessageFormat in seinem Konstruktor übergeben, würde ich gerne wissen, ob es einen Weg gibt Strings in MessageFormat erzeugt werden, um die Parameter einen Griff auf dem Weg zu haben, wenn Werte wie {0} zu ersetzen. Anstatt den Aufruf der toString() Methode auf dem TranslationWrapper, würde Ich mag, wie etwas nennen:

toString(locale); 

wo locale die Locale ist ich in den Konstruktor übergeben.

Antwort

1

Dies ist ziemlich hässlich Lösung, aber Sie es aktuelle Locale in Thread lokale Variable verwenden, innerhalb toString Methode festlegen können (sofern eingestellt):

private static final ThreadLocal<Locale> threadLocale = new ThreadLocal<Locale>(); 

... 

public String translate(String translationKey, Locale aLocale, Object ...parameters) { 

    Locale previousLocale = threadLocale.get(); 
    try { 
     threadLocale.set(aLocale); 
     return new MessageFormat(translationKey, aLocale).format(parameters); 
     ... 
    } finally { 
     threadLocale.set(previousLocale); 
    } 
} 

// somewhere in toString method threadLocale.get() will return you current Locale 
+0

Noch viel weniger hässlich als die Abhilfe, die ich im Sinn hatte, . Als Referenz für andere wie mich, die nicht über Gewinde lokale Variablen wissen, hier ist ein Deklaration Beispiel: 'private statische final ThreadLocal threadLocale = new ThreadLocal ();' –

+0

Ich werde dies in die Antwort setzen – hoaz

Verwandte Themen