Resourcebundles mit Ant automatisch auf Konsistenz prüfen

Wissenswertes
2 Kommentare

ResourceBundles werden in verschiedenen Programmiersprachen (Java, Adobe ActionScript,…) benutzt, um Anwendungen zu internationalisieren. Man erstellt für jede Sprache, in der die Anwendung später übersetzt werden soll eine Datei, in der dann die übersetzten Zeichenketten in der jeweiligen Sprache eingetragen sind. Diese ResourceBundles konsistent zu halten ist nicht trivial.
Dieser Blogeintrag zeigt, wie man ResourceBundles mit ANT automatisch Überprüfen kann.

ResourceBundle Dateien(auch properties files genannt) haben die unangenehme Eigenschaft, dass sie sehr oft inkonsistent sind. Diese Inkonsistenzen können durch Veränderungen an den Resourcebundles selbst, oder durch Änderungen im Code kommen (neue Platzhalte sollen ausgefüllt werden).
Manchmal sind es aber auch einfache Tippfehler, die Einträge in den properties-Dateien brach liegen lassen.
Sehen wir uns ein Beispiel an:

myapp_de.properties:
app.title=Meine Anwendung
app.welcomeDlg.title=Herzlich Willkommen
app.welcomeDlg.text=Hallo {0}!nDu hast {1} neue Nachrichten (Gesamt: {2}).
app.welcomeDlg.disable.tooltip=Dialog nicht mehr anzeigen

myapp_en.properties:
app.title=My Application
app.welcome.title=Welcome
app.welcomeDlg.text=Hello {0}!nYou have got {1} unread messages.

Bei diesen kleinen Dateien sind bereits die häufigsten Fehler eingebaut:

  • Der Schlüssel app.welcome.title in myapp_en.properties entspricht nicht dem Schlüssel app.welcomeDlg.title in der deutschen myapp_de.properties Datei.
  • Beim Schlüssel app.welcomeDlg.text wurde in der deutschen Version ein dritter Platzhalter verwendet ({2}), der in der englischen Version fehlt.
  • Der Schlüssel app.welcomeDlg.disable.tooltip fehlt zur Gänze in der englischen Version.

Wie kann man nun diese Fehler finden und beheben? Es gibt viele Werkzeuge, und Plug-ins für die gängigsten Entwicklungsumgebungen, die Entwicklern helfen, diese Dateien konsistent zu pflegen (zB. Eclipse ResourceBundle Editor).
In den meisten Fällen möchte man allerdings diese Überprüfungen nicht alleine dem Entwickler überlassen, sondern sie in den Build-Prozess integrieren und die Prüfungen automatisch bei jeder Codeänderung durchführen.
Für den Build mit ANT gibt es bereits eine Bibliothek, die diese Prüfungen durchführen kann. Die Bibliothek heißt rscBundleCheck (von Peter Fichtner) und wird auf sourceforge.org gehostet. UPDATE: Peter Fichtner hat Version 1.3.1 von rscBundleCheck veröffentlicht – gute Doku dazu gibt es unter http://rscbundlecheck.sourceforge.net/.

Ein minimales ANT-Buildscript, welches die ResourceBundle-Dateien prüft sieht wie folgt aus:
build.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project name="rscBlog" basedir=".">   
   <taskdef name="resourceCheck"
      classname="org.dyndns.fichtner.rsccheck.ant.RscBundleCheckTask"
      classpath="rscbundlecheck.jar"/>
   <resourceCheck>
      <fileset dir="locale/">
         <include name="myapp*.properties"/>
      </fileset>
      <checks>
         <include name="duplicate key check"/>
         <include name="empty key check"/>
         <include name="cross bundle check"/>
         <include name="line end check"/>
         <include name="placeholder check"/>
         <include name="unicode check"/>
      </checks>
   </resourceCheck>
</project>

In der Sektion <checks> können verschiedene Überprüfungen eingeschaltet werden. Wird diese Sektion weggelassen, werden alle in der Bibliothek verfügbaren Überprüfungen durchgeführt.
Folgende Prüfungen sind in der aktuellen Version der Bibliothek verfügbar:

  • allowed char key check
  • cross bundle check
  • duplicate key check
  • empty key check
  • empty value check
  • invalid char check
  • key regexp check
  • line end check
  • placeholder check
  • unicode check
  • unused key check
  • upper lower check

Wenn wir nun die beiden ResourceBundle Dateien von weiter oben mit diesem ANT-Script prüfen erhalten wir folgenden Output:

C:CatalystsrscBlog>ant -f build.xml
Buildfile: build.xml
[resourceCheck] Including C:CatalystsrscBloglocalemyapp_de.properties
[resourceCheck] Including C:CatalystsrscBloglocalemyapp_en.properties
[resourceCheck] Enabled checks: [duplicate key check, empty key check, cross bundle check, line end check, placeholder check, unicode check] [resourceCheck] cross bundle check: Missing key(s) [app.welcomeDlg.disable.tooltip, app.welcomeDlg.title] (C:CatalystsrscBloglocalemyapp_en.properties:null)
[resourceCheck] cross bundle check: Missing key(s) [app.welcome.title] (C:CatalystsrscBloglocalemyapp_de.properties:null)
[resourceCheck] placeholder check: inconsistent placeholder for key app.welcomeDlg.text (expected [1, 0], actual [2, 1, 0]) (C:CatalystsrscBloglocalemyapp_de.properties:5:Hallo {0}!nDu hast {1} neue Nachrichten (Gesamt: {2}).)
C:CatalystsrscBlogbuild.xml:4: cross bundle check: Missing key(s) [app.welcomeDlg.disable.tooltip, app.welcomeDlg.title] (C:CatalystsrscBloglocalemyapp_en.properties:null)
BUILD FAILED
Total time: 0 seconds

Das sieht ja schon ganz gut aus – das Tool hat alle eingebauten Fehler gefunden. Nachdem das nun lokal funktioniert, braucht man es nur noch in den Build-Prozess integrieren.
Die aktuelle Version der Bibliothek steht hier als JAR-Datei inklusive Quelltext zum Download.

Wenn Sie Feedback, Hinweise oder Vorschläge zu diesem Thema haben, können Sie uns gerne einen Kommentar hinterlassen.

Vorheriger Beitrag
Professionelle Schnelligkeit
Nächster Beitrag
Ein klares Ziel bei der Unternehmensgründung

Related Posts

AsFlavor: Structure101g for Flex and Actionscript

Together with “The Structure Guys” from Headway Software we developed an Actionscript “flavor” for their latest Structure101 product family member Structure101g(eneric). AsFlavor makes the same esteemed structural and architectural analysis functionality available to the Flex and Actionscript community, that is well known to Java and C++ developers since years.

Weiterlesen

2 Kommentare. Hinterlasse eine Antwort

Hi Dominik,
vielen Dank für Deinen tollen Artikel. Ich befürchte, dass die Dokumentation auf http://rscbundlecheck.sourceforge.net/ nicht veraltet sondern eher zu neu war: Ich hatte noch Änderungen die ich noch nicht per jar releast hatte bereits beschrieben.
Auch das Problem mit dem Classloader hatte ich vor einem Jahr gefixt, siehe auch http://rscbundlecheck.cvs.sourceforge.net/viewvc/rscbundlecheck/antTasks/src/org/dyndns/fichtner/rsccheck/ant/RscBundleCheckTask.java?view=diff&r1=text&tr1=1.33&r2=text&tr2=1.32&diff_format=h
Ich habe den Task neu gebaut (u.a. ist damit das Classloader-Problem weg), er kann bei sourceforge heruntergeladen werden.
Wenn Du Ideen, Wünsche oder Probleme hast einfach per Mail
melden. Vor allem an Vorschlägen für eine möglichst gute Doku wäre ich interessiert.

Viele Grüße
Peter

Antworten

@Peter Fichtner
Hallo Peter,
danke für die Rückmeldung. Ich werd mir bei Gelegenheit die neue Version ansehen und den Artikel aktualisieren.
Beste Grüße
Dominik

Antworten

Schreibe einen Kommentar

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

Bitte füllen Sie dieses Feld aus
Bitte füllen Sie dieses Feld aus
Bitte gib eine gültige E-Mail-Adresse ein.
Sie müssen den Bedingungen zustimmen, um fortzufahren

Menü