【问题标题】:ASP.NET Core MVC view localizationASP.NET Core MVC 视图本地化
【发布时间】:2019-01-28 21:25:14
【问题描述】:

我正在使用 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 来做到这一点?

【问题讨论】:

  • 简单地说,不。如果您想要生成的本地化字符串中的标签,它们需要以这种方式出现在您的资源文件中。
  • 也就是说,您实际上可以执行类似@Localizer["LevelUp", $"&lt;span class=\"user\"&gt;{Model.Username}&lt;/span&gt;", $"&lt;span class=\"level\"&gt;{Model.Level}&lt;/span&gt;"] 的操作。换句话说,您在整个 HTML 结构中加入了用户名/级别,而不仅仅是用户名/级别本身。但是,这是一种非常明显的代码气味,特别是如果您最终在多个地方使用相同的东西。最终,最好将 HTML 简单地放入资源文件中。
  • @Chris Pratt,你确定吗?一位官方guide提到You generally want to only localize text and not HTML.
  • 确实如此,但是使用您想要的代码(用户名和级别包含在跨度中)您必须 - 因此是“一般”。换句话说,最好的办法是完全避免在要本地化的内容中使用 HTML,但如果您出于某种原因需要 HTML,那么您可以。

标签: asp.net razor localization tag-helpers asp.net-core-tag-helpers


【解决方案1】:

对于那些现在从谷歌找到这个的人,我能够在 ASP.Net Core 3.1 中做到这一点(不确定其他版本)。

按照a comment above 中的建议,将 HTML 放入资源键的参数中是行不通的,因为参数是 HTML 编码的:

但是,它很接近,我可以使用 @Html.Raw()Localizer.GetString() 方法解决它:

@Html.Raw( Localizer.GetString( "LevelUp", $"&lt;span class=\"user\"&gt;{Model.Username}&lt;/span&gt;", $"&lt;span class=\"level\"&gt;{Model.Level}&lt;/span&gt;" ) )

并将LevelUp 的 resx 值更改为:User {0} has reached level {1}

这里的关键是 GetString 不会返回 LocalizedHtmlString,它会返回 LocalizedString,然后您可以将其输出为原始 HTML。

为了清楚起见,如果您正在使用默认语言翻译是关键的格式(而不是像 LevelUp 这样的一些蛞蝓),它看起来像这样: @Html.Raw( Localizer.GetString( "User {0} has reached level {1}", $"&lt;span class=\"user\"&gt;{Model.Username}&lt;/span&gt;", $"&lt;span class=\"level\"&gt;{Model.Level}&lt;/span&gt;" ) )

此外,您还可以在参数中使用GetString,如下所示: @Html.Raw( Localizer.GetString( "Click {0} to do something...", $"&lt;a href=\"whatever-link\"&gt;{Localizer.GetString("here")}&lt;/span&gt;" )

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-06
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多