ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
362
362
EMPFEHLEN
-
Hi
Ich habe ein JMenü mit meheren Sprachen zur Auswahl und möchte gerne das die gesamte Swing GUI bei Auswahl einer Sprache automatisch ändert ohne das die Applikation neu gestartet werden muss. Das geht mit der konventionellen bzw. statischen Methode ResourceBundle nicht, soweit mir bekannt. Doch habe ich bereits andere Java Programme gesehen die so etwas können. Jetzt fehlt mir nur noch ein Licht wie so etwas auch in meiner GUI Anwendung implementiert werden kann.
Hat jemand so etwas bereits realisiert oder entsprechende Links mit weiteren Infos?
Geändert von xoom4 (27.06.11 um 22:08 Uhr)
-
27.06.11 22:43 #2SE Tutorials.de Gastzugang
Ich würde so vergehen :
alle Components dir geändert werden können als Referenzen halten. Die Component die die Sprache wechselt erhält einen ActionListener. In diesem ActionListener gehst du nun alle Referenzen ab und rufst setText(String) auf. Zur Not leite dir eine eigene Klasse von der ab die du haben möchtest und implementiere die Methode entsprechend. Eine andere möglichkeit wäre sonst noch über updateUI() über den UI-Manager ... aber wie das funktioniert weis ich nicht.
-
Vielen Dank, den Hinweis mit dem Listener hat mir sehr geholfen

Ich hab das nun wie folgt realisiert (Bemerkung: Code ist in Scala). Zuerst wurde ein globaler i18n Manager erstellt:
Anschliessend wurden wie du beschrieben hast ein Listener erstellt:Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
object LocaleManager { var listeners = Buffer[LocaleListener]() def locale = localeInstance def locale_= (locale: Locale) { localeInstance = locale listeners.foreach(listener => listener.localeChanged) } def text(key: String) = ResourceBundle.getBundle("MessagesBundle", locale).getString(key) private var localeInstance = new Locale("en", "US") }
Zum Schluss wurden diejenigen Swing Komponenten die i18n benötigen um diesen LocaleListener erweitert und die localeChange Funktion definiert, Beispiel anhand der scala.swing.Menu Klasse:Code :1
trait LocaleListener { def localeChanged }
So, dass ist mal das Grundgerüst. Jetzt müssen die Klassen nur noch eingesetzt werden:Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
class LMenu(title0: String) extends Menu(title0) with LocaleListener { val textKey = title0 //Setze Text mit der jeweiligen Sprache. localeChanged // Füge mich selbst als Listener dem LocaleManager hinzu. LocaleManager.listeners += this // Werde vom LocaleManager aufgerufen wenn sich die Sprache ändert. def localeChanged { if(textKey != null) if(!textKey.isEmpty) super.text = LocaleManager.text(textKey) } def text_= (s: String) { textKey = s localeChanged } }
Zum Schluss brauchen wir nur noch zwei Sprachdateien, zum einen die Englischsprachige MessagesBundle_en_US.properties:Code :1 2 3 4
// Menu mit i18n unterstützung, standardmässig englischer Text. new LMenu("menu.file") // Schalte jetzt auf Deutschsprachigen Text um. LocaleManager.locale = new Locale("de", "CH")
und eine Deutschsprachige:Code :1
menu.file = File
MessagesBundle_de_CH.properties:
Wer es gern in Java möchte dem werden die unteren Links jeweils weiter Helfen.Code :1
menu.file = Datei
http://geosoft.no/software/locale/do...e-summary.html
Bei diesem Link handelt es sich um exakt das was ich oben implementierte habe. Nur fiel mir auf das die GeoSoft Locale API probleme mit dem finden der Sprachdatei hat (speziell die Methode getText in LocaleManager scheint mir dubios
). Das war auch der eigentliche Grund warum ich eine neu implementierung vor nahm.
http://www.java-forum.org/415098-post14.html
Ist eine alternative Implementierung, hab sie nicht getestet.
Zum schluss hab ich noch eine GNU Gettext API für Java gefunden: http://code.google.com/p/gettext-commons/wiki/Tutorial. Für Scala funktioniert es leider nicht, dass xgettext meckert dauernd das die Syntax nicht unterstützt wird.Geändert von xoom4 (02.07.11 um 14:36 Uhr)
-
Da währe noch was, wie mach ich das der LocaleManager die Resourcen aus dem Listener Array/Buffer automatisch entfernt wenn Bsp. ein zweites Fenster das ein Menü hat geschlossen wird?
-
05.07.11 08:33 #5SE Tutorials.de Gastzugang
In dem du dir ne ganze Menge Schreibaufwand machst und es hardcodest ...
Ähnliche Themen
-
Dynamisches RSS?
Von xwurst im Forum Coders TalkAntworten: 1Letzter Beitrag: 06.10.09, 13:18 -
I18N bei Jtable Headern
Von anti43 im Forum JavaAntworten: 4Letzter Beitrag: 11.09.09, 08:43 -
i18n.jar - Wo finde ich dieses package?
Von oli001 im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 2Letzter Beitrag: 10.07.09, 12:17 -
Dynamisches Banner
Von mardusi im Forum PHPAntworten: 9Letzter Beitrag: 11.06.09, 23:51 -
i18n Internationalisierung meiner oberfläche...
Von Prophet05 im Forum JavaAntworten: 3Letzter Beitrag: 05.07.07, 11:36





Zitieren
Login





