在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)=;
/**
* name
* @brief 获取翻译资源的name
* @return SOUI::SStringW 翻译资源的name
*
* Describe
*/
virtual SStringW name()=;
/**
* guid
* @brief 获取翻译资源的ID
* @return GUID 翻译资源的ID
*
* Describe
*/
virtual GUID guid()=;
/**
* 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)=;
}; /**
* @struct ITranslatorMgr
* @brief 语言翻译接口管理器
*
* Describe
*/
struct ITranslatorMgr : public IObjRef
{
/**
* SetLanguage
* @brief 设置翻译模块当前接受的语言
* @param [in] const SStringW & strLang -- 翻译语言
*
* Describe 自动清除语言和目标语言不同的模块
*/
virtual void SetLanguage(const SStringW & strLang) = ; /**
* GetLanguage
* @brief 获取翻译模块当前接受的语言
* @return SStringW -- 翻译语言
*
* Describe
*/
virtual SStringW GetLanguage() const = ; /**
* CreateTranslator
* @brief 创建一个语言翻译对象
* @param [out] ITranslator * * ppTranslator -- 接收语言翻译对象的指针
* @return BOOL true-成功,false-失败
*
* Describe
*/
virtual BOOL CreateTranslator(ITranslator ** ppTranslator)=;
/**
* InstallTranslator
* @brief 向管理器中安装一个语言翻译对象
* @param ITranslator * ppTranslator -- 语言翻译对象
* @return BOOL true-成功,false-失败
*
* Describe
*/ virtual BOOL InstallTranslator(ITranslator * ppTranslator) =;
/**
* UninstallTranslator
* @brief 从管理器中卸载一个语言翻译对象
* @param REFGUID id -- 语言翻译对象的ID
* @return BOOL true-成功,false-失败
*
* Describe
*/
virtual BOOL UninstallTranslator(REFGUID id) =; /**
* 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)=; }; }
用户切换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<SOUI::IImgDecoderFactory> pImgDecoderFactory;
19 CAutoRefPtr<SOUI::IRenderFactory> pRenderFactory;
20 CAutoRefPtr<ITranslatorMgr> 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<IResProvider> sysResProvider;
36 CreateResProvider(RES_PE, (IObjRef**)&sysResProvider);
37 sysResProvider->Init((WPARAM)hModSysResource, 0);
38 theApp->LoadSystemNamedResource(sysResProvider);
39 FreeLibrary(hModSysResource);
40 }else
41 {
42 SASSERT(0);
43 }
44
45 CAutoRefPtr<IResProvider> 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 #endif
57
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<ITranslator> langCN;
68 trans->CreateTranslator(&langCN);
69 langCN->Load(&xmlLang.child(L"language"), 1);//1=LD_XML
70 trans->InstallTranslator(langCN);
71 }
72 }
73 // BLOCK: Run application
74 {
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<ITranslator> 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+版本支持。
在SOUI中使用动态多语言切换的更多相关文章
- vue-i18n vue-cli项目中实现国际化 多语言切换功能 一
vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...
- Silverlight中本地化的实现(语言切换)
对于本地化这个功能我个人一直觉得在需求阶段就要确定该项目需不需要实行本地化,这样后面就可以减轻许多工作量,Sl中对本地化功能的支持与ASP.NET 中一样,主要使用CultureInfo类来完成的. ...
- vue-i18n 国际化语言切换
vue-i18n 用于前端vue项目中,需要多语言切换的场景 安装方法(npm) npm install vue-i18n 简单使用 1.在vue项目的main.ts文件中实例化 i18n imp ...
- 动态语言切换(续)-designer中的retranslateUi(带源码)
本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...
- 在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文 ...
- 关于在静态html中实现语言切换的思路与实现
在项目中只用到了三种语言:英文.中文简体.中文繁体.所以我首先想到了最笨的方法:1.直接将三种语言写在html中,显示当前设置的语言隐藏其它两种来实现.2.使用css伪元素的content:attr( ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- 第九篇:在SOUI中使用多语言翻译
为UI在不同地区显示不同的语言是产品国际化的一个重要要求. 在SOUI中实现了一套类似QT的多语言翻译机制:布局XML不需要调整,程序代码也不需要调整,只需要为不同地区的用户提供不同的语言翻译文件即可 ...
- 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组
学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...
随机推荐
- 安卓上用Termux终端模拟器安装MC Forge 1.12.2服务器!
本教程重度新手向,大神勿喷(因为楼主本人就是Linux小白)! 为了让教程合乎简约至上的原则,将不在基本操作上赘述 测试环境:酷派大神Note3 Android5.0 2GBRAM 未root 截图是 ...
- python全栈开发中级班全程笔记(第二模块)第一部分:文件处理
第二模块 第一部分:文件处理与函数 #插曲之人丑就要多读书:读书能够提高个人素质与内涵,提升个人修养与能力,以及层次的提升. 推荐书籍:追风筝的人.白鹿原 电影:阿甘正传.辛德勒的名单 第一节:三 ...
- JavaEEspring整理
Spring框架—控制反转(IOC) 1 Spring框架概述 1.1 什么是Spring 1.2 S ...
- 【JS】使用变量作为object的key-方法汇总
1.方法一 var a = 'id'; var str = '{'+a+' : 12}' var obj = eval("("+str+")"); 结果: ob ...
- I/O模型系列之一:Linux I/O模型基本概念
1. IO模型矩阵 基本 Linux I/O 模型的简单矩阵: 同步与异步:描述的是用户线程与内核的交互方式. 同步IO和异步IO的区别就在于:数据拷贝的时候进程是否阻塞! 同步是指用户线程发起IO请 ...
- C#匿名对象(转JSON)
多类型匿名对象 var result = new { pages = , users = new System.Collections.ArrayList { ,name="}, ,name ...
- IDEA中 GIT与SVN版本控制插件的切换
https://www.cnblogs.com/yccmelody/p/7794220.html
- 安卓触控一体机的逆袭之路_追逐品质_支持APP软件安卓
显示性能参数 接口:RGB信号 分辨率:1024*600 比例16:9 显示尺寸(A.A.):222.72*(W)*125.28(H)mm 外围尺寸:235.0(W)*143.0(H)*4.5(T)m ...
- codeforces 1151 A
一个让我爆零的水题,,,,, codeforces 1151A 1000分 题意:一个字符串,单个字符可以一步可以变成左右两个(Z可以变成Y,A),问最低多少步可以产生“ACTG”: 错因:错误的 ...
- java 新手必看大全
背景:c#开发人员 学习java 新手一枚.只适合新手 1:配置java环境 (win10环境参考本目录java环境配置) 2:IDEA 熟悉开发工具 (当初没学java 很大的一个原因就是工具e文 ...