Subversion Repositories spk

Rev

Rev 197 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include "Languages.h"

#include <stdarg.h>
#include "SpkFile.h"

CLanguages *CLanguages::_pInstance = NULL;


void CLanguages::DEBUG_AddDefaultTexts()
{
        if (_lTexts)
        {
                _pDefaultLang = &(*_lTexts)[44];

                {
                        LangPage &page = (*_pDefaultLang)[LS_STARTUP];
                        page[LANGSTARTUP_ANOTHERINSTANCE_TITLE] = L"Another Instance Detected";
                        page[LANGSTARTUP_ANOTHERINSTANCE] = L"Another instance of the plugin manager is already running";
                        page[LANGSTARTUP_LOCKEDDIR_TITLE] = L"Directory Locked";
                        page[LANGSTARTUP_LOCKEDDIR] = L"ERROR: The game directory:\n%s\n\nIs locked and unable to add/remove any plugins";
                        page[LANGSTARTUP_PROTECTEDDIR] = L"";
                }

                {
                        LangPage &page = (*_pDefaultLang)[LS_DIRECTORY];
                        page[LANGDIR_TITLE] = L"Directory Control";
                }

                {
                        LangPage& page = (*_pDefaultLang)[LS_SCRIPTTYPE];
                        page[CSpkFile::SCRIPTTYPE_LIBRARY] = L"Library";
                        page[CSpkFile::SCRIPTTYPE_UPDATE] = L"Package Update";
                        page[CSpkFile::SCRIPTTYPE_CUSTOMSTART] = L"Custom Start";
                        page[CSpkFile::SCRIPTTYPE_PATCH] = L"Patch";
                        page[CSpkFile::SCRIPTTYPE_FAKEPATCH] = L"Fake Patch";
                        page[CSpkFile::SCRIPTTYPE_CUSTOM] = L"Custom";
                        page[CSpkFile::SCRIPTTYPE_NAVIGATION] = L"Navigation";
                        page[CSpkFile::SCRIPTTYPE_COMBAT] = L"Combat";
                        page[CSpkFile::SCRIPTTYPE_MISSION] = L"Mission";
                        page[CSpkFile::SCRIPTTYPE_ALPLUGIN] = L"AL Plugin";
                        page[CSpkFile::SCRIPTTYPE_HOTKEY] = L"Hotkey";
                        page[CSpkFile::SCRIPTTYPE_SHIPUPGRADE] = L"Ship Upgrade";
                        page[CSpkFile::SCRIPTTYPE_SHIPCOMMAND] = L"Ship Command";
                        page[CSpkFile::SCRIPTTYPE_STATIONCOMMAND] = L"Station Command";
                        page[CSpkFile::SCRIPTTYPE_FLEET] = L"Fleet Management";
                        page[CSpkFile::SCRIPTTYPE_TRADE] = L"Trade";
                        page[CSpkFile::SCRIPTTYPE_PIRACY] = L"Piracy";
                        page[CSpkFile::SCRIPTTYPE_CHEAT] = L"Cheat";
                        page[CSpkFile::SCRIPTTYPE_EXTENSION] = L"Extension Mods";
                        page[CSpkFile::SCRIPTTYPE_REBALANCE] = L"Rebalance";
                        page[CSpkFile::SCRIPTTYPE_FIX] = L"Vanilla Fix";
                        page[CSpkFile::SCRIPTTYPE_GENERALMOD] = L"General Mod";
                        page[CSpkFile::SCRIPTTYPE_TOTAL] = L"Totel Conversion";
                        page[CSpkFile::SCRIPTTYPE_WINGCOMMAND] = L"Wing Command";
                        page[CSpkFile::SCRIPTTYPE_OTHER] = L"Other";
                }
        }
}


CLanguages::CLanguages() : 
        _iLanguage(-1),
        _pDefaultLang(nullptr),
        _pCurrentLang(nullptr),
        _langStack(nullptr)
{
        _lTexts = new LangTexts();
        _langStack = new std::vector<int>();
}

CLanguages::~CLanguages()
{
        delete _lTexts;
        _pDefaultLang = NULL;
        _pCurrentLang = NULL;
        if (_langStack)
        {
                delete _langStack;
                _langStack = nullptr;
        }
}

CLanguages *CLanguages::Instance()
{
        if ( !_pInstance ) {
                _pInstance = new CLanguages();
                _pInstance->DEBUG_AddDefaultTexts();
        }

        return _pInstance;
}

void CLanguages::Release()
{
        if ( _pInstance ) {
                delete _pInstance;
                _pInstance = NULL;
        }
}

void CLanguages::setLanguage(int lang) 
{ 
        _iLanguage = lang; 
        _pCurrentLang = NULL;
        if (_lTexts)
        {
                auto itr = _lTexts->find(lang);
                if (itr != _lTexts->end())
                        _pCurrentLang = &itr->second;
        }
}

void CLanguages::pushLanguage(int lang)
{
        if (_iLanguage != lang)
        {       
                if (!_langStack)
                        _langStack = new std::vector<int>();    
                _langStack->push_back(_iLanguage);
                setLanguage(lang);
        }
}
void CLanguages::popLanguage()
{
        if (!_langStack ||_langStack->empty())
                return;
        setLanguage(_langStack->back());
        _langStack->pop_back();
}


Utils::WString CLanguages::findText(int section, int id)
{
        LangPages *text = _pCurrentLang;
        if (!text) text = _pDefaultLang;
        if (!text) text = _findLanguageText();

        Utils::WString out;
        if (_findText(text, section, id, &out))
                return out;

        if (_pDefaultLang && text != _pDefaultLang)
        {
                if (_findText(_pDefaultLang, section, id, &out))
                        return out;
        }

        return _error(section, id);
}

bool CLanguages::_findText(LangPages *texts, int section, int id, Utils::WString *out) const
{
        if (texts)
        {
                auto itr = texts->find(section);
                if (itr != texts->end())
                {
                        LangPage *m = &itr->second;
                        auto itr2 = m->find(id);
                        if (itr2 != m->end())
                        {
                                if (out)
                                        (*out) = itr2->second;
                                return true;
                        }
                }
        }

        return false;
}

LangPages *CLanguages::_findLanguageText(int id) const
{
        if ( id == -1 ) id = _iLanguage;

        if ( _lTexts ) {
                auto itr = _lTexts->find(id);
                if (itr != _lTexts->end())
                        return &itr->second;
        }

        return NULL;
}

Utils::WString CLanguages::_error(int section, int id) const
{
        return L"ReadText" + Utils::WString::Number(section) + "-" + Utils::WString::Number(id);
}