Übersetzungen
m.T
m.T(key, default) liefert die Übersetzung zu key oder default, wenn es keine gibt.
return msg.Answer(m.T("no_city", "❌ <b>Welche Stadt?</b>"))Der Standardwert ist kein Platzhalter — er ist der ausgelieferte deutsche bzw. englische Text. Ein Modul ganz ohne Übersetzungsdateien funktioniert einwandfrei; Übersetzungen sind eine Verbesserung.
Immer einen echten Standardtext angeben
m.T("no_city", "") sendet bei fehlendem Schlüssel eine leere Nachricht. Schreib den Satz, den du wirklich haben willst.
Strings deklarieren
Strings ist der Katalog dessen, was dein Modul sagen kann:
func (m *Weather) Strings() map[string]string {
return map[string]string{
"name": "Weather",
"_cls_doc": "Aktuelles Wetter für eine Stadt",
"_cmd_doc_weather": "[Stadt] — Wetter anzeigen",
"no_city": "❌ <b>Welche Stadt?</b>",
"not_found": "❌ <b>Stadt nicht gefunden</b>",
}
}| Präfix | Wird angezeigt in |
|---|---|
name | Modulname in .help |
_cls_doc | Modulbeschreibung |
_cmd_doc_<cmd> | Hilfezeile dieses Befehls |
_cfg_<key> | Beschreibung dieser Einstellung |
| alles andere | Überall, wo du m.T aufrufst |
Wie ein Schlüssel aufgelöst wird
m.T("no_city", ...) sucht goroku.modules.<Modul>.no_city und probiert den Modulnamen wie geschrieben, kleingeschrieben und in snake_case. Weather trifft damit weather, und APILimiter trifft api_limiter.
Altbestand
Liegen deine Übersetzungen unter einem Namen, der sich nicht aus Name() ableitet, sag es ausdrücklich:
func (m *APIProtection) Name() string { return "APILimiter" }
func (m *APIProtection) TranslationAliases() []string {
return []string{"api_protection"}
}Aliase werden nach den abgeleiteten Namen probiert.
Interpolation
m.T gibt den String zurück; das Formatieren gehört dir:
tpl := m.T("found", "🌤 <b>{}</b>: {}°C")
return msg.Answer(strings.Replace(strings.Replace(tpl, "{}", city, 1), "{}", temp, 1))Nimm für mehr als einen Wert benannte Platzhalter — Übersetzer stellen Sätze um, und positionsbezogene {} gehen dabei kaputt:
tpl := m.T("found", "🌤 <b>{city}</b>: {temp}°C")
out := strings.NewReplacer("{city}", city, "{temp}", temp).Replace(tpl)
return msg.Answer(out)Escaping
Übersetzter Text ist Telegram-HTML. Escape alles, was von Nutzern eingesetzt wird:
import "goroku/goroku/utils"
out := strings.Replace(tpl, "{city}", utils.EscapeHTML(city), 1)