using System; using System.Collections; using System.Globalization; namespace Kreta.Framework.Localization { /// /// Objektumok nyelvesítését koordináló osztály. /// public sealed class Localizer { private static Hashtable m_RegisteredLocalizers = Hashtable.Synchronized(new Hashtable()); private static Hashtable m_LocalizerCache = Hashtable.Synchronized(new Hashtable()); private static ILocalizer m_DefaultLocalizer = new GenericLocalizer(); /// /// Az osztály statikus konstruktora. /// static Localizer() { SetLocalizer(typeof(Exception), new ExceptionLocalizer()); SetLocalizer(typeof(Enum), new EnumLocalizer()); } /// /// Az osztály alapértelmezett konstruktora. /// /// Az osztály statikus, példányosítását nem szándékozzuk. private Localizer() { } /// /// Visszaadja a típushoz regisztrált nyelvesítő objektumot. /// /// /// Ha a típushoz nem tartozik explicit regisztrált nyelvesítő, akkor az /// ősosztály nyelvesítőjét fogja visszaadni (rekurzívan). Ha ilyen sincs, /// akkor az alapértelmezett nyelvesítővel fog visszatérni. /// /// A típus /// A típus nyelvesítője private static ILocalizer FindRegisteredLocalizer(Type type) { ILocalizer result = m_RegisteredLocalizers[type] as ILocalizer; if (result != null) { return result; } if (type != typeof(object)) { return FindRegisteredLocalizer(type.BaseType); } return m_DefaultLocalizer; } /// /// Az alapértelmezett nyelvesítő objektum, értéke sosem lehet null. /// public static ILocalizer DefaultLocalizer { get { return m_DefaultLocalizer; } set { m_DefaultLocalizer = value ?? throw new ArgumentNullException(nameof(value)); } } /// /// Visszaadja a típushoz tartozó nyelvesítőt. /// /// A típus /// A típus nyelvesítője public static ILocalizer GetLocalizer(Type type) { ILocalizer result = m_LocalizerCache[type] as ILocalizer; if (result != null) { return result; } result = FindRegisteredLocalizer(type); m_LocalizerCache[type] = result; return result; } /// /// Beállítja egy típushoz a hozzá tartozó nyelvesítő objektumot. /// /// A típus /// A típus nyelvesítője public static void SetLocalizer(Type type, ILocalizer localizer) { if (type == null) { throw new ArgumentNullException(nameof(type)); } m_RegisteredLocalizers[type] = localizer; m_LocalizerCache.Clear(); } /// /// Nyelvesíti a megadott objektumot. /// /// /// A nyelvként a /// értéke lesz használva. /// /// A nyelvesítendő objektum /// Az objektum nyelvesítve public static string Localize(object value) { return Localize(value, LanguageContext.Current.RegionSettings); } /// /// Nyelvesíti a megadott objektumot. /// /// A nyelvesítendő objektum /// A kultúra neve /// Az objektum nyelvesítve public static string Localize(object value, string cultureName) { return Localize(value, CultureInfo.GetCultureInfo(cultureName)); } /// /// Nyelvesíti a megadott objektumot. /// /// /// /// Ha az objektum megvalósítja az fületet, akkor azt használja; /// egyébként megkeresi a megfelelő - előzőleg beregisztrált - /// objektumos, és azon keresztül történik a nyelvesítés. /// /// /// A nyelvesítendő objektum /// A nyelv /// Az objektum nyelvesítve /// Ha valamelyik paraméter értéke null. public static string Localize(object value, CultureInfo cultureInfo) { if (value == null) { throw new ArgumentNullException(nameof(value)); } if (cultureInfo == null) { throw new ArgumentNullException(nameof(cultureInfo)); } ILocalizable localizable = value as ILocalizable; string result; if (localizable != null) { result = localizable.Localize(cultureInfo); if (result != null) { return result; } } ILocalizer localizer = GetLocalizer(value.GetType()); result = localizer.Localize(value, cultureInfo); if (result != null || localizer == m_DefaultLocalizer) { return result; } return m_DefaultLocalizer.Localize(value, cultureInfo); } } }