Exemplo n.º 1
0
        public void MergeEmptyLists()
        {
            var sut = new ResourceSynchronizer();

            var result = sut.MergeLists(Enumerable.Empty <LocalizationResource>(), null, null);

            Assert.Empty(result);
        }
Exemplo n.º 2
0
        /// <summary>
        ///     An IApplicationBuilder extension method that use database localization provider.
        /// </summary>
        /// <param name="builder">  The builder to act on. </param>
        /// <returns>   An IApplicationBuilder. </returns>
        public static IApplicationBuilder UseDbLocalizationProvider(this IApplicationBuilder builder)
        {
            var synchronizer =
                new ResourceSynchronizer(builder.ApplicationServices.GetService <ILocalizationDataService>());

            synchronizer.DiscoverAndRegister();

            // in cases when there has been already a call to LoclaizationProvider.Current (some static weird things)
            // and only then setup configuration is ran - here we need to reset instance once again with new settings
            LocalizationProvider.Initialize();

            return(builder);
        }
Exemplo n.º 3
0
        public static IApplicationBuilder UseDbLocalizationProvider(this IApplicationBuilder builder)
        {
            // create db schema
            using (var ctx = new LanguageEntities())
                ctx.Database.Migrate();

            var synchronizer = new ResourceSynchronizer();

            synchronizer.DiscoverAndRegister();

            // in cases when there has been already a call to LocalizationProvider.Current (some static weird things)
            // and only then setup configuration is ran - here we need to reset instance once again with new settings
            LocalizationProvider.Initialize();

            return(builder);
        }
        public static void UseDbLocalizationProvider(this IAppBuilder builder, Action <ConfigurationContext> setup = null)
        {
            // setup default implementations
            ConfigurationContext.Current.TypeFactory.ForQuery <AvailableLanguages.Query>().SetHandler <AvailableLanguages.Handler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetTranslation.Query>().SetHandler <GetTranslation.Handler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetAllResources.Query>().SetHandler <GetAllResources.Handler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetAllTranslations.Query>().SetHandler <GetAllTranslations.Handler>();

            ConfigurationContext.Current.TypeFactory.ForCommand <CreateNewResource.Command>().SetHandler <CreateNewResource.Handler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <DeleteResource.Command>().SetHandler <DeleteResource.Handler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <CreateOrUpdateTranslation.Command>().SetHandler <CreateOrUpdateTranslation.Handler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <ClearCache.Command>().SetHandler <ClearCache.Handler>();

            if (setup != null)
            {
                ConfigurationContext.Setup(setup);
            }

            var synchronizer = new ResourceSynchronizer();

            synchronizer.DiscoverAndRegister();
        }
Exemplo n.º 5
0
        public void Merge_AllDifferentResources_ShouldKeepAll()
        {
            var sut = new ResourceSynchronizer();
            var db  = new List <LocalizationResource>
            {
                new LocalizationResource("key-from-db")
                {
                    Translations = new List <LocalizationResourceTranslation>()
                    {
                        new LocalizationResourceTranslation
                        {
                            Language = "en", Value = "English from DB"
                        }
                    }
                }
            };

            var resources = new List <DiscoveredResource>
            {
                new DiscoveredResource(null, "discovered-resource", new List <DiscoveredTranslation> {
                    new DiscoveredTranslation("English discovered resource", "en")
                }, "", null, null, false, false)
            };

            var models = new List <DiscoveredResource>
            {
                new DiscoveredResource(null, "discovered-model", new List <DiscoveredTranslation> {
                    new DiscoveredTranslation("English discovered model", "en")
                }, "", null, null, false, false)
            };

            var result = sut.MergeLists(db, resources, models);

            Assert.NotEmpty(result);
            Assert.Equal(3, result.Count());
        }
Exemplo n.º 6
0
        public void Merge_DatabaseContainsDiscoveredResource_NotModified_ShouldOverwrite_IncludingInvariant()
        {
            var sut = new ResourceSynchronizer();
            var db  = new List <LocalizationResource>
            {
                new LocalizationResource("resource-key-1")
                {
                    Translations = new List <LocalizationResourceTranslation>
                    {
                        new LocalizationResourceTranslation
                        {
                            Language = string.Empty, Value = "Resource-1 INVARIANT from DB"
                        },
                        new LocalizationResourceTranslation
                        {
                            Language = "en", Value = "Resource-1 English from DB"
                        }
                    }
                },
                new LocalizationResource("resource-key-2")
                {
                    Translations = new List <LocalizationResourceTranslation>
                    {
                        new LocalizationResourceTranslation
                        {
                            Language = string.Empty, Value = "Resource-2 INVARIANT from DB"
                        },
                        new LocalizationResourceTranslation
                        {
                            Language = "en", Value = "Resource-2 English from DB"
                        }
                    }
                }
            };

            var resources = new List <DiscoveredResource>
            {
                new DiscoveredResource(null, "resource-key-1", new List <DiscoveredTranslation> {
                    new DiscoveredTranslation("Resource-1 INVARIANT from Discovery", string.Empty), new DiscoveredTranslation("Resource-1 English from Discovery", "en")
                }, "", null, null, false, false),
                new DiscoveredResource(null, "discovered-resource", new List <DiscoveredTranslation> {
                    new DiscoveredTranslation("English discovered resource", "en")
                }, "", null, null, false, false)
            };

            var models = new List <DiscoveredResource>
            {
                new DiscoveredResource(null, "discovered-model", new List <DiscoveredTranslation> {
                    new DiscoveredTranslation("English discovered model", "en")
                }, "", null, null, false, false),
                new DiscoveredResource(null, "resource-key-2", new List <DiscoveredTranslation> {
                    new DiscoveredTranslation("Resource-2 INVARIANT from Discovery", string.Empty), new DiscoveredTranslation("Resource-2 English from Discovery", "en")
                }, "", null, null, false, false)
            };

            var result = sut.MergeLists(db, resources, models);

            Assert.NotEmpty(result);
            Assert.Equal(4, result.Count());
            Assert.Equal("Resource-1 INVARIANT from Discovery", result.First(r => r.ResourceKey == "resource-key-1").Translations.ByLanguage(CultureInfo.InvariantCulture));
            Assert.Equal("Resource-1 English from Discovery", result.First(r => r.ResourceKey == "resource-key-1").Translations.ByLanguage("en"));
            Assert.Equal("Resource-2 INVARIANT from Discovery", result.First(r => r.ResourceKey == "resource-key-2").Translations.ByLanguage(CultureInfo.InvariantCulture));
            Assert.Equal("Resource-2 English from Discovery", result.First(r => r.ResourceKey == "resource-key-2").Translations.ByLanguage("en"));
        }
        public static IAppBuilder UseDbLocalizationProvider(this IAppBuilder builder, Action <ConfigurationContext> setup = null)
        {
            // setup default implementations
            ConfigurationContext.Current.TypeFactory.ForQuery <AvailableLanguages.Query>().SetHandler <AvailableLanguages.Handler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetTranslation.Query>().SetHandler <GetTranslation.Handler>();

            ConfigurationContext.Current.TypeFactory.ForQuery <GetAllResources.Query>().SetHandler <GetAllResources.Handler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetAllTranslations.Query>().SetHandler <GetAllTranslations.Handler>();

            ConfigurationContext.Current.TypeFactory.ForCommand <CreateNewResource.Command>().SetHandler <CreateNewResource.Handler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <DeleteResource.Command>().SetHandler <DeleteResource.Handler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <CreateOrUpdateTranslation.Command>().SetHandler <CreateOrUpdateTranslation.Handler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <ClearCache.Command>().SetHandler <ClearCache.Handler>();

            if (setup != null)
            {
                ConfigurationContext.Setup(setup);
            }

            var synchronizer = new ResourceSynchronizer();

            synchronizer.DiscoverAndRegister();

            // set model metadata providers
            if (ConfigurationContext.Current.ModelMetadataProviders.ReplaceProviders)
            {
                // set current provider
                if (ModelMetadataProviders.Current == null)
                {
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        ModelMetadataProviders.Current = new CachedLocalizedMetadataProvider();
                    }
                    else
                    {
                        ModelMetadataProviders.Current = new LocalizedMetadataProvider();
                    }
                }
                else
                {
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        ModelMetadataProviders.Current = new CompositeModelMetadataProvider <CachedLocalizedMetadataProvider>(ModelMetadataProviders.Current);
                    }
                    else
                    {
                        ModelMetadataProviders.Current = new CompositeModelMetadataProvider <LocalizedMetadataProvider>(ModelMetadataProviders.Current);
                    }
                }

                for (var i = 0; i < ModelValidatorProviders.Providers.Count; i++)
                {
                    var provider = ModelValidatorProviders.Providers[i];
                    if (!(provider is DataAnnotationsModelValidatorProvider))
                    {
                        continue;
                    }

                    ModelValidatorProviders.Providers.RemoveAt(i);
                    ModelValidatorProviders.Providers.Insert(i, new LocalizedModelValidatorProvider());
                    break;
                }
            }

            return(builder);
        }
        private void DiscoverAndRegister(object sender, EventArgs eventArgs)
        {
            ConfigurationContext.Setup(ctx =>
            {
                ctx.CacheManager = new EPiServerCacheManager();

                ctx.TypeScanners.Insert(0, new LocalizedCategoryScanner());

                ctx.TypeFactory.ForQuery <AvailableLanguages.Query>().SetHandler <EPiServerAvailableLanguages.Handler>();
                ctx.TypeFactory.ForQuery <DetermineDefaultCulture.Query>().SetHandler <EPiServerDetermineDefaultCulture.Handler>();
                ctx.TypeFactory.ForQuery <GetTranslation.Query>().SetHandler <EPiServerGetTranslation.Handler>();

                ctx.TypeFactory.ForQuery <GetAllResources.Query>().SetHandler <GetAllResourcesHandler>();
                ctx.TypeFactory.ForQuery <GetAllResources.Query>().DecorateWith <CachedGetAllResourcesHandler>();
                ctx.TypeFactory.ForQuery <GetResource.Query>().SetHandler <GetResourceHandler>();
                ctx.TypeFactory.ForQuery <GetAllTranslations.Query>().SetHandler <GetAllTranslationsHandler>();

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

                ctx.TypeFactory.ForCommand <CreateNewResource.Command>().SetHandler <CreateNewResourceHandler>();
                ctx.TypeFactory.ForCommand <DeleteResource.Command>().SetHandler <DeleteResourceHandler>();
                ctx.TypeFactory.ForCommand <RemoveTranslation.Command>().SetHandler <RemoveTranslationHandler>();
                ctx.TypeFactory.ForCommand <CreateOrUpdateTranslation.Command>().SetHandler <CreateOrUpdateTranslationHandler>();
                ctx.TypeFactory.ForCommand <ClearCache.Command>().SetHandler <ClearCacheHandler>();
            });

            ConfigurationContext.Current.DbContextConnectionString = ConfigurationManager.ConnectionStrings[ConfigurationContext.Current.Connection].ConnectionString;

            // we have to run resource sync *only* if database is not set in read-only mode
            // information about database mood at this current moment will give us IDatabaseMode
            var dbMode = _engine.Locate.Advanced.GetInstance <IDatabaseMode>().DatabaseMode;

            if (dbMode != DatabaseMode.ReadOnly)
            {
                try
                {
                    // let's try to sync and fail softly
                    var synchronizer = new ResourceSynchronizer();
                    synchronizer.DiscoverAndRegister();
                }
                catch (Exception e)
                {
                    _logger.Error("An error occurred while synchronizing resources.", e);
                }
            }
            else
            {
                _logger.Information("Skipped resource synchronization due to database being in low mood (ReadOnly).");
            }

            if (ConfigurationContext.Current.ModelMetadataProviders.ReplaceProviders)
            {
                if (!_context.Services.Contains(typeof(ModelMetadataProvider)))
                {
                    // set new provider
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider, CachedLocalizedMetadataProvider>();
                    }
                    else
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider, LocalizedMetadataProvider>();
                    }
                }
                else
                {
                    var currentProvider = ServiceLocator.Current.GetInstance <ModelMetadataProvider>();

                    // decorate existing provider
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider>(
                            new CompositeModelMetadataProvider <CachedLocalizedMetadataProvider>(currentProvider));
                    }
                    else
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider>(
                            new CompositeModelMetadataProvider <LocalizedMetadataProvider>(currentProvider));
                    }
                }

                for (var i = 0; i < ModelValidatorProviders.Providers.Count; i++)
                {
                    var provider = ModelValidatorProviders.Providers[i];
                    if (!(provider is DataAnnotationsModelValidatorProvider))
                    {
                        continue;
                    }

                    ModelValidatorProviders.Providers.RemoveAt(i);
                    ModelValidatorProviders.Providers.Insert(i, new LocalizedModelValidatorProvider());
                    break;
                }
            }

            // in cases when there has been already a call to LocalizationProvider.Current (some static weird things)
            // and only then setup configuration is ran - here we need to reset instance once again with new settings
            LocalizationProvider.Initialize();
            _context.Services.AddSingleton(LocalizationProvider.Current);
        }
        private void DiscoverAndRegister(object sender, EventArgs eventArgs)
        {
            ConfigurationContext.Setup(ctx =>
            {
                ctx.CacheManager = new EPiServerCacheManager();

                ctx.TypeScanners.Insert(0, new LocalizedCategoryScanner());

                ctx.TypeFactory.ForQuery <AvailableLanguages.Query>().SetHandler <EPiServerAvailableLanguages.Handler>();
                ctx.TypeFactory.ForQuery <GetTranslation.Query>().SetHandler <EPiServerGetTranslation.Handler>();

                ctx.TypeFactory.ForQuery <GetAllResources.Query>().SetHandler <GetAllResourcesHandler>();
                ctx.TypeFactory.ForQuery <GetAllTranslations.Query>().SetHandler <GetAllTranslationsHandler>();

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

                ctx.TypeFactory.ForCommand <CreateNewResource.Command>().SetHandler <CreateNewResourceHandler>();
                ctx.TypeFactory.ForCommand <DeleteResource.Command>().SetHandler <DeleteResourceHandler>();
                ctx.TypeFactory.ForCommand <CreateOrUpdateTranslation.Command>().SetHandler <CreateOrUpdateTranslationHandler>();
                ctx.TypeFactory.ForCommand <ClearCache.Command>().SetHandler <ClearCacheHandler>();
            });

            ConfigurationContext.Current.DbContextConnectionString = ConfigurationManager.ConnectionStrings[ConfigurationContext.Current.Connection].ConnectionString;

            var synchronizer = new ResourceSynchronizer();

            synchronizer.DiscoverAndRegister();

            if (ConfigurationContext.Current.ModelMetadataProviders.ReplaceProviders)
            {
                if (!_context.Services.Contains(typeof(ModelMetadataProvider)))
                {
                    // set new provider
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider, CachedLocalizedMetadataProvider>();
                    }
                    else
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider, LocalizedMetadataProvider>();
                    }
                }
                else
                {
                    var currentProvider = ServiceLocator.Current.GetInstance <ModelMetadataProvider>();

                    // decorate existing provider
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider>(
                            new CompositeModelMetadataProvider <CachedLocalizedMetadataProvider>(currentProvider));
                    }
                    else
                    {
                        _context.Services.AddSingleton <ModelMetadataProvider>(
                            new CompositeModelMetadataProvider <LocalizedMetadataProvider>(currentProvider));
                    }
                }

                for (var i = 0; i < ModelValidatorProviders.Providers.Count; i++)
                {
                    var provider = ModelValidatorProviders.Providers[i];
                    if (!(provider is DataAnnotationsModelValidatorProvider))
                    {
                        continue;
                    }

                    ModelValidatorProviders.Providers.RemoveAt(i);
                    ModelValidatorProviders.Providers.Insert(i, new LocalizedModelValidatorProvider());
                    break;
                }
            }

            // in cases when there has been already a call to LocalizationProvider.Current (some static weird things)
            // and only then setup configuration is ran - here we need to reset instance once again with new settings
            LocalizationProvider.Initialize();
            _context.Services.AddSingleton(LocalizationProvider.Current);
        }
        public static IAppBuilder UseDbLocalizationProvider(this IAppBuilder builder, Action <ConfigurationContext> setup = null)
        {
            // setup default implementations
            ConfigurationContext.Current.TypeFactory.ForQuery <AvailableLanguages.Query>().SetHandler <AvailableLanguagesHandler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetTranslation.Query>().SetHandler <GetTranslationHandler>();

            ConfigurationContext.Current.TypeFactory.ForQuery <GetAllResources.Query>().SetHandler <GetAllResourcesHandler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetAllResources.Query>().DecorateWith <CachedGetAllResourcesHandler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetResource.Query>().SetHandler <GetResourceHandler>();
            ConfigurationContext.Current.TypeFactory.ForQuery <GetAllTranslations.Query>().SetHandler <GetAllTranslationsHandler>();

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

            ConfigurationContext.Current.TypeFactory.ForCommand <CreateNewResource.Command>().SetHandler <CreateNewResourceHandler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <DeleteResource.Command>().SetHandler <DeleteResourceHandler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <RemoveTranslation.Command>().SetHandler <RemoveTranslationHandler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <CreateOrUpdateTranslation.Command>().SetHandler <CreateOrUpdateTranslationHandler>();
            ConfigurationContext.Current.TypeFactory.ForCommand <ClearCache.Command>().SetHandler <ClearCacheHandler>();

            ConfigurationContext.Current.CacheManager = new HttpCacheManager();

            if (setup != null)
            {
                ConfigurationContext.Setup(setup);
            }

            ConfigurationContext.Current.DbContextConnectionString = ConfigurationManager.ConnectionStrings[ConfigurationContext.Current.Connection].ConnectionString;

            var synchronizer = new ResourceSynchronizer();

            synchronizer.DiscoverAndRegister();

            // set model metadata providers
            if (ConfigurationContext.Current.ModelMetadataProviders.ReplaceProviders)
            {
                // set current provider
                if (ModelMetadataProviders.Current == null)
                {
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        ModelMetadataProviders.Current = new CachedLocalizedMetadataProvider();
                    }
                    else
                    {
                        ModelMetadataProviders.Current = new LocalizedMetadataProvider();
                    }
                }
                else
                {
                    if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                    {
                        ModelMetadataProviders.Current = new CompositeModelMetadataProvider <CachedLocalizedMetadataProvider>(ModelMetadataProviders.Current);
                    }
                    else
                    {
                        ModelMetadataProviders.Current = new CompositeModelMetadataProvider <LocalizedMetadataProvider>(ModelMetadataProviders.Current);
                    }
                }

                for (var i = 0; i < ModelValidatorProviders.Providers.Count; i++)
                {
                    var provider = ModelValidatorProviders.Providers[i];
                    if (!(provider is DataAnnotationsModelValidatorProvider))
                    {
                        continue;
                    }

                    ModelValidatorProviders.Providers.RemoveAt(i);
                    ModelValidatorProviders.Providers.Insert(i, new LocalizedModelValidatorProvider());
                    break;
                }
            }

            // in cases when there has been already a call to LoclaizationProvider.Current (some static weird things)
            // and only then setup configuration is ran - here we need to reset instance once again with new settings
            LocalizationProvider.Initialize();

            return(builder);
        }
Exemplo n.º 11
0
        public Tests()
        {
            var ctx = new ConfigurationContext();

            _sut = new ResourceSynchronizer(ctx, new QueryExecutor(ctx), new NullLogger());
        }
        private void DiscoverAndRegister(object sender, EventArgs eventArgs)
        {
            ConfigurationContext.Setup(ctx =>
            {
                ctx.ConnectionName = "EPiServerDB";
                ctx.CacheManager   = new EPiServerCacheManager();

                ctx.TypeFactory.ForQuery <AvailableLanguages.Query>().SetHandler <EPiServerAvailableLanguages.Handler>();
                ctx.TypeFactory.ForQuery <GetTranslation.Query>().SetHandler <EPiServerGetTranslation.Handler>();

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

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

                ctx.TypeFactory.ForCommand <CreateNewResource.Command>().SetHandler <CreateNewResource.Handler>();
                ctx.TypeFactory.ForCommand <DeleteResource.Command>().SetHandler <DeleteResource.Handler>();
                ctx.TypeFactory.ForCommand <CreateOrUpdateTranslation.Command>().SetHandler <CreateOrUpdateTranslation.Handler>();
                ctx.TypeFactory.ForCommand <ClearCache.Command>().SetHandler <ClearCache.Handler>();
            });

            var synchronizer = new ResourceSynchronizer();

            synchronizer.DiscoverAndRegister();

            if (!ConfigurationContext.Current.ModelMetadataProviders.ReplaceProviders)
            {
                return;
            }

            var currentProvider = _container.TryGetInstance <ModelMetadataProvider>();

            if (currentProvider == null)
            {
                // set current provider
                if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                {
                    _container.Configure(ctx => ctx.For <ModelMetadataProvider>().Use <CachedLocalizedMetadataProvider>());
                }
                else
                {
                    _container.Configure(ctx => ctx.For <ModelMetadataProvider>().Use <LocalizedMetadataProvider>());
                }
            }
            else
            {
                // decorate existing provider
                if (ConfigurationContext.Current.ModelMetadataProviders.UseCachedProviders)
                {
                    _container.Configure(ctx => ctx.For <ModelMetadataProvider>(Lifecycles.Singleton)
                                         .Use(() => new CompositeModelMetadataProvider <CachedLocalizedMetadataProvider>(currentProvider)));
                }
                else
                {
                    _container.Configure(ctx => ctx.For <ModelMetadataProvider>(Lifecycles.Singleton)
                                         .Use(() => new CompositeModelMetadataProvider <LocalizedMetadataProvider>(currentProvider)));
                }
            }

            for (var i = 0; i < ModelValidatorProviders.Providers.Count; i++)
            {
                var provider = ModelValidatorProviders.Providers[i];
                if (!(provider is DataAnnotationsModelValidatorProvider))
                {
                    continue;
                }

                ModelValidatorProviders.Providers.RemoveAt(i);
                ModelValidatorProviders.Providers.Insert(i, new LocalizedModelValidatorProvider());
                break;
            }
        }