---
title: Übersetzung (i18n / l10n)
layout: default
root: ../..
idx: 8.05
marked_text_encoding:
  level: info
  title: Markierter-Text-Kodierung
  message: |
    Sie müssen das genaue Format des markierten Textes nicht kennen, aber es könnte Ihnen helfen Sie zu verstehen.

    ```
    "\27(T@mymod)Hello everyone!\27E"
    ```

    * `\27` ist das Escape-Zeichen - es wird verwendet, um Minetest mitzuteilen, dass er aufpassen soll, da
      etwas Besonderes bevorsteht. Es wird sowohl für Übersetzungen als auch für Text
      Einfärbung benutzt.
    * `(T@mymod)` besagt, dass der folgende Text mit Hilfe der `mymod` Textdomäne
      übersetzbar wird.
    * `Hello everyone!` ist der übersetzbare Text in Englisch, wie er an die
      Übersetzer-Funktion übergeben wird.
    * `\27E` ist das Escape-Zeichen mit `E`, um zu signalisieren, dass das Ende
      erreicht wurde.
---

## Einleitung <!-- omit in toc -->

Wenn Sie ihre Mods und Spiele mit Übersetzungsunterstützung versehen, können mehr Menschen sie genießen. Laut Google Play haben 64 % der Minetest-Android-Nutzer Englisch nicht als ihre Hauptsprache. Minetest verfolgt keine Statistiken für Benutzer
über alle Plattformen hinweg, aber es ist wahrscheinlich, dass es einen hohen Anteil an
nicht-englischsprachiger Benutzer gibt.

Minetest ermöglicht es Ihnen, ihre Mods und Spiele in verschiedene Sprachen zu übersetzen, indem Sie Texte auf Englisch verfassen und mit Hilfe von Übersetzungsdateien die Texte in unterschiedliche Sprachen zu übersetzen. Die Übersetzung wird auf dem Client jedes Spielers durchgeführt, so dass jeder Spieler eine andere Sprache sieht.


- [Wie funktioniert die clientseitige Übersetzung?](#wie-funktioniert-die-clientseitige-übersetzung)
  - [Markierter Text](#markierter-text)
  - [Übersetzungsdateien](#übersetzungsdateien)
- [Formatierte Zeichenketten](#formatierte-zeichenketten)
- [Beste Verfahren und verbreitete Unwahrheiten über die Übersetzung](#verfahren)
- [Server-seitige Übersetzungen](#server)
- [Zusammenfassung](#zusammenfassung)


## Wie funktioniert die clientseitige Übersetzung?

### Markierter Text

Der Server muss den Clients mitteilen, wie der Text zu übersetzen ist. Dies geschieht durch die Platzierung von Kontrollzeichen im Text, die Minetest mitteilen, wo und wie der Text zu übersetzen ist. Dies wird als *markierter Text* bezeichnet und wird später näher erläutert.

Um Text als übersetzbar zu markieren, verwenden Sie eine Übersetzungsfunktion (`S()`), die Sie mit `minetest.get_translator(textdomain)` nutzen können`:

```lua
local S = minetest.get_translator("mymod")

minetest.register_craftitem("mymod:item", {
    description = S("My Item"),
})
```

Das erste Argument von `get_translator` ist `textdomain`, die als Namensraum dient. Anstatt alle Übersetzungen für eine Sprache in einer einzigen Datei zu speichern, werden die Übersetzungen in Textdomänen aufgeteilt (eine Datei pro Textdomäne
pro Sprache). Die Textdomäne sollte mit dem Namen des Mods übereinstimmen, da dies hilft, Mod-Konflikte zu vermeiden.

Markierter Text kann an den meisten Stellen verwendet werden, wo menschenlesbarer Text akzeptiert wird, einschließlich *formspecs*, *item def*-Felder, Infotext und mehr. Wenn Sie markierten Text in Formspecs einfügen, müssen Sie den Text mit `minetest.formspec_escape` entschlüsseln.

Wenn der Client auf übersetzbaren Text stößt, wie den, der an `description` übergeben wird, schaut er in der Übersetzungsdatei der Sprache des Spielers nach. Wenn eine Übersetzung nicht gefunden wird, greift er auf die englische Übersetzung zurück.

Der übersetzbare markierte Text enthält den englischen Ausgangstext, die Textdomäne,
und alle zusätzlichen Argumente, die an `S()` übergeben werden. Es ist im wesentlichen eine Textkodierung des `S`-Aufrufs, die alle erforderlichen Informationen enthält.

Eine andere Art von markiertem Text ist der, der von `minetest.colorize` zurückgegeben wird.

{% include notice.html notice=page.marked_text_encoding %}


### Übersetzungsdateien

Übersetzungsdateien sind Mediendateien, die sich im Ordner `locale` von jeder Mod befinden. Zurzeit wird nur das Format `.tr` unterstützt, aber die Unterstützung für weitere gängige Formate wird wahrscheinlich in der Zukunft hinzugefügt. Übersetzungsdateien müssen folgendermaßen benannt werden: `[Textdomäne].[Sprache].tr`.

Dateien im `.tr` beginnen mit einem Kommentar, der die Textdomäne angibt, und dann weiteren Zeilen, die den englischen Ausgangstext in die Übersetzung übertragen.

Zum Beispiel: `mymod.de.tr`:

```
# textdomain: mymod
Hello everyone!=Hallo zusammen!
I like grapefruit=Ich mag Traubenfrüchte
```

Sie sollten Übersetzungsdateien auf der Grundlage des Quellcodes Ihres Mods/Spiels erstellen, unter Verwendung eines Tools wie [update_translations 🇬🇧](https://github.com/minetest-tools/update_translations). Dieses Tool sucht nach `S(` in Ihrem Lua-Code und erstellt automatisch eine Vorlage, die Übersetzer für die Übersetzung in ihre Sprache verwenden können. Es kümmert sich auch darum, die Übersetzungsdateien zu aktualisieren, wenn sich Ihr Quelltext ändert.

Sie sollten immer wörtlichen Text (`"`) in S einfügen, anstatt eine Variable zu verwenden,
da dies den Werkzeugen hilft, Übersetzungen zu finden.

## Formatierte Zeichenketten

Es ist üblich, variable Informationen in einen Übersetzungsstring aufzunehmen. Dabei ist es ist wichtig, dass der Text nicht einfach aneinandergereiht wird, da das Übersetzer daran hindert, die Reihenfolge der Variablen innerhalb eines Satzes zu ändern. Stattdessen, sollten Sie das Format/Argumente-System des Übersetzungssystems verwenden:

```lua
minetest.register_on_joinplayer(function(player)
    minetest.chat_send_all(S("Everyone, say hi to @1!", player:get_player_name()))
end)
```

Wenn Sie ein wörtliches `@` in Ihre Übersetzung einfügen wollen, müssen Sie die Escape-Schreibweise verwenden, indem Sie `@@` schreiben.

Sie sollten die Konkatenation *innerhalb* eines Satzes vermeiden, aber es wird empfohlen, mehrere Sätze durch Konkatenation zu verbinden. Dies hilft den Übersetzern, weil Zeichenketten kleiner gehalten sind.

```lua
S("Hello @1!", player_name) .. " " .. S("You have @1 new messages.", #msgs)
```


## Beste Verfahren und verbreitete Unwahrheiten über die Übersetzung <a name="verfahren"></a>

* Vermeiden Sie die Konkatenation von Text und verwenden Sie stattdessen Formatierungsargumente.
 Dies gibt den Übersetzern die volle Kontrolle über die Änderung der Reihenfolge.
* Erstellen Sie Übersetzungsdateien automatisch, indem Sie
  [update_translations 🇬🇧](https://github.com/minetest-tools/update_translations) verwenden.
* Es ist üblich, dass Variablen den umgebenden Text verändern, zum Beispiel durch
  Geschlecht und Pluralisierung. Dies ist oft schwer zu behandeln, daher wird
  häufig mit geschlechtsneutralen Formulierungen umgangen.
* Übersetzungen können viel länger oder viel kleiner als der englische Text sein. Stellen Sie
  sicher, dass Sie viel Platz lassen.
* In anderen Sprachen werden Zahlen möglicherweise anders geschrieben, zum Beispiel
  mit Kommas als Dezimalkomma(also wie im Deutschen). `1.000,23`, `1'000'000,32`
* Gehen Sie nicht davon aus, dass andere Sprachen die Großschreibung auf die gleiche Weise verwenden.


## Server-seitige Übersetzungen <a name="server"></a>

Manchmal muss man z. B. die Übersetzung eines Textes auf dem Server kennen, um Text zu sortieren oder zu suchen. Sie können `get_player_information` benutzen, um die Sprache des Spielers zu erhalten und `get_translated_string`, um markierten Text zu übersetzen.

```lua
local list = {
    S("Hello world!"),
    S("Potato")
}

minetest.register_chatcommand("find", {
    func = function(name, param)
        local info = minetest.get_player_information(name)
        local language = info and info.language or "en"

        for _, line in ipairs(list) do
            local trans = minetest.get_translated_string(language, line)
            if trans:contains(query) then
                return line
            end
        end
    end,
})
```

## Zusammenfassung

Die Übersetzungs-API ermöglicht es, Mods und Spiele besser zugänglich zu machen, aber es ist Vorsicht geboten, um sie richtig zu nutzen.

Minetest wird ständig verbessert und die Übersetzungs-API wird wahrscheinlich in Zukunft erweitert werden. Zum Beispiel wird die Unterstützung für gettext-Übersetzungsdateien die Verwendung gängiger Übersetzungswerkzeuge und -plattformen (wie weblate) ermöglichen und es wird wahrscheinlich eine Unterstützung für Pluralisierung und Geschlecht hinzugefügt werden.
