0904
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
// 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()
|
||||
Reference in New Issue
Block a user