mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

- 新建Common/i18n/子包,提供专业的国际化管理 - i18n/manager.go: 线程安全的国际化管理器,支持动态语言切换 - i18n/messages.go: 完整的消息库,200+条国际化文本 - 重构Common/i18n.go为向后兼容层,引用新i18n包 - 支持多语言回退机制和消息格式化功能 - 提供统一的国际化接口,便于维护和扩展 架构优势: - 模块化设计: 独立的i18n包,职责单一 - 线程安全: 支持并发访问的国际化管理器 - 灵活配置: 支持动态语言切换和消息管理 - 向后兼容: 100%兼容现有GetText()调用 - 易于扩展: 支持新语言和消息的动态添加 使项目国际化架构更加整洁和专业化
346 lines
8.2 KiB
Go
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()
|
|
} |