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

为UI在不同地区显示不同的语言是产品国际化的一个重要要求。

在SOUI中实现了一套类似QT的多语言翻译机制:布局XML不需要调整,程序代码也不需要调整,只需要为不同地区的用户提供不同的语言翻译文件即可。

在SOUI中,我们实现了一个使用明文XML的语言翻译模块:translator.dll

为了使用多语言翻译,首先需要准备一个语言翻译的XML文件。demo中使用的翻译文件如下:

<?xml version="1.0" encoding="utf-8"?>
<language name="ch" guid="{0DAEDE3C-6B94-4a81-9A55-C304FDD69D98}">
  <context>
    <!--没有上下文的翻译-->
  </context>
  <context name="editmenu">
    <message>
      <source>copy</source>
      <translation>复制</translation>
    </message>
    <message>
      <source>cut</source>
      <translation>剪切</translation>
    </message>
    <message>
      <source>paste</source>
      <translation>粘贴</translation>
    </message>
  </context>
  <context name="messagebox">
    <message>
      <source>ok</source>
      <translation>确定</translation>
    </message>
    <message>
      <source>cancel</source>
      <translation>取消</translation>
    </message>
    <message>
      <source>retry</source>
      <translation>重试</translation>
    </message>
  </context>
  <context name="dlg_main">
    <message>
      <source>close</source>
      <translation>关闭窗口</translation>
    </message>
  </context>
</language>

可以看到该XML中有一个language的根节点,该节点有两个属性:name和guid,这两个属性都是用来标识该翻译文件的。

在language节点下,有多个context节点,每个context节点有一个name属性(可以为空),对应一个翻译上下文。

每一个context下有不同数量的message结点,每个message又有两个子节点:source 和 translation。

source对应需要翻译的文字,而translation则对应翻译后的文字。

要使用这个语言翻译文件,首先需要从translator.dll中创建一个SOUI::ITranslatorMgr对象,并将该对象交给SOUI::SApplication管理。

再从ItranslatorMgr对象创建SOUI::ITranslator对象,并将Itranslator对象添加到ItranslatorMgr管理的翻译列表中。

最后还要为ITranslator对象加载翻译数据源(也就是前面提供的XML文件)。

下面是demo中使用和语言翻译相关的代码(见_tWinMain函数)

        SApplication *theApp=new SApplication(pRenderFactory,hInstance);//SOUI APP
        CAutoRefPtr<ITranslatorMgr> transMgr; //多语言翻译模块,由translator.dll提供
        transLoader.CreateInstance("translator.dll",(IObjRef**)&transMgr);//
        if(trans)
        {//加载语言翻译包
            theApp->SetTranslator(transMgr);
            pugi::xml_document xmlLang;
            if(theApp->LoadXmlDocment(xmlLang,_T("lang_cn"),_T("translator")))
            {
                CAutoRefPtr<ITranslator> langCN;
                transMgr->CreateTranslator(&langCN);
                langCN->Load(&xmlLang.child(L"language"),1);//1=LD_XML
                transMgr->InstallTranslator(langCN);
            }
        }

我们先看一下editmemu的XML:

<editmenu trCtx="editmenu" iconSkin="_skin.sys.icons" itemHeight="26" iconMargin="4" textMargin="8" >
  <item id="1" icon="3">cut</item>
  <item id="2" icon="4">copy</item>
  <item id="3" icon="5">paste</item>
  <item id="4" >delete</item>
  <sep/>
  <item id="5">select all</item>
</editmenu>

在这个XML中,根节点有一个属性trCtx,代表翻译上下文,对应语言翻译文件中的context中的name属性。

在这个menu定义中,所有的菜单项的文字全是英文。其中前面3项:cut, copy and paste在语言翻译文件中有对应的翻译项。

下图为程序运行时edit的右键菜单显示结果:

上面演示的是菜单资源的语言翻译,布局XML中的文字的翻译基本一样,只需要为布局的根结点定义一个翻译上下文(trCtx)(没有定义时则从没有指定name属性的context里查找翻译结果)。

可以参见demo的"close”按照的tooltip的翻译。

不管是菜单XML还是布局XML,它们都是静态的,经过设计需要使用代码往UI添加新的文字,同样也需要翻译,这个时候如何处理?

其实看一下静态资源翻译的代码就知道,要实现语言翻译,需要为每一句待翻译的文字调用一个函数:

SApplication::getSingleton().GetTranslator()->tr(const SStringW & strSrc,const SStringW & strCtx)

第一个参数是等翻译字符串,第二个参数是翻译上下文。

考虑到语句太长,系统提供了一个宏:

#define TR(p1,p2)       SApplication::getSingleton().GetTranslator()->tr(p1,p2)

这样用TR就可以实现文字翻译了。

时间: 2024-12-10 11:14:57

第九篇:在SOUI中使用多语言翻译的相关文章

Flask初识,第九篇,Flask中的蓝图

蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将 查看客户,修改客户,添加客户,删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做

第二十一篇:SOUI中的控件注册机制

Win32编程中,用户需要一个新控件时,需要向系统注册一个新的控件类型.注册以后,调用::CreateWindow时才能根据标识控件类型的字符串创建出一个新的控件窗口对象. 为了能够从XML描述的字符串中创建出需要的控件对象,和Win32类似,在SOUI中要创建一个新的控件也同样需要向SOUI系统注册新的控件类. 从demo.cpp的main中我们可以看到类似如下的控件注册控件的代码: //向SApplication系统中注册由外部扩展的控件及SkinObj类 SWkeLoader wkeLoa

第二十八篇:SOUI中自定义控件开发过程

在SOUI中已经提供了大部分常用的控件,但是内置控件不可能满足用户的所有要求,因此一个真实的应用少不得还要做一些自定义控件. 学习一个新东西,最简单的办法就是依葫芦画瓢.事实上在SOUI系统中内置控件和自定义控件的开发流程是完全一样的,因此只需要打开SOUI的源代码,随便找一个控件看一下就大体差不多了. 下面我以controls.extend目录下的的SRadioBox2控件为例对控件开发过程需要注意的地方做一点说明. 要开发一个控件,首先要确定的是应该从哪个控件来继承.选择一个合适的基类是正确

经济学原理,宏观,第九篇,长期中的真实经济

25,生产与增长 25.2,生产率 生产率大概由:物质资本(生产的原材料),人力资本(受过教育的人),自然资源 , 技术知识,只能说由这几个因素组成,但沒有明确的函数公式 25.3,经济增长和公共决策 资本的投入大概来说是有边际效益的. 追赶效应:由于边际效益的关系,穷国的增长率通常比发达国家快. 一个国家的经济增长通常有下面几点的关联:来自国外的投资,教育,健康与营养,产权和政治稳定,自由贸易,研究与开发,人口增长. 26,储蓄,投资和金融体系 26.1,美国经济中的金融机构 储蓄者希望把钱留

第二十五篇:在SOUI中做事件分发处理

不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分发的问题,这里主要介绍使用事件映射表时的事件分发. 在回答这个问题前,首先了解一下什么是事件分发. 在大型项目中,程序逻辑可能非常复杂,如果将所有UI中控件的事件处理集中在一个消息/事件映射表里,代码的可维护性会变得非常差.解决这个问题常见的方法就是将事件进行分类(如根据来源分类),不同类别的事件采

第二十三篇:在SOUI中使用LUA脚本开发界面

像写网页一样做客户端界面可能是很多客户端开发的理想. 做好一个可以实现和用户交互的动态网页应该包含两个部分:使用html做网页的布局,使用脚本如vbscript,javascript做用户交互的逻辑.当需求变化时,只需要在服务端把相关代码调整一下,用户即可看到新的内容(界面). 传统的客户端程序开发流程和网页开发可能完全不同. 首先是界面的布局,在老式的界面布局过程中,程序员先在界面上放好各种控件,然后需要自己通过相应的代码来维护界面在不同状态下控件的显示状态及位置.当界面中元素很多时,单纯布局

第五篇:在SOUI中使用XML布局窗口

窗口布局的概念 每一个UI都是由大量的界面元素构成的,在Windows编程,这些界面元素的最小单位通常称之为控件. 布局就是这些控件在主界面上的大小及相对位置. 传统的布局一般使用一个4个绝对坐标来定义一个控件在主窗口的位置.对于窗口是固定大小的界面来说,这种方式是最简单有效的. 然而问题在于在Windows系统上编程,基本上很少有程序的窗口是固定大小的,用户希望它的窗口能够随时调整大小.调整大小后界面里的控件还能够按照一定的规则进行重排. 我自己最讨厌的就是在WM_SIZE里重排控件位置. 随

Cocos2d-x3.0游戏实例之《别救我》第九篇——从tmx文件中加载关卡怪物

上一篇我们已经制作好tg1.tmx文件了,现在就要使用它了. 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址: http://www.benmutou.com/blog/archives/944 文章来源:笨木头与游戏开发 很抱歉,我们又要新建2个类了,我已经尽力少新建类了,毕竟是教程,类越多越容易混乱. 我们要新建一个Monster类,以及一个MonsterLayer类,专门添加Monster对象. Monster类 来看看Monster.h文件: #ifndef Monste

Flask最强攻略 - 跟DragonFire学Flask - 第九篇 Flask 中的蓝图(BluePrint)

蓝图,听起来就是一个很宏伟的东西 在Flask中的蓝图 blueprint 也是非常宏伟的 它的作用就是将 功能 与 主服务 分开怎么理解呢? 比如说,你有一个客户管理系统,最开始的时候,只有一个查看客户列表的功能,后来你又加入了一个添加客户的功能(add_user)模块, 然后又加入了一个删除客户的功能(del_user)模块,然后又加入了一个修改客户的功能(up_user)模块,在这个系统中,就可以将 查看客户,修改客户,添加客户,删除客户的四个功能做成蓝图加入到客户管理系统中,本篇最后会做