57 if (spellsRange.begin() == spellsRange.end())
61 std::vector<LanguageDesc> langsWithSkill;
62 for (LanguagesMap::value_type
const& spellItr : spellsRange)
70 _langsMap.emplace(langEntry->ID, langDesc);
91 uint8 length = std::min(18U,
uint32(strlen(wordEntry->Word)));
95 _wordsMap[key].push_back(wordEntry->Word);
110 void StripHyperlinks(std::string
const& source, std::string& dest)
112 dest.resize(source.length());
114 bool skipSquareBrackets =
false;
115 for (
size_t i = 0; i < source.length(); ++i)
120 if (!skipSquareBrackets || (c !=
'[' && c !=
']'))
121 dest[destSize++] = source[i];
126 if (i + 1 >= source.length())
129 switch (source[i + 1])
134 if (i + 2 >= source.length())
137 if (source[i + 2] ==
'n')
138 i = source.find(
':', i);
147 i = source.find(
"|h", i);
148 if (i != std::string::npos)
150 skipSquareBrackets =
true;
154 skipSquareBrackets =
false;
158 i = source.find(
"|t", i);
159 if (i != std::string::npos)
167 dest.resize(destSize);
170 void ReplaceUntranslatableCharactersWithSpace(std::string& text)
172 std::wstring wstrText;
176 for (
wchar_t& w : wstrText)
183 constexpr char upper_backslash(
char c)
187 if (c >=
'a' && c <=
'z')
188 return char(
'A' +
char(c -
'a'));
193 constexpr std::array<uint32, 16> sstr_hashtable =
195 0x486E26EE, 0xDCAA16B3, 0xE1918EEF, 0x202DAFDB,
196 0x341C7DC7, 0x1C365303, 0x40EF2D37, 0x65FD5E49,
197 0xD6057177, 0x904ECE93, 0x1C38024F, 0x98FD323B,
198 0xE3061AE7, 0xA39B0FA1, 0x9797F25F, 0xE4444563,
201 constexpr uint32 SStrHash(std::string_view
string,
bool caseInsensitive,
uint32 seed = 0x7FED7FED)
203 uint32 shift = 0xEEEEEEEE;
204 for (
char c : string)
207 c = upper_backslash(c);
209 seed = (sstr_hashtable[c >> 4] - sstr_hashtable[c & 0xF]) ^ (shift + seed);
210 shift = c + seed + 33 * shift + 3;
213 return seed ? seed : 1;
219 std::string textToTranslate;
220 StripHyperlinks(msg, textToTranslate);
221 ReplaceUntranslatableCharactersWithSpace(textToTranslate);
224 result.reserve(textToTranslate.length());
230 uint32 wordHash = SStrHash(str,
true);
231 uint8 idxInsideGroup = language * wordHash % wordGroup->size();
233 char const* replacementWord = (*wordGroup)[idxInsideGroup];
241 size_t length = std::min(str.length(), strlen(replacementWord));
242 for (
size_t i = 0; i < length; ++i)
244 if (str[i] >=
'A' && str[i] <=
'Z')
247 result += replacementWord[i];
253 std::wstring wstrSourceWord;
256 size_t length = std::min(wstrSourceWord.length(), strlen(replacementWord));
257 for (
size_t i = 0; i < length; ++i)
259 if (wstrSourceWord[i] != L
'\'' &&
isUpper(wstrSourceWord[i]))
DB2Storage< LanguageWordsEntry > sLanguageWordsStore("LanguageWords.db2", &LanguageWordsLoadInfo::Instance)
DB2Storage< LanguagesEntry > sLanguagesStore("Languages.db2", &LanguagesLoadInfo::Instance)
#define TC_LOG_INFO(filterType__, message__,...)
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 isNumeric(wchar_t wchar)
bool isLatin1Character(wchar_t wchar)
struct CharToUpper charToUpper
struct CharToLower charToLower
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 &multimap, typename M::key_type const &key, typename M::mapped_type const &value)
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
std::array< int32, 2 > EffectMiscValue