Saubere Lösung für das Auslesen einer Html Seite (Mehrsprachigkeit)

Websphere

Mitglied
Moin,

Theorie: Ich lese eine Html Seite aus. Die Seite unterstützt mehrere Sprachen, somit finde ich folgende Inhalte, da jeder User der Seite sein Profil auf seine Sprache anpassen kann:

Englischer User:
firstName
lastName
sex
birth
...

Deutscher User:
vorname
nachname
geschlecht
geburtsdatum
...

Spanisch
Italienisch
usw.

Hier kommen eine ganze Latte an Informationen für den User dazu, der Aufbau ist bei allen gleich. Nun könnte ich das natürlich für jede Sprache runterschreiben, was natürlich jede Menge Zeilen produziert (natürlich jede Sprache in eine eigene Klasse, damit das übersichtlicher ist). Der Nachteil, wenn sich was ändert muss ich das in jeder Klasse ändern.

Schöner wäre es doch, man arbeitet mit einer properties Datei und schreibt das Ganze nur einmal.
Code Aktuell:
Java:
// String lang enthealt die jeweilige Sprache
// int lcode ist fuer die Switch Anweisung
...
if (lang.equals("German(2)")) {
  lcode = 1;
  System.out.println(" ------- LANGUAGE: " + lang);
}
else if (lang.equals("English(1)")) {
  lcode = 2;
  System.out.println(" ------- LANGUAGE: " + lang);
}
...
switch (lcode) {
                
  // GERMAN
  case 1: {
  if (row.asText().trim().equalsIgnoreCase("vorname")) {
    machwas...
  }
  else if (row.asText().trim().equalsIgnoreCase("nachname")) {
    machwas...
  }
  ...

 case 2: {
   if (row.asText().trim().equalsIgnoreCase("firstName")) {
    machwas...
  }
  else if (row.asText().trim().equalsIgnoreCase("lastName")) {
    machwas...
  }
  ...

Ich finde das nicht gerade proessionell, deswegen würde ich das eine properties erledigen lassen. Die habe ich auch schon geschrieben. Nun die Frage wie binde ich die ein?
In der case Anweisung müsste eigentlich auf die properties Datei verwiesen werden. Also für case 1 - nimm propertiesENG, für case 2 - propertiesDEU ... usw.
Code Theorie:
[Java]

propertiesDEU Beispiel
name=vorname
lname=nachname
ges=geschlecht
geb=geburtsdatum
...

propertiesENG Beispiel
name=firstName
lname=lastname
ges=sex
geb=birth
...

switch (lcode) {

if (lang.equals("German(2)")) {
// Pseudo Code
nimm propertiesDEU;
System.out.println(" ------- LANGUAGE: " + lang);
}
else if (lang.equals("English(1)")) {
// Pseudo Code
nimm propertiesENG;
System.out.println(" ------- LANGUAGE: " + lang);
}
...

// All Languages, Pseudo Code
if (row.asText().trim().equalsIgnoreCase("aame_InDerProperties")) {
machwas...
}
else if (row.asText().trim().equalsIgnoreCase("nachname_InDerProperties")) {
machwas...
}
...

[/code]
Soweit ich weiß brauche ich ein Objekt der Klasse RessourceBundle (Link Galileo Open Book Java Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 13.4 Internationalisierung und Lokalisierung). SO ganz hinbekommen tue ich es leider nicht, wäre deswegen schön wenn mir da jemand helfen könnte.

Danke im Voraus
 
Zwei Bitten noch:

1. Ich habe mich gerade angemeldet, kann man mich also dem Thread zuweisen den ich oben erstellt habe?

2. Wenn man das nicht versteht oder was fehlt, dann sagt es bitte.
 
Vielleicht wird es damit verständlicher.

im src-Verzeichnis habe ich ein Verzeichnis "resources" angelegt.
In diesem Verzeichnis gibt es folgende Dateien:
locals.properties
locals_en.properties

in der locals.properties steht folgender Inhalt:
Code:
firstname=Vorname
lastname=Nachname

in der locals_en.properties folgendes:
Code:
firstname=Firstname
lastname=Lastname

Also es gibt nur für Englisch (en) eine Übersetzung, alles andere geht auf default, in diesem Fall deutscher Text!


Java:
import java.util.Locale;
import java.util.ResourceBundle;

public class Test {

    /**
     * Im Verzeichnis Resource gibt es die Properties-Datei locals
     * locals.properties ist die std. Übersetzung wenn es für eine Sprache xy keine übersetzung gibt
     * locals_de.properties ist die übersetzung für Deutsch
     * locals_en.properties ist die übersetzung für Englisch
     * etc...
     */
    final static private String BASENAME = "resources.locals"; 
    
    final private ResourceBundle _bundle;
    
    
    public Test(String language) {
        
        Locale locale = null;
        
        if (language.equals("German(2)")){
            locale = new Locale("de"); // Wobei deutsch ja schon default ist!
        }else if (language.endsWith("English(1)")){
            locale = new Locale("en");
        }else{
            locale = Locale.getDefault();
        }
        
        this._bundle = ResourceBundle.getBundle(BASENAME, locale); 
        
    }

    /**
     * Übersetzung holen
     * @param key
     * @return
     */
    final public String getString(String key){
        return this._bundle.getString(key);
    }
    
    public static void main(String[] args) {

        Test test = new Test("English(1)");
        System.out.println(test.getString("firstname"));
        System.out.println(test.getString("lastname"));
        
        test = new Test("German(2)");
        System.out.println(test.getString("firstname"));
        System.out.println(test.getString("lastname"));
        
    }

}
 
du musst die Properties nehmen, korrekt, was ist die Frage?
dein Code ist so allgemein das kaum was offen erscheint

mach es z.B. so
Java:
String propertyFilename = null;
if (lang.equals("German(2)")) {
  propertyFilename = "propertiesDEU";
}
else if (lang.equals("English(1)")) {
 propertyFilename = "propertiesENG";
}
System.out.println(" ------- LANGUAGE: " + propertyFilename );
Properties p = loadProperties(propertyFilename );

String key = row.asText().trim();
String val = p.loadTextToKey(key); // hier gleich alle IgnoreCase bearbeiten, 
           // z.B. immer alles toLowerCase()
if (val == null) {
  // unbekannter Key
} else if (r.equalsIgnoreCase("aame_InDerProperties")) {
   xy.setAame(val);    
} else if (r.equalsIgnoreCase("nachname_InDerProperties")) {
   xy.setNachname(val);    
}
 
Danke, ich werde das nachher gleich mal ausprobieren.

@TR: war auf Arbeit und etwas im Stress, deswegen war die Beschreibung etwas durcheinander. Danke fürs Aufbereiten.

Die Frage war/ist: Wie verweise ich auf die propertie bzw. auf deren Inhalt, wenn ich den Inhalt einer Website ausgelesen habe und mit der propertie vergleichen möchte?
Beispiel der Tabelle:
Java:
eng. Spieler:
First Name = Jude
Last Name = Law
....


deut. Spieler:
Name = Mario
Nachname = Adorf
...
Damit ich die Namen bekomme, brauche ich den Datensatz davor. Damit er die jeweilige Sprache kennt, werden diese in der properties definiert. Diese habe ich meinem ersten Post schon aufgeführt.

Zum unvollständigen Code:
Java:
DomNodeList<HtmlElement> list = page.getElementsByTagName("table");
	for (Iterator i = list.iterator(); i.hasNext();) {
		HtmlTable table = (HtmlTable) i.next();
		for (final HtmlTableRow row : table.getRows()) {
			for (final HtmlTableCell cell : row.getCells()) {
				
				if (cell.asText().trim().equalsIgnoreCase("Language")) {
					if (cell.getNextSibling() != null){
						List<DomNode> childs = row.getNextSibling().getChildNodes();
							lang = childs.get(1).asText();
							if (lang.equals("German")) {
								propertyFilename = "propertiesDEU";
							}
							else if (lang.equals("English")) {
								propertyFilename = "propertiesENG";
							}
							System.out.println("LANGUAGE: " + propertyFilename );
							Properties p = loadProperties(propertyFilename );	
					}
				}
			}

			String key = row.asText().trim();
			String val = p.loadTextToKey(key); // hier gleich alle IgnoreCase bearbeiten, 
			//z.B. immer alles toLowerCase()
			if (val == null) {
				// unbekannter Key
			} else if (val.equalsIgnoreCase(" was muss hier hin? ")) {
				xy.setName(val);    
			} else if (val.equalsIgnoreCase(" was muss hier hin? ")) {
				xy.setNachname(val);    
			}
...

@SlaterB: das was du geschrieben hast ist mir so ziemlich alles logisch. Nur den letzten Teil verstehe ich nicht, also die letzte if.
Beispiel:
Ich lese englische Informationen aus. Über Language kenne ich die verwendete Sprache der Tabelle.
val erhält somit den Inhalt "firstname". Damit er das kennt, braucht er nun den verweis auf die propertiesENG, in der iwo "name=First Name" steht.
Btw wie definiere ich den Pfad der properties? So wie es TR geschrieben hat?
Also wie verweise ich auf die properties?
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben