BCB 语言类

整理日: 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;
}

posted @ 2015-02-16 15:59  wanglinqiang  阅读(447)  评论(0编辑  收藏  举报