没有语言代码,Sitecore显示名称url无法工作
在这个Sitecore网站(6.5.0版本120706)上,我有一个名为XYZ的Sitecore项目。我也是 我添加了法语本地化,因此使用显示名称我现在有: 英文版很好用,但法语版不行,除非我先到英文版,先点击我的语言切换按钮,否则法语版将改为404。当我点击它时,我会被重定向到,这很有效。从那时起,英语url停止工作,法语url工作。当我像那样切换语言时,我总是只有两种语言中的一种有效 该按钮运行以下代码:没有语言代码,Sitecore显示名称url无法工作,sitecore,multilingual,sitecore6,Sitecore,Multilingual,Sitecore6,在这个Sitecore网站(6.5.0版本120706)上,我有一个名为XYZ的Sitecore项目。我也是 我添加了法语本地化,因此使用显示名称我现在有: 英文版很好用,但法语版不行,除非我先到英文版,先点击我的语言切换按钮,否则法语版将改为404。当我点击它时,我会被重定向到,这很有效。从那时起,英语url停止工作,法语url工作。当我像那样切换语言时,我总是只有两种语言中的一种有效 该按钮运行以下代码: protected void LanguageLinkClick(object s
protected void LanguageLinkClick(object sender, EventArgs e)
{
var lang = (Sitecore.Context.Language.Name == "en") ? "fr-ca" : "en";
Tools.RedirectToLanguage(lang, Response);
}
该工具函数运行以下代码:
public static void RedirectToLanguage(string pStrLangToSet, HttpResponse pResponse)
{
if (!string.IsNullOrEmpty(pStrLangToSet))
{
var newLang = Language.Parse(pStrLangToSet);
if (newLang != null)
{
Sitecore.Context.SetLanguage(newLang, true);
var itm = Sitecore.Context.Item;
if (Sitecore.Context.Item != null)
{
var itemInLang = Sitecore.Context.Database.Items[itm.ID, newLang];
if (itemInLang != null)
{
pResponse.Redirect(BuildUrl(itemInLang));
}
}
}
}
}
这是这个旧项目中的一些旧代码
我是否应该查找任何可以拦截默认显示名行为的内容?或者,显示名称的这种行为是不是在开箱即用的情况下无法管理
谢谢你的帮助 如果我理解正确,您希望这些URL为您解析语言:
LanguageSolver将按以下顺序解析语言:
1.可以从url中提取语言(不能使用上述url)
2.语言cookie可用于此站点(sitename#lang)
3.返回到默认配置的语言 当您使用切换器进行切换时,url路径以语言代码开始,然后解析程序能够按url解析语言,并将语言保存在语言cookie中。这就是为什么您一次只能体验一种工作语言的行为
最好的办法是在URL中始终使用语言(链接提供程序配置),否则您必须挂接LanguageSolver并对每种语言的displayname进行一些时髦的检查,但这可能会非常昂贵。这是预期的行为。这描述了语言解析过程中涉及的步骤,可以查看ItemResolver过程的详细信息 我假设您在站点的LinkProvider中设置的是
useDisplayName=true
,也可能是languageEmbedding=false
,如下所示:
<add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel"
alwaysIncludeServerUrl="false" addAspxExtension="true" encodeNames="true"
languageLocation="filePath" lowercaseUrls="false" shortenUrls="true"
languageEmbedding="never" useDisplayName="true" />
该方法中的一个尝试是使用DisplayName(args)
解析。因此,它将尝试解析具有EN显示名称的项,但上下文语言设置为FR-CA,因此实际上它将永远找不到该项,因此使用404
这里有两个选项:
languageEmbedding=“always”
,这意味着您的URL格式将类似于“/en/Nice Product With Lots Options”和“/fr ca/Mon Produit Avec Plusieurs Options”public class AlternateLanguageItemResolver : HttpRequestProcessor
{
public override void Process(HttpRequestArgs args)
{
Assert.ArgumentNotNull(args, "args");
if (Context.Item != null || Context.Database == null || args.Url.ItemPath.Length == 0)
return;
var origLanguage = Sitecore.Context.Language;
Sitecore.Context.Language = AltLanguage;
// try to find it using default ItemResolver with alternate language
var itemResolver = new Sitecore.Pipelines.HttpRequest.ItemResolver();
itemResolver.Process(args);
if (Context.Item == null)
{
// well we didn't find it, so switch the context back so everyting can continue as normal
Sitecore.Context.Language = origLanguage;
return;
}
// We found the Item! Switch the User Language for future requests
Sitecore.Context.SetLanguage(AltLanguage, true);
}
private Language _altLanguage = null;
private Language AltLanguage
{
get
{
if (_altLanguage == null)
{
var altLang = (Sitecore.Context.Language.Name == "en") ? "fr-ca" : "en";
_altLanguage = Language.Parse(altLang);
}
return _altLanguage;
}
}
}
并在默认的ItemResolver之后进行修补:
<processor type="Sitecore.Sample.AlternateLanguageItemResolver, Sitecore.Sample"
patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']"/>
这是一个未经测试的原型,请检查后续请求是否以正确的交换语言返回。否则,重定向回原始代码中的自身。混合中是否有自定义ItemResolver?url中的XYZ en\和XYZ fr\并不是真正典型的开箱即用的Sitecore。我们通常希望看到XYZ\en\和XYZ\fr\。嗨,马特,我的示例URL可能会产生误导。它们实际上更像是“有很多选择的好产品”和“Mon Produit Avec Plusieurs选项”。希望这有助于澄清!否则,我会在ItemResolver之后运行301解析器。这是一个小SQLCE数据库,用于执行旧站点Newsite301重定向。这看起来非常有趣!我想我会试试这种方法!让我知道你进展如何。如果项目已解决,则您不希望运行此处理器,因此更新了代码以添加签入。感谢您的解释!
<processor type="Sitecore.Sample.AlternateLanguageItemResolver, Sitecore.Sample"
patch:after="processor[@type='Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel']"/>