Subversion Repositories spk

Rev

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

Rev Author Line No. Line
104 cycrow 1
#include "Languages.h"
2
 
3
#include <stdarg.h>
299 cycrow 4
#include "SpkFile.h"
104 cycrow 5
 
6
CLanguages *CLanguages::_pInstance = NULL;
7
 
122 cycrow 8
 
9
void CLanguages::DEBUG_AddDefaultTexts()
104 cycrow 10
{
122 cycrow 11
	if (_lTexts)
12
	{
13
		_pDefaultLang = &(*_lTexts)[44];
14
 
15
		{
16
			LangPage &page = (*_pDefaultLang)[LS_STARTUP];
197 cycrow 17
			page[LANGSTARTUP_ANOTHERINSTANCE_TITLE] = L"Another Instance Detected";
18
			page[LANGSTARTUP_ANOTHERINSTANCE] = L"Another instance of the plugin manager is already running";
19
			page[LANGSTARTUP_LOCKEDDIR_TITLE] = L"Directory Locked";
20
			page[LANGSTARTUP_LOCKEDDIR] = L"ERROR: The game directory:\n%s\n\nIs locked and unable to add/remove any plugins";
21
			page[LANGSTARTUP_PROTECTEDDIR] = L"";
122 cycrow 22
		}
23
 
24
		{
25
			LangPage &page = (*_pDefaultLang)[LS_DIRECTORY];
197 cycrow 26
			page[LANGDIR_TITLE] = L"Directory Control";
122 cycrow 27
		}
299 cycrow 28
 
29
		{
30
			LangPage& page = (*_pDefaultLang)[LS_SCRIPTTYPE];
31
			page[CSpkFile::SCRIPTTYPE_LIBRARY] = L"Library";
32
			page[CSpkFile::SCRIPTTYPE_UPDATE] = L"Package Update";
33
			page[CSpkFile::SCRIPTTYPE_CUSTOMSTART] = L"Custom Start";
34
			page[CSpkFile::SCRIPTTYPE_PATCH] = L"Patch";
35
			page[CSpkFile::SCRIPTTYPE_FAKEPATCH] = L"Fake Patch";
36
			page[CSpkFile::SCRIPTTYPE_CUSTOM] = L"Custom";
37
			page[CSpkFile::SCRIPTTYPE_NAVIGATION] = L"Navigation";
38
			page[CSpkFile::SCRIPTTYPE_COMBAT] = L"Combat";
39
			page[CSpkFile::SCRIPTTYPE_MISSION] = L"Mission";
40
			page[CSpkFile::SCRIPTTYPE_ALPLUGIN] = L"AL Plugin";
41
			page[CSpkFile::SCRIPTTYPE_HOTKEY] = L"Hotkey";
42
			page[CSpkFile::SCRIPTTYPE_SHIPUPGRADE] = L"Ship Upgrade";
43
			page[CSpkFile::SCRIPTTYPE_SHIPCOMMAND] = L"Ship Command";
44
			page[CSpkFile::SCRIPTTYPE_STATIONCOMMAND] = L"Station Command";
45
			page[CSpkFile::SCRIPTTYPE_FLEET] = L"Fleet Management";
46
			page[CSpkFile::SCRIPTTYPE_TRADE] = L"Trade";
47
			page[CSpkFile::SCRIPTTYPE_PIRACY] = L"Piracy";
48
			page[CSpkFile::SCRIPTTYPE_CHEAT] = L"Cheat";
49
			page[CSpkFile::SCRIPTTYPE_EXTENSION] = L"Extension Mods";
50
			page[CSpkFile::SCRIPTTYPE_REBALANCE] = L"Rebalance";
51
			page[CSpkFile::SCRIPTTYPE_FIX] = L"Vanilla Fix";
52
			page[CSpkFile::SCRIPTTYPE_GENERALMOD] = L"General Mod";
53
			page[CSpkFile::SCRIPTTYPE_TOTAL] = L"Totel Conversion";
54
			page[CSpkFile::SCRIPTTYPE_WINGCOMMAND] = L"Wing Command";
55
			page[CSpkFile::SCRIPTTYPE_OTHER] = L"Other";
56
		}
122 cycrow 57
	}
104 cycrow 58
}
59
 
122 cycrow 60
 
61
CLanguages::CLanguages() : 
62
	_iLanguage(-1),
299 cycrow 63
	_pDefaultLang(nullptr),
64
	_pCurrentLang(nullptr),
65
	_langStack(nullptr)
122 cycrow 66
{
67
	_lTexts = new LangTexts();
299 cycrow 68
	_langStack = new std::vector<int>();
122 cycrow 69
}
70
 
104 cycrow 71
CLanguages::~CLanguages()
72
{
122 cycrow 73
	delete _lTexts;
74
	_pDefaultLang = NULL;
75
	_pCurrentLang = NULL;
299 cycrow 76
	if (_langStack)
77
	{
78
		delete _langStack;
79
		_langStack = nullptr;
80
	}
104 cycrow 81
}
82
 
83
CLanguages *CLanguages::Instance()
84
{
85
	if ( !_pInstance ) {
86
		_pInstance = new CLanguages();
122 cycrow 87
		_pInstance->DEBUG_AddDefaultTexts();
104 cycrow 88
	}
89
 
90
	return _pInstance;
91
}
92
 
93
void CLanguages::Release()
94
{
95
	if ( _pInstance ) {
96
		delete _pInstance;
97
		_pInstance = NULL;
98
	}
99
}
100
 
197 cycrow 101
void CLanguages::setLanguage(int lang) 
122 cycrow 102
{ 
103
	_iLanguage = lang; 
104
	_pCurrentLang = NULL;
105
	if (_lTexts)
106
	{
107
		auto itr = _lTexts->find(lang);
108
		if (itr != _lTexts->end())
109
			_pCurrentLang = &itr->second;
110
	}
111
}
104 cycrow 112
 
299 cycrow 113
void CLanguages::pushLanguage(int lang)
114
{
115
	if (_iLanguage != lang)
116
	{	
117
		if (!_langStack)
118
			_langStack = new std::vector<int>();	
119
		_langStack->push_back(_iLanguage);
120
		setLanguage(lang);
121
	}
122
}
123
void CLanguages::popLanguage()
124
{
125
	if (!_langStack ||_langStack->empty())
126
		return;
127
	setLanguage(_langStack->back());
128
	_langStack->pop_back();
129
}
122 cycrow 130
 
299 cycrow 131
 
197 cycrow 132
Utils::WString CLanguages::findText(int section, int id)
104 cycrow 133
{
122 cycrow 134
	LangPages *text = _pCurrentLang;
135
	if (!text) text = _pDefaultLang;
136
	if (!text) text = _findLanguageText();
137
 
197 cycrow 138
	Utils::WString out;
122 cycrow 139
	if (_findText(text, section, id, &out))
140
		return out;
141
 
142
	if (_pDefaultLang && text != _pDefaultLang)
104 cycrow 143
	{
122 cycrow 144
		if (_findText(_pDefaultLang, section, id, &out))
145
			return out;
104 cycrow 146
	}
147
 
122 cycrow 148
	return _error(section, id);
104 cycrow 149
}
150
 
197 cycrow 151
bool CLanguages::_findText(LangPages *texts, int section, int id, Utils::WString *out) const
104 cycrow 152
{
122 cycrow 153
	if (texts)
154
	{
155
		auto itr = texts->find(section);
156
		if (itr != texts->end())
104 cycrow 157
		{
122 cycrow 158
			LangPage *m = &itr->second;
159
			auto itr2 = m->find(id);
160
			if (itr2 != m->end())
161
			{
162
				if (out)
163
					(*out) = itr2->second;
164
				return true;
165
			}
104 cycrow 166
		}
167
	}
168
 
122 cycrow 169
	return false;
170
}
171
 
172
LangPages *CLanguages::_findLanguageText(int id) const
173
{
174
	if ( id == -1 ) id = _iLanguage;
175
 
176
	if ( _lTexts ) {
177
		auto itr = _lTexts->find(id);
178
		if (itr != _lTexts->end())
179
			return &itr->second;
180
	}
181
 
104 cycrow 182
	return NULL;
183
}
122 cycrow 184
 
197 cycrow 185
Utils::WString CLanguages::_error(int section, int id) const
122 cycrow 186
{
197 cycrow 187
	return L"ReadText" + Utils::WString::Number(section) + "-" + Utils::WString::Number(id);
122 cycrow 188
}