【问题标题】:ASP.NET Core resource localization at runtime运行时的 ASP.NET Core 资源本地化
【发布时间】:2022-01-22 14:31:26
【问题描述】:

我正在尝试本地化托管服务以响应变量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;

返回正确的值check = 'es'

但是接下来的语句:

var msg = Resources.TestMsg

从我的英文资源文件Resource.resx而不是Resource.es.resx中获取我的值。

我做错了什么,我怎样才能让它发挥作用? 谢谢!

【问题讨论】:

  • IStringLocalizer
  • 但我想使用资源文件,IStringLocalizer 将如何帮助?
  • 你看过IStringLocalizer吗?这适用于资源文件...

标签: c# asp.net .net localization resources


【解决方案1】:

好的,所以最终对我有用的是完全按照本指南中的步骤操作:https://joonasw.net/view/aspnet-core-localization-deep-dive

此链接是我发现的唯一对我有用的来源,它比 Microsoft 自己的文档更好(它忽略了潜在的缺陷,例如没有以非常确定的方式命名资源文件)。

让我总结几点:

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

  2. 确保正确命名您的资源文件。这非常重要,据我所知微软没有记录!花了我很多时间,直到我偶然发现上面提到的网络链接。 我这样命名我的文件: Resource.resx, Resource.es.resx等 并且本地化的没有找到值,而只是返回键本身。 例如,_localizer["STRINGKEY]" 将返回“STRINGKEY”而不是资源文件中的相应值。 因此,您必须使用 Controller 的名称来命名文件,如下所示: Controllers.MyController.resx, Controllers.MyController.es.resx

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

【讨论】:

    猜你喜欢
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2019-01-13
    相关资源
    最近更新 更多