using System; using System.Configuration; using System.Globalization; using XP.Common.Localization.Enums; using XP.Common.Localization.Interfaces; using XP.Common.Logging.Interfaces; namespace XP.Common.Localization.Configs { /// /// 本地化配置实现 | Localization configuration implementation /// 使用 App.config 存储语言设置 | Uses App.config to store language settings /// public class LocalizationConfig : ILocalizationConfig { private const string LanguageKey = "Language"; private readonly ILoggerService _logger; /// /// 构造函数 | Constructor /// /// 日志服务 | Logger service public LocalizationConfig(ILoggerService logger) { _logger = (logger ?? throw new ArgumentNullException(nameof(logger))).ForModule(); } /// /// 获取保存的语言设置 | Get saved language setting /// /// 语言设置,如果未设置则返回 null | Language setting, or null if not set public SupportedLanguage? GetSavedLanguage() { try { var languageString = ConfigurationManager.AppSettings[LanguageKey]; if (string.IsNullOrWhiteSpace(languageString)) { _logger.Info("No saved language setting found in configuration"); return null; } if (Enum.TryParse(languageString, true, out var language)) { _logger.Info($"Loaded saved language setting: {language}"); return language; } _logger.Warn($"Invalid language setting in configuration: '{languageString}'. Expected values: ZhCN, ZhTW, EnUS"); return null; } catch (ConfigurationErrorsException ex) { _logger.Error(ex, "Configuration error while reading language setting"); return null; } catch (Exception ex) { _logger.Error(ex, "Unexpected error while reading saved language setting"); return null; } } /// /// 保存语言设置 | Save language setting /// /// 要保存的语言 | Language to save public void SaveLanguage(SupportedLanguage language) { try { var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var appSettings = config.AppSettings.Settings; var languageValue = language.ToString(); if (appSettings[LanguageKey] == null) { appSettings.Add(LanguageKey, languageValue); _logger.Info($"Added new language setting to configuration: {language}"); } else { appSettings[LanguageKey].Value = languageValue; _logger.Info($"Updated language setting in configuration: {language}"); } config.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection("appSettings"); _logger.Info($"Successfully saved language setting: {language}"); } catch (ConfigurationErrorsException ex) { _logger.Error(ex, $"Configuration error while saving language setting: {language}"); throw new InvalidOperationException($"Failed to save language setting to configuration file: {ex.Message}", ex); } catch (UnauthorizedAccessException ex) { _logger.Error(ex, $"Access denied while saving language setting: {language}"); throw new InvalidOperationException("Access denied to configuration file. Please check file permissions.", ex); } catch (Exception ex) { _logger.Error(ex, $"Unexpected error while saving language setting: {language}"); throw new InvalidOperationException($"Failed to save language setting: {ex.Message}", ex); } } /// /// 获取系统默认语言 | Get system default language /// /// 系统默认语言 | System default language public SupportedLanguage GetSystemDefaultLanguage() { try { var systemCulture = CultureInfo.CurrentUICulture.Name; _logger.Info($"Detecting system default language from culture: {systemCulture}"); var defaultLanguage = systemCulture switch { "zh-CN" => SupportedLanguage.ZhCN, "zh-TW" or "zh-HK" or "zh-MO" => SupportedLanguage.ZhTW, "en-US" or "en" => SupportedLanguage.EnUS, _ when systemCulture.StartsWith("zh", StringComparison.OrdinalIgnoreCase) => SupportedLanguage.ZhCN, _ when systemCulture.StartsWith("en", StringComparison.OrdinalIgnoreCase) => SupportedLanguage.EnUS, _ => SupportedLanguage.ZhCN // 默认简体中文 | Default to Simplified Chinese }; _logger.Info($"System default language determined: {defaultLanguage} (from culture: {systemCulture})"); return defaultLanguage; } catch (Exception ex) { _logger.Error(ex, "Error while detecting system default language, falling back to ZhCN"); return SupportedLanguage.ZhCN; // 默认简体中文 | Default to Simplified Chinese } } } }