# Design für mehrere Sprachen in Swing



## tuttle64 (4. Mai 2010)

Ich muss ein Swing-GUI implementieren, welches mehrere Sprachen unterstützt. Ich habe bereits die Internalization Seiten von sun gelesen, die Locale sind mir ebenfalls geläufig und einige Prototypen mit ResourceBundle habe ich ebenfalls bereits geschrieben, aber der bis anhin vorliegende Java-Code ist für die Implementierung einer grösseren Anwendung eher untauglich, geschweige denn wartungsfreundlich. Bin für jeden Hinweis dankbar.


----------



## Wildcard (4. Mai 2010)

Und wir sind für Details dankbar. Was stört dich denn?


----------



## tuttle64 (4. Mai 2010)

Wildcard hat gesagt.:


> Und wir sind für Details dankbar. Was stört dich denn?




Ich möchte nicht für jeden Text den ich in einer Componente verwende mit einem ellenlangen IF-Kontrukt wenn Sprache=Deutsch dann diesen Text else wenn Sprache=English dann diesen Text usw. aufblasen. Ich suche nach einer Möglichkeit, alle Textfelder an einem Ort zu initialisieren und dann diese mit getText zu verwenden, ohne wissen zu müssen, um welche Sprache es sich handelt.


----------



## Gast2 (4. Mai 2010)

tuttle64 hat gesagt.:


> Ich möchte nicht für jeden Text den ich in einer Componente verwende mit einem ellenlangen IF-Kontrukt wenn Sprache=Deutsch dann diesen Text else wenn Sprache=English dann diesen Text usw. aufblasen. Ich suche nach einer Möglichkeit, alle Textfelder an einem Ort zu initialisieren und dann diese mit getText zu verwenden, ohne wissen zu müssen, um welche Sprache es sich handelt.



Lol dann solltest du besser lesen, weil davon stand in dem Kapitel mit ResourceBundle ganz gewiss nichts...

Galileo Computing :: Java ist auch eine Insel – 11.4 Internationalisierung und Lokalisierung


----------



## Wildcard (4. Mai 2010)

> IF-Kontrukt wenn Sprache=Deutsch


Du hast die Sun Seite offensichtlich nicht so gründlich gelesen wie du dachtest..


----------



## Meru (5. Mai 2010)

Du kannst dir auch mal von Eclipse die "Externalize Strings" - Methode anschauen, die nimmt einem VIEL Arbeit ab. Mit dem ResourceBundleEditor (Plugin für Eclipse) kannst du auch auf einfache Weise andere Sprachen hinzufuegen.


----------



## tuttle64 (5. Mai 2010)

Wildcard hat gesagt.:


> Du hast die Sun Seite offensichtlich nicht so gründlich gelesen wie du dachtest..



Mit haltlosen Unterstellungen komme ich auch nicht weiter.


----------



## Mc Noise (5. Mai 2010)

Schau dir doch mal den Link von SirWayne an, da steht genau das was du brauchst


----------



## Gast2 (5. Mai 2010)

tuttle64 hat gesagt.:


> Mit haltlosen Unterstellungen komme ich auch nicht weiter.



Naja das ist keine Unterstellungen,sondern ein Ergebnis deiner Aussage von oben. Ich mein der Link beschreibt dein Problem schon nach 2 Sätzen und da steht nirgends etwas von ifs... Also bei mir ist das so, wenn ich etwas nicht kapier versuch ich es nochmal und nochmal zu lesen und dein Problem ist mit den Tips nicht all zu schwer zu lösen, da SOGAR Programmcode zum Ausführen dabei ist. Und Eclipse generiert dir sogar dein Code für dein ResourceBundle den musst du nicht mal selber schreiben  ... Also du wirst es schaffen ...


----------



## tuttle64 (5. Mai 2010)

Mc Noise hat gesagt.:


> Schau dir doch mal den Link von SirWayne an, da steht genau das was du brauchst




Ok, ich werde folgendes versuchen: Pro Sprache werde ich eine Ressource-Datei anlegen mit den in den GUIs zu verwendenden Texte. Sämtliche Texte in den Komponenten werden über bundle.getString gesetzt und sobald die Sprache in der Applikation geändert wird, wird entsprechend ResourceBundle.getBundle aufgerufen und dann werden die Texte in den Komponenten in die Sprache des geholten Bundle geändert. Ist so ok resp. hat jemand sowas schon mal erfolgreich realisiert? Werde es mit einem keinen Protypen versuchen und berichten. Jedenfalls danke an alle für die Hinweise.


----------



## Onkel Hatti (5. Mai 2010)

Ja, ich hab das schon probiert und es funktioniert.

Hatti


----------



## Gast2 (6. Mai 2010)

tuttle64 hat gesagt.:


> Ok, ich werde folgendes versuchen: Pro Sprache werde ich eine Ressource-Datei anlegen mit den in den GUIs zu verwendenden Texte. Sämtliche Texte in den Komponenten werden über bundle.getString gesetzt und sobald die Sprache in der Applikation geändert wird, wird entsprechend ResourceBundle.getBundle aufgerufen und dann werden die Texte in den Komponenten in die Sprache des geholten Bundle geändert. Ist so ok resp. hat jemand sowas schon mal erfolgreich realisiert? Werde es mit einem keinen Protypen versuchen und berichten. Jedenfalls danke an alle für die Hinweise.



Klar funktinioniert das Prinzip sonst wäre es kein Standard ...Wie gesagt wenn du Eclipse nutzt gibt es ein ResourceBundleEditor mit dem du einfach die properties Dateien anlegen kannst... und eclipse generiert dir auch den Code für die Klasse...


----------



## Wildcard (6. Mai 2010)

tuttle64 hat gesagt.:


> Sämtliche Texte in den Komponenten werden über bundle.getString gesetzt und sobald die Sprache in der Applikation geändert wird, wird entsprechend ResourceBundle.getBundle aufgerufen und dann werden die Texte in den Komponenten in die Sprache des geholten Bundle geändert


Die Sprache zur Laufzeit zu ändern ist für nicht-triviale Anwendungen ein ganz enormer Aufwand. Du machst dir das Leben wesentlich leichter wenn du den Benutzer
a)nur vor dem Start die Sprache festlegen lässt, oder
b)eine Änderung der Sprache einen Neustart der Anwendung zur Folge hat

Man darf nicht vergessen das die Sprache zu ändern ein feature ist das die meisten Anwender genau 0 mal in ihrem Leben verwenden werden. Daher sollte man sich schon überlegen ob man wirklich bereit ist einige Mannmonate zu investieren nur um diesen Wechsel ohne Neustart zu ermöglichen


----------



## Mc Noise (6. Mai 2010)

Wildcard hat gesagt.:


> Die Sprache zur Laufzeit zu ändern ist für nicht-triviale Anwendungen ein ganz enormer Aufwand. Du machst dir das Leben wesentlich leichter wenn du den Benutzer
> a)nur vor dem Start die Sprache festlegen lässt, oder
> b)eine Änderung der Sprache einen Neustart der Anwendung zur Folge hat
> 
> Man darf nicht vergessen das die Sprache zu ändern ein feature ist das die meisten Anwender genau 0 mal in ihrem Leben verwenden werden. Daher sollte man sich schon überlegen ob man wirklich bereit ist einige Mannmonate zu investieren nur um diesen Wechsel ohne Neustart zu ermöglichen



Wieso sollte das so schwer sein? Einfach eine Methode retranslateUi() machen, und falls man die Sprache ändert einfach ein Event feuern, auf das jede Gui Komponente hört und eben diese Methode retranslateUi aufruft. Stelle ich mir nicht so schwer vor 

Ob so was viel Sinn macht ist natürlich fraglich, da die VM ja eh dir richtige Sprache setzt.


----------



## Wildcard (6. Mai 2010)

Mc Noise hat gesagt.:


> Wieso sollte das so schwer sein? Einfach eine Methode retranslateUi() machen, und falls man die Sprache ändert einfach ein Event feuern, auf das jede Gui Komponente hört und eben diese Methode retranslateUi aufruft. Stelle ich mir nicht so schwer vor
> 
> Ob so was viel Sinn macht ist natürlich fraglich, da die VM ja eh dir richtige Sprache setzt.


Ich habe bewusst von nicht trivialen Anwendungen gesprochen.
Ein paar Buttons, Labels, ... bekommt man mit (meiner Meinung nach viel zu hohem Aufwand) noch dazu sich zu aktualisieren in dem man durch den ganzen Code eine hässliche Language Listener Infrastruktur zieht. Es hört dann aber auf bei Bäumen, Listen, Tabelle, selbst gezeichneten Objekten,...
Stell dir nur mal eine Art Log View vor. Wenn du entscheidest die Sprache zu wechseln hast du die ursprungsdaten gar nicht mehr um die Einträge in der Log View noch nachträglich übersetzen zu können á la

```
MessageFormat.format(NLS.MY_STRING, e.getLocalizedMessage(), fooObject.getPath());
```
Selbst mit sehr vielen Aufwand lässt sich das also für nicht triviale Anwendungen nur partiell lösen.
Wenn man es sowieso nur partiell lösen kann, kann man sich die Arbeit auch gleich sparen...


----------



## tuttle64 (7. Mai 2010)

Wildcard hat gesagt.:


> Selbst mit sehr vielen Aufwand lässt sich das also für nicht triviale Anwendungen nur partiell lösen.




Ich werde mir gut überlegen, wo der Anwender die Sprache ändern kann. Beim SignOn ist es bestimmt am einfachsten und innerhalb der Applikation gibt es auch Stellen, wo das einfacher gehen wird.
Grundsätzlich stimme ich mit Dir überein und ich danke Dir für den Hinweis.




Wildcard hat gesagt.:


> Man darf nicht vergessen das die Sprache zu ändern ein feature ist das die meisten Anwender genau 0 mal in ihrem Leben verwenden werden.



Man mache es wir Microsoft: Pro Sprache eine Installtions-CD.


----------

