using System.Collections.Generic;
using System.Threading.Tasks;
namespace gehGassi.Domain.Localization
{
///
/// Kennzeichnet eine Entität als Entität die übersetzbare Eigenschaften aufweist
///
public interface ILocalizable
{
///
/// In welcher Sprache sollen die übersetzbaren Felder abgerufen oder gesetzt werden?
///
/// ISO2 codierte Sprache
void SetLanguage(string language);
///
/// Setzt eine Übersetzung direkt für ein Feld mittels Reflection
///
/// Name der Eigenschaft
/// ISO2 codierte Sprache
/// Zu setzender Wert
void Set(string property, string language, string value);
///
/// Setzt alle übersetzungen für ein Feld mittels Reflection.
/// Achtung: das gesamte Dictionary wird ersetzt
///
/// Name der Eigenschaft
/// Zu setzendes Dictionary
void Set(string property, Dictionary dictionary);
///
/// Ruft eine Übersetzung direkt für ein Feld mittels Reflection
///
/// Name der Eigenschaft
/// ISO2 codierte Sprache
/// Gibt an ob leer als Rückgabe gültig ist und nicht die Default-Werte genommen werden sollen wenn eine Übersetzung fehlt
/// Wert
string Get(string property, string language, bool allowEmpty = false);
///
/// Ruft alle Übersetzungen direkt für ein Feld mittels Reflection
///
/// Name der Eigenschaft
/// Dictionary mit allen Übersetzungen
Dictionary Get(string property);
///
/// Gibt eine Liste aller verfügbaren Sprachen für ein Feld zurück.
/// Basiert auf den bereits gesetzten Sprachen
///
/// Name der Eigenschaft
/// Liste verfügbarer Sprachen
List GetLanguages(string property);
}
///
/// Hilfserweiterungen für Localizable
///
public static class LocalizableExtensions
{
public static Task SetLanguageAsync(this Task item, string language) where T : class, ILocalizable
{
var localItem = item.Result;
localItem?.SetLanguage(language);
return Task.FromResult(localItem);
}
public static IEnumerable SetLanguage(this IEnumerable items, string language) where T : class, ILocalizable
{
foreach (var item in items)
{
item.SetLanguage(language);
yield return item;
}
}
public static Task> SetLanguageAsync(this Task> items, string language) where T : class, ILocalizable
{
var localItems = items.Result;
var resultItems = new List();
foreach (var item in localItems)
{
item.SetLanguage(language);
resultItems.Add(item);
}
return Task.FromResult((IEnumerable)resultItems);
}
}
}