.NET Core 本地化(Localization)技术详解

.NET Core 本地化(Localization)技术详解

docs This repository contains .NET Documentation. docs 项目地址: https://gitcode.com/gh_mirrors/docs2/docs

什么是本地化

本地化是将应用程序资源翻译成目标文化区域特定版本的过程。在.NET Core中,本地化是构建全球化应用程序的关键环节,它让应用程序能够适应不同语言和地区的用户需求。

本地化基础概念

资源文件(.resx)

资源文件是XML格式的文件,扩展名为.resx,它是.NET中存储本地化字符串的主要机制。资源文件命名通常遵循以下模式:

<完整类型名><.区域>.resx

其中:

  • <完整类型名>代表特定类型的本地化资源
  • <.区域>是可选的,表示资源文件内容的区域设置

文化区域回退机制

.NET采用智能的文化区域回退策略来查找最匹配的资源文件。例如,当请求"sr-Cyrl-RS"文化区域时,查找顺序为:

  1. 精确匹配的"sr-Cyrl-RS.resx"
  2. 仅语言和书写系统匹配的"sr-Cyrl.resx"
  3. 仅语言匹配的"sr.resx"
  4. 默认的".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));

运行示例

使用不同文化区域参数运行程序会得到不同的本地化输出:

  1. 英语(默认):
Hi friends, the ".NET" developer community is excited to see you here!
On Tuesday, August 3, 2021 my dinner cost $37.63.
  1. 塞尔维亚拉丁语:
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 ¤.

最佳实践

  1. 资源文件组织:将资源文件放在专门的Resources文件夹中,并按功能/模块组织
  2. 命名规范:使用一致的命名规范,如<类型名>.<文化>.resx
  3. 回退策略:总是提供默认的资源文件(.resx)
  4. 测试策略:测试所有支持的文化区域,确保格式和布局正确
  5. 参数化字符串:使用参数化消息处理动态内容,确保在不同语言中的正确位置插入变量

常见问题解决

  1. 资源文件找不到:检查RootNamespaceAttribute是否设置正确,确保资源文件命名和路径正确
  2. 文化区域不生效:确认CultureInfo.CurrentCultureCultureInfo.CurrentUICulture都已正确设置
  3. 格式化问题:对于数字、日期等,使用文化区域特定的格式化方法

通过合理使用.NET Core的本地化功能,可以轻松构建支持多语言、多地区的全球化应用程序,为用户提供更好的本地化体验。

docs This repository contains .NET Documentation. docs 项目地址: https://gitcode.com/gh_mirrors/docs2/docs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌昱有Melanie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值