using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Kreta.Framework.Caching;
namespace Kreta.Framework.Localization
{
///
/// Kivételek nyelvesítésére szolgáló megvalósítás.
///
internal class ExceptionLocalizer : ILocalizer
{
private static object SyncObject = new object();
// <>
private static readonly Dictionary friendlyNameAttributeCache = new Dictionary();
string ILocalizer.Localize(object value, CultureInfo cultureInfo)
{
return Localize((Exception)value, cultureInfo);
}
public virtual string Localize(Exception exception, CultureInfo cultureInfo)
{
FriendlyNameAttribute attribute;
lock (SyncObject)
{
var exceptionType = exception.GetType();
if (!friendlyNameAttributeCache.TryGetValue(exceptionType, out attribute))
{
attribute = (FriendlyNameAttribute)exceptionType.GetCustomAttributes(typeof(FriendlyNameAttribute), true).FirstOrDefault(); //inherited but allowed only one
friendlyNameAttributeCache[exceptionType] = attribute;
}
}
if (attribute != null)
{
if (attribute.StringResourceId == -1)
{
return string.Empty;
}
return SDAServer.Instance.CacheManager.AquireCache().Get(attribute.StringResourceId, cultureInfo.LCID, attribute.DisplayText);
}
return exception.Message;
}
}
}