Проблема с изменением языка сайта проекта STS IdentityServer4.Admin (Проект Скорубы) - PullRequest
1 голос
/ 05 мая 2020

Я хочу защитить свои веб-приложения asp. net core 3.1 с помощью Identity Server 4 (популярных OpenID Connect и OAuth Framework). Я загрузил проект Скорубы IdentityServer4 и пытаюсь изменить его культуру по умолчанию, но у меня возникают проблемы.
Код культуры по умолчанию для этого проекта - «en» и все выходы (метки, сообщения об ошибках, заголовки, просмотры, ...) в этом проекте на английском sh. Я хочу изменить эти выходные данные на персидский и изменить язык сайта на персидский.

Вы можете увидеть исходный код проекта в здесь .

Я изменил некоторые файлы проект, как показано ниже. Файл appsettings.js:

"CultureConfiguration": {
  "Cultures": [ "en", "fa", "fr", "ru", "sv", "zh", "da", "fi" ],
  "DefaultCulture": "fa"
}

Класс CultureConfiguration:

public class CultureConfiguration
{
    public static readonly string[] AvailableCultures = { "en", "fa", "fr", "ru", "sv", "zh", "da", "fi" };
    public static readonly string DefaultRequestCulture = "fa";

    public List<string> Cultures { get; set; }
    public string DefaultCulture { get; set; } = DefaultRequestCulture;
}

И, наконец, в его StartupHelpers классе я изменил тело метода AddMvcWithLocalization следующим образом :

public static IMvcBuilder AddMvcWithLocalization<TUser, TKey>(this IServiceCollection services, IConfiguration configuration)
    where TUser : IdentityUser<TKey>
    where TKey : IEquatable<TKey>
{
    services.AddLocalization(opts => { opts.ResourcesPath = ConfigurationConsts.ResourcesPath; });

    services.TryAddTransient(typeof(IGenericControllerLocalizer<>), typeof(GenericControllerLocalizer<>));

    var mvcBuilder = services.AddControllersWithViews(o =>
        {
            o.Conventions.Add(new GenericControllerRouteConvention());
        })
        .AddViewLocalization(
            LanguageViewLocationExpanderFormat.Suffix,
            opts => { opts.ResourcesPath = ConfigurationConsts.ResourcesPath; })
        .AddDataAnnotationsLocalization()
        .ConfigureApplicationPartManager(m =>
        {
            m.FeatureProviders.Add(new GenericTypeControllerFeatureProvider<TUser, TKey>());
        });

    var cultureConfiguration = configuration.GetSection(nameof(CultureConfiguration)).Get<CultureConfiguration>();
    services.Configure<RequestLocalizationOptions>(
        opts =>
        {
            // If cultures are specified in the configuration, use them (making sure they are among the available cultures),
            // otherwise use all the available cultures
            var supportedCultureCodes = (cultureConfiguration?.Cultures?.Count > 0 ?
                cultureConfiguration.Cultures.Intersect(CultureConfiguration.AvailableCultures) :
                CultureConfiguration.AvailableCultures).ToArray();

            if (!supportedCultureCodes.Any()) supportedCultureCodes = CultureConfiguration.AvailableCultures;
            var supportedCultures = supportedCultureCodes.Select(c => new CultureInfo(c)).ToList();

            // If the default culture is specified use it, otherwise use CultureConfiguration.DefaultRequestCulture ("en")
            var defaultCultureCode = string.IsNullOrEmpty(cultureConfiguration?.DefaultCulture) ?
                CultureConfiguration.DefaultRequestCulture : cultureConfiguration?.DefaultCulture;

            // If the default culture is not among the supported cultures, use the first supported culture as default
            if (!supportedCultureCodes.Contains(defaultCultureCode)) defaultCultureCode = supportedCultureCodes.FirstOrDefault();

            opts.DefaultRequestCulture = new RequestCulture(defaultCultureCode);
            opts.SupportedCultures = supportedCultures;
            opts.SupportedUICultures = supportedCultures;
            //CultureInfo.DefaultThreadCurrentCulture = new CultureInfo(supportedCultureCodes.First(c => c.Contains("fa")));
        });

    return mvcBuilder;
}


На самом деле, после этих изменений, код культуры по умолчанию изменился на «fa», но эти выходные данные по-прежнему отображаются на английском sh вместо персидского.
Кто-нибудь может помочь где моя проблема или что мне делать, чтобы решить эту проблему?

1 Ответ

1 голос
/ 06 мая 2020

Мы справились с этим, переопределив кухню культуры по умолчанию ie в HomeController.
Поместите эти коды в HomeController как для проектов администратора, так и для проектов идентификации.

public class HomeController : BaseController
{
    private readonly ILogger<ConfigurationController> _logger;

    public HomeController(ILogger<ConfigurationController> logger) : base(logger)
    {
        _logger = logger;
    }

    public IActionResult Index()
    {
        if (Request?.Cookies?.ContainsKey(CookieRequestCultureProvider.DefaultCookieName) == false)
        {
            SetRequestCultureCookie(ConfigurationConsts.DefaultRequestCultureName);
        }
        return View();
    }

    public IActionResult SetLanguage(string culture, string returnUrl)
    {
        SetRequestCultureCookie(culture);

        return LocalRedirect(returnUrl);
    }

    private void SetRequestCultureCookie(string cultureName)
    {
        Response.Cookies.Append(
            CookieRequestCultureProvider.DefaultCookieName,
            CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(cultureName)),
            new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
        );
    }
}

И добавьте язык по умолчанию в константах

namespace Skoruba.IdentityServer4.Admin.Configuration.Constants
{
    public class ConfigurationConsts
    {
        ...
        ...
        public const string DefaultRequestCultureName = "fa";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...