我已经设置了
StartUp.cs
文件 - 本地化并配置支持的文化。我已经添加了本地化的资源路径,并使用services.AddLocalization()
方法来配置它,以及services.Configure\<RequestLocalizationOptions\>()
方法来指定默认请求文化、支持的文化和支持的UI文化。
但是,我在正确设置文化时遇到了困难,并且出现错误
设置文化失败:未找到
我尝试通过控制器和 ajax 设置文化。
我还要确保
UseRequestLocalization
管道在UseMvc
之前。
StartUp.cs
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
//---- Additional code added in Startup class's ConfigureServices
//
services.AddCors(); // https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2
services.AddDbContext<ApplicationDBContext>(
options => options.UseMySql(Configuration.GetConnectionString("DefaultConnection"))
);
// Configure strongly typed settings objects
var appSettingsSection = Configuration.GetSection("AppSettings");
services.Configure<AppSettings>(appSettingsSection);
// Configure jwt authentication
var appSettings = appSettingsSection.Get<AppSettings>();
// Before you can use the following command, var key = Encoding.ASCII.GetBytes(appSettings.Secret);
// to obtain the secret key value can be read from the appsettings.json file, you need three
// commands above to prepare the appSettings object.
// Notice that an object of a custom type AppSettings has been defined inside
// the Helpers namespace (folder).
var key = Encoding.ASCII.GetBytes(appSettings.Secret);
services.AddAuthentication(("CookieAuthenticationScheme"))
.AddCookie("CookieAuthenticationScheme", options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(7);
options.AccessDeniedPath = "/Home/Forbidden/";
options.LoginPath = "/Home/Login/";
});
services.AddAntiforgery();
// The following code will create a singleton object inside the services collection so that
// any Web API or Action controller class which uses this object can either create a current date time
// or mock-up date time for testing purposes.
// https://medium.com/@mattmazzola/asp-net-core-injecting-custom-data-classes-into-startup-classs-constructor-and-configure-method-7cc146f00afb
// Declaration technique to apply current system date time
services.AddSingleton<IAppDateTimeService>
(new AppDateTimeService("actual", DateTime.MinValue));
services.AddLocalization(opts => { opts.ResourcesPath = "Resources"; });
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new List<CultureInfo>()
{
new CultureInfo("zh-CN"),
new CultureInfo("tr-TR"),
new CultureInfo("en-US")
};
//options.DefaultRequestCulture = new RequestCulture(supportedCultures.First());
options.DefaultRequestCulture = new RequestCulture("tr-TR");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
options.FallBackToParentUICultures = true;
});
services.AddSingleton<SharedViewLocalizer>();
// Add Authorization Roles
services.AddAuthorization(options =>
{
options.AddPolicy("ADMIN",
authBuilder =>
{
authBuilder.RequireRole("ADMIN");
});
options.AddPolicy("STAFF",
authBuilder =>
{
authBuilder.RequireRole("STAFF");
});
options.AddPolicy("ADMIN2",
authBuilder =>
{
authBuilder.RequireRole("ADMIN2");
});
//options.AddPolicy("GUEST",
// authBuilder =>
// {
// authBuilder.RequireRole("GUEST");
// });
});
services.AddScoped<IUserService, UserService>();
services.AddScoped<IDBMailService, DBMailService>();
services.AddScoped<IImagesService, ImagesService>();
services.AddScoped<IBookingService, BookingService>();
services.AddScoped<INotificationRepository, NotificationRepository>();
services.AddScoped<ICustomerService, CustomerServices>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddSignalR(o =>
{
o.EnableDetailedErrors = true;
});
services.AddHttpContextAccessor();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseAuthentication();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
var locOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(locOptions.Value);
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
app.UseSignalR(routes =>
{
routes.MapHub<Notification>("/chat");
});
}
我这里有三个
.resx
文件:
这是我的
.cshtml
观点:
@using System.Security.Claims
@using AmkThkhCardBookingSystem.Services
@{var identity = Context.User.Identity as ClaimsIdentity; }
@using Microsoft.AspNetCore.Localization
@using AmkThkhCardBookingSystem.ExtensionMethods
@using System.Globalization;
@using Microsoft.Extensions.Localization
@inject IStringLocalizer<SharedResource> SharedLocalizer
@{ ViewData["Title"] = "Home Page"; }
@{ var requestCulture = Context.Features.Get<IRequestCultureFeature>();
var cultureList = ViewData["Cultures"] as List<SelectListItem>;
var currentUICulture = CultureInfo.CurrentUICulture.Name; }
<h3>@Html.Translate("VP")</h3><br />
<small>@currentUICulture</small>
<form id="selectLanguage" asp-controller="User"
asp-action="SetLanguage" asp-route-returnUrl="@Context.Request.Path"
method="post" role="form" style="width: 100%">
<select class="form-control" name="culture"
asp-for="@requestCulture.RequestCulture.UICulture.Name" asp-items="@cultureList" onchange="this.form.submit()"></select>
</form>
<select onchange="setCulture(this.value)">
<option value="en-US">English</option>
<option value="zh-CN">Français</option>
<option value="es-ES">Español</option>
</select>
<button onclick="setCulture('en-US')">English</button>
<button onclick="setCulture('zh-CN')">中文</button>
<script>
function setCulture(culture) {
var cookieValue = "Culture=" + culture + "; path=/; expires=Fri, 31 Dec 9999 23:59:59 GMT";
document.cookie = cookieValue;
console.log(document.cookie)
}
function setCulture(culture) {
$.ajax({
type: "POST",
url: "Settings/SetCulture2/zh-CN",
data: { culture: culture },
success: function (data) {
if (data.success) {
// Reload the page to apply the new culture
window.location.reload();
} else {
alert("Failed to set culture: " + data.error);
}
},
error: function (xhr, status, error) {
alert("Failed to set culture: " + error);
}
});
}
</script>
在我的 StartUp.cs 中,我通过“options.DefaultRequestCulture = new RequestCulture("tr-TR");”将默认文化设置为 tr-TR。但是,在我看来,@currentUICulture 值是 en-US。
最后,这是控制器类。我还尝试了以下两个代码。 (评论)
[HttpPost]
public IActionResult SetLanguage(string culture, string returnUrl)
{
//Response.Cookies.Append(
// CookieRequestCultureProvider.DefaultCookieName,
// CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
// new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
//);
//// Set the culture explicitly for the current request
//CultureInfo.CurrentCulture = new CultureInfo(culture);
//CultureInfo.CurrentUICulture = new CultureInfo(culture);
var cultureInfo = new CultureInfo(culture);
var thisss = cultureInfo.Name;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
_httpContextAccessor.HttpContext.Response.Cookies.Append("culture", "en-US", new CookieOptions
{
Expires = DateTimeOffset.Now.AddYears(1),
HttpOnly = true
});
return LocalRedirect(returnUrl);
}
我还能尝试什么来确保在我的应用程序中正确设置文化?
非常感谢您对我的问题的帮助。非常感谢您的时间和专业知识!
我还尝试重命名我的 resx 文件。这是在 ASP.NET Core 2.1.
中我想到了清除缓存,但不太确定该怎么做。