示例#1
0
        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();
        }
示例#2
0
        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);
        }