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
{
///
/// Service der die Verwaltung von verfügbaren Sprachen realisiert
///
public class LanguageService : ILanguageService
{
private readonly List _languages;
private readonly IOptions _localizeOptions;
private readonly IHttpContextAccessor _httpContextAccessor;
///
/// Erstellt eine Instanz
///
/// Instanz eines LocalizationOptions
/// Instanz eines IHttpContextAccessor
public LanguageService(IOptions localizeOptions, IHttpContextAccessor httpContextAccessor)
{
_languages = new List();
_localizeOptions = localizeOptions;
_httpContextAccessor = httpContextAccessor;
}
///
/// Gibt eine Sprache anhand des ISO2-Codes zurück
///
///
/// Sprache oder null, wenn keine gefunden
public Language Get(string iso2)
{
return GetAll().FirstOrDefault(c => c.Iso2.ToLowerInvariant() == iso2.ToLowerInvariant());
}
///
/// Gibt die Standard-Sprache des Systems zurück
///
/// Standard-Sprache
public Language GetDefault()
{
var defaultLang = GetAll().FirstOrDefault(c => c.IsDefault) ?? GetAll().First();
return defaultLang;
}
///
/// Gibt die Auflistung aller Sprachen des Systems zurück
///
/// Liste von Sprachen
public List GetAll()
{
if (_languages.Count == 0)
{
var definedCodes = new List();
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;
}
///
/// Gibt die Auflistung aller Sprachen des Systems zurück als ISO2 Liste
///
/// Liste von Sprachen
public List GetAllIso2()
{
var languages = GetAll();
return languages.Select(c => c.Iso2).ToList();
}
///
/// Gibt eine gefilterte Liste von Sprachen zurück. Sucht nur im Namen
///
/// Filterbegriff der in bestimmten Feldern gesucht wird
/// List betroffener Kunden
public List Search(string filter)
{
var languages = GetAll();
return languages.Where(c => c.Name.Contains(filter) || c.NameEnglish.Contains(filter)).ToList();
}
}
}