chromium中管理自带的字符串和文件等一般使用pak包格式文件,本文介绍下向chromium的pak文件中添加自己定义的字符串的方法。
分析pak包字符串使用
例如,在chromium中使用pak包ui_strings中的定义的字符串的方式:
#include "ui/base/l10n/l10n_util.h"
#include "ui/strings/grit/ui_strings.h"
base::string16 str = l10n_util::GetStringUTF16(IDS_APP_CANCEL)
在中文翻译下,str值代表“取消”
分析下几个关键点:
1、IDS_APP_CANCEL 是定义在ui_strings.h
中的宏,而这个文件是自动生成的,另外,宏的值是基于定义在resource_ids中的字段来累加的。
// ui_strings.h
#define IDS_APP_CANCEL 11081
// resource_ids
"ui/strings/ui_strings.grd": {
"messages": [11000],
},
2、IDS_APP_CANCEL 本身定义在ui_strings.grd文件中,描述了这个字段的意义,下面的字段message的值为“Cancel”
<message name="IDS_APP_CANCEL" desc="Used for Cancel on buttons">
Cancel
</message>
3、还有一个关键是,字符串在各个语言文件的具体翻译定义,比如ui_strings.h中的宏对应的中文在ui_strings_zh-CN.xtb中,这个文件中是一系列翻译字段的集合,例如:
<translation id="7658239707568436148">取消</translation>
但是,grd文件中的message字段IDS_APP_CANCEL怎么与xtb文件中id为7658239707568436148的translation字段对应起来呢?
chromium提供了python工具src/tools/grit/grit/extern/tclib.py
来做这个事情:
$ cd src/tools/grit
$ python
>>> from grit.extern import tclib
>>> tclib.GenerateMessageId("Cancel")
'7658239707568436148'
添加自定义字符串
分析了字符串使用的原理后,添加自定义的字符串字段就很清楚了:
- 需要向 ui_strings.grd 中添加字符串的message字段
- xtb中添加翻译translate字段,其中id使用tclib用message字段的值来计算
- 代码中使用message字段的name作为宏来使用就可以了