当前位置: 首页 > article >正文

ASP.NET Core全球化与本地化:打造多语言应用

一、引言

在经济全球化浪潮的席卷下,软件应用的受众早已突破地域限制,走向全球各个角落。为了满足不同地区用户的语言需求,ASP.NET Core 应用开发中,全球化与本地化的实现显得尤为关键。全球化旨在让应用程序具备适应不同国家和地区要求的能力,而本地化则是针对特定区域进行定制,使应用程序能以用户熟悉的语言和文化习惯与之交互。这不仅能显著提升用户体验,增强用户对应用的认同感和忠诚度,还能助力应用在全球市场中更广泛地传播,拓展业务版图。

本文将详细拆解在ASP.NET Core 中实现全球化和本地化的过程,通过 7 个清晰且易于操作的步骤,并辅以丰富的实例代码,为大家呈现如何打造一个功能完备的多语言应用程序。无论是初涉ASP.NET Core 开发的新手,还是寻求优化应用语言支持的资深开发者,都能从中获取实用的知识与技巧。

二、准备工作:搭建ASP.NET Core 项目框架

着手打造多语言应用前,我们得先搭建好ASP.NET Core 项目的基础框架。在此,推荐使用功能强大的 Visual Studio 来完成这一任务。

启动 Visual Studio 后,在初始界面中果断点击 “创建新项目” 选项。随即,会弹出一个罗列众多项目模板的对话框,在众多模板里,我们精准定位到 “ASP.NET Core Web 应用程序” 模板,然后点击 “下一步”。这一步就像是为即将开启的旅程选择合适的交通工具,而这个模板就是我们构建项目的得力座驾。

接下来,要为项目取一个既贴合实际用途又便于记忆的名称,比如 “MultilingualApp” ,同时指定项目的存储位置,确保路径清晰、易于访问。完成这些设置后,点击 “创建” 按钮。

紧接着,会再次出现一个模板选择界面,这里提供了多种不同类型的模板,比如 “Web 应用程序”“API”“空项目” 等 。鉴于我们的目标是创建一个具备多语言支持的应用程序,并且可能涉及前后端交互以及丰富的页面展示,所以选择 “Web 应用程序” 模板会更为合适。当然,如果你的项目侧重于提供接口服务,那么 “API” 模板则是更好的选择。这里的模板选择就如同为房屋设计蓝图,不同的模板决定了项目的整体架构和功能走向。

三、资源文件配置:奠定多语言基础

在ASP.NET Core 应用中,资源文件是实现多语言支持的基石,它如同一个存放不同语言文本的宝库,为应用提供了丰富的语言资源。我们在项目中创建一个专门用于存放资源文件的文件夹,命名为 “Resources” ,这个文件夹就像是一个精心打造的仓库,专门用来收纳各种语言的文本资源。

在 “Resources” 文件夹内,为每种需要支持的语言创建对应的.resx 文件。以英文和简体中文为例,我们创建 “Messages.en.resx” 和 “Messages.zh-Hans.resx” 文件。这些文件就如同不同语言的字典,将应用中需要展示的文本与对应的语言翻译进行关联。

打开 “Messages.en.resx” 文件,在其中添加如下内容:

<data name="Welcome">
    <value>Welcome to our application!</value>
</data>
<data name="About">
    <value>Learn more about our company and services.</value>
</data>

这里的 “Welcome” 和 “About” 是键,而对应的英文文本则是值。这些键值对就像是字典中的词条,通过键可以快速找到对应的英文文本。

同样,在 “Messages.zh-Hans.resx” 文件中添加相应的简体中文翻译:

<data name="Welcome">
    <value>欢迎使用我们的应用程序!</value>
</data>
<data name="About">
    <value>了解更多关于我们公司和服务的信息。</value>
</data>

这样,当应用需要根据用户的语言偏好展示不同语言的文本时,就可以从这些资源文件中精准获取对应的翻译。通过这种方式,我们为应用的多语言支持奠定了坚实的基础,使得应用能够轻松地在不同语言环境中切换,为全球用户提供一致且友好的语言体验 。

四、本地化中间件配置:让应用感知语言偏好

为了让ASP.NET Core 应用程序能够敏锐地识别用户的语言偏好,并根据这一偏好精准加载相应的资源文件,我们需要在Startup.cs文件中进行本地化中间件的配置 。这一步就像是为应用程序安装了一个智能的语言探测器,使其能够自动适应不同用户的语言需求。

在Startup.cs文件中,引入必要的命名空间:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.DependencyInjection;
using System.Globalization;

在ConfigureServices方法中,通过AddLocalization方法添加本地化服务,并指定资源文件的路径为之前创建的 “Resources” 文件夹 。这就如同为应用程序指明了语言资源的宝库所在位置。

public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");
    services.AddControllersWithViews().AddViewLocalization(LanguageViewLocationExpanderFormat.Suffix);
}

接着,在Configure方法中,使用UseRequestLocalization方法配置请求本地化中间件。在这里,我们需要设置默认的请求文化(即默认语言),以及应用程序所支持的文化和用户界面文化。假设我们的应用程序支持英文和简体中文,配置代码如下:

public void Configure(IApplicationBuilder app)
{
    var supportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en"),
        new CultureInfo("zh-Hans")
    };
    app.UseRequestLocalization(new RequestLocalizationOptions
    {
        DefaultRequestCulture = new RequestCulture("en"),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    });
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

在这段代码中,DefaultRequestCulture设置为 “en”,表示如果用户未明确表达语言偏好,应用程序将默认使用英文 。SupportedCultures和SupportedUICultures都包含了 “en” 和 “zh-Hans”,这表明应用程序支持英文和简体中文这两种语言。这里的配置就像是为应用程序制定了一套语言规则,使其能够根据用户的选择或默认设置,正确地展示相应语言的内容。通过这样的配置,本地化中间件就如同一位训练有素的翻译官,确保应用程序能够与全球用户顺畅地交流,为用户提供无缝的语言体验 。

五、本地化资源调用:在代码中展现多语言魅力

当我们完成资源文件的精心配置以及本地化中间件的巧妙设置后,接下来就该在代码中一展身手,实现本地化资源的调用,让应用程序能够根据用户的语言偏好,精准地呈现出相应语言的内容。在ASP.NET Core 中,我们借助强大的IStringLocalizer接口来达成这一目标,它就像是一把万能钥匙,能够轻松开启资源文件中不同语言文本的大门。

在控制器中,我们通过构造函数注入的方式获取IStringLocalizer实例。假设我们有一个名为HomeController的控制器,代码如下:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;

public class HomeController : Controller
{
    private readonly IStringLocalizer<HomeController> _localizer;

    public HomeController(IStringLocalizer<HomeController> localizer)
    {
        _localizer = localizer;
    }

    public IActionResult Index()
    {
        var welcomeMessage = _localizer["Welcome"];
        ViewData["Message"] = welcomeMessage;
        return View();
    }
}

在这段代码中,IStringLocalizer表示针对HomeController的本地化资源访问器。通过构造函数将其注入到控制器中,然后在Index方法里,使用_localizer[“Welcome”]来获取 “Welcome” 键对应的本地化文本。这里的 “Welcome” 键就像是资源文件这座宝库中的一个特定抽屉的标签,通过它可以快速找到对应的语言文本。将获取到的本地化消息存储在ViewData中,以便在视图中进行展示 。

在视图中,展示本地化资源同样轻松便捷。以 Razor 视图为例,假设我们有一个Index.cshtml视图文件,代码如下:

@using Microsoft.AspNetCore.Mvc.Localization
@inject IStringLocalizer<HomeController> Localizer

<h1>@Localizer["Welcome"]</h1>
<p>@ViewData["Message"]</p>

在这个视图文件中,首先通过@using指令引入Microsoft.AspNetCore.Mvc.Localization命名空间,确保能够正确使用本地化相关的功能。接着,使用@inject指令注入IStringLocalizer实例,命名为Localizer。在视图的主体部分,通过@Localizer[“Welcome”]直接显示 “Welcome” 键对应的本地化文本。这里就像是直接从本地化资源的字典中取出对应的值进行展示。同时,@ViewData[“Message”]用于显示在控制器中存储在ViewData里的本地化消息,这两种方式都能有效地将本地化资源呈现在用户面前,让用户看到符合其语言偏好的内容 。

除了这种简单的键值获取方式,当本地化字符串中包含格式化占位符时,IStringLocalizer也能巧妙应对。例如,在资源文件中定义如下内容:

<data name="GreetingWithName">
    <value>Hello, {0}! Welcome to our application.</value>
</data>

在控制器中,可以这样使用:

public IActionResult GreetUser(string name)
{
    var greeting = _localizer["GreetingWithName", name];
    return Content(greeting);
}

这里通过在_localizer[“GreetingWithName”, name]中传递额外的参数name,IStringLocalizer会自动将name的值填充到占位符{0}的位置,从而生成个性化的本地化问候语。这种灵活的格式化功能,使得本地化文本能够根据不同的业务场景和用户输入,呈现出丰富多样且贴合实际需求的内容,进一步提升了应用程序的多语言支持能力和用户体验 。

六、用户界面语言设置:赋予用户选择语言的权利

为了进一步提升用户体验,赋予用户自主选择语言的权利至关重要。在ASP.NET Core 应用中,实现这一功能并非难事,我们可以通过提供简洁直观的语言选择链接或按钮,让用户轻松切换语言。

在控制器中,我们定义一个用于设置用户界面文化的方法。以HomeController为例,添加如下方法:

public IActionResult SetLanguage(string culture, string returnUrl)
{
    Response.Cookies.Append(
        CookieRequestCultureProvider.DefaultCookieName,
        CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)),
        new CookieOptions { Expires = DateTimeOffset.UtcNow.AddDays(30) }
    );
    return LocalRedirect(returnUrl);
}

在这段代码中,SetLanguage方法接收两个参数:culture表示用户选择的语言文化,returnUrl则是用户操作完成后需要返回的页面地址 。通过Response.Cookies.Append方法,将用户选择的语言文化信息存储在名为AspNetCore.Culture的 Cookie 中,这里的 Cookie 就像是一个小型的记忆仓库,用于记录用户的语言偏好。设置 Cookie 的过期时间为 30 天,以确保用户在一段时间内再次访问应用时,仍能保持其选择的语言设置 。最后,使用LocalRedirect方法将用户重定向回原来的页面,这样用户在切换语言后,能够无缝地回到之前正在浏览的内容 。

在视图中,添加语言选择链接。以_Layout.cshtml视图为例,添加如下代码:

<ul class="nav navbar-nav">
    <li><a asp-action="SetLanguage" asp-route-culture="en" asp-route-returnUrl="@Context.Request.Path">English</a></li>
    <li><a asp-action="SetLanguage" asp-route-culture="zh-Hans" asp-route-returnUrl="@Context.Request.Path">中文</a></li>
</ul>

这段代码创建了一个包含两个链接的导航栏,分别对应英文和简体中文。asp-action指定了点击链接时调用的控制器方法,即前面定义的SetLanguage方法 。asp-route-culture传递用户选择的语言文化参数,这里分别为 “en” 和 “zh-Hans”。asp-route-returnUrl则传递当前页面的路径,确保用户在切换语言后能够准确返回当前页面 。通过这种方式,用户在浏览应用时,能够随时通过点击这些链接,轻松切换到自己熟悉的语言,极大地提升了应用的易用性和用户友好度 。

除了上述基于 Cookie 的方式,还可以通过在 URL 中传递语言参数来实现语言切换。例如,在路由配置中添加类似{culture}的参数,然后在中间件或控制器中解析该参数,以设置相应的语言文化。这种方式在一些场景下更为灵活,比如在需要分享特定语言版本页面链接的情况下,用户通过点击链接即可直接访问对应语言的内容 。

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件配置

    var supportedCultures = new List<CultureInfo>
    {
        new CultureInfo("en"),
        new CultureInfo("zh-Hans")
    };
    var options = new RequestLocalizationOptions
    {
        DefaultRequestCulture = new RequestCulture("en"),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures,
        RequestCultureProviders = new List<IRequestCultureProvider>
        {
            new RouteDataRequestCultureProvider()
        }
    };
    app.UseRequestLocalization(options);

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{culture}/{controller}/{action}",
            defaults: new { culture = "en", controller = "Home", action = "Index" });
    });
}

在上述代码中,RouteDataRequestCultureProvider会从路由数据中提取culture参数,并将其作为当前的语言文化设置。这样,当用户访问/en/Home/Index或/zh-Hans/Home/Index这样的 URL 时,应用会自动根据 URL 中的语言参数切换到对应的语言 。

七、日期和时间本地化:细节处的多语言适配

在多语言应用中,日期和时间的呈现若能契合用户的语言和区域习惯,无疑会极大提升用户体验。ASP.NET Core 为我们提供了完备的工具和机制,让日期和时间的本地化处理变得轻松高效。

在控制器中,当需要获取当前日期和时间并展示给用户时,我们可利用DateTime或DateTimeOffset类型,结合用户当前的文化信息进行格式化 。以HomeController为例,修改Index方法如下:

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using System.Globalization;

public class HomeController : Controller
{
    private readonly IStringLocalizer<HomeController> _localizer;

    public HomeController(IStringLocalizer<HomeController> localizer)
    {
        _localizer = localizer;
    }

    public IActionResult Index()
    {
        var welcomeMessage = _localizer["Welcome"];
        ViewData["Message"] = welcomeMessage;

        var currentDate = DateTime.Now;
        var culture = CultureInfo.CurrentCulture;
        var formattedDate = currentDate.ToString("F", culture);
        ViewData["CurrentDate"] = formattedDate;

        return View();
    }
}

在这段代码中,DateTime.Now获取当前的日期和时间 。CultureInfo.CurrentCulture获取当前用户的文化信息,它包含了语言、区域等相关设置。通过currentDate.ToString(“F”, culture),我们使用当前用户的文化设置对日期进行格式化 。这里的格式字符串 “F” 代表完整日期时间模式,例如在英文(美国)文化中,可能格式化为 “Friday, January 1, 2024 12:00:00 PM”,而在简体中文(中国)文化中,则可能格式化为 “2024 年 1 月 1 日 星期五 12:00:00” 。

在视图中,展示格式化后的日期同样简单。在Index.cshtml视图文件中,添加如下代码:

@using Microsoft.AspNetCore.Mvc.Localization
@inject IStringLocalizer<HomeController> Localizer

<h1>@Localizer["Welcome"]</h1>
<p>当前日期和时间:@ViewData["CurrentDate"]</p>

通过@ViewData[“CurrentDate”],我们将在控制器中格式化好的日期和时间呈现给用户。这样,用户看到的日期和时间格式将与他们的语言和区域设置相匹配,从而提供了更加自然和亲切的用户体验 。

若需要对日期和时间进行更精细的本地化处理,例如根据不同文化设置调整日期分隔符、时间格式等,可以在资源文件中定义特定的日期和时间格式字符串。在Resources文件夹下的Messages.en.resx文件中添加如下内容:

<data name="DateFormat">
    <value>MM/dd/yyyy</value>
</data>
<data name="TimeFormat">
    <value>hh:mm:ss tt</value>
</data>

在Messages.zh-Hans.resx文件中添加对应的简体中文格式:

<data name="DateFormat">
    <value>yyyy年MM月dd日</value>
</data>
<data name="TimeFormat">
    <value>HH:mm:ss</value>
</data>

在控制器中,根据用户的语言偏好从资源文件中获取相应的日期和时间格式字符串,并应用于日期和时间的格式化 。代码如下:

public IActionResult Index()
{
    var welcomeMessage = _localizer["Welcome"];
    ViewData["Message"] = welcomeMessage;

    var currentDate = DateTime.Now;
    var dateFormat = _localizer["DateFormat"];
    var timeFormat = _localizer["TimeFormat"];
    var combinedFormat = $"{dateFormat} {timeFormat}";
    var formattedDate = currentDate.ToString(combinedFormat);
    ViewData["CurrentDate"] = formattedDate;

    return View();
}

在这段代码中,_localizer[“DateFormat”]和_localizer[“TimeFormat”]分别从资源文件中获取当前语言对应的日期和时间格式字符串。通过将这两个格式字符串组合,并使用currentDate.ToString(combinedFormat)进行格式化,确保日期和时间的呈现方式完全符合用户的语言和文化习惯 。

八、总结与展望

通过这 7 个精心编排的步骤,我们成功解锁了ASP.NET Core 中全球化与本地化的强大功能,打造出一个能够跨越语言障碍、与全球用户紧密相连的多语言应用程序。从项目框架的搭建,到资源文件的细心配置,再到本地化中间件的巧妙运用,以及在代码中灵活调用本地化资源,每一步都如同铺设一块基石,共同构建起一个语言丰富、体验流畅的应用生态。

在这个全球化的时代,ASP.NET Core 的全球化与本地化功能为开发者们提供了无限可能。随着技术的不断演进,我们有理由期待这些功能将更加完善和强大。例如,未来或许会出现更智能的语言探测机制,能够基于用户的行为、设备信息等多维度数据,精准推断用户的语言偏好,从而实现更个性化、无缝的语言切换体验 。

同时,随着人工智能技术的蓬勃发展,将其与全球化和本地化相结合,或许能实现更高效、精准的翻译和本地化处理。比如,利用机器翻译技术实时生成资源文件,或者根据用户的实时反馈,动态优化本地化内容,让应用程序的语言支持更加贴合用户需求 。

希望本文能成为你在ASP.NET Core 全球化与本地化领域探索的得力指南,激发你在多语言应用开发上的更多创意与实践。无论是拓展应用的国际市场,还是提升用户的满意度,掌握这一技术都将为你的项目带来显著的竞争优势。让我们携手,在代码的世界里搭建起跨越语言界限的桥梁,为全球用户创造更加精彩、便捷的数字体验 。


http://www.kler.cn/a/509345.html

相关文章:

  • 【STM32】LED状态翻转函数
  • Linux:磁盘分区
  • JEL分类号
  • Leetcode3097:或值至少为 K 的最短子数组 II
  • Adobe与MIT推出自回归实时视频生成技术CausVid。AI可以边生成视频边实时播放!
  • springboot多环境配置
  • vulnhub靶场【jangow】靶机,考察反弹shell的流量及端口的选择
  • Transformer之Encoder
  • 如何在openEuler中编译安装Apache HTTP Server并设置服务管理(含Systemd和Init脚本)
  • 【Linux】线程全解:概念、操作、互斥与同步机制、线程池实现
  • linux下springboot项目nohup日志或tomcat日志切割处理方案
  • Redis集群部署详解:主从复制、Sentinel哨兵模式与Cluster集群的工作原理与配置
  • leetcode707-设计链表
  • 电脑风扇声音大怎么办? 原因及解决方法
  • github 端口22 超时问题解决
  • AWS物联网连接的数据记录器在冰川环境中的性能比较:Campbell CR1000X与ESP32开源
  • 【react】使用antd Table渲染数据遇到的报错问题
  • 用Cursor生成一个企业官网前端页面(生成腾讯、阿里官网静态页面)
  • redis安装教程(windows)
  • 从零到一:Spring Boot 与 RocketMQ 的完美集成指南
  • 25/1/18 嵌入式笔记 STM32F103
  • Golang——常用库sync
  • QT 使用QSqlTableModel对数据库进行创建,插入,显示
  • github登录用的TOTP和恢复码都丢失了怎么办
  • linux m、mm、mmm函数和make的区别
  • 与“神”对话:Swift 语言在 2025 中的云霓之望