【问题标题】:.Net Core Localization View: IViewLocalizer inside Linq expression.Net Core Localization View:IViewLocalizer inside Linq 表达式
【发布时间】:2017-02-09 01:32:24
【问题描述】:

我正在 .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 时,它可以工作 - 链接正在工作,但是当我想使用 Localizer 获取题词 Edit/Edytuj/змінити etc 时。而不是我认为: Microsoft.AspNetCore.Mvc.Localization.LocalizedHtmlString

【问题讨论】:

    标签: c# linq asp.net-core linq-expressions asp.net-core-localization


    【解决方案1】:

    这是因为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>
    

    【讨论】:

    • 在我看来,这不是设计使然,事实上,如果感觉像是微软的错误。 documentation中没有说明
    • 小心使用.Value 作为the documentation says 它是“原始资源字符串,在使用任何构造函数参数格式化之前。”。所以使用Localizer["some key {0} and {1}", some, arguments] 将不起作用,将返回some key {0} and {1} 而不是格式化的字符串。
    【解决方案2】:

    因为接受的答案在插值查询方面可能会有点误导。

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

    修改大括号中的内容

    @Localizer["pseudoText", "transformed", "lozalizer"].
    

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

    【讨论】:

      【解决方案3】:

      在尝试将具有多个值的本地化传递到局部视图时,我遇到了类似的问题。我可以使用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 })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-30
        • 2019-02-18
        • 2021-03-16
        • 2020-02-02
        • 2019-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多