我想使用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”,但是,这些输出仍以英语而不是波斯语显示。谁能帮助我解决我的问题,或者该怎么解决?
我们通过覆盖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";
}
}