У меня есть одно многоязычное приложение в Sitecore. Язык по умолчанию - «en». Требование «en» не должно отображаться в URL-адресе. Я могу использовать Langauge Embedding «Never» здесь, но это вызовет проблему для другого языка.Встраивание языка Sitecore на многоязычном сайте
ответ
Создать себе новую LinkProvider и установить 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>
EDIT:
Как правильно указывает RvanDylan, нам также необходимо обрабатывать входящие запросы, когда у нас есть языковое вложение, отключенное для определенного языка. По умолчанию, если код языка не внедрен в переданный параметр url или sc_lang, Sitecore вернется к использованию языкового файла cookie. Поэтому, если пользователь посетил URL-адрес, «/ fr/contact» и посетил «/ contact», они по умолчанию будут обслуживать французский контент. Мы должны справиться с этим и сказать Sitecore, что пустой означает английский. Мы можем сделать это overrriding логику в 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>
Я бы всегда настоятельно советовал встраивать язык в URL-адрес.
Это, как говорится, вы можете:
Создание языка коммутатора ССЫЛОК sc_lang = еп в строку запроса?. Затем язык будет сохранен в файле cookie SC, и вы сможете с большим удовольствием просмотреть этот язык.
Или постбэк и установить язык, как так (истинные пары будут сохраняться языком в куках:.
Sitecore.Context.SetLanguage(Sitecore.Globalization.Language.Parse("en"), true);
Спасибо. Я хочу скрыть «en», но для другого языка должен быть URL. like .. if "en" xyz.com/page1 if "au" xyz.com/au/page1 –
Хорошо, тогда у jammykam есть хорошее решение для генерации URL + провайдер коммутационной сети может быть необходим, поскольку Jan Bluemink предлагает , – RvanDalen
спасибо всем за помощь. –
варианта Ан Создать Sitecore LinkProvider использовать различные конфигурации LinkManager
новый Sitecore Linkprovider для смешанной конфигурации с многоязычной и не мультиязычных сайтов изменения LanguageEmbedding зависят от текущего сайта.
Или вы можете сделать поставщик переключения A Switching Link Provider in Sitecore
Это исправление генерации URL-адресов. Также может потребоваться переопределить Languageresolver в случае запроса URL-адреса без языка, который должен привести к английскому, но приведет к чему-то еще, если sc_lang cookie сообщит нам что-то еще. – RvanDalen
@RvanDalen Да, это правда.Я скоро обновлю, чтобы включить эту информацию – jammykam