【问题标题】:Embed Language only for specific sites in Sitecore仅为 Sitecore 中的特定网站嵌入语言
【发布时间】:2016-06-23 14:56:15
【问题描述】:

如何在 Sitecore 中仅为特定网站嵌入语言/区域设置?

假设我有美国网站,网址是 http://exmaple.com

对于加拿大网站,我有 2 种语言,因此 URL 应该是这样的。

http://exmaple.ca/en-ca

http://exmaple.ca/fr-ca

【问题讨论】:

    标签: asp.net asp.net-mvc sitecore sitecore7


    【解决方案1】:

    没有什么开箱即用的方法来实现这一点,因为您只能设置一个链接提供程序,并且这些设置适用于解决方案的实例/用途。

    我之前写过一个解决方案,我用它来实现Site Specific Link Provider for Multisite Implementations in Sitecore,它本质上是一个切换链接提供者,允许您定义多个链接提供者,每个链接提供者针对不同的站点具有不同的配置。

    这将允许您创建两个链接提供程序配置:

    <linkManager>
      <providers>
        <add name="provider-site1" languageEmbedding="never" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" ... />
        <add name="provider-site2" languageEmbedding="always" type="Sitecore.Custom.Links.SpecificLinkProvider, Sitecore.Custom" ... />    
      </providers>
    </linkManager>
    

    然后在您的网站定义中指定要使用的提供商:

    <sites>
      <site name="site1" linkProvider="provider-site1" ... />
      <site name="site2" linkProvider="provider-site2" ... />
      <site name="site3" ... />
    </sites>
    

    所有代码都可以在这个Github Gist找到

    或者,创建您自己的链接提供程序,继承自 Sitecore.Links.LinkProvider 并覆盖 GetItemUrl 方法:

    public override string GetItemUrl(Sitecore.Data.Items.Item item, Sitecore.Links.UrlOptions options)
    {
        if (Sitecore.Context.Site.Name == "US-Site")
        {
            options.LanguageEmbedding = LanguageEmbedding.Never;       
        }
        return base.GetItemUrl(item, options);
    }
    

    然后修补它以替换默认链接提供程序:

    <linkManager>
      <patch:attribute name="defaultProvider">custom</patch:attribute>
      <providers>
        <add name="custom" type="MyProject.SiteLinkProvider, MyProject" languageEmbedding="always"  />
      </providers>
    </linkManager>
    

    【讨论】:

    【解决方案2】:

    默认情况下,languageEmbedding 设置对所有站点都是全局的。为了使其特定于站点,您需要创建一个继承自默认 Sitecore.Links.LinkProvider 的自定义 LinkProvider 并在配置中指定它。比如:

    <linkManager defaultProvider="custom">
    <providers>
    <clear/>   
    <add name="custom" type="MyNamespace.LinkProvider, AssemblyName" addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="asNeeded" languageLocation="filePath"lowercaseUrls="false" shortenUrls="true" useDisplayName="false"/>
    </providers>
    </linkManager>
    

    自定义提供程序需要根据上下文站点覆盖 languageEmbedding 选项(例如“始终”值)。

    【讨论】:

      【解决方案3】:

      我不确定您是否可以开箱即用,但使用简单的 LinkProvider 应该是可能的。示例:

      • 您将默认 url 选项设置为包含语言
      • 在 LinkProvider 中检测当前站点
      • 如果当前站点不是您的美国站点,请返回base.GetItemUrl(item, options) 退出
      • 如果当前站点是您的美国站点,您可以根据参数中的参数创建新的 UrlOptions ('noLangOptions'),但使用 LanguageEmbedding.Never 并返回 base.GetItemUrl(item, noLangOptions)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多