. net核心本地化视图:Linq表达式中的IViewLocalizer

本文关键字:表达式 IViewLocalizer Linq 核心 本地化 视图 net | 更新日期: 2023-09-27 18:09:52

我在。net core中编写mvc应用程序,我有本地化问题,我不知道如何将IViewLocalizer添加到我的网格视图。下面是我的代码:

@using NonFactors.Mvc.Grid;
@using Microsoft.AspNetCore.Mvc.Localization
@inject IViewLocalizer Localizer
@model IEnumerable<WeegreeEmployeeFormsCore.Models.Employee>
@(Html
    .Grid(Model)
    .Build(columns =>
    {
        columns.Add(model => model.Name).Titled(Localizer["Name"]).Sortable(true).Filterable(true);
        columns.Add(model => model.Surname).Titled(Localizer["Surname"]).Sortable(true).Filterable(true);
        columns.Add(model => model.EmploymentDate).Titled(Localizer["Hired"]).Sortable(true).Filterable(true);
        columns.Add(model => model.Country).Titled(Localizer["Country"]).Filterable(true).Sortable(true).Filterable(true);
        columns.Add(model => model.EmploymentForm).Titled(Localizer["EmploymentForm"]).Filterable(true);
        columns.Add(model => $"<a href='"{Url.Action("Edit", "Form")}/{model.EmployeeId}'">{Localizer["Edit"]}</a>").Encoded(false);
        columns.Add(model => $"<a href='"{Url.Action("Details", "Form")}/{model.EmployeeId}'">Details</a>").Encoded(false);

    })
    .Pageable(pager =>
    {
        pager.PagesToDisplay = 10;
        pager.CurrentPage = 1;
        pager.RowsPerPage = 10;
    })
    .Sortable()
    .Empty("No data found")
)

当我使用{}插入表达式model.EmployeeId时,它工作-链接正在工作,但当我想使用本地化器获得铭文Edit/Edytuj/змінити etc时。而不是在我看来:Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString

. net核心本地化视图:Linq表达式中的IViewLocalizer

这是因为IViewLocalizer["Foo"]返回LocalizedHtmlString而不是字符串。当你把它包含在字符串插值表达式中时,它会调用它的ToString方法。由于ToString没有在该类中重新定义,默认的Object.ToString()实现返回类型名称:

var foo = Localizer["Foo"].ToString();
//foo gets assigned "Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString"

Razor知道在渲染页面时如何处理LocalizedHtmlString实例,所以它会按照预期呈现:

<p>Hello @Localizer["World"]</p>
//renders <p>Hello World</p>

如果您想手动连接本地化字符串,那么您需要确保您获得LocalizedHtmlString.Value属性:

@{
    var text = $"Hello {Localizer["World"].Value}";
}
<p>@text</p>
//renders <p>Hello World</p>

与不调用.Value:

的方法进行比较
@{
    var text = $"Hello {Localizer["World"]}";
}
<p>@text</p>
//renders <p>Hello Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString</p>

对于插值查询,公认的答案可能有点误导。

内部Localizer查找文本并通过string.Format运行它。这使我们能够为它提供pseudoText > This text will be {0} by the {1}之类的字符串。

修改大括号

中的内容
@Localizer["pseudoText", "transformed", "lozalizer"].

这会输出This text will be transformed by the lozalizer

在尝试将带有多个值的本地化传递到局部视图时,我遇到了类似的问题。我可以通过使用WriteTo()方法来解决这个问题。

@{
    var writer = new StringWriter();
    Localizer["heading", Model.UserName].WriteTo(writer, HtmlEncoder.Default);
    var heading = writer.ToString();
}
@await Html.PartialAsync("_ModalHeader", new ModalHeaderModel { Heading = heading })