Up to date

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

將遊戲國際化

前言

Sería excelente que el mundo hablara solo un idioma(如果全世界都講同一種語言就太好了)。不幸的是對於我們的開發人員來說,情況並非如此。雖然獨立或投機遊戲通常不需要當地語系化,但瞄準更大市場的遊戲通常需要當地語系化。Godot 提供了許多工具來使這個過程更加簡單,因此本教學更像一個妙招和技巧的合集。

當地語系化通常是通過雇傭特定的工作室來完成的,儘管有大量的軟體和檔案格式可供使用,但迄今為止進行當地語系化最常見的方式仍然是使用試算表。建立試算表並匯入試算表的過程已經在 匯入翻譯 教學中介紹過了,所以這個教學更像是對那個教學的後續。

備註

我們將使用官方演示作為範例,您可以`從素材庫下載 <https://godotengine.org/asset-library/asset/134>`_。

配置匯入的譯文

翻譯可以在更改時得到更新和重新匯入,但仍必須新增到專案中。可通過**專案 → 專案設定 → 當地語系化**來完成:

../../_images/localization_dialog.png

上述對話方塊用於新增或刪除專案範圍內的翻譯。

資源的當地語系化

根據目前語言,還可以指示 Godot 使用替代版本的素材(資源)。**重定向**分頁可用於此。

**重新對應**分頁可用於此目的:

../../_images/localization_remaps.png

選擇需要重定向的資源,並指定它在其他語言地區的替代方案。

備註

DynamicFonts 不支援資源重新對應系統。若要根據語言的腳本使用不同的字形,請改用 DynamicFont 後備系統,它允許您定義任意數量的後備字形。

DynamicFont 後備系統的優點是,無論目前語言如何,它都可以工作,這使其非常適合文字語言可能與客戶端語言不配對的多人聊天等情況。

將鍵轉換為文字

一些控制項,例如 ButtonLabel,如果它們的文字與一個翻譯鍵值相配對,將自動獲取翻譯內容。例如,如果一個標籤的文字是“MAIN_SCREEN_GREETING1”並且該鍵值存在於目前的翻譯中,那麼該文字將被自動翻譯。

這種自動翻譯行為在某些情況下可能是不可取的。例如,當使用 Label 來顯示玩家的名字時,如果玩家的名字與翻譯鍵相配對,你很可能不希望進行翻譯。要禁用某個節點的自動翻譯,請在屬性面板中禁用**Localization > Auto Translate**(當地語系化 > 自動翻譯)。

在程式碼中, 可以使用 Object.tr() 函式. 這將只是在翻譯中搜尋文字, 如果找到的話就進行轉換:

level.text = tr("LEVEL_5_NAME")
status.text = tr("GAME_STATUS_%d" % status_index)

備註

如果更改語言後不顯示任何文字,請嘗試換一個字形。預設專案字形僅支援 Latin-1 字元集的子集,無法用於顯示俄語、漢語等文字。

多語言字形的一個很好的資源是「Noto Fonts <https://www.google.com/get/noto/>」。如果您使用的是不太常見的語言,請確保下載正確的變體。

下載字形後,將 TTF 檔案載入到 DynamicFont 資源中,並將其用作控制節點的自訂字形。為了獲得更好的可重複使用性,請將新的主題資源關聯到根控制節點,並將 DynamicFont 定義為主題中的預設字形。

預留位置

若要在翻譯的字串中使用佔位符,請使用 doc_gdscript_printf 或 C# 中的等效功能。這使翻譯人員可以自由移動字串中佔位符的位置,從而使翻譯聽起來更自然。應盡可能使用具有“String.format()”函式的命名佔位符,因為它們還允許翻譯人員選擇佔位符出現的*順序*:

# The placeholder's locations can be changed, but not their order.
# This will probably not suffice for some target languages.
message.text = tr("%s picked up the %s") % ["Ogre", "Sword"]

# The placeholder's locations and order can be changed.
# Additionally, this form gives more context for translators to work with.
message.text = tr("{character} picked up the {weapon}").format({character = "Ogre", weapon = "Sword"})

翻譯狀態

如果你使用普通的英文所謂來源字串(而不是類似於 LIKE_THIS 的消息程式碼),那麼就有可能會遇到歧義的情況,同一個英文字串可能需要在某些目的語言中翻譯為不同的字串。你可以通過指定可選的*翻譯本文*來消除歧義,即便原始字串是相同的,也能夠讓目的語言能夠使用不同的字串:

# "Close", as in an action (to close something).
button.set_text(tr("Close", "Actions"))

# "Close", as in a distance (opposite of "far").
distance_label.set_text(tr("Close", "Distance"))

組織

很多語言會根據物件的單複數使用不同的字串。但是把“是否為複數”的條件硬編碼為“物件數量是否大於 1 ”並不是對所有語言都有效。

有些語言有兩種以上的複數形式,不同的複數需要的物件數量也各不相同。Godot 提供了對*複數*的支援,目標地區可以自動進行處理。

複數應該只用於正整數(或零)的情況。負數和浮點數所代表的物理實體數量是單數還是複數一般無法明確區分。

var num_apples = 5
label.text = tr_n("There is %d apple", "There are %d apples", num_apples) % num_apples

填寫下列設定:

var num_jobs = 1
label.text = tr_n("%d job", "%d jobs", num_jobs, "Task Manager") % num_jobs

備註

提供複數翻譯僅支援 使用 gettext 進行當地語系化,不支援 CSV。

使控制項的大小可調

不同語言的相同文字的長度差異很大。為此,請務必閱讀教學 大小和錨點,因為動態調整控制項大小可能有所説明。Container 可能很有用,Label 的文字換行選項應該也能幫上忙。

若要檢查您的 UI 是否可以容納比原始字串更長的翻譯,您可以在進階專案設定中啟用*偽本地化*。這將用更長的版本替換所有可本地化的字串,同時用帶有重音的版本替換原始字串中的一些字元(同時仍然可讀)。佔位符保持原樣,以便在啟用偽本地化時它們繼續工作。

例如,當啟用偽本地化時,字串「Hello world, this is %s!」將變為「[Ĥéłłô ŵôŕłd́, ŧh̀íš íš %s!]」。

雖然第一眼看上去很奇怪,但是偽當地語系化的好處有很多:

  • 它可以讓您快速發現不可本地化的字串,這樣您就可以檢查它們並使它們可本地化(如果這樣做有意義的話)。

  • 它可以讓您檢查無法容納長字串的 UI 元素。許多語言的翻譯都會比原始文字長得多,因此確保您的 UI 能夠容納比平常更長的字串非常重要。

  • 它可以讓您檢查您的字形是否包含支援各種語言所需的所有字元。然而,由於偽本地化的目標是保持原始字串的可讀性,因此它並不是檢查字形是否支援 CJK(中文、日文、韓文)或從右到左語言的有效測試。

專案設定可讓您調整偽本地化行為,以便您可以根據需要停用其部分內容。

TranslationServer

Godot 有一個進行底層翻譯管理的伺服器,名為 TranslationServer。可以在運作時新增或刪除翻譯;目前語言也可以在運作時更改。

雙向文字和 UI 鏡像

阿拉伯語和希伯來語是從右到左書寫的(除了混合的數字和拉丁單字),這些語言的使用者介面也應該是鏡像的。在某些語言中,字形的形狀會根據周圍的字元而變化。

對雙向書寫系統和 UI 鏡像的支援是透明的,您通常不需要更改任何內容或了解特定書寫系統。

對於 RTL(從右至左)語言,Godot 會自動對 UI 進行以下調整:

  • 鏡像左右錨點和邊距。

  • 交換文字的左對齊和右對齊。

  • 鏡像容器中子控制項的水平順序以及 Tree/ItemList 控制項中專案的水平順序。

  • 控制項內部元素使用鏡像順序(例如 OptionButton 的下拉按鈕、單選框的位置、列表方塊列的順序、Tree 專案的圖示和連接線的位置等),某些鏡像的控制項會使用單獨的主題樣式。

  • 坐標系不會鏡像,非 UI 節點(精靈等)不受影響。

可以使用下列控制項屬性來覆寫文字和控制項佈局方向:

  • text_direction,設定基本文字方向。當設定為“auto”時,方向取決於根據 Unicode 雙向演算法的文字中的第一個強方向字符,

  • “語言”,覆蓋目前專案區域設定。

  • structured_text_bidi_override property and _structured_text_parser callback, enables special handling for structured text.

  • “layout_direction”,覆蓋控制鏡像。

../../_images/ui_mirror.png

也參考

除了這份說明文件,你可能也會想看看 Godot Demo 專案

新增檔案至專案

有些語言的書寫沒有空格,單字和換行需要的不僅僅是字元序列的規則。 Godot 包括 ICU 規則和基於字典的中斷迭代器資料,但預設情況下此資料不包含在匯出的專案中。要包含它,請前往 專案 → 專案設定 → 本地化 → 文字伺服器資料,然後按一下 安裝支援資料...。中斷迭代器資料大約有 4 MB 大。

../../_images/icu_data.png

結構化文字 BiDi 覆蓋

Unicode BiDi 演算法設計用於處理自然文字,它無法處理具有更高層級順序的文字,例如檔案名稱、URI、電子郵件地址、正規表示式或原始程式碼。

../../_images/bidi_override.png

例如,所顯示的目錄結構的路徑將顯示不正確(頂部「LineEdit」控制項)。 「檔案」型別結構化文字會覆寫將文字分割成段,然後將 BiDi 演算法單獨套用到每個段,以正確顯示任何語言的目錄名稱並保留資料夾的正確順序(底部「LineEdit」控制項)。

自訂回調提供了一種覆蓋其他型別結構化文字的 BiDi 的方法。

載入場景

專為數位輸入或輸出設計的控制項(例如 ProgressBar、SpinBox)將自動使用本地化編號系統,對於其他控制項 TextServer.format_number(string, language) 可用於轉換西阿拉伯數字( 0 ..9) 到本地化編號系統並:ref:TextServer.parse_number(string, language) <class_TextServer_method_parse_number> 將其轉換回來。

本地化說明文件圖片

帶有左右指向箭頭的圖示可能需要在阿拉伯語和希伯來語語言環境中顛倒過來,以防它們指示移動或方向(例如後退/前進按鈕)。否則,它們可以保持不變。

匯入翻譯

你可能會想要在發行前測試專案的翻譯。Godot 為此提供了兩種方法。

First, in the Project Settings, under Internationalization > Locale (with advanced settings enabled), there is a Test property. Set this property to the locale code of the language you want to test. Godot will run the project with that locale when the project is run (either from the editor or when exported).

../../_images/locale_test.webp

請記住,因為這是一個專案設定,設為非空時會在版本控制中顯示。因此,將修改提交到版本控制之前,應該將其設回空值。

還可以在從命令列運作 Godot 時測試語言。例如,要使用法語測試遊戲,可以提供以下參數:

godot --language fr

翻譯專案名稱

匯出到不同的作業系統和平臺時,專案名稱將成為應用程式名稱。要以多種語言指定專案名稱,請在**專案設定**中建立一個新設定 application/name,並將區域識別字附加到其中。例如,對於西班牙語,這將是 application/name_es

../../_images/localized_name.png

如果您不確定要使用的語言程式碼,請參閱:ref:區功能變數程式碼列表 <doc_locales>