Files

1112 lines
40 KiB
C#
Raw Permalink Normal View History

2026-09-09 19:21:21 +08:00
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
{
/// <summary>
/// 全局语言管理器 UpperComputerSystem.Language.MsgResources
/// </summary>
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<string, string> translationCache = new Dictionary<string, string>();
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;
}
}
/// <summary>
/// 窗口控件翻译
/// </summary>
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);
}
}
}
/// <summary>
/// Winform 默认DataGridView控件
/// </summary>
/// <param name="dgv"></param>
/// <param name="formName"></param>
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;
}
}
}
}
/// <summary>
/// 电表控件
/// </summary>
/// <param name="control"></param>
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;
}
}
}
}
/// <summary>
/// 更新 DataGridView 的列标题
/// </summary>
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}");
}
}
/// <summary>
///
/// </summary>
/// <param name="table"></param>
/// <param name="formName"></param>
/// <param name="controlName"></param>
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();
}
}
/// <summary>
/// Updates the text and tooltips of status strip items based on the current language settings.
/// </summary>
/// <param name="statusStrip">The status strip control to update</param>
/// <param name="formName">The name of the form containing the status strip</param>
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);
}
}
/// <summary>
/// Updates text for a single status strip item
/// </summary>
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);
}
}
/// <summary>
/// Updates text for dropdown items
/// </summary>
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;
}
}
}
}
/// <summary>
/// Builds the resource key for language lookup
/// </summary>
private string BuildResourceKey(string formName, string tag, string propertyName)
{
return $"{formName}_StatusStrip_{tag}_{propertyName}";
}
/// <summary>
/// Table控件
/// </summary>
/// <param name="table"></param>
/// <param name="formName"></param>
/// <param name="controlName"></param>
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();
}
}
/// <summary>
/// 侧边导航栏
/// </summary>
/// <param name="sidebarNavigation"></param>
/// <param name="formName"></param>
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<AntdUI.Button>()
.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);
}
}
/// <summary>
/// UserControl控件翻译
/// </summary>
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);
}
// 可以在这里添加更多特定控件类型的处理
}
/// <summary>
/// 更新 DataGridView 的列标题
/// </summary>
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}");
}
}
/// <summary>
/// Table控件
/// </summary>
/// <param name="table"></param>
/// <param name="formName"></param>
/// <param name="controlName"></param>
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();
}
}
/// <summary>
/// 遍历Tabs中所有TabPage的所有控件
/// </summary>
/// <param name="tabs">要遍历的Tabs控件</param>
/// <param name="action">对每个控件执行的操作</param>
public static void ForEachControl(AntdUI.Tabs tabs, Action<Control> action)
{
if (tabs?.Pages == null) return;
foreach (AntdUI.TabPage page in tabs.Pages)
{
// 遍历当前页面的所有控件
ForEachControlRecursive(page, action);
}
}
/// <summary>
/// 遍历指定TabPage中的所有控件(包括子控件)
/// </summary>
/// <param name="page">要遍历的TabPage</param>
/// <param name="action">对每个控件执行的操作</param>
public static void ForEachControl(AntdUI.TabPage page, Action<Control> action)
{
ForEachControlRecursive(page, action);
}
/// <summary>
/// 递归遍历控件树
/// </summary>
private static void ForEachControlRecursive(Control control, Action<Control> action)
{
// 执行操作
action(control);
// 递归遍历子控件
foreach (Control child in control.Controls)
{
ForEachControlRecursive(child, action);
}
}
#region tabs
/// <summary>
/// 为Tabs控件及其所有子控件更新语言
/// </summary>
/// <param name="tabs">要更新的Tabs控件</param>
/// <param name="formName">窗体名称</param>
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);
}
}
/// <summary>
/// 递归更新控件树中所有控件的语言
/// </summary>
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);
}
}
}
/// <summary>
/// 更新单个控件的语言
/// </summary>
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;
}
}
/// <summary>
/// 更新DataGridView的列标题语言
/// </summary>
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;
}
}
}
/// <summary>
/// 更新ComboBox的项目语言
/// </summary>
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;
}
}
}
/// <summary>
/// 获取控件的完整资源键
/// </summary>
public static string GetResourceKey(Control control, string formName, string tabsName, string pageName, string suffix)
{
return $"{formName}_{tabsName}_{pageName}_{control.Name}{suffix}";
}
/// <summary>
/// 更新Tabs及其所有子控件的语言
/// </summary>
/// <param name="tabs">Tabs控件</param>
/// <param name="formName">窗体名称</param>
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;
}
}
}
/// <summary>
/// 获取控件及其所有子控件
/// </summary>
private static IEnumerable<Control> GetAllControls(Tabs tabs)
{
var controls = new List<Control>();
foreach (AntdUI.TabPage page in tabs.Pages)
{
controls.Add(page); // 添加TabPage本身
controls.AddRange(GetChildControls(page));
}
return controls;
}
/// <summary>
/// 递归获取子控件
/// </summary>
private static IEnumerable<Control> GetChildControls(Control control)
{
var controls = new List<Control>();
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
{
/// <summary>
///
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
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;
}
}
}