代码之家  ›  专栏  ›  技术社区  ›  Robert Claypool

如何在本地化文本中嵌入链接

  •  16
  • Robert Claypool  · 技术社区  · 15 年前

    我正在国际化ASP.NET MVC应用程序,但我不确定如何处理链接文本。以以下为例:

    由于“登录”是超链接的,我必须有译者标记,当文本本地化时,对应的单词或短语应该是超链接的,例如Entre。

    最佳战略解决方案是什么?

    是否有标准方法标记特殊文本(以及使用翻译结果的标准方法)。。。或者,我是不是走错了路,以为我的内容和演示信息是如此紧密地耦合在一起(尽管在这种情况下,我想不出任何方法来消除耦合)。

    我目前正在使用本地资源文件进行视图和 an extension method on HtmlHelper 要获得本地化的sting,请执行以下操作:

    <%= Html.Resource("LoginMessage")%>
    

    更新: 请看 Keith's answer

    我发现它非常有用,但是系统 auto selected 另一个。

    5 回复  |  直到 6 年前
        1
  •  15
  •   Keith    15 年前

    我认为这可以归结为4种选择:

    1. 在本地化中添加一个链接:“请<a href=“#”>登录</a>继续”
    2. 多个本地化-或者:
      1. “请{0}继续”和“登录”,或
      2. “请”、“登录”和“继续”
    3. 本地化中的标记,例如:
      1. “请{开始登录}登录{结束登录}继续”
      2. “请<a href=“{0}”>登录</a>继续”

    我认为有一个主要的原因来避免1-你混淆了本地化和应用程序导航。

    选项2最终为每个文本块提供了多个资源,但只要您有管理所有本地化的好方法,就不应该成为问题。不过,这对第三方翻译人员来说可能是一件痛苦的事情——你需要某种方式告诉他们上下文,或者你会得到一些非常奇怪的单词翻译。

    选项3是我首选的解决方案。不过,您仍然会为您的翻译人员带来问题-大多数人不会理解文本中的标记/HTML/标记。我们已经做了一些HTML,所以3.3已经为我们工作了。

    选项4可能值得考虑-为了使链接值得额外的工作和维护,您是否在嵌入链接方面获得了足够的收益?这是一个针对您的应用程序的重要问题: 如果整个句子都是链接(而不仅仅是主动动词,这是链接的最佳实践),那么你真的失去了足够多的东西,让选项2或3值得付出额外的努力吗?

    我认为这可能就是为什么没有更标准化的方法来做这件事的原因,因为对于大多数项目(可能是10个选项中的9个),选项4就足够了,所以这只会在一些特殊情况下成为一个问题。我们有一个复杂的应用程序,大约11000条本地化文本,绝大多数情况下使用4条,只有4到5个地方需要使用3.3

    <%= Html.Localise("Controller/Action/KeyOfTextOnPage") %>
    

    <%= Html.LocaliseLink("Controller/Action/KeyOfTextOnPage", "~/link.aspx") %>
    <%= Html.LocaliseAction("Controller/Action/KeyOfTextOnPage", "action", "controller") %>
    
        2
  •  4
  •   Community CDub    8 年前

    我目前使用的是以下设置:

    我有一个包含主要文本的全局资源文件,名为Strings.resx(Strings.NL-NL.resx等)。在这旁边,我有一个全局文件,其中包含ActionLink的所有本地化。即:ActionLinks.resx和locals。

    现在我要做的是,在我的Strings.resx中,我有如下内容:

    本地语言Strings.NL-NL.resx

    {0}om verder te gaan

    现在的诀窍是执行以下操作:

    <%= Html.Encode(string.Format(Resources.Strings.ControllernameViewnameKey, 
    Html.ActionLink(Resources.ActionLinks.login, "Account", "LogOn")))
    

    如果在链接中需要多个变量,可以为其提供一个对象数组

     string.Format()
    

    keynaming是我自己的约定,用于理解在何处使用主文本(什么页面)。因为我的主要文本非常具体。当然,钥匙可以自己做。

    有关我如何做的更多信息,请查看我的 回答 关于我自己的问题: here


    编辑

        3
  •  2
  •   eglasius    15 年前

    我必须同意其他答案-在2中分开。

    这是中立的&如果这是语言所需要的,译者可以将整个句子作为链接。

    如果您发现自己需要多次链接到同一个页面,那么可以使用一些标记。比如:

    English: "Please ##login## to continue."
    Português: "##Entre## por favor para continuar."
    
        4
  •  2
  •   fonZ Foysal Ahmed Emon    6 年前

    我知道这是个老问题,但我想这可能会有帮助。

    在ASP.net Core 2.2中,您可以拥有一个包含以下内容的资源文件:

    AllText: There are 2 links and one string. Links are {0} and {1}, the string is {2}
    Link1Text: link1
    Link2Text: link2
    String1: something special
    

    @using Microsoft.AspNetCore.Mvc.Localization
    
    @inject IViewLocalizer Localizer
    

    最后在HTML中:

    <p>@Localizer["AllText",
           @Html.ActionLink(@Localizer["Link1Text"].Value,"Action1","Controller1"),
           @Html.ActionLink(@Localizer["Link2Text"].Value,"Action2","Controller2"),
           @Localizer["String1"]]</p>
    

    不需要编码或解码任何东西,只需向定位器提供参数。

        5
  •  1
  •   Jonas Lincoln    15 年前

    我建议将资源分成两个值,如下所示

    -2:登录


    -1:{0}赞成连续。

    然后将它们结合起来构建链接和消息。{0}被需要的链接/actionlink/替换。

        6
  •  1
  •   darasd    15 年前

    "Please #123#login#123# to continue"
    

    如果在字符串中找到#n#,则知道它所包围的字符串应该是指向查找文件(db或其他文件)中由索引n指定的url的链接。