ASP.NET Core 全球化和本地化技术详解及实例代码

引言

在全球化日益加深的今天,网站和应用程序的多语言支持变得尤为重要。ASP.NET Core 提供了一套强大的服务和中间件,帮助开发者轻松实现应用程序的全球化和本地化。本文将详细介绍如何在ASP.NET Core中实现全球化和本地化,并提供具体的实例代码。

全球化与本地化的基本概念

  • 全球化(Globalization,简称G11N):使应用支持不同语言和区域的过程。它增加了对特定地理区域的语言文字的输入、显示和输出的支持。
  • 本地化(Localization,简称L10N):针对一个特定的文化/区域,对已经完成了全球化处理的应用程序进行定制的过程。

ASP.NET Core 中的全球化和本地化实现

1. 配置中间件和服务

在ASP.NET Core中,首先需要在Startup.csProgram.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. 在控制器和视图中使用本地化

在控制器和视图中,可以使用IStringLocalizerIViewLocalizer接口来访问资源文件中的本地化字符串。

控制器示例

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 { getset; }
        // 其他属性...
    }
}

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的全球化和本地化功能。


请使用浏览器的分享功能分享到微信等