Java Getriebe

Java und NetBeans

Nicht lokalisierte Zeichenketten finden in NetBeans Anwendungen

Jeder Anwendungsentwickler wird früher oder (selten) später auf das Thema der Mehrsprachigkeit stoßen. Java bietet mit den ResouceBundle Konzept dankenswerterweise eine sehr einfach Lösung hierzu an. Tools wie OmegaT erlauben eine einfache Übersetzung dieser Properties-Dateien so dass auch größere Anwendungen mit vergleichsweise geringem Aufwand zu übersetzen sind.

Die entscheidende Voraussetzung für eine Übersetzung ist allerdings, dass die Zeichenketten in der Anwendung nicht „hardcodiert“ im Quelltext stehen, sondern schön über die Klasse ResouceBundle aus den Propertiesdateien gelesen werden. Die Suche nach diesen „hardcodierten“ String kann gerade in komplexen und modularen Anwendungen wie einer NetBeans Rich Client Anwendung recht mühsam sein.

Auf der Seite netbeans.org/i18n/ 1 finden sich zahlreiche Informationen dazu, was in NetBeans alles „lokalisiert“ werden kann. Die Plattform bietet aber ein spezielles Feature an, mit dem die hardcodierten Zeichenketten recht schnell identifiziert werden können:

Innerhalb der RCP-Anwendung werden String in der Regel nicht mit ResourceBundle direkt sonder über die Utilities Klasse NbBundle geladen. Diese Klasse wertet die Systempropery org.openide.util.NbBundle.DEBUG aus und ergänzt jeden String mit einer zusätzlichen „Markierung“, wenn dieser Wert auf true gesetzt ist. Jeder hardcodierte String hat diese Markierung nicht und kann so sehr schnell identifiziert werden.

1
2
3
run.args.extra=<otherstuff> \
  --nosplash \
  -J-Dorg.openide.util.NbBundle.DEBUG=true \

Der Parameter --nosplash ist zu empfehlen, da verschiedene nummerische Einstellungen im Splash-Screen ebenfalls aus properties-Dateien gelesen werden und diese durch die Markierung nicht mehr als Integer geparst werden können. Ohne den Parameter tauchen unschöne Exceptions im Log auf, die auch schon mal dazu führen können, dass die Anwendung gar nicht mehr startet.

Notes:

  1. bzw. der Weiterleitung in die JavaDoc der „Module System API“

2 Responses to Nicht lokalisierte Zeichenketten finden in NetBeans Anwendungen

  1. Elmar says:

    Das mit den Exceptions ist an einem Beispiel leicht nachzuvollziehen: Steht im Bundle z.B. ein String, der in eine Zahl umgewandelt werden soll, z.B. „352“, liefert NbBundle z.B. „352 (47:11)“ statt nur „352“. Das führt dann zu einer NumberFormatException.

    Das gilt prinzipiell für Strings, die weiterverarbeitet werden, z.B. Pfade zum Laden von Ressourcen. Es lässt sich im Code abfangen, was aber unschön ist:

    if (Boolean.getBoolean(„org.openide.util.NbBundle.DEBUG“)) {
    // Sonderbehandlung – hinten wegschneiden
    }

  2. Es hat sich mittlerweile herausgestellt, dass nur Properties aus einer „Bundle.properties“ (bzw. genauer: alle Bundlenames, die „Bundle“ enthalten) mit den Markierungen versehen werden. Wir haben bei uns aber auch Bundles, die den Namen der zugehörigen Klasse verwenden (Ein etwas umfangreicheres Datenmodell). Für diese Bundles muss man sich leider irgendwelche Workarounds ausdenken.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.