ASP.NET Core 5.0 本地化功能变更:移除ResourceManagerWithCultureStringLocalizer类与WithCulture方法
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
概述
在ASP.NET Core 5.0中,微软对本地化功能进行了重要调整,移除了ResourceManagerWithCultureStringLocalizer
类和ResourceManagerStringLocalizer.WithCulture
方法。这一变更旨在简化本地化API的使用方式,消除开发者在实现自定义本地化时可能遇到的困惑。
变更背景
被移除的成员
Microsoft.Extensions.Localization.ResourceManagerWithCultureStringLocalizer
类Microsoft.Extensions.Localization.ResourceManagerStringLocalizer.WithCulture
方法
这些成员实际上在.NET Core 3.0中就已经被标记为过时(obsolete),而在.NET 5.0中则被完全移除。
变更原因
微软做出这一变更主要基于以下考虑:
-
设计理念冲突:这些API给开发者造成了"每个语言每个资源都需要单独实例"的误解,而实际上本地化实例应该只是"每个资源"一个实例。
-
使用困惑:在实现自定义
IStringLocalizer
时,这些API常常成为混淆的源头。 -
运行时机制:正确的设计应该是依赖
CultureInfo.CurrentUICulture
属性在运行时决定使用的语言,而不是为每种语言创建单独的实例。
新旧行为对比
旧行为
在.NET Core 3.0及之前版本中:
- 可以使用
ResourceManagerWithCultureStringLocalizer
类 - 可以使用
ResourceManagerStringLocalizer.WithCulture
方法 - 这些API已被标记为过时
新行为
在.NET 5.0及以后版本中:
- 上述类和接口方法已被完全移除
- 开发者需要采用新的推荐方式实现本地化
迁移建议
对于正在使用这些API的项目,建议采取以下措施:
-
检查代码库:搜索项目中是否使用了
ResourceManagerWithCultureStringLocalizer
或WithCulture
方法。 -
移除相关调用:直接删除对这些API的调用。
-
采用标准实践:依赖
CultureInfo.CurrentUICulture
来决定当前UI文化,而不是为每种语言创建单独的本地化实例。 -
简化实现:在自定义
IStringLocalizer
实现时,只需关注资源管理,无需处理特定文化的实例化。
技术细节
正确的本地化实现方式
在ASP.NET Core中,本地化应该这样实现:
- 创建资源文件(如.resx文件)
- 注入
IStringLocalizer<T>
服务 - 让框架根据当前UI文化自动选择正确的资源
// 正确用法示例
public class MyService
{
private readonly IStringLocalizer<MyService> _localizer;
public MyService(IStringLocalizer<MyService> localizer)
{
_localizer = localizer;
}
public string GetLocalizedString()
{
return _localizer["HelloWorld"];
}
}
文化切换机制
文化切换应该通过以下方式之一实现:
- 中间件设置
CultureInfo.CurrentUICulture
- 查询字符串参数
- Cookie或用户首选项
而不是通过创建特定文化的本地化实例来实现。
总结
这一变更体现了ASP.NET Core团队对API设计的持续改进,移除了容易引起混淆的API,使本地化功能的实现更加直观和一致。开发者应该遵循新的推荐实践,简化本地化实现,让框架自动处理文化相关的资源查找。
对于从旧版本迁移的项目,这一变更主要影响那些直接使用了这些特定API的自定义本地化实现,标准用法通常不受影响。检查并更新代码后,项目将能够顺利迁移到ASP.NET Core 5.0及更高版本。
docs This repository contains .NET Documentation. 项目地址: https://gitcode.com/gh_mirrors/docs2/docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考