我在Sitecore中有一个多语言应用程序。 默认语言为" en"。要求是" en"不应该在URL中显示。 我可以使用Langauge Embedding" Never"在这里,但它会导致其他语言的问题。
答案 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配置。
用于多语言而非多语言网站的混合配置的新Sitecore Linkprovider会更改LanguageEmbedding,具体取决于当前网站。
或者您可以成为转换提供商A Switching Link Provider in Sitecore