/// <summary> /// Add XLocalizer with DB support using customized entity models, /// and use defined translation service type /// </summary> /// <typeparam name="TContext">DbContext</typeparam> /// <typeparam name="TTranslator">Translation service</typeparam> /// <typeparam name="TResource">Type of localization DbEntity</typeparam> /// <param name="options">XLDbOptions</param> /// <param name="builder"></param> /// <returns></returns> public static IMvcBuilder AddXDbLocalizer <TContext, TTranslator, TResource>(this IMvcBuilder builder, Action <XLocalizerOptions> options) where TContext : DbContext where TTranslator : ITranslator where TResource : class, IXDbResource, new() { builder.Services.Configure <XLocalizerOptions>(options); // ExpressMemoryCache for caching localized values builder.Services.AddSingleton <ExpressMemoryCache>(); // Try add a default data exporter service, unless another service is defined in startup builder.Services.TryAddSingleton <IDbResourceExporter, EFDbResourceExporter <TContext> >(); // Try add a default resx service. // if another service has been registered this will be bypassed, and the other service will be in use. builder.Services.TryAddSingleton <IDbResourceProvider, EFDbResourceProvider <TContext> >(); // Register IStringLocalizer for the default shared resource and translation type // This is the default (shared) resource entity and translation builder.Services.AddSingleton <IStringLocalizer, DbStringLocalizer <TResource> >(); builder.Services.AddSingleton <IStringLocalizerFactory, DbStringLocalizerFactory <TResource> >(); // Register IHtmlLocalizer for the default shared resource and translation type // This is the default (shared) resource entity and translation builder.Services.AddSingleton <IHtmlLocalizer, DbHtmlLocalizer <TResource> >(); builder.Services.AddSingleton <IHtmlLocalizerFactory, DbHtmlLocalizerFactory <TResource> >(); // Register generic IDbStringLocalizer for user defined resource and translation entities // e.g. IDbStringLocalizer<ProductArea, ProductAreaTranslation> // e.g. IDbStringLocalizer<UserArea, UserAreaTranslation> builder.Services.AddTransient(typeof(IStringLocalizer <>), typeof(DbStringLocalizer <>)); builder.Services.AddTransient(typeof(IHtmlLocalizer <>), typeof(DbHtmlLocalizer <>)); // Express localizer factories for creating localizers with the default shared resource type // Use .Create() method for creating localizers. builder.Services.AddSingleton <IXStringLocalizerFactory, DbStringLocalizerFactory <TResource> >(); builder.Services.AddSingleton <IXHtmlLocalizerFactory, DbHtmlLocalizerFactory <TResource> >(); // Add custom providers for overriding default modelbinding and data annotations errors builder.Services.AddSingleton <IConfigureOptions <MvcOptions>, ConfigureMvcOptions>(); // Add data annotations locailzation builder.AddDataAnnotationsLocalization(ops => { // This will look for localization resource of default type T (shared resource) ops.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(TResource)); }); // Configure route culture provide return(builder.AddDbDataManagers <TContext>() .AddIdentityErrorsLocalization() .WithTranslationService <TTranslator>()); }