// 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()