仅为Sitecore中的特定网站嵌入语言

时间:2016-06-23 14:56:16

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

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

假设我的美国网站和网址为http://exmaple.com

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

http://exmaple.ca/en-ca

http://exmaple.ca/fr-ca

3 个答案:

答案 0 :(得分:4)

没有开箱即用的功能,因为您只能设置一个链接提供商,并且这些设置适用于解决方案的实例/用途。

我之前曾在博客上发布了一个解决方案,我曾用它来实现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>

答案 1 :(得分:2)

默认情况下,languageEmbedding设置对所有网站都是全局的。要使其特定于站点,您需要创建从默认值LinkProvider继承的自定义Sitecore.Links.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选项(例如,总是&#39;值),具体取决于上下文网站。

答案 2 :(得分:1)

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

  • 您设置默认网址选项以包含语言
  • 在LinkProvider中检测到当前站点
  • 如果当前网站不是您的美国网站,请退回base.GetItemUrl(item, options)
  • 退出
  • 如果当前网站是您的美国网站,则根据参数中的内容创建新的UrlOptions(&#39; noLangOptions&#39;)但LanguageEmbedding.Never并返回base.GetItemUrl(item, noLangOptions)