i18n Internationalisierung meiner oberfläche...

Prophet05

Erfahrenes Mitglied
Moin,

ich möchte meine Programme gerne Internationalisieren. Java gibt einem ja bereits die Werkzeuge (ResourceBundle, Locale) aber irgendwie finde ich keine verknüpfung zwischen oberflächen Komponenten und den i18n Daten. Ich würde gerne, wie es viele Anwendungen machen die Sprache in einem Optionsmenü per Mouseclick ändern können. Das Problem ist aber das ich nicht weiß wie ich alle Komponenten auf einmal aktualisieren kann. Mir fehlt die verknüpfung zwischen dem sprachabhängigen Text und Komponente.
Klar ich kann bei Initialisierung der oberfläche alle Strings je nach sprachen über mein ResourceBundle laden aber wenn ich dann im Betrieb umschalten will geht das nicht weil alle Komponenten eine Kopie und keine Referez des String sichern.
Wie also realisiere ich diese Verbindung?

Ich habe mir schon verschiedene Sachen überlegt aber alle wirken irgendwie klobig und unelegant. Hier meine überlegungen:

> Am elegantesten wäre es von String abzuleiten und dann darüber eine verbindung zu den entsprechenden Sprach resourcen zu halten. Diese ableitung übergebe ich nun allen Komponenten als text. Dieser String kann sich dann immer selbstständig ändern und ich muss die oberfläche nur neu zeichen lassen. Zu dumm das String final ist.
> Meine zweite überlegung geht in die richtung eine Klasse zu schreiben die eine Referenz auf GUI elemente bei sich behält. Pro sprachabhängiger Komponente erstelle ich dann einen dieser "Behälter". Alle behälter lagere ich dann zentral. Durch einen aufruf werden alle behälter abgeklappert und füllen ihre Komponente mit dem neune Text. Nur habe ich da zwei Probleme:
Erstens müsste ich entweder für jede Komponente die ich verwende eine eigene ableitung dieses Behälters implementieren (wegen der unterschiedlichen methoden und typen) oder ich muss mit generic arbeiten und das nicht zu knapp. Bei ersterem erwartet mich arbeit in großem umfang und ich kann mir nicht vorstellen das andere projekte einen solche naufwand betreiben. Bei zweitem habe ich angst das der speicher berbrauch erheblich steigt und die performance leidet da ich ja zu jeder Komponente eine Class, ein Method und eine Referenze benötige.
Ausserdem finde ich das das ganze ein wenig klobig ist.
> Die dritte überlegung war das ich jede Lokalisierbare komponente meiner Klasse (Frames) einfach als privates Member sicher und dann jedes fenster eine Locaize methode besitzt welche dann alle member abgeht und die strings anpasst. Allerding finde ich auch das ziemlich ungeschickt und so "Quelltext-Müllig".

Was ist gängige Praxis um so ein umschalten der Sprache im betrieb zu realisieren? Bin ich auf dem Holzweg? Oder sind meine ansätze schon gut?

Gruß, Prophet05
 
Entweder nimmst du AspectJ oder du Wrapst die GUI Klassen in eigene Klasse und bietetes dann eine Methode setTextForKey o.ä. an, welche du den Übersetzungsschlüssel übergibst. Dann lässt du bei der Erstellung solch einer Klasse sie sich noch auf einen Listener anmelden, welcher informiert wird wenn sich die Sprache ändert. Dieser sorgt dann dafür dass der Key für die neue Sprach übersetzt wird und der Text dem GUI Element zugewiesen wird. Das geht dann auch alles ziemlich fix.
 
Ich habs so gemacht. Wichtig ist halt nur das über einen Listener zu regeln, da es ansonsten ewig dauert wenn man versucht die ganzen zur Zeit angezeigten Oberflächenelemente zu traversieren um die Sprache dann bei allen durch Aufruf einer Methode zu ändern.
 
Zurück