Files
ayanova7/source/bizobjects/AyaLib/GZTW.AyaNova.BLL/LocalizedTextTable.cs
2018-06-29 19:47:36 +00:00

365 lines
11 KiB
C#

///////////////////////////////////////////////////////////
// Bool.cs
// Implementation of Class LocalizedTextTable
// CSLA type: Read-only object
// Created on: 29-Aug-2005
// Object design: John
// Coded: 29-Aug-2005
///////////////////////////////////////////////////////////
using System;
using System.Data;
using CSLA.Data;
using GZTW.Data;
using CSLA;
using System.Threading;
using CSLA.Security;
using System.Collections;
using System.Collections.Generic;
namespace GZTW.AyaNova.BLL
{
/// <summary>
/// Holds the localized text for use by user interface
///
/// This is the class you want to use if you want to display
/// localized text in your code and this is where you want to
/// access it from: <see cref="AyaBizUtils.LocaleText"/>
/// </summary>
[Serializable]
public class LocalizedTextTable : ReadOnlyBase
{
#region Attributes
private Dictionary<string,string> mLocalizedTextTable;
#endregion
#region Constructor
/// <summary>
/// Private constructor to prevent direct instantiation
/// </summary>
private LocalizedTextTable()
{
mLocalizedTextTable = new Dictionary<string, string>(1400);//as of writing dec 15 2010 it's 1387 so this should give some leeway
}
#endregion
#region Business properties
//case 3379 - datadump
[System.ComponentModel.Browsable(false)]
public Dictionary<string, string> LT
{
get
{
return mLocalizedTextTable;
}
}
/// <summary>
/// Returns key with the most characters in it
/// Used for development purposes
/// </summary>
/// <returns></returns>
public string GetLongestKey()
{
string sLongest="";
int nLongest=0;
foreach(KeyValuePair<string,string> kvp in mLocalizedTextTable)
{
string sTemp = kvp.Key;
if(sTemp.Length>nLongest)
{
nLongest=sTemp.Length;
sLongest=sTemp;
}
}
return sLongest + " " + nLongest.ToString() + " chars.";
}
#if (xDEBUG)
//case 1543
private static System.Collections.Generic.List<string> lsKeysUsed = null;
public static System.Collections.Generic.List<string> KeysUsed
{
get
{
if (lsKeysUsed == null) lsKeysUsed = new System.Collections.Generic.List<string>();
return lsKeysUsed;
}
}
private static void AddKeyUsed(string s)
{
if(!KeysUsed.Contains(s))
KeysUsed.Add(s);
}
#else
#endif
/// <summary>
/// returns the localized text for the key provided
/// from the in-memory Hashtable
/// If key not found, returns key back
/// </summary>
/// <param name="LocaleKey"></param>
/// <returns></returns>
public string GetLocalizedText(string LocaleKey)//case 1543 logpoint
{
if (mLocalizedTextTable.Count < 1) return LocaleKey;
//bad or missing LocaleKey?
if(string.IsNullOrWhiteSpace(LocaleKey))
return "";
//Is it in underscore notation style?
if(LocaleKey.StartsWith("LT_"))
{
LocaleKey=LocaleKey.Replace("LT_","").Replace("_",".");
}
//Case 58
//Previously users could localize the RegionID values of User, client and head office
//now that regionid is actually used it should always be the value of O.Region displayed
//also there are a few new objects that now have a .RegionID field so rather than add them all
//redundantly since they should display the same thing, just going to override it right here...
if (LocaleKey.EndsWith(".RegionID"))
return mLocalizedTextTable["O.Region"];
//Try to get localized text...
string s = null;
if(mLocalizedTextTable.ContainsKey(LocaleKey))
s=mLocalizedTextTable[LocaleKey];
//Localized text not found for provided key?
if(s==null)
{
//"Common"-ize it and see if that returns the
//localized text or not
string AltKey=LocaleKey;
int x=AltKey.IndexOf(".");
if(x!=-1)
{
AltKey=AltKey.Substring(x);
AltKey="Common" + AltKey;
if(mLocalizedTextTable.ContainsKey(AltKey))
s=mLocalizedTextTable[AltKey];
if (s != null)
{
#if (xDEBUG)
AddKeyUsed(s);
#endif
return s;//Yup, that did it, return localized text
}
else
return LocaleKey;//Nope, still not found so return LocaleKey provided instead
}
else
return LocaleKey;//No dot (.) found, not a valid key, send it back
}
//Localized text was found for the key provided so return it
#if (xDEBUG)
AddKeyUsed(s);
#endif
return s;
}
/// <summary>
/// Get the localized text key from the localized string
/// used to reverse lookup enum values in grid filters
/// </summary>
/// <param name="localized">A string of localized text</param>
/// <param name="hint">Fragment of key to avoid clashes with two keys that localize to the same text</param>
/// <returns>The key for the string provided or an empty string if nothing found that matches</returns>
public string GetLocalizedTextKey(string hint, string localized)
{
//changed: 10-Nov-2006: Added Hint string and code to
//ensure that localized text string matches don't falsely match
//if an unrelated key has the same text
//Done this way to avoid major changes to fragile grid filtering
//code that is currently working.
string probable = "";
foreach (KeyValuePair<string,string> kvp in mLocalizedTextTable)
{
string sTemp = kvp.Value;
if (sTemp==localized)
{
probable = kvp.Key;
if(kvp.Key.Contains(hint))
return kvp.Key;
}
}
return probable;
}
#endregion
#region Static methods
/// <summary>
/// Load the localized text for the local provided
/// </summary>
/// <param name="Locale">Text key of locale i.e. "English", "Francais", "Espanol", "Klingon" etc</param>
/// <returns></returns>
public static LocalizedTextTable Load(string Locale)
{
return (LocalizedTextTable)DataPortal.Fetch(new Criteria( Locale));
}
/// <summary>
/// Given a LocalizedText key queries the database and returns the localized text
/// This is used by the biz objects for reporting errors and for
/// retrieving object names for reporting purposes
/// It is not used by the UI which has a copy of this entire object instatiated for the
/// lifetime of the UI code
///
/// This is necessary because in a Remote DataPortal situation
/// the biz objects at the server will not have access to an in-memory copy of the entire localized text table.
///
/// (note that this method subcontracts this call to a dataPortal friendly fetcher class
///
/// </summary>
/// <param name="Key"></param>
/// <returns></returns>
internal static string GetLocalizedTextDirect(string Key)//case 1543 logpoint
{
//part of case 53 but generally better performance usage here
if (AyaBizUtils.LocaleText != null)
return AyaBizUtils.LocaleText.GetLocalizedText(Key);
else
{
string s=LocalizedTextFetcher.GetItem(Key).Text;
#if (xDEBUG)
AddKeyUsed(s);
#endif
return s;
}
}
/// <summary>
/// Given a LocalizedText key and Locale
/// queries the database and returns the localized text string for that key and locale
/// This is used by the biz objects for reporting errors and for
/// retrieving object names for reporting purposes
/// It is not used by the UI which has a copy of this entire object instatiated for the
/// lifetime of the UI code
///
/// This is necessary because in a Remote DataPortal situation
/// the biz objects at the server will not have access to an in-memory copy of the entire localized text table.
///
/// (note that this method subcontracts this call to a dataPortal friendly fetcher class
///
/// </summary>
/// <param name="Key"></param>
/// <param name="Locale"></param>
/// <returns></returns>
internal static string GetLocalizedTextDirect(string Key, string Locale)//case 1543 logpoint
{
string s = LocalizedTextFetcher.GetItemForSpecificLocale(Key, Locale).Text;
#if (xDEBUG)
AddKeyUsed(s);
#endif
return s;
}
#endregion
#region DAL DATA ACCESS
///
/// <param Bool="Criteria"></param>
protected override void DataPortal_Fetch(object Criteria)
{
Criteria crit = (Criteria)Criteria;
SafeDataReader dr = null;
try
{
DBCommandWrapper dbCommandWrapper = DBUtil.DB.GetSqlStringCommandWrapper(
"SELECT aKey, aDisplayText, aDisplayTextCustom FROM " +
"aLocalizedText WHERE (aLocale = @Locale)"
);
dbCommandWrapper.AddInParameter("@Locale",DbType.String,crit.Locale);
dr = new SafeDataReader(DBUtil.DB.ExecuteReader(dbCommandWrapper));
mLocalizedTextTable.Clear();
while(dr.Read())
{
//*******************************************
//If there is no custom text then add the stock text
if(dr.GetString("aDisplayTextCustom").Length<1)
mLocalizedTextTable.Add(dr.GetString("aKey"),dr.GetString("aDisplayText"));
else//It's custom, add the custom text instead
mLocalizedTextTable.Add(dr.GetString("aKey"),dr.GetString("aDisplayTextCustom"));
//*******************************************
}
//Add specialty keys here
mLocalizedTextTable.Add("UI.Label.CurrentUserName", Thread.CurrentPrincipal.Identity.Name);
}
finally
{
if(dr!=null) dr.Close();
}
}
#endregion
#region criteria
/// <summary>
/// Criteria for identifying existing object
/// </summary>
[Serializable]
private class Criteria
{
public string Locale;
public Criteria(string _Locale)
{
Locale=_Locale;
}
}
#endregion
}//end Class
}//end Namespace