Files
tamabox/internal/shared/state.go
T
2026-09-08 10:10:44 +08:00

45 lines
1.4 KiB
Go

// Package shared 提供跨包共享的应用级状态。
package shared
import (
"sync"
"github.com/tamakyi/TamaBox/internal/i18n"
)
// AppState 保存应用级共享状态。
//
// 多语言体系(internal/i18n)对每个请求按 cookie / 用户配置逐请求解析语言,
// 本类型只承担一个职责:站点默认语言(兜底值)。
// 访客既无 lang cookie、登录用户也未配置语言时,使用 AppState 中的默认语言。
type AppState struct {
mu sync.RWMutex
lang string
}
// NewAppState 返回默认语言为 i18n.Default(简体中文)的应用状态。
func NewAppState() *AppState {
return &AppState{lang: i18n.Default}
}
// SetLang 设置站点默认语言。
// 内部统一走 i18n.Resolve 归一化(zh_hk / zh-hant / en-us 等变体都会映射到规范代码),
// 未知语言代码自动回退到 i18n.Default,保证 lang 始终是字典可查的规范代码。
func (s *AppState) SetLang(lang string) {
s.mu.Lock()
defer s.mu.Unlock()
s.lang = i18n.Resolve(lang)
}
// Lang 返回当前站点默认语言(始终为规范语言代码,如 "zh-CN" / "zh-TW" / "en" / "ja")。
func (s *AppState) Lang() string {
s.mu.RLock()
defer s.mu.RUnlock()
return s.lang
}
// App 是应用级共享状态单例。
// 服务启动时(cmd/web.go)依据配置 default_lang 调用 App.SetLang 初始化;
// 运行期也可由管理功能调用 SetLang 动态调整站点默认语言。
var App = NewAppState()