【问题标题】:Using translation strings in componentlinks在组件链接中使用翻译字符串
【发布时间】:2012-08-27 15:18:35
【问题描述】:

从今天早上开始,我一直在尝试解决这个问题,我知道我在这里遗漏了一些明显的东西,但我似乎找不到。

我们正在使用一个发布到服务器的 XML 文件,其中包含所有标准单词的翻译,例如“阅读更多”。它是一个包含在相应出版物中本地化的组件的页面。

在我们的 Razor 模板中,我们在纯新闻摘要项下方使用以下代码,该摘要项又链接到完整项。

<a tridion:href="@news.ID" class="more" ><%=DefaultLabels.TranslatedTerm(((HomePage)Page).Location, "read_more")%></a>

问题是,服务器标签工作得很好,但被解析为

<tridion:ComponentLink runat="server" PageURI="tcm:15-407-64" ComponentURI="tcm:15-1475" TemplateURI="tcm:0-0-0" AddAnchor="false" LinkText="&lt;%= DefaultLabels.TranslatedTerm(((HomePage)Page).Location, &#34;read_more&#34;) %&gt;" LinkAttributes=" class=&#34;more&#34;" TextOnFail="true"/>

您可能注意到,它在页面上以纯文本形式写入(这并不奇怪,因为根据 liveDocs,LinkText 参数首先被声明为字符串)。

如果我拿走

tridion:href

在第一个例子中,写成

href

它工作正常,代码解析为翻译后的字符串,甚至链接到...只不过是组件的 TCM ID,而不是包含完整新闻项目的正确页面。

我尝试在 Razor 中创建一个函数,尝试替换 linkText,尝试在模板本身中设置 ComponentLink,但无济于事。我觉得只需对该模板的代码稍作调整,它就可以工作,但我看不到它,我已经开始寻找自定义 TBB 来处理代码。

有人知道如何解决这个问题吗?

编辑:

Chris 的答案实际上是我在这种特殊情况下寻找的答案,但我觉得我应该指出,Priyank 的功能也应该被视为这样的东西。所以谢谢你们的帮助,这让我的生活变得更轻松了!

【问题讨论】:

    标签: tridion tridion-2011


    【解决方案1】:

    希望这个剃须刀功能对你有很大帮助。这是从组件链接或外部链接呈现链接标签的非常有用的功能。

    @helper RenderLink(
        dynamic link,                        // the link to render. Handles components + internal / external links
        string cssClass = null,              // optional custom CSS class
        string title = null                 // optional link text (default is the title of the component being linked to)
        ) 
    {
        if(link == null) 
        {
              return;
        }
    
        if (title == null) 
        {   
            title = link.title;
        }
    
        string classAttr = string.IsNullOrEmpty(cssClass) ? "" : " class='" + cssClass + "'";
        dynamic href;
        string tridionLink = "";
        string targetAttr = "";
    
        if (link.Schema.Title == "External Link") 
        {
            href = link.link;
        }
        else if (link.Schema.Title == "Internal Link")
        {
            href = link.link;
            tridionLink = "tridion:";
        } 
        else 
        {
            href = link;
            tridionLink = "tridion:";
        }    
    
        if(link.target != null) 
        {
            targetAttr = link.target == "New window" || link.target == "Popup" ? " target='_blank'" : "";
        }    
    
        <a @(tridionLink)href="@href"@classAttr@targetAttr>@title</a> 
    }
    

    【讨论】:

      【解决方案2】:

      我建议不要使用默认模板来解析链接,而是自己输出链接,如下所示:

      <tridion:ComponentLink runat="server" PageURI="tcm:15-407-64" 
          ComponentURI="tcm:15-1475" TemplateURI="tcm:0-0-0" 
          AddAnchor="false" LinkAttributes=" class=&#34;more&#34;" 
          TextOnFail="true">
              <%=DefaultLabels.TranslatedTerm(((HomePage)Page).Location, &#34;read_more&#34;) %>
      </tridionComponentLink>
      

      最好还是考虑输出 TCDL 而不是 Taglib/ServerControl

      【讨论】:

      • 克里斯,你能解释一下为什么我不应该使用默认模板来解析链接,而是使用这种语法吗?那么输出TCDL呢?谢谢。
      • 默认的“Resolve links TBB”查找所有包含 TCM URIs 的链接,并将它们转换为 TCDL,然后再转换为 REL、JSP、ASP.NET 等。它通过放置属性中的链接文本(对您而言,它不是由您的 ASP.NET 控件执行的)。为了使您的代码执行,最简单的方法是在标签主体(而不是属性)中使用链接文本(或者在您的情况下是一些代码)。我直接提供的代码引用了 ComponentLink 服务器控件,如果它不在属性中,它将从控件主体加载链接文本。
      猜你喜欢
      • 2015-09-04
      • 2016-06-18
      • 1970-01-01
      • 2021-08-14
      • 2014-05-23
      • 2013-07-18
      • 1970-01-01
      • 2020-12-16
      • 2010-10-23
      相关资源
      最近更新 更多