DuiLib多语言解决方案

DuiLib多语言解决方案

 

我参考了一下现有的duilib多语言解决办法,基本上就是手工维护字符串列表,在GetText中通过偷梁换柱的方式把显示的文本替换掉了,包括tooltip、tipvalue,其中也可以把image属性也作为多语言的字符串处理,还有在DiableBuilder偷偷换掉xml名字去加载。特点都是纯手工维护,对于稍微大型的软件,维护起来就困难重重。为了贯彻能偷懒就偷懒的方针,决定依靠设计器实现统一维护多语言包。

我的想法是,回归到数字ID作为属性去匹配字符串,每个xml产生单独的语言包文件,每个xml维护自身的id序号,duilib根据xml文件名去匹配语言包。每个控件都有自己的resourceid属性。针对于程序中的动态文本,单独产生一个StringTable文件,这个文件是需要手动维护了。所以我的皮肤文件目录,大概这样子的:

resourceid可以通过设计器自动生成,首先检查字段中有没有text、tooltip、tipvalue属性,如果为空忽略。如果有这三字段的,又不需要多语言干预的控件,可以设置resourceid=-1。

单独的语言包是长这样子的,这是一个edit控件:

<?xml version="1.0"?>
<Language>
<Text id="1" text="编辑框" tooltip="我是编辑框"  tipvalue="请输入"/>
</Language>

StringTable文件长这样

<?xml version="1.0"?>
<Language>
    <String id="1" text1="0001" text2="0002" text3="0003" />
</Language>

程序中使用CLangManager::GetString1(id), CLangManager::GetString2(id), CLangManager::GetString3(id),获取对应上面的字符串text1,text2,text3。

程序调用时,初始化语言包路径:

CLangManagerUI::SetLanguage(_T("Lang\\ChineseSimplified"), _T("chs"));

动态切换到英文:

CLangManagerUI::SetLanguage(_T("Lang\\English"), _T("en"));
       GetMainWnd()->GetManager()->GetLangManager()->ReloadLanguage();

后期我可能会考虑固定语言包文件夹名字(就是上面的lang文件夹),设计器中删除添加控件时,自动处理每个语言包。作为有强迫症的我,已经能忍受resourceid不连续了,不能忍受已经不存在的东西还残留在语言包里头。

详情请看程序代码

代码共享地址:

https://gitee.com/Liqs99/DuiLib_DuiEditor

https://github.com/xfcanyue/DuiLib_DuiEditor

duilib设计器交流群:819272442

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Duilib 是一个基于 C++ 的 UI 框架,支持多线程创建。在 Duilib 中,使用多线程创建 UI 界面可以提高程序的响应速度,增强用户体验。下面是一个简单的多线程创建 UI 界面的示例代码: ```c++ #include "stdafx.h" #include <Windows.h> #include "DuiLib/UIlib.h" using namespace DuiLib; class CMainFrame : public WindowImplBase { public: CMainFrame() {} virtual ~CMainFrame() {} virtual CDuiString GetSkinFolder() { return _T("skin"); } virtual CDuiString GetSkinFile() { return _T("MainWnd.xml"); } virtual LPCTSTR GetWindowClassName(void) const { return _T("DUIMainFrame"); } virtual LRESULT HandleCustomMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (uMsg == WM_CREATE) { // 创建子线程 HANDLE hThread = CreateThread(NULL, 0, ThreadProc, this, 0, NULL); CloseHandle(hThread); } return 0; } static DWORD WINAPI ThreadProc(LPVOID lpParameter) { CMainFrame* pThis = (CMainFrame*)lpParameter; // 在子线程中创建 UI 界面 pThis->Create(NULL, _T("Duilib 多线程创建示例"), WS_OVERLAPPEDWINDOW, WS_EX_WINDOWEDGE); pThis->ShowWindow(true); pThis->CenterWindow(); return 0; } }; int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CPaintManagerUI::SetInstance(hInstance); CMainFrame mainFrame; mainFrame.Create(NULL, _T("Duilib 多线程创建示例"), UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE); mainFrame.CenterWindow(); mainFrame.ShowWindow(true); CPaintManagerUI::MessageLoop(); return 0; } ``` 在上述代码中,我们在主线程中创建了一个 `CMainFrame` 对象,并调用了 `Create` 方法创建了主窗口。在主窗口的 `HandleCustomMessage` 方法中,我们调用了 `CreateThread` 函数创建了一个子线程,并在子线程中调用了 `Create` 方法创建了一个 UI 界面。这样,我们就实现了在多线程中创建 UI 界面的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值