Переклади
m.T
m.T(key, default) повертає переклад для key або default, якщо перекладу немає.
return msg.Answer(m.T("no_city", "❌ <b>Яке місто?</b>"))Значення за замовчуванням — не заглушка, а той текст, з яким модуль постачається. Модуль без файлів перекладу працює чудово; переклади — це покращення.
Завжди передавайте справжній текст за замовчуванням
m.T("no_city", "") за відсутності ключа надішле порожнє повідомлення. Пишіть ту фразу, яку справді хочете показати.
Оголошення рядків
Strings — це каталог того, що ваш модуль вміє говорити:
func (m *Weather) Strings() map[string]string {
return map[string]string{
"name": "Weather",
"_cls_doc": "Погода в місті",
"_cmd_doc_weather": "[місто] — показати погоду",
"no_city": "❌ <b>Яке місто?</b>",
"not_found": "❌ <b>Місто не знайдено</b>",
}
}| Префікс | Де показується |
|---|---|
name | Ім'я модуля в .help |
_cls_doc | Опис модуля |
_cmd_doc_<cmd> | Рядок довідки цієї команди |
_cfg_<key> | Опис цього налаштування |
| усе інше | Скрізь, де ви викличете m.T |
Як розв'язується ключ
m.T("no_city", ...) шукає goroku.modules.<модуль>.no_city, пробуючи ім'я модуля як написано, у нижньому регістрі та у snake_case. Тому Weather збігається з weather, а APILimiter — з api_limiter.
Застарілі імена
Якщо переклади лежать під іменем, яке не виводиться з Name(), скажіть про це явно:
func (m *APIProtection) Name() string { return "APILimiter" }
func (m *APIProtection) TranslationAliases() []string {
return []string{"api_protection"}
}Аліаси пробуються після виведених імен.
Підстановка
m.T повертає рядок; форматування — на вас:
tpl := m.T("found", "🌤 <b>{}</b>: {}°C")
return msg.Answer(strings.Replace(strings.Replace(tpl, "{}", city, 1), "{}", temp, 1))Для двох і більше значень беріть іменовані плейсхолдери: перекладачі змінюють порядок слів, і позиційні {} при цьому ламаються:
tpl := m.T("found", "🌤 <b>{city}</b>: {temp}°C")
out := strings.NewReplacer("{city}", city, "{temp}", temp).Replace(tpl)
return msg.Answer(out)Екранування
Перекладений текст — це Telegram HTML. Екранізуйте все, що підставляєте від користувача:
import "goroku/goroku/utils"
out := strings.Replace(tpl, "{city}", utils.EscapeHTML(city), 1)