public LocalizedModelsDiscoveryTests()
        {
            var types         = new[] { typeof(SampleViewModel), typeof(SubViewModel) };
            var state         = new ScanState();
            var keyBuilder    = new ResourceKeyBuilder(state);
            var oldKeyBuilder = new OldResourceKeyBuilder(keyBuilder);
            var ctx           = new ConfigurationContext();

            ctx.TypeFactory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <DetermineDefaultCulture.Handler>();

            var queryExecutor      = new QueryExecutor(ctx);
            var translationBuilder = new DiscoveredTranslationBuilder(queryExecutor);

            var sut = new TypeDiscoveryHelper(new List <IResourceTypeScanner>
            {
                new LocalizedModelTypeScanner(keyBuilder, oldKeyBuilder, state, ctx, translationBuilder),
                new LocalizedResourceTypeScanner(keyBuilder, oldKeyBuilder, state, ctx, translationBuilder),
                new LocalizedEnumTypeScanner(keyBuilder, translationBuilder),
                new LocalizedForeignResourceTypeScanner(keyBuilder, oldKeyBuilder, state, ctx, translationBuilder)
            }, ctx);

            _properties = types.SelectMany(t => sut.ScanResources(t));
        }
Ejemplo n.º 2
0
        public ForeignResourceScannerTests()
        {
            var state         = new ScanState();
            var keyBuilder    = new ResourceKeyBuilder(state);
            var oldKeyBuilder = new OldResourceKeyBuilder(keyBuilder);
            var ctx           = new ConfigurationContext();

            ctx.TypeFactory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <DetermineDefaultCulture.Handler>();
            ctx.ForeignResources
            .Add <ResourceWithNoAttribute>()
            .Add <BadRecursiveForeignResource>(true);

            var queryExecutor      = new QueryExecutor(ctx.TypeFactory);
            var translationBuilder = new DiscoveredTranslationBuilder(queryExecutor);

            _sut = new TypeDiscoveryHelper(new List <IResourceTypeScanner>
            {
                new LocalizedModelTypeScanner(keyBuilder, oldKeyBuilder, state, ctx, translationBuilder),
                new LocalizedResourceTypeScanner(keyBuilder, oldKeyBuilder, state, ctx, translationBuilder),
                new LocalizedEnumTypeScanner(keyBuilder, translationBuilder),
                new LocalizedForeignResourceTypeScanner(keyBuilder, oldKeyBuilder, state, ctx, translationBuilder)
            }, ctx);
        }
Ejemplo n.º 3
0
        public NamedResourcesTests()
        {
            var state = new ScanState();

            _keyBuilder = new ResourceKeyBuilder(state);
            var oldKeyBuilder = new OldResourceKeyBuilder(_keyBuilder);
            var ctx           = new ConfigurationContext();

            ctx.TypeFactory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <DetermineDefaultCulture.Handler>();

            var queryExecutor      = new QueryExecutor(ctx);
            var translationBuilder = new DiscoveredTranslationBuilder(queryExecutor);

            _sut = new TypeDiscoveryHelper(new List <IResourceTypeScanner>
            {
                new LocalizedModelTypeScanner(_keyBuilder, oldKeyBuilder, state, ctx, translationBuilder),
                new LocalizedResourceTypeScanner(_keyBuilder, oldKeyBuilder, state, ctx, translationBuilder),
                new LocalizedEnumTypeScanner(_keyBuilder, translationBuilder),
                new LocalizedForeignResourceTypeScanner(_keyBuilder, oldKeyBuilder, state, ctx, translationBuilder)
            }, ctx);

            _expressionHelper = new ExpressionHelper(_keyBuilder);
        }
Ejemplo n.º 4
0
 public DisplayAttributeCollector(OldResourceKeyBuilder oldKeyBuilder, DiscoveredTranslationBuilder translationBuilder)
 {
     _oldKeyBuilder      = oldKeyBuilder;
     _translationBuilder = translationBuilder;
 }
Ejemplo n.º 5
0
        /// <summary>
        /// Adds the database localization provider.
        /// </summary>
        /// <param name="services">The services.</param>
        /// <param name="setup">The setup.</param>
        /// <returns></returns>
        public static IServiceCollection AddDbLocalizationProvider(
            this IServiceCollection services,
            Action <ConfigurationContext> setup = null)
        {
            var ctx     = new ConfigurationContext();
            var factory = ctx.TypeFactory;

            // setup default implementations
            factory.ForQuery <GetAllResources.Query>().DecorateWith <CachedGetAllResourcesHandler>();
            factory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <DetermineDefaultCulture.Handler>();
            factory.ForCommand <ClearCache.Command>().SetHandler <ClearCacheHandler>();

            var provider = services.BuildServiceProvider();

            // set to default in-memory provider
            var cache = provider.GetService <IMemoryCache>();

            if (cache != null)
            {
                ctx.CacheManager = new InMemoryCacheManager(cache);
                services.AddSingleton(ctx.CacheManager);
            }

            // run custom configuration setup (if any)
            setup?.Invoke(ctx);

            // adding mvc localization stuff
            var scanState            = new ScanState();
            var keyBuilder           = new ResourceKeyBuilder(scanState);
            var oldKeyBuilder        = new OldResourceKeyBuilder(keyBuilder);
            var expressionHelper     = new ExpressionHelper(keyBuilder);
            var queryExecutor        = new QueryExecutor(ctx);
            var commandExecutor      = new CommandExecutor(ctx);
            var translationBuilder   = new DiscoveredTranslationBuilder(queryExecutor);
            var localizationProvider = new LocalizationProvider(keyBuilder, expressionHelper, ctx.FallbackList, queryExecutor);

            services.AddSingleton(p =>
            {
                // TODO: looks like a bit hackish
                ctx.TypeFactory.SetServiceFactory(p.GetService);
                return(ctx);
            });

            services.AddSingleton(p => ctx.TypeFactory);

            // add all registered handlers to DI (in order to use service factory callback from DI lib)
            foreach (var handler in ctx.TypeFactory.GetAllHandlers())
            {
                services.AddTransient(handler);
            }

            // add all registered handlers to DI (in order to use service factory callback from DI lib)
            foreach (var(service, implementation) in ctx.TypeFactory.GetAllTransientServiceMappings())
            {
                services.AddTransient(service, implementation);
            }

            services.AddSingleton(scanState);
            services.AddSingleton(keyBuilder);
            services.AddSingleton(expressionHelper);
            services.AddSingleton(queryExecutor);
            services.AddSingleton <IQueryExecutor>(queryExecutor);
            services.AddSingleton(commandExecutor);
            services.AddSingleton <ICommandExecutor>(commandExecutor);
            services.AddSingleton <ILogger>(p => new LoggerAdapter(p.GetService <ILogger <LoggerAdapter> >()));

            services.AddSingleton(new TypeDiscoveryHelper(new List <IResourceTypeScanner>
            {
                new LocalizedModelTypeScanner(keyBuilder, oldKeyBuilder, scanState, ctx, translationBuilder),
                new LocalizedResourceTypeScanner(keyBuilder, oldKeyBuilder, scanState, ctx, translationBuilder),
                new LocalizedEnumTypeScanner(keyBuilder, translationBuilder),
                new LocalizedForeignResourceTypeScanner(keyBuilder, oldKeyBuilder, scanState, ctx, translationBuilder)
            }, ctx));

            services.AddSingleton(localizationProvider);
            services.AddSingleton <ILocalizationProvider>(localizationProvider);
            services.AddTransient <ISynchronizer, Synchronizer>();
            services.AddTransient <Synchronizer>();

            services.AddSingleton <DbStringLocalizerFactory>();
            services.AddSingleton <IStringLocalizerFactory>(p => p.GetRequiredService <DbStringLocalizerFactory>());
            services.AddSingleton <DbHtmlLocalizerFactory>();
            services.AddSingleton <IHtmlLocalizerFactory>(p => p.GetRequiredService <DbHtmlLocalizerFactory>());
            services.AddTransient <IViewLocalizer, DbViewLocalizer>();
            services.AddTransient(typeof(IHtmlLocalizer <>), typeof(DbHtmlLocalizer <>));

            // we need to check whether invariant fallback is correctly configured
            if (ctx.EnableInvariantCultureFallback && !ctx.FallbackLanguages.Contains(CultureInfo.InvariantCulture))
            {
                ctx.FallbackLanguages.Then(CultureInfo.InvariantCulture);
            }

            // setup model metadata providers
            if (ctx.ModelMetadataProviders.ReplaceProviders)
            {
                services.Configure <MvcOptions>(
                    _ =>
                {
                    _.ModelMetadataDetailsProviders.Add(
                        new LocalizedDisplayMetadataProvider(
                            new ModelMetadataLocalizationHelper(localizationProvider, keyBuilder, ctx), ctx));
                });

                services.TryAddEnumerable(ServiceDescriptor.Transient <IConfigureOptions <MvcViewOptions>, ConfigureMvcViews>());
            }

            services.AddHttpContextAccessor();

            return(services);
        }
 public CasualResourceCollector(OldResourceKeyBuilder oldKeyKeyBuilder, DiscoveredTranslationBuilder translationBuilder)
 {
     _oldKeyKeyBuilder   = oldKeyKeyBuilder;
     _translationBuilder = translationBuilder;
 }
Ejemplo n.º 7
0
        public IEnumerable <DiscoveredResource> GetDiscoveredResources(
            Type target,
            object instance,
            MemberInfo mi,
            string translation,
            string resourceKey,
            string resourceKeyPrefix,
            bool typeKeyPrefixSpecified,
            bool isHidden,
            string typeOldName,
            string typeOldNamespace,
            Type declaringType,
            Type returnType,
            bool isSimpleType)
        {
            // check if there are [ResourceKey] attributes
            var keyAttributes = mi.GetCustomAttributes <ResourceKeyAttribute>().ToList();

            if (keyAttributes.Any())
            {
                yield break;
            }

            // check if there are [UseResource] attributes
            var useAttribute = mi.GetCustomAttribute <UseResourceAttribute>();

            if (useAttribute != null)
            {
                yield break;
            }

            var isResourceHidden = isHidden || mi.GetCustomAttribute <HiddenAttribute>() != null;
            var translations     = DiscoveredTranslation.FromSingle(translation);

            var additionalTranslationsAttributes = mi.GetCustomAttributes <TranslationForCultureAttribute>().ToArray();

            if (additionalTranslationsAttributes != null && additionalTranslationsAttributes.Any())
            {
                translations.AddRange(additionalTranslationsAttributes.Select(a =>
                                                                              new DiscoveredTranslation(a.Translation, a.Culture)));
            }

            var oldResourceKeys = OldResourceKeyBuilder.GenerateOldResourceKey(target, mi.Name, mi, resourceKeyPrefix,
                                                                               typeOldName, typeOldNamespace);

            yield return(new DiscoveredResource(mi,
                                                resourceKey,
                                                translations,
                                                mi.Name,
                                                declaringType,
                                                returnType,
                                                isSimpleType,
                                                isResourceHidden)
            {
                TypeName = target.Name,
                TypeNamespace = target.Namespace,
                TypeOldName = oldResourceKeys.Item2,
                TypeOldNamespace = typeOldNamespace,
                OldResourceKey = oldResourceKeys.Item1
            });
        }
        public IEnumerable <DiscoveredResource> GetDiscoveredResources(
            Type target,
            object instance,
            MemberInfo mi,
            string translation,
            string resourceKey,
            string resourceKeyPrefix,
            bool typeKeyPrefixSpecified,
            bool isHidden,
            string typeOldName,
            string typeOldNamespace,
            Type declaringType,
            Type returnType,
            bool isSimpleType)
        {
            var keyAttributes        = mi.GetCustomAttributes <ResourceKeyAttribute>().ToList();
            var validationAttributes = mi.GetCustomAttributes <ValidationAttribute>().ToList();

            if (keyAttributes.Count > 1 && validationAttributes.Any())
            {
                throw new InvalidOperationException(
                          "Model with data annotation attributes cannot have more than one `[ResourceKey]` attribute.");
            }

            foreach (var validationAttribute in validationAttributes)
            {
                if (validationAttribute.GetType() == typeof(DataTypeAttribute))
                {
                    continue;
                }

                if (keyAttributes.Any())
                {
                    resourceKey = keyAttributes.First().Key;
                }

                var validationResourceKey = ResourceKeyBuilder.BuildResourceKey(resourceKey, validationAttribute);
                var propertyName          = validationResourceKey.Split('.').Last();

                var oldResourceKeys = OldResourceKeyBuilder.GenerateOldResourceKey(target, propertyName, mi,
                                                                                   resourceKeyPrefix, typeOldName, typeOldNamespace);

                var translations = new List <DiscoveredTranslation>();
                translations.AddRange(DiscoveredTranslation.FromSingle(
                                          string.IsNullOrEmpty(validationAttribute.ErrorMessage)
                        ? propertyName
                        : validationAttribute.ErrorMessage));

                var validationTranslations = mi.GetCustomAttributes <ValidationTranslationForCultureAttribute>();
                foreach (var validationTranslationAttribute in validationTranslations)
                {
                    var validationAttributeName = validationAttribute.GetType().Name;
                    if (validationAttributeName.EndsWith("Attribute"))
                    {
                        validationAttributeName =
                            validationAttributeName.Substring(0,
                                                              validationAttributeName.LastIndexOf("Attribute", StringComparison.Ordinal));
                    }
                    if (validationTranslationAttribute.Validation == validationAttributeName)
                    {
                        translations.Add(new DiscoveredTranslation(validationTranslationAttribute.Translation,
                                                                   validationTranslationAttribute.Culture));
                    }
                }

                yield return(new DiscoveredResource(mi,
                                                    validationResourceKey,
                                                    translations,
                                                    propertyName,
                                                    declaringType,
                                                    returnType,
                                                    isSimpleType)
                {
                    TypeName = target.Name,
                    TypeNamespace = target.Namespace,
                    TypeOldName = oldResourceKeys.Item2,
                    TypeOldNamespace = typeOldNamespace,
                    OldResourceKey = oldResourceKeys.Item1
                });
            }
        }