如何在 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;
}
}
}
我正在使用 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;
}
}
}