mfc oninitdialog 中的hwnd == null_在SOUI中使用动态多语言切换

动态语言切换是很多国际化产品的需求,SOUI之前的版本支持静态多语言翻译,通过在程序启动时设置好语言翻译模块,在程序中打开的UI都会自动调用该翻译模块进行文字翻译,但是不支持运行进语言切换。

最近几个网友都提到这个需求,还是决定在SOUI实现一套动态多语言切换机制。

先看看运行效果:

50d16b591638ee7c06659d0389aa3113.gif

多语言切换首先需要在语言翻译模块管理对象,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 {

c118e7529a28282eec61671a75845032.png

 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 }

参见上面红色代码。

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

c118e7529a28282eec61671a75845032.png

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 新增加的方法。        }}

c118e7529a28282eec61671a75845032.png

 注:该功能只在SOUI 2.6+版本支持。

03174c767ef39fe2998fa9c794c78766.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/486215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年中国面向人工智能“新基建”的知识图谱行业白皮书

全文共计1379字&#xff0c;预计阅读时间8分钟来源 | 艾瑞咨询&#xff08;经授权转载&#xff09;编辑 | 蒲蒲日前&#xff0c;认知智能国家重点实验室&艾瑞咨询联合发布《2020年面向人工智能“新基建”的知识图谱行业白皮书》。白皮书从善政、惠民、兴业、智融四个部分对…

海尔对话 Unity:作为数字转型的高阶形态,数字孪生发展前景不可逆

来源&#xff1a;数字化企业作为信息化发展到一定程度的必然结果&#xff0c;数字孪生正成为人类解构、描述和认识真实世界和虚拟世界的新型工具。从发展态势来看&#xff0c;数字孪生不仅是全新信息技术发展的新焦点&#xff0c;也是各国实现数字化转型的新抓手&#xff0c;还…

js整体缩小网页_SEO网页优化的原则是什么?

SEO网页优化的原则是什么?SEO优化对于网页的排名是非常重要的&#xff0c;排名高低直接影响到流量和转化&#xff0c;那么怎么优化呢&#xff0c;SEO网页优化的原则是什么?下面小编来告诉你SEO网页优化的原则。1、不要抄袭。因为独特的内容是所有搜索引擎都喜欢的&#xff0c…

蒲慕明:今人眼中的大脑之美 | 书评

圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y Cajal, 1852-1934&#xff09;来源&#xff1a; 知识分子撰文&#xff1a;蒲慕明现代神经科学起源于十九世纪末期&#xff1b;圣地亚哥拉蒙-卡哈尔&#xff08;Santiago Ramn y&#xff09;的神经解剖学研究和他提出的神经元理…

sqlite 0转换为bit_Cisco Talos在SQLite中发现了一个远程代码执行漏洞

思科Talos的研究人员在SQLite中发现了一个use-after-free() 的漏洞&#xff0c;攻击者可利用该漏洞在受影响设备上远程执行代码。攻击者可以通过向受影响的SQLite安装发送恶意SQL命令来触发此漏洞。“Sqlite3 3.26.0的窗口函数&#xff08;Window_Function&#xff09;中存在可…

构建未来情报体系—— AI及大数据时代情报分析人员的战略价值

知远战略与防务研究所 沐俭/编译来自&#xff1a;美国战略与国际问题研究中心网站【知远导读】本篇推送编辑节选自美国战略与国际问题研究中心&#xff08;CSIS&#xff09;技术与情报专项研究小组撰写的一篇利用新兴科技提高情报分析人员的战略情报分析能力的文章&#xff0c;…

中国的自动驾驶到底发展到了什么程度?

来源&#xff1a;面包板社区中国在自动驾驶汽车&#xff08;AV&#xff09;领域投入了大量资金&#xff0c;计划大力发展汽车工业这一新兴领域&#xff0c;包括技术、初创企业、测试、法律法规和部署等各个方面。图1&#xff1a;在百度世界2020大会上&#xff0c;百度展示了其全…

数据挖掘算法_技术分享|大数据挖掘算法之KNNk近邻算法

程一舰数据技术处K最近邻(kNN&#xff0c;k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻&#xff0c;就是k个最近的邻居的意思&#xff0c;说的是每个样本都可以用它最接近的k个邻居来代表。KNN是通过测量不同特征值之间的距离进行分类。其基本…

岩板铺地好吗_别人都说岩板好,我笑他人乐太早

若说岩板是陶瓷行业目前最火爆的产品&#xff0c;相信没有人会睁眼说瞎话表示反对。据统计&#xff0c;目前国内已建成的岩板生产线已有55条&#xff0c;计划在下半年建成/投产的岩板生产线已有17条。照此势头发展下去&#xff0c;国内岩板生产线的条数在2021年将逼近100条&…

人工智能和自然智能能否交汇?李飞飞对话斯坦福神经生物学教授Bill Newsome

作者&#xff1a;SHANA LYNCH机器之心编译编辑&#xff1a;张倩计算在神经科学中扮演了什么角色&#xff1f;在分子水平上理解大脑能否带来更好的神经网络&#xff1f;人工智能和自然智能之间是否存在一道无法逾越的鸿沟&#xff1f;会不会出现一个研究智能的统一框架&#xff…

spring(三)-事务管理

1、 Spring事务管理 事务管理&#xff1a;本质是使用spring管理事务&#xff0c;完成数据库对于事务的支持。 事务&#xff1a;一系列对数据库操作的集合&#xff0c;一个操作错误&#xff0c;所有都必须回滚&#xff0c;其特点是acid。 &#xff08;1&#xff09;事务并发存在…

思科nat配置实例_Cisco ASA 5520(8.2.4)配置企业内网案例

思科防火墙ASA5520 外观网络拓扑图如下内网 网段 192.168.2.0/24公网IP地址 118.25.235.100公网IP地址网关:118.25.235.1.1防火墙内网IP:192.168.2.1/24配置步骤&#xff1a;1、基本配置及配置内外网接口conf thostname ASAFW #设置主机名enable secret pass123 #设置特权密码c…

刘伟:什么是智能人机交互?

本文来自刘伟科学网博客北京邮电大学 刘伟这是一个非常有趣的问题&#xff0c;既涉及智能又牵扯人机交互&#xff0c;更重要的是两者之间的联系。如果把人机交互看成脖子以下&#xff0c;即生理与物理之间的相互作用&#xff08;如视域、听域、可达域、舒适域&#xff09;的话&…

警方建立了一个人工智能来预测暴力犯罪,它有严重缺陷

来源&#xff1a;机器学习研究组订阅号在英国&#xff0c;有一个被称为“最严重暴力”&#xff08;简称MSV&#xff0c;即Most Serious Violence&#xff09;的预测系统&#xff0c;这个预测系统归属于国家数据分析解决方案&#xff08;NDAS&#xff09;项目。过去两年&#xf…

大数据应用开发1——配置基础环境

一、基础环境配置 1.配置虚拟网络 1.1、点击1、编辑2和3&#xff0c; 1.2、点开4&#xff0c;编辑网关 2、配置虚拟机环境 1.1、安装一台虚拟机&#xff0c;使用root用户登录&#xff0c;打开终端 1.2修改主机名 终端输入&#xff1a; vim /etc/hostname使用vim编辑/etc/ho…

交叉科学部如何建?基金委:要做好这4点

来源&#xff1a;科学网微信公号 11月29日&#xff0c;国家自然科学基金委员会&#xff08;以下简称自然科学基金委&#xff09;交叉科学高端学术论坛在北京召开。第十二届全国政协副主席、中国科协名誉主席、中国科学院院士韩启德&#xff0c;自然科学基金委原主任、中国科学院…

智能三定律(1),提出智能三条定律的背景和原因

前言&#xff1a;智能是重要的智能科学基础概念&#xff0c;如何解读它也一直存在争议&#xff0c;2005年以来&#xff0c;通过对互联网进化规律、标准智能模型与AI智商评测的研究&#xff0c;我们获得了关于智能的新启发与新思考&#xff0c;2020年5月&#xff0c;智能定律初探…

2017年网易校招题 末尾0的个数

题目描述 输入一个正整数n,求n!(即阶乘)末尾有多少个0&#xff1f; 比如: n 10; n! 3628800,所以答案为2输入描述: 输入为一行&#xff0c;n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 示例1输入 10 输出 2 思路&#xff1a;要统计末尾0的个数&#xff0c;只需要统…

麻省理工学院的牛人解说数学体系,你到哪个层次了?

来源&#xff1a;数学与人工智能为什么要深入数学的世界我不否认现在广泛流行的Graphical Model是对复杂现象建模的有力工具&#xff0c;但是&#xff0c;我认为它不是panacea&#xff0c;并不能取代对于所研究的问题的深入的钻研。如果统计学习包治百病&#xff0c;那么很多 “…

linux gpio设备驱动程序,嵌入式Linux设备驱动开发之:GPIO驱动程序实例-嵌入式系统-与非网...

11.3 GPIO驱动程序实例11.3.1 GPIO工作原理FS2410开发板的S3C2410处理器具有117个多功能通用I/O(GPIO)端口管脚&#xff0c;包括GPIO 8个端口组&#xff0c;分别为GPA(23个输出端口)、GPB(11个输入/输出端口)、GPC(16个输入/输出端口)、GPD(16个输入/输出端口)、GPE(16个输入…