仅为 Sitecore 中的特定站点嵌入语言
Embed Language only for specific sites in Sitecore
如何在 Sitecore 中仅针对特定站点嵌入 language/locale?
假设我有美国网站,URL 将是 http://exmaple.com
对于加拿大站点,我有 2 种语言,因此 URL 应该是这样的。
我不确定您是否可以开箱即用,但使用简单的 LinkProvider 应该是可能的。示例:
- 您将默认 url 选项设置为包含语言
- 在您检测到当前站点的 LinkProvider 中
- 如果当前站点不是您的美国站点,请通过 returning
base.GetItemUrl(item, options)
退出
- 如果当前站点是您的美国站点,您可以根据参数中的参数创建新的 UrlOptions ('noLangOptions'),但使用
LanguageEmbedding.Never
和 return base.GetItemUrl(item, noLangOptions)
默认情况下,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
选项(例如 'always' 值)。
没有什么现成的方法可以实现这一点,因为您只能设置一个 link 提供程序,并且这些设置适用于解决方案的 instances/usages。
我之前在博客上发布了一个我用来实现 Site Specific Link Provider for Multisite Implementations in Sitecore 的解决方案,它本质上是一个切换 link 提供程序,允许您定义多个 Link 提供程序,每个提供程序都有不同的配置网站。
这将允许您创建两个 link 提供商配置:
<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
中找到
或者,创建您自己的 Link 提供程序,继承自 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);
}
然后将其修补以替换默认的 link 提供程序:
<linkManager>
<patch:attribute name="defaultProvider">custom</patch:attribute>
<providers>
<add name="custom" type="MyProject.SiteLinkProvider, MyProject" languageEmbedding="always" />
</providers>
</linkManager>
如何在 Sitecore 中仅针对特定站点嵌入 language/locale?
假设我有美国网站,URL 将是 http://exmaple.com
对于加拿大站点,我有 2 种语言,因此 URL 应该是这样的。
我不确定您是否可以开箱即用,但使用简单的 LinkProvider 应该是可能的。示例:
- 您将默认 url 选项设置为包含语言
- 在您检测到当前站点的 LinkProvider 中
- 如果当前站点不是您的美国站点,请通过 returning
base.GetItemUrl(item, options)
退出
- 如果当前站点是您的美国站点,您可以根据参数中的参数创建新的 UrlOptions ('noLangOptions'),但使用
LanguageEmbedding.Never
和 returnbase.GetItemUrl(item, noLangOptions)
默认情况下,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
选项(例如 'always' 值)。
没有什么现成的方法可以实现这一点,因为您只能设置一个 link 提供程序,并且这些设置适用于解决方案的 instances/usages。
我之前在博客上发布了一个我用来实现 Site Specific Link Provider for Multisite Implementations in Sitecore 的解决方案,它本质上是一个切换 link 提供程序,允许您定义多个 Link 提供程序,每个提供程序都有不同的配置网站。
这将允许您创建两个 link 提供商配置:
<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
中找到或者,创建您自己的 Link 提供程序,继承自 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);
}
然后将其修补以替换默认的 link 提供程序:
<linkManager>
<patch:attribute name="defaultProvider">custom</patch:attribute>
<providers>
<add name="custom" type="MyProject.SiteLinkProvider, MyProject" languageEmbedding="always" />
</providers>
</linkManager>