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; } } }