92 lines
3.6 KiB
C#

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