Sitecore语言嵌入多语言网站

时间:2015-06-25 06:23:25

标签: asp.net sitecore

我在Sitecore中有一个多语言应用程序。 默认语言为" en"。要求是" en"不应该在URL中显示。 我可以使用Langauge Embedding" Never"在这里,但它会导致其他语言的问题。

3 个答案:

答案 0 :(得分:4)

为自己创建一个新的LinkProvider并为" en"设置options.LanguageEmbedding = LanguageEmbedding.Never。只有,所有其他语言将使用您的配置中设置的任何内容:

public class LinkProvider : Sitecore.Links.LinkProvider
{
    private static readonly Language neverEmbeddedLanguage = Language.Parse("en");

    public override string GetItemUrl(Item item, UrlOptions options)
    {
        if (item.Language == neverEmbeddedLanguage)
        {
            options.LanguageEmbedding = LanguageEmbedding.Never;
        }
        return base.GetItemUrl(item, options);
    }
}

然后将新的LinkProvider注册为默认值(使用补丁包含文件):

<?xml version="1.0"?>
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <linkManager>
      <patch:attribute name="defaultProvider">custom</patch:attribute>
      <providers>
        <add name="custom" 
             type="MyProject.Custom.Links.LinkProvider, MyProject.Custom" languageEmbedding="always" ... />
      </providers>
    </linkManager>
  </sitecore>
</configuration>

修改

正如RvanDylan正确指出的那样,我们还需要处理传入的请求,因为我们已禁用特定语言的语言嵌入。默认情况下,如果传递的url或sc_lang参数中未嵌入语言代码,Sitecore将回退到使用语言cookie。因此,如果用户访问了网址,&#34; / fr / contact&#34;并访问了&#34; / contact&#34;那么默认情况下它们将被提供法语内容。我们需要处理这个并告诉Sitecore,空实际上意味着英语。我们可以通过覆盖StripLanguage管道中preprocessRequest处理器中的逻辑来实现这一点:

using Sitecore.Configuration;
using Sitecore.Diagnostics;
using Sitecore.Globalization;
using Sitecore.Pipelines.PreprocessRequest;
using Sitecore.Web;

namespace MyProject.Custom.Pipelines.preprocessRequest
{
    public class StripLanguage : Sitecore.Pipelines.PreprocessRequest.StripLanguage
    {
        private static readonly Language defaultLanguage = Language.Parse("en");

        public override void Process(PreprocessRequestArgs args)
        {
            Assert.ArgumentNotNull((object)args, "args");           
            string language = WebUtil.ExtractLanguageName(args.Context.Request.FilePath);

            if (string.IsNullOrEmpty(language))
            {
                Sitecore.Context.Language = defaultLanguage;
                Sitecore.Context.Data.FilePathLanguage = defaultLanguage;
                return;
            }

            base.Process(args);
        }
    }
}

与之相关的补丁配置文件:

<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
  <sitecore>
    <pipelines>
      <preprocessRequest>
        <processor type="MyProject.Custom.Pipelines.preprocessRequest.StripLanguage, MyProject.Custom" 
                   patch:instead="processor[@type='Sitecore.Pipelines.PreprocessRequest.StripLanguage, Sitecore.Kernel']" />
      </preprocessRequest>
    </pipelines>
  </sitecore>
</configuration>

答案 1 :(得分:1)

我总是强烈建议将该语言嵌入网址。

话虽如此,你可以:

在查询字符串中使用?sc_lang = en创建语言切换URL。然后该语言将保存在SC cookie中,您可以愉快地使用该语言进一步浏览。

或者有回发并像这样设置语言(真正的param会将语言保留在cookie中:

Sitecore.Context.SetLanguage(Sitecore.Globalization.Language.Parse("en"), true);

答案 2 :(得分:0)

选项是创建Sitecore LinkProvider以使用不同的LinkManager配置。

请参阅change-linkmanager-config

用于多语言而非多语言网站的混合配置的新Sitecore Linkprovider会更改LanguageEmbedding,具体取决于当前网站。

或者您可以成为转换提供商A Switching Link Provider in Sitecore