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'

添加自定义字符串

分析了字符串使用的原理后,添加自定义的字符串字段就很清楚了:

  1. 需要向 ui_strings.grd 中添加字符串的message字段
  2. xtb中添加翻译translate字段,其中id使用tclib用message字段的值来计算
  3. 代码中使用message字段的name作为宏来使用就可以了

参考