2015-06-25 5 views

ответ

4

Создать себе новую 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> 
+1

Это исправление генерации URL-адресов. Также может потребоваться переопределить Languageresolver в случае запроса URL-адреса без языка, который должен привести к английскому, но приведет к чему-то еще, если sc_lang cookie сообщит нам что-то еще. – RvanDalen

+0

@RvanDalen Да, это правда.Я скоро обновлю, чтобы включить эту информацию – jammykam

1

Я бы всегда настоятельно советовал встраивать язык в URL-адрес.

Это, как говорится, вы можете:

Создание языка коммутатора ССЫЛОК sc_lang = еп в строку запроса?. Затем язык будет сохранен в файле cookie SC, и вы сможете с большим удовольствием просмотреть этот язык.

Или постбэк и установить язык, как так (истинные пары будут сохраняться языком в куках:.

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

Спасибо. Я хочу скрыть «en», но для другого языка должен быть URL. like .. if "en" xyz.com/page1 if "au" xyz.com/au/page1 –

+0

Хорошо, тогда у jammykam есть хорошее решение для генерации URL + провайдер коммутационной сети может быть необходим, поскольку Jan Bluemink предлагает , – RvanDalen

+0

спасибо всем за помощь. –

0

варианта Ан Создать Sitecore LinkProvider использовать различные конфигурации LinkManager

См change-linkmanager-config

новый Sitecore Linkprovider для смешанной конфигурации с многоязычной и не мультиязычных сайтов изменения LanguageEmbedding зависят от текущего сайта.

Или вы можете сделать поставщик переключения A Switching Link Provider in Sitecore