整理日: 2015年2月16日ide
/*----------------------------------------------------------------------------*/ // 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
/*----------------------------------------------------------------------------*/ // 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; }