动态语言切换是很多国际化产品的需求,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中使用动态多语言切换的更多相关文章

  1. vue-i18n vue-cli项目中实现国际化 多语言切换功能 一

    vue-cli项目中引入vue-i18n 安装: npm install vue-i18n可参考vue-i18n官网文档 main.js中引入: import Vue from 'vue' impor ...

  2. Silverlight中本地化的实现(语言切换)

    对于本地化这个功能我个人一直觉得在需求阶段就要确定该项目需不需要实行本地化,这样后面就可以减轻许多工作量,Sl中对本地化功能的支持与ASP.NET 中一样,主要使用CultureInfo类来完成的. ...

  3. vue-i18n 国际化语言切换

    vue-i18n 用于前端vue项目中,需要多语言切换的场景 安装方法(npm) npm install vue-i18n 简单使用   1.在vue项目的main.ts文件中实例化 i18n imp ...

  4. 动态语言切换(续)-designer中的retranslateUi(带源码)

    本站所有文章由本站和原作者保留一切权力,仅在保留本版权信息.原文链接.原文作者的情况下允许转载,转载请勿删改原文内容, 并不得用于商业用途. 谢谢合作.原文链接:动态语言切换(续)-designer中 ...

  5. 在使用Qt5.8完成程序动态语言切换时遇到的问题

    因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文 ...

  6. 关于在静态html中实现语言切换的思路与实现

    在项目中只用到了三种语言:英文.中文简体.中文繁体.所以我首先想到了最笨的方法:1.直接将三种语言写在html中,显示当前设置的语言隐藏其它两种来实现.2.使用css伪元素的content:attr( ...

  7. (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)

    目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...

  8. 第九篇:在SOUI中使用多语言翻译

    为UI在不同地区显示不同的语言是产品国际化的一个重要要求. 在SOUI中实现了一套类似QT的多语言翻译机制:布局XML不需要调整,程序代码也不需要调整,只需要为不同地区的用户提供不同的语言翻译文件即可 ...

  9. 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组

    学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...

随机推荐

  1. wqs二分

    今天模拟赛有一道林克卡特树,完全没有思路 赛后想了一想,不就是求\(k+1\)条不相交的链,使其权值之和最大嘛,傻了. 有一个最裸的\(DP\),设\(f[i][j][k]\)表示在以\(i\)为根的 ...

  2. C++ 黑白棋AI minimax+alphabeta剪枝

    没事写着玩玩,通过debian上的黑白棋测试,搜了10层,打hard应该问题不大 #include <cstdio> #include <cstring> using name ...

  3. dedecms安装操作-重安装-开启GD库

    wamp5_1.7.4 打开:http://localhost/install/安装 (输入:域名/install,回车跳转到安装界面,勾选“我已经阅读并同意此协议”,然后点击“继续按钮”.) 重安装 ...

  4. jquery-防多店铺购物车结算全选,单选,及删除,价格计算

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. linux批量压缩当前目录中文件后,删除原文件

    linux批量压缩当前目录中文件后,删除原文件 for i in `ls|awk -F " " '{print $NF}'`; do tar -zcvf $i.tar.gz $i ...

  6. CSS 知识点整理

    本文是我整理的关于CSS的部分基础知识点,适合正在准备前端工作面试的人做简单回顾. 1. 盒子模型 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容. Mar ...

  7. Angular记录(5)

    文档资料 箭头函数--MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_fun ...

  8. antd table 点击行触发radio 或 checkbox

     UIStore.ts (使用mobx) 1 import { observable, action, computed } from 'mobx' export class UIStore { @o ...

  9. 背景上实现阴影——linear-gradient

    /*从元素顶部有条阴影,两种方式,第二种更好,能控制阴影的宽度*/background-image: linear-gradient(0deg, rgba(226, 226, 226, 0) 97%, ...

  10. EASY-X

    ----------------------- Page 1----------------------- 一 创建新项目 VC 写程序要有项目的概念,一个项目可以有多个 .cpp 文件,多个项目构 ...