Frage

Wir hatten eine Menge von Strings, die die gleiche Unterkette enthalten, von Sätzen über das Protokoll überprüft oder wie man den Support kontaktieren, um Branding-Strings wie die Firmen- oder Produktnamen enthält. Die Wiederholung wurde ein paar Probleme für sie selbst verursacht (in erster Linie Fehler oder Kopieren / Einfügen Fehler), aber es verursacht auch Probleme, dass sie die Menge an Text erhöhen unsere Übersetzer übersetzen muss.

Die Lösung kam ich mit ging etwas wie folgt aus:

public class ExpandingResourceBundleControl extends ResourceBundle.Control {
  public static final ResourceBundle.Control EXPANDING =
    new ExpandingResourceBundleControl();

  private ExpandingResourceBundleControl() { }

  @Override
  public ResourceBundle newBundle(String baseName, Locale locale, String format,
                                  ClassLoader loader, boolean reload)
    throws IllegalAccessException, InstantiationException, IOException {

      ResourceBundle inner = super.newBundle(baseName, locale, format, loader, reload);
      return inner == null ? null : new ExpandingResourceBundle(inner, loader);
  }
}

ExpandingResourceBundle Delegierten des realen Ressourcenbündel, sondern führt Konvertierung von {{}} this.kind.of.thing den Schlüssel in den Ressourcen zu suchen.

Jedes Mal, wenn eine von ihnen erhalten möchten, müssen Sie gehen:

ResourceBundle.getBundle("com/acme/app/Bundle", EXPANDING);

Und das funktioniert gut -. Eine Zeit lang

Was schließlich passiert ist, dass einige neue Code (in unserem Fall automatisch generierte Code, spuckte wurde von Matisse aus) sieht das gleiche Ressourcenpaket, ohne das benutzerdefinierte Steuerelement angeben. Dies scheint zu sein, nicht reproduzierbar, wenn Sie einen einfachen Unit-Test schreiben, die es mit aufrufen und dann ohne, aber es tritt auf, wenn die Anwendung für Echt ausgeführt wird. Irgendwie ist der Cache innerhalb ResourceBundle wirft den guten Wert und ersetzt sie durch die gebrochenen ein. Ich bin noch herauszufinden, warum und Sun Jar-Dateien ohne Debug-Informationen kompiliert wurden, so Debuggen es eine lästige Pflicht ist.

Meine Fragen:

  1. Gibt es eine Möglichkeit global den Standard ResourceBundle.Control einstellen, dass ich nicht bewusst sein könnte? Das würde alles lösen eher elegant.

  2. Gibt es eine andere Möglichkeit, diese Art der Sache des Umgang mit elegant, vielleicht ohne überhaupt mit den Resource Klassen Manipulation?

War es hilfreich?

Lösung

Ich denke, dies ist ein grundlegender Fehler in der Art und Weise zu Resource Funktion ausgelegt sind: Tasten, der Bezug andere Tasten verletzen automatisch die DRY (Sie wiederholen sie nicht) Prinzip. Die Art, wie ich dazu gekommen, dies zu Ihrer Methode ähnlich war: eine ReflectiveResourceBundle Klasse erstellen, die Sie Ressourcenschlüssel in den Nachrichten, die EL-Notation angeben kann,

.

Der falsche Weg:

my.name.first=Bob
my.name.last=Smith
my.name.full=Bob Smith

DER RICHTIGE WEG:

my.name.first=Bob
my.name.last=Smith
my.name.full=${my.name.first} ${my.name.last}

Ich habe uploaded der Code auf GitHub , so dass Sie oder jemand anderes können Sie kostenlos herunterladen es. Darüber hinaus habe ich einige Beispiel-Code für jedermann mit dem Streifen-Framework hinzugefügt ( http://www.stripesframework.org/ ) Sie schnell nach oben und zum laufen zu bringen.

Der Trick dies mit Standard-JSTL fmt Taglibs zur Arbeit zu bekommen war einen Abfangjäger einrichten, die die HttpServletRequest Ressource mit unserer eigenen ersetzt. Der Code sieht etwa so aus:

ResourceBundle bundle = MyStaticResourceHoldingTheBundle.getBundle();
Config.set(request, Config.FMT_LOCALIZATION_CONTEXT, new LocalizationContext(bundle, locale));

Werfen Sie einen Blick auf die stripes.interceptor Paket in den oberen Link für weitere Informationen.

Andere Tipps

Wenn die Zeichenfolge Wiederholungen sind im Sinne lokalisiert, dass Sie eine bestimmte Zeichenfolge wissen wird wiederholt, aber nur innerhalb eines Projektes, so dass gemeinsamen Nutzung Ressourcenbündels ist kein Design Alptraum, dann könnten Sie die Saiten nach unten in mehrere Tasten brechen Wert Teile. Trennen Sie die Teile, die Wiederholung von denen, die nicht tun und Wiederverwendung der wiederholten Teile. Zum Beispiel kann sagen, Sie die folgenden zwei Saiten haben Sie Anzeige müssen:

  1. "The Red-capped Robin ist ein kleiner Singvogel in Australien heimisch."
  2. "The Red-capped Robin ist in weiten Teilen des Kontinents in Trockenregionen gefunden."

Das Ressourcenpaket könnte wie folgt aussehen:

robin.name=The Red-capped Robin
robin.native=is a small passerine bird native to Australia.
robin.region=is found in dryer regions across much of the continent.

und dann kombinieren, um die erforderlichen Teile bei Bedarf bundle.getString("robin.name")+bundle.getString(robin.native).

Eine Sache, die Sie allerdings vorsichtig sein müssen, ist, dass die Grammatikregeln wie Subjekt-Prädikat Ordnung usw. nicht in allen Sprachen gleich sein könnten. So müssten Sie ein wenig vorsichtig, wenn Splitting Sätze sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top