Jump to content
Unity Insider Forum

multi language


Recommended Posts

Hallo Leute,

 

Erst einmal hoffe ich, dass ich das an der richtigen Stelle poste.

Ich hab vor ein paar Tagen ein Script für multi language geschrieben.

Für dieses Script braucht ihr einmal ein C# Script mit dem Namen „XmlReader“ und eine XML-Datei, die ihr dann „Languages“ nennt.

 

Das C#-Script sieht so aus:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Text;
public class XmlReader : MonoBehaviour {

public TextAsset dictionary;
public int currentLanguage;
public string GetName(string name){
 XmlDocument xmlDoc = new XmlDocument();
 xmlDoc.LoadXml(dictionary.text);
 XmlNodeList languageList = xmlDoc.GetElementsByTagName("language");
 int i = 0;
 if(currentLanguage < languageList.Count)
  i = currentLanguage;
 XmlNodeList languageContent = languageList[i].ChildNodes;
 foreach(XmlNode value in languageContent)
 {
  if(value.Name == name){
name = value.InnerText;
break;
  }
 }
 return name;
}
}

 

Die xml-Datei könnte dann bei euch z.B. so aussehen:

<?xml version="1.0" encoding="utf-8" ?>
<languages>
<language>
 <languageName>English</languageName>
 <Stone>Stone</Stone>
 <Wood>Wood</Wood>
</language>
<language>
 <languageName>Deutsch</languageName>
 <Stone>Stein</Stone>
 <Wood>Holz</Wood>
</language>
</languages>

 

Habt ihr beide Dateien fertig so füge das C#-Script einem GameObject hinzu und an der stelle für „dictionary“ kommt die xml-Datei rein. Mit der Funktion „GetName“ also am Beispiel meiner xml-Datei

GetName(„Stone“)

und wenn dann zuvor als „currentLanguage = 1“ (Deutsch) ausgewählt wurde bekommt die Funktion als Rückmeldung „Stein“.

 

Hoffe ihr könnt es gebrauche :D

 

LG FileStriker

Link zu diesem Kommentar
Auf anderen Seiten teilen

XML ist ein ziemlich flexibles System, das in der IT-Welt überall eingesetzt wird. Insofern halte ich den Ansatz, XML zu benutzen, für eine gute Wahl.

 

Ich wäre allerdings anders vorgegangen:

<translation>
 <translate id="1">
   <item language="english" value="stone" />
   <item language="deutsch" value="Stein" />
 </translate>
 <translate id="2">
   <item language="english" value="wood" />
   <item language="deutsch" value="Holz" />
 </translate>
 <translate id="3">
   <item language="english" value="Mary has a little lamb" />
   <item language="deutsch" value="Hier ist die Kacke am dampfen" />
 </translate>
</translation>

Hat den Vorteil, dass alle Sprachvarianten in einem XML-Block stehen. Ich würde auch den Nodes nicht direkt den Namen geben.

 <Stone>Stone</Stone>
 <Wood>Wood</Wood>

hat den Nachteil, dass es umständlich wiederzufinden ist. Was machst du, wenn du mal einen ganzen Satz übersetzen willst? <Mary has a little lamb> geht nicht. Ohne Leerzeichen? Groß-Kleinschreibung? Umlaute? Außerdem kannst du das auch wieder nur umständlich mit XSLT und XPATH bearbeiten.

 

Deine GetName-Methode ist von der Performance her relativ langsam. Jedesmal, wenn du eine Übersetzung brauchst, liest du ein Dictionary ein und gehst es dann per komplizierter Schleife durch. Der User wechselt ja nicht ständig seine Sprache. Wenn die Sprache gewechselt wird, würde ich eine Hashtable erstellen, die nur Items in der gewünschten Sprache enthält, und auf die dann per Static-Klasse zugreifen. Das Initialisieren der Hash-Table passiert ja nur beim Wechseln der Sprache, also normalerweise nur einmal pro Spielstart.

 

Zu guter Letzt ist XmlDocument die umständlichere Variante. In .Net gibts die XDocument-Klasse, die wesentlich einfacher zu handhaben ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...