package main import "fmt" // Lang — язык интерфейса. type Lang int const ( LangRU Lang = iota LangEN ) // currentLang — текущий выбранный язык интерфейса. Пакетный // уровень оправдан тем, что приложение однопоточное (TUI обновляется // строго последовательно через Bubble Tea), а язык выбирается один // раз в начале (см. экран выбора языка в menu.go) и меняется только // через явное действие пользователя. var currentLang = LangRU // SetLanguage устанавливает текущий язык интерфейса. func SetLanguage(l Lang) { currentLang = l } // CurrentLang возвращает текущий язык интерфейса. func CurrentLang() Lang { return currentLang } // translationEntry — пара переводов одного ключа. type translationEntry struct { ru string en string } // T возвращает перевод строки по ключу key на текущем языке. Если // ключ не найден в таблице translations — возвращается сам ключ // (это осознанный "мягкий" фолбэк: пропущенный перевод не ломает // интерфейс, а просто виден как есть, что легко заметить и // исправить). func T(key string) string { if e, ok := translations[key]; ok { if CurrentLang() == LangEN { return e.en } return e.ru } return key } // Tf — то же самое, что T, но для строк-форматов (используются как // первый аргумент fmt.Sprintf): сначала переводится сам формат, // затем в него подставляются аргументы. func Tf(key string, args ...interface{}) string { return fmt.Sprintf(T(key), args...) }