/// <summary>
        /// Adds services required for application localization.
        /// The Asp.Net Core AddLocalization() method will be called.
        /// </summary>
        /// <param name="services">The Microsoft.Extensions.DependencyInjection.IServiceCollection to add the services to.</param>
        /// <param name="setupAction">An System.Action&lt;ForEvolveLocalizationOptions&gt; to configure the ForEvolve.AspNetCore.Localization.ForEvolveLocalizationOptions.</param>
        /// <returns>The Microsoft.Extensions.DependencyInjection.IServiceCollection so that additional calls can be chained.</returns>
        public static IServiceCollection AddForEvolveLocalization(this IServiceCollection services, Action <ForEvolveLocalizationOptions> setupAction)
        {
            // Localization Options
            var supportedCultures = new List <CultureInfo>(new[]
            {
                new CultureInfo("en"),
                new CultureInfo("fr"),
                new CultureInfo("he"),
                new CultureInfo("pt"),
                new CultureInfo("pt-BR"),
                new CultureInfo("es"),
                new CultureInfo("no"),
                new CultureInfo("nb"),
            });
            var defaultCulture      = supportedCultures.First();
            var localizationOptions = new ForEvolveLocalizationOptions
            {
                ResourcesPath = DefaultResourcesPath,
                MvcOptions    = new ForEvolveMvcLocalizationOptions
                {
                    EnableDataAnnotationsLocalization   = true,
                    EnableViewLocalization              = true,
                    ConfigureValidationMetadataProvider = provider => { },
                    DefaultAdapterOptions = new ForEvolveMvcDefaultLocalizationAdapterOptions()
                },
                RequestLocalizationOptions = CreateDefaultRequestLocalizationOptions(defaultCulture, supportedCultures)
            };

            setupAction(localizationOptions);

            // Create and configure the LocalizationValidationMetadataProvider
            var defaultValidationMetadataProvider = new ForEvolveLocalizationValidationMetadataProvider <DataAnnotationSharedResource>(
                // Custom multi-messages adapter that duplicate the attribute logic
                // A better solution is welcome :)
                new StringLengthLocalizationValidationAttributeAdapter(),

                // Keep this one last
                new DefaultLocalizationValidationAttributeAdapter(localizationOptions.MvcOptions.DefaultAdapterOptions)
                );

            localizationOptions.MvcOptions
            .ConfigureValidationMetadataProvider(defaultValidationMetadataProvider);

            // Regiter services
            services
            .AddSingleton(localizationOptions)
            //.AddSingleton<ILocalizationValidationMetadataProvider>(defaultValidationMetadataProvider)
            .AddLocalization(options =>
            {
                options.ResourcesPath = localizationOptions.ResourcesPath;
            });

            // Keep global references
            Options = localizationOptions;
            ValidationMetadataProvider = defaultValidationMetadataProvider;

            return(services);
        }
 public CreateValidationMetadata()
 {
     MyMockAdapter    = new Mock <ILocalizationValidationAttributeAdapter>();
     ProvierUnderTest = new ForEvolveLocalizationValidationMetadataProvider <DataAnnotationTestResource>(new[] { MyMockAdapter.Object });
 }