/// <summary>
/// Localization dictionary.
/// </summary>
public class LocalizationDictionary {
#region Text Dictionary
private Dictionary<String, ICollection<Dictionary<string,object>>> _TextDictionary;
/// <summary>
/// Get localization text dictionary.
/// </summary>
public Dictionary<String, ICollection<Dictionary<string, object>>> TextDictionary {
get {
if (_TextDictionary == null)
throw new InvalidOperationException("Localization Dictionary was not initialized.");
return _TextDictionary;
}
}
#endregion
#region Instance
private static LocalizationDictionary _Instance;
/// <summary>
/// Get initialized flag.
/// </summary>
public static bool Initialized {
get {
return _Instance != null;
}
}
private LocalizationDictionary() { }
/// <summary>
/// Get localization dictionary instance.
/// </summary>
public static LocalizationDictionary Instance {
get {
if (_Instance == null) {
throw new InvalidOperationException("Localization Dictionary was not initialized.");
}
return _Instance;
}
}
public static void InitializeInstance() {
_Instance = new LocalizationDictionary();
_Instance.Initialize();
}
public static void InitializeInstance(Dictionary<string,ICollection<Dictionary<string,object>>> list) {
_Instance = new LocalizationDictionary();
_Instance.Initialize(list);
}
#endregion
#region Initialize
private void Initialize() {
lock (_Instance) {
_TextDictionary = new Dictionary<string, ICollection<Dictionary<string, object>>>();
// Get Text Data from Service
using (MesproContext db = MesproContext.CreateNew()) {
// Build Text Dictionary
IQueryable<vLocalizationText> query = db.vLocalizationTexts;
IList<vLocalizationText> dicList = query.ToList();
foreach (var data in dicList) {
var dic = new Dictionary<string, object>();
dic.Add("Language", data.LanguageCode);
dic.Add("Description", data.Description);
if (_TextDictionary.ContainsKey(data.LocalizationCode)) {
var locList = _TextDictionary[data.LocalizationCode];
locList.Add(dic);
} else {
var locList = new List<Dictionary<string, object>>();
locList.Add(dic);
_TextDictionary.Add(data.LocalizationCode, locList);
}
}
}
}
}
private void Initialize(Dictionary<string,ICollection<Dictionary<string,object>>> list) {
lock (_Instance) {
_TextDictionary = list;
}
}
public string GetLanguage() {
// Get language code from current thread
string lngCode = CultureInfo.CurrentCulture.Name;
// Set default language is en-US
if (string.IsNullOrEmpty(lngCode))
return "en-US";
return lngCode;
}
#endregion
#region Get Localization text
/// <summary>
/// Get localization text by code.
/// </summary>
/// <param name="localizationCode">Localization Code</param>
/// <returns>Localized text</returns>
public string GetLocalizationText(string localizationCode) {
if (_TextDictionary == null)
return null;
if (_TextDictionary.ContainsKey(localizationCode)) {
// Get language code
var languageCode = GetLanguage();
// Get Localization for all language
ICollection<Dictionary<string,object>> locDic = (ICollection<Dictionary<string, object>>)_TextDictionary[localizationCode];
// Get Localization for current language
Dictionary<string, object> currDic = locDic.Where(h => (string)h["Language"] == languageCode).SingleOrDefault();
if (currDic == null || !currDic.ContainsKey("Description"))
return "";
return (string)currDic["Description"];
}
return null;
}
#endregion
}
/// <summary>
/// Localization context.
/// </summary>
public class LocalizationContext {
#region Get localization text
/// <summary>
/// Get localization text by property name.
/// </summary>
/// <param name="propertyName">Property name</param>
/// <returns>Localized text</returns>
public string GetLocalizationText(string propertyName) {
if (!LocalizationDictionary.Initialized)
return null;
return LocalizationDictionary.Instance.GetLocalizationText(propertyName);
}
/// <summary>
/// Get localization text by property expression.
/// </summary>
/// <typeparam name="T">Class</typeparam>
/// <param name="propertyExpression">Property expression</param>
/// <returns>Localized text</returns>
public string GetLocalizationText<T>(Expression<Func<T>> propertyExpression) {
return GetLocalizationText(PropertySupport.ExtractPropertyName(propertyExpression));
}
protected string IsNullOrEmpty(string targetString, string defaultString) {
if (String.IsNullOrEmpty(targetString))
return defaultString;
return targetString;
}
#endregion
#region Common Messages
#region No Data Selected
private const string NO_DATA_SELECTED = "No data selected.";
/// <summary>
/// No data selected.
/// </summary>
public string NoDataSelected {
get {
return IsNullOrEmpty(GetLocalizationText(() => NoDataSelected), NO_DATA_SELECTED);
}
}
#endregion
#endregion
}