예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }