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