Vik*_*eni 7 .net c# asp.net-core asp.net-core-localization
在下面的程序中,为了获取资源字符串,我正在使用_localizer ["关于标题"],其中"关于标题"是一个神奇的字符串.如何避免使用这样的字符串?有任何强烈的打字方式吗?
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"];
}
}
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*ine 11
如果您尝试避免使用硬编码字符串(键)来查找本地化转换,则可以创建一个LocalizationKeys包含查找键的类.然后,您可以利用C#6 nameof运算符.这有助于缓解"魔术弦"的担忧.
public static class LocalizationKeys
{
public const string AboutTitle = nameof(AboutTitle); // Note: this is "AboutTitle"
// ... other keys here
}
Run Code Online (Sandbox Code Playgroud)
然后你可以在任何地方消费它.其中一个好处是,由于这是类的成员,如果键更改,您可以使用常用的重构工具来安全地替换对它的所有引用,而不是尝试在"魔术字符串"上执行全局字符串替换.另一个好处是你可以在访问类时使用intellisense.我想人们可以认为这是"强类型".
你会这样消费它:
[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[LocalizationKeys.AboutTitle];
}
}
Run Code Online (Sandbox Code Playgroud)
如果你真的想要使用C#6,你也可以使用静态使用.这将允许您引用指定类型的成员.最后,对于简单的"单行"返回,我们可以使它们成为表达式主体.例如:
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using static Localization.StarterWeb.LocalizationKeys; // Note: static keyword
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() => _localizer[AboutTitle]; // Note: omission of qualifier
}
}
Run Code Online (Sandbox Code Playgroud)
创建包含翻译的资源文件(.resx)。例如,如果您要本地化AboutController,则类似于AboutController.String.resx。
通过在编辑资源屏幕上将Access Modifier从“无代码生成”更改为“公共”或“内部”,为资源文件启用代码生成。保存后,将为.Designer.cs您的资源文件创建一个类。对于资源文件中的每个键,它将包含一个静态属性。不要手动修改生成的类。每次修改都会自动重新生成.resx。
在控制器中使用生成的设计器类来获取翻译后的文本(在这种情况下,无需字符串本地化器):
[HttpGet]
public string Get()
{
return AboutController_Strings.AboutTitle;
}
Run Code Online (Sandbox Code Playgroud)
这也可以使用using static技巧:
using static Localization.StarterWeb.AboutController_Strings;
//(...)
[HttpGet]
public string Get()
{
return AboutTitle;
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以将其与ASP的本地化程序一起使用。在这种特定情况下,这不会增加任何值,但是对于会很有用,IHtmlLocalizer因为它将为您html逃逸这些值。
[HttpGet]
public string Get()
{
return _localizer[nameof(AboutTitle)];
}
Run Code Online (Sandbox Code Playgroud)为什么这比公认的答案更好?这样,您无需手动创建和维护所有LocalizationKeys带有多个const字符串的类似类。(在较大的项目中,将有成百上千个!)生成的.Designer.cs类将包含资源文件中的所有键。而已。没什么。如果您从资源填充中删除某些内容,则将其从生成的代码中删除,并且无论使用了delete属性的位置在代码中都会产生编译错误。如果向资源文件中添加一些内容,它将在保存资源文件时自动生成一个新属性,该属性将显示在代码完成中。
这是一种更传统的方法,最初是使用WinForms完成的。在微软的 ASP.NET Core应用程序本地化文档中,有简短的解释说明了为什么它们添加了新的使用方式IStringLocalizer:硬编码转换字符串使您的工作流程更快。除非需要,否则无需维护其他内容。
对于许多开发人员而言,没有默认语言.resx文件并且仅包装字符串文字的新工作流程可以减少本地化应用程序的开销。其他开发人员将更喜欢传统的工作流程,因为它可以更轻松地处理更长的字符串文字,并更轻松地更新本地化的字符串。
| 归档时间: |
|
| 查看次数: |
4025 次 |
| 最近记录: |