# Mehrsprachigkeit mit ResourceBundle



## UnkiDunki (17. Jan 2010)

Hi,

wie der Titel schon sagt, geht es mir darum, wie man "weitestgehend elegant" ein Programm mehrsprachig auslegen kann.
Dazu habe ich auch hier im Forum etwas passendes gefunden, nämlich mit ResourceBundle:

```
ResourceBundle textbundle = ResourceBundle.getBundle("languages.German", locale);
```

languages.German wäre hier von SimpleTextResource abgeleitet, so dass ich mit 
	
	
	
	





```
data.put("Button.cancel", "Abbrechen")
```
 arbeite...

Jetzt ist die Frage, ob da meine Umsetzung wirklich gelungen ist (beim Programmstart setze ich die Variable textBundle mit dem Inhalt der Sprachdatei (statisch) und greife dann in jeder Klasse einfach mit 
	
	
	
	





```
Language.textBundle.getString("Button.cancel")
```
 darauf zu) und ob das Arbeiten mit einer einzigen Datei wirklich Sinn macht, oder ob ich das ganze irgendwie klassenspezifisch aufteilen sollte...

Ist das mit der statischen textBundle-Variable so ne gute Idee, oder wie kann man das ganze vielleicht noch verbessern? Vielleicht einen ganz anderen Weg gehen?

Danke im Voraus


----------



## The_S (18. Jan 2010)

Inhalte von RessourceBundles werden eigentlich immer in Dateien ausgelagert und nicht im Programm selbst initialisiert. Zumindest hab ich es noch nirgends anders gesehen.


----------



## Landei (18. Jan 2010)

The_S hat gesagt.:


> Inhalte von RessourceBundles werden eigentlich immer in Dateien ausgelagert und nicht im Programm selbst initialisiert. Zumindest hab ich es noch nirgends anders gesehen.



Na ja, in unserer Firmenanwendung nicht, aber ich finde trotzdem, dass eine externe Quelle (Datei oder DB) die bessere Lösung ist. 


@Fredowner: Eclipse oder NetBeans nehmen dir die Arbeit ab. Z.B. gibt es ein Werkzeug, das einem dabei hilft, eine Anwendung nachträglich zu "internationalisieren". Ich denke, so wie es dort gemacht wird, ist es "Standard", und ohne gute Gründe sollte man von diesem Stil nicht abweichen.


----------



## UnkiDunki (18. Jan 2010)

Hi,

danke für euer Feedback!

@The_S: Selbst in der API ResourceBundle (Java 2 Platform SE v1.4.2), wie ich gerade gesehen habe, wird ein meinem Anwendungsfall ähnlicher bzw. identischer solcher beschrieben.
Wie auch "Landei" meintest du "besser auslagern", aber wieso? Wo ist da der Vorteil? Bzgl. Schnelligkeit kann ich mir das z.B. nicht vorstellen, aber das muss nichts heißen...

@Landei: Von einem "Internationalisierungswerkzeug" (schweres Wort) habe ich noch nichts gehört. Verwende Eclipse und werde mich mal entsprechend umsehen. Danke für den Hinweis!


----------



## The_S (19. Jan 2010)

UnkiDunki hat gesagt.:


> @The_S: Selbst in der API ResourceBundle (Java 2 Platform SE v1.4.2), wie ich gerade gesehen habe, wird ein meinem Anwendungsfall ähnlicher bzw. identischer solcher beschrieben.
> Wie auch "Landei" meintest du "besser auslagern", aber wieso? Wo ist da der Vorteil? Bzgl. Schnelligkeit kann ich mir das z.B. nicht vorstellen, aber das muss nichts heißen...



- Die Vertextung kann nachträglich einfach verändert werden, ohne das Programm neu compilieren zu müssen.

- Eine Textdatei mit



> key1=value1
> key2=value2
> key3=value3



ist imho deutlich übersichtlicher als


```
data.put("key1", "value1");
data.put("key2", "value2");
data.put("key3", "value3");
```

- Du kannst die Ressourcen auch leicht und übersichtlich über mehrere Dateien verteilen

- Du hast die Vertextung nicht fest eincodiert im Quelltext

- Wenn es auf Speicherplatz ankommt und die viele Texte hast (bspw. bei Java ME Anwendungen), können Texte in einer Textdatei besser gezippt werden, als wie in compiliertem Code.

- ...


----------



## UnkiDunki (25. Jan 2010)

Hi,

ok, danke. Das sind ein paar sehr überzeugende Argumente und ich denke, dass ich das in Textdatei(en) auslagern werde.
Ich habe jetzt allerdings noch zwei Fragen:

1.) Womit realisiere ich das? Wirklich mit RessourceBundle oder vielleicht doch mit Properties. Damit ist eine Internationalisierung ja auch möglich und wie ich gesehen habe, gibt es da die Möglichkeit mit Platzhaltern zu arbeiten, die man während der Laufzeit setzen kann. Das ist ja sehr praktisch...

2.) Wenn ich mich für eine dieser Möglichkeiten entschieden habe, bleibt die Frage des "Wie", wobei ich mir nicht sicher bin, ob sich das mit der Wahl von Properties dann nicht von alleine regelt?!? Jedenfalls frage ich mich, ob man in jeder benötigten Klasse die Sprachdatei neu einliest oder irgendwie ein mal zu Programmbeginn in einer statischen Klasse, um darauf dann von überall zugreifen zu können. So hatte ich es mit ResourceBundle realisiert.

Danke schon mal


----------



## Landei (25. Jan 2010)

ResourceBundles sind dafür gemacht worden, Properties nicht. Und wie gesagt: Jede moderne IDE sollte dich bei der Internationalisierung unterstützen.


----------



## UnkiDunki (25. Jan 2010)

Du sprichst bzgl. Eclipse von "Externalize Strings", oder gibt es da noch was besseres?
Help - Eclipse SDK


----------



## Meru (25. Jan 2010)

Mit Eclipse kann man mit Rechtsklick auf ein Package oder eine Java-Datei gehen, dann <Source (alternativ ALT+SHIFT+S)>, dann <Externalize Strings>. Damit legst du dann ein entsprechendes File über den Wizard an.


Anschließend kannst du mit dem wunderbaren PlugIn <ResourceBundleEditor_v0.7.7.zip> diese Datei öffnen und dann mehrere Sprachen hinzufügen. Ist eigentlich recht simpel gehalten und sehr übersichtlich.


----------



## UnkiDunki (25. Jan 2010)

Super. Vielen Dank!


----------

