Skip to content

翻訳

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 の順で試します。したがって Weatherweather に、APILimiterapi_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)

Released under the GNU AGPL v3 License.