56 lines
2 KiB
Go
56 lines
2 KiB
Go
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...)
|
||
}
|