【问题标题】:How to pluralize words/strings?如何复数单词/字符串?
【发布时间】:2013-06-13 18:48:46
【问题描述】:

目标

我想用 C#.Net 的 Razor Engine 复数单词。我正在使用 MVC 4。

问题

我有以下几点:

<button class="button light-blue filled compare float-right" 
 title="This product is available in @Model["NumberOfMarketsThatHaveThisProduct"]
   market(s)">
   Compare
</button>

我不想使用“market(s)”,但可以使用“market”或“markets”。

我已经尝试过的

<button class="button light-blue filled compare float-right" 
 title="This product is available in @Model["NumberOfMarketsThatHaveThisProduct"]
   @if((int)@Model["NumberOfMarketsThatHaveThisProduct"] == 1)
   {
      @: market
   } else {
      @: markets
   }">
   Compare
</button>

但我觉得这样做不舒服。

我必须做什么?

【问题讨论】:

  • 你确定你的软件永远都是英文的吗?
  • 实际上他是葡萄牙语,@svick。是的,我确定我不会翻译它,因为他是出于区域目的。

标签: c# asp.net-mvc-4 razor


【解决方案1】:

你可以使用逻辑:

market@(someNumber == 1 ? "" : "s")

【讨论】:

  • 哦,现在我明白你的答案了。你是对的——逻辑就足够了。谢谢!
  • 这很简单,也很精彩;三元运算符的大量使用
【解决方案2】:

更好的方法是创建一个自定义 HTML 帮助程序,它将使用 .NET 4 的 PluralizationService(在 System.Data.Entity.Design.PluralizationServices 命名空间中 - 引用 System.Data.Entity.Designassembly)正确执行复数,EF6 也使用它来复数表名字。

Razor 助手看起来像这样:

namespace CustomHelpers
{
    public static class CustomHelpers
    {
        public static MvcHtmlString Pluralize(this HtmlHelper htmlHelper,
            string source)
        {
            var serv = PluralizationService.CreateService(new System.Globalization.CultureInfo("en-us"));
            var plural = serv.Pluralize(source);

            return MvcHtmlString.Create(plural);
        }
    }
}

您可以通过以下语法在 Razor 中轻松使用此帮助程序:

@using CustomHelpers

<div class="jumbotron">
    <h1>Hi @Html.Pluralize("person")</h1>
</div>

您可以想象,它将正确地将 Person 复数为 PeopleMarket 复数为 Markets 以及许多其他词,因为它在内部使用了复数字典。这比使用一些自定义复数代码要好得多。

【讨论】:

    【解决方案3】:

    最“ASP.NET-MVC-esque”的方式是使用显示模板:

    @model int
    
    @if (Model == 1)
    {
        @String.Format("{0} market", Model)
    }
    else
    {
        @String.Format("{0} markets", Model)
    }
    

    将它放在您的 DisplayTemplates 文件夹中,并将其命名为“Market.cshtml”。然后,在您的模型中,执行以下操作:

    [UIHint("Market")]
    public int NumberOfMarketsThatHaveThisProduct { get; set; }
    

    在你看来:

    @Html.DisplayFor(m => m.NumberOfMarketsThatHaveThisProduct)
    

    通过修改显示模板以在需要时使用本地资源,可以很容易地转换这种方法。

    如果您必须多次重复此操作,这将比在视图中内联操作更简洁。如果它是一次性的,你可能会觉得它有点矫枉过正。

    【讨论】:

    • 您好!感谢您的参赛。 DisplayTemplates 是 Views 目录下的文件夹吗?
    • @chiefGui 是的,“Views/ControllerName/DisplayTemplates”或“Views/Shared/DisplayTemplates”都可以。
    • 哦@AntP,谢谢!但是您的代码存在语法问题。 Visual Studio 向我显示以下内容:Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement. 当我的鼠标悬停在“市场/市场”字上时。
    • @chiefGui 看起来我的 Razor 转义很时髦 - 我已经编辑了我的帖子,这有帮助吗?
    【解决方案4】:
    @
    {
      string last =  Model["NumberOfMarketsThatHaveThisProduct"]==1? "": "'s";
    
    }
    <button class="button light-blue filled compare float-right" 
     title="This product is available in @Model["NumberOfMarketsThatHaveThisProduct"] market@last">
       Compare
    </button>
    

    【讨论】:

    • 您的 last 字符串中没有包含 2。如果Model["NumberOfMarketsThatHaveThisProduct"] == 2,则不会打印s
    • @svick tnx 它应该等于 1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多