#include "StdAfx.h" #include "EtUIXML.h" #include "DnUIString.h" #if defined(_CLIENT) #include "DnInterfaceString.h" #endif // #if defined(_CLIENT) #ifdef _DEBUG #define new new(_NORMAL_BLOCK,__FILE__,__LINE__) #endif #ifdef PRE_ADD_WORD_GENDER void ChangeWordOrder( std::vector& vecParam ) { std::wstring strString; std::string strSubStr; int nAdjectiveIndex = -1; int nNounIndex = -1; for( int i=0; i( vecParam.size() ); i++ ) { std::string strParm = vecParam[i]; if( strParm[0] == '{' && strParm[strParm.size()-1] == '}' ) strSubStr = strParm.substr( 1, strParm.size() - 2 ); #ifdef PRE_ADD_MULTILANGUAGE strString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi( strSubStr.c_str() ), MultiLanguage::eDefaultLanguage ); #else // PRE_ADD_MULTILANGUAGE strString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi( strSubStr.c_str() ) ); #endif // PRE_ADD_MULTILANGUAGE std::wstring::size_type GenderTag = strString.find( ADJECTIVE_GENDER_TAGE ); if( GenderTag != std::wstring::npos ) { nAdjectiveIndex = i; for( int j=i+1; j( vecParam.size() ); j++ ) { strParm = vecParam[j]; if( strParm[0] == '{' && strParm[strParm.size()-1] == '}' ) strSubStr = strParm.substr( 1, strParm.size() - 2 ); #ifdef PRE_ADD_MULTILANGUAGE strString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi( strSubStr.c_str() ), MultiLanguage::eDefaultLanguage ); #else // PRE_ADD_MULTILANGUAGE strString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi( strSubStr.c_str() ) ); #endif // PRE_ADD_MULTILANGUAGE GenderTag = strString.find( NOUN_GENDER_TAGE ); if( GenderTag != std::wstring::npos ) { nNounIndex = j; break; } } break; } } if( nAdjectiveIndex >= 0 && nNounIndex > nAdjectiveIndex ) { std::string strNounParam = vecParam[nNounIndex]; vecParam.erase( vecParam.begin() + nNounIndex ); vecParam.insert( vecParam.begin() + nAdjectiveIndex + 1, strNounParam ); } } std::wstring ApplyWordGenderString( bool bIsAdjective, std::wstring& wszParamString, std::vector& vecParam ) { std::wstring strApplyWordGenderString = wszParamString; if( bIsAdjective ) { std::wstring strNounGender; std::string strSubStr; for( int i=0; i( vecParam.size() ); i++ ) { std::string strParm = vecParam[i]; if( strParm[0] == '{' && strParm[strParm.size()-1] == '}' ) strSubStr = strParm.substr( 1, strParm.size() - 2 ); #ifdef PRE_ADD_MULTILANGUAGE strNounGender = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi( strSubStr.c_str() ), MultiLanguage::eDefaultLanguage ); #else // PRE_ADD_MULTILANGUAGE strNounGender = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi( strSubStr.c_str() ) ); #endif // PRE_ADD_MULTILANGUAGE std::wstring::size_type GenderTag = strNounGender.find( NOUN_GENDER_TAGE ); if( GenderTag != std::wstring::npos ) { strNounGender.erase( 0, GenderTag + lstrlenW( NOUN_GENDER_TAGE ) ); std::transform( strNounGender.begin(), strNounGender.end(), strNounGender.begin(), towlower ); break; } } if( strNounGender != L"" ) { std::wstring strGenderTag; std::wstring::size_type GenderTag = strApplyWordGenderString.find( ADJECTIVE_GENDER_TAGE ); if( GenderTag != std::wstring::npos ) { strGenderTag = strApplyWordGenderString; strGenderTag.erase( 0, GenderTag ); strApplyWordGenderString.erase( GenderTag, strApplyWordGenderString.length() - GenderTag ); if( wcscmp( strNounGender.c_str(), L"m" ) == 0 ) { std::wstring::size_type SlashIndex = strGenderTag.find( L"/" ); if( SlashIndex != std::wstring::npos ) { strGenderTag.erase( SlashIndex, strGenderTag.length() - SlashIndex ); strGenderTag.erase( 0, lstrlenW( NOUN_GENDER_TAGE ) ); strApplyWordGenderString += strGenderTag; } } else if( wcscmp( strNounGender.c_str(), L"f" ) == 0 ) { std::wstring::size_type SlashIndex = strGenderTag.rfind( L"/" ); if( SlashIndex != std::wstring::npos ) { strGenderTag.erase( SlashIndex, strGenderTag.length() - SlashIndex ); SlashIndex = strGenderTag.find( L"/" ); if( SlashIndex != std::wstring::npos ) { strGenderTag.erase( 0, SlashIndex + 1 ); strApplyWordGenderString += strGenderTag; } } } else if( wcscmp( strNounGender.c_str(), L"n" ) == 0 ) { std::wstring::size_type SlashIndex = strGenderTag.rfind( L"/" ); if( SlashIndex != std::wstring::npos ) { strGenderTag.erase( 0, SlashIndex + 1 ); strApplyWordGenderString += strGenderTag; } } } } } else { std::wstring::size_type GenderTag = strApplyWordGenderString.find( NOUN_GENDER_TAGE ); if( GenderTag != std::wstring::npos ) strApplyWordGenderString.erase( GenderTag, strApplyWordGenderString.length() - GenderTag ); } return strApplyWordGenderString; } #endif // PRE_ADD_WORD_GENDER #ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE void MakeUIStringUseVariableParamByBaseMsg( std::wstring &wszStr, std::wstring& wszBaseMessage, char *szParam, std::vector > * pvList ) #else //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE void MakeUIStringUseVariableParamByBaseMsg( std::wstring &wszStr, std::wstring& wszBaseMessage, char *szParam ) #endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE { // ¿©±â¿¡ ¿µ¾î, ÇѱÛ, ¼Ò¼ö°¡ µé¾î°¥ ÀÏÀº Àý´ë ¾øÀ¸´Ï, {intÇü¼ýÀÚ} ȤÀº ¼ýÀÚ¸¸ »ý°¢Çϰí ó¸®ÇÏ¸é µÈ´Ù. // ÆÄ¶ó¹ÌÅ͸¦ ½ºÆ®¸µÇüÅ·ΠÀúÀå. std::vector vecParam; if( szParam != NULL && (int)strlen(szParam) > 0 ) { for( int i=0;; i++ ) { const char *pStr = _GetSubStrByCount( i, szParam, ',' ); if( pStr == NULL || (int)strlen(pStr) == 0 ) break; vecParam.push_back(pStr); } } #ifdef PRE_ADD_WORD_GENDER if( static_cast( vecParam.size() ) > 2 ) ChangeWordOrder( vecParam ); #endif // PRE_ADD_WORD_GENDER int nOffset = 0; // BaseMessage¿¡¼­ ġȯ ½ºÆ®¸µÀ» ã¾Æ ¹Ù²Û´Ù. while(1) { // nOffsetÀº ġȯ ½ºÆ®¸µÀÌ ´ëüµÇÁö ¾Ê¾ÒÀ» °æ¿ì(ÆÄ¶ó¹ÌÅͰ¡ ¾ø´Ù°Å³ª ÇØ¼­) ±× µÚºÎÅÍ °Ë»öÇϱâ À§ÇØ »ç¿ëÇÑ´Ù. // Á¦´ë·Î ġȯµÈ´Ù¸é °è¼Ó ¸Ç ¾ÕºÎÅÍ Ã£´Â´Ù. std::wstring::size_type nPos = wszBaseMessage.find_first_of( L"{", nOffset ); std::wstring::size_type nPos2 = wszBaseMessage.find_first_of( L"}", nOffset ); if( (nPos != std::wstring::npos) && (nPos2 != std::wstring::npos) ) { // ¿¹¿Üó¸®. }°Ô {º¸´Ù ¸ÕÀú ³ª¿Ã °æ¿ì, ±× ÁöÁ¡ºÎÅÍ ´Ù½Ã ã´Â´Ù. if( nPos2 < nPos ) { nOffset = (int)nPos2+1; continue; } std::wstring wszParamIndex = wszBaseMessage.substr(nPos+1, nPos2-nPos-1); #ifndef _FINAL_BUILD // ¿¹¿Üó¸®. {}¾È¿¡ ¾Æ¹«°Íµµ ¾øÀ» °æ¿ì, if( wszParamIndex.size() == 0 ) _ASSERT(0&&"UIStringÁ¶ÇÕ Áß Ä¡È¯ ½ºÆ®¸µ Áß°ýÈ£ ¾È¿¡ ¼ýÀÚ°¡ ¾ÈÀûÇôÀÖ½À´Ï´Ù."); // ¿¹¿Üó¸®. {}¾È¿¡ ¼ýÀÚ ¸»°í ´Ù¸¥°Ô µé¾îÀÖÀ» °æ¿ì, for( int i = 0; i < (int)wszParamIndex.size(); ++i ) { if( L'0' <= wszParamIndex[i] && wszParamIndex[i] <= L'9' ) { } else { _ASSERT(0&&"UIStringÁ¶ÇÕ Áß Ä¡È¯ ½ºÆ®¸µ Áß°ýÈ£ ¾È¿¡ ¼ýÀÚ ¸»°í ´Ù¸¥ ½ºÆ®¸µÀÌ µé¾îÀÖ½À´Ï´Ù."); } } #endif int nIndex = _wtoi(wszParamIndex.c_str()); // À妽º°¡ À¯È¿ÇÑÁö º¸°í, À¯È¿ÇÏÁö ¾Ê´Ù¸é ġȯ ³»¿ëÀ» ±×´ë·Î µÐ´Ù. if( nIndex < 0 || nIndex+1 > (int)vecParam.size() ) { nOffset = (int)nPos2+1; continue; } // ÆÄ¶ó¹ÌÅÍ À妽º¿¡ ¸Â´Â ÆÄ¶ó¹ÌÅ͸¦ ±¸Çؿ´Ù. //std::string szParam = vecParam[nIndex]; // Áö¿ª ¼±¾ðÀÌ ¿ÜºÎ ¹üÀ§¿¡ ÀÖ´Â °°Àº À̸§ÀÇ ¼±¾ðÀ» ¼û±é´Ï´Ù. code analysis std::string wszParam = vecParam[nIndex]; std::wstring wszParamString; #ifdef PRE_ADD_WORD_GENDER bool bIsAdjective = false; #endif // PRE_ADD_WORD_GENDER // ÆÄ¶ó¹ÌÅͰ¡ ±×³É ¼ýÀÚÀÎÁö, {¼ýÀÚ}ÀÎÁö ÆÇ´ÜÇØ ½ºÆ®¸µÀ¸·Î º¯È¯ÇÑ´Ù.(µ¥ÀÌÅÍ¿¡ °ø¹é ¾øÀ»°Å¶óÇÑ´Ù.) if( wszParam[0] == '{' && wszParam[wszParam.size()-1] == '}' ) { std::string szSubStr = wszParam.substr(1, wszParam.size()-2); #ifndef _FINAL_BUILD // ¿¹¿Üó¸®. {}¾È¿¡ ¾Æ¹«°Íµµ ¾øÀ» °æ¿ì, if( szSubStr.size() == 0 ) _ASSERT(0&&"UIStringÁ¶ÇÕ Áß ÆÄ¶ó¹ÌÅÍ Áß°ýÈ£ ¾È¿¡ ¼ýÀÚ°¡ ¾ÈÀûÇôÀÖ½À´Ï´Ù."); // ¿¹¿Üó¸®. {}¾È¿¡ ¼ýÀÚ ¸»°í ´Ù¸¥°Ô µé¾îÀÖÀ» °æ¿ì, for( int i = 0; i < (int)szSubStr.size(); ++i ) { if( L'0' <= szSubStr[i] && szSubStr[i] <= L'9' ) { } else { _ASSERT(0&&"UIStringÁ¶ÇÕ Áß ÆÄ¶ó¹ÌÅÍ Áß°ýÈ£ ¾È¿¡ ¼ýÀÚ ¸»°í ´Ù¸¥ ½ºÆ®¸µÀÌ µé¾îÀÖ½À´Ï´Ù."); } } #endif #if defined(PRE_ADD_MULTILANGUAGE) //±âº»ÀûÀÎ À¯¾ÆÀÌ󸮸¦ À§ÇÑ ¹®ÀÚ¿­¸¸µå´Â ³à¼®ÀÌ´Ù ÀÏ´ÜÀº ¼­¹ö¿¡¼­´Â ÀÏ´Ü ¾ÆÀÌÅÛ¸ñ·Ï »ý¼º½Ã »ç¿ë ÀÏ´ÜÀº ±âº»ÀÎÀÚ wszParamString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi(szSubStr.c_str()), MultiLanguage::eDefaultLanguage ); #else //#if defined(PRE_ADD_MULTILANGUAGE) wszParamString = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, atoi(szSubStr.c_str()) ); #endif //#if defined(PRE_ADD_MULTILANGUAGE) #ifdef PRE_ADD_WORD_GENDER std::wstring strParam; strParam = wszParamString; std::wstring::size_type GenderTag = strParam.find( ADJECTIVE_GENDER_TAGE ); if( GenderTag != std::wstring::npos ) { bIsAdjective = true; strParam.erase( GenderTag, strParam.length() - GenderTag ); } GenderTag = strParam.find( NOUN_GENDER_TAGE ); if( GenderTag != std::wstring::npos ) strParam.erase( GenderTag, strParam.length() - GenderTag ); #endif // PRE_ADD_WORD_GENDER #ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE if (pvList) { #ifdef PRE_ADD_WORD_GENDER pvList->push_back(std::make_pair(strParam, atoi(szSubStr.c_str()))); #else // PRE_ADD_WORD_GENDER pvList->push_back(std::make_pair(wszParamString, atoi(szSubStr.c_str()))); #endif // PRE_ADD_WORD_GENDER } #endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE #ifndef _FINAL_BUILD // ¿¹¿Üó¸®. ÆÄ¶ó¹ÌÅÍ¿¡ ÀÖ´Â {}¸¦ UIStringÀ¸·Î º¯È¯Çߴµ¥, ±× ¾È¿¡ Áß°ýÈ£ {}°¡ ÀÖÀ» °æ¿ì for( int i = 0; i < (int)wszParamString.size(); ++i ) { if( wszParamString[i] == L'{' || wszParamString[i] == L'}' ) { _ASSERT(0&&"UIStringÁ¶ÇÕ Áß ÆÄ¶ó¹ÌÅÍ Áß°ýÈ£ÀÇ °ª¾È¿¡ Áß°ýÈ£{} °¡ µé¾îÀÖ½À´Ï´Ù."); } } #endif } else { ToWideString( wszParam, wszParamString ); } #ifdef PRE_ADD_WORD_GENDER wszParamString = ApplyWordGenderString( bIsAdjective, wszParamString, vecParam ); #endif // PRE_ADD_WORD_GENDER // {¼ýÀÚ}À§Ä¡¿¡ ÆÄ¶ó¹ÌÅÍ ½ºÆ®¸µ°ªÀ» ³Ö´Â´Ù. wszBaseMessage.replace( nPos, nPos2-nPos+1, wszParamString ); } else { // °á°ú°ª ¸®ÅÏ ÈÄ Á¾·á wszStr = wszBaseMessage; break; } } } #ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE void MakeUIStringUseVariableParam( std::wstring &wszStr, int nMessageId, char *szParam, std::vector > * pvList ) #else //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE void MakeUIStringUseVariableParam( std::wstring &wszStr, int nMessageId, char *szParam ) #endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE { #if defined(PRE_ADD_MULTILANGUAGE) std::wstring wszBaseMessage = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nMessageId, MultiLanguage::eDefaultLanguage ); #else //#if defined(PRE_ADD_MULTILANGUAGE) std::wstring wszBaseMessage = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, nMessageId ); #endif //#if defined(PRE_ADD_MULTILANGUAGE) #ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE MakeUIStringUseVariableParamByBaseMsg(wszStr, wszBaseMessage, szParam, pvList); #else //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE MakeUIStringUseVariableParamByBaseMsg(wszStr, wszBaseMessage, szParam); #endif //#ifdef PRE_ADD_ITEMNAME_AUTOCOMPLETE #ifdef PRE_ADD_EXCEPTIONAL_MAKESTRING if( szParam != NULL && static_cast( strlen( szParam ) ) > 0 ) { std::wstring strExceptional = GetEtExeptionalUIXML().GetReplacementUIString( szParam ); if( strExceptional.length() > 0 ) wszStr = strExceptional; } #endif // PRE_ADD_EXCEPTIONAL_MAKESTRING } #if defined(PRE_ADD_ITEM_GAINTABLE) && defined(_CLIENT) void MakeUIStringItemGainDescription(std::wstring& result, const std::string& baseMessage) { if (baseMessage.empty()) return; std::wstring convertBaseMessage; DN_INTERFACE::UTIL::String2Wstring(convertBaseMessage, baseMessage); int nOffset = 0; while(1) { // nOffsetÀº ġȯ ½ºÆ®¸µÀÌ ´ëüµÇÁö ¾Ê¾ÒÀ» °æ¿ì(ÆÄ¶ó¹ÌÅͰ¡ ¾ø´Ù°Å³ª ÇØ¼­) ±× µÚºÎÅÍ °Ë»öÇϱâ À§ÇØ »ç¿ëÇÑ´Ù. // Á¦´ë·Î ġȯµÈ´Ù¸é °è¼Ó ¸Ç ¾ÕºÎÅÍ Ã£´Â´Ù. std::wstring::size_type nPos = convertBaseMessage.find_first_of(L"{", nOffset); std::wstring::size_type nPos2 = convertBaseMessage.find_first_of(L"}", nOffset); if ((nPos != std::wstring::npos) && (nPos2 != std::wstring::npos)) { // ¿¹¿Üó¸®. }°Ô {º¸´Ù ¸ÕÀú ³ª¿Ã °æ¿ì, ±× ÁöÁ¡ºÎÅÍ ´Ù½Ã ã´Â´Ù. if (nPos2 < nPos) { nOffset = (int)nPos2+1; continue; } std::wstring wszParamIndex = convertBaseMessage.substr(nPos+1, nPos2-nPos-1); #ifndef _FINAL_BUILD // ¿¹¿Üó¸®. {}¾È¿¡ ¾Æ¹«°Íµµ ¾øÀ» °æ¿ì, if( wszParamIndex.size() == 0 ) _ASSERT(0&&"UIStringÁ¶ÇÕ Áß Ä¡È¯ ½ºÆ®¸µ Áß°ýÈ£ ¾È¿¡ ¼ýÀÚ°¡ ¾ÈÀûÇôÀÖ½À´Ï´Ù."); // ¿¹¿Üó¸®. {}¾È¿¡ ¼ýÀÚ ¸»°í ´Ù¸¥°Ô µé¾îÀÖÀ» °æ¿ì, for( int i = 0; i < (int)wszParamIndex.size(); ++i ) { if( L'0' <= wszParamIndex[i] && wszParamIndex[i] <= L'9' ) { } else { _ASSERT(0&&"UIStringÁ¶ÇÕ Áß Ä¡È¯ ½ºÆ®¸µ Áß°ýÈ£ ¾È¿¡ ¼ýÀÚ ¸»°í ´Ù¸¥ ½ºÆ®¸µÀÌ µé¾îÀÖ½À´Ï´Ù."); } } #endif int nIndex = _wtoi(wszParamIndex.c_str()); // À妽º°¡ À¯È¿ÇÑÁö º¸°í, À¯È¿ÇÏÁö ¾Ê´Ù¸é ġȯ ³»¿ëÀ» ±×´ë·Î µÐ´Ù. if (nIndex <= 0) //rlkt fix { nOffset = (int)nPos2+1; continue; } #ifdef PRE_ADD_MULTILANGUAGE std::wstring wszParamString = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, nIndex, MultiLanguage::eDefaultLanguage); #else std::wstring wszParamString = GetEtUIXML().GetUIString(CEtUIXML::idCategory1, nIndex); #endif if (wszParamString.empty() == false) convertBaseMessage.replace(nPos, nPos2-nPos+1, wszParamString); } else { // °á°ú°ª ¸®ÅÏ ÈÄ Á¾·á result = convertBaseMessage; break; } } } #endif // ¹®ÀÚ¿­ÆÄ½Ì - ¾ÕÀÇ ¹®ÀÚ¿­ÀÇ Æ÷¸Ë¿¡ ¸Â°Ô µÚÀÇ ¹®ÀÚ¿­À» °¡Á®¿Í¼­ °áÇÕ. // // : "{0} {1} óġ½Ã´Þ¼º" | "{°¡³ª´Ù},{abc}" => °¡³ª´Ù abc óġ½Ã´Þ¼º // std::wstring ParseUIParamString( int destID, char * pStrParam ) { std::wstring strParam; ToWideString( pStrParam, strParam ); std::vector< std::wstring > tokens; TokenizeW( strParam, tokens, L"," ); std::wstring str( GetEtUIXML().GetUIString( CEtUIXML::idCategory1, destID ) ); std::wstring strTemp( str ); std::wstring::size_type preBegin = 0; std::wstring::size_type begin = 0; std::wstring::size_type end = 0; while( 1 ) { begin = strTemp.find_first_of( L"{" ); if( std::wstring::npos == begin ) break; end = strTemp.find_first_of( L"}" ); if( std::wstring::npos == end ) break; std::wstring strNum = strTemp.substr( begin + 1, (end-1) - begin ); int num = _wtoi( strNum.c_str() ); std::wstring::size_type addSize = 0; const wchar_t * strL = NULL; std::wstring & strToken = tokens[num]; if( std::wstring::npos == strToken.find( L"{" ) ) { str.replace( preBegin+begin, end-begin+1, strToken ); addSize = wcslen( strToken.c_str() ); } else if( strToken.size() > 2 ) { std::wstring _str = strToken.substr( 1, strToken.size()-2 ); strL = GetEtUIXML().GetUIString( CEtUIXML::idCategory1, _wtoi(_str.c_str()) ); str.replace( preBegin+begin, end-begin+1, strL ); addSize = wcslen( strL ); } strTemp = strTemp.substr( end+1, strTemp.size() ); /*if( strL ) preBegin += wcslen( strL ); else preBegin += end;*/ preBegin += begin + addSize; } return str; }