使用单例模式封装了多语言处理类,json文件存储多语言关系,用后期用户可自行多语言翻译,每个页面初始化时添加多语言初始即可,自动把窗体内的所有控件进行多语言处理,可自定义对特殊控件的特殊处理,集中管理,方便快捷。
using Newtonsoft.Json;using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Windows.Forms;namespace GlobalizationTest.SystemSet{ public class LanguageManage { #region 单例模式 /// <summary> /// 定义一个静态变量来保存类的实例 /// </summary> private static LanguageManage uniqueInstance; /// <summary> /// 定义一个标识确保线程同步 /// </summary> private static readonly object locker = new object(); /// <summary> /// 构造函数 /// </summary> private LanguageManage() { try { if (!File.Exists(SystemConfig.LanguageFilePath)) { _lanDict = null; return; } string content = File.ReadAllText(SystemConfig.LanguageFilePath, Encoding.UTF8); if (string.IsNullOrEmpty(content)) { return; } _lanDict = JsonConvert.DeserializeObject<Dictionary<string, string>>(content); } catch (Exception ex) { //记录错误日志 //FileUtility.TextLogAdd(ex.ToString()); _lanDict = null; } } /// <summary> /// 获取单例 /// </summary> /// <returns></returns> public static LanguageManage GetInstance() { // 当第一个线程运行到这里时,此时会对locker对象 "加锁", // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁 // lock语句运行完之后(即线程运行完之后)会对该对象"解锁" // 双重锁定只需要一句判断就可以了 if (uniqueInstance == null) { lock (locker) { // 如果类的实例不存在则创建,否则直接返回 if (uniqueInstance == null) { uniqueInstance = new LanguageManage(); } } } return uniqueInstance; } #endregion Dictionary<string, string> _lanDict = null; public string GetValue(string key) { if (string.IsNullOrEmpty(key)) { return string.Empty; } if (null == _lanDict) { return key; } string value; if (!_lanDict.ContainsKey(key)) { if (SystemConfig.isCreateLanguageItem) { value = SystemConfig.SysLanguageTypeE == SystemConfig.LanguageTypeEnum.zh_Hk ? ConvertUtility.ZH2HK(key) : key; _lanDict.Add(key, value); File.WriteAllText(SystemConfig.LanguageFilePath, JsonConvert.SerializeObject(_lanDict)); return value; } return key; } return _lanDict[key]; } /// <summary> /// 初始化语言 /// </summary> public void InitLanguage(Control control) { //如果没有资源,那么不必遍历控件,提高速度 if (null == _lanDict) return; SetControlLanguage(control); //使用递归的方式对控件及其子控件进行处理 foreach (Control ctrl in control.Controls) { InitLanguage(ctrl); } //DataGridView 特殊处理 if (control.GetType().Equals(typeof(DataGridView))) { DataGridView gridControl = control as DataGridView; foreach (DataGridViewColumn item in gridControl.Columns) { SetControlLanguage(item); } } //DataGridView 特殊处理 else if (control.GetType().Equals(typeof(ListView))) { ListView listView = control as ListView; foreach (ColumnHeader item in listView.Columns) { SetControlLanguage(item); } } //工具栏或者菜单动态构建窗体或者控件的时候,重新对子控件进行处理 control.ControlAdded = (sender, e) => { InitLanguage(e.Control); }; } private void SetControlLanguage(Control control) { control.Text = GetValue(control.Text); } private void SetControlLanguage(DataGridViewColumn control) { control.HeaderText = GetValue(control.HeaderText); } private void SetControlLanguage(ColumnHeader control) { control.Text = GetValue(control.Text); } }}
评论