Irrlicht - from Noob to Pro: Verschiedene Sprachen

Aus Wikibooks


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());