2016-07-28 28 views
0

我正在使用uCommerce的默认配置,并看到uCommerce的好网址没有语言意识:http://sitename/catalogname/productname/c-XX/p-YY如何在Sitecore-uCommerce漂亮的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" 
} 
+0

我认为这是不uCommerce具体问题。您应该能够在配置中为您的链接管理器设置languageEmbedding =“always”。 – Anton

+0

它已经是这种情况,但它并没有嵌入它。 –

+0

你能举一个例子,你如何在你的网站上呈现链接? – Anton

回答

0

以下是我想出了:

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; 
     } 
    } 
} 
+0

作为一个方面说明你仍然有一个硬编码的“/”。根据我的经验,最好避免这种情况,并使用stringutil或Sitecore.Mvc.Extensions.StringExtensions(WithPostfix,WithoutPostfix,WithPrefix,WithoutPrefix)来确保您具有所需的URL部分。 –

0

添加语言URL取决于你是如何呈现的链接。如果您未通过特定参数而不是Sitecore(并且uCommerce是Sitecore的一部分),则使用LinkManager配置sitecore> linkManager> providers:languageEmbedding和languageLocation属性。你应该有languageEmbedding =“always”和languageLocation =“filePath”

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

+0

你是对的项目的网址。如果我使用LinkManager创建链接,我将嵌入语言。但后来我的网址就像Sitecore一样:http:// sitename/en/sitecore/ucommerce/products/2/26/productname。这不是我需要的。此外,我没有找到他们的文件,因为这些是uCommerce项目。 所以我需要使用UrlService.GetUrl()。它提供了很好的uCommerce网址,但没有语言。 –