Chromium 資源與多語言工具 grit

Tags : chromium grit grd pak

1. 關(guān)于資源

任何應(yīng)用都有一些自身持有的資源,如UI上的按鈕,特定的頁面,或者是針對不同系統(tǒng)語言設(shè)置的不同字符串。這些必然需要通過一個通用的方式集成到應(yīng)用當(dāng)中。
Chromium,包括android webview或者同名瀏覽器,它的資源大致包括兩個部分

  1. 圖片,CSS,JS,HTML,用于瀏覽器本身或者輔助瀏覽
  2. 多國語言本地化字符串

這些資源統(tǒng)一以*.pak形式的文件存放于apk中(assets文件夾中)。其中
Android SystemWebView中為webviewchromium.pak
ChromiumPublicApk則為chrome_100_percent.pak與resources.pak

為了生成pak文件,我們除了需要需要打包的源文件外,還需要grd配置文件以及grit工具進(jìn)行打包。

GRIT 全名為 the Google Resource and Internationalization Tool。該工具可以于chromium項(xiàng)目代碼的src/tools/grit/該路徑下找到。

使用方法如下:

Usage: grit [GLOBALOPTIONS] TOOL [args to tool]
Global options:
  -i INPUT  Specifies the INPUT file to use (a .grd file).  If this is not
            specified, GRIT will look for the environment variable GRIT_INPUT.
            If it is not present either, GRIT will try to find an input file
            named 'resource.grd' in the current working directory.
  -h MODULE Causes GRIT to use MODULE.UnsignedFingerPrint instead of
            grit.extern.FP.UnsignedFingerprint.  MODULE must be
            available somewhere in the PYTHONPATH search path.
  -v        Print more verbose runtime information.
  -x        Print extremely verbose runtime information.  Implies -v
  -p FNAME  Specifies that GRIT should profile its execution and output the
            results to the file FNAME
          
Tools:
  TOOL can be one of the following:
    build        A tool that builds RC files for compilation.
    buildinfo    Determine what files will be needed and
output by GRIT with a given input.
    count        Count the number of times a given message ID is used.
    newgrd       Create a new empty .grd file.
    rc2grd       A tool for converting .rc source files to .grd files.
    resize       Generate a file where you can resize a given dialog.
    sdiff        View differences without regard for translateable portions.
    transl2tc    Import existing translations in RC format into the TC
    unit         Use this tool to run all the unit tests for GRIT.
    xmb          Exports all translateable messages into an XMB file.
    android2grd  Converts Android string.xml files into Chrome grd files.
  For more information on how to use a particular tool, and the specific
  arguments you can send to that tool, execute 'grit help TOOL'

而grd文件則是一個標(biāo)準(zhǔn)xml文檔,結(jié)構(gòu)會在下面的內(nèi)容里詳述。

2. 打包多國語言本地化字符串資源

多國語言本地化字符串,首先我們需要準(zhǔn)備grd文件作為配置文件。

如果你是需要新建一個grd以及一個新的打包,推薦可以使用下列命令用grit生成一個空的grd文件模板來進(jìn)行設(shè)計。
$ python ./src/tools/grit/grit.py newgrd

a.grd配置文件

這里我們以android_ui_strings.grd為例

grd的基本結(jié)構(gòu)如下
最外層node為

<grit current_release="1" latest_public_release="0">
...
</grit>

多國語言需要在grit的node中添加下列三類
<outputs>
<translations>
<release>

(1).outputs

outputs主要描述輸出的文件,一般都為.h頭文件用以描述具體id號,以及具體的資源打包文件pak文件。

<outputs>
    <output filename="grit/aw_strings.h" type="rc_header">
      <emit emit_type='prepend'></emit>
    </output>
    <output filename="aw_strings_am.pak" type="data_package" lang="am" />
    <output filename="aw_strings_ar.pak" type="data_package" lang="ar" />
...
</outputs>

無非就是兩類,rc_header和data_package,其中data_package需要描述具體語言

(2).translations

translations主要定義了具體語言的翻譯模板

  <translations>
    <file path="translations/aw_strings_am.xtb" lang="am" />
    <file path="translations/aw_strings_ar.xtb" lang="ar" />
...
  </translations>

這里指定了grit生成具體pak的輸入文件有那些xtb文件。
這些xtb的格式都是固定的,會在下一個小節(jié)進(jìn)行詳細(xì)說明。

(3).release

release是描述提供的具體字符串

  <release seq="1">
    <messages fallback_to_english="true">
      <message name="IDS_AW_WEBPAGE_NOT_AVAILABLE" desc="The title of the webpage shown when the requested URL in unavailable">
        Webpage not available
      </message>
...
    </messages>
  </release>

如上述格式,其中message為具體字符串內(nèi)容,包含有name和desc兩個屬性
name為該字符串資源的id,該id也會在之前生成的頭文件中體現(xiàn),一般都以IDS開頭然后全大寫(因?yàn)橹笫且趆頭文件中進(jìn)行define作為宏名的)
desc則是描述下該資源是干什么用的

b. xtb文件

xtb(translationbundle)文件是提供每個語言翻譯字段的具體輸入源

這些文件需要和grd作為輸入給grit來生成具體資源文件。

每個xtb文件結(jié)構(gòu)都是一致的如下所示:

<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="zh-CN">
<translation id="1555130319947370107">藍(lán)色</translation>
<translation id="161042844686301425">青色</translation>
...shuxie
</translationbundle>

這里有一個問題,每一個翻譯具體的id不是之前在grd的name,而是具體的hash值
我們該如何獲得這個hash值呢?

現(xiàn)在知道的方法是使用grit的xmb工具來生成具體hash,然后再套用到這個xtb模板。
執(zhí)行以下命令:
$ python ./tools/grit/grit.py -i YOUR_GRD_FILE xmb OUTPUT_XMB_FILE_PATH

其中GRD_FILE為需要翻譯的grd文件路徑
OUTPUT_XMB_FILE_PATH指定輸出的XMB放的位置

xmb文件本身不參與到最后的打包過程,所以隨便放個臨時位置都行
其中找到messagebundle node中具體的每個msg

<messagebundle>
<msg desc="Accessibility label for button to select the blue color." id="1555130319947370107">
  Blue
</msg>shuxie
<msg desc="Accessibility label for button to select the cyan color." id="161042844686301425">
  Cyan
</msg>
...

我們就可以看到具體的id值了,然后按照上述xtb的模板按部就班填寫id以及各個語言翻譯字段即可

PS: 個人感覺應(yīng)該不會需要生成XMB然后再手工填寫XTB的具體transaction的message id值。
可能會存在直接輸出XTB文件的工具,但是grit似乎沒有提供。

c.生成翻譯文件

準(zhǔn)備好了xtb文件和grd配置文件后,就可以執(zhí)行g(shù)rit進(jìn)行構(gòu)建具體的翻譯文件了

$ python ./src/tools/grit/grit.py -i ./src/ui/android/java/strings/android_ui_strings.grd build -o ~/output/

輸出到output文件夾下我們就可以看到
├── values
│ └── android_ui_strings.xml
├── values-am
│ └── android_ui_strings.xml
├── values-ar
│ └── android_ui_strings.xml
....

當(dāng)然我們在chromium中使用的是pak打包好的資源文件。

分析android_ui_string.grd在BUILD.gn中的build我們可以發(fā)現(xiàn),多國語言本地化字符串使用了一個名為"java_strings_grd"的gn template。這一步就只是完成了grit生成xml的過程。
然后通過android_resources的gn template去完成打包的工作。

具體書寫可以詳細(xì)參考android_ui_string的流程。這里不再一一贅述。

3. 打包非語言資源

除了本地化字符串外,grit還提供打包其他諸如圖片,css,js,html等資源的功能。

我們以system_webview_apk中實(shí)際打包的load_error.html為例說明
首先我們也需要準(zhǔn)備一個grd配置文件
與上述本地化字符串的grd文件有區(qū)別的地方在于

  1. 沒有translations element,因?yàn)椴恍枰付ǚg語言內(nèi)容
  2. release中不是message,而是一個個includes或者是structures

關(guān)于上述2中,資源文件是BMP,GIF,具體HTML這種資源時使用includes
而結(jié)構(gòu)資源類似HTML模板,菜單,對話框等,則是使用structures

這里我們就是用includes,以下列方式進(jìn)行書寫

    <includes>
      <include name="IDR_AW_LOAD_ERROR_HTML" file="resources\load_error.html" flattenhtml="true" type="BINDATA" />
    </includes>

其中type只要進(jìn)入rc文件分類的,rc文件是windows MFC的資源文件
name:和之前一樣設(shè)置該資源名字,當(dāng)然不能重名,以及以IDS開頭并且一般全大寫
file:這個資源文件路徑,相對于這個grd文件

注意include這個node沒有body

都準(zhǔn)備妥當(dāng)后,使用grit的gn template進(jìn)行打包,一步完成

grit("generate_aw_resources") {
  source = "ui/aw_resources.grd"
  outputs = [
    "grit/aw_resources.h",
    "aw_resources.pak",
  ]
}

其他:

  1. chromium grit 用戶文檔
  2. chromium grit 設(shè)計概覽
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容