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年面向人工智能“新基建”的知识图谱行业白皮书》。白皮书从善政、惠民、兴业、智融四个部分对…

JSP 简介(转载)

什么是Java Server Pages? JSP全称Java Server Pages&#xff0c;是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头以%>结束。 JSP是一种Java servlet&#xff0c;主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合H…

一元多项式的建立及加减

#include<stdio.h> #include<stdlib.h> typedef struct { int x; int y; struct *next; }node; void create1(node **phead,int i,int n) 一元多项式的建立 { int a,b; node *p1, *p2, *q; p2 *phead; p1 NULL; …

oracle中的in函数,Oracle中In函数的使用

SQL: "IN" FunctionThe IN function helps reduce the need to use multipleORconditions.译&#xff1a;IN函数有助于减少OR条件的复合使用。The syntax for the IN function is:译&#xff1a;IN函数的语法&#xff1a;SELECT columnsFROM tablesWHERE column1 in …

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

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

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

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

Python基本数据类型以及字符串

基本数据类型 数字 int &#xff0c;所有的功能&#xff0c;都放在int里 a1 123 a1 456 - int 将字符串转换为数字 a "123" print(type(a),…

计蒜客 跳跃游戏

给定一个非负整数数组&#xff0c;假定你的初始位置为数组第一个下标。 数组中的每个元素代表你在那个位置能够跳跃的最大长度。 请确认你是否能够跳跃到数组的最后一个下标。 例如&#xff1a;A [2,3,1,1,4]A[2,3,1,1,4] 能够跳跃到最后一个下标&#xff0c;输出true&#xf…

php 面相对象设计,PHP面向对象设计的规范

1.职责过程化的编码&#xff0c;控制代码的职责是判断文件格式&#xff0c;它判断两次不是一次。面向对象的编码&#xff0c;父类的职责是提供规范&#xff0c;判断格式也只有一次&#xff0c;并且不考虑细节。2.内聚内聚是一个模块内部各成分之间相关程度的度量。如果组件职责…

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

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

python成绩转换、百分制到五分制_设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...

展开全部编码思路&#xff1a;申明两个变量: 成绩cj为 浮点数float 且 取值范围为 [0,100] 闭区间内; pf为字62616964757a686964616fe58685e5aeb931333431353262符类型&#xff0c;接收最终分数评级的字母A,B,C,D,E中的一个。引导用户输入100分制的分数&#xff0c;并用cj接收…

数据库临时表空间设置

1、查看临时表空间 &#xff08;dba_temp_files视图&#xff09;&#xff08;v_$tempfile视图&#xff09;select tablespace_name,file_name,bytes/1024/1024 file_size,autoextensible from dba_temp_files;select status,enabled, name, bytes/1024/1024 file_size from v_$…

一元多项式的加减以及求导

采用链式存储结构&#xff0c;将两个线性链表表示的一元多项式相加减&#xff0c;求导并输出。 #include<stdio.h> #include<stdlib.h>typedef struct lnode{int coef; //系数 int index; //指数struct lnode *next; }node;node *Create() //头插法建立一元…

oracle 驱动表提示错误代码,oracle驱动表以及如何确定驱动表

驱动表普遍认为是由SQL语句的写法决定的&#xff0c;简单的说&#xff0c;就是FROM语句后面的表列表中的最后一个。由于SQL语句是从后向前进行分析&#xff0c;Oracle会根据FROM语句从后到前将各个表依次连接起来。SQL> CREATE TABLE T1 AS SELECT * FROM USER_TABLES;表已创…

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;…

B1015/A1062 . 德才论 (25)

宋代史学家司马光在《资治通鉴》中有一段著名的“德才论”&#xff1a;“是故才德全尽谓之圣人&#xff0c;才德兼亡谓之愚人&#xff0c;德胜才谓之君子&#xff0c;才胜德谓之小人。凡取人之术&#xff0c;苟不得圣人&#xff0c;君子而与之&#xff0c;与其得小人&#xff0…

给matlab图加图注,matlab学习5-数据可视化4-gai.ppt

matlab语言丰富的图形表现方法&#xff0c;使得数学计算结果可以方便地、多样性地实现了可视化&#xff0c;这是其它语言所不能比拟的。;第一节 符号函数绘图第二节 图形编辑第三节 2D数据图第四节 3D数据图第五节 MATLAB的视图功能第六节 图像、视频和声音;plot —— 最基本的…

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

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

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

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