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 自己的文档更好(它忽略了潜在的缺陷,比如没有以非常特定的方式命名资源文件)。

让我总结几点:

  1. 需要将 IStringLocalizer 注入到他们的控制器中,例如: IStringLocalizer<MyController> _localizer;
  1. 然后在控制器中你可以本地化你的字符串,例如: _localizer["STRINGKEY"] 其中 STRINGKEY 是您的资源文件中的键。

  2. 确保正确命名您的资源文件。这非常重要,据我所知,Microsoft 没有记录!我花了很多时间才偶然发现上面提到的网络 link。 我是这样命名我的文件的: Resource.resx, Resource.es.resx等 并且本地化没有找到值,而只是 returning 键本身。 例如,_localizer["STRINGKEY]" 将 return "STRINGKEY" 而不是资源文件中的相应值。 所以你必须命名你的文件而不是使用你的控制器的名字,像这样: Controllers.MyController.resx, Controllers.MyController.es.resx

这些是要记住的要点。遗憾的是,Microsoft 文档掩盖了很多此类内容。