21 mXmlLanguageTagName(
"Language"),
22 mSingletonHolder(this)
46 mIsInitialise =
false;
51 std::string default_lang;
52 bool event_change =
false;
56 while (root.
next(mXmlLanguageTagName))
63 while (info.
next(
"Info"))
72 while (source_info.
next(
"Source"))
81 while (source_info.next(
"Source"))
83 const std::string& file_source = source_info->getContent();
85 mMapFile[name].push_back(file_source);
88 if (name == mCurrentLanguageName)
90 loadLanguage(file_source,
false);
98 if (!default_lang.empty())
100 else if (event_change)
106 MapListString::iterator item = mMapFile.find(_name);
107 if (item == mMapFile.end())
109 MYGUI_LOG(Error,
"Language '" << _name <<
"' is not found");
113 mMapLanguage.clear();
114 mCurrentLanguageName = _name;
116 for (
const auto& file : item->second)
118 loadLanguage(file,
false);
124 bool LanguageManager::loadLanguage(
const std::string& _file,
bool _user)
129 MYGUI_LOG(Error,
"file '" << _file <<
"' not found");
133 if (_file.find(
".xml") != std::string::npos)
134 _loadLanguageXML(data.
getData(), _user);
136 _loadLanguage(data.
getData(), _user);
141 void LanguageManager::_loadLanguageXML(IDataStream* _stream,
bool _user)
145 if (doc.open(_stream))
150 xml::ElementEnumerator tag = root->getElementEnumerator();
151 while (tag.next(
"Tag"))
153 auto& map = _user ? mUserMapLanguage : mMapLanguage;
154 mapSet(map, tag->findAttribute(
"name"), tag->getContent());
160 void LanguageManager::_loadLanguage(IDataStream* _stream,
bool _user)
164 while (!_stream->eof())
166 _stream->readline(read,
'\n');
171 if ((
uint8)read[0] == 0xEF && read.size() > 2)
176 if (read[read.size() - 1] ==
'\r')
177 read.erase(read.size() - 1, 1);
181 size_t pos = read.find_first_of(
" \t");
184 if (pos == std::string::npos)
185 mUserMapLanguage[read].clear();
187 mUserMapLanguage[read.substr(0, pos)] = read.substr(pos + 1, std::string::npos);
191 if (pos == std::string::npos)
192 mMapLanguage[read].clear();
194 mMapLanguage[read.substr(0, pos)] = read.substr(pos + 1, std::string::npos);
203 bool replace =
false;
206 result = replaceTagsPass(result, replace);
214 MapLanguageString::const_iterator iter = mMapLanguage.find(_tag);
215 if (iter != mMapLanguage.end())
220 MapLanguageString::const_iterator iterUser = mUserMapLanguage.find(_tag);
221 if (iterUser != mUserMapLanguage.end())
223 return iterUser->second;
231 return mCurrentLanguageName;
238 for (
const auto& iter : mMapFile)
240 result.push_back(iter.first);
247 mUserMapLanguage[_tag] = _replace;
252 mUserMapLanguage.clear();
257 return loadLanguage(_file,
true);
260 UString LanguageManager::replaceTagsPass(
const UString& _line,
bool& _replaceResult)
262 _replaceResult =
false;
266 UString::utf32string::iterator end = line.end();
267 for (UString::utf32string::iterator iter = line.begin(); iter != end;)
282 UString::utf32string::iterator iter2 = iter;
288 return UString(line);
292 size_t start = iter - line.begin();
293 size_t len = (iter2 - line.begin()) - start - 1;
299 MapLanguageString::iterator replace = mMapLanguage.find(UString(tag));
300 if (replace != mMapLanguage.end())
302 replacement = replace->second;
307 replace = mUserMapLanguage.find(UString(tag));
308 if (replace != mUserMapLanguage.end())
310 replacement = replace->second;
327 iter = line.insert(iter,
'#') + size_t(
len + 2);
333 _replaceResult =
true;
335 iter = line.erase(iter -
size_t(1), iter2 +
size_t(1));
336 size_t pos = iter - line.begin();
337 line.insert(pos, replacement.asUTF32());
338 iter = line.begin() + pos + replacement.length();
341 return UString(line);
353 return UString(line);
#define MYGUI_ASSERT(exp, dest)
#define MYGUI_LOG(level, text)
#define MYGUI_SINGLETON_DEFINITION(ClassName)
virtual IDataStream * getData(const std::string &_name) const =0
static DataManager & getInstance()
delegates::MultiDelegate< const std::string & > eventChangeLanguage
void setCurrentLanguage(std::string_view _name)
const std::string & getCurrentLanguage() const
delegates::Delegate< const UString &, UString & > eventRequestTag
void addUserTag(const UString &_tag, const UString &_replace)
static std::string_view getClassTypeName()
VectorString getLanguages() const
UString getTag(const UString &_tag) const
bool loadUserTags(const std::string &_file)
UString replaceTags(const UString &_line)
void unregisterLoadXmlDelegate(std::string_view _key)
LoadXmlDelegate & registerLoadXmlDelegate(std::string_view _key)
static ResourceManager & getInstance()
A UTF-16 string with implicit conversion to/from std::string and std::wstring.
const utf32string & asUTF32() const
returns the current string in UTF-32 form within a utf32string
std::basic_string< unicode_char > utf32string
string type used for returning UTF-32 formatted data
const std::string & getContent() const
bool findAttribute(std::string_view _name, std::string &_value)
ElementEnumerator getElementEnumerator()
std::vector< std::string > VectorString
void mapSet(Map &map, std::string_view key, const Value &value)
delegates::DelegateFunction< Args... > * newDelegate(void(*_func)(Args... args))
float len(float x, float y)