本地化
使用 GNU gettext 本地化您的應用程式需要一些努力,但相當簡單。我們會在您的專案根目錄建立一個 po
子目錄,以存放所有本地化資訊。
產生 .pot 和 .po 檔案
在您的主要 meson.build 檔案中,將 po
子目錄包含在建置過程中。
subdir('po')
在這個 po
子目錄中,我們需要
-
LINGUAS
: 以空格分隔的語言列表 -
POTFILES
: 要掃描以尋找可翻譯字串的原始碼檔案列表。 -
meson.build
: 本地化特定的 Meson 檔案
LINGUAS
包含以空格分隔的語言列表的檔案。一個 LINGUAS 範例可能如下所示。
aa ab ae af
POTFILES
列出 gettext 應掃描以尋找要翻譯字串的所有原始碼檔案的檔案。檔案的語法是每個原始碼檔案一行,且該行必須包含相對於原始碼根目錄的路徑。一個 POTFILES 範例可能如下所示。
src/file1.c
src/file2.c
src/subdir/file3.c
include/mything/somefile.h
meson.build
本地化特定的 Meson 檔案。它會匯入並使用 i18n
模組。如果之前未定義,則需要定義 GETTEXT_PACKAGE
全域變數。
i18n = import('i18n')
# define GETTEXT_PACKAGE
add_project_arguments('-DGETTEXT_PACKAGE="intltest"', language:'c')
i18n.gettext(meson.project_name())
第一個指令匯入提供 gettext 功能的 i18n
模組。第四行執行實際的呼叫。第一個引數是 gettext 套件名稱。這會導致兩件事發生。第一件事是,Meson 會產生二進制 mo 檔案,並在安裝時將它們放到適當的位置。第二件事是,它會建立一個建置規則來重新產生主要的 pot 檔案。如果您正在使用 Ninja 後端,這就是您會如何調用重建的方式。
產生 .pot 檔案
然後我們需要產生主要的 pot 檔案。pot 檔案可以使用任何名稱,但通常是 gettext 套件的名稱。假設專案名為 intltest。在這種情況下,對應的 pot 檔案會稱為 intltest.pot
。
從您的建置資料夾執行以下指令,以產生 pot 檔案。建議之後手動檢查並填入,例如,適當的版權和聯絡資訊。
$ meson compile intltest-pot
產生 .po 檔案
對於上面陣列中列出的每種語言,我們都需要一個對應的 .po
檔案。這些可以透過從您的建置資料夾執行以下指令來產生。
$ meson compile intltest-update-po
搜尋的結果為