#region
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
using CSFrameworkV5.Core;
#endregion
namespace CSFrameworkV5.Language
{
public class LanTool
{
//不设置语言的组件(.NET组件)
private const string WITHOUT_CONTROLS_NET =
"TextBox,PictureBox,ImageList,ContextMenuStrip,MenuStrip,";
//不设置语言的组件(Dev组件)
private const string WITHOUT_CONTROLS_DEV =
"TextEdit,DateEdit,PictureEdit,ComboBoxEdit,LookUpEdit,ImageListBoxControl,GridControl,PanelControl,GroupControl,TableLayoutPanel,SplitterControl,TreeList,BarDockControl,DockPanel,XtraTabControl,TreeView,";
///
/// 获取控件或组件的显示文本,如:.Text,.Caption属性的值
///
///
///
private static string GetControlText(object ctrl)
{
var type = ctrl.GetType();
var pinfo =
type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var info in pinfo)
if (info.Name.ToUpper() == "TEXT" ||
info.Name.ToUpper() == "CAPTION")
{
var o = info.GetValue(ctrl, null);
return o == null ? "" : o.ToStringEx();
}
return string.Empty;
}
///
/// 判断控件是否可以设置多语言
///
///
///
private static bool IsLanguageControl(object ctrl)
{
if ((ctrl != null && ctrl is Control) || ctrl is Component)
{
var type = ctrl.GetType();
var pinfo =
type.GetProperties(BindingFlags.Instance |
BindingFlags.Public);
foreach (var info in pinfo)
if (info.Name.ToUpper() == "TEXT" ||
info.Name.ToUpper() == "CAPTION")
return true;
}
return false;
}
///
/// 判断当前组件是否需要设置语言
///
///
///
private static bool IsWithoutControl(object ctrl)
{
if (ctrl == null) return false;
var name = ctrl.GetType().FullName.ToLower() + ".";
var withouts =
(WITHOUT_CONTROLS_NET + "," + WITHOUT_CONTROLS_DEV + ",")
.ToLower();
var exists = withouts.Split(',')
.Where(e => name.IndexOf("." + e + ".") >= 0).FirstOrDefault();
return !string.IsNullOrWhiteSpace(exists);
}
///
/// 设置控件或组件的显示文本,如:.Text,.Caption属性的值
///
///
///
private static bool SetControlText(object ctrl, string text)
{
var type = ctrl.GetType();
var pinfo =
type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var info in pinfo)
if (info.Name.ToUpper() == "TEXT" ||
info.Name.ToUpper() == "CAPTION")
{
//若设置值报错,请添加此控件类型到常量定义:WITHOUT_CONTROLS_DEV,WITHOUT_CONTROLS_NET
info.SetValue(ctrl, text, null);
return true;
}
return false;
}
///
/// 设置窗体的语言,枚举窗体的成员,字段设置语言
///
///
public static void SetLanguage(Form form)
{
var mType = form.GetType();
var fields = mType.GetFields(
BindingFlags.Instance | /*为了获取返回值,必须指定 BindingFlags.Instance*/
BindingFlags.DeclaredOnly |
BindingFlags.NonPublic | /*获取窗体上拖放的控件Private*/
BindingFlags.Public |
BindingFlags.CreateInstance);
string lan;
string id;
string defaultText;
object ctrl;
for (var i = 0; i < fields.Length; i++)
{
ctrl = fields[i].GetValue(form); //根据类型取组件对象
if (ctrl == null) continue;
//仅自动处理控件、组件的多语言
if (IsLanguageControl(ctrl) == false) continue;
if (IsWithoutControl(ctrl)) continue;
//注意:窗体中组件的语言标识必须是【窗体的命名空间】+【组件名称】
id = mType.FullName + "." + fields[i].Name;
defaultText = GetControlText(ctrl); //获取控件或组件的显示文本
lan = LanLib.Get(LanLib.Current, id, defaultText); //获取语言库资料
//设置语言
if (lan != defaultText && !string.IsNullOrWhiteSpace(lan))
SetControlText(ctrl, lan);
}
}
}
}