Irrlicht - from Noob to Pro: Verschiedene Sprachen
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());