fscan/Common/i18n/manager.go
ZacharyZcR a850e141fc refactor: 封装i18n为独立包,优化国际化架构
- 新建Common/i18n/子包,提供专业的国际化管理
- i18n/manager.go: 线程安全的国际化管理器,支持动态语言切换
- i18n/messages.go: 完整的消息库,200+条国际化文本
- 重构Common/i18n.go为向后兼容层,引用新i18n包
- 支持多语言回退机制和消息格式化功能
- 提供统一的国际化接口,便于维护和扩展

架构优势:
- 模块化设计: 独立的i18n包,职责单一
- 线程安全: 支持并发访问的国际化管理器
- 灵活配置: 支持动态语言切换和消息管理
- 向后兼容: 100%兼容现有GetText()调用
- 易于扩展: 支持新语言和消息的动态添加

使项目国际化架构更加整洁和专业化
2025-08-05 21:13:23 +08:00

346 lines
8.2 KiB
Go

package i18n
import (
"fmt"
"sync"
)
/*
manager.go - 国际化管理器
提供统一的国际化文本管理,支持多语言动态切换,
包含完整的消息库和高效的文本查询机制。
*/
// =============================================================================
// 常量定义
// =============================================================================
// 支持的语言常量
const (
LangZH = "zh" // 中文
LangEN = "en" // 英文
)
// 默认配置
const (
DefaultLanguage = LangZH // 默认语言
FallbackLanguage = LangEN // 回退语言
)
// =============================================================================
// 国际化管理器
// =============================================================================
// Manager 国际化管理器
type Manager struct {
mu sync.RWMutex
currentLanguage string
fallbackLanguage string
messages map[string]map[string]string
enabled bool
}
// 全局管理器实例
var globalManager = NewManager()
// NewManager 创建新的国际化管理器
func NewManager() *Manager {
return &Manager{
currentLanguage: DefaultLanguage,
fallbackLanguage: FallbackLanguage,
messages: make(map[string]map[string]string),
enabled: true,
}
}
// =============================================================================
// 基础管理方法
// =============================================================================
// SetLanguage 设置当前语言
func (m *Manager) SetLanguage(lang string) {
m.mu.Lock()
defer m.mu.Unlock()
m.currentLanguage = lang
}
// GetLanguage 获取当前语言
func (m *Manager) GetLanguage() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.currentLanguage
}
// SetFallbackLanguage 设置回退语言
func (m *Manager) SetFallbackLanguage(lang string) {
m.mu.Lock()
defer m.mu.Unlock()
m.fallbackLanguage = lang
}
// Enable 启用国际化
func (m *Manager) Enable() {
m.mu.Lock()
defer m.mu.Unlock()
m.enabled = true
}
// Disable 禁用国际化
func (m *Manager) Disable() {
m.mu.Lock()
defer m.mu.Unlock()
m.enabled = false
}
// IsEnabled 检查是否启用国际化
func (m *Manager) IsEnabled() bool {
m.mu.RLock()
defer m.mu.RUnlock()
return m.enabled
}
// =============================================================================
// 消息管理方法
// =============================================================================
// AddMessage 添加单个消息
func (m *Manager) AddMessage(key string, translations map[string]string) {
m.mu.Lock()
defer m.mu.Unlock()
m.messages[key] = translations
}
// AddMessages 批量添加消息
func (m *Manager) AddMessages(messages map[string]map[string]string) {
m.mu.Lock()
defer m.mu.Unlock()
for key, translations := range messages {
m.messages[key] = translations
}
}
// GetMessage 获取指定键和语言的消息
func (m *Manager) GetMessage(key, lang string) (string, bool) {
m.mu.RLock()
defer m.mu.RUnlock()
if translations, exists := m.messages[key]; exists {
if message, exists := translations[lang]; exists {
return message, true
}
}
return "", false
}
// HasMessage 检查是否存在指定键的消息
func (m *Manager) HasMessage(key string) bool {
m.mu.RLock()
defer m.mu.RUnlock()
_, exists := m.messages[key]
return exists
}
// GetAllMessages 获取所有消息
func (m *Manager) GetAllMessages() map[string]map[string]string {
m.mu.RLock()
defer m.mu.RUnlock()
// 创建深拷贝
result := make(map[string]map[string]string)
for key, translations := range m.messages {
result[key] = make(map[string]string)
for lang, message := range translations {
result[key][lang] = message
}
}
return result
}
// GetMessageCount 获取消息总数
func (m *Manager) GetMessageCount() int {
m.mu.RLock()
defer m.mu.RUnlock()
return len(m.messages)
}
// GetSupportedLanguages 获取支持的语言列表
func (m *Manager) GetSupportedLanguages() []string {
m.mu.RLock()
defer m.mu.RUnlock()
languageSet := make(map[string]bool)
for _, translations := range m.messages {
for lang := range translations {
languageSet[lang] = true
}
}
languages := make([]string, 0, len(languageSet))
for lang := range languageSet {
languages = append(languages, lang)
}
return languages
}
// =============================================================================
// 文本获取方法
// =============================================================================
// GetText 获取国际化文本(支持格式化)
func (m *Manager) GetText(key string, args ...interface{}) string {
if !m.IsEnabled() {
// 如果禁用国际化,返回原始键名
if len(args) > 0 {
return fmt.Sprintf(key, args...)
}
return key
}
m.mu.RLock()
currentLang := m.currentLanguage
fallbackLang := m.fallbackLanguage
m.mu.RUnlock()
// 尝试获取当前语言的消息
if message, exists := m.GetMessage(key, currentLang); exists {
if len(args) > 0 {
return fmt.Sprintf(message, args...)
}
return message
}
// 回退到回退语言
if currentLang != fallbackLang {
if message, exists := m.GetMessage(key, fallbackLang); exists {
if len(args) > 0 {
return fmt.Sprintf(message, args...)
}
return message
}
}
// 如果都没找到,返回键名作为兜底
if len(args) > 0 {
return fmt.Sprintf(key, args...)
}
return key
}
// GetTextWithLanguage 获取指定语言的文本
func (m *Manager) GetTextWithLanguage(key, lang string, args ...interface{}) string {
if !m.IsEnabled() {
if len(args) > 0 {
return fmt.Sprintf(key, args...)
}
return key
}
if message, exists := m.GetMessage(key, lang); exists {
if len(args) > 0 {
return fmt.Sprintf(message, args...)
}
return message
}
// 如果指定语言没找到,使用回退语言
m.mu.RLock()
fallbackLang := m.fallbackLanguage
m.mu.RUnlock()
if lang != fallbackLang {
if message, exists := m.GetMessage(key, fallbackLang); exists {
if len(args) > 0 {
return fmt.Sprintf(message, args...)
}
return message
}
}
// 兜底返回键名
if len(args) > 0 {
return fmt.Sprintf(key, args...)
}
return key
}
// =============================================================================
// 全局访问函数
// =============================================================================
// GetGlobalManager 获取全局国际化管理器
func GetGlobalManager() *Manager {
return globalManager
}
// SetLanguage 设置全局语言
func SetLanguage(lang string) {
globalManager.SetLanguage(lang)
}
// GetLanguage 获取全局当前语言
func GetLanguage() string {
return globalManager.GetLanguage()
}
// AddMessage 添加消息到全局管理器
func AddMessage(key string, translations map[string]string) {
globalManager.AddMessage(key, translations)
}
// AddMessages 批量添加消息到全局管理器
func AddMessages(messages map[string]map[string]string) {
globalManager.AddMessages(messages)
}
// GetText 从全局管理器获取国际化文本
func GetText(key string, args ...interface{}) string {
return globalManager.GetText(key, args...)
}
// GetTextWithLanguage 从全局管理器获取指定语言文本
func GetTextWithLanguage(key, lang string, args ...interface{}) string {
return globalManager.GetTextWithLanguage(key, lang, args...)
}
// Enable 启用全局国际化
func Enable() {
globalManager.Enable()
}
// Disable 禁用全局国际化
func Disable() {
globalManager.Disable()
}
// IsEnabled 检查全局国际化是否启用
func IsEnabled() bool {
return globalManager.IsEnabled()
}
// HasMessage 检查全局管理器是否存在指定消息
func HasMessage(key string) bool {
return globalManager.HasMessage(key)
}
// GetMessageCount 获取全局消息总数
func GetMessageCount() int {
return globalManager.GetMessageCount()
}
// GetSupportedLanguages 获取全局支持的语言列表
func GetSupportedLanguages() []string {
return globalManager.GetSupportedLanguages()
}
// =============================================================================
// 初始化函数
// =============================================================================
// init 初始化全局国际化管理器
func init() {
// 设置默认配置
globalManager.SetLanguage(DefaultLanguage)
globalManager.SetFallbackLanguage(FallbackLanguage)
globalManager.Enable()
}