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());
![]() |
![]() |

