C# (.NET) 中的国际化 (i18n)
国际化(缩写为 i18n,源自英文 "internationalization",其中 18 表示首字母 "i" 和尾字母 "n" 之间的字母数量)是一种软件设计过程,使其能够适应不同的语言、地区和文化特性,而无需修改源代码。在 .NET (C#) 平台中,i18n 通过框架内核内置的 本地化 和 全球化 机制来实现。
.NET 中 i18n 的核心概念
- 全球化 — 设计应用程序时考虑对多种区域性的支持(例如日期、数字、货币的格式)。
- 本地化 — 使界面适应特定区域性(翻译文本、图像、声音)。
- 区域性 (Culture) — 语言和区域设置的组合,用类似
ru-RU、en-US、de-DE的代码表示。 - 资源文件 (.resx) — 包含每个区域性的“键-值”对的 XML 文件。
i18n 在 C# (.NET) 中如何工作
在 .NET 中,本地化使用 资源文件。主文件(例如 Strings.resx)包含默认语言(通常是英语)的字符串。对于每种附加语言,会创建一个带有区域性代码后缀的单独文件:Strings.ru.resx(俄语)、Strings.de.resx(德语)。编译时,这些文件被转换为附属程序集,并根据当前线程的区域性进行加载。
// 资源文件示例 (Strings.resx)// Key: HelloMessage, Value: "Hello, World!"// Strings.ru.resx// Key: HelloMessage, Value: "Привет, мир!"在控制台应用程序中逐步实现本地化
- 在项目中创建资源文件:右键点击项目 → 添加 → 新建项 → 资源文件。将其命名为
Strings.resx。 - 添加字符串:插入键
Greeting和值Hello, user!。 - 为俄语创建文件:
Strings.ru.resx,使用相同的键和值Привет, пользователь!。 - 编写代码以设置区域性并获取本地化字符串:
using System.Globalization;using System.Resources;using System.Threading;
class Program{ static void Main() { // 设置俄语区域性 Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU"); Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
// 获取资源管理器 ResourceManager rm = new ResourceManager("YourNamespace.Strings", typeof(Program).Assembly); string greeting = rm.GetString("Greeting");
Console.WriteLine(greeting); // 输出: "Привет, пользователь!" }}ASP.NET Core Web 应用程序的本地化
在 ASP.NET Core 中,i18n 通过中间件和内置服务实现。我们来看一个为 MVC 或 Razor Pages 进行配置的示例。
1. 在 Program.cs 中进行配置
using Microsoft.AspNetCore.Localization;using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");builder.Services.AddControllersWithViews() .AddViewLocalization() .AddDataAnnotationsLocalization();
var app = builder.Build();
var supportedCultures = new[] { new CultureInfo("en-US"), new CultureInfo("ru-RU") };app.UseRequestLocalization(new RequestLocalizationOptions{ DefaultRequestCulture = new RequestCulture("en-US"), SupportedCultures = supportedCultures, SupportedUICultures = supportedCul