为此,您需要在 ASP.Net Core 中配置稍微不同的本地化。
我已经创建了新的ASP.Net Core MVC
项目并执行以下步骤:
- 首先,您需要创建自定义
UrlRequestCultureProvider
public class UrlRequestCultureProvider : RequestCultureProvider
{
private static readonly Regex PartLocalePattern = new Regex(@"^[a-z]{2}(-[a-z]{2,4})?$", RegexOptions.IgnoreCase);
private static readonly Regex FullLocalePattern = new Regex(@"^[a-z]{2}-[A-Z]{2}$", RegexOptions.IgnoreCase);
private static readonly Dictionary<string, string> LanguageMap = new Dictionary<string, string>
{
{ "en", "en-US" },
{ "fr", "fr-FR" }
};
public override Task<ProviderCultureResult> DetermineProviderCultureResult(HttpContext httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException(nameof(httpContext));
}
var parts = httpContext.Request.Path.Value.Split('/');
// Get culture from path
var culture = parts[1];
if (parts.Length < 3)
{
return Task.FromResult<ProviderCultureResult>(null);
}
// For full languages fr-FR or en-US pattern
if (FullLocalePattern.IsMatch(culture))
{
return Task.FromResult(new ProviderCultureResult(culture));
}
// For part languages fr or en pattern
if (PartLocalePattern.IsMatch(culture))
{
var fullCulture = LanguageMap[culture];
return Task.FromResult(new ProviderCultureResult(fullCulture));
}
return Task.FromResult<ProviderCultureResult>(null);
}
}
- In
ConfigureServices()
添加此代码:
services.AddControllersWithViews().AddViewLocalization();
services.AddLocalization(options => options.ResourcesPath = "Resources");
services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCulters = new List<CultureInfo>()
{
new CultureInfo("en-US"),
new CultureInfo("fr-FR")
};
options.DefaultRequestCulture = new RequestCulture(supportedCulters.FirstOrDefault());
options.SupportedCultures = supportedCulters;
options.SupportedUICultures = supportedCulters;
options.RequestCultureProviders.Insert(0, new UrlRequestCultureProvider()
{
Options = options
});
});
- In
Configure()
添加此代码:
var requestLocalizationOptions = app.ApplicationServices.GetRequiredService<IOptions<RequestLocalizationOptions>>();
app.UseRequestLocalization(requestLocalizationOptions.Value);
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapControllerRoute(
name: "culture",
pattern: "{culture}/{controller=Home}/{action=Index}/{id?}");
});
- 另外,我添加了
Resources
用于 en-US 和 fr-FR 本地化。有关更多信息资源文件命名 https://learn.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-5.0#resource-file-naming-2在微软文档中。
Views.Home.Index.en-US.resx
Views.Home.Index.fr-FR.resx
- 最后,这是我的主页视图
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@{
ViewData["Title"] = "Home Page";
}
<div class="text-center">
<h1 class="display-4">@Localizer["Welcome"]</h1>
</div>
您可以在屏幕截图中看到结果。
Defaul ->
English ->
French ->
您可以向我提问并享受本地化的乐趣:)