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,因为官方没有发布什么文档,所以也只好看看源码、代码里的用法和程序中的帮助来了解一二啦,运行程序打出来的帮助内容如下:
定义一个grd文件,在这个文件中定义输出的文件(例如.h文件和不同语言的.rc文件),指定若干翻译文件(xtb文件),同时定义一堆字符串,每一个字符串有一个name和content,当然还有其他一些属性。这个name必须是唯一可标识一个字符串,而content则表示实际在程序中显示的内容。
为各种语言分别定义一个xtb文件,这个xtb文件中可以全部或者有选择性地针对grd文件中定义的字符串进行本地语言的翻译。为了对这些字符串进行精确的匹配,grid使用name或者根据content生成的一个字符串来关联文件中的字符串。Grd典型的格式如下:
其中<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秒”的字符串,如果定义三个显然不美观也没必要,但是定义一个就需要在中间插入特殊的标记,以便用户能够分割,下面的范例解释如何设置
上面的代码将翻译出中英文
“FindBEGIN_LINKrecords!”
“找到BEGIN_LINK条记录”
除了<ph>tag意外,还有<ex>tag。不过看源码里面是空的,估计这个tag目前也没啥用
翻译段
输出段
翻译节
说到国际化,首先得明白这个概念,其实说白了就是支持多种语言。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>
相关文章推荐
- eclipse 通过反编译插件查看源码
- vi/vim编辑器基本命令
- Android Android环境安装
- #pragma
- 转OSGchina中,array老大的名词解释
- 【第九章】 Spring的事务 之 9.1 数据库事务概述 ——跟我学spring3
- Java线程:线程的同步-同步方法
- FULL GC有可能导致JVM暂停
- iOS学习006
- Maven介绍,包括作用、核心概念、用法、常用命令、扩展及配置
- Oracle Database 11g 数据库普通用户登录时提示 ORA-28002: the password will expire within 5 days
- 你应该知道的 9 个 Docker 技术知识
- 【第八章】 对ORM的支持 之 8.4 集成JPA ——跟我学spring3
- C实现 LeetCode->RemoveNthNodeFromEndofList
- 【第八章】 对ORM的支持 之 8.3 集成iBATIS ——跟我学spring3
- 关于Umeng分享 报错原因
- 使EditText不获取焦点(Android中系统输入法不主动弹出)
- OVS : 构建网桥和网桥相连的网络
- C++语法总结,语法查询
- ubuntu 安装,配置NFS