Internationalisierung über Propertydateien

takidoso

Erfahrenes Mitglied
Hallo und Halli,
es gibt bei uns so ein richtig schönes proprietäres System in Java geschrieben, welches nun zu internationalisieren ist. Propretär deswegen, weil unglaublich viel über Parameterdateien (über 1000 stück) eingestellt bzw eigentlich auch Logik und Maskenbeschreibungen hinterlegt sind. Ich habe daraufhin ein Tool gebastelt, welches mir die Texte in ein Property-Resource-Bundle ablegt.
Der Ablageort dieses Bundles wäre auch in diesem Gefüge von Parameterdateien (also nicht notwendigerweise direkt im Jar-file der Anwendung) und würde über einen Parameter auch dem System bekannt gemacht werden.
Nun Meine Frage:
Unter der Prämisse das das bundle resouceBundle.properties heißt und unter dem Pfad
../Parameter/Config/ResourceBundles/ liegt.

Verstehe ich das richtig, dass Java automatisch das Bundle finden würde, wenn es
prinzipiell wie folgt codiert wäre?

Code:
String                bundleName = "Parameter/Config/ResourceBundles/resourceBundle";
ResourceBundle bundle         = ResourceBundle.getBundle(bundleName);

oder ginge gar dies:
Code:
String                bundleName = "Parameter.Config.ResourceBundles/resourceBundle";
ResourceBundle bundle         = ResourceBundle.getBundle(bundleName);

hat da jemand einschläge Erfahrung damit?

mit bestem Dank im Voraus

Takidoso
 
Hallo!

Also der ResourceBundlemechanismus findet die entsprechende Textdatei indem es einen "Java Package"-String in einen Verzeichnispfad übersetzt.

Aus: de.tutorials.foo.Test wird dann de/tutorials/foo/Test.properties
Bzw. je nach Locale (bei de_DE) dann de/tutorials.foo/Test_de_DE.properties
Siehe auch hier:
http://www.tutorials.de/forum/j2ee/...packages-nutzen.html?highlight=ResourceBundle

und hier:
http://www.tutorials.de/forum/java/183993-resourcebundle-methode.html?highlight=Locale

Gruß Tom
 
vielen Dank Tom,
demnach müssen die ResouceBundles grundsätlich in die Class-Pfade und dürfen nicht so ohne weiteres dorthin wo die Parameterdateien rumliegen.
noch eine andere Frage mehr in Sachen Performance.
Wird eigetnlich wenn man mehere grundsätzliche Bundles hat (also verschiedene Bundlenamen von den Suffixen abgesehen) bei einem erneuten Aufruf eines schonmal erhaltenen Bunldes dieses irgenwo gecashed, oder muss man dafür selbst sorgen (z.B. in einer Map) ?

Beispiel
Code:
ResourceBundle bundle = ResourceBundle.getBundle(namex);
...
bundle = ResourceBundle.getBundle(namey);
...
bundle = ResourceBundle.getBundle(namex);
 
Hallo!

demnach müssen die ResouceBundles grundsätlich in die Class-Pfade und dürfen nicht so ohne weiteres dorthin wo die Parameterdateien rumliegen.
Nicht notwendigerweise...wenn das Verzeichnis welches die properties Dateien enthält im ClassPath liegt geht das auch so.

Beispiel:
S:\tools\eclipse\workspace\de.tutorials.mustang.training>tree
Auflistung der Ordnerpfade
Volumenummer: 006D002E 68B3:20B5
S:.
????.settings
????bin
? ????de
? ????tutorials
????config
? ????i18n
????src
????de
????tutorials
Klassen liegen unter bin...
Die Konfigurationsdatei foo.properties liegt unter config/i18n und hat den Inhalt:
Code:
a=123

Diese wird im Code wie folgt angesprochen:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.ResourceBundle;

/**
 * @author Thomas.Darimont
 *
 */
public class ResourceBundleExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(ResourceBundle.getBundle("i18n.foo").getString("a"));
    }

}

Beim Aufruf nur mit bin im ClassPath bekommt man einen Fehler:
Code:
S:\tools\eclipse\workspace\de.tutorials.mustang.training>java -cp bin de.tutorials.ResourceBundleExample
Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name i18n.foo, locale de_DE
        at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1508)
        at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1262)
        at java.util.ResourceBundle.getBundle(ResourceBundle.java:717)
        at de.tutorials.ResourceBundleExample.main(ResourceBundleExample.java:18)

Beim Aufruf mit Config im ClassPath läufts durch:
Code:
S:\tools\eclipse\workspace\de.tutorials.mustang.training>java -cp bin;config de.tutorials.ResourceBundleExample
123
Das funktioniert deshalb weil zum laden des ResourceBundles die zugehörige ClassLoaderHierarchy nach der entsprechenden Resource gefragt wird. Da das "root" zu der verlangten Ressource (config -> i18n/foo.properties) im ClassPath liegt wird sie somit auch gefunden.

Wird eigetnlich wenn man mehere grundsätzliche Bundles hat (also verschiedene Bundlenamen von den Suffixen abgesehen) bei einem erneuten Aufruf eines schonmal erhaltenen Bunldes dieses irgenwo gecashed, oder muss man dafür selbst sorgen (z.B. in einer Map) ?
Das ResourceBundle wird per default nur einmal eingelesen und dann intern gecached...

Gruß Tom
 
Zurück