IdentityServer4(Skoruba的项目)==>更改STS项目的站点语言时出现问题

问题描述 投票:1回答:1

我想使用Identity Server 4(流行的OpenID Connect和OAuth框架)保护我的asp.net core 3.1 Web应用程序。我下载了Skoruba的IdentityServer4项目,并尝试更改其默认区域性,但是遇到了问题。该项目的默认区域性代码为“ en”,并且该项目中的所有输出(标签,错误消息,标题,视图等)均为英语。我想将这些输出更改为波斯语,并将站点的语言更改为波斯语。

您可以在here处看到项目的来源。

我更改了项目的某些文件,如下所示。 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”,但是,这些输出仍以英语而不是波斯语显示。谁能帮助我解决我的问题,或者该怎么解决?

c# oauth-2.0 identityserver4 openid-connect asp.net-core-3.1
1个回答
0
投票

我们通过覆盖HomeController中的默认区域性cookie来解决此问题。将这些代码放在Admin和Identity项目的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";
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.