我正在尝试本地化一个托管服务,以响应一个变量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
中获取值。
我做错了什么,我怎么才能让它工作?谢谢!
1条答案
按热度按时间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
这些都是要记住的要点。可悲的是,微软文档掩盖了很多这方面的东西。