Sprachdatei machen mit XML, Denkanstoss!

zer0

Erfahrenes Mitglied
Hallo,

ich möchte für mein mit einer Sprachdatei in XML umsetzen. Alle Texte etc. sind in dieser Datei dann enthalten.

Nachdem ich mir den Aufbau der XML Datei überlegt habe und mir auch schon die von z.B. Notepad++ angeschaut habe ich mal zwei Entwürfe gemacht.

Als Beispiel sind dort die Texte für das Menu und deren Items enthalten.

Erster:
XML:
    <Content>
        <Menu>
            <Item ID="1">Datei</Item>
            <Item ID="2">Bearbeiten</Item>
            <Item ID="3">Hilfe</Item>
        </Menu>
        <MenuItem>
            <Item menuID="1" ID="1">Neu</Item>
            <Item menuID="1" ID="2">Schließen</Item>
            <Item menuID="2" ID="3">Rückgängig</Item>
            <Item menuID="2" ID="4">Wiederherstellen</Item>
       </MenuItem>
    </Content>

Zweiter:
XML:
    <Content>
        <Menu>
            <Item ID="1" name="Datei">
                <MenuItem ID="1" name="Neu" />
                <MenuItem ID="2" name="Öffnen" />
                <MenuItem ID="3" name="Schließen" />
            </Item>
            <Item ID="2" name="Bearbeiten">
                <MenuItem ID="1" name="Rückgängig" />
                <MenuItem ID="2" name="Wiederherstellen" />
            </Item>
            <Item ID="3" name="Hilfe"></Item>
        </Menu>
    </Content>

Beim 1. ist der Vorteil das jedes Item bei MenuItem eindeutig über die ID ist. Der Nachteil wenn ich jetzt beim 1. bei MenuItem das Item "Öffnen" einfügen will, bekommt es die ID 5, obwohl es eigentlich an 2ter Stelle sollte unter "Neu".

Beim 2. ist der Vorteil das man sofort erkennt welches MenuItem zu welchem Menu gehört. Der Nachteil ist das man alleine an der MenuItem ID das Item nicht eindeutig ist.

Was ist die bessere Lösung oder habt ihr vielleicht vorschläge?
 
Zuletzt bearbeitet von einem Moderator:

Sven Mintel

Mitglied
Moin,

wenn es bei dieser Sprachdatei wirklich primär darum gehen soll, alle Texte dort abzuspeichern, finde ich diese Ansätze eigentlich als untauglich :-(
Es sollte dann unerheblich sein, ob etwas zum Menu gehört, oder sonstwohin. Die Struktur deines Menues und anderer Inhalte solltest du woanders verwalten.

Ich würde da eher an soetwas denken:

Code:
<lang>
  <edit>
    <de>Bearbeiten</de>
    <en>edit</en>
  </edit>
  <new>
    <de>Neu</de>
    <en>new</en>
  </new>
  <close>
    <de>Schliessen</de>
    <en>close</en>
  </close>
</lang>
...Du kannst da jedes Phrase anhand des Elementnamens selektieren, und bist auch vorbereitet auf Mehrsprachigkeit.
 

jkallup

Erfahrenes Mitglied
Hallo,

warum machst Du es nicht wie im Rechnungswesen ala Kontenplan(nummern)?
Als0 zb.

Kundenkonto: 2300
Kunde: 3

dann wird ein Account/Buchungsnummer dann 23003 ...
usw.

Gruß
jens
 

hela

Premium-User
Hallo,
das verstehe ich überhaupt nicht:
Beim 2. ... Der Nachteil ist das man alleine an der MenuItem ID das Item nicht eindeutig ist.
Da in einem XML-Dokument die Reihenfolge der Elemente relevant ist, könnte man es auch folgendermaßen machen:
XML:
<Menu>
  <Item>
    <name lang="de">Datei</name>
    <name lang="en">File</name>
    <Item>
      <name lang="de">Neu</name>
      <name lang="en">New</name>
    </Item>
    <Item>
      <name lang="de">Öffnen</name>
      <name lang="en">Open></name>
    </Item>
    <Item>
      <name lang="de">Schließen</name>
      <name lang="en">Close</name>  <!-- über folgenden XPath-Ausdr. erreichbar:
              /Menu/Item[1]/Item[3]/name[@lang='en'] -->
    </Item>
  </Item>
  <Item>
    <name lang="de">Bearbeiten"</name>
    <name lang="en">Edit</name>
    <Item>
      <name lang="de">Rückgängig</name>
      <name lang="de">Undo</name>
    </Item>
    <Item>
      <name lang="de">Wiederherstellen</name>
      <name lang="en">Redo</name>
    </Item>
  </Item>
  <Item>
    <name lang="de">Hilfe</name>
    <name lang="en">Help</name>
  </Item>
</Menu>
... wobei ich den Vorschlag von Sven viel übersichtlicher finde.
 
Zuletzt bearbeitet von einem Moderator:

zer0

Erfahrenes Mitglied
Hallo, Danke erstmal für eure Antworten.

Was mit bei Sven's Lösung nicht gefällt ist das man dann im Programm über Strings zum Text navigieren würde. Wobei ich es gut finde das die Texte unabhängig vom Layout sind.

@Hela: Was ich gemeint hab in meinem ersten Post war, das z.B. das MenuItem "Schließen" nur dann eindeutig über die ID ist, wenn es mit der ID des Menu's "Datei" zusammengebracht wird. Also 1 & 3.
 
Hallo,

muss es denn unbedingt XML sein? Ansonsten könntest du auch eine etablierte, getestete Komponente wie gettext einsetzen.

Im Übrigen stimme ich Sven zu: die Menüstruktur hat in der Übersetzungsdatei nichts zu suchen.

@Sven: Mit deinem Vorschlag bin ich allerdings nicht ganz einverstanden. Die Tagnamen als Daten zu missbrauchen macht es schwierig, die XML-Dateien mit einer DTD/XSD zu validieren. Man müsste bei jeder neuen Phrase und Sprache die DTD/XSD aktualisieren. Ich würde vorschlagen, mit einem festen Satz von Tags zu arbeiten:
XML:
<?xml version="1.0" encoding="utf-8"?>
<translation xml:lang="de">
  <message id="File">Datei</message>
  <message id="New">Neu</message>
  <message id="Close">Schließen</message>
  <!-- etc. -->
</translation>
Die Phrasen werden (ähnlich wie bei gettext) über ihre englische Übersetzung identifiziert. Außerdem bekommt jede Sprache ihre eigene XML-Datei (in der Regel will man sowieso nur eine Sprache gleichzeitig benutzen, also warum sollte man alle anderen auch laden?).

Die Qt-Bibliothek verwendet übrigens auch ein XML-Format für Übersetzungen.

Grüße,
Matthias
 
Zuletzt bearbeitet von einem Moderator:

Sven Mintel

Mitglied
@Sven: Mit deinem Vorschlag bin ich allerdings nicht ganz einverstanden. Die Tagnamen als Daten zu missbrauchen macht es schwierig, die XML-Dateien mit einer DTD/XSD zu validieren. Man müsste bei jeder neuen Phrase und Sprache die DTD/XSD aktualisieren.

Jo, da hast du natürlich recht.
Wenn man die Phrasen validieren will/muss, dann ist das ungeeignet.

Ich hab dabei bisher allerdings immer auf Validierung verzichtet:-(
 

zer0

Erfahrenes Mitglied
Hallo,

erstmal vielen Dank für die Antworten.

@Sven: Ich habe das so gemeint: Ich finde es besser wenn ich eine Methode getItem() habe, der ich als Parameter eine ID als Zahl übergebe anstatt ein String wie "edit". Aber das ist eigentlich nur meine persönliche Meinung.

Das mit gettext ist auch eine Idee, die mir bisher noch nicht bekannt war.
Ich finde es mit einer XML Datei einfach sehr einfach und elegant, den diese kann man überall öffnen und bearbeiten. Somit kann leicht von anderen Usern die Datei in eine andere Sprache übersetzt werden.

Das man die Menu-Struktur vielleicht lieber nicht in die Datei machen sollte habt ihr wahrscheinlich recht. Es sieht halt so Übersichtlicher aus, man findet sehr leicht das, was man sucht. Man muss hinzu sagen das nicht nur Menu in die Datei mit aufgenommen wird, alles was an Text auffällt kommt rein, also Buttons, Tooltip, Titel etc.
 
Zuletzt bearbeitet: