.Net Core 本地化视图:Linq 表达式中的 IViewLocalizer
.Net Core Localization View: IViewLocalizer inside Linq expression
我正在 .net 核心中编写 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
时,它起作用了 - link 起作用了,但是当我想使用 Localizer 来获取题词时 Edit/Edytuj/змінити etc
。而不是我在我看来得到这个:
Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString
那是因为 IViewLocalizer["Foo"]
returns 一个 LocalizedHtmlString
而不是字符串。因此,当您将其包含在字符串插值表达式中时,它会调用其 ToString 方法。由于 ToString 尚未在 class 中重新定义,默认 Object.ToString()
实现 returns 类型名称:
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
我在尝试将具有多个值的 Localization 传递到局部视图时遇到了类似的问题。我能够使用 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 })
我正在 .net 核心中编写 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
时,它起作用了 - link 起作用了,但是当我想使用 Localizer 来获取题词时 Edit/Edytuj/змінити etc
。而不是我在我看来得到这个:
Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString
那是因为 IViewLocalizer["Foo"]
returns 一个 LocalizedHtmlString
而不是字符串。因此,当您将其包含在字符串插值表达式中时,它会调用其 ToString 方法。由于 ToString 尚未在 class 中重新定义,默认 Object.ToString()
实现 returns 类型名称:
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
我在尝试将具有多个值的 Localization 传递到局部视图时遇到了类似的问题。我能够使用 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 })