动态语言切换是很多国际化产品的需求,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 {

 3     HRESULT hRes = OleInitialize(NULL); 4     SASSERT(SUCCEEDED(hRes)); 5  6     int nRet = 0; 7      8     SComMgr *pComMgr = new SComMgr; 9 10     //将程序的运行路径修改到项目所在目录所在的目录11     TCHAR szCurrentDir[MAX_PATH] = { 0 };12     GetModuleFileName(NULL, szCurrentDir, sizeof(szCurrentDir));13     LPTSTR lpInsertPos = _tcsrchr(szCurrentDir, _T('\\'));14     _tcscpy(lpInsertPos + 1, _T("..\\SouiWizard1"));15     SetCurrentDirectory(szCurrentDir);16     {17         BOOL bLoaded=FALSE;18         CAutoRefPtr<:iimgdecoderfactory> pImgDecoderFactory;19         CAutoRefPtr<:irenderfactory> pRenderFactory;20         CAutoRefPtr trans;                  //多语言翻译模块,由translator.dll提供21 22         bLoaded = pComMgr->CreateRender_GDI((IObjRef**)&pRenderFactory);23         SASSERT_FMT(bLoaded,_T("load interface [render] failed!"));24         bLoaded=pComMgr->CreateImgDecoder((IObjRef**)&pImgDecoderFactory);25         SASSERT_FMT(bLoaded,_T("load interface [%s] failed!"),_T("imgdecoder"));26         bLoaded = pComMgr->CreateTranslator((IObjRef**)&trans);27         SASSERT_FMT(bLoaded, _T("load interface [%s] failed!"), _T("translator"));28 29         pRenderFactory->SetImgDecoderFactory(pImgDecoderFactory);30         SApplication *theApp = new SApplication(pRenderFactory, hInstance);31         //从DLL加载系统资源32         HMODULE hModSysResource = LoadLibrary(SYS_NAMED_RESOURCE);33         if (hModSysResource)34         {35             CAutoRefPtr sysResProvider;36             CreateResProvider(RES_PE, (IObjRef**)&sysResProvider);37             sysResProvider->Init((WPARAM)hModSysResource, 0);38             theApp->LoadSystemNamedResource(sysResProvider);39             FreeLibrary(hModSysResource);40         }else41         {42             SASSERT(0);43         }44 45         CAutoRefPtr   pResProvider;46 #if (RES_TYPE == 0)47         CreateResProvider(RES_FILE, (IObjRef**)&pResProvider);48         if (!pResProvider->Init((LPARAM)_T("uires"), 0))49         {50             SASSERT(0);51             return 1;52         }53 #else 54         CreateResProvider(RES_PE, (IObjRef**)&pResProvider);55         pResProvider->Init((WPARAM)hInstance, 0);56 #endif57 58         theApp->InitXmlNamedID(namedXmlID,ARRAYSIZE(namedXmlID),TRUE);59         theApp->AddResProvider(pResProvider);60 61         if (trans)62         {//加载中文语言翻译包63             theApp->SetTranslator(trans);64             pugi::xml_document xmlLang;65             if (theApp->LoadXmlDocment(xmlLang, _T("cn"), _T("lang")))66             {67                 CAutoRefPtr langCN;68                 trans->CreateTranslator(&langCN);69                 langCN->Load(&xmlLang.child(L"language"), 1);//1=LD_XML70                 trans->InstallTranslator(langCN);71             }72         }73         // BLOCK: Run application74         {75             CMainDlg dlgMain;76             dlgMain.Create(GetActiveWindow());77             dlgMain.SendMessage(WM_INITDIALOG);78             dlgMain.CenterWindow(dlgMain.m_hWnd);79             dlgMain.ShowWindow(SW_SHOWNORMAL);80             nRet = theApp->Run(dlgMain.m_hWnd);81         }82 83         delete theApp;84     }85     86     delete pComMgr;87     88     OleUninitialize();89     return nRet;90 }

参见上面红色代码。

需要切换语言时,如下加载新的翻译模块即可:

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中使用动态多语言切换相关推荐

  1. SOUI中SRealWnd的使用

    这里做一个VLC的例子(在SOUI中使用VLC来播放一下本地文件和流) Step1 使用向导建立一个工程,将需要包含的VLC文件包含进去 Step2 SOUI 界面的一些设置 Step3 编写代码 实 ...

  2. 第三十四篇:在SOUI中使用异步通知

    概述 异步通知是客户端开发中常见的需求,比如在一个网络处理线程中要通知UI线程更新等等. 通常在Windows编程中,为了方便,我们一般会向UI线程的窗口句柄Post/Send一个窗口消息从而达到将非 ...

  3. 在SOUI中使用线性布局

    SOUI 2.5.1.1开始支持线性布局(LinearLayout). 要在SOUI布局中使用线性布局, 需要在布局容器窗口里指定布局类型为vbox | hbox, (vbox为垂直线性布局, hbo ...

  4. 第二十三篇:在SOUI中使用LUA脚本开发界面

    像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑. ...

  5. 拓展SOUI中SImRichEdit控件的视频OLE控件(VideoOle)

    视频定位控件数据可分为两部分: 可见部分:播放按钮.加载按钮.视频第一帧图片.视频时长 不可见部分:视频URL 以下为VideoOle控件头文件部分: extern "C" con ...

  6. soui中apng 图像解码器解码图片后像素格式研究

    soui是一个非常牛逼的界面库,里面对图片透明有着很好的支持,这也是我喜欢soui的一个重要原因.soui中不仅可以设置主窗口半透明,而且还可以设置soui子窗口半透明,两者的设置都非常的简单.只需要 ...

  7. vc可以实现对话框里显示html文档内容,也可以显示word内容吗,VC6中使用CHtmlView在对话框控制中显示HTML文档...

    VC6中使用CHtmlView在对话框控制中显示HTML文档 2008-02-23 05:29:58来源:互联网 阅读 () 在Visual Studio 6.0中出现了一个新类CHtmlView,利 ...

  8. SOUI的一个动态创建控件的小例子

    涉及知识点: 获取可用的屏幕个数以及分辨率 SOUI中的线性布局的使用 SOUI中的动态插入xml的方法(也就是动态的创建控件) 对动态创建出来的控件,进行一个点击事件的注册 目的:获取屏幕个数,生成 ...

  9. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

最新文章

  1. 潘建伟团队首次实现18个光量子比特纠缠,刷新世界记录
  2. SET IDENTITY_INSERT [Table] [ON|OFF]
  3. 一步一步学Linq to sql(七):并发与事务
  4. 【转】Java程序员常用工具类库 - 目录
  5. SQL Server2012登录记录怎么删除?
  6. iOS开源项目周报0323
  7. Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称...
  8. Ipython知识点总结
  9. CentOS 6 编译安装subversion-1.8.10+Apache2.4
  10. ESP8266:(2)获取时间和天气
  11. MDT 2013 从入门到精通之自动化部署WinSer 2012 R2
  12. VB中字符串匹配的多种方式
  13. mui 中template 的使用
  14. Atitit 通用服务端代理接口 转接口 attilax总结
  15. FIT2CLOUD安装
  16. ArcGIS 计算椭球面积
  17. ToB和ToC端产品分别指什么
  18. 天翼网盘在线直链解析源码
  19. (毕业设计资料)基于单片机万用表量程手动自动电阻电流电压设计
  20. 物联网卡和流量卡相比哪个信号强

热门文章

  1. 学硕计算机考296算高分么,考研总分是多少算高分?考研340分是什么水平?
  2. php接收二进制流,php接收二进制流【转】
  3. python装饰器由浅入深_由浅入深理解Python装饰器
  4. vant toast 指定挂载到指定位置_docker卷挂载技术
  5. 安卓apk签名提取工具_Android测试工具入门介绍(二)
  6. Linux环境变量配置的三个方法--/etc/profile,~/.bashrc,shell
  7. VMware中ubuntu虚拟机与windows的端口映射,共享一个IP地址
  8. python天气预报官网_python 实现对天气预报官网未来一周七天的天气情况抓取
  9. 清华提出LogME,无需微调就能衡量预训练模型的下游任务表现!
  10. 强化学习扫盲贴:从Q-learning到DQN