using System; using CYQ.Data.Xml; using System.Xml; using System.Web; namespace CYQ.Data.Xml { /// /// 多语言操作类 /// public class MutilLanguage : IDisposable { XHtmlAction helper; /// /// 获取加载的Xml语言文件的完整(路径)名称 /// public string FilePath { get { if (helper != null) { return helper.FileName; } return string.Empty; } } private LanguageKey _LanKey = LanguageKey.None; /// /// 获取或设置当前语言类型(如果有设置语言Cookie,则初始化时从Cookie恢复) /// public LanguageKey LanKey { get { if (_LanKey == LanguageKey.None) { _LanKey = DefaultLanKey; } return _LanKey; } set { _LanKey = value; } } private LanguageKey _DefaultLanKey = LanguageKey.None; /// /// 获取系统默认的语言(取值顺序:AppConfig.XHtml.SysLangKey - > 浏览器语言 -》 默认中文) /// public LanguageKey DefaultLanKey { get { if (_DefaultLanKey == LanguageKey.None) { _DefaultLanKey = GetDefaultLangKey(); } return _DefaultLanKey; } } /// /// 实例化 /// /// xml文件路径 /// 是否Html文件 /// 是获从Cookie初始化默认语言 public MutilLanguage(string filePath, bool isForHtml, bool isInitValueFromCookie) { Init(filePath, isForHtml, isInitValueFromCookie); } /// /// 实例化 /// /// xml文件路径 /// 是否Html文件 public MutilLanguage(string filePath, bool isForHtml) { Init(filePath, isForHtml, true); } /// /// 实例化 /// /// xml文件路径 public MutilLanguage(string filePath) { Init(filePath, true, true); } private void Init(string filePath, bool isForHtml, bool isInitValueFromCookie) { helper = new XHtmlAction(isForHtml); helper.IsNoClone = true;//只读,节省Clone,节省CPU if (!helper.Load(filePath, XmlCacheLevel.Day)) { Error.Throw("Load xml failed : " + filePath); } if (isInitValueFromCookie) { SetLanKeyByCookie(); } } /// /// 获取多语言节点值 /// /// Xml节点ID public string Get(object lanID) { return Get(lanID, LanKey); } /// /// 获取多语言节点值 /// /// Xml节点ID /// LanguageKey对应的数字 public string Get(object lanID, int lanKeyID) { if (lanKeyID > 0 && lanKeyID < 10) { return Get(lanID, (LanguageKey)lanKeyID); } return Get(lanID); } /// /// 获取多语言节点值 /// /// Xml节点ID /// 获取的语言 /// public string Get(object lanID, LanguageKey lanEnum) { XmlNode node = helper.GetByID(Convert.ToString(lanID)); if (node != null) { switch (lanEnum) { case LanguageKey.Chinese: return node.InnerXml.Trim('\r', '\n').Trim(); default: string key = lanEnum.ToString().ToLower().Substring(0, 3); if (node.Attributes[key] != null) { return node.Attributes[key].Value.Trim('\r', '\n').Trim(); } else { return node.InnerXml.Trim('\r', '\n').Trim(); } } } return Convert.ToString(lanID); } private void SetLanKeyByCookie() { if (HttpContext.Current != null) { HttpCookie myCookie = HttpContext.Current.Request.Cookies[AppConfig.XHtml.Domain + "_LanKey"]; if (null != myCookie) { try { _LanKey = (LanguageKey)Enum.Parse(typeof(LanguageKey), myCookie.Value); } catch { _LanKey = LanguageKey.None; } } } } /// /// 设置语言类型到Cookie中 /// public void SetToCookie(LanguageKey lanKey) { SetToCookie(lanKey.ToString()); } /// /// 设置语言类型到Cookie中 /// public void SetToCookie(string lanKey) { try { _LanKey = (LanguageKey)Enum.Parse(typeof(LanguageKey), lanKey); } catch { _LanKey = LanguageKey.None; } SetLanguageCookie(lanKey); } public static void SetLanguageCookie(string lanKey) { if (HttpContext.Current != null) { HttpCookie myCookie = new HttpCookie(AppConfig.XHtml.Domain + "_LanKey", lanKey); if (!string.IsNullOrEmpty(AppConfig.XHtml.Domain) && AppConfig.XHtml.Domain.IndexOf(':') == -1)//端口处理 { myCookie.Domain = AppConfig.XHtml.Domain; } //myCookie.Expires = System.DateTime.Now.AddHours(1); HttpContext.Current.Response.Cookies.Add(myCookie); } } /// /// 获取LanguageKey数字对应的枚举名称 /// /// public static string GetKey(int value) { if (value > 0 && value < 10) { return Convert.ToString((LanguageKey)value); } return LanguageKey.None.ToString(); } /// /// 获取LanguageKey枚举对应的数字 /// /// LanguageKey枚举名称 /// public static int GetValue(string langKey) { switch (langKey) { case "Chinese": return 1; case "English": return 2; case "French": return 3; case "German": return 4; case "Hindi": return 5; case "Italian": return 6; case "Japanese": return 7; case "Korean": return 8; case "Russian": return 9; case "Custom": return 10; } return 0; } private LanguageKey GetDefaultLangKey() { string key = AppConfig.XHtml.SysLangKey; if (!string.IsNullOrEmpty(key) && key != "None") { try { return (LanguageKey)Enum.Parse(typeof(LanguageKey), key); } catch { Error.Throw(string.Format("Error:LanguageKey not contain {0}", key)); } } if (HttpContext.Current != null && HttpContext.Current.Request.UserLanguages != null && HttpContext.Current.Request.UserLanguages.Length > 0) { switch (HttpContext.Current.Request.UserLanguages[0].Substring(0, 2)) { case "zh": return LanguageKey.Chinese; case "en": return LanguageKey.English; case "fr": return LanguageKey.French; case "de": return LanguageKey.German; case "hi": return LanguageKey.Hindi; case "it": return LanguageKey.Italian; case "ja": return LanguageKey.Japanese; case "ko": return LanguageKey.Korean; case "ru": return LanguageKey.Russian; } } return LanguageKey.Chinese; } #region IDisposable 成员 public void Dispose() { helper.Dispose(); } #endregion } }