您的位置:首页 > 其它

chromium之国际化

2015-06-16 11:10 591 查看
转载地址:http://blog.sina.com.cn/s/blog_54e1b5250100rr61.html

说到国际化,首先得明白这个概念,其实说白了就是支持多种语言。chromium在Windows平台怎么做的呢?简单的将就是将每一种语言打包成一个dll,在程序启动的时候根据操作系统的语言配置、本地程序配置和程序参数指定等因素决定一个语言类型,然后加载这个对应的dll。这些dll有一个统一的接口,那就是每一个字符串有一个唯一的标识(int类型),应用可以根据这个标识来索引对应的字符串。

在windows上打包字符串一般都会想到使用资源里面的stringtable,而chromium如果想做到跨平台就显然不能直接这么用,而且直接用修改和管理都是相当麻烦的事情。于是chromium开发者弄了个python工具叫作grit(网上找不到任何文档,真是杯具),chromium就是自己定义一套字符串存储规范(grd、xtb文件,都是用xml表示),然后通过grit将其转化为特定平台的字符串存储。在windows下显然就是生成一堆rc(resource)文件。

为了将chromium中的国际化部分剥离,可以参考下列步骤:

新建工程,将其类型设置为Util

添加需要的grd文件,同时需要拷贝匹配的xtb文件到工程目录下

拷贝三个第三方工具(grit、python、cygwin)

注意:删除svn相关的文件可以大幅度减小空间占用,这三个工具加起来一百多M

修改rulus配置文件(grit\build目录下)

注意:只需要修改相关路径即可,因此可以直接修改文件,而不用去vs2008中去修改,修改bat文件类同。

修改bat文件,修改的同样也是路径

编译工程产生”.h”文件和rc文件

添加”.h”文件到工程

新建win32dll工程,添加对应的resource文件。然后将“NoEntryPoint”属性设置为true

注意:为了能够在不同的configuration条件(Debug/Release)下使用不同的”.h”文件,可以手动修改工程文件,将路径改成这种相对路径即可。不过貌似要重载工程才行。例如RelativePath=”$(OutDir)\grit_derived_sources\generated_resources_en-US.rc”

关于grit,因为官方没有发布什么文档,所以也只好看看源码、代码里的用法和程序中的帮助来了解一二啦,运行程序打出来的帮助内容如下:
GRIT–theGoogleResourceandInternationalizationTool

Copyright(c)GoogleInc.2010

Usage:grit[GLOBALOPTIONS]TOOL[argstotool]

Globaloptions:

-iINPUTSpecifiestheINPUTfiletouse(a.grdfile).Ifthisisnot

specified,GRITwilllookfortheenvironmentvariableGRIT_INPUT.

Ifitisnotpresenteither,GRITwilltrytofindaninputfile

named‘resource.grd’inthecurrentworkingdirectory.

-vPrintmoreverboseruntimeinformation.

-xPrintextremelyverboseruntimeinformation.Implies-v

-pFNAMESpecifiesthatGRITshouldprofileitsexecutionandoutputthe

resultstothefileFNAME.

Tools:

TOOLcanbeoneofthefollowing:

buildAtoolthatbuildsRCfilesforcompilation.

newgrdCreateanewempty.grdfile.

rc2grdAtoolforconverting.rcsourcefilesto.grdfiles.

transl2tcImportexistingtranslationsinRCformatintotheTC

sdiffViewdifferenceswithoutregardfortranslateableportions.

resizeGenerateafilewhereyoucanresizeagivendialog.

unitUsethistooltorunalltheunittestsforGRIT.

countExportsalltranslateablemessagesintoanXMBfile.

Formoreinformationonhowtouseaparticulartool,andthespecific

argumentsyoucansendtothattool,execute‘grithelpTOOL’


Grit工作原理:

定义一个grd文件,在这个文件中定义输出的文件(例如.h文件和不同语言的.rc文件),指定若干翻译文件(xtb文件),同时定义一堆字符串,每一个字符串有一个name和content,当然还有其他一些属性。这个name必须是唯一可标识一个字符串,而content则表示实际在程序中显示的内容。

为各种语言分别定义一个xtb文件,这个xtb文件中可以全部或者有选择性地针对grd文件中定义的字符串进行本地语言的翻译。为了对这些字符串进行精确的匹配,grid使用name或者根据content生成的一个字符串来关联文件中的字符串。Grd典型的格式如下:
<?xmlversion=”1.0″encoding=”UTF-8″?><gritbase_dir=”.”latest_public_release=”0″current_release=”1″source_lang_id=”en”enc_check=”m枚l”><outputs><!-TODOaddeachofyouroutputfiles.Modifythethreebelow,andaddyourownforyourvariouslanguages.Seetheuser’sguideformoredetails.Notethatalloutputreferencesarerelativetotheoutputdirectorywhichisspecifiedatbuildtime.-><outputfilename=”resource.h”/><outputfilename=”en_resource.rc”/><outputfilename=”fr_resource.rc”/></outputs><translations><!-TODOaddreferencestoeachoftheXTBfiles(fromtheTranslationConsole)thatcontaintranslationsofmessagesinyourproject.Eachtakesaformlike<filepath=”english.xtb”/>.Rememberthatallfilereferencesarerelativetothis.grdfile.-></translations><releaseseq=”1″><includes><!-TODOaddalistofyourincludedresourceshere,e.g.BMPandGIFresources.-></includes><structures><!-TODOaddalistofallyourstructuredresourceshere,e.g.HTMLtemplates,menus,dialogsetc.Notethatformenus,dialogsandversioninformationresourcesyoureferencean.rcfilecontainingthem.-></structures><messages><!-TODOaddallofyour“stringtable”messageshere.Remembertochangenontranslateablepartsofthemessagesintoplaceholders(usingthe<ph>element).Youcanalsousethe‘gritadd’tooltohelpyouidentifynontranslateablepartsandcreateplaceholdersforthem.-></messages></release></grit>


其中<outputs>段进行输出定义<translations>段进行翻译定义,而<release>段则进行输入定义,其中<release>段中的<messages>段定义字符串,而其中的<includes>段是定义二进制文件,所以这里可以支持主题(theme),里面全部包含图片即可。


部分段的意义


messages:该段定义若干message段和一些通用的属性


fallback_to_english:是否使用英语如果待翻译语言不存在(true/false),默认false。如果该flag为false并且对方语言有不存在对应的翻译项,编译将报错。


message:定义一个字符串


name:唯一标识一个字符串的int变量名(string)

desc:该变量的介绍(string)

translateable:是否翻译(true/false),默认true

use_name_for_id:是否使用name作为翻译的标识符,如果yes,则翻译文件(xtb)使用name来和grd文件中的记录来映射,否则xtb需要使用一个字符串,默认是false。那这个标志主要考虑到不同的需求,如果该标志为true,不管内容如何改,xtb里面的名字不用变(实际上如果是翻译的话,内容不变估计也不行)。而如果该标志为false,则不管name怎么便,只要内容不变,xtb就可以不变。


内部格式处理

这里主要考虑到某些分段字符串,例如要定义“x时y分z秒”的字符串,如果定义三个显然不美观也没必要,但是定义一个就需要在中间插入特殊的标记,以便用户能够分割,下面的范例解释如何设置
<messagename=”IDS_YAYA_ADD_BUDDY_RESULT”use_name_for_id=”true”>Find<phname=”BEGIN_LINK_CHROMIUM1″>BEGIN_LINK</ph>records!</message><translationid=”IDS_YAYA_ADD_BUDDY_RESULT”>找到<phname=”BEGIN_LINK_CHROMIUM1″/>条记录</translation>


上面的代码将翻译出中英文

“FindBEGIN_LINKrecords!”

“找到BEGIN_LINK条记录”

除了<ph>tag意外,还有<ex>tag。不过看源码里面是空的,估计这个tag目前也没啥用


其他段

翻译段
<translations><filepath=”generated_resources_zh-CN.xtb”lang=”zh-CN”/></translations>



输出段
<outputs><outputfilename=”grit/generated_resources.h”><emitemit_type=’prepend’></emit></output><outputfilename=”generated_resources_en-US.rc”lang=”en”/><outputfilename=”generated_resources_zh-CN.rc”lang=”zh-CN”/></outputs>



翻译节
<translationid=”IDS_YAYA_LOGIN_WINDOW”>登陆</translation>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: