public void NotInheritedModel_ContainsOnlyDeclaredProperties() { 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); var properties = sut.ScanResources(typeof(SampleViewModelWithBase)).ToList(); var keys = properties.Select(p => p.Key).ToList(); var stringLengthResource = properties.FirstOrDefault(r => r.Key == "DbLocalizationProvider.Tests.DataAnnotations.SampleViewModelWithBase.ChildProperty-StringLength"); Assert.Contains("DbLocalizationProvider.Tests.DataAnnotations.SampleViewModelWithBase.ChildProperty-Description", keys); Assert.NotNull(stringLengthResource); Assert.Contains("StringLength", stringLengthResource.Translations.DefaultTranslation()); Assert.DoesNotContain("DbLocalizationProvider.Tests.DataAnnotations.SampleViewModelWithBase.BaseProperty", keys); Assert.DoesNotContain("DbLocalizationProvider.Tests.DataAnnotations.SampleViewModelWithBase.BaseProperty-Required", keys); Assert.DoesNotContain("DbLocalizationProvider.Tests.DataAnnotations.SampleViewModelWithBase.ChildProperty-Description-Required", keys); }
public LocalizedResourceDiscoveryTests() { 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); _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); _types = _sut.GetTypesWithAttribute <LocalizedResourceAttribute>().ToList(); Assert.NotEmpty(_types); }
public LocalizedEnumTests() { var types = new[] { typeof(DocumentEntity) }; 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.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); _expressionHelper = new ExpressionHelper(keyBuilder); Assert.NotEmpty(types); _properties = types.SelectMany(t => _sut.ScanResources(t)); }
public DataAnnotationsTests() { 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>() .ForQuery <GetTranslation.Query>().SetHandler <GetTranslationReturnResourceKeyHandler>(); 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); var expressHelper = new ExpressionHelper(keyBuilder); _provider = new LocalizationProvider(keyBuilder, expressHelper, new FallbackLanguagesCollection(), queryExecutor); }
public void SameModel_MultipleDefinitions_DoesNotThrowException() { 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.TypeFactory); 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); var resources = sut.ScanResources(typeof(ViewModelWithDuplicateSubModels)); Assert.NotNull(resources); var count = resources.Count(r => r.Key == "DbLocalizationProvider.Tests.SubModel.MyProperty-StringLength"); Assert.Equal(1, count); }
public void Test() { 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.TypeFactory); 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); var expressionHelper = new ExpressionHelper(keyBuilder); var properties = new[] { typeof(SampleViewModelWithBaseNotInherit), typeof(BaseLocalizedViewModel) } .Select(t => sut.ScanResources(t)) .ToList(); var childModel = new SampleViewModelWithBaseNotInherit(); var basePropertyKey = expressionHelper.GetFullMemberName(() => childModel.BaseProperty); Assert.Equal("DbLocalizationProvider.Tests.InheritedModels.BaseLocalizedViewModel.BaseProperty", basePropertyKey); }
public ValidationAttributeCollector( ResourceKeyBuilder keyBuilder, OldResourceKeyBuilder oldKeyBuilder, DiscoveredTranslationBuilder translationBuilder) { _keyBuilder = keyBuilder; _oldKeyBuilder = oldKeyBuilder; _translationBuilder = translationBuilder; }
public CustomAttributeCollector( ResourceKeyBuilder keyBuilder, OldResourceKeyBuilder oldKeyBuilder, ConfigurationContext configurationContext, DiscoveredTranslationBuilder translationBuilder) { _keyBuilder = keyBuilder; _oldKeyBuilder = oldKeyBuilder; _configurationContext = configurationContext; _translationBuilder = translationBuilder; }
public void ViewModelType_ShouldSelectModelScanner() { var state = new ScanState(); var keyBuilder = new ResourceKeyBuilder(state); var ctx = new ConfigurationContext(); ctx.TypeFactory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <DetermineDefaultCulture.Handler>(); var queryExecutor = new QueryExecutor(ctx.TypeFactory); var translationBuilder = new DiscoveredTranslationBuilder(queryExecutor); var sut = new LocalizedModelTypeScanner(keyBuilder, new OldResourceKeyBuilder(keyBuilder), state, ctx, translationBuilder); var result = sut.ShouldScan(typeof(SampleViewModel)); Assert.True(result); }
public void Resource_WithJustStaticGetSet_TranslationShouldBePropertyName() { var state = new ScanState(); var keyBuilder = new ResourceKeyBuilder(state); var ctx = new ConfigurationContext(); ctx.TypeFactory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <DetermineDefaultCulture.Handler>(); var queryExecutor = new QueryExecutor(ctx.TypeFactory); var translationBuilder = new DiscoveredTranslationBuilder(queryExecutor); var sut = new LocalizedResourceTypeScanner(keyBuilder, new OldResourceKeyBuilder(keyBuilder), state, ctx, translationBuilder); var result = sut.GetResources(typeof(PageResources), null); Assert.True(result.Any()); Assert.Equal("Header", result.First().Translations.DefaultTranslation()); }
public DuplicateCulturesTests() { var state = new ScanState(); var keyBuilder = new ResourceKeyBuilder(state); var oldKeyBuilder = new OldResourceKeyBuilder(keyBuilder); var ctx = new ConfigurationContext(); ctx.TypeFactory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <NorwegianDefaultCulture>(); 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); }
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); 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); }
public DisplayAttributeCollector(OldResourceKeyBuilder oldKeyBuilder, DiscoveredTranslationBuilder translationBuilder) { _oldKeyBuilder = oldKeyBuilder; _translationBuilder = translationBuilder; }
public ResourceKeyAttributeCollector(ResourceKeyBuilder keyBuilder, DiscoveredTranslationBuilder translationBuilder) { _keyBuilder = keyBuilder; _translationBuilder = translationBuilder; }
/// <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; }