ASP.NET 运行时的核心资源本地化
ASP.NET Core resource localization at runtime
我正在尝试本地化托管服务以响应在变量 lang
中馈送的运行时条件,该变量表示 2 个字母的 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;
returns 正确值 check = 'es'
.
但接着下一句:
var msg = Resources.TestMsg
从我的英文资源文件 Resource.resx
而不是 Resource.es.resx
.
中获取我的值
我做错了什么,我该如何让它发挥作用?
谢谢!
好的,所以最终对我有用的是完全遵循本指南中的步骤:https://joonasw.net/view/aspnet-core-localization-deep-dive
这个 link 是我发现的唯一对我有用的来源,它比 Microsoft 自己的文档更好(它忽略了潜在的缺陷,比如没有以非常特定的方式命名资源文件)。
让我总结几点:
- 需要将 IStringLocalizer 注入到他们的控制器中,例如:
IStringLocalizer<MyController> _localizer;
然后在控制器中你可以本地化你的字符串,例如:
_localizer["STRINGKEY"]
其中 STRINGKEY 是您的资源文件中的键。
确保正确命名您的资源文件。这非常重要,据我所知,Microsoft 没有记录!我花了很多时间才偶然发现上面提到的网络 link。
我是这样命名我的文件的:
Resource.resx, Resource.es.resx
等
并且本地化没有找到值,而只是 returning 键本身。
例如,_localizer["STRINGKEY]"
将 return "STRINGKEY" 而不是资源文件中的相应值。
所以你必须命名你的文件而不是使用你的控制器的名字,像这样:
Controllers.MyController.resx, Controllers.MyController.es.resx
这些是要记住的要点。遗憾的是,Microsoft 文档掩盖了很多此类内容。
我正在尝试本地化托管服务以响应在变量 lang
中馈送的运行时条件,该变量表示 2 个字母的 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;
returns 正确值 check = 'es'
.
但接着下一句:
var msg = Resources.TestMsg
从我的英文资源文件 Resource.resx
而不是 Resource.es.resx
.
我做错了什么,我该如何让它发挥作用? 谢谢!
好的,所以最终对我有用的是完全遵循本指南中的步骤:https://joonasw.net/view/aspnet-core-localization-deep-dive
这个 link 是我发现的唯一对我有用的来源,它比 Microsoft 自己的文档更好(它忽略了潜在的缺陷,比如没有以非常特定的方式命名资源文件)。
让我总结几点:
- 需要将 IStringLocalizer 注入到他们的控制器中,例如:
IStringLocalizer<MyController> _localizer;
然后在控制器中你可以本地化你的字符串,例如:
_localizer["STRINGKEY"]
其中 STRINGKEY 是您的资源文件中的键。确保正确命名您的资源文件。这非常重要,据我所知,Microsoft 没有记录!我花了很多时间才偶然发现上面提到的网络 link。 我是这样命名我的文件的:
Resource.resx, Resource.es.resx
等 并且本地化没有找到值,而只是 returning 键本身。 例如,_localizer["STRINGKEY]"
将 return "STRINGKEY" 而不是资源文件中的相应值。 所以你必须命名你的文件而不是使用你的控制器的名字,像这样:Controllers.MyController.resx, Controllers.MyController.es.resx
这些是要记住的要点。遗憾的是,Microsoft 文档掩盖了很多此类内容。