public LocalizationManager(IEnumerable <RealLocalization <TKeys> > realLocalizations, bool useAutoLocalization = true) { _realLocalizations = realLocalizations.ToArray(); if (_realLocalizations.Length <= 0) { throw new ArgumentException($"At least one localization should be specified.", nameof(realLocalizations)); } _fallbackLocalization = _realLocalizations.FirstOrDefault(loc => loc.Keys.IsFallback) ?? _realLocalizations.First(); _systemLocalization = _realLocalizations.FirstOrDefault(localization => localization.CultureName == _defaultSystemCultureName); _useAutoLocalization = useAutoLocalization; InitializeAutoLocalization(); _current = AvailableLocalizations.First(); }
private static List <RealLocalization <TKeys> > FindAvailableLocalizations(IEnumerable <Assembly> assemblies) { var realLocalizations = new List <RealLocalization <TKeys> >(); var keysType = typeof(TKeys); var typesSet = new HashSet <Type>(); foreach (Assembly assembly in assemblies) { foreach (Type type in assembly.GetTypes()) { if (keysType.IsAssignableFrom(type) && type != keysType && type.IsClass && !typesSet.Contains(type)) { typesSet.Add(type); } } } foreach (var type in typesSet) { var constructorInfo = type.GetConstructor(new Type[0]); if (constructorInfo == null) { Trace.TraceWarning($"Type {keysType.FullName} seems to be a Localization, but parameterless constructor is missing."); continue; } var localizationKeys = (TKeys)constructorInfo.Invoke(new object?[0]); var realLocalization = new RealLocalization <TKeys>(localizationKeys); realLocalizations.Add(realLocalization); } if (realLocalizations.Count <= 0) { throw new Exception($"No localization found: no loaded implementation of type {keysType.Name} found in the specified assemblies."); } return(realLocalizations); }