Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

使用 gettext 進行當地語系化

除了 CSV 格式的 匯入翻譯 外,Godot 還支援載入 GNU gettext 格式的翻譯檔(基於文字的 .po,Godot 3.5 起還支援編譯後的 .mo)。

備註

有關 gettext 的介紹,請查看 A Quick Gettext Tutorial。它是針對 C 專案編寫的,但是很多建議也適用於 Godot(除了 xgettext)。

優勢

  • gettext 是一種標準格式,可以使用任何文字編輯器或圖形化使用者介面編輯器(如 Poedit)進行編輯。

  • TransifexWeblate 等翻譯平臺也支援 gettext,讓人們可以更方便地進行當地語系化協作。

  • 與 CSV 相比,gettext 更適合 Git 這樣的版本控制系統,因為每個語言環境都有自己的消息檔。

  • 與 CSV 檔相比,在 gettext 檔中編輯多行字串更方便。

缺點

  • gettext 是一種比 CSV 更複雜的格式,對於剛接觸軟體當地語系化的人來說可能更難理解。

  • 維護當地語系化檔的人員必須在其系統上安裝 gettext 工具。但是,由於 Godot 支援使用基於文字的消息檔(.po),翻譯人員無需安裝 gettext 工具即可測試他們的工作。

安裝 gettext 工具

需要命令列 gettext 工具來執行維護操作,如更新消息檔。因此,強烈建議您安裝它們。

  • **Windows:**從`該頁面 <https://mlocati.github.io/articles/gettext-iconv-windows.html>`_下載安裝程式。任何體系結構和二進位型別(共用或靜態)都可以;如果不確定,請選擇 64 位元靜態安裝程式。

  • **macOS:**使用 Homebrewbrew install gettext 命令來安裝 gettext,或使用 MacPortssudo port install gettext 命令來安裝。

  • **Linux:**在大多數發行版本上,請使用發行版本的包管理器安裝 gettext 包。

放置樣板

執行編輯器

從Godot 4.0開始,編輯器可以根據指定的場景和腳本檔案自動產生PO模板。如果在腳本中使用,此 POT 產生還支援翻譯本文和複數,並帶有可選的第二個參數 tr() 和 tr_n() 方法。

打開專案設定的**當地語系化 > POT 生成**分頁,然後使用**新增...** 按鈕指定專案中包含可當地語系化字串的場景和腳本的路徑:

在專案設定的“當地語系化 > POT 生成”分頁中建立 PO 範本

在專案設定的**當地語系化 > POT 生成**分頁中建立 PO 範本

Godot目前不支援使用 xgettext 提取源字串, 因此必須手動建立 .pot 檔案. 該檔可以放在專案目錄中的任何位置, 但建議將其放在子目錄中, 因為每個語言環境都將在其自己的檔中定義.

然後,您可以繼續從 PO 範本 <doc_localization_using_gettext_messages_file> 建立訊息檔案。

備註

請記住在對可本地化字串進行任何更改或新增新場景或腳本後重新生成 PO 模板。否則,新新增的字串將無法在地化,且翻譯人員將無法更新過時字串的翻譯。

手動使用

Godot目前不支援使用 xgettext 提取源字串, 因此必須手動建立 .pot 檔案. 該檔可以放在專案目錄中的任何位置, 但建議將其放在子目錄中, 因為每個語言環境都將在其自己的檔中定義.

在工程目錄下建立名為 locale 的目錄. 在該目錄下, 保存一個名為 messages.pot 的檔, 內容如下:

# Don't remove the two lines below, they're required for gettext to work correctly.
msgid ""
msgstr ""

# Example of a regular string.
msgid "Hello world!"
msgstr ""

# Example of a string with pluralization.
msgid "There is %d apple."
msgid_plural "There are %d apples."
msgstr[0] ""
msgstr[1] ""

# Example of a string with a translation context.
msgctxt "Actions"
msgid "Close"
msgstr ""

gettext 中的消息由 msgidmsgstr 對組成。msgid 為源字串(一般為英文),msgstr 為翻譯後的字串。

警告

PO 範本檔(.pot)中的 msgstr 值應**始終**為空。當地語系化會在生成的 .po 檔中進行。

從 PO 範本建立消息檔

msginit 命令用於將 PO 範本轉換為消息檔。例如,要建立法語當地語系化檔,請在 locale 目錄中使用以下命令:

msginit --no-translator --input=messages.pot --locale=fr

上面的命令會在 PO 範本所在的目錄下建立一個名為 fr.po 的檔案。

或者,您可以使用 Poedit 以圖形方式完成此操作,或者通過將 POT 檔上傳到您選擇的 Web 平臺。

在 Godot 中載入消息檔

如果要將消息檔註冊為專案的翻譯,請打開項目設置,然後進入本地化選項卡。在翻譯中按下添加...,然後在文件對話框中選擇該 ''.po'' 或者 ''.mo'' 檔。區域設置將從消息檔的 ''“Language: <code>n”'' 屬性中推算出來。

備註

關於在 Godot 中匯入和測試翻譯的更多資訊,請參閱 將遊戲國際化

按照 PO 範本更新消息檔

更新 PO 範本後,您必須更新消息檔以使其包含新字串,同時刪除已經在 PO 範本中不復存在的字串。這可以使用 msgmerge 工具自動完成:

# The order matters: specify the message file *then* the PO template!
msgmerge --update --backup=none fr.po messages.pot

如果你想保留原始消息檔的備份,在本例中會保存為 fr.po~ ,請刪除 --backup=none 參數。

備註

運作 msgmerge 後,如果來源語言修改了某個字串,那麼在 .po 檔中就會在這個字串之前加入“fuzzy”注釋。這個注釋表示的是翻譯應當針對新字串進行更新,因為現有翻譯非常可能是不精確的。

Godot **不會**讀取帶有“fuzzy”注釋的字串,需要更新翻譯並移除“fuzzy”注釋才行。

檢查 PO 檔或範本的有效性

可以通過運作以下命令來檢查 gettext 檔的語法是否有效:

msgfmt fr.po --check

如果有語法錯誤或警告,他們將顯示在控制台。否則,msgfmt 不會輸出任何東西。

使用二進位 MO 檔(僅適用於大型專案)

大型專案會有成千上萬的字串要翻譯,相比於基於文字的 PO 檔,使用(編譯為)二進位的 MO 消息檔可能更加划算。二進位 MO 檔比對應的 PO 檔更小、讀起來更快。

你可以使用下面的命令生成 MO 檔:

msgfmt fr.po --no-hash -o fr.mo

如果這個 PO 檔是有效的,這個命令就會在 PO 檔的旁邊建立一個 fr.mo 檔案。這個 MO 檔可以按照下文的方法載入進 Godot。

應該在版本控制中保留原始 PO 檔,這樣以後就可以更新翻譯。如果你丟失了原始的 PO 檔,希望將 MO 檔反編譯為基於文字的 PO 檔,你可以這樣做:

msgunfmt fr.mo > fr.po

反編譯出的檔不包含注釋和模糊字串,因為它們一開始就沒有編譯進 MO 檔裡。