SOUI官方论坛

 找回密码
 立即注册
查看: 5129|回复: 10

SOUI3的多语言动态切换Demo

  [复制链接]
  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    588

    帖子

    5481

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5481

    突出贡献优秀版主

    发表于 2019-12-9 22:40:08 | 显示全部楼层 |阅读模式
    SOUI常规的套路是在uidef/init.xml里指定一个默认字体。然后整个APP的所有界面都可以引用这个字体。系统字体一旦确定,就不可更改。
    最近一直在开发启程输入法3.0,此前启程输入法3.0的所有界面都是通过皮肤来配置的,最近有用户提需求,希望可以由用户自己指定界面的字体。由于启程输入法3是基于SOUI3开发的,原来的SOUI框架不方便修改系统字体。
    刚好SOUI群里也有人提到SOUI做多语言时不方便更换系统字体(由于不同的语言需要不同的字体支持)。结合这两个需求,经过重新设计,终于在SOUI3上支持了更换系统字体功能。
    先看看demo效果:
    multilang.gif
    这个Demo是刚从2.x的demo移植到3.0的。从界面里可以看到,切换语言的时候,字体也同步切换了。
    demo的GIT仓库:https://github.com/soui3-demo/MultiLangs
    打开SOUI的代码,发现原来2.x也尝试去解决多语言的字体切换问题,不过解决方案很不友好:需要在XML里使用字体的地方,为字体指定一个名字,然后在语言翻译文件里为每一个命名字体定义替换字体。
    这种方式用起来复杂,基本没有实用价值,设计出这个方案,主要原因还是因为自己没有需求。
    新版本的方案简单多了,只需要在语言包里指定一下需要的系统字体即可。
    例如:
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <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">
    3.   <context>
    4.     <!--没有上下文的翻译及字符串表的翻译-->
    5.     <message>
    6.       <source>soui demo</source>
    7.       <translation>soui demo</translation>
    8.     </message>
    9. ...
    10.   </context>
    11. </language>
    复制代码
    类似上面XML,在language节点里指定一个font属性,在切换语言后,获取这个font属性,并设置为默认字体即可:

    1. void CMainDlg::OnLanguage(int nID)
    2. {
    3.         ITranslatorMgr *pTransMgr =  SApplication::getSingletonPtr()->GetTranslator();
    4.         m_LangID = nID;
    5.         bool bCnLang = nID == R.id.lang_cn;

    6.         pugi::xml_document xmlLang;
    7.         if (SApplication::getSingletonPtr()->LoadXmlDocment(xmlLang, bCnLang?_T("lang:cn"):_T("lang:en")))
    8.         {
    9.                 CAutoRefPtr<ITranslator> lang;
    10.                 pTransMgr->CreateTranslator(&lang);
    11.                 lang->Load(&xmlLang.child(L"language"), 1);//1=LD_XML
    12.                 wchar_t szName[64];
    13.                 lang->GetName(szName);
    14.                 pTransMgr->SetLanguage(szName);
    15.                 pTransMgr->InstallTranslator(lang);

    16.                 SDispatchMessage(UM_SETLANGUAGE);
    17.                 SStringW strFontInfo = lang->getFontInfo();
    18.                 if(!strFontInfo.IsEmpty())
    19.                 {
    20.                         SFontPool::getSingletonPtr()->SetDefFontInfo(strFontInfo);
    21. }
    22.         }
    23. }
    复制代码
    关键代码就是1行:
    SFontPool::getSingletonPtr()->SetDefFontInfo(strFontInfo);
    这一行代码会清空fontpool中所有缓存的字体,然后通知所有shostwnd的所有SWindow来重新创建字体,并请求重新布局,从而完成默认字体的替换。

  • TA的每日心情
    慵懒
    2023-6-13 17:14
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    16

    主题

    50

    帖子

    2857

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2857

    热心会员突出贡献

    发表于 2019-12-9 22:46:36 | 显示全部楼层
    之前有这个需求,后来做成两份了,一份中文,一份英文。SOUI3.x又健壮了
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28787
    发表于 2019-12-9 22:51:18 | 显示全部楼层
    谢谢楼主分享,功能越做越丰富了
  • TA的每日心情
    慵懒
    2024-1-24 14:08
  • 签到天数: 313 天

    [LV.8]以坛为家I

    13

    主题

    114

    帖子

    6011

    积分

    08:00大乘期

    Rank: 8Rank: 8

    积分
    6011
    发表于 2019-12-10 10:11:25 | 显示全部楼层
    GOOD
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    35

    帖子

    43

    积分

    22:00筑基期

    Rank: 1

    积分
    43
    发表于 2020-4-16 18:37:50 | 显示全部楼层
    谢谢分享,看看
  • TA的每日心情
    开心
    2020-8-9 16:37
  • 签到天数: 36 天

    [LV.5]常住居民I

    0

    主题

    12

    帖子

    265

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    265
    发表于 2020-5-19 20:09:44 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-27 09:17
  • 签到天数: 37 天

    [LV.5]常住居民I

    1

    主题

    12

    帖子

    605

    积分

    04:00化神期

    Rank: 4

    积分
    605
    发表于 2021-3-9 11:25:13 | 显示全部楼层
    请问下中英文(从左往右)跟阿拉伯语(从右往左)互切可以支持吗,要怎么设置相关属性
  • TA的每日心情
    奋斗
    2022-7-4 09:45
  • 签到天数: 28 天

    [LV.4]偶尔看看III

    59

    主题

    588

    帖子

    5481

    积分

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    5481

    突出贡献优秀版主

     楼主| 发表于 2021-3-12 10:21:56 | 显示全部楼层
    Dingxz 发表于 2021-3-9 11:25
    请问下中英文(从左往右)跟阿拉伯语(从右往左)互切可以支持吗,要怎么设置相关属性 ...

    不支持。
  • TA的每日心情
    奋斗
    2021-4-27 09:17
  • 签到天数: 37 天

    [LV.5]常住居民I

    1

    主题

    12

    帖子

    605

    积分

    04:00化神期

    Rank: 4

    积分
    605
    发表于 2021-3-12 15:02:37 | 显示全部楼层

    好的谢谢,感谢回复。总算有个定论了,我曾到处找答案
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28787
    发表于 2023-4-24 23:33:01 | 显示全部楼层
    多语言时,字符串长度这个如何设计比较好,中文相对简洁,若出现英文较长时,内容可能显示不全,这个问题比较好的方法是什么?强制英文缩写,然后在tip中解释?也就是相对第一语言,其它语言都是相对凑合?
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-3 12:11

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表