2014-11-13 24 views
1

在此Sitecore网站(6.5.0修订版120706)上,我有这个sitecore项目称为XYZ。所以我有http://example.com/XYZ/没有语言代码的Sitecore显示名称网址不起作用

我已经添加了法语的本地化,所以使用的显示名称我现在有:

http://example.com/XYZ-en/ http://example.com/XYZ-fr/

英文版的效果很好,但法国不和解析为404,除非我去先选择英文,先点击我的语言切换按钮。当我点击它时,我被重定向到http://example.com/fr-CA/XYZ-fr/,这是有效的。从此,英文网站停止工作,法文工作。当我切换这样的语言时,我总是只有其中的一个工作。

那个按钮运行该代码:

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)); 
       } 
      } 
     } 
    } 
} 

这有点老代码,在这个旧项目。

有什么我应该寻找的,将拦截默认的显示名称行为?或者,这种显示名称的行为是不是开箱即用的?

感谢您的帮助!

+1

组合中是否有自定义的ItemResolver?网址中的XYZ-en \和XYZ-fr \并不是真正代表Sitecore的典型代表。我们通常希望看到XYZ \ en \和XYZ \ fr \。 –

+0

嗨马特,我的例子网址可能会引起误解。他们实际上更像“非常有产品的选项”和“Mon-Produit-Avec-Plusieurs-Options”。希望这有助于澄清! 否则,我确实在ItemResolver之后运行了301解析器。那个人看着一个小SQLCE数据库来执行oldsite-newsite 301重定向。 –

回答

1

所以,如果我理解正确,希望这些URL来解决语言为您提供: http://example.com/XYZ-en/
http://example.com/XYZ-fr/

的LanguageResolver将解决语言顺序:
1.语言可以从蒸馏网址(不能与上面的网址来完成)
2.语言Cookie可用于该网站(网站名称#郎)
3.回落到默认配置语言

切换时,使用切换器,url路径以语言代码开头,然后解析器能够通过url解析语言并在语言cookie中保留该语言。这就是为什么您一次只能体验到一种工作语言的这种行为。

你可以做的最好的事情总是在URL中使用语言(linkprovider配置),否则你不得不挂钩在languageresolver中,并对每种语言的displayname做一些时髦的检查,但这可能会非常昂贵。

+0

感谢您的解释! –

2

这是预期的行为。此article from John West描述了语言解析过程中涉及的步骤,ItemResolver过程的详细信息可以是found here

我假设你已经在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" /> 

这告诉LinkManager使用项目的显示名称建立的网址,因此,你有多种语言的网址。您的​​方法将上下文语言从EN切换到FR-CA,反之亦然,这会将Sitecore置于该用户的特定语言模式。

<httpRequestBegin>下面的管道试图从你的请求的URL解析一个项目:

<processor type="Sitecore.Pipelines.HttpRequest.ItemResolver, Sitecore.Kernel" /> 

而且尝试之一在方法是ResolveUsingDisplayName(args)。因此,它将试图解析具有EN显示名称的项目,但上下文语言设置为FR-CA,因此实际上它将永远找不到该项目,因此将不会找到该项目。因此,您有2个选项:

  1. 套装languageEmbedding="always"在LinkProvider,这意味着你的网址将被格式化,如 “/ EN /尼斯 - 产品与 - 很多 - - 选项” 和“/ FR-CA /周一Produit-AVEC-Plusieurs-选项”。
  2. 在默认的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']"/> 

这是一个未经测试的原型,请检查后续请求是否以正确的切换语言返回。否则,像您在原始代码中一样重定向回自己。

+0

这看起来很有趣!我想我会尝试这种方法! –

+0

让我知道你是如何得到的。如果项目已经解决,您不想运行此处理器,因此更新了代码以添加检入。 – jammykam

相关问题