Irrlicht - from Noob to Pro: Verschiedene Sprachen

Aus Wikibooks
Wechseln zu: Navigation, Suche
Wikibooks buchseite.svg Zurück zu "XML in Irrlicht" | One wikibook.svg Hoch zu "Inhaltsverzeichnis" | Wikibooks buchseite.svg Vor zu "Open Dynamics Engine"


Um eine möglichst große Zielgruppe anzusprechen ist es sinnvoll, für seine Spiele verschiedene Sprachen zur Verfügung zu stellen. Eine Möglichkeit genau das zu realisieren ist [XML]. Dabei erstellt man eine Sprachdatei, die sogenannte Tags enthält. Diese Tags stehen symbolisch für eine Message, die dann in die jeweilige Sprache übersetzt ist. Zunächst betrachten wir zwei solche Messageressources:

english.xml

<?xml version="1.0"?>
<config>
        <language lang="english">
        <keyword tag="application.title" translation="My Game">
        <keyword tag="application.language" translation="English">
</config>

deutsch.xml

<?xml version="1.0"?>
<config>
        <language lang="deutsch">
        <keyword tag="application.title" translation="Mein Spiel">
        <keyword tag="application.language" translation="Deutsch">
</config>

Man kann sich nun langsam vorstellen, auf was es hinausläuft. Man lädt nun die Tags in eine Liste, verknüpft diese mit der entsprechenden Übersetzung und verwendet, dann diese.

#include <map>
using namespace std;
 
map<stringc, stringc> messageRessource;


void loadLanguage(const char* language)
{
  IXMLReader* reader = device->getFileSystem()->createXMLReader(stringc(language) + ".xml");
  if(reader)
  {
    stringc tag, translation;
 
    while(reader->read())
    {
      switch(reader->getNodeType())
      {
        case EXN_ELEMENT:
          if(stringw("keyword") == reader->getNodeName())
          {
            tag = stringc(reader->getAttributeValue(L"tag"));
            translation = stringc(reader->getAttributeValue(L"translation"));
 
            messageRessource[tag] = translation;
          }
          break;
 
        case EXN_ELEMENT_END:
        if(stringw("config") == reader->getNodeName())
        {
          return;
        }
        break;
      }
    }
  }
}

So bekommt man eine Liste der ganzen Übersetzungen für einen Tag. Nun muss man diese nur noch an entsprechender Stelle einsetzen.

stringc getTranslationByTag(stringc tag)
{
  map<stringc, stringc>::iterator it;
  //suche Übersetzung
  it = messageRessource.find(tag);
 
  //falls keine Übersetzung gefunden (nicht vorhanden, oder verschrieben) dann setze einen default-Wert
  if(it == messageRessource.end())
  {
    return stringc("Null");
  }
 
  return it->second;
}


Um dann eine beliebige Sprache einzustellen, lädt man die entsprechende Sprachdatei.

//loadLanguage("english");
loadLanguage("deutsch");
 
stringw windowCaption = stringw(getTranslationByTag("application.Title"));
device->setWindowCaption(windowCaption.c_str());


Irrnoob spiel in deutsch.png Irrnoob spiel in englisch.png