C# (.NET) 中的国际化 (i18n):完整指南
国际化(常缩写为 i18n,源自英文单词“internationalization”,其中首字母 'i' 和尾字母 'n' 之间有 18 个字符)是一种软件设计过程,旨在使软件能够轻松适应不同的语言和区域设置,而无需修改源代码。在 C# (.NET) 生态系统中,国际化是一项内置且强大的功能,使开发人员能够创建真正的多语言应用程序。
在本文中,我们将详细介绍如何在 .NET(包括 .NET Core、.NET 5/6/7/8 和 .NET Framework)中实现 i18n。您将了解关键概念——区域性、资源文件 (RESX)、字符串、图片的本地化以及数据格式化。
核心概念
在进入代码之前,理解两个关键术语非常重要:
- 全球化 (Globalization):设计支持不同文化用户本地化界面和区域数据的应用程序的过程。在 .NET 中,这通过
CultureInfo和RegionInfo类实现。 - 本地化 (Localization):将已全球化的应用程序适配到特定语言/区域的过程(例如,翻译文本、调整日期和货币格式)。
.NET 使用 区域性 (Cultures),其格式为 语言-区域(例如,ru-RU 表示俄语(俄罗斯),en-US 表示英语(美国),de-DE 表示德语(德国))。
步骤 1:创建资源文件 (.resx)
在 .NET 中存储本地化字符串的主要方式是使用 资源文件 (.resx)。它们是 XML 文件,会被编译到程序集中。
来看一个示例。让我们为俄语和英语创建文件:
- Resources.resx — 默认资源文件(通常为英语)。
- Resources.ru.resx — 俄语资源文件。
- Resources.de.resx — 德语资源文件。
在每个文件中,我们将添加名称相同但值不同的字符串资源:
Resources.resx(默认语言 — en-US):
Name: GreetingValue: Hello, World!
Name: WelcomeMessageValue: Welcome to our application!Resources.ru.resx(俄语):
Name: GreetingValue: Привет, мир!
Name: WelcomeMessageValue: Добро пожаловать в наше приложение!步骤 2:在 C# 代码中访问资源
.NET 会自动生成一个强类型类来访问资源。假设文件位于项目的 Resources 文件夹中。那么访问方式如下:
using System;using System.Globalization;using System.Threading;
class Program{ static void Main(string[] args) { // 设置当前线程的区域性 Thread.CurrentThread.CurrentUICulture = new CultureInfo("ru-RU"); Thread.CurrentThread.CurrentCulture = new CultureInfo("ru-RU");
// 获取本地化字符串 string greeting = Resources.Messages.Greeting; string welcome = Resources.Messages.WelcomeMessage;
Console.WriteLine(greeting); // 输出:Привет, мир! Console.WriteLine(welcome); // 输出:Добро пожаловать в наше приложение! }}请注意:Resources.Messages 是一个自动生成的类,基于您的 RESX 文件名(如果文件名为 Messages.resx)。
步骤 3:在 ASP.NET Core 中进行本地化
在 ASP.NET Core Web 应用程序中,该过程