mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换
生活随笔
收集整理的這篇文章主要介紹了
mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
動態語言切換是很多國際化產品的需求,SOUI之前的版本支持靜態多語言翻譯,通過在程序啟動時設置好語言翻譯模塊,在程序中打開的UI都會自動調用該翻譯模塊進行文字翻譯,但是不支持運行進語言切換。
最近幾個網友都提到這個需求,還是決定在SOUI實現一套動態多語言切換機制。
先看看運行效果:
多語言切換首先需要在語言翻譯模塊管理對象,SOUI中使用一個擴展接口ITranslatorMgr處理。
下面是新版本的語言翻譯接口:
namespace SOUI{ /** * @struct ITranslator * @brief 語言翻譯接口 * * Describe */ struct ITranslator : public IObjRef { /** * Load * @brief 從資源中加載語言翻譯數據 * @param LPVOID pData -- 資源指針,具體含義由接口的實現來解釋 * @param UINT uType -- 資源類型,具體含義由接口的實現來解釋 * @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 執行翻譯的接口 * @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 語言翻譯接口管理器 * * Describe */ struct ITranslatorMgr : public IObjRef { /** * SetLanguage * @brief 設置翻譯模塊當前接受的語言 * @param [in] const SStringW & strLang -- 翻譯語言 * * Describe 自動清除語言和目標語言不同的模塊 */ virtual void SetLanguage(const SStringW & strLang) = 0; /** * GetLanguage * @brief 獲取翻譯模塊當前接受的語言 * @return SStringW -- 翻譯語言 * * Describe */ virtual SStringW GetLanguage() const = 0; /** * CreateTranslator * @brief 創建一個語言翻譯對象 * @param [out] ITranslator * * ppTranslator -- 接收語言翻譯對象的指針 * @return BOOL true-成功,false-失敗 * * Describe */ virtual BOOL CreateTranslator(ITranslator ** ppTranslator)=0; /** * InstallTranslator * @brief 向管理器中安裝一個語言翻譯對象 * @param ITranslator * ppTranslator -- 語言翻譯對象 * @return BOOL true-成功,false-失敗 * * Describe */ virtual BOOL InstallTranslator(ITranslator * ppTranslator) =0; /** * UninstallTranslator * @brief 從管理器中卸載一個語言翻譯對象 * @param REFGUID id -- 語言翻譯對象的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 調用ITranslator的tr接口執行具體翻譯過程 */ virtual SStringW tr(const SStringW & strSrc,const SStringW & strCtx)=0; };}用戶切換UI語言后,使用SDispatchMessage方法向所有SWindow發送UM_SETLANGUAGE消息。
SWindow收到該消息后對窗口中需要做語言翻譯的對象重新翻譯語言后更新顯示。
要在SOUI中使用多語言切換,首先需要在winmain里設置翻譯模塊:1 int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int /*nCmdShow*/) 2 {
參見上面紅色代碼。
需要切換語言時,如下加載新的翻譯模塊即可:
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+版本支持。
總結
以上是生活随笔為你收集整理的mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: nginx解决浏览器跨域问题_前端通过N
- 下一篇: html四边形的的框怎么编写,html知