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)); }
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); }
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); }
public DisplayAttributeCollector(OldResourceKeyBuilder oldKeyBuilder, DiscoveredTranslationBuilder translationBuilder) { _oldKeyBuilder = oldKeyBuilder; _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; }
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 }); } }