mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换
動(dòng)態(tài)語(yǔ)言切換是很多國(guó)際化產(chǎn)品的需求,SOUI之前的版本支持靜態(tài)多語(yǔ)言翻譯,通過在程序啟動(dòng)時(shí)設(shè)置好語(yǔ)言翻譯模塊,在程序中打開的UI都會(huì)自動(dòng)調(diào)用該翻譯模塊進(jìn)行文字翻譯,但是不支持運(yùn)行進(jìn)語(yǔ)言切換。
最近幾個(gè)網(wǎng)友都提到這個(gè)需求,還是決定在SOUI實(shí)現(xiàn)一套動(dòng)態(tài)多語(yǔ)言切換機(jī)制。
先看看運(yùn)行效果:
多語(yǔ)言切換首先需要在語(yǔ)言翻譯模塊管理對(duì)象,SOUI中使用一個(gè)擴(kuò)展接口ITranslatorMgr處理。
下面是新版本的語(yǔ)言翻譯接口:
namespace SOUI{ /** * @struct ITranslator * @brief 語(yǔ)言翻譯接口 * * Describe */ struct ITranslator : public IObjRef { /** * Load * @brief 從資源中加載語(yǔ)言翻譯數(shù)據(jù) * @param LPVOID pData -- 資源指針,具體含義由接口的實(shí)現(xiàn)來解釋 * @param UINT uType -- 資源類型,具體含義由接口的實(shí)現(xiàn)來解釋 * @return BOOL true-加載成功, false-加載失敗 * * Describe */ virtual BOOL Load(LPVOID pData,UINT uType)=0; /** * name * @brief 獲取翻譯資源的name * @return SOUI::SStringW 翻譯資源的name * * Describe */ virtual SStringW name()=0; /** * guid * @brief 獲取翻譯資源的ID * @return GUID 翻譯資源的ID * * Describe */ virtual GUID guid()=0; /** * tr * @brief 執(zhí)行翻譯的接口 * @param const SStringW & strSrc -- 原字符串 * @param const SStringW & strCtx -- 翻譯上下文 * @param SStringW & strRet -- 翻譯后的字符串 * @return BOOL true-翻譯成功,false-翻譯失敗 * * Describe */ virtual BOOL tr(const SStringW & strSrc,const SStringW & strCtx,SStringW & strRet)=0; };/** * @struct ITranslatorMgr * @brief 語(yǔ)言翻譯接口管理器 * * Describe */ struct ITranslatorMgr : public IObjRef { /** * SetLanguage * @brief 設(shè)置翻譯模塊當(dāng)前接受的語(yǔ)言 * @param [in] const SStringW & strLang -- 翻譯語(yǔ)言 * * Describe 自動(dòng)清除語(yǔ)言和目標(biāo)語(yǔ)言不同的模塊 */ virtual void SetLanguage(const SStringW & strLang) = 0; /** * GetLanguage * @brief 獲取翻譯模塊當(dāng)前接受的語(yǔ)言 * @return SStringW -- 翻譯語(yǔ)言 * * Describe */ virtual SStringW GetLanguage() const = 0; /** * CreateTranslator * @brief 創(chuàng)建一個(gè)語(yǔ)言翻譯對(duì)象 * @param [out] ITranslator * * ppTranslator -- 接收語(yǔ)言翻譯對(duì)象的指針 * @return BOOL true-成功,false-失敗 * * Describe */ virtual BOOL CreateTranslator(ITranslator ** ppTranslator)=0; /** * InstallTranslator * @brief 向管理器中安裝一個(gè)語(yǔ)言翻譯對(duì)象 * @param ITranslator * ppTranslator -- 語(yǔ)言翻譯對(duì)象 * @return BOOL true-成功,false-失敗 * * Describe */ virtual BOOL InstallTranslator(ITranslator * ppTranslator) =0; /** * UninstallTranslator * @brief 從管理器中卸載一個(gè)語(yǔ)言翻譯對(duì)象 * @param REFGUID id -- 語(yǔ)言翻譯對(duì)象的ID * @return BOOL true-成功,false-失敗 * * Describe */ virtual BOOL UninstallTranslator(REFGUID id) =0; /** * tr * @brief 翻譯字符串 * @param const SStringW & strSrc -- 原字符串 * @param const SStringW & strCtx -- 翻譯上下文 * @return SOUI::SStringW 翻譯后的字符串 * * Describe 調(diào)用ITranslator的tr接口執(zhí)行具體翻譯過程 */ virtual SStringW tr(const SStringW & strSrc,const SStringW & strCtx)=0; };}用戶切換UI語(yǔ)言后,使用SDispatchMessage方法向所有SWindow發(fā)送UM_SETLANGUAGE消息。
SWindow收到該消息后對(duì)窗口中需要做語(yǔ)言翻譯的對(duì)象重新翻譯語(yǔ)言后更新顯示。
要在SOUI中使用多語(yǔ)言切換,首先需要在winmain里設(shè)置翻譯模塊:1 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int /*nCmdShow*/) 2 {
參見上面紅色代碼。
需要切換語(yǔ)言時(shí),如下加載新的翻譯模塊即可:
void CMainDlg::OnLanguage(int nID){ ITranslatorMgr *pTransMgr = SApplication::getSingletonPtr()->GetTranslator(); bool bCnLang = nID == R.id.lang_cn; pugi::xml_document xmlLang; if (SApplication::getSingletonPtr()->LoadXmlDocment(xmlLang, bCnLang?_T("cn"):_T("en"), _T("lang"))) { CAutoRefPtr lang; pTransMgr->CreateTranslator(&lang); lang->Load(&xmlLang.child(L"language"), 1);//1=LD_XML pTransMgr->SetLanguage(lang->name()); pTransMgr->InstallTranslator(lang); SDispatchMessage(UM_SETLANGUAGE,0,0); //soui2.6 新增加的方法。 }}?注:該功能只在SOUI 2.6+版本支持。
總結(jié)
以上是生活随笔為你收集整理的mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx解决浏览器跨域问题_前端通过N
- 下一篇: html四边形的的框怎么编写,html知