#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,";
|
|
/// <summary>
|
/// 获取控件或组件的显示文本,如:.Text,.Caption属性的值
|
/// </summary>
|
/// <param name="ctrl"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 判断控件是否可以设置多语言
|
/// </summary>
|
/// <param name="ctrl"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 判断当前组件是否需要设置语言
|
/// </summary>
|
/// <param name="ctrl"></param>
|
/// <returns></returns>
|
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);
|
}
|
|
/// <summary>
|
/// 设置控件或组件的显示文本,如:.Text,.Caption属性的值
|
/// </summary>
|
/// <param name="ctrl"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 设置窗体的语言,枚举窗体的成员,字段设置语言
|
/// </summary>
|
/// <param name="form"></param>
|
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);
|
}
|
}
|
}
|
}
|