[英]ASP.NET Core MVC view localization
我正在使用 ASP.NET Core MVC,假设我有以下 Razor 视图:
@model AwesomeApp.ViewModels.User
<h1>
User <span class="user">@Model.Username</span> has reached <span class="level">@Model.Level</span> level!
</h1>
现在我想本地化它:
@model AwesomeApp.ViewModels.User
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
<h1>
@Localizer["LevelUp", Model.Username, Model.Level]
</h1>
在我的.resx文件中,我有一个带有键LevelUp的资源:
User <span class="user">{0}</span> has reached <span class="level">{1}</span> level
这工作正常,但我不想在.resx文件中保留 HTML 标签,我只想保留呈现的文本:
用户 {0} 已达到 {1} 级!
有没有办法用IViewLocalizer
或利用Localization.AspNetCore.TagHelpers
来做到这一点?
对于那些现在从谷歌找到这个的人,我能够在 ASP.Net Core 3.1 中做到这一点(不确定其他版本)。
正如上面评论中所建议的那样,将 HTML 放在资源键的参数中是行不通的,因为参数是 HTML 编码的:
但是,它很接近,我可以使用@Html.Raw()
和Localizer.GetString()
方法解决它:
@Html.Raw( Localizer.GetString( "LevelUp", $"<span class=\\"user\\">{Model.Username}</span>", $"<span class=\\"level\\">{Model.Level}</span>" ) )
并将LevelUp
的 resx 值更改为: User {0} has reached level {1}
这里的关键是 GetString 不返回LocalizedHtmlString
,它返回一个LocalizedString
,然后您可以将其输出为原始 HTML。
为了清楚,如果你正在做那里的默认语言的翻译是关键(而不是某些鼻涕虫一样的格式LevelUp
),它是这样的: @Html.Raw( Localizer.GetString( "User {0} has reached level {1}", $"<span class=\\"user\\">{Model.Username}</span>", $"<span class=\\"level\\">{Model.Level}</span>" ) )
而且,作为奖励,您还可以在参数中使用GetString
,如下所示: @Html.Raw( Localizer.GetString( "Click {0} to do something...", $"<a href=\\"whatever-link\\">{Localizer.GetString("here")}</span>" )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.