.NET Core 本地化(Localization)技术详解
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
什么是本地化
本地化是将应用程序资源翻译成目标文化区域特定版本的过程。在.NET Core中,本地化是构建全球化应用程序的关键环节,它让应用程序能够适应不同语言和地区的用户需求。
本地化基础概念
资源文件(.resx)
资源文件是XML格式的文件,扩展名为.resx,它是.NET中存储本地化字符串的主要机制。资源文件命名通常遵循以下模式:
<完整类型名><.区域>.resx
其中:
<完整类型名>
代表特定类型的本地化资源<.区域>
是可选的,表示资源文件内容的区域设置
文化区域回退机制
.NET采用智能的文化区域回退策略来查找最匹配的资源文件。例如,当请求"sr-Cyrl-RS"文化区域时,查找顺序为:
- 精确匹配的"sr-Cyrl-RS.resx"
- 仅语言和书写系统匹配的"sr-Cyrl.resx"
- 仅语言匹配的"sr.resx"
- 默认的".resx"文件
配置本地化服务
注册本地化服务
在.NET Core中,通过AddLocalization
扩展方法注册本地化服务:
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddLocalization();
配置资源文件路径
可以指定资源文件的存放路径:
builder.Services.AddLocalization(options =>
{
options.ResourcesPath = "Resources";
});
核心接口使用
IStringLocalizer
IStringLocalizer<T>
是本地化的核心接口,用于获取本地化字符串:
public class MessageService
{
private readonly IStringLocalizer<MessageService> _localizer;
public MessageService(IStringLocalizer<MessageService> localizer)
{
_localizer = localizer;
}
public string GetGreetingMessage() => _localizer["GreetingMessage"];
}
IStringLocalizerFactory
当需要更灵活地创建本地化器时,可以使用工厂模式:
public class ParameterizedMessageService
{
private readonly IStringLocalizer _localizer;
public ParameterizedMessageService(IStringLocalizerFactory factory)
{
_localizer = factory.Create(typeof(ParameterizedMessageService));
}
public string GetFormattedMessage(DateTime date, decimal price) =>
_localizer["DinnerPriceFormat", date, price];
}
资源文件示例
默认资源文件(MessageService.resx)
<data name="GreetingMessage" xml:space="preserve">
<value>Hi friends, the ".NET" developer community is excited to see you here!</value>
</data>
塞尔维亚语资源文件(MessageService.sr-Latn.resx)
<data name="GreetingMessage" xml:space="preserve">
<value>Zdravo prijatelji, ".NET" developer zajednica je uzbuđena što vas vidi ovde!</value>
</data>
实际应用示例
完整程序示例
[assembly: RootNamespace("Localization.Example")]
Console.OutputEncoding = System.Text.Encoding.Unicode;
if (args.Length == 1)
{
CultureInfo.CurrentCulture =
CultureInfo.CurrentUICulture =
CultureInfo.GetCultureInfo(args[0]);
}
var host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddLocalization();
services.AddTransient<MessageService>();
services.AddTransient<ParameterizedMessageService>();
})
.ConfigureLogging(builder =>
builder.SetMinimumLevel(LogLevel.Warning))
.Build();
var messageService = host.Services.GetRequiredService<MessageService>();
Console.WriteLine(messageService.GetGreetingMessage());
var parameterizedService = host.Services.GetRequiredService<ParameterizedMessageService>();
Console.WriteLine(parameterizedService.GetFormattedMessage(DateTime.Now, 37.63m));
运行示例
使用不同文化区域参数运行程序会得到不同的本地化输出:
- 英语(默认):
Hi friends, the ".NET" developer community is excited to see you here!
On Tuesday, August 3, 2021 my dinner cost $37.63.
- 塞尔维亚拉丁语:
Zdravo prijatelji, ".NET" developer zajednica je uzbuđena što vas vidi ovde!
U utorak, 03. avgust 2021. moja večera je koštala 37,63 ¤.
最佳实践
- 资源文件组织:将资源文件放在专门的Resources文件夹中,并按功能/模块组织
- 命名规范:使用一致的命名规范,如
<类型名>.<文化>.resx
- 回退策略:总是提供默认的资源文件(.resx)
- 测试策略:测试所有支持的文化区域,确保格式和布局正确
- 参数化字符串:使用参数化消息处理动态内容,确保在不同语言中的正确位置插入变量
常见问题解决
- 资源文件找不到:检查
RootNamespaceAttribute
是否设置正确,确保资源文件命名和路径正确 - 文化区域不生效:确认
CultureInfo.CurrentCulture
和CultureInfo.CurrentUICulture
都已正确设置 - 格式化问题:对于数字、日期等,使用文化区域特定的格式化方法
通过合理使用.NET Core的本地化功能,可以轻松构建支持多语言、多地区的全球化应用程序,为用户提供更好的本地化体验。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考