using System; using System.Collections.Generic; using System.IO; using System.Linq; using Newtonsoft.Json; namespace TeamAAS.Localization { /// /// 全局多语言管理器 - 支持使用原文(中文/英文等)作为查找 key /// public class GlobalLocalizationManager { private static readonly Lazy _instance = new Lazy(() => new GlobalLocalizationManager()); public static GlobalLocalizationManager Instance => _instance.Value; private readonly Dictionary _languagePacks = new Dictionary(); private string _currentLanguage = "zh-CN"; // 默认中文 private string _fallbackLanguage = "zh-CN"; // 回退语言(用于查找 key) /// /// 当前语言(如 "zh-CN", "en-US", "ja-JP") /// public string CurrentLanguage { get => _currentLanguage; set { if (_currentLanguage != value) { _currentLanguage = value; LanguageChanged?.Invoke(this, EventArgs.Empty); } } } /// /// 回退语言(用于反向查找原文对应的 key)- 通常是中文 /// public string FallbackLanguage { get => _fallbackLanguage; set => _fallbackLanguage = value; } /// /// 语言切换事件 /// public event EventHandler LanguageChanged; /// /// 已加载的语言列表 /// public IReadOnlyList AvailableLanguages => _languagePacks.Keys.ToList(); private GlobalLocalizationManager() { } public string GetLanguageName(string languageCode) { if (_languagePacks.TryGetValue(languageCode, out var pack)) { return pack.LanguageName; } return languageCode; // 如果没有找到,返回语言代码 } /// /// 从指定目录加载所有语言包(.json 人类可读格式) /// /// 多语言资源目录,如 "Localization" public void LoadLanguagePacks(string localizationDirectory) { if (!Directory.Exists(localizationDirectory)) { Directory.CreateDirectory(localizationDirectory); return; } _languagePacks.Clear(); var jsonFiles = Directory.GetFiles(localizationDirectory, "*.json", SearchOption.AllDirectories); foreach (var file in jsonFiles) { try { var json = File.ReadAllText(file); var pack = JsonConvert.DeserializeObject(json); if (pack != null && !string.IsNullOrWhiteSpace(pack.LanguageCode)) { _languagePacks[pack.LanguageCode] = pack; AppLogger.Info($"[Localization] 已加载 JSON 语言包: {pack.LanguageName} ({pack.LanguageCode}) - {file}"); } } catch (Exception ex) { AppLogger.Error($"[Localization] 加载 JSON 语言包失败: {file} - {ex.Message}"); } } } /// /// 添加单个语言包(支持运行时动态添加) /// public void AddLanguagePack(LanguageResourcePack pack) { if (pack == null || string.IsNullOrWhiteSpace(pack.LanguageCode)) return; _languagePacks[pack.LanguageCode] = pack; } /// /// 翻译文本 - 使用原文作为 key 查找翻译 /// /// 原文(如"相机设备") /// 可选的上下文信息(如类型名、属性名等) /// 翻译后的文本,如果没有找到则返回原文 public string Translate(string originalText, string context = null) { if (string.IsNullOrWhiteSpace(originalText)) return originalText; // 如果当前语言就是回退语言(中文),直接返回原文 if (_currentLanguage == _fallbackLanguage) return originalText; // 从当前语言包查找翻译 if (_languagePacks.TryGetValue(_currentLanguage, out var pack)) { var translation = pack.GetTranslationByOriginalText(originalText, context); if (!string.IsNullOrWhiteSpace(translation)) return translation; } // 找不到翻译,返回原文 return originalText; } /// /// 获取属性的显示名称翻译 /// /// 类型名称 /// 属性名称 /// 原始显示名称(来自 [DisplayName] 特性) public string GetPropertyDisplayName(string typeName, string propertyName, string originalDisplayName) { return Translate(originalDisplayName, $"{typeName}.{propertyName}.DisplayName"); } /// /// 获取属性的描述翻译 /// public string GetPropertyDescription(string typeName, string propertyName, string originalDescription) { return Translate(originalDescription, $"{typeName}.{propertyName}.Description"); } /// /// 获取属性的分类翻译 /// public string GetPropertyCategory(string typeName, string propertyName, string originalCategory) { return Translate(originalCategory, $"{typeName}.{propertyName}.Category"); } /// /// 获取插件的显示名称翻译 /// public string GetPluginDisplayName(string pluginId, string originalDisplayName) { return Translate(originalDisplayName, $"Plugin.{pluginId}.DisplayName"); } /// /// 获取插件的描述翻译 /// public string GetPluginDescription(string pluginId, string originalDescription) { return Translate(originalDescription, $"Plugin.{pluginId}.Description"); } /// /// 获取插件类别的翻译 /// public string GetPluginCategoryName(string originalCategory) { return Translate(originalCategory, "PluginCategory"); } /// /// 获取枚举值的翻译 /// public string GetEnumDisplayName(string enumTypeName, string originalEnumValue) { return Translate(originalEnumValue, $"Enum.{enumTypeName}"); } /// /// 获取通用UI文本翻译 /// public string GetUIText(string originalText) { return Translate(originalText, "UI"); } } }