转载地址:http://blog.sina.com.cn/s/blog_54e1b5250100rr61.html
说到国际化,首先得明白这个概念,其实说白了就是支持多种语言。chromium在Windows平台怎么做的呢?简单的将就是将每一种语言打包成一个dll,在程序启动的时候根据操作系统的语言配置、本地程序配置和程序参数指定等因素决定一个语言类型,然后加载这个对应的dll。这些dll有一个统一的接口,那就是每一个字符串有一个唯一的标识(int类型),应用可以根据这个标识来索引对应的字符串。
在windows上打包字符串一般都会想到使用资源里面的string table,而chromium如果想做到跨平台就显然不能直接这么用,而且直接用修改和管理都是相当麻烦的事情。于是chromium开发者弄了个python工具叫作grit(网上找不到任何文档,真是杯具), chromium就是自己定义一套字符串存储规范(grd、xtb文件,都是用xml表示),然后通过grit将其转化为特定平台的字符串存储。在windows下显然就是生成一堆rc(resource)文件。
为了将chromium中的国际化部分剥离,可以参考下列步骤:
关于grit,因为官方没有发布什么文档,所以也只好看看源码、代码里的用法和程序中的帮助来了解一二啦,运行程序打出来的帮助内容如下:
GRIT – the Google Resource and Internationalization Tool |
定义一个grd文件,在这个文件中定义输出的文件(例如.h文件和不同语言的.rc文件),指定若干翻译文件(xtb文件),同时定义一堆字符串,每一个字符串有一个name和content,当然还有其他一些属性。这个name必须是唯一可标识一个字符串,而content则表示实际在程序中显示的内容。
为各种语言分别定义一个xtb文件,这个xtb文件中可以全部或者有选择性地针对grd文件中定义的字符串进行本地语言的翻译。为了对这些字符串进行精确的匹配,grid使用name或者根据content生成的一个字符串来关联文件中的字符串。Grd典型的格式如下:
xml version=”1.0″ encoding=”UTF-8″?> <grit base_dir=”.” latest_public_release=”0″current_release=”1″ source_lang_id=”en” enc_check=”m枚l”> <outputs> <!- TODO add each of your output files. Modify the three below, and add your own for your various languages. See the user’s guide for more details. Note that all output references are relative to the output directory which is specified at build time. -> <outputfilename=”resource.h” /> <output filename=”en_resource.rc” /> <outputfilename=”fr_resource.rc” /> outputs> <translations> <!- TODO add references to each of the XTB files (from the Translation Console) that contain translations of messages in your project. Each takes a form like <file path=”english.xtb” />. Remember that all file references are relative to this .grd file. -> translations> <release seq=”1″><includes> <!- TODO add a list of your included resources here, e.g. BMP and GIF resources. -> includes> <structures> <!- TODO add a list of all your structured resources here, e.g. HTML templates, menus, dialogs etc. Note that for menus, dialogs and version information resources you reference an .rc file containing them.->structures> <messages> <!- TODO add all of your “string table” messages here. Remember to change nontranslateable parts of the messages into placeholders (using the<ph> element). You can also use the ‘grit add’ tool to help you identify nontranslateable parts and create placeholders for them. -> messages> release>grit>
其中
这里主要考虑到某些分段字符串,例如要定义“x时y分z秒”的字符串,如果定义三个显然不美观也没必要,但是定义一个就需要在中间插入特殊的标记,以便用户能够分割,下面的范例解释如何设置
<message name=”IDS_YAYA_ADD_BUDDY_RESULT” use_name_for_id=”true”> Find <phname=”BEGIN_LINK_CHROMIUM1″>BEGIN_LINKph> records! message> <translationid=”IDS_YAYA_ADD_BUDDY_RESULT”> 找到<ph name=”BEGIN_LINK_CHROMIUM1″/> 条记录translation>
上面的代码将翻译出中英文
“Find BEGIN_LINK records!”
“找到BEGIN_LINK 条记录”
除了
翻译段
<translations> <file path=”generated_resources_zh-CN.xtb” lang=”zh-CN” />translations>
输出段
<outputs> <output filename=”grit/generated_resources.h”> <emit emit_type=’prepend’>emit> output> <output filename=”generated_resources_en-US.rc” lang=”en” /> <outputfilename=”generated_resources_zh-CN.rc” lang=”zh-CN” /> outputs>
翻译节
<translation id=”IDS_YAYA_LOGIN_WINDOW”> 登陆 translation>