Index: src/game/Creature.h =================================================================== --- src/game/Creature.h (revision 4648) +++ src/game/Creature.h (working copy) @@ -207,9 +207,8 @@ struct CreatureLocale { - uint32 Entry; - std::string Name[8]; - std::string SubName[8]; + std::vector Name; + std::vector SubName; }; struct EquipmentInfo Index: src/game/GossipDef.cpp =================================================================== --- src/game/GossipDef.cpp (revision 4651) +++ src/game/GossipDef.cpp (working copy) @@ -148,8 +148,8 @@ data << uint32( pQuest ? pQuest->GetQuestLevel() : 0 ); std::string Title = pQuest->GetTitle(); - uint8 m_language = pSession->GetSessionLanguage(); - if (m_language > 0) + LocaleConstant m_language = pSession->GetSessionLanguage(); + if (m_language > LOCALE_ENG) { QuestLocale const *ql = objmgr.GetQuestLocale(questID); if (ql) @@ -210,8 +210,8 @@ Text_0[i]=pGossip->Options[i].Text_0; Text_1[i]=pGossip->Options[i].Text_1; } - uint8 m_language = pSession->GetSessionLanguage(); - if (m_language > 0) + LocaleConstant m_language = pSession->GetSessionLanguage(); + if (m_language > LOCALE_ENG) { NpcTextLocale const *nl = objmgr.GetNpcTextLocale(textID); if (nl) @@ -359,8 +359,8 @@ Objectives = pQuest->GetObjectives(); EndText = pQuest->GetEndText(); - uint8 m_language = pSession->GetSessionLanguage(); - if (m_language > 0) + LocaleConstant m_language = pSession->GetSessionLanguage(); + if (m_language > LOCALE_ENG) { QuestLocale const *ql = objmgr.GetQuestLocale(pQuest->GetQuestId()); if (ql) @@ -454,8 +454,8 @@ for (int i=0;iObjectiveText[i]; - uint8 m_language = pSession->GetSessionLanguage(); - if ( m_language > 0) + LocaleConstant m_language = pSession->GetSessionLanguage(); + if ( m_language > LOCALE_ENG) { QuestLocale const *ql = objmgr.GetQuestLocale(pQuest->GetQuestId()); if (ql) @@ -567,8 +567,8 @@ Title = pQuest->GetTitle(); OfferRewardText = pQuest->GetOfferRewardText(); - uint8 m_language = pSession->GetSessionLanguage(); - if (m_language>0) + LocaleConstant m_language = pSession->GetSessionLanguage(); + if (m_language>LOCALE_ENG) { QuestLocale const *ql = objmgr.GetQuestLocale(pQuest->GetQuestId()); if (ql) @@ -680,8 +680,8 @@ Title = pQuest->GetTitle(); RequestItemsText = pQuest->GetRequestItemsText(); - uint8 m_language = pSession->GetSessionLanguage(); - if ( m_language > 0 ) + LocaleConstant m_language = pSession->GetSessionLanguage(); + if ( m_language > LOCALE_ENG ) { QuestLocale const *ql = objmgr.GetQuestLocale(pQuest->GetQuestId()); if (ql) Index: src/game/ItemHandler.cpp =================================================================== --- src/game/ItemHandler.cpp (revision 4648) +++ src/game/ItemHandler.cpp (working copy) @@ -202,8 +202,8 @@ Name = pProto->Name1; Description = pProto->Description; - uint8 m_language = GetSessionLanguage(); - if ( m_language > 0 ) + LocaleConstant m_language = GetSessionLanguage(); + if ( m_language > LOCALE_ENG ) { ItemLocale const *il = objmgr.GetItemLocale(pProto->ItemId); if (il) @@ -812,8 +812,8 @@ std::string Name; Name = pProto->Name1; - uint8 m_language = GetSessionLanguage(); - if (m_language > 0) + LocaleConstant m_language = GetSessionLanguage(); + if (m_language > LOCALE_ENG) { ItemLocale const *il = objmgr.GetItemLocale(pProto->ItemId); if (il) Index: src/game/NPCHandler.h =================================================================== --- src/game/NPCHandler.h (revision 4648) +++ src/game/NPCHandler.h (working copy) @@ -34,12 +34,6 @@ uint32 Next_Page; }; -struct PageTextLocale -{ - uint32 Entry; - std::string Text[8]; -}; - // GCC have alternative #pragma pack() syntax and old gcc version not support pack(pop), also any gcc version not support it at some paltform #if defined( __GNUC__ ) #pragma pack() @@ -68,11 +62,15 @@ GossipTextOption Options[8]; }; +struct PageTextLocale +{ + std::vector Text; +}; + struct NpcTextLocale { - uint32 Entry; - std::string Text_0[8][8]; - std::string Text_1[8][8]; + std::vector Text_0[8]; + std::vector Text_1[8]; }; #endif Index: src/game/ObjectMgr.cpp =================================================================== --- src/game/ObjectMgr.cpp (revision 4648) +++ src/game/ObjectMgr.cpp (working copy) @@ -430,20 +430,8 @@ void ObjectMgr::LoadCreatureLocales() { - const World::LocalizationMap *Locales = sWorld.GetSupportedLocals(); + QueryResult *result = sDatabase.Query("SELECT `entry`,`name_loc1`,`subname_loc1`,`name_loc2`,`subname_loc2`,`name_loc3`,`subname_loc3`,`name_loc4`,`subname_loc4`,`name_loc5`,`subname_loc5`,`name_loc6`,`subname_loc6`,`name_loc7`,`subname_loc7` FROM `locales_creature`"); - World::LocalizationMap::const_iterator itr = Locales->begin(); - std::ostringstream ostr; - ostr << "`name_loc" << (int)*itr << "`,`subname_loc" << (int)*itr << "`"; - itr++; - while (itr != Locales->end()) - { - ostr << ",`name_loc" << (int)*itr << "`,`subname_loc" << (int)*itr << "`"; - itr++; - } - - QueryResult *result = sDatabase.PQuery("SELECT `entry`,%s FROM `locales_creature`",ostr.str().c_str()); - if(!result) { barGoLink bar(1); @@ -465,14 +453,34 @@ uint32 entry = fields[0].GetUInt32(); CreatureLocale& data = mCreatureLocaleMap[entry]; - uint16 currentIndex=0; - for (itr = Locales->begin(); itr != Locales->end(); ++itr) + + for(int i = 1; i < 8; ++i) { - data.Name[*itr] = fields[currentIndex*2+1].GetCppString(); - data.SubName[*itr]= fields[currentIndex*2+2].GetCppString(); - currentIndex++; + std::string str = fields[1+2*i].GetCppString(); + if(!str.empty()) + { + int idx = GetOrNewIndexForLocale(LocaleConstant(i)); + if(idx <0) + continue; + + if(data.Name.size() <= idx) + data.Name.resize(idx+1); + + data.Name[idx] = str; + } + str = fields[1+2*i+1].GetCppString(); + if(!str.empty()) + { + int idx = GetOrNewIndexForLocale(LocaleConstant(i)); + if(idx <0) + continue; + + if(data.SubName.size() <= idx) + data.SubName.resize(idx+1); + + data.SubName[idx] = str; + } } - } while (result->NextRow()); delete result; @@ -3144,20 +3152,8 @@ void ObjectMgr::LoadPageTextLocales() { - const World::LocalizationMap *Locales = sWorld.GetSupportedLocals(); + QueryResult *result = sDatabase.PQuery("SELECT `entry`,`text_loc1`,`text_loc2`,`text_loc3`,`text_loc4`,`text_loc5`,`text_loc6`,`text_loc7` FROM `locales_page_text`"); - World::LocalizationMap::const_iterator itr = Locales->begin(); - std::ostringstream ostr; - ostr << "`text_loc" << (int)*itr << "`"; - itr++; - while (itr != Locales->end()) - { - ostr << ",`text_loc" << (int)*itr << "`"; - itr++; - } - - QueryResult *result = sDatabase.PQuery("SELECT `entry`,%s FROM `locales_page_text`",ostr.str().c_str()); - if(!result) { barGoLink bar(1); @@ -3179,11 +3175,21 @@ uint32 entry = fields[0].GetUInt32(); PageTextLocale& data = mPageTextLocaleMap[entry]; - uint16 currentIndex=0; - for (itr = Locales->begin(); itr != Locales->end(); ++itr) + + for(int i = 1; i < 8; ++i) { - data.Text[*itr] = fields[currentIndex+1].GetCppString(); - currentIndex++; + std::string str = fields[i].GetCppString(); + if(str.empty()) + continue; + + int idx = GetOrNewIndexForLocale(LocaleConstant(i)); + if(idx <0) + continue; + + if(data.Text.size() <= idx) + data.Text.resize(idx+1); + + data.Text[idx] = str; } } while (result->NextRow()); @@ -3274,23 +3280,25 @@ void ObjectMgr::LoadNpcTextLocales() { - const World::LocalizationMap *Locales = sWorld.GetSupportedLocals(); + QueryResult *result = sDatabase.Query("SELECT `entry`," + "`Text0_0_loc1`,`Text0_0_loc2`,`Text0_0_loc3`,`Text0_0_loc4`,`Text0_0_loc5`,`Text0_0_loc6`,`Text0_0_loc7`," + "`Text0_1_loc1`,`Text0_1_loc2`,`Text0_1_loc3`,`Text0_1_loc4`,`Text0_1_loc5`,`Text0_1_loc6`,`Text0_1_loc7`," + "`Text1_0_loc1`,`Text1_0_loc2`,`Text1_0_loc3`,`Text1_0_loc4`,`Text1_0_loc5`,`Text1_0_loc6`,`Text1_0_loc7`," + "`Text1_1_loc1`,`Text1_1_loc2`,`Text1_1_loc3`,`Text1_1_loc4`,`Text1_1_loc5`,`Text1_1_loc6`,`Text1_1_loc7`," + "`Text2_0_loc1`,`Text2_0_loc2`,`Text2_0_loc3`,`Text2_0_loc4`,`Text2_0_loc5`,`Text2_0_loc6`,`Text2_0_loc7`," + "`Text2_1_loc1`,`Text2_1_loc2`,`Text2_1_loc3`,`Text2_1_loc4`,`Text2_1_loc5`,`Text2_1_loc6`,`Text2_1_loc7`," + "`Text3_0_loc1`,`Text3_0_loc2`,`Text3_0_loc3`,`Text3_0_loc4`,`Text3_0_loc5`,`Text3_0_loc6`,`Text3_0_loc7`," + "`Text3_1_loc1`,`Text3_1_loc2`,`Text3_1_loc3`,`Text3_1_loc4`,`Text3_1_loc5`,`Text3_1_loc6`,`Text3_1_loc7`," + "`Text4_0_loc1`,`Text4_0_loc2`,`Text4_0_loc3`,`Text4_0_loc4`,`Text4_0_loc5`,`Text4_0_loc6`,`Text4_0_loc7`," + "`Text4_1_loc1`,`Text4_1_loc2`,`Text4_1_loc3`,`Text4_1_loc4`,`Text4_1_loc5`,`Text4_1_loc6`,`Text4_1_loc7`," + "`Text5_0_loc1`,`Text5_0_loc2`,`Text5_0_loc3`,`Text5_0_loc4`,`Text5_0_loc5`,`Text5_0_loc6`,`Text5_0_loc7`," + "`Text5_1_loc1`,`Text5_1_loc2`,`Text5_1_loc3`,`Text5_1_loc4`,`Text5_1_loc5`,`Text5_1_loc6`,`Text5_1_loc7`," + "`Text6_0_loc1`,`Text6_0_loc2`,`Text6_0_loc3`,`Text6_0_loc4`,`Text6_0_loc5`,`Text6_0_loc6`,`Text6_0_loc7`," + "`Text6_1_loc1`,`Text6_1_loc2`,`Text6_1_loc3`,`Text6_1_loc4`,`Text6_1_loc5`,`Text6_1_loc6`,`Text6_1_loc7`," + "`Text7_0_loc1`,`Text7_0_loc2`,`Text7_0_loc3`,`Text7_0_loc4`,`Text7_0_loc5`,`Text7_0_loc6`,`Text7_0_loc7`," + "`Text7_1_loc1`,`Text7_1_loc2`,`Text7_1_loc3`,`Text7_1_loc4`,`Text7_1_loc5`,`Text7_1_loc6`,`Text7_1_loc7`," + " FROM `locales_npc_text`"); - World::LocalizationMap::const_iterator itr = Locales->begin(); - std::ostringstream ostr; - ostr << "`Text0_0_loc" << (int)*itr << "`,`Text0_1_loc" << (int)*itr << "`"; - for (int i=1;i<8;i++) - ostr << ",`Text" << i << "_0_loc" << (int)*itr << "`,`Text" << i << "_1_loc" << (int)*itr << "`"; - itr++; - while (itr != Locales->end()) - { - for (int i=0;i<8;i++) - ostr << ",`Text" << i << "_0_loc" << (int)*itr << "`,`Text" << i << "_1_loc" << (int)*itr << "`"; - itr++; - } - - QueryResult *result = sDatabase.PQuery("SELECT `entry`,%s FROM `locales_npc_text`",ostr.str().c_str()); - if(!result) { barGoLink bar(1); @@ -3312,6 +3320,36 @@ uint32 entry = fields[0].GetUInt32(); NpcTextLocale& data = mNpcTextLocaleMap[entry]; + for(int j=0; j<8; ++j) + { + for(int i=1; i<8; ++i) + { + std::string str0 = fields[1+j*8+(i-1)].GetCppString(); + if(!str0.empty()) + { + int idx = GetOrNewIndexForLocale(LocaleConstant(i)); + if(idx <0) + continue; + + if(data.Text_0[j].size() <= idx) + data.Text_0[j].resize(idx+1); + + data.Text_0[j][idx] = str0; + } + std::string str1 = fields[1+j*8+2*(i-1)+1].GetCppString(); + if(!str.empty()) + { + int idx = GetOrNewIndexForLocale(LocaleConstant(i)); + if(idx <0) + continue; + + if(data.Text_1[j].size() <= idx) + data.Text_1[j].resize(idx+1); + + data.Text_1[j][idx] = str; + } + } + } uint16 currentIndex=0; for (itr = Locales->begin(); itr != Locales->end(); ++itr) { @@ -5457,3 +5495,28 @@ sLog.outString(); sLog.outString( ">> Loaded %u reserved player names", count ); } + +int ObjectMgr::GetIndexForLocale( LocaleConstant loc ) +{ + if(loc==LOCALE_ENG) + return -1; + + for(size_t i=0;i < m_LocalToIndex.size(); ++i) + if(m_LocalToIndex[i]==loc) + return i; + + return -1; +} + +int ObjectMgr::GetOrNewIndexForLocale( LocaleConstant loc ) +{ + if(loc==LOCALE_ENG) + return -1; + + for(size_t i=0;i < m_LocalToIndex.size(); ++i) + if(m_LocalToIndex[i]==loc) + return i; + + m_LocalToIndex.push_back(loc); + return m_LocalToIndex.size()-1; +} \ No newline at end of file Index: src/game/ObjectMgr.h =================================================================== --- src/game/ObjectMgr.h (revision 4648) +++ src/game/ObjectMgr.h (working copy) @@ -724,6 +724,8 @@ { return m_ReservedNames.find(name) != m_ReservedNames.end(); } + + int GetIndexForLocale(LocaleConstant loc); protected: uint32 m_auctionid; uint32 m_mailid; @@ -776,6 +778,10 @@ ReservedNamesMap m_ReservedNames; GraveYardMap mGraveYardMap; + + typedef std::vector LocalToIndex; + LocalToIndex m_LocalToIndex; + int GetOrNewIndexForLocale(LocaleConstant loc); private: void LoadScripts(ScriptMapMap& scripts, char const* tablename); Index: src/game/Player.cpp =================================================================== --- src/game/Player.cpp (revision 4649) +++ src/game/Player.cpp (working copy) @@ -10533,20 +10533,37 @@ else { qe = gossiptext->Options[0].Emotes[0]; - title = gossiptext->Options[0].Text_0 == "" ? gossiptext->Options[0].Text_1 : gossiptext->Options[0].Text_0; - if( &title == NULL ) - title = ""; - uint8 m_language = GetSession()->GetSessionLanguage(); - if (m_language > 0) + if(!gossiptext->Options[0].Text_0.empty()) { - NpcTextLocale const *nl = objmgr.GetNpcTextLocale(textid); - if (nl) + title = gossiptext->Options[0].Text_0; + + int loc_idx = GetSession()->GetSessionLanguageIndex(); + if (loc_idx >= 0) { - if (!nl->Text_0[0][m_language].empty() || !nl->Text_1[0][m_language].empty()) - title = !nl->Text_0[0][m_language].empty() ? nl->Text_1[0][m_language] : nl->Text_0[0][m_language]; + NpcTextLocale const *nl = objmgr.GetNpcTextLocale(textid); + if (nl) + { + if (nl->Text_0[0].size() < loc_idx && !nl->Text_0[0][loc_idx].empty()) + title = nl->Text_0[0][loc_idx]; + } } } + else + { + title = gossiptext->Options[0].Text_1; + + int loc_idx = GetSession()->GetSessionLanguageIndex(); + if (loc_idx >= 0) + { + NpcTextLocale const *nl = objmgr.GetNpcTextLocale(textid); + if (nl) + { + if (nl->Text_1[0].size() < loc_idx && !nl->Text_1[0][loc_idx].empty()) + title = nl->Text_1[0][loc_idx]; + } + } + } } } PlayerTalkClass->SendQuestGiverQuestList( qe, title, guid ); Index: src/game/QueryHandler.cpp =================================================================== --- src/game/QueryHandler.cpp (revision 4648) +++ src/game/QueryHandler.cpp (working copy) @@ -106,16 +106,16 @@ Name = ci->Name; SubName = ci->SubName; - uint8 m_language = GetSessionLanguage(); - if (m_language > 0) + int loc_idx = GetSessionLanguageIndex(); + if (loc_idx >= 0) { CreatureLocale const *cl = objmgr.GetCreatureLocale(entry); if (cl) { - if (!cl->Name[m_language].empty()) // default to english - Name = cl->Name[m_language]; - if (!cl->SubName[m_language].empty()) // same - SubName = cl->SubName[m_language]; + if (cl->Name.size() > loc_idx && !cl->Name[loc_idx].empty()) + Name = cl->Name[loc_idx]; + if (cl->SubName.size() > loc_idx && !cl->SubName[loc_idx].empty()) + SubName = cl->SubName[loc_idx]; } } @@ -172,8 +172,8 @@ std::string Name; Name = info->name; - uint8 m_language = GetSessionLanguage(); - if (m_language > 0) + LocaleConstant m_language = GetSessionLanguage(); + if (m_language > LOCALE_ENG) { GameObjectLocale const *gl = objmgr.GetGameObjectLocale(entryID); if (gl) @@ -291,8 +291,8 @@ Text_1[i]=pGossip->Options[i].Text_1; } - uint8 m_language = GetSessionLanguage(); - if (m_language > 0) + LocaleConstant m_language = GetSessionLanguage(); + if (m_language > LOCALE_ENG) { NpcTextLocale const *nl = objmgr.GetNpcTextLocale(textID); if (nl) @@ -364,16 +364,18 @@ else { std::string Text = pPage->Text; - uint8 m_language = GetSessionLanguage(); - if (m_language > 0) + + int loc_idx = GetSessionLanguageIndex(); + if (loc_idx >= 0) { PageTextLocale const *pl = objmgr.GetPageTextLocale(pageID); if (pl) { - if (!pl->Text[m_language].empty()) - Text = pl->Text[m_language]; + if (pl->Text.size() > loc_idx && !pl->Text[loc_idx].empty()) + Text = pl->Text[loc_idx]; } } + data << Text; data << uint32(pPage->Next_Page); pageID = pPage->Next_Page; Index: src/game/World.cpp =================================================================== --- src/game/World.cpp (revision 4648) +++ src/game/World.cpp (working copy) @@ -480,9 +480,6 @@ exit(1); } - std::string localization = sConfig.GetStringDefault("StringLocalize", ""); - FillSupportedLocals(localization); - ///- Update the realm entry in the database with the realm type from the config file //No SQL injection as values are treated as integers loginDatabase.PExecute("UPDATE `realmlist` SET `icon` = %u WHERE `id` = '%d'", m_configs[CONFIG_GAME_TYPE],realmID); @@ -502,17 +499,13 @@ sLog.outString( "Packing instances..." ); objmgr.PackInstances(); - ///- Load static data tables from the database - if (m_SupportedLocals.size()>0) - { - sLog.outString( "Loading Localization strings..." ); - objmgr.LoadCreatureLocales(); - objmgr.LoadGameObjectLocales(); - objmgr.LoadItemLocales(); - objmgr.LoadQuestLocales(); - objmgr.LoadNpcTextLocales(); - objmgr.LoadPageTextLocales(); - } + sLog.outString( "Loading Localization strings..." ); + objmgr.LoadCreatureLocales(); + objmgr.LoadGameObjectLocales(); + objmgr.LoadItemLocales(); + objmgr.LoadQuestLocales(); + objmgr.LoadNpcTextLocales(); + objmgr.LoadPageTextLocales(); sLog.outString( "Loading Game Object Templates..." ); objmgr.LoadGameobjectInfo(); @@ -1723,32 +1716,6 @@ } } -void World::FillSupportedLocals(std::string str) -{ - if(str=="") - { - return; // English by default if none selected - } - int local; - std::istringstream ss(str); - for(int i = 0; i < 8; ++i) - { - ss >> local; - if (local > 0 && local <8) - SetSupportedLocals((uint8) local); - if(!ss) - break; - } - if (m_SupportedLocals.empty()) - { - sLog.outError("Unable to determine your Locales!!"); - exit(1); - } - LocalizationMap::const_iterator itr; - for (itr = m_SupportedLocals.begin(); itr != m_SupportedLocals.end(); ++itr) - sLog.outString("Support for local %u will be used",*itr); -} - void World::InitDailyQuestResetTime() { time_t mostRecentQuestTime; Index: src/game/World.h =================================================================== --- src/game/World.h (revision 4648) +++ src/game/World.h (working copy) @@ -350,17 +350,11 @@ void InitResultQueue(); void UpdateRealmCharCount(uint32 accid); - - typedef std::set LocalizationMap; - LocalizationMap const* GetSupportedLocals() const { return &m_SupportedLocals; } - protected: void _UpdateGameTime(); void ScriptsProcess(); // callback for UpdateRealmCharacters void _UpdateRealmCharCount(QueryResult *resultCharCount, uint32 accountId); - void SetSupportedLocals(uint8 local) { m_SupportedLocals.insert(local); } - void FillSupportedLocals(std::string str); void InitDailyQuestResetTime(); void ResetDailyQuests(); @@ -404,9 +398,6 @@ ZThread::LockedQueue cliCmdQueue; SqlResultQueue *m_resultQueue; - // Localization - LocalizationMap m_SupportedLocals; - // next daily quests reset time time_t m_NextDailyQuestReset; }; Index: src/game/WorldSession.cpp =================================================================== --- src/game/WorldSession.cpp (revision 4648) +++ src/game/WorldSession.cpp (working copy) @@ -40,9 +40,9 @@ #include "Chat.h" /// WorldSession constructor -WorldSession::WorldSession(uint32 id, WorldSocket *sock, uint32 sec, bool tbc, time_t mute_time, uint8 locale) : +WorldSession::WorldSession(uint32 id, WorldSocket *sock, uint32 sec, bool tbc, time_t mute_time, LocaleConstant locale) : LookingForGroup_auto_join(false), LookingForGroup_auto_add(false), m_muteTime(mute_time), -_player(NULL), _socket(sock),_security(sec), _accountId(id), m_isTBC(tbc), m_sessionLanguage(locale), +_player(NULL), _socket(sock),_security(sec), _accountId(id), m_isTBC(tbc), m_sessionLanguageIndex(objmgr.GetIndexForLocale(locale)), _logoutTime(0), m_playerLoading(false), m_playerLogout(false), m_playerRecentlyLogout(false) { FillOpcodeHandlerHashTable(); Index: src/game/WorldSession.h =================================================================== --- src/game/WorldSession.h (revision 4648) +++ src/game/WorldSession.h (working copy) @@ -65,7 +65,7 @@ { friend class CharacterHandler; public: - WorldSession(uint32 id, WorldSocket *sock, uint32 sec, bool tbc, time_t mute_time, uint8 locale); + WorldSession(uint32 id, WorldSocket *sock, uint32 sec, bool tbc, time_t mute_time, LocaleConstant locale); ~WorldSession(); bool PlayerLoading() { return m_playerLoading; } @@ -174,7 +174,7 @@ time_t m_muteTime; // Locales - uint8 GetSessionLanguage() { return m_sessionLanguage; } + int GetSessionLanguageIndex() { return m_sessionLanguageIndex; } protected: void HandleCharEnumOpcode(WorldPacket& recvPacket); @@ -567,7 +567,7 @@ bool m_playerLoading; // code processed in LoginPlayer bool m_playerLogout; // code processed in LogoutPlayer bool m_playerRecentlyLogout; - uint8 m_sessionLanguage; + int m_sessionLanguageIndex; void FillOpcodeHandlerHashTable(); Index: src/game/WorldSocket.cpp =================================================================== --- src/game/WorldSocket.cpp (revision 4648) +++ src/game/WorldSocket.cpp (working copy) @@ -249,7 +249,7 @@ std::string safe_account=account; // Duplicate, else will screw the SHA hash verification below loginDatabase.escape_string(safe_account); //No SQL injection, username escaped. - // 0 1 2 3 4 5 6 7 8 9 10 + // 0 1 2 3 4 5 6 7 8 9 10 QueryResult *result = loginDatabase.PQuery("SELECT `id`,`gmlevel`,`sessionkey`,`last_ip`,`locked`, `I`, `v`, `s`, `tbc`,`mutetime`,`locale` FROM `account` WHERE `username` = '%s'", safe_account.c_str()); ///- Stop if the account is not found @@ -322,7 +322,11 @@ security = fields[1].GetUInt16(); K.SetHexStr(fields[2].GetString()); time_t mutetime = time_t(fields[9].GetUInt64()); + locale = fields[10].GetUInt8(); + if (locale>=MAX_LOCALE) + locale=LOCALE_ENG; + delete result; ///- Re-check account ban (same check as in realmd) /// TO DO: why on earth do 2 checks for same thing? @@ -404,7 +408,7 @@ SendPacket(&packet); ///- Create a new WorldSession for the player and add it to the World - _session = new WorldSession(id, this,security,tbc,mutetime,locale); + _session = new WorldSession(id, this,security,tbc,mutetime,LocaleConstant(locale)); sWorld.AddSession(_session); if(sLog.IsOutDebug()) // optimize disabled debug output Index: src/mangosd/mangosd.conf.in =================================================================== --- src/mangosd/mangosd.conf.in (revision 4648) +++ src/mangosd/mangosd.conf.in (working copy) @@ -54,14 +54,6 @@ # 255 = Auto Detect (Default) DBC.Locale = 255 -# Full localization support activation -# Use the same codes as for DBC language to enable localization support in this language -# Be informed that activating it consumes some memory (around 57MB per language activated) -# ex: StringLocalize = "2" will activate French on top of default English -# You can activate several languages like StringLocalize = "2 3" for French and German -# StringLocalize = "" (Default = Disabled) -StringLocalize = "" - # Enable logging of GM commands - all SQL code will be written to a log file # All commands are written to a file: YYYY-MM-DD_logSQL.sql # If a new day starts (00:00:00) then a new file is created - the old Index: src/realmd/AuthSocket.cpp =================================================================== --- src/realmd/AuthSocket.cpp (revision 4648) +++ src/realmd/AuthSocket.cpp (working copy) @@ -468,12 +468,14 @@ { _localization=(*localeresult)[0].GetUInt8(); delete localeresult; + + if (_localization>=MAX_LOCALE) + _localization=LOCALE_ENG; } else _localization=LOCALE_ENG; - if (_localization>=MAX_LOCALE) - _localization=LOCALE_ENG; - sLog.outBasic("[AuthChallenge] acount %s is using '%c%c' locale (%u)", _login.c_str (), ch->country[3],ch->country[2], _localization); + + sLog.outBasic("[AuthChallenge] account %s is using '%c%c' locale (%u)", _login.c_str (), ch->country[3],ch->country[2], _localization); } } delete result; Index: src/shared/Common.h =================================================================== --- src/shared/Common.h (revision 4648) +++ src/shared/Common.h (working copy) @@ -149,7 +149,7 @@ SEC_ADMINISTRATOR = 3 }; -enum LocalesConstants +enum LocaleConstant { LOCALE_ENG = 0, LOCALE_FR = 2,