/// <summary> /// Adds the AppText admin UI. By default it uses the same virtual path as the API. It can be overridden via the options. /// </summary> /// <param name="appTextBuilder">AppText components builder</param> /// <param name="setupAction">Configures AppText.AdminApp options (optionally)</param> /// <returns></returns> public static AppTextBuilder AddAdmin(this AppTextBuilder appTextBuilder, Action <AppTextAdminConfigurationOptions> setupAction = null) { // Register as application part with embedded views var mvcBuilder = appTextBuilder.Services.AddMvcCore(); var assembly = typeof(AdminController).Assembly; mvcBuilder.AddApplicationPart(assembly); var options = GetOptions(appTextBuilder.Services, appTextBuilder.ApiConfiguration, setupAction); ConfigureServices(appTextBuilder.Services, assembly, options); mvcBuilder.AddMvcOptions(mvcOptions => { mvcOptions.Conventions.Insert(0, new AppTextRouteConvention(options.RoutePrefix, assembly)); mvcOptions.Conventions.Add(new AppTextAuthorizationConvention( options.RequireAuthenticatedUser.HasValue ? options.RequireAuthenticatedUser.Value : false, options.RequiredAuthorizationPolicy, assembly)); }); // Enable Translations module for our own translations. appTextBuilder.AddTranslations(); // Create AdminApp appTextBuilder.InitializeApp(Constants.AppTextAdminAppId, Constants.AppTextAdminAppDescription, new[] { "en", "nl" }, "en", isSystem: true); // Import translations (register as IHostedService) appTextBuilder.Services.AddHostedService <AppTextAdminInitializer>(); return(appTextBuilder); }
/// <summary> /// Adds AppText as localization implementation for standard .NET Core Localization functionality. When added to an application, you can use the /// standard .NET Core localization facilities (IStringLocalizer, IViewLocalizer), but with AppText as content backend. /// </summary> /// <param name="appTextBuilder">AppText components builder</param> /// <param name="setupAction">Configures AppText.Localization options</param> /// <returns></returns> public static AppTextBuilder AddAppTextLocalization(this AppTextBuilder appTextBuilder, Action <AppTextLocalizationOptions> setupAction = null) { var services = appTextBuilder.Services; services.AddSingleton <IStringLocalizerFactory, AppTextStringLocalizerFactory>(); services.AddSingleton <IHtmlLocalizerFactory, AppTextHtmlLocalizerFactory>(); services.AddSingleton <AppTextBridge>(); services.TryAddTransient(typeof(IStringLocalizer <>), typeof(StringLocalizer <>)); services.AddScoped <IEventHandler <ContentItemChangedEvent>, ContentItemChangedEventHandler>(); services.AddScoped <IEventHandler <AppChangedEvent>, AppChangedEventHandler>(); // Register for IOptions<AppTextLocalizationOptions> if (setupAction != null) { services.Configure(setupAction); } // Enable Translations module for our own translations. appTextBuilder.AddTranslations(); // Add initializer as hosted service appTextBuilder.Services.AddHostedService <LocalizationInitializer>(); // Configure RequestLocalizationOptions var enrichOptions = setupAction ?? delegate { }; var options = new AppTextLocalizationOptions(); enrichOptions(options); if (options.ConfigureRequestLocalizationOptions) { services.AddOptions <RequestLocalizationOptions>() .Configure <IServiceScopeFactory>((locOptions, serviceScopeFactory) => { using (var scope = serviceScopeFactory.CreateScope()) { var applicationStore = scope.ServiceProvider.GetRequiredService <IApplicationStore>(); var app = AsyncHelper.RunSync(() => applicationStore.GetApp(App.SanitizeAppId(options.AppId))); locOptions.SupportedUICultures = app.Languages.Select(lang => new CultureInfo(lang)).ToList(); locOptions.DefaultRequestCulture = new RequestCulture(CultureInfo.CurrentCulture, new CultureInfo(app.DefaultLanguage)); } }); } return(appTextBuilder); }