TA的每日心情 | 奋斗 2022-7-4 09:45 |
---|
签到天数: 28 天 [LV.4]偶尔看看III
版主
- 积分
- 5481
|
SOUI常规的套路是在uidef/init.xml里指定一个默认字体。然后整个APP的所有界面都可以引用这个字体。系统字体一旦确定,就不可更改。
最近一直在开发启程输入法3.0,此前启程输入法3.0的所有界面都是通过皮肤来配置的,最近有用户提需求,希望可以由用户自己指定界面的字体。由于启程输入法3是基于SOUI3开发的,原来的SOUI框架不方便修改系统字体。
刚好SOUI群里也有人提到SOUI做多语言时不方便更换系统字体(由于不同的语言需要不同的字体支持)。结合这两个需求,经过重新设计,终于在SOUI3上支持了更换系统字体功能。
先看看demo效果:
这个Demo是刚从2.x的demo移植到3.0的。从界面里可以看到,切换语言的时候,字体也同步切换了。
demo的GIT仓库:https://github.com/soui3-demo/MultiLangs
打开SOUI的代码,发现原来2.x也尝试去解决多语言的字体切换问题,不过解决方案很不友好:需要在XML里使用字体的地方,为字体指定一个名字,然后在语言翻译文件里为每一个命名字体定义替换字体。
这种方式用起来复杂,基本没有实用价值,设计出这个方案,主要原因还是因为自己没有需求。
新版本的方案简单多了,只需要在语言包里指定一下需要的系统字体即可。
例如:
- <?xml version="1.0" encoding="utf-8"?>
- <language name="en" guid="{0DAEDE3C-6B94-4a81-9A55-C304FDD69D99}" font="face:'Bradley Hand ITC',size:16,charset:0,weight:400,bold:0,italic:0,strike:0,underline:0">
- <context>
- <!--没有上下文的翻译及字符串表的翻译-->
- <message>
- <source>soui demo</source>
- <translation>soui demo</translation>
- </message>
- ...
- </context>
- </language>
复制代码 类似上面XML,在language节点里指定一个font属性,在切换语言后,获取这个font属性,并设置为默认字体即可:
- void CMainDlg::OnLanguage(int nID)
- {
- ITranslatorMgr *pTransMgr = SApplication::getSingletonPtr()->GetTranslator();
- m_LangID = nID;
- bool bCnLang = nID == R.id.lang_cn;
- pugi::xml_document xmlLang;
- if (SApplication::getSingletonPtr()->LoadXmlDocment(xmlLang, bCnLang?_T("lang:cn"):_T("lang:en")))
- {
- CAutoRefPtr<ITranslator> lang;
- pTransMgr->CreateTranslator(&lang);
- lang->Load(&xmlLang.child(L"language"), 1);//1=LD_XML
- wchar_t szName[64];
- lang->GetName(szName);
- pTransMgr->SetLanguage(szName);
- pTransMgr->InstallTranslator(lang);
- SDispatchMessage(UM_SETLANGUAGE);
- SStringW strFontInfo = lang->getFontInfo();
- if(!strFontInfo.IsEmpty())
- {
- SFontPool::getSingletonPtr()->SetDefFontInfo(strFontInfo);
- }
- }
- }
复制代码 关键代码就是1行:
SFontPool::getSingletonPtr()->SetDefFontInfo(strFontInfo);
这一行代码会清空fontpool中所有缓存的字体,然后通知所有shostwnd的所有SWindow来重新创建字体,并请求重新布局,从而完成默认字体的替换。
|
|