如何在 Sitecore-uCommerce 漂亮的 URL 中嵌入语言?

How to embed language in Sitecore-uCommerce nice URLs?

我正在使用 uCommerce 的默认配置,发现 uCommerce 漂亮的 URL 不支持语言:http://sitename/catalogname/productname/c-XX/p-YY

我应该怎么做才能在这些 URL 中使用这样的语言:http://sitename/en/catalogname/productname/c-XX/p-YY ?

配置如下:

<linkManager defaultProvider="sitecore">
  <providers>
    <clear />
    <add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" addAspxExtension="false" alwaysIncludeServerUrl="false" encodeNames="true" languageEmbedding="always" languageLocation="filePath" lowercaseUrls="true" shortenUrls="true" useDisplayName="true" />
  </providers>
</linkManager>

以下是我的使用方法:

public WebshopProduct Map(UCommerceProduct uProduct)
{
    ProductCatalog catalog = CatalogLibrary.GetCatalog(25);
    IUrlService urlService = ObjectFactory.Instance.Resolve<IUrlService>();
    ...
    var url = urlService.GetUrl(catalog, uProduct) // this returns "/catalogname/productname/c-XX/p-YY"

    //And I would like to have "/en/catalogname/productname/c-XX/p-YY"
}

向 URL 添加语言取决于您呈现链接的方式。如果您不传递特定参数,则 Sitecore(以及作为 Sitecore 一部分的 uCommerce)使用 LinkManager 配置 sitecore>linkManager>providers: languageEmbedding 和 languageLocation 属性。你应该有 languageEmbedding="always" 和 languageLocation="filePath"

P.S。 但是,如果您使用他们的演示或基于他们的演示的东西(例如来自认证课程),请注意:他们使用常规 ASP.Net MVC(不是 Sitecore MVC)。并且链接不是通过 LinkManager 呈现的,您应该自己将语言设置为 URL。使用嵌入到它们的语言代码路由注册。

这是我想出的:

public static class TemplateIDs
{
    // sitecore/ucommerce item's template id       
    public static ID UCommerce => new ID("{AABC1CFA-9CDB-4AE5-8257-799D84A8EE23}");
}

public static class ItemExtensions
{
    public static bool IsUCommerceItem(this Item item)
    {
        var items = item.Axes.GetAncestors();
        return items.Any(x => x.TemplateID.Equals(TemplateIDs.UCommerce));
    }
}

public static string GetItemUrlByLanguage(Sitecore.Globalization.Language language)
{
    if (Context.Item.IsUCommerceItem() && SiteContext.Current.CatalogContext.CurrentProduct != null && SiteContext.Current.CatalogContext.CurrentProduct.Guid == Context.Item.ID.Guid)
    {
        ProductCatalog catalog = CatalogLibrary.GetCatalog(25);
        IUrlService urlService = ObjectFactory.Instance.Resolve<IUrlService>();
        var url = "/" + language.CultureInfo.TwoLetterISOLanguageName + urlService.GetUrl(catalog, SiteContext.Current.CatalogContext.CurrentProduct);
        return url;
    }
    else
    {
        //Normal URL creation
        using (new LanguageSwitcher(language))
        {
            var options = new UrlOptions
            {
                AlwaysIncludeServerUrl = true,
                LanguageEmbedding = LanguageEmbedding.Always,
                LowercaseUrls = true
            };
            var url = LinkManager.GetItemUrl(Context.Item, options);
            url = StringUtil.EnsurePostfix('/', url).ToLower();
            return url;
        }
    }
}