翻訳
m.T
m.T(key, default) は key の訳を返し、無ければ default を返します。
go
return msg.Answer(m.T("no_city", "❌ <b>どの都市ですか?</b>"))既定値は仮置きではなく、モジュールが同梱して出荷する文言そのものです。翻訳ファイル が無くてもモジュールは問題なく動きます。翻訳はあくまで上乗せです。
既定値には本物の文を書く
m.T("no_city", "") はキーが無いとき空メッセージを送ります。実際に見せたい文を 書いてください。
文言を宣言する
Strings は、モジュールが言いうることのカタログです。
go
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() から導けない名前の下にあるなら、明示してください。
go
func (m *APIProtection) Name() string { return "APILimiter" }
func (m *APIProtection) TranslationAliases() []string {
return []string{"api_protection"}
}別名は導出された名前の後に試されます。
埋め込み
m.T は文字列を返すだけで、整形は自分で行います。
go
tpl := m.T("found", "🌤 <b>{}</b>: {}°C")
return msg.Answer(strings.Replace(strings.Replace(tpl, "{}", city, 1), "{}", temp, 1))値が2つ以上あるときは名前付きプレースホルダを使ってください。翻訳者は語順を 入れ替えるので、位置依存の {} はそこで壊れます。
go
tpl := m.T("found", "🌤 <b>{city}</b>: {temp}°C")
out := strings.NewReplacer("{city}", city, "{temp}", temp).Replace(tpl)
return msg.Answer(out)エスケープ
翻訳された文言は Telegram HTML です。利用者由来の値を差し込む前にエスケープして ください。
go
import "goroku/goroku/utils"
out := strings.Replace(tpl, "{city}", utils.EscapeHTML(city), 1)