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 是一種比 CSV 更複雜的格式,對於剛接觸軟體當地語系化的人來說可能更難理解。
維護當地語系化檔的人員必須在其系統上安裝 gettext 工具。但是,由於 Godot 支援使用基於文字的消息檔(
.po
),翻譯人員無需安裝 gettext 工具即可測試他們的工作。
安裝 gettext 工具¶
需要命令列 gettext 工具來執行維護操作,如更新消息檔。因此,強烈建議您安裝它們。
放置樣板¶
執行編輯器¶
從Godot 4.0開始,編輯器可以根據指定的場景和腳本檔案自動產生PO模板。如果在腳本中使用,此 POT 產生還支援翻譯本文和複數,並帶有可選的第二個參數 tr() 和 tr_n() 方法。
打開專案設定的**當地語系化 > POT 生成**分頁,然後使用**新增...** 按鈕指定專案中包含可當地語系化字串的場景和腳本的路徑:
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 中的消息由 msgid
和 msgstr
對組成。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 檔裡。