Up to date

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

Übersetzung von Spielen

Einführung

Sería excelente que el mundo hablara solo un idioma (Es wäre gut wenn die Welt nur eine Sprache sprechen würde). Zum Leidwesen für uns Entwickler ist dem nicht so. Kleine Indie- oder Nischenspiele benötigen keine Lokalisierung, größere Spiele die auf den breiten Massenmarkt zielen, benötigen dies aber auf jeden Fall. Godot bietet viele Tools, um diesen Prozess einfacher zu gestalten. Daher ähnelt diese Anleitung eher einer 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

Übersetzungen können aktualisiert und neu importiert werden, wenn sie sich ändern, aber sie müssen noch zum Projekt hinzugefügt werden. Dies geschieht in Projekt → Projekteinstellungen → Lokalisierung:

../../_images/localization_dialog.png

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.

Dazu kann das Neuzuweisungen-Tab verwendet werden:

../../_images/localization_remaps.png

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.

Schlüsselwörter in Text konvertieren

Einige Steuerelemente, wie Button und Label, holen automatisch eine Übersetzung, wenn ihr Text mit einem Übersetzungsschlüsselwort übereinstimmt. Wenn der Text eines Labels zum Beispiel "MAIN_SCREEN_GREETING1" lautet und dieses Schlüsselwort in der aktuellen Übersetzung existiert, wird der Text automatisch übersetzt.

Dieses automatische Übersetzungsverhalten kann in bestimmten Fällen unerwünscht sein. Wenn Sie beispielsweise ein Label verwenden, um den Namen eines Spielers anzuzeigen, möchten Sie wahrscheinlich nicht, dass der Name des Spielers übersetzt wird, wenn er einem Übersetzungsschlüsselwort entspricht. Um die automatische Übersetzung für einen bestimmten Node zu deaktivieren, deaktivieren Sie Lokalisierung > Automatisch übersetzen im Inspektor.

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 Thema 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

Bemerkung

Die Bereitstellung von pluralisierten Übersetzungen wird nur mit Lokalisierung mittels gettext unterstützt, nicht mit CSV.

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.

Um zu prüfen, ob Ihre Benutzeroberfläche Übersetzungen mit längeren Strings als dem Original aufnehmen kann, können Sie in den erweiterten Projekteinstellungen die Pseudolokalisierung aktivieren. Dadurch werden alle lokalisierbaren Strings durch längere Versionen ersetzt, wobei auch einige Zeichen in den ursprünglichen Zeichenfolgen durch akzentuierte Versionen ersetzt werden (wobei sie immer noch lesbar sind). Platzhalter werden unverändert beibehalten, so dass sie auch bei aktivierter Pseudolokalisierung weiterhin funktionieren.

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 verfügt über einen Server für die Low-Level-Verwaltung von Übersetzungen, den TranslationServer. Übersetzungen können während der Laufzeit hinzugefügt oder entfernt werden; die aktuelle Sprache kann auch während der Laufzeit geändert werden.

Bidirektionaler Text und UI-Spiegelung

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.

  • Verwendet eine gespiegelte Reihenfolge der internen Control-Elemente (z.B. OptionButton Dropdown-Button, Ausrichtung der Checkboxen, Reihenfolge der Listenspalten, Symbole für Baumelemente und Ausrichtung der Verbindungslinien, usw.), in einigen Fällen verwenden gespiegelte Steuerelemente separate Theme-Stile.

  • Das Koordinatensystem wird nicht gespiegelt, und Nicht-UI-Nodes (Sprites usw.) sind davon nicht betroffen.

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

  • text_direction, legt die Grundrichtung des Textes fest. Wenn es auf "auto" gesetzt ist, hängt die Richtung vom ersten starken Richtungszeichen im Text gemäß dem Unicode Bidirectional Algorithm ab,

  • language, überschreibt das aktuelle Gebietsschema des Projekts.

  • structured_text_bidi_override-Property und _structured_text_parser-Callback, ermöglicht eine spezielle Behandlung von strukturiertem 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

Einige Sprachen werden ohne Leerzeichen geschrieben, und Wort- sowie Zeilenumbruch erfordert mehr als nur Regeln über Zeichenfolgen. Godot enthält ICU-Regeln und wörterbuchbasierte Zeilenumbruch-Iterator-Daten, aber diese Daten sind nicht standardmäßig in exportierten Projekten enthalten. Um sie einzubeziehen, gehen Sie zu Projekt → Projekteinstellungen → Lokalisierung → Textserverdaten und klicken Sie auf Unterstützungsdaten installieren.... Die Zeilenumbruch-Iterator-Daten sind etwa 4 MB groß.

../../_images/icu_data.png

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

Vielleicht möchten Sie die Übersetzung eines Projekts testen, bevor Sie sie freigeben. Godot bietet zwei Möglichkeiten, dies zu tun.

Zunächst gibt es in den Projekteinstellungen unter Internationalisierung > Gebietsschema (bei aktivierten erweiterten Einstellungen) die Property Test. Setzen Sie diese Property auf den Gebietsschema-Code der Sprache, die Sie testen möchten. Godot führt das Projekt mit diesem Gebietsschema aus, wenn das Projekt ausgeführt wird (entweder vom Editor aus oder beim Exportieren).

../../_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.

Ü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

Der Projektname wird beim Export auf verschiedene Betriebssysteme und Plattformen zum Namen der Anwendung. Um den Projektnamen in mehr als einer Sprache anzugeben, erstellen Sie eine neue Einstellung Anwendung/Name in den Projekteinstellungen und fügen Sie den Gebietsschema-Bezeichner daran an. Für Spanisch wäre dies zum Beispiel application/name_es:

../../_images/localized_name.png

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