113 lines
4.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using gehGassi.Core.Interfaces;
using gehGassi.Web.Helper;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace gehGassi.Web.Services
{
/// <summary>
/// Service der die Verwaltung von verfügbaren Sprachen realisiert
/// </summary>
public class LanguageService : ILanguageService
{
private readonly List<Language> _languages;
private readonly IOptions<LocalizationOptions> _localizeOptions;
private readonly IHttpContextAccessor _httpContextAccessor;
/// <summary>
/// Erstellt eine Instanz
/// </summary>
/// <param name="localizeOptions">Instanz eines LocalizationOptions</param>
/// <param name="httpContextAccessor">Instanz eines IHttpContextAccessor</param>
public LanguageService(IOptions<LocalizationOptions> localizeOptions, IHttpContextAccessor httpContextAccessor)
{
_languages = new List<Language>();
_localizeOptions = localizeOptions;
_httpContextAccessor = httpContextAccessor;
}
/// <summary>
/// Gibt eine Sprache anhand des ISO2-Codes zurück
/// </summary>
/// <param name="iso2"></param>
/// <returns>Sprache oder null, wenn keine gefunden</returns>
public Language Get(string iso2)
{
return GetAll().FirstOrDefault(c => c.Iso2.ToLowerInvariant() == iso2.ToLowerInvariant());
}
/// <summary>
/// Gibt die Standard-Sprache des Systems zurück
/// </summary>
/// <returns>Standard-Sprache</returns>
public Language GetDefault()
{
var defaultLang = GetAll().FirstOrDefault(c => c.IsDefault) ?? GetAll().First();
return defaultLang;
}
/// <summary>
/// Gibt die Auflistung aller Sprachen des Systems zurück
/// </summary>
/// <returns>Liste von Sprachen</returns>
public List<Language> GetAll()
{
if (_languages.Count == 0)
{
var definedCodes = new List<string>();
if (!string.IsNullOrWhiteSpace(_localizeOptions.Value.Languages))
definedCodes = _localizeOptions.Value.Languages.Split(",").ToList();
foreach (var definedCode in definedCodes)
{
var culture = CultureInfo.GetCultures(CultureTypes.AllCultures).FirstOrDefault(c => string.Equals(c.TwoLetterISOLanguageName, definedCode, StringComparison.InvariantCultureIgnoreCase));
if (culture != null)
{
var language = new Language
{
Iso2 = culture.TwoLetterISOLanguageName,
IsDefault = false,
Name = culture.NativeName,
NameEnglish = culture.EnglishName
};
if (string.Equals(definedCode, _localizeOptions.Value.DefaultCulture, StringComparison.InvariantCultureIgnoreCase))
language.IsDefault = true;
if (_languages.FirstOrDefault(c => c.Iso2 == language.Iso2) == null)
_languages.Add(language);
}
}
}
return _languages;
}
/// <summary>
/// Gibt die Auflistung aller Sprachen des Systems zurück als ISO2 Liste
/// </summary>
/// <returns>Liste von Sprachen</returns>
public List<string> GetAllIso2()
{
var languages = GetAll();
return languages.Select(c => c.Iso2).ToList();
}
/// <summary>
/// Gibt eine gefilterte Liste von Sprachen zurück. Sucht nur im Namen
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden</returns>
public List<Language> Search(string filter)
{
var languages = GetAll();
return languages.Where(c => c.Name.Contains(filter) || c.NameEnglish.Contains(filter)).ToList();
}
}
}