59 if (spellsRange.begin() == spellsRange.end())
63 std::vector<LanguageDesc> langsWithSkill;
64 for (LanguagesMap::value_type
const& spellItr : spellsRange)
72 _langsMap.emplace(langEntry->ID, langDesc);
93 uint8 length = std::min(18U,
uint32(strlen(wordEntry->Word)));
97 _wordsMap[key].push_back(wordEntry->Word);
112 void StripHyperlinks(std::string
const& source, std::string& dest)
114 dest.resize(source.length());
116 bool skipSquareBrackets =
false;
117 for (
size_t i = 0; i < source.length(); ++i)
122 if (!skipSquareBrackets || (c !=
'[' && c !=
']'))
123 dest[destSize++] = source[i];
128 if (i + 1 >= source.length())
131 switch (source[i + 1])
143 i = source.find(
"|h", i);
144 if (i != std::string::npos)
146 skipSquareBrackets =
true;
150 skipSquareBrackets =
false;
154 i = source.find(
"|t", i);
155 if (i != std::string::npos)
163 dest.resize(destSize);
166 void ReplaceUntranslatableCharactersWithSpace(std::string& text)
168 std::wstring wstrText;
172 for (
wchar_t& w : wstrText)
179 static char upper_backslash(
char c)
181 return c ==
'/' ?
'\\' : char(toupper(c));
184 static uint32 const sstr_hashtable[16] =
186 0x486E26EE, 0xDCAA16B3, 0xE1918EEF, 0x202DAFDB,
187 0x341C7DC7, 0x1C365303, 0x40EF2D37, 0x65FD5E49,
188 0xD6057177, 0x904ECE93, 0x1C38024F, 0x98FD323B,
189 0xE3061AE7, 0xA39B0FA1, 0x9797F25F, 0xE4444563,
192 uint32 SStrHash(
char const*
string,
bool caseInsensitive,
uint32 seed = 0x7FED7FED)
196 uint32 shift = 0xEEEEEEEE;
202 c = upper_backslash(c);
204 seed = (sstr_hashtable[c >> 4] - sstr_hashtable[c & 0xF]) ^ (shift + seed);
205 shift = c + seed + 33 * shift + 3;
208 return seed ? seed : 1;
214 std::string textToTranslate;
215 StripHyperlinks(msg, textToTranslate);
216 ReplaceUntranslatableCharactersWithSpace(textToTranslate);
219 result.reserve(textToTranslate.length());
225 uint32 wordHash = SStrHash(str.data(),
true);
226 uint8 idxInsideGroup = wordHash % wordGroup->size();
228 char const* replacementWord = (*wordGroup)[idxInsideGroup];
236 size_t length = std::min(str.length(), strlen(replacementWord));
237 for (
size_t i = 0; i < length; ++i)
239 if (str[i] >=
'A' && str[i] <=
'Z')
242 result += replacementWord[i];
248 std::wstring wstrSourceWord;
251 size_t length = std::min(wstrSourceWord.length(), strlen(replacementWord));
252 for (
size_t i = 0; i < length; ++i)
254 if (
isUpper(wstrSourceWord[i]))
DB2Storage< LanguageWordsEntry > sLanguageWordsStore("LanguageWords.db2", &LanguageWordsLoadInfo::Instance)
DB2Storage< LanguagesEntry > sLanguagesStore("Languages.db2", &LanguagesLoadInfo::Instance)
#define TC_LOG_INFO(filterType__,...)
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
bool WStrToUtf8(wchar_t const *wstr, size_t size, std::string &utf8str)
bool Utf8toWStr(char const *utf8str, size_t csize, wchar_t *wstr, size_t &wsize)
bool isExtendedLatinCharacter(wchar_t wchar)
bool isNumeric(wchar_t wchar)
bool isUpper(wchar_t wchar)
std::pair< uint32, uint8 > WordKey
WordList const * FindWordGroup(uint32 language, uint32 wordLen) const
void LoadSpellEffectLanguage(SpellEffectEntry const *spellEffect)
Trinity::IteratorPair< LanguagesMap::const_iterator > GetLanguageDescById(Language languageId) const
std::string Translate(std::string const &msg, uint32 language, LocaleConstant locale) const
static LanguageMgr * instance()
void LoadLanguagesWords()
bool IsLanguageExist(uint32 languageId) const
std::vector< char const * > WordList
Utility class to enable range for loop syntax for multimap.equal_range uses.
auto MapEqualRange(M &map, typename M::key_type const &key)
constexpr IteratorPair< iterator, end_iterator > MakeIteratorPair(iterator first, end_iterator second)
auto MapGetValuePtr(M &map, typename M::key_type const &key)
void MultimapErasePair(M< K, V, Rest... > &multimap, K const &key, V const &value)
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
std::array< int32, 2 > EffectMiscValue