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