您的位置:首页 > 其它

MFC程序双语言实现

2013-12-18 12:15 246 查看
1.对于“对话框”、“菜单”、“工具栏”三种的双语言实现采用MFC资源控制方式实现,例如:

1. 新建工程

新建了一个对话框工程,工程名称为MultiLanguages,默认语言选择是“中文”。

2. 添加多国语言的资源

在创建工程后,工程会添加默认的资源,如主对话框,都是“中文”资源。现在我们需要添加相应的英文的资源文件。

为主窗口IDD_MULTILANGUAGES添加英文资源的方法为:

(1) 打开Resource
View窗口。

(2) 右键IDD_MULTILANGUAGES,点击弹出菜单中的“Insert
Copy”菜单,如下图所示。



(3) 弹出窗口资源复制语言选择窗口,选择语言为“英语(美国)”,如下图所示。



(4) 点击OK,即完成英文版对话框的添加。完成添加后,IDD_MULTILANGUAGES就对应于两个不同语言版本的对话框了,如下图所示。



使用同样的方法,也可以为其他资源添加多国语言版本的支持。主要需要多国版本需要支持的有对话框、菜单和字符串。

添加多国语言的资源后,要对这些资源进行不同语言的定制,根据资源对应的语言,设置对话框和控件的标题等。

程序的语言选择跟操作系统语言(System Locale)、用户设置语言(User
Locale)和线程语言(Thread Locale)有关。程序运行时,是根据线程语言来选择资源的。如果程序中未对线程语言进行设置,线程语言默认采用用户设置语言。设置线程语言的函数是SetThreadLocale。

设置线程语言为“中文”的代码如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT));

设置线程语言为“英语(美国)”的代码如下:

SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT));

设置线程语言要在对话框创建之前,否则无法更改对话框的资源。可以在CMultiLanguagesApp::InitInstance函数中的对话框初始化之前添加线程语言设置,分别设置为中文和英文语言,就可以查看到对话框界面的不同。

在MFC中实现的双语言切换功能类:

头文件:

class CLanguageManger

{

public:

~CLanguageManger();

static CLanguageManger* GetObj();

void InitLanguage();/* 初始化线程语言 */

BOOL SwitchLanguage(); /* 读取当前线程的语言,并根据当前线程语言进行语言切换,调用后应发送WM_CLOSE消息 */

void RestartExeAfterSwitchLanguage();/* 重启程序,实现界面重新加载,应在OnClose中调用 */

protected:

private:

CLanguageManger();

CLanguageManger(CLanguageManger & LanguageManger);

static bool
m_bRestart;

};

实现文件:

#define IDS_STR_CHINESE _T("Chinese")

#define IDS_STR_ENGLISH _T("English")

bool CLanguageManger::m_bRestart = false;

CLanguageManger::CLanguageManger()

{

}

CLanguageManger::~CLanguageManger()

{

}

CLanguageManger* CLanguageManger::GetObj()

{

static CLanguageManger languageManger;

return &languageManger;

}

void CLanguageManger::InitLanguage()

{

int langID = theApp.GetInt(_T("Language"),LANG_CHINESE);

LCID threadID;

if (LANG_ENGLISH == static_cast<WORD>(langID))

{

threadID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);

}

else

{

threadID = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);

}

SetThreadLocale(threadID);

m_bRestart = false;/* 初始化后取消重启标识 */

}

BOOL CLanguageManger::SwitchLanguage()

{

CString msg = TRANS_T("需要重新启动软件完成语言切换!\n是否继续?");

int ret = CUtilityTool::GetObj()->OkCancelDialog(msg);

if(ret == IDCANCEL)

return FALSE;

LCID threadID = GetThreadLocale();//Returns the locale identifier of the current locale for the calling thread.

int langID = 0;

if (LANG_ENGLISH ==

PRIMARYLANGID(//Extracts a primary language identifier from a language identifier.

LANGIDFROMLCID(threadID)//Retrieves a language identifier from a locale identifier.

)

)

{

threadID = MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED), SORT_DEFAULT);

langID = static_cast<int>(LANG_CHINESE);

}

else

{

threadID = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);

langID = static_cast<int>(LANG_ENGLISH);

}

/* 保存配置到注册表选项 */

if(!theApp.WriteInt(_T("Language"),langID))

return FALSE;

m_bRestart = true;/* 切换语言后置位重启标识 */

return TRUE;

}

void CLanguageManger::RestartExeAfterSwitchLanguage()

{

if(m_bRestart == true)/* 如果重启标识被置位则进行重启 */

{

CString moduleName = _T("");

GetModuleFileName(NULL,moduleName.GetBuffer(MAX_PATH),MAX_PATH);

ShellExecute(NULL,_T(""),moduleName,NULL,NULL,SW_SHOWNORMAL);

moduleName.ReleaseBuffer(MAX_PATH);

TRACE("重启退出");

}

else

{

TRACE("直接退出");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: