asp.net 运行时的.NET核心资源本地化

xam8gpfp  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(151)

我正在尝试本地化一个托管服务,以响应一个变量lang中提供的运行时条件,该变量表示一个两个字母的ISO代码(如“en”、“es”等)。
我在Startup.cs中设置了本地化服务,如下所示:
services.AddLocalization(options => { options.ResourcesPath = "xresx"; });
在我的控制器中我有以下代码:
Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(lang);
我知道这是可行的,因为当我传入lang='es'时,如下所示:
var check = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName;
会传回正确的值check = 'es'
但紧接着下一句声明:
var msg = Resources.TestMsg
从英语资源文件Resource.resx而不是Resource.es.resx中获取值。
我做错了什么,我怎么才能让它工作?谢谢!

bnl4lu3b

bnl4lu3b1#

好的,所以最终对我有效的是完全按照本指南中的步骤操作:https://joonasw.net/view/aspnet-core-localization-deep-dive
这个链接是我找到的唯一对我有用的来源,它比微软自己的文档(它省略了潜在的陷阱,比如没有以非常确定的方式命名资源文件)要好。
让我总结几点:
1.需要将IStringLocalizer注入到其控制器中,例如:IStringLocalizer<MyController> _localizer;
1.然后在控制器内部,您可以本地化您的字符串,例如:_localizer["STRINGKEY"],其中STRINGKEY是资源文件中的键。
1.请确保正确命名资源文件。这一点非常重要,据我所知,Microsoft没有相关文档!我花了很多时间才找到上面提到的Web链接。我将文件命名为:Resource.resx, Resource.es.resx等,而本地化的方法没有找到值,而是返回键本身。例如,_localizer["STRINGKEY]"将返回“STRINGKEY”,而不是资源文件中的相应值。因此,您必须使用控制器的名称来命名文件,如下所示:Controllers.MyController.resx, Controllers.MyController.es.resx
这些都是要记住的要点。可悲的是,微软文档掩盖了很多这方面的东西。

相关问题