.NET 6中IStringLocalizer.WithCulture的等效替代方案
IStringLocalizer.WithCulture() 方法在 .NET 5 版本中被标记为过时,到 .NET 6 版本已被正式移除,因此升级后会出现找不到方法的编译错误,和using引用、程序集引用没有关系。
在 .NET Core 3.1 中你能看到的过时提示已经给出了替代方向:不再通过IStringLocalizer实例方法切换文化,而是通过线程的CurrentCulture、CurrentUICulture属性控制文化上下文。
IStringLocalizer 读取资源时,默认会自动匹配当前执行上下文的CultureInfo.CurrentUICulture加载对应语言的资源,不需要单独为localizer实例指定文化。要获取指定cultureCode对应的本地化字符串,只需要临时切换当前上下文的UICulture,读取完成后还原即可,示例代码如下:
// 构造函数注入的_localizer不需要做任何修改 IStringLocalizer<Strings> _localizer; public IndexModel(IStringLocalizer<Strings> localizer) { _localizer = localizer; } public void GetTranslatedContent(string cultureCode, string resourceKey) { // 保存当前上下文原始的UI文化配置 var originalUiCulture = CultureInfo.CurrentUICulture; try { // 切换到目标语言文化 CultureInfo.CurrentUICulture = new CultureInfo(cultureCode); // 直接读取即可,会自动匹配目标语言资源 var translatedStr = _localizer[resourceKey].ToString(); // 编写对应业务逻辑处理拿到的目标语言文本 } finally { // 还原原始文化配置,避免影响后续逻辑执行 CultureInfo.CurrentUICulture = originalUiCulture; } }
如果是ASP.NET Core Web项目,常规场景下不需要手动切换文化:请求本地化中间件会自动根据请求的语言Cookie、Accept-Language头、路由文化参数自动设置当前请求上下文的Culture配置,直接注入IStringLocalizer读取即可拿到当前请求对应语言的文本。
两个属性都属于CultureInfo的上下文流转属性(.NET Core 2.0+ 支持异步上下文自动传递,不会在异步操作中串到其他并发请求),分工完全不同:
CultureInfo.CurrentCulture:负责数据格式化相关的文化规则,不控制界面文本语言。包括日期时间的显示格式、数字/货币的符号与格式、字符串大小写转换、排序比较的规则等,比如同一个DateTime值,在en-US文化下ToString会输出10/25/2024,在zh-CN文化下会输出2024/10/25,就是受这个属性控制。CultureInfo.CurrentUICulture:负责界面资源加载的文化匹配,也就是控制IStringLocalizer、传统Resx资源管理器读取哪个语言的资源文件。比如设置为ja-JP时,localizer会优先查找日语的本地化资源,找不到时回退到默认文化资源,这才是切换界面显示语言需要修改的属性。
注意:手动切换语言时一定要修改
CurrentUICulture,只修改CurrentCulture不会改变本地化文本的读取结果。
内容的提问来源于stack exchange,提问作者Matt W

