引言
在全球化日益加深的今天,网站和应用程序的多语言支持变得尤为重要。ASP.NET Core 提供了一套强大的服务和中间件,帮助开发者轻松实现应用程序的全球化和本地化。本文将详细介绍如何在ASP.NET Core中实现全球化和本地化,并提供具体的实例代码。
全球化与本地化的基本概念
全球化(Globalization,简称G11N):使应用支持不同语言和区域的过程。它增加了对特定地理区域的语言文字的输入、显示和输出的支持。 本地化(Localization,简称L10N):针对一个特定的文化/区域,对已经完成了全球化处理的应用程序进行定制的过程。
ASP.NET Core 中的全球化和本地化实现
1. 配置中间件和服务
在ASP.NET Core中,首先需要在Startup.cs或Program.cs(取决于你使用的ASP.NET Core版本)中配置全球化和本地化相关的服务和中间件。
示例代码(基于.NET 6及以上版本):
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// 添加本地化服务
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
// 添加MVC服务和本地化支持
builder.Services.AddControllersWithViews()
.AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix)
.AddDataAnnotationsLocalization();
// 配置支持的语言和文化
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("fr"),
new CultureInfo("es")
};
builder.Services.Configure(options =>
{
options.DefaultRequestCulture = new RequestCulture("en-US");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
var app = builder.Build();
// 使用本地化中间件
var locOptions = app.Services.GetService>();
app.UseRequestLocalization(locOptions.Value);
// 其他中间件和路由配置...
2. 创建资源文件
资源文件(.resx)是存储本地化字符串的关键。每个资源文件对应一种语言,通常包含键值对。
示例:假设我们有一个HomeController,我们可以创建以下资源文件:
Resources/HomeController.en-US.resx(英语)Resources/HomeController.fr.resx(法语)Resources/HomeController.es.resx(西班牙语)
在HomeController.en-US.resx中,我们可能包含以下键值对:
<data name="Greeting" xml:space="preserve">
<value>Hello, World!value>
data>
3. 在控制器和视图中使用本地化
在控制器和视图中,可以使用IStringLocalizer或IViewLocalizer接口来访问资源文件中的本地化字符串。
控制器示例:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
namespace YourNamespace.Controllers
{
public class HomeController : Controller
{
private readonly IStringLocalizer _localizer;
public HomeController(IStringLocalizer localizer )
{
_localizer = localizer;
}
public IActionResult Index()
{
ViewBag.Greeting = _localizer["Greeting"];
return View();
}
}
}
视图示例(Index.cshtml):
@{
ViewData["Title"] = "Home Page";
}
<div>
<h1>@ViewBag.Greetingh1>
div>
4. Data Annotations 本地化
ASP.NET Core 也支持数据注解的本地化,这对于错误消息等非常有用。
Model 示例:
using System.ComponentModel.DataAnnotations;
namespace YourNamespace.Models
{
public class JobApplication
{
[Required(ErrorMessageResourceName = "NameRequired", ErrorMessageResourceType = typeof(Resources.JobApplication))]
[Display(Name = "Name", ResourceType = typeof(Resources.JobApplication))]
public string Name { get; set; }
// 其他属性...
}
}
在JobApplication.en-US.resx中:
<data name="NameRequired" xml:space="preserve">
<value>Please provide your name.value>
data>
<data name="Name" xml:space="preserve">
<value>Job applicant namevalue>
data>
5. 设置请求的文化
可以通过多种方式设置请求的文化,如查询字符串、Cookie或Accept-Language标头。ASP.NET Core 的Localization中间件会根据配置自动处理这些。
示例代码片段(在视图中设置下拉选择框允许用户选择文化):
<form id="cultureForm" asp-action="SetCulture" asp-route-returnUrl="@Context.Request.PathAndQuery()">
<label for="cultureSelector">Culture:label>
<select id="cultureSelector" name="culture" onchange="document.getElementById('cultureForm').submit();">
@foreach (var culture in new[] { "en-US", "fr", "es" })
{
<option value="@culture" @(culture == Context.Features.Get<IRequestCultureFeature>().RequestCulture.UICulture.Name ? "selected" : "")>@cultureoption>
}
select>
form>
控制器方法:
public IActionResult SetCulture(string culture, string returnUrl)
{
Response.Cookies.Append(
CookieRequestCultureProvider.DefaultCookieName,
CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
new CookieOptions { Expires = DateTimeOffset.UtcNow.AddYears(1) }
);
return LocalRedirect(returnUrl);
}
结论
ASP.NET Core 提供了强大的全球化和本地化支持,通过简单的配置和少量的代码,可以轻松实现多语言网站和应用程序。本文介绍了如何在ASP.NET Core项目中配置全球化和本地化服务,创建资源文件,并在控制器、视图和数据注解中使用本地化字符串。希望这些信息和示例代码能帮助你更好地理解和实现ASP.NET Core的全球化和本地化功能。