Resourcebundle - Sprache zur Laufzeit aktualisieren?

flashray

Erfahrenes Mitglied
Hallo Freunde,

Habe eine kleine Applikation geschrieben, welche mit Hilfe von Resourcebundle und Locale zweisprachig ist. Das Programm funktioniert soweit.
Meine Frage ist:
Beinhaltet das aktuelle Java SDK eine Klasse, Methode mit welcher man die Sprache einer Applikation zur Laufzeit ändern kann?
Wenn es keine Javainterne Lösung zur Zeit vorhanden ist, gibt es denn vielleicht eine zu empfehlende externe API die dies löst?

Danke!

VG Erdal
 
Du könntest nach jeder Sprachwahl das verwendete ResourceBundle durch Übergeben des aktuellen Locale-Objekts überschreiben:


ResourceBundle getBundle(String baseName, Locale locale)
 
Hallo Schnuffie,

das wäre ja zu einfach um wahr zu sein.

Genau so etwas suche ich. Funktioniert aber leider nicht.

Die einzigste Möglichkeit die ich bisher kenne ist, nach der Sprachauswahl diese in eine Konfigurationsdatei schreiben. Programm beenden, neu starten. Jetzt kann die Applikation die Ressourcen der gewählten Sprache erhalten.

Die Lösung müsste irgendwie so was sein wie, wenn die neue Lokale gesetzt ist alle Komponenten neu initialisieren. (theoretisch)

Wie weiß ich nicht?

Trotzdem danke!

VG Erdal
 
Mit der angegebenen Methode bekommst Du genau das ResourceBundle-Objekt, das der übergebenen Locale entspricht. Somit wird nach Sprachwechsel eben die andere Properties-Datei verwendet und falls noch nicht geschehen - vorher eingelesen.

Du könntest Dir allerdings auch mit ListResourceBundle von Properties-Dateien unabhängige ResourceBundle erzeugen.
 
Hallo Schnuffie,

also ich tue die Lokale neu setzen. Allerdings sehe ich keine Veränderungen. Hab mal unten den relevanten Codeteil aus meiner Applikation rausgeschrieben. Kannst du mir sagen, ob da noch irgendetwas fehlt oder etwas falsch ist. Bei Programmstart tue ich die Lokale aus einer Propertiesdatei lesen. Ist das was ich in die Methode change geschrieben habe richtig, ausreichend zum wechseln der Sprache.

VG Erdal

Code:
public class Test {

   public static String land;
   public static String sprache;
   public static Locale currentLocale, de, tr, en;
   public static ResourceBundle m;

   public void change () {
      m.getBundle("Bundle", en);
   }

   public static void main (String[] args) {
      try {
         Properties prop = new Properties();
         FileInputStream in = new FileInputStream("config.txt");
         prop.load(in);
         in.close();
         land = prop.getProperty("land", "DE");
         sprache = (prop.getProperty("sprache", "de"));
      } catch (IOException e) {
      } catch (NumberFormatException e) {
      }

      currentLocale = new Locale(sprache, land);
      de = new Locale("de", "DE");
      tr = new Locale("tr", "TR");
      en = new Locale("en", "EN");

      m = ResourceBundle.getBundle("Bundle", currentLocale);

   }

}
 
Die derzeitige Sprache erhälst Du mit:

Code:
Locale currentLocale = Locale.getDefault();

Ich würde das event. so lösen:

Code:
private Locale currentLocale = Locale.getDefault();
private Locale en = Locale.ENGLISH;
private Locale de = Locale.GERMAN;
private Locale tr = new Locale("tr"); //der 2. Parameter ist nur für landesspezifische Sprachen (z.B. de und CH für deutschsprachige Schweiz) erforderlich
 
public ResourceBundle getGerman() {
  return ResourceBundle.getBundle("sprache", de);
}
 
public ResourceBundle getEnglish() {
  return ResourceBundle.getBundle("sprache", en);
}
 
public ResourceBundle getTurkish() {
  return ResourceBundle.getBundle("sprache", tr);
}
 
public ResourceBundle getDefault() {
  return ResourceBundle.getBundle("sprache", currentLocale);
}

Zur Verfügung mußt Du diese 3 Properties-Dateien stellen:
sprache_de.properties
sprache_en.properties
sprache_tr.properties
 
Hallo Schnuffie,

habe nach deinen Vorgaben ein kleines Beispiel implementiert. Funktioniert leider nicht.

Fehlt da noch irgendetwas, oder ist da was falsch?

Beste Grüsse
Erdal

Code:
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
import java.util.ResourceBundle;
import javax.swing.JButton;
import javax.swing.JFrame;

public class Language {
	private ResourceBundle r;
	
	private Locale en = Locale.ENGLISH;
	private Locale de = Locale.GERMAN;
	 
	public ResourceBundle getGerman() {
	  return ResourceBundle.getBundle("sprache", de);
	}
	 
	public ResourceBundle getEnglish() {
	  return ResourceBundle.getBundle("sprache", en);
	}
	 	
	public void example() {
		r = getGerman();
		
		final JFrame f = new JFrame(r.getString("l_titel"));
		JButton b1 = new JButton(r.getString("l_eins"));
		JButton b2 = new JButton(r.getString("l_zwei"));
		
		ActionListener deutsch = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				r = getGerman();
			}
		};
		b1.addActionListener(deutsch);
		
		ActionListener english = new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				r = getEnglish();
			}
		};
		b2.addActionListener(english);
		
		f.setAlwaysOnTop(true);
		f.setSize(200,150);
		f.setLayout(new GridLayout(2,1));
		f.add(b1);
		f.add(b2);
		f.setVisible(true);
	}
	
	public static void main(String[] args) {
		Language l = new Language();
		l.example();
	}

}

sprache_de.properties:
l_titel=Deutsch
l_eins=eins
l_zwei=zwei

sprache_en.properties:
l_titel=English
l_eins=one
l_zwei=two
 
Auf Anhieb kann ich keinen Fehler feststellen, nehme allerdings an, daß er Deine Dateien nicht findet. Habe von meinem (funktionierenden) Beispiel mal Screenshots erstellt (siehe Anlagen).

Es gibt bei mir nur eine spezielle deutsche Datei für "deutsche" PCs, sonst wird immer die allgemeine Datei geladen, die bei mir die englischen Begriffe enthält.
 

Anhänge

  • package.gif
    package.gif
    2,5 KB · Aufrufe: 2.826
  • klasse.gif
    klasse.gif
    4,9 KB · Aufrufe: 1.244
Also ich weiß, dass es schon länger her ist,dass dieses Thema bearbeitet wurde aber vllt antwortet ja jemand. Ich habe ein Problem mit dem ResourceBundle, ich habe mit Eclipse mir eine propertie Datei erstellen lassen und auch noch weitere angelegt. Nun möchte ich, wenn ich in meiner Gui auf German klicke, dass er das Fenster in Deutsch anzeigt. Ich hab das auch wie hier beschrieben mit getGerman, getEnglish versucht aber die Buttons werden mir nicht aktualisiert.
Die Console gibt folgendes aus:

java.util.PropertyResourceBundle@62acc57

Wo liegt mein Fehler oder was muss ich ändern?
 
Dann wirst du wohl die Beschriftungen aller deiner Buttons, Labels, etc. neu setzen müssen. Das ResourceBundle besrogt ja lediglich die sprachenspezifische Einstellungen, welche in den meisten Fällen einfach nur Texte sind, hat aber nix mit der Verarbeitung dieser zu tun. Also das Aktualisieren muss man noch selbst implementieren.
 
Zurück