📄 language.cpp
字号:
#include "stdafx.h"
#include <stdio.h>
#include "Language.h"
#include "hong_sub.h"
/*////////////////////////////////////////////////////////////////////////////////////////////
// 备己 : CLan.cpp,CLan.h 拳老. //
// 格利 : txt拳老肺 何磐 胶飘傅阑 佬绢辑 皋葛府俊 历厘. 寇何俊 力傍窍绰 OutputMessage窃荐甫 //
// 烹秦辑 秦寸 胶飘傅阑 力傍. //
// 备泅 : txt拳老阑 扩档快俊 嘎霸 秦寸 攫绢狼 txt甫 茫酒辑 肺爹. txt拳老阑 茄锅 盒籍窍咯 //
// 鞘夸茄 皋葛府甫 拌魂, new甫 茄锅父 龋免窍咯 牢郸胶侩 抛捞喉苞 胶飘傅阑 窃膊 历厘. //
// 漂隆 : 抗傈俊绰 胶飘傅喊肺 new甫 龋免窍绊 牢郸胶狼 积己俊档 new甫 荤侩窍咯 皋葛府狼 窜祈 //
// 拳 棺 memory leak阑 蜡惯窍看栏哥, 3窜 器牢磐狼 荤侩栏肺, 蜡瘤焊荐狼 绢妨框 惯积. //
// 泅力绰 new甫 茄锅父 龋免窃栏肺辑 memory leak狼 规瘤 棺 皋葛府 窜祈拳甫 规瘤茄促. //
// All code is made by zoung. zoung@esofnet.com ICQ : 66924157 Written at 2002/4/12 //
*/////////////////////////////////////////////////////////////////////////////////////////////
LanguagePack* lan = NULL;
char LanguageInt[6][3]={ "en", "kr", "ch", "en", "jp","th"};
char header[10][20]={ "[melee]","[magic]","[skill]","[notice]","[item]","[etc]","[justmsg]","[sprintf]","[yesorno]","[temp]"};
int CLanguage::CheckArea() //绢恫 攫绢甫 静绰瘤 眉农窍绰 窃荐
{
AreaCode=1; // KR
#ifdef JAPAN_LOCALIZING_
AreaCode=4; // JP
#endif
#if defined TAIWAN_LOCALIZING_ || defined CHINA_LOCALIZING_ || defined HONGKONG_LOCALIZING_
AreaCode=2; // TH
#endif
#ifdef USA_LOCALIZING_
AreaCode=0; // EN
#ifndef MALAYSIA_LOCALIZING_ // 031013 kyo
#ifndef THAI_LOCALIZING_ // BBD 040114
const short WinAreaCode=GetUserDefaultLangID();
switch(WinAreaCode)
{
case 0x0404:// Chinese (Taiwan Region)
case 0x0804:// Chinese (PRC)
case 0x0c04:// Chinese (Hong Kong SAR, PRC)
case 0x1004:// Chinese (Singapore)
case 0x0411:// Japanese
{
::ExitApplication(EA_LANGUAGE_ERROR);
return 0;
}break;
}
#endif // BBD 040114
#endif // 031013 kyo
#endif
return(1);
}
int CLanguage::LoadingByAreaCode() //AreaCode俊 狼秦辑 秦寸窍绰 拳老阑 佬绢 甸牢促.
{
char path[MAX_FILE_LENGTH];
wsprintf(LoadedFileName,"%s_lan.txt",LanguageInt[AreaCode]);
wsprintf(path, "./data/%s", LoadedFileName );
wsprintf(this->LoadedFileName,"%s",path);
FILE * fp=Fopen(path,"rt");
if(fp==NULL) { MessageBox(NULL,"Can't Find Language Text","Language Error",NULL); return -1;}
fclose(fp);
return(1);
}
char* CLanguage::OutputMessage(int NumOfSentence) //秦寸窍绰 皋矫瘤甫 Sentence俊促 持绊 绝栏搁 Sentence俊绰 酒公蔼档 绝促.
{
int kind=0,number=0;
kind=NumOfSentence/100000;
number=NumOfSentence%100000;
return this->OutputMessage(kind,number);
}
char* CLanguage::OutputMessage(int Kind,int Num) //秦寸窍绰 皋矫瘤甫 Sentence俊促 持绊 绝栏搁 Sentence俊绰 酒公蔼档 绝促.
{
if (Kind == 1 && Num == 25)
{
int k = 0;
}
if( Kind < 0 || Kind >=MAX_KIND )
return this->szNullString;
if( Num <=0 || Num > this->m_dwMaxLineNumberOfKind[Kind])
return this->szNullString;
DWORD MaxNumber = 0;
if( Kind == 0 )
MaxNumber = 0;
else
{
for( int i=0;i<Kind;i++)
MaxNumber += this->m_dwMaxLineNumberOfKind[i];
}
DWORD Number = MaxNumber*4 + Num*4;
DWORD ReturnAddress = 0;
memcpy(&ReturnAddress,(this->IndexAddress + Number),4);
if( ReturnAddress!=NULL)//020501 lsw
{
return (char*)ReturnAddress;
}
else
{
return this->szNullString;
}
return this->szNullString;
}
CLanguage::CLanguage()
{
memset(this,0,sizeof( *this ) );
this->Init();
}
CLanguage::~CLanguage()
{
SAFE_DELETE(this->IndexAddress);
}
int CLanguage::Init()
{
if( this->CheckArea() < 0 ) return -1;
if( this->LoadingByAreaCode() < 0 ) return -2;
if( this->Preloading() < 0 ) return -3;
if( this->Loading() < 0 ) return -4;
return 1;
}
int CLanguage::Preloading()
{
FILE* fp=NULL;
fp = Fopen(this->LoadedFileName,"rt");
if( fp == NULL)
return -1;
DWORD Header=0,Number=0;
while(!feof(fp)) //拳老狼 场捞 唱棵锭 鳖瘤 拌加 馆汗
{
int i=0;
char Original_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Temp_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Sentence[MAX_ONE_LINE_CHAR_NUM]={0,};
if( GetOneLine(Original_Sentence,fp) <0)
continue;
//咯扁鳖瘤 吭促绰 巴篮 ;捞 绝绰 扼牢捞扼绰 舵
strcpy(Temp_Sentence,Original_Sentence); //老窜 盔夯阑 归诀秦 敌促
//老窜 秦歹甫 犬牢茄促. //秦歹捞搁 付捞呈胶. 庆歹啊 酒聪搁 敲矾胶
if( CheckHeader(Header,Temp_Sentence) < 0 )
continue;
//锅龋甫 犬牢茄促.//锅龋啊 何利例窍芭唱 绝栏搁 付捞呈胶
if( CheckNumber(Number,Temp_Sentence) < 0 )
continue;
//郴侩拱阑 犬牢茄促.//郴侩拱狼 郴侩捞 绝啊唱 "啊 2俺啊 酒聪搁 付捞呈胶
if( CheckSentence(Sentence,Temp_Sentence) < 0 )
continue;
this->m_dwMaxLineNumberOfKind[Header] =
this->m_dwMaxLineNumberOfKind[Header] > Number ? this->m_dwMaxLineNumberOfKind[Header] : Number;
this->m_dwTotalLineOfKind[Header]++;
this->m_dwSumOfTotalLine++;
this->m_dwTotalLength = this->m_dwTotalLength + strlen(Sentence) + 1;
}
for( int i=0;i<MAX_KIND;i++)
this->m_dwSumOfMaxLineNumber += this->m_dwMaxLineNumberOfKind[i];
fclose(fp);
return 1;
}
// 020620 YGI
void ConvertSpecialWord(char *txt,const char *delTarget,const char AfterConvert)
{
char *pdest = txt;
while( pdest = strstr(pdest,delTarget) )
{
*pdest = ' '; pdest++;
*pdest = AfterConvert;
}
}
int CLanguage::Loading()
{
FILE* fp=NULL;
fp = Fopen(this->LoadedFileName,"rt");
if( fp == NULL)
return -1;
DWORD Header=0,Number=0;
DWORD DataPos=0;
this->IndexAddress = new char [this->m_dwSumOfMaxLineNumber*4 + this->m_dwTotalLength + 4];
if( IndexAddress == NULL)
return -1;
this->DataAddress = this->IndexAddress + this->m_dwSumOfMaxLineNumber*4 + 4;
memset(this->IndexAddress , 0 ,this->m_dwSumOfMaxLineNumber*4 + this->m_dwTotalLength + 4);
while(!feof(fp)) //拳老狼 场捞 唱棵锭 鳖瘤 拌加 馆汗
{
int i=0;
char Original_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Temp_Sentence[MAX_ONE_LINE_CHAR_NUM]={0,},Sentence[MAX_ONE_LINE_CHAR_NUM]={0,};
if( GetOneLine(Original_Sentence,fp) <0)
continue;
//咯扁鳖瘤 吭促绰 巴篮 ;捞 绝绰 扼牢捞扼绰 舵
strcpy(Temp_Sentence,Original_Sentence); //老窜 盔夯阑 归诀秦 敌促
//老窜 秦歹甫 犬牢茄促. //秦歹捞搁 付捞呈胶. 庆歹啊 酒聪搁 敲矾胶
if( CheckHeader(Header,Temp_Sentence) < 0 )
continue;
//锅龋甫 犬牢茄促.//锅龋啊 何利例窍芭唱 绝栏搁 付捞呈胶
if( CheckNumber(Number,Temp_Sentence) < 0 )
continue;
//郴侩拱阑 犬牢茄促.//郴侩拱狼 郴侩捞 绝啊唱 "啊 2俺啊 酒聪搁 付捞呈胶
if( CheckSentence(Sentence,Temp_Sentence) < 0 )
continue;
//咯扁鳖瘤 吭促绰 巴篮 力措肺 等 皋矫瘤扼绰 巴. 蝶扼辑 锭妨 冠绰促.^^
// ConvertSpecialWord(Sentence,"%%s",'%s');
// ConvertSpecialWord(Sentence,"%%s",'%d');
// ConvertSpecialWord(Sentence,"%%s",'%u');
ConvertSpecialWord(Sentence,"\\n",'\n');
ConvertSpecialWord(Sentence,"\\r",'\r');
ConvertSpecialWord(Sentence,"\\t",'\t');
DWORD Sentence_Length = strlen(Sentence);
DWORD BaseAddress = 0;
if( Header > 0 )
for( int i=0;i<Header;i++)
BaseAddress += this->m_dwMaxLineNumberOfKind[i];
else
BaseAddress = 0;
strcpy(this->DataAddress + DataPos , Sentence);
DWORD TempDataAddress = (DWORD)((this->DataAddress + DataPos));
memcpy(this->IndexAddress + Number*4 + BaseAddress*4 ,&TempDataAddress,4);
DataPos+=Sentence_Length+1;
}
fclose(fp);
return 0;
}
int CLanguage::GetOneLine(void * data,FILE* fp)
{
int i=0,ret=1;
bool loop=true;
while(loop)
{
if( feof(fp) )
break;
char chardata = fgetc(fp);
((char*)(data))[i++] = chardata;
switch(chardata)
{
case 10: //青捞 官差搁
loop=false;
break;
case 59: //;捞 唱坷搁
ret=-1;
break;
default:
break;
}
}
return ret;
}
int CLanguage::CheckHeader(DWORD &Header,char* data) //辆幅牢啊甫 魄窜 .割锅掳 锅龋牢瘤 馆券
{
for(int i=0;i<MAX_KIND;i++)
{
if( strlen(header[i]) > strlen(data) )
continue;
if( memicmp(header[i],data,strlen(header[i])) ) //父距 老摹窍绰 header啊 乐栏搁
continue;
Header = i;
return -1; //庆歹甫 茫栏搁 -甫 馆券
}
return 1;
}
int CLanguage::CheckNumber(DWORD &Number,char* data) //锅龋啊 割锅牢瘤 犬牢茄促.锅龋 馆券
{
char *semi = NULL;
semi = strchr(data,':');
if( semi == NULL) //:啊 绝栏搁
return -1;
char temp[MAX_ONE_LINE_CHAR_NUM]={0,};
memcpy(temp,data,( (DWORD)(semi-data) ) );
Number = atoi(temp);
return 1;
}
int CLanguage::CheckSentence(void * sentence,char* data) //巩厘捞 倔付唱 变啊甫 犬牢茄促.巩厘狼 辨捞 馆券
{
DWORD length = strlen(data);
char *start = NULL,*end=NULL;
start = strchr(data,'"');
if( start == NULL) //"啊 绝栏搁
return -1;
//弥家茄 场俊辑 2锅掳 捞绢具 茄促.
if( start-data+1 >= length )
return -2;
end = strchr(start+1,'"');
if( end == NULL)
return -3;
//弥家茄 场俊辑 霉锅掳 捞绢具 茄促
if( end-data >= length )
return -4;
if( start+1 > end -1 )
return -5;
//咯扁鳖瘤 吭促绰 巴篮 "栏肺 焊龋登绰 巩厘捞 乐促绰 捞具扁啊 等促. 矫累篮 start, 场篮 end捞促
memset(sentence,0,end-start+2);
memcpy(sentence,start+1,end-start-1);
return 1;
}
void CLanguage::DisplayAllData()
{
int count=0;
for( int i=0;i<MAX_KIND;i++)
{
for( int j=0;j<this->m_dwMaxLineNumberOfKind[i]+1;j++)
{
char* data = (char*)this->OutputMessage(i,j);
if( data[0] != 0 ) printf("[%2d:%6d] %s\n",i,j,data );
// if( count++%100 == 0 )
// getchar();
}
}
printf("\nTotal Summary\n");
for( i=0;i<MAX_KIND;i++)
{
printf("Line 1 : Max Line Number : %d , Total Line Number : %d\n",this->m_dwMaxLineNumberOfKind[i],this->m_dwTotalLineOfKind[i]);
}
printf("\nSum of Max Line Number : %d Sum of Total Line : %d , Total Length : %d" , this->m_dwSumOfMaxLineNumber,
this->m_dwSumOfTotalLine,
this->m_dwTotalLength);
}
// 020428 YGI acer
extern int CheckSumError;
int LoadLanguageText()
{
lan = new LanguagePack;
if(lan==NULL) return 0;
else return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -