没有语言代码,Sitecore显示名称url无法工作

没有语言代码,Sitecore显示名称url无法工作,sitecore,multilingual,sitecore6,Sitecore,Multilingual,Sitecore6,在这个Sitecore网站(6.5.0版本120706)上,我有一个名为XYZ的Sitecore项目。我也是 我添加了法语本地化,因此使用显示名称我现在有: 英文版很好用,但法语版不行,除非我先到英文版,先点击我的语言切换按钮,否则法语版将改为404。当我点击它时,我会被重定向到,这很有效。从那时起,英语url停止工作,法语url工作。当我像那样切换语言时,我总是只有两种语言中的一种有效 该按钮运行以下代码: protected void LanguageLinkClick(object s

在这个Sitecore网站(6.5.0版本120706)上,我有一个名为XYZ的Sitecore项目。我也是

我添加了法语本地化,因此使用显示名称我现在有:

英文版很好用,但法语版不行,除非我先到英文版,先点击我的语言切换按钮,否则法语版将改为404。当我点击它时,我会被重定向到,这很有效。从那时起,英语url停止工作,法语url工作。当我像那样切换语言时,我总是只有两种语言中的一种有效

该按钮运行以下代码:

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”
  • 在尝试使用替代语言解析的默认ItemResolver之后添加自定义管道处理器,如果找到匹配项,则设置上下文项并切换语言
  • 切换到备用语言后,以下内容将调用默认的Sitecore ItemResolver,然后尝试解析,这将尝试使用显示名称查找项目:

    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']"/>