BCB 语言类

时间:2022-08-21 22:59:00

整理日: 2015年2月16日

EcLanguage.h

/*----------------------------------------------------------------------------*/
// Copy Right : Copyright (C) 2009 XXXXX INC., LTD
// Customer :
// Project :
// Function : Provide multi language function change the UI
// accordingby System Language
// ----------------------------------------------------------------
// File Name : Language.h
// Summary :
// Create : 2009.02.10 by wang
// Modify :
// By : XXXXX INC.,LTD
//
// Modify List : yyyy,mm.dd Xxxxxxxxxxxxxxxxxxxxx by XX.XXXX
/*----------------------------------------------------------------------------*/ //--------------------------------------------------------------------------- #ifndef EcLanguageH
#define EcLanguageH
//--------------------------------------------------------------------------- #include <Forms.hpp>
#include <IniFiles.hpp> #include <tchar.h> // Language Class
class TEcLanguage
{
private:
String m_sLangPath; // Language file name
String m_sCurFile;
TStringList* m_pLangs;
TStringList* m_pExts;
String m_sLang;
int m_nCurID; bool HasProperty(TComponent* aObject,String PropStr);
int GetOperSystemLanID(); protected:
// Load string for control
virtual bool LoadLangFile(TForm* pFrm);
// Save control caption to language file
virtual void SetLangFile(TForm* pFrm); public:
TEcLanguage(String sConfigPath);
~TEcLanguage(); bool SetLangID(int nID);
int GetCurID(){return m_nCurID;};
TStringList* GetLangs(){return m_pLangs;};
String GetLanFile(){return m_sCurFile;}; // Load UI Language for one form
bool LoadLanguage(TForm* pFrm){return LoadLangFile(pFrm);}
// Save UI string and control size to specific file
void SetLanguage(TForm* pFrm){SetLangFile(pFrm);}; // Load resource string for others except control
String GetStr(int nNo, String sSection=_T("ResourceString"), String sKey=_T("Str"));
}; class TEcLanBug
{
private:
bool HasProperty(TComponent* aObject,String PropStr){return GetPropInfo(aObject, PropStr);}; public:
bool LoadLanguage(TForm* pFrm,String sLanFile);
void SetLanguage(TForm* pFrm,String sLanFile);
}; #endif

EcLanguage.cpp

/*----------------------------------------------------------------------------*/
// Copy Right : Copyright (C) 2009 XXXXX INC., LTD
// Customer :
// Project :
// Function :
// ----------------------------------------------------------------
// File Name : EcLanguage.cpp
// Summary :
// Create : 2009.02.10 by wang
// Modify :
// By : XXXXX INC.,LTD
//
// Modify List : yyyy,mm.dd Xxxxxxxxxxxxxxxxxxxxx by XX.XXXX
/*----------------------------------------------------------------------------*/ #include <vcl.h> #pragma hdrstop
#include "EcLanguage.h" #pragma package(smart_init) TEcLanguage::TEcLanguage(String sConfigPath)
{
// Languageファイルの場所を取って
m_sLangPath = sConfigPath+_T("\\Language\\"); String sLang = m_sLangPath + _T("Lang.ini"); m_pExts = new TStringList;
m_pExts->Clear(); m_pLangs = new TStringList;
m_pLangs->Clear(); TIniFile* iniFile = new TIniFile(sLang);
m_sLang = iniFile->ReadString("General", "AppName", "Daq3");
m_nCurID = iniFile->ReadInteger("General", "CurID", GetOperSystemLanID());
int nLangs = iniFile->ReadInteger("General", "Number", 4);
String sTmp,sTmp1,sTmp2;
for(int i=0;i<nLangs;++i){
sTmp.sprintf(_T("%03d_Ext"),i);
sTmp1 = iniFile->ReadString("Lang", sTmp, "");
if(sTmp1=="") continue;
sTmp.sprintf(_T("%s%s.%s"),m_sLangPath.c_str(),m_sLang.c_str(),sTmp1.c_str());
if(!FileExists(sTmp)) continue; sTmp.sprintf(_T("%03d_Name"),i);
sTmp2 = iniFile->ReadString("Lang", sTmp, "");
if(sTmp2=="") continue; m_pExts->Add(sTmp1);
m_pLangs->Add(sTmp2);
}
delete iniFile; int nCnt = m_pLangs->Count;
if(m_nCurID<0 || m_nCurID>=nCnt)
m_nCurID = 0;
if(nCnt==0){
m_nCurID = -1;
}else{
m_sCurFile.sprintf(_T("%s%s.%s"),m_sLangPath.c_str(),m_sLang.c_str(),m_pExts->Strings[m_nCurID].c_str());
}
} TEcLanguage::~TEcLanguage()
{
String sLang = m_sLangPath + "Lang.ini";
TIniFile* iniFile = new TIniFile(sLang);
iniFile->WriteInteger("General", "CurID", m_nCurID);
delete iniFile; delete m_pLangs;
delete m_pExts;
} // ==========================================================================
// Check specific property in the Object
// return : ture - have the property
// false - have not the property
// ==========================================================================
bool TEcLanguage::HasProperty(TComponent* aObject,String PropStr)
{
return (GetPropInfo(aObject, PropStr) != NULL); } // ==========================================================================
// Name : LoadLangFile
// Summary : Load Language string for one form
// Call : LoadLangFile(this);
// Parameter : pFrm : Form object opinter
// Return : true / false
// --------------------------------------------------------------------------
// [modify history]:
// ==========================================================================
bool TEcLanguage::LoadLangFile(TForm* pFrm)
{
if(-1==m_nCurID) return false;
TIniFile* iniFile;
iniFile = new TIniFile(m_sCurFile);
if(!iniFile) return false;
String sComponName = _T("None"); try{
String sTmp;
String sFrmName = pFrm->Name;
if(sFrmName==_T("")){
return false;
} pFrm->Font->Name = TFontName(iniFile->ReadString(_T("General"), _T("FontName"), _T("Arial")));
pFrm->Font->Charset = TFontCharset(iniFile->ReadInteger(_T("General"), _T("Charset"), 1));
pFrm->Font->Size = iniFile->ReadInteger(_T("General"), _T("FontSize"), 9); sTmp = iniFile->ReadString(sFrmName,sFrmName,_T(""));
if ((sTmp!=_T("")) && (pFrm->BorderStyle!=bsNone))
pFrm->Caption = sTmp; TControl* pControl;
TFont* pFont;
int nCount = pFrm->ComponentCount;
for(int ix =0 ;ix<nCount;ix++){ if (HasProperty(pFrm->Components[ix],_T("Caption"))){
sComponName=_T("");
sComponName = pFrm->Components[ix]->Name;
if(sComponName==_T("")) continue;
sTmp = iniFile->ReadString(sFrmName,sComponName,"");
if(sTmp!="")
SetStrProp(pFrm->Components[ix],_T("Caption"), sTmp); if (!HasProperty(pFrm->Components[ix],_T("ParentFont"))) continue;
pControl =dynamic_cast<TControl*>(pFrm->Components[ix]);
if(((TForm*)pControl)->ParentFont) continue; pFont = dynamic_cast<TFont*>(GetObjectProp(pControl,_T("Font")));
pFont->Charset = pFrm->Font->Charset;
pFont->Name = pFrm->Font->Name;
SetObjectProp(pFrm->Components[ix],_T("Font"),pFont);
} //if (HasProperty(pFrm->Components[ix],"ParentFont"))
//{
// pControl =dynamic_cast<TControl*>(pFrm->Components[ix]);
// if(((TForm*)pControl)->ParentFont) continue;
//
// pFont = dynamic_cast<TFont*>(GetObjectProp(pControl,"Font"));
// pFont->Charset = pFrm->Font->Charset;
// pFont->Name = pFrm->Font->Name;
// SetObjectProp(pFrm->Components[ix],"Font",pFont);
//
//}
}
pFrm->Update();
}catch (Exception &exception){ Application->ShowException(&exception); }catch (...){
try{ throw Exception(""); }catch (Exception &exception){ Application->ShowException(&exception);
}
}
delete iniFile; return true;
} // ==========================================================================
// Name : SetLangFile
// Summary : Save controls stirng of form to Language file
// Call : SetLangFile(this);
// Parameter : pFrm : Form object opinter
// Return : void
// --------------------------------------------------------------------------
// [modify history]:
// ==========================================================================
void TEcLanguage::SetLangFile(TForm* pFrm)
{
if(-1==m_nCurID) return;
String sCaption;
TIniFile* iniFile = new TIniFile(m_sCurFile);
try{ iniFile->WriteString(pFrm->Name,pFrm->Name,pFrm->Caption);
iniFile->WriteInteger("General", "Charset", pFrm->Font->Charset);
iniFile->WriteString("General", "FontName", pFrm->Font->Name);
iniFile->WriteInteger("General", "FontSize", pFrm->Font->Size); for(int ix =0 ;ix< pFrm->ComponentCount;ix++){ if (HasProperty(pFrm->Components[ix],_T("Caption")) ){ sCaption = GetStrProp(pFrm->Components[ix],_T("Caption"));
if(sCaption!=""){
iniFile->WriteString(pFrm->Name,pFrm->Components[ix]->Name,sCaption);
}
}
}
}catch (Exception &exception){ Application->ShowException(&exception); }catch (...){
try{ throw Exception(""); }catch (Exception &exception){ Application->ShowException(&exception);
}
}
delete iniFile;
} // ==========================================================================
// Name : GetResourceString
// Summary : Get one resource string to language file
// Call : GetResourceString(Str1,"Form1")
// Parameter : TmpStr : resoruce string
// SectionStr : Section string of ini file
// Return : string which read form the language file
// --------------------------------------------------------------------------
// [modify history]:
// ==========================================================================
String TEcLanguage::GetStr(int nNo, String sSection, String sKey)
{ if(-1==m_nCurID) return "***";
String sText;
TIniFile* iniFile = new TIniFile(m_sCurFile);
sKey.sprintf(_T("%s%03d"),sKey.c_str(),nNo);
sText = iniFile->ReadString(sSection,sKey,"");
delete iniFile; return sText;
} // ==========================================================================
// Name : GetOperSystemLanID
// Summary : get system language ID;
// Call : GetOperSystemLanID();
// Parameter : None;
// Return : int
// --------------------------------------------------------------------------
// [modify history]:
// ==========================================================================
int TEcLanguage::GetOperSystemLanID()
{ LCID lanid = GetSystemDefaultLCID(); //API fun
int nlanid = lanid;
int nLanType = 0; char szLan[10];
itoa(nlanid,szLan,16); //english
if (strcmp(szLan,"409")==0) nLanType=0;
//simple chinese language
if (strcmp(szLan,"804")==0) nLanType=1;
//japan language
if (strcmp(szLan,"411")==0) nLanType=2;
//complicated chinese language
if (strcmp(szLan,"404")==0) nLanType=3;
//Spanish (Traditional Sort) language
if (strcmp(szLan,"40a")==0) nLanType=4;
//Spanish (Mexican) language
if (strcmp(szLan,"80a")==0) nLanType=4; return nLanType;
} bool TEcLanguage::SetLangID(int nID)
{
if(m_nCurID==nID) return false;
m_nCurID = nID;
m_sCurFile.sprintf(_T("%s%s.%s"),m_sLangPath.c_str(),m_sLang.c_str(),m_pExts->Strings[m_nCurID].c_str()); return true; } bool TEcLanBug::LoadLanguage(TForm* pFrm,String sLanFile)
{ TIniFile* iniFile;
iniFile = new TIniFile(sLanFile);
if(!iniFile) return false;
try{
String sTmp;
pFrm->Font->Name = TFontName(iniFile->ReadString("General", "FontName", "Arial"));
pFrm->Font->Size = iniFile->ReadInteger("General", "FontSize", 9);
pFrm->Font->Charset = TFontCharset(iniFile->ReadInteger("General", "Charset", 1));
sTmp = iniFile->ReadString(pFrm->Name,pFrm->Name,"");
if(sTmp!="") pFrm->Caption = sTmp;
TControl* pControl;
TFont* pFont; for(int ix =0 ;ix<pFrm->ComponentCount;ix++){ if (HasProperty(pFrm->Components[ix],"Caption")){ sTmp = iniFile->ReadString(pFrm->Name,pFrm->Components[ix]->Name,"");
if(sTmp!="")
SetStrProp(pFrm->Components[ix],"Caption", sTmp); if (!HasProperty(pFrm->Components[ix],"ParentFont")) continue;
pControl =dynamic_cast<TControl*>(pFrm->Components[ix]);
if(((TForm*)pControl)->ParentFont) continue; pFont = dynamic_cast<TFont*>(GetObjectProp(pControl,"Font"));
pFont->Charset = pFrm->Font->Charset;
pFont->Name = pFrm->Font->Name;
SetObjectProp(pFrm->Components[ix],"Font",pFont);
} //if (HasProperty(pFrm->Components[ix],"ParentFont"))
//{
// pControl =dynamic_cast<TControl*>(pFrm->Components[ix]);
// if(((TForm*)pControl)->ParentFont) continue;
//
// pFont = dynamic_cast<TFont*>(GetObjectProp(pControl,"Font"));
// pFont->Charset = pFrm->Font->Charset;
// pFont->Name = pFrm->Font->Name;
// SetObjectProp(pFrm->Components[ix],"Font",pFont);
//
//}
}
pFrm->Update(); }catch (Exception &exception){ Application->ShowException(&exception); }catch (...){
try{ throw Exception(""); }catch (Exception &exception){ Application->ShowException(&exception);
}
}
delete iniFile; return true;
} void TEcLanBug::SetLanguage(TForm* pFrm,String sLanFile)
{
String sCaption;
TIniFile* iniFile = new TIniFile(sLanFile);
try{ iniFile->WriteString(pFrm->Name,pFrm->Name,pFrm->Caption);
iniFile->WriteInteger("General", "Charset", pFrm->Font->Charset);
iniFile->WriteString("General", "FontName", pFrm->Font->Name);
iniFile->WriteInteger("General", "FontSize", pFrm->Font->Size); for(int ix =0 ;ix< pFrm->ComponentCount;ix++){ if (HasProperty(pFrm->Components[ix],_T("Caption")) ){ sCaption = GetStrProp(pFrm->Components[ix],_T("Caption"));
if(sCaption!=""){
iniFile->WriteString(pFrm->Name,pFrm->Components[ix]->Name,sCaption);
}
}
}
}catch (Exception &exception){ Application->ShowException(&exception); }catch (...){
try{ throw Exception(""); }catch (Exception &exception){ Application->ShowException(&exception);
}
}
delete iniFile;
}