在下面的程序中,为了获取资源字符串,我使用 _localizer["About Title"],其中“About Title”是一个魔术字符串。如何避免使用这样的字符串?有没有强类型的方法?
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
namespace Localization.StarterWeb.Controllers
{
[Route("api/[controller]")]
public class AboutController : Controller
{
private readonly IStringLocalizer<AboutController> _localizer;
public AboutController(IStringLocalizer<AboutController> localizer)
{
_localizer = localizer;
}
[HttpGet]
public string Get()
{
return _localizer["About Title"];
}
}
}
-
使用您的翻译创建资源文件 (.resx)。例如,如果您正在本地化AboutController
那会是这样的AboutController.String.resx
.
-
在编辑资源屏幕上时,通过将访问修饰符从“无代码生成”更改为“公共”或“内部”,为资源文件启用代码生成。保存时这将创建一个.Designer.cs
资源文件的类。它将包含资源文件中每个键的静态属性。不要手动修改生成的类。每次修改后都会自动重新生成.resx
.
-
使用控制器中生成的设计器类来获取翻译后的文本(在这种情况下不需要字符串本地化程序):
[HttpGet]
public string Get()
{
return AboutController_Strings.AboutTitle;
}
这将与using static
还有技巧:
using static Localization.StarterWeb.AboutController_Strings;
//(...)
[HttpGet]
public string Get()
{
return AboutTitle;
}
或者,您可以将其与 ASP 的本地化程序一起使用。这在特定情况下没有增加任何价值,但对于IHtmlLocalizer
因为它会为您转义 html 值。
[HttpGet]
public string Get()
{
return _localizer[nameof(AboutTitle)];
}
为什么这比公认的答案更好?这样您就不需要手动创建和维护所有LocalizationKeys
-类似内部有多个 const 字符串的类。 (在更大的项目中,将会有数百或数千个!)生成的.Designer.cs
类将包含资源文件中的所有键。而已。一点也没有少。如果您从资源填充中删除某些内容,它将从生成的代码中删除,并在使用已删除属性的任何地方在代码中产生编译错误。如果您向资源文件添加某些内容,它将在保存资源文件时自动生成一个新属性,该属性将出现在代码完成中。
这是一种更传统的方法,最初是通过 WinForms 完成的。在微软的本地化 ASP.NET Core 的文档 https://learn.microsoft.com/aspnet/core/fundamentals/localization应用程序有一个简短的解释为什么他们添加了一种新的方式使用IStringLocalizer
:硬编码翻译字符串使您的工作流程更快。在需要之前无需维护额外的东西。
对于许多开发人员来说,没有默认语言 .resx 文件并简单地包装字符串文字的新工作流程可以减少本地化应用程序的开销。其他开发人员会更喜欢传统的工作流程,因为它可以更轻松地处理较长的字符串文字,并更轻松地更新本地化字符串。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)