Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Übersetzung von Spielen

Einführung

Während Indie- oder Nischenspiele normalerweise nicht lokalisiert werden müssen, ist bei Spielen, die auf einen größeren Markt abzielen, häufig eine Lokalisierung erforderlich. Godot bietet viele Tools, um diesen Prozess zu vereinfachen. Daher ist dieses Tutorial eher eine Sammlung von Tipps und Tricks.

Die Lokalisierung wird in der Regel von speziellen Studios durchgeführt, die mit dieser Aufgabe betraut sind. Trotz der riesigen Menge an Software und Dateiformaten, die dafür zur Verfügung stehen, wird die Lokalisierung bis heute am häufigsten mit Tabellenkalkulationsprogrammen durchgeführt. Der Prozess der Erstellung von Tabellenkalkulationen und des Imports wurde bereits im Tutorial Übersetzungen importieren behandelt. Wenn Sie die Seite zum Importieren von Übersetzungen noch nicht gelesen haben, empfehlen wir Ihnen, dies zu tun, bevor Sie diese Seite lesen.

Bemerkung

Wir werden die offizielle Demo als Beispiel verwenden. Sie können sie aus der Asset-Bibliothek herunterladen.

Konfigurieren der importierten Übersetzung

Translations can get updated and re-imported when they change, but they still have to be added to the project. This is done in Project > Project Settings > Localization > Translations:

../../_images/localization_dialog.webp

Der obige Dialog wird verwendet, um Übersetzungen projektweit hinzuzufügen oder zu entfernen.

Ressourcen lokalisieren

Es ist auch möglich, Godot anzuweisen, je nach aktueller Sprache alternative Versionen von Assets (Ressourcen) zu verwenden. Dies kann für lokalisierte Bilder wie Anzeigen im Spiel oder lokalisierte Stimmen verwendet werden.

The Remaps tab can be used for this:

../../_images/localization_remaps.webp

Wählen Sie die neu zuzuordnende Ressource aus und fügen Sie dann für jedes Gebietsschema einige Alternativen hinzu.

Bemerkung

Das Resource-Remapping-System wird für DynamicFonts nicht unterstützt. Um je nach Schrift der Sprache unterschiedliche Schriftarten zu verwenden, verwenden Sie stattdessen das DynamicFont-Fallback-System, mit dem Sie beliebig viele Fallback-Schriftarten definieren können.

Der Vorteil des DynamicFont-Fallback-Systems ist, dass es unabhängig von der aktuellen Sprache funktioniert, was es ideal für Dinge wie Multiplayer-Chat macht, bei denen die Textsprache möglicherweise nicht mit der Sprache des Clients übereinstimmt.

Automatically setting a language

It is recommended to default to the user's preferred language which can be obtained via OS.get_locale_language(). If your game is not available in that language, it will fall back to the Fallback in Project > Project Settings > General > Internationalization > Locale, or to en if empty. Nevertheless, letting players change the language in game is recommended for various reasons (e.g. translation quality or player preference).

var language = "automatic"
# Load here language from the user settings file
if language == "automatic":
   var preferred_language = OS.get_locale_language()
   TranslationServer.set_locale(preferred_language)
else:
   TranslationServer.set_locale(language)

Locale vs. language

A locale is commonly a combination of a language with a region or country, but can also contain information like a script or a variant.

Beispiele:

  • en: English language

  • en_GB: English in Great Britain / British English

  • en_US: English in the USA / American English

  • en_DE: English in Germany

Indie games generally only need to care about language, but read on for more information.

Why locales exist can be illustrated through the USA and Great Britain. Both speak the same language (English), yet differ in many aspects:

  • Spelling: e.g. gray (USA), grey (GB)

  • Use of words: e.g. eggplant (USA), aubergine (GB)

  • Units or currencies: e.g. feet/inches (USA), metres/cm (GB)

It can get more complex however. Imagine you offer different content in Europe and in China (e.g. in an MMO). You will need to translate each of those content variations into many languages and store and load them accordingly.

Schlüsselwörter in Text konvertieren

Some controls, such as Button and Label, will automatically fetch a translation if their text matches a translation key. For example, if a label's text is MAIN_SCREEN_GREETING1 and that key exists in the current translation, then the text will automatically be translated.

This automatic translation behavior may be undesirable in certain cases. For instance, when using a Label to display a player's name, you most likely don't want the player's name to be translated if it matches a translation key. To disable automatic translation on a specific node, set the Auto Translate > Mode to Disabled in the inspector.

Im Code kann die Funktion Object.tr() verwendet werden. Diese sucht den Text in den Übersetzungen und konvertiert ihn, wenn er gefunden wird:

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

Bemerkung

Wenn nach dem Ändern der Sprache kein Text angezeigt wird, versuchen Sie, eine andere Schriftart zu verwenden. Die Standard-Projektschriftart unterstützt nur eine Teilmenge des Latin-1-Zeichensatzes, der nicht zur Anzeige von Sprachen wie Russisch oder Chinesisch verwendet werden kann.

Eine gute Quelle für mehrsprachige Schriftarten ist Noto Fonts. Stellen Sie sicher, dass Sie die richtige Variante herunterladen, wenn Sie eine weniger verbreitete Sprache verwenden.

Sobald Sie die Schriftart heruntergeladen haben, laden Sie die TTF-Datei in eine DynamicFont-Ressource und verwenden Sie sie als benutzerdefinierte Schriftart für Ihren Control-Node. Um die Wiederverwendbarkeit zu verbessern, verknüpfen Sie eine neue Ressource für ein Theme mit Ihrem Root Control-Node und definieren Sie die DynamicFont als Standardschriftart im Theme.

Platzhalter

Um Platzhalter in Ihre übersetzten Strings einzufügen, verwenden Sie GDScript Format-Strings oder die entsprechende Funktion in C#. Dadurch können Übersetzer die Position des Platzhalters im String frei verschieben, was die Übersetzungen natürlicher klingen lässt. Benannte Platzhalter mit der Funktion String.format() sollten wann immer möglich verwendet werden, da sie es dem Übersetzer auch erlauben, die Reihenfolge der Platzhalter zu wählen:

# 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"})

Übersetzungskontexte

Wenn Sie einfaches Englisch als Quellstrings verwenden (anstelle von Nachrichtencodes wie LIKE_THIS), können Sie auf Mehrdeutigkeiten stoßen, wenn Sie denselben englischen String in verschiedene Strings in bestimmten Zielsprachen übersetzen müssen. Sie können optional einen Übersetzungskontext angeben, um diese Mehrdeutigkeit aufzulösen und den Zielsprachen zu erlauben, unterschiedliche Strings zu verwenden, auch wenn der Quellstring identisch ist:

# "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"))

Pluralbildung

Die meisten Sprachen verlangen unterschiedliche Strings, je nachdem, ob ein Objekt im Singular oder Plural vorliegt. Die Hardcodierung der Bedingung "ist Plural" in Abhängigkeit davon, ob es mehr als ein Objekt gibt, ist jedoch nicht in allen Sprachen gültig.

Einige Sprachen haben mehr als zwei Pluralformen, und die Regeln für die Anzahl der für jede Pluralform erforderlichen Objekte sind unterschiedlich. Godot bietet Unterstützung für Pluralbildung, so dass die Zielsprachensysteme dies automatisch handhaben können.

Die Pluralbildung ist nur für positive (oder Null-) Integer-Zahlen gedacht. Negative und Float-Zahlen stellen in der Regel physikalische Einheiten dar, für die Singular und Plural nicht eindeutig gelten.

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

Dies kann bei Bedarf mit einem Kontext kombiniert werden:

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

Größenänderung von Steuerelementen

Derselbe Text kann in verschiedenen Sprachen sehr unterschiedlich lang sein. Lesen Sie hierzu unbedingt das Tutorial zu Größe und Anker, da eine dynamische Anpassung der Kontrollgrößen hilfreich sein kann. Container kann nützlich sein, ebenso wie die in Label verfügbaren Textumbruchoptionen.

To check whether your UI can accommodate translations with longer strings than the original, you can enable pseudolocalization in the advanced Project Settings. This will replace all your localizable strings with longer versions of themselves, while also replacing some characters in the original strings with accented versions (while still being readable). Placeholders are kept as-is, so that they keep working when pseudolocalization is enabled.

Zum Beispiel wird der String Hallo Welt, hier ist %s! zu [Ĥéłłô ŵôŕłd́, ŧh̀íš íš %s!] wenn die Pseudolokalisierung aktiviert ist.

Die Pseudolokalisierung sieht zwar auf den ersten Blick seltsam aus, hat aber mehrere Vorteile:

  • Sie erlaubt Ihnen, nicht lokalisierbare Strings schnell zu erkennen, so dass sie überarbeitet und lokalisierbar gemacht werden können (falls dies sinnvoll ist).

  • Es erlaubt Ihnen, Elemente der Benutzeroberfläche zu überprüfen, die nicht für lange Strings geeignet sind. In vielen Sprachen sind die Übersetzungen viel länger als der Ausgangstext. Daher muss sichergestellt werden, dass die Benutzeroberfläche auch längere Strings als üblich aufnehmen kann.

  • Es erlaubt Ihnen, zu überprüfen, ob Ihre Schriftart alle Zeichen enthält, die zur Unterstützung verschiedener Sprachen erforderlich sind. Da das Ziel der Pseudolokalisierung jedoch darin besteht, die ursprünglichen Strings lesbar zu halten, ist dies kein effektiver Test, um zu prüfen, ob eine Schriftart CJK oder Rechts-nach-Links-Sprachen unterstützen kann.

In den Projekteinstellungen können Sie das Verhalten der Pseudolokalisierung anpassen, so dass Sie bei Bedarf Teile davon deaktivieren können.

TranslationServer

Godot has a server handling low-level translation management called the TranslationServer. Translations can be added or removed during runtime; the current language can also be changed at runtime.

Bidirectional text and UI mirroring

Arabisch und Hebräisch werden von rechts nach links geschrieben (mit Ausnahme der Zahlen und der lateinischen Wörter), und die Benutzeroberfläche für diese Sprachen sollte ebenfalls spiegelverkehrt sein. In einigen Sprachen ändert sich die Form einer Glyphe in Abhängigkeit von den umgebenden Zeichen.

Die Unterstützung für bidirektionale Schreibsysteme und die Spiegelung der Benutzeroberfläche ist transparent, Sie müssen in der Regel nichts ändern und keine Kenntnisse über das jeweilige Schreibsystem haben.

Für RTL-Sprachen wird Godot automatisch die folgenden Änderungen an der Benutzeroberfläche vornehmen:

  • Spiegelt linke/rechte Anker und Seitenränder.

  • Vertauscht die linke und rechte Textausrichtung.

  • Spiegelt die horizontale Reihenfolge der untergeordneten Steuerelemente in den Containern und der Elemente in Tree/ItemList-Controls.

  • Uses mirrored order of the internal control elements (e.g., OptionButton dropdown button, CheckBox/CheckButton alignment, List column order, TreeItem icons and connecting line alignment). In some cases, mirrored controls use separate theme styles.

  • Coordinate system is not mirrored.

  • Non-UI nodes (sprites, etc.) are not affected.

Es ist möglich, die Richtung des Textes und der Controls mit Hilfe der folgenden Control-Propertys außer Kraft zu setzen:

  • text_direction, sets the base text direction. When set to "auto", the direction depends on the first strong directional character in the text according to the Unicode Bidirectional Algorithm.

  • language, overrides the current project locale.

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

  • layout_direction, setzt die Spiegelung des Controls außer Kraft.

../../_images/ui_mirror.png

Siehe auch

Wie der Rechts-nach-Links-Schriftsatz in der Praxis funktioniert, können Sie anhand des BiDI and Font Features-Demoprojekts sehen.

Hinzufügen von Zeilenumbruch-Iterator-Daten zum exportierten Projekt

Some languages are written without spaces. In those languages, word and line breaking require more than rules over character sequences. Godot includes ICU rule and dictionary-based break iterator data, but this data is not included in exported projects by default.

To include it, go to Project > Project Settings > General > Internationalization > Locale and enable Include Text Server Data, then export the project. Break iterator data is about 4 MB in size.

Strukturierter Text BiDi-Überschreibung

Der Unicode-BiDi-Algorithmus wurde für die Arbeit mit natürlichem Text entwickelt und ist nicht in der Lage, Text mit höherer Ordnung, wie Dateinamen, URIs, E-Mail-Adressen, reguläre Ausdrücke oder Quellcode zu verarbeiten.

../../_images/bidi_override.png

Zum Beispiel wird der Pfad für diese angezeigte Verzeichnisstruktur nicht korrekt angezeigt (oberes "LineEdit"-Control). Die Überschreibung des Typs "Datei" für strukturierten Text teilt den Text in Segmente auf und wendet dann den BiDi-Algorithmus auf jedes dieser Segmente einzeln an, um die Verzeichnisnamen in jeder Sprache korrekt anzuzeigen und die richtige Reihenfolge der Ordner beizubehalten (unteres Steuerelement "LineEdit").

Benutzerdefinierte Callbacks bieten eine Möglichkeit, BiDi für die anderen Arten von strukturiertem Text außer Kraft zu setzen.

Lokalisierung von Zahlen

Controls, die speziell für die Eingabe oder Ausgabe von Zahlen entwickelt wurden (z.B. ProgressBar, SpinBox), verwenden automatisch das lokalisierte Zahlensystem, für andere Controls kann TextServer.format_number(string, language) verwendet werden, um westarabische Zahlen (0..9) in das lokalisierte Zahlensystem zu konvertieren und TextServer.parse_number(string, language), um sie zurück zu konvertieren.

Lokalisierung von Icons und Bildern

Symbole mit nach links und rechts zeigenden Pfeilen, die für arabische und hebräische Sprachumgebungen möglicherweise umgekehrt werden müssen, falls sie eine Bewegung oder eine Richtung anzeigen (z. B. Vor-/Zurück-Tasten). Ansonsten können sie gleich bleiben.

Testen von Übersetzungen

You may want to test a project's translation before releasing it. Godot provides three ways to do this.

Under Project > Project Settings > General > Internationalization > Locale (with advanced settings enabled) 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

Beachten Sie, dass es sich hierbei um eine Projekteinstellung handelt, die in der Versionsverwaltung angezeigt wird, wenn sie auf einen nicht leeren Wert gesetzt ist. Daher sollte sie auf einen leeren Wert zurückgesetzt werden, bevor Änderungen in die Versionsverwaltung übertragen werden.

Second, from within the editor go to the top bar and click on View on the top bar, then go down to Preview Translation and select the language you want to preview.

../../_images/locale_editor_preview.webp

All text in scenes in the editor should now be displayed using the selected language.

Übersetzungen können auch getestet werden, wenn Godot von der Kommandozeile aus starten. Um zum Beispiel ein Spiel auf Französisch zu testen, kann das folgende Argument angegeben werden:

godot --language fr

Übersetzen des Projektnamens

The project name becomes the app name when exporting to different operating systems and platforms. To specify the project name in more than one language go to Project > Project Settings > General > Application > Config. From here click on the Localizable String (Size 0) button, then the Add Translation button. It will take you to a page where you can choose the language (and country if needed) for your project name translation. After doing that you can now type in the localized name.

../../_images/localized_name.webp

Wenn Sie sich nicht sicher sind, welchen Sprachcode Sie verwenden sollen, sehen Sie in der Liste der Gebietsschema-Codes nach.