32 const std::string
XML_TYPE(
"Language");
34 template <> LanguageManager* Singleton<LanguageManager>::msInstance =
nullptr;
35 template <>
const char* Singleton<LanguageManager>::mClassTypeName(
"LanguageManager");
61 mIsInitialise =
false;
66 std::string default_lang;
67 bool event_change =
false;
78 while (info.
next(
"Info"))
87 while (source_info.
next(
"Source"))
96 while (source_info.next(
"Source"))
98 std::string file_source = source_info->
getContent();
100 mMapFile[name].push_back(file_source);
103 if (name == mCurrentLanguageName)
105 loadLanguage(file_source,
false);
114 if (!default_lang.empty())
116 else if (event_change)
122 MapListString::iterator item = mMapFile.find(_name);
123 if (item == mMapFile.end())
125 MYGUI_LOG(Error,
"Language '" << _name <<
"' is not found");
129 mMapLanguage.clear();
130 mCurrentLanguageName = _name;
132 for (VectorString::const_iterator iter = item->second.begin(); iter != item->second.end(); ++iter)
134 loadLanguage(*iter,
false);
140 bool LanguageManager::loadLanguage(
const std::string& _file,
bool _user)
145 MYGUI_LOG(Error,
"file '" << _file <<
"' not found");
149 if (_file.find(
".xml") != std::string::npos)
150 _loadLanguageXML(data.
getData(), _user);
152 _loadLanguage(data.
getData(), _user);
157 void LanguageManager::_loadLanguageXML(IDataStream* _stream,
bool _user)
161 if (doc.open(_stream))
167 while (tag.next(
"Tag"))
170 mUserMapLanguage[tag->findAttribute(
"name")] = tag->getContent();
172 mMapLanguage[tag->findAttribute(
"name")] = tag->getContent();
178 void LanguageManager::_loadLanguage(IDataStream* _stream,
bool _user)
182 while (!_stream->eof())
184 _stream->readline(read,
'\n');
185 if (read.empty())
continue;
188 if ((
uint8)read[0] == 0xEF && read.size() > 2)
193 if (read[read.size() - 1] ==
'\r') read.erase(read.size() - 1, 1);
194 if (read.empty())
continue;
196 size_t pos = read.find_first_of(
" \t");
199 if (pos == std::string::npos) mUserMapLanguage[read] =
"";
200 else mUserMapLanguage[read.substr(0, pos)] = read.substr(pos + 1, std::string::npos);
204 if (pos == std::string::npos) mMapLanguage[read] =
"";
205 else mMapLanguage[read.substr(0, pos)] = read.substr(pos + 1, std::string::npos);
214 bool replace =
false;
217 result = replaceTagsPass(result, replace);
226 MapLanguageString::iterator iter = mMapLanguage.find(_tag);
227 if (iter != mMapLanguage.end())
232 MapLanguageString::iterator iterUser = mUserMapLanguage.find(_tag);
233 if (iterUser != mUserMapLanguage.end())
235 return iterUser->second;
243 return mCurrentLanguageName;
248 mUserMapLanguage[_tag] = _replace;
253 mUserMapLanguage.clear();
258 return loadLanguage(_file,
true);
261 UString LanguageManager::replaceTagsPass(
const UString& _line,
bool& _replaceResult)
263 _replaceResult =
false;
296 size_t start = iter - line.begin();
297 size_t len = (iter2 - line.begin()) - start - 1;
298 const UString& tag = line.substr(start + 1, len);
303 MapLanguageString::iterator replace = mMapLanguage.find(tag);
304 if (replace != mMapLanguage.end())
306 replacement = replace->second;
311 replace = mUserMapLanguage.find(tag);
312 if (replace != mUserMapLanguage.end())
314 replacement = replace->second;
331 iter = line.insert(iter,
'#') + size_t(len + 2);
337 _replaceResult =
true;
339 iter = line.erase(iter -
size_t(1), iter2 +
size_t(1));
340 size_t pos = iter - line.begin();
341 line.insert(pos, replacement);
342 iter = line.begin() + pos + replacement.length();
bool loadUserTags(const std::string &_file)
void unregisterLoadXmlDelegate(const std::string &_key)
LoadXmlDelegate & registerLoadXmlDelegate(const std::string &_key)
delegates::IDelegate0 * newDelegate(void(*_func)())
static ResourceManager & getInstance()
UString getTag(const UString &_tag)
bool findAttribute(const std::string &_name, std::string &_value)
static const char * getClassTypeName()
const std::string XML_TYPE("Font")
_fwd_iterator iterator
iterator
void addUserTag(const UString &_tag, const UString &_replace)
#define MYGUI_LOG(level, text)
delegates::CMultiDelegate1< const std::string & > eventChangeLanguage
#define MYGUI_ASSERT(exp, dest)
forward iterator for UString
virtual IDataStream * getData(const std::string &_name)=0
ElementEnumerator getElementEnumerator()
void setCurrentLanguage(const std::string &_name)
A UTF-16 string with implicit conversion to/from std::string and std::wstring.
UString replaceTags(const UString &_line)
const std::string & getCurrentLanguage() const
delegates::CDelegate2< const UString &, UString & > eventRequestTag
const std::string & getContent() const
float len(float x, float y)