using AntdUI; using Controls; using JinYuan.ControlLib; using System; using System.Collections.Generic; using System.Configuration; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Resources; using System.Threading; using System.Windows.Forms; namespace Language { /// /// 全局语言管理器 UpperComputerSystem.Language.MsgResources /// public static class LanguageManager { public static ResourceManager rm = new ResourceManager("Language.Languages", typeof(LanguageManager).Assembly); private static CultureInfo currentCulture = CultureInfo.CurrentUICulture; public static event EventHandler LanguageChanged; public static string LanguageCode = "zh";//默认中文 private static Dictionary translationCache = new Dictionary(); static LanguageManager() { // 在静态构造函数中加载保存的语言设置 LoadSavedLanguage(); } public static void ChangeLanguage(string languageCode) { LanguageCode = languageCode; currentCulture = new CultureInfo(languageCode); Thread.CurrentThread.CurrentUICulture = currentCulture; translationCache.Clear(); SaveLanguagePreference(languageCode); LanguageChanged?.Invoke(null, EventArgs.Empty); } public static string GetString(string key) { if (translationCache.TryGetValue(key, out string cachedResult)) { return cachedResult; } string result = rm.GetString(key, currentCulture); if (result != null) { translationCache[key] = result; } return result ?? key; } // 新增:GetLocalizedString 方法,支持带参数的本地化字符串 public static string GetLocalizedString(string key, params object[] args) { string value = GetString(key); return args.Length > 0 ? string.Format(value, args) : value; } // 新增:获取本地化的星期名称数组 public static string[] WeekNames { get { return new string[] { GetString("Sunday"), GetString("Monday"), GetString("Tuesday"), GetString("Wednesday"), GetString("Thursday"), GetString("Friday"), GetString("Saturday") }; } } public static void LoadLanguageResource(string resourcePath) { ResourceManager newRm = new ResourceManager(resourcePath, typeof(LanguageManager).Assembly); rm = newRm; translationCache.Clear(); LanguageChanged?.Invoke(null, EventArgs.Empty); } // 新增:保存语言偏好 private static void SaveLanguagePreference(string languageCode) { try { var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); var settings = configFile.AppSettings.Settings; if (settings["PreferredLanguage"] == null) { settings.Add("PreferredLanguage", languageCode); } else { settings["PreferredLanguage"].Value = languageCode; } configFile.Save(ConfigurationSaveMode.Modified); ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); } catch (ConfigurationErrorsException ex) { Console.WriteLine($"Error writing app settings: {ex.Message}"); // 考虑记录错误或通知用户 } catch (IOException ex) { Console.WriteLine($"Error accessing configuration file: {ex.Message}"); // 考虑记录错误或通知用户 } } // 新增:加载保存的语言设置 private static void LoadSavedLanguage() { try { string savedLanguage = ConfigurationManager.AppSettings["PreferredLanguage"]; if (!string.IsNullOrEmpty(savedLanguage)) { ChangeLanguage(savedLanguage); } } catch (ConfigurationErrorsException ex) { Console.WriteLine($"Error reading app settings: {ex.Message}"); // 考虑记录错误或使用默认语言 } } // 新增:获取当前语言代码 public static string GetCurrentLanguage() { return currentCulture.Name; } } /// /// 窗口控件翻译 /// public class MultiLanguageForm : AntdUI.Window { public MultiLanguageForm() { LanguageManager.LanguageChanged += OnLanguageChanged; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); UpdateUILanguage(); } protected virtual void OnLanguageChanged(object sender, EventArgs e) { UpdateUILanguage(); } protected virtual void UpdateUILanguage() { UpdateControlsText(this); } protected void UpdateControlsText(Control control) { UpdateControlProperties(control); foreach (Control childControl in control.Controls) { UpdateControlsText(childControl); } } protected void UpdateControlProperties(Control control) { string formName = this.Name; string controlName = control.Name; if (!string.IsNullOrEmpty(control.Name)) { // 更新 Text 属性 UpdateProperty(control, "Text", formName, controlName, "_Text"); if (control is NaviButton2 naviButton) { UpdateControlText(control, formName); } // 处理特定类型的控件 else if (control is AntdUI.Button antdButton) { UpdateProperty(antdButton, "Text", formName, controlName, "_Text"); } else if (control is AntdUI.Label label) { UpdateProperty(label, "Text", formName, controlName, "_Text"); } else if (control is AntdUI.Input antdInput) { UpdateProperty(antdInput, "PlaceholderText", formName, controlName, "_Placeholder"); } else if (control is AntdUI.Steps steps) { UpdateStepsTitle(steps, formName, controlName); } else if (control is StatusStrip status) { UpdateStatusStripItems(status, formName); } else if (control is AntdUI.PageHeader antdWindowBar) { UpdateProperty(antdWindowBar, "Text", formName, controlName, "_Text"); } else if (control is AntdUI.Table antdTable) { UpdateTableColumns(antdTable, formName, controlName); } else if (control is TitleTime titleTime) { UpdateProperty(titleTime, "TitleName", formName, controlName, "_TitleName"); } else if (control is Title title) { UpdateProperty(title, "TitleName", formName, controlName, "_TitleName"); } else if (control is LongTitleStyle2 longTitleStyle) { UpdateProperty(longTitleStyle, "TitleName", formName, controlName, "_TitleName"); } if (control is DataGridView dgv) { UpdateDataGridViewLanguage(dgv, formName); } if (control is ListView listView) { UpdateListViewLanguage(listView, formName); } if (control is UCElectricityMeterV) // 假设 EyMaterH1 是您自定义控件的类型 { LocalizeCustomControl(control, formName); } // 可以在这里添加更多特定控件类型的处理 // 更新控件的 ToolTipText 属性 //else if (control is SidebarNavigation antdSidebarNavigation) //{ // UpdateSidebarNavigationItems(antdSidebarNavigation, formName); //} //else if (control is CustomComboBox antdCustomComboBox) //{ // UpdateProperty(antdCustomComboBox, "WatermarkText", formName, controlName, "_WatermarkText"); //} //else if (control is CustomGroupBox antdCustomGroupBox) //{ // UpdateProperty(antdCustomGroupBox, "Text", formName, controlName, "_Text"); //} // 添加 CustomDataGridView 的处理 //else if (control is CustomDataGridView dataGridView) //{ // UpdateDataGridViewColumns(dataGridView, formName, controlName); //} } } protected void UpdateControlText(Control control, string formName) { string baseResourceKey = $"{formName}_{control.Name}"; // 尝试更新 Text 属性 //string textKey = $"{baseResourceKey}_Text"; //string translatedText = LanguageManager.GetString(textKey); //if (translatedText != textKey) // 如果找到了翻译 //{ // control.Text = translatedText; //} // 尝试更新 TitleName 属性 string titleNameKey = $"{baseResourceKey}_TitleName"; string translatedTitleName = LanguageManager.GetString(titleNameKey); if (translatedTitleName != titleNameKey) // 如果找到了翻译 { //control.Text = translatedText; var titleNameProperty = control.GetType().GetProperty("TitleName"); if (titleNameProperty != null && titleNameProperty.CanWrite) { titleNameProperty.SetValue(control, translatedTitleName); } } } /// /// Winform 默认DataGridView控件 /// /// /// protected void UpdateDataGridViewLanguage(DataGridView dgv, string formName) { foreach (DataGridViewColumn column in dgv.Columns) { if (!string.IsNullOrEmpty(column.Name)) { string resourceKey = $"{formName}_{dgv.Name}_{column.Name}Header"; string translatedHeader = LanguageManager.GetString(resourceKey); if (translatedHeader != resourceKey) // 如果找到了翻译 { column.HeaderText = translatedHeader; } } } } /// /// 电表控件 /// /// protected void LocalizeCustomControl(Control control, string formName) { Type controlType = control.GetType(); PropertyInfo[] properties = controlType.GetProperties(); if (formName == "FrmMonitor") { foreach (PropertyInfo property in properties) { if (property.PropertyType == typeof(string) && property.Name.StartsWith("Text")) { string propertyName = property.Name; string key = $"{formName}_{control.Name}_{propertyName}"; string localizedText = LanguageManager.GetString(key); if (!string.IsNullOrEmpty(localizedText)) { property.SetValue(control, localizedText); } } } } } protected void UpdateListViewLanguage(ListView listView, string formName) { //foreach (ColumnHeader column in listView.Columns) //{ // string key = $"{formName}_{listView.Name}_{column.Name}_Text"; // string localizedText = LanguageManager.GetString(key); // if (!string.IsNullOrEmpty(localizedText)) // { // column.Text = localizedText; // } //} if (formName != "FrmMain") { for (int i = 0; i < listView.Columns.Count; i++) { string key = $"{formName}_{listView.Name}_Column{i}_Text"; string localizedText = LanguageManager.GetString(key); if (!string.IsNullOrEmpty(localizedText)) { listView.Columns[i].Text = localizedText; } } } } /// /// 更新 DataGridView 的列标题 /// private void UpdateDataGridViewColumns(CustomDataGridView dataGridView, string formName, string controlName) { try { foreach (DataGridViewColumn column in dataGridView.Columns) { // 构建语言键:窗体名_控件名_Column_列名 //CommunicationEditForm_groupTable_Column_PlcNum string languageKey = $"{formName}_{controlName}_Column_{column.Name}"; // 获取翻译后的列标题 string translatedHeader = LanguageManager.GetString(languageKey); // 如果找到翻译,则更新列标题 if (!string.IsNullOrEmpty(translatedHeader) && translatedHeader != languageKey) { column.HeaderText = translatedHeader; } } // 如果需要翻译行标题(RowHeaders) if (dataGridView.RowHeadersVisible) { string rowHeaderKey = $"{formName}_{controlName}_RowHeader"; string translatedRowHeader = LanguageManager.GetString(rowHeaderKey); if (!string.IsNullOrEmpty(translatedRowHeader) && translatedRowHeader != rowHeaderKey) { dataGridView.RowHeadersDefaultCellStyle.Format = translatedRowHeader; } } } catch (Exception ex) { Debug.WriteLine($"Error updating DataGridView columns: {ex.Message}"); } } /// /// /// /// /// /// private void UpdateStepsTitle(AntdUI.Steps steps, string formName, string controlName) { if (steps.Items != null) { foreach (var item in steps.Items) { ///格式 MainForm_mySteps_Item_Title = "姓名" string resourceKey = $"{formName}_{controlName}_{item.Name}_Title"; string translatedTitle = LanguageManager.GetString(resourceKey); if (translatedTitle != resourceKey) { item.Title = translatedTitle; } } // 强制表格重新加载布局以应用新的标题 steps.Invalidate(); } } /// /// Updates the text and tooltips of status strip items based on the current language settings. /// /// The status strip control to update /// The name of the form containing the status strip public void UpdateStatusStripItems(StatusStrip statusStrip, string formName) { if (statusStrip == null || string.IsNullOrEmpty(formName)) return; try { //FrmMain_StatusStrip_Status_Text = "就绪" //FrmMain_StatusStrip_Progress_Text = "进度" //FrmMain_StatusStrip_MenuButton_Text = "选项" //FrmMain_StatusStrip_MenuButton_Option1_Text = "选项1" //FrmMain_StatusStrip_MenuButton_Option2_Text = "选项2" foreach (ToolStripItem item in statusStrip.Items) { UpdateStatusStripItem(item, formName); } // Force a redraw of the status strip statusStrip.Invalidate(); } catch (Exception ex) { //Logger.LogError($"Error updating status strip: {ex.Message}", ex); } } /// /// Updates text for a single status strip item /// private void UpdateStatusStripItem(ToolStripItem item, string formName) { if (item?.Name == null) return; // Update Text string textResourceKey = BuildResourceKey(formName, item.Name.ToString(), "Text"); string translatedText = LanguageManager.GetString(textResourceKey); if (!string.Equals(translatedText, textResourceKey, StringComparison.Ordinal)) { item.Text = translatedText; } // Handle nested items in dropdown buttons if (item is ToolStripDropDownButton dropDown) { UpdateDropDownItems(dropDown, formName); } } /// /// Updates text for dropdown items /// private void UpdateDropDownItems(ToolStripDropDownButton dropDown, string formName) { foreach (ToolStripItem dropDownItem in dropDown.DropDownItems) { if (dropDownItem?.Tag != null) { string itemResourceKey = BuildResourceKey(formName, $"{dropDown.Tag}_{dropDownItem.Tag}", "Text"); string translatedItemText = LanguageManager.GetString(itemResourceKey); if (!string.Equals(translatedItemText, itemResourceKey, StringComparison.Ordinal)) { dropDownItem.Text = translatedItemText; } } } } /// /// Builds the resource key for language lookup /// private string BuildResourceKey(string formName, string tag, string propertyName) { return $"{formName}_StatusStrip_{tag}_{propertyName}"; } /// /// Table控件 /// /// /// /// private void UpdateTableColumns(AntdUI.Table table, string formName, string controlName) { if (table.Columns != null) { foreach (var column in table.Columns) { ///格式 MainForm_myTable_ColumnName_Title = "姓名" string resourceKey = $"{formName}_{controlName}_{column.Key}_Title"; string translatedTitle = LanguageManager.GetString(resourceKey); if (translatedTitle != resourceKey) { column.Title = translatedTitle; } } // 强制表格重新加载布局以应用新的标题 table.LoadLayout(); } } /// /// 侧边导航栏 /// /// /// private void UpdateSidebarNavigationItems(SidebarNavigation sidebarNavigation, string formName) { foreach (var item in sidebarNavigation.GetItems()) { //资源文件内部Key格式如下 //FrmMain_SidebarItem_Home_Text = "Home" //FrmMain_SidebarItem_Statistics_Text = "Statistics" //FrmMain_SidebarItem_Search_Text = "Search" //FrmMain_SidebarItem_Recipe_Text = "Recipe" //FrmMain_SidebarItem_User_Text = "User" //FrmMain_SidebarItem_Settings_Text = "Settings" string resourceKey = $"{formName}_SidebarItem_{item.Tag}_Text"; string translatedText = LanguageManager.GetString(resourceKey); if (translatedText != resourceKey) { item.Text = translatedText; sidebarNavigation.UpdateButtonText(item.Tag, translatedText); // 查找对应的按钮并更新工具提示 var button = sidebarNavigation.Controls.OfType() .FirstOrDefault(b => b.Tag == item); if (button != null) { //sidebarNavigation.UpdateItemToolTip(button, translatedText); } } } // 强制 SidebarNavigation 重新绘制以显示更新后的文本 sidebarNavigation.Invalidate(); } private void UpdateProperty(object control, string propertyName, string formName, string controlName, string suffix) { string resourceKey = $"{formName}_{controlName}{suffix}"; string translatedValue = LanguageManager.GetString(resourceKey); if (translatedValue != resourceKey) { var property = control.GetType().GetProperty(propertyName); if (property != null && property.CanWrite) { property.SetValue(control, translatedValue); } } } protected override void Dispose(bool disposing) { if (disposing) { LanguageManager.LanguageChanged -= OnLanguageChanged; } base.Dispose(disposing); } } /// /// UserControl控件翻译 /// public class MultiLanguageUserControl : UserControl { public MultiLanguageUserControl() { LanguageManager.LanguageChanged += OnLanguageChanged; } protected override void OnLoad(EventArgs e) { base.OnLoad(e); UpdateUILanguage(); } protected virtual void OnLanguageChanged(object sender, EventArgs e) { UpdateUILanguage(); } protected virtual void UpdateUILanguage() { UpdateControlsText(this); } protected void UpdateControlsText(Control control) { UpdateControlProperties(control); foreach (Control childControl in control.Controls) { UpdateControlsText(childControl); } } protected void UpdateControlProperties(Control control) { string userControlName = this.Name; string controlName = control.Name; // 更新 Text 属性 UpdateProperty(control, "Text", userControlName, controlName, "_Text"); // 处理特定类型的控件 if (control is AntdUI.Button antdButton) { UpdateProperty(antdButton, "Text", userControlName, controlName, "_Text"); } else if (control is AntdUI.Label label) { UpdateProperty(label, "Text", userControlName, controlName, "_Text"); } else if (control is AntdUI.Input antdInput) { UpdateProperty(antdInput, "PlaceholderText", userControlName, controlName, "_Placeholder"); } else if (control is AntdUI.Tabs antdtabs) { UpdateTabsLanguage(antdtabs, userControlName); } else if (control is AntdUI.Table antdTable) { UpdateTableColumns(antdTable, userControlName, controlName); } else if (control is SidebarNavigation antdSidebarNavigation) { UpdateProperty(antdSidebarNavigation, "Text", userControlName, controlName, "_Text"); } else if (control is CustomComboBox antdCustomComboBox) { UpdateProperty(antdCustomComboBox, "WatermarkText", userControlName, controlName, "_WatermarkText"); } else if (control is CustomGroupBox antdCustomGroupBox) { UpdateProperty(antdCustomGroupBox, "Text", userControlName, controlName, "_Text"); } // 添加 CustomDataGridView 的处理 else if (control is CustomDataGridView dataGridView) { UpdateDataGridViewColumns(dataGridView, userControlName, controlName); } // 可以在这里添加更多特定控件类型的处理 } /// /// 更新 DataGridView 的列标题 /// private void UpdateDataGridViewColumns(CustomDataGridView dataGridView, string userControlName, string controlName) { try { foreach (DataGridViewColumn column in dataGridView.Columns) { // 构建语言键:窗体名_控件名_Column_列名 string languageKey = $"{userControlName}_{controlName}_Column_{column.Name}"; // 获取翻译后的列标题 string translatedHeader = LanguageManager.GetString(languageKey); // 如果找到翻译,则更新列标题 if (!string.IsNullOrEmpty(translatedHeader) && translatedHeader != languageKey) { column.HeaderText = translatedHeader; } } // 如果需要翻译行标题(RowHeaders) if (dataGridView.RowHeadersVisible) { string rowHeaderKey = $"{userControlName}_{controlName}_RowHeader"; string translatedRowHeader = LanguageManager.GetString(rowHeaderKey); if (!string.IsNullOrEmpty(translatedRowHeader) && translatedRowHeader != rowHeaderKey) { dataGridView.RowHeadersDefaultCellStyle.Format = translatedRowHeader; } } } catch (Exception ex) { Debug.WriteLine($"Error updating DataGridView columns: {ex.Message}"); } } /// /// Table控件 /// /// /// /// private void UpdateTableColumns(AntdUI.Table table, string formName, string controlName) { if (table.Columns != null) { foreach (var column in table.Columns) { ///格式 MainForm_myTable_ColumnName_Title = "姓名" string resourceKey = $"{formName}_{controlName}_{column.Key}_Title"; string translatedTitle = LanguageManager.GetString(resourceKey); if (translatedTitle != resourceKey) { column.Title = translatedTitle; } } // 强制表格重新加载布局以应用新的标题 table.LoadLayout(); } } /// /// 遍历Tabs中所有TabPage的所有控件 /// /// 要遍历的Tabs控件 /// 对每个控件执行的操作 public static void ForEachControl(AntdUI.Tabs tabs, Action action) { if (tabs?.Pages == null) return; foreach (AntdUI.TabPage page in tabs.Pages) { // 遍历当前页面的所有控件 ForEachControlRecursive(page, action); } } /// /// 遍历指定TabPage中的所有控件(包括子控件) /// /// 要遍历的TabPage /// 对每个控件执行的操作 public static void ForEachControl(AntdUI.TabPage page, Action action) { ForEachControlRecursive(page, action); } /// /// 递归遍历控件树 /// private static void ForEachControlRecursive(Control control, Action action) { // 执行操作 action(control); // 递归遍历子控件 foreach (Control child in control.Controls) { ForEachControlRecursive(child, action); } } #region tabs /// /// 为Tabs控件及其所有子控件更新语言 /// /// 要更新的Tabs控件 /// 窗体名称 public static void UpdateLanguage(Tabs tabs, string formName) { if (tabs?.Pages == null) return; foreach (AntdUI.TabPage page in tabs.Pages) { // 更新TabPage标题 UpdateControlLanguage(page, formName, tabs.Name, page.Name, "_Text"); // 递归更新所有子控件 UpdateControlsLanguageRecursive(page.Controls, formName, tabs.Name, page.Name); } } /// /// 递归更新控件树中所有控件的语言 /// private static void UpdateControlsLanguageRecursive(Control.ControlCollection controls, string formName, string tabsName, string pageName) { foreach (Control control in controls) { // 更新当前控件的文本 UpdateControlLanguage(control, formName, tabsName, pageName, "_Text"); // 针对特定类型控件的特殊处理 if (control is DataGridView grid) { UpdateDataGridViewLanguage(grid, formName, tabsName, pageName); } else if (control is AntdUI.Input input) { UpdateInPutLanguage(input, formName, tabsName, pageName); } else if (control is CustomComboBox combo) { UpdateComboBoxLanguage(combo, formName, tabsName, pageName); } else if (control is AntdUI.Table antdTable) { UpdateTableLanguage(antdTable, formName, tabsName, pageName); } // 可以添加其他特殊控件的处理... // 递归处理子控件 if (control.Controls.Count > 0) { UpdateControlsLanguageRecursive(control.Controls, formName, tabsName, pageName); } } } /// /// 更新单个控件的语言 /// private static void UpdateControlLanguage(Control control, string formName, string tabsName, string pageName, string suffix) { // 格式: FormName_TabsName_PageName_ControlName_Suffix {pageName}_ {tabsName}_ string resourceKey = $"{formName}_{tabsName}_{control.Name}{suffix}"; string translatedText = LanguageManager.GetString(resourceKey); // 只在资源存在时更新 if (translatedText != resourceKey) { control.Text = translatedText; } } private static void UpdateInPutLanguage(AntdUI.Input input, string formName, string tabsName, string pageName) { // 格式: FormName_TabsName_PageName_GridName_ColumnName_Title {pageName} string resourceKey = $"{formName}_{tabsName}_{input.Name}_Placeholder"; string translatedTitle = LanguageManager.GetString(resourceKey); if (translatedTitle != resourceKey) { input.PlaceholderText = translatedTitle; } } /// /// 更新DataGridView的列标题语言 /// private static void UpdateDataGridViewLanguage(DataGridView grid, string formName, string tabsName, string pageName) { foreach (DataGridViewColumn column in grid.Columns) { // 格式: FormName_TabsName_PageName_GridName_ColumnName_Title {pageName} string resourceKey = $"{formName}_{tabsName}_{grid.Name}_{column.Name}_Title"; string translatedTitle = LanguageManager.GetString(resourceKey); if (translatedTitle != resourceKey) { column.HeaderText = translatedTitle; } } } private static void UpdateTableLanguage(AntdUI.Table table, string formName, string tabsName, string pageName) { foreach (var column in table.Columns) { // 格式: FormName_TabsName_PageName_GridName_ColumnName_Title {pageName} //SettingControl_tabsSystemSet_configTable_PlcNum_Title string resourceKey = $"{formName}_{tabsName}_{table.Name}_{column.Key}_Title"; string translatedTitle = LanguageManager.GetString(resourceKey); if (translatedTitle != resourceKey) { column.Title = translatedTitle; } } } /// /// 更新ComboBox的项目语言 /// private static void UpdateComboBoxLanguage(CustomComboBox combo, string formName, string tabsName, string pageName) { // 如果ComboBox是数据绑定的,可能需要特殊处理 for (int i = 0; i < combo.Items.Count; i++) { //{pageName}_ string resourceKey = $"{formName}_{tabsName}_{combo.Name}_WatermarkText"; string translatedItem = LanguageManager.GetString(resourceKey); if (translatedItem != resourceKey) { combo.WatermarkText = translatedItem; } } } /// /// 获取控件的完整资源键 /// public static string GetResourceKey(Control control, string formName, string tabsName, string pageName, string suffix) { return $"{formName}_{tabsName}_{pageName}_{control.Name}{suffix}"; } /// /// 更新Tabs及其所有子控件的语言 /// /// Tabs控件 /// 窗体名称 public static void UpdateTabsLanguage(Tabs tabs, string formName) { if (tabs?.Pages == null) return; string tabsName = tabs.Name; foreach (Control control in GetAllControls(tabs)) { // 构建资源键基础部分 string baseKey = $"{formName}_{tabsName}_{control.Name}"; string text; // 根据控件类型更新对应的文本属性 switch (control) { case AntdUI.Input input: text = LanguageManager.GetString($"{baseKey}_Placeholder"); if (text != null) input.PlaceholderText = text; break; case CustomComboBox combo: text = LanguageManager.GetString($"{baseKey}_WatermarkText"); if (text != null) combo.WatermarkText = text; break; case DataGridView grid: foreach (DataGridViewColumn column in grid.Columns) { text = LanguageManager.GetString($"{baseKey}_{column.Name}_Title"); if (text != null) column.HeaderText = text; } break; case AntdUI.Table table: foreach (var column in table.Columns) { text = LanguageManager.GetString($"{baseKey}_{column.Key}_Title"); if (text != null) column.Title = text; } break; default: // 普通控件处理Text属性 text = LanguageManager.GetString($"{baseKey}_Text"); if (text != null) control.Text = text; break; } } } /// /// 获取控件及其所有子控件 /// private static IEnumerable GetAllControls(Tabs tabs) { var controls = new List(); foreach (AntdUI.TabPage page in tabs.Pages) { controls.Add(page); // 添加TabPage本身 controls.AddRange(GetChildControls(page)); } return controls; } /// /// 递归获取子控件 /// private static IEnumerable GetChildControls(Control control) { var controls = new List(); foreach (Control child in control.Controls) { controls.Add(child); controls.AddRange(GetChildControls(child)); } return controls; } #endregion private void UpdateProperty(object control, string propertyName, string userControlName, string controlName, string suffix) { string resourceKey = $"{userControlName}_{controlName}{suffix}"; string translatedValue = LanguageManager.GetString(resourceKey); if (translatedValue != resourceKey) { var property = control.GetType().GetProperty(propertyName); if (property != null && property.CanWrite) { property.SetValue(control, translatedValue); } } } protected override void Dispose(bool disposing) { if (disposing) { LanguageManager.LanguageChanged -= OnLanguageChanged; } base.Dispose(disposing); } } public static class StringExtensions { /// /// /// /// /// public static string Translated(this string key) { return LanguageManager.GetString(key); } public static string Translated(this string key, params object[] args) { string translatedString = LanguageManager.GetString(key); return args.Length > 0 ? string.Format(translatedString, args) : translatedString; } } }