public class Culture { public static CultureItem ENU = new CultureItem( "en-US" , "English" , "EN" ); public static CultureItem CHS = new CultureItem( "zh-CN" , "簡体中文" , "CN" ); public static CultureItem CHT = new CultureItem( "zh-TW" , "繁體中文" , "TW" ); public static CultureItem JPN = new CultureItem( "ja-JP" , "日本語" , "JP" ); public static CultureItem DE = new CultureItem( "de-DE" , "Deutsch" , "DE" ); public static CultureItem FR = new CultureItem( "fr-FR" , "French" , "FR" ); public static CultureItem ES = new CultureItem( "es-ES" , "Spanish" , "ES" ); public static CultureItem IT = new CultureItem( "it-IT" , "Italian" , "IT" ); /// <summary> /// 取得實作語系 /// </summary> public static List<CultureItem> All { get { return _cultures; } } // 實作語系 private static readonly List<CultureItem> _cultures = new List<CultureItem> { ENU, CHS, CHT, //"en-GB", //"en-CA", //"de-DE", //"es-ES", //"it-IT", //"ja-JP", //"fr-FR", }; /// <summary> /// 驗證culture資料是否超出範圍 /// </summary> /// <param name="cultureName"></param> /// <returns></returns> public static string GetValidBigTrackerCulture( string cultureName) { //不確定預設是否為en - US, or cultureName的值超出預期的範圍 if (_cultures.Where(w => w.LanguageCultureName == cultureName).Count() == 0) { cultureName = ENU.LanguageCultureName; } return cultureName; } /// <summary> /// 依照「name」參數回傳有效並已實作之語系名稱。 /// 若無合適語系名稱,則回傳預設語系名稱。 /// 本專案的預設語系名稱為「en-US」 /// </summary> /// <param name="name">語系名稱</param> public static string GetImplementedCulture( string name) { // 確認是否為空字串 if ( string .IsNullOrEmpty(name)) return GetDefaultCulture(); // 若是空字串則回傳預設語系 // 如果該語系名稱已被實作,則接受使用該語系名稱 var selectedCulture = _cultures.FirstOrDefault(c => c.LanguageCultureName.Equals(name, StringComparison.InvariantCultureIgnoreCase)); if (selectedCulture != null ) { return selectedCulture.LanguageCultureName; // 接受這個語系 } // 取得最接近之語系名稱。例如,如果已經實作了「en-US」而使用者的請求是「en-GB」, // 則回傳最接近的「en-US」因為這樣至少是相同的語言(例如:英文) var n = GetNeutralCulture(name); foreach ( var c in _cultures) if (c.LanguageCultureName.StartsWith(n)) return c.LanguageCultureName; // 如果沒有合適的,就回傳預設語系名稱 return GetDefaultCulture(); } /// <summary> /// 回傳預設的語系名稱 /// </summary> public static string GetDefaultCulture() { return ENU.LanguageCultureName; } /// <summary> /// 取得目前語系名稱 /// </summary> public static string GetCurrentCulture() { return Thread.CurrentThread.CurrentCulture.Name; } public static bool IsTW { get { return GetCurrentCulture().Equals(CHT.LanguageCultureName, StringComparison.OrdinalIgnoreCase); } } public static CultureInfo GetCurrentCultureInfo() { return Thread.CurrentThread.CurrentCulture; } /// <summary> /// 取得目前的中性語系名稱 /// </summary> public static string GetCurrentNeutralCulture() { return GetNeutralCulture(Thread.CurrentThread.CurrentCulture.Name); } public static void SetCurrentCulture( string userCulture) { //驗證culture是否超出系統支援範圍 userCulture = GetValidBigTrackerCulture(userCulture); if (Thread.CurrentThread.CurrentCulture.Name != userCulture) { Thread.CurrentThread.CurrentCulture = new CultureInfo(userCulture); Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; } } /// <summary> /// 取得中性語系名稱 /// </summary> public static string GetNeutralCulture( string name) { if (name.Length < 2) return name; return name.Substring(0, 2); // 回傳前兩個字元,例如:"en", "es" } public static string CookieName { get { return Models.Enum.CookieName.BulidCookieKey(Models.Enum.CookieName.Culture); } } } |