2013-06-10 4 views
2

У меня есть несколько PDF-файлов на английском языке. У меня есть веб-страницы на английском и немецком языках.Отказывание языка для элемента медиабиблиотеки в sitecore

Если на немецкой странице я хочу отображать PDF-файл на английском языке, это невозможно, поскольку немецкая версия PDF недоступна, поэтому я попытался сделать резервную копию для элемента медиабиблиотеки, даже тогда никакой помощи.

Так может кто-нибудь, пожалуйста, скажите мне любую альтернативу для этого.

ПРИМЕЧАНИЕ. Я не хочу загружать английский документ в немецкую версию, так как есть другие доступные языки, и клиенты не могут загружать их много раз во всех языках.

Мне нужно загрузить документ только на английском языке, но показывать его на всех других языках независимо от того, есть ли в нем этот язык или нет.

Это нормально, даже если мне нужно внести изменения с помощью кода.

Заранее спасибо

ответ

0

Есть несколько способов сделать это. Вы можете сделать это в коде для вашего рендеринга, или вы можете использовать модуль резервного копирования языка от Sitecore marketplace.

Чтобы сделать это в коде, вам необходимо создать новый MediaProvider. Создайте класс, который наследует от Sitecore.Resources.Media.MediaProvider и переопределяет метод protected virtual MediaData GetMediaData(MediaUri mediaUri).

Этот метод получает элемент sitecore для языка контекста или языка в Uri. Таким образом, вы можете осуществить возврат здесь:

public class MediaProviderWithFallback : Sitecore.Resources.Media.MediaProvider 
{ 
    protected override Sitecore.Resources.Media.MediaData GetMediaData(Sitecore.Resources.Media.MediaUri mediaUri) 
    { 
     Assert.ArgumentNotNull((object)mediaUri, "mediaUri"); 
     Database database = mediaUri.Database; 
     if (database == null) 
     { 
      return null; 
     } 
     string mediaPath = mediaUri.MediaPath; 
     if (string.IsNullOrEmpty(mediaPath)) 
     { 
      return null; 
     } 
     Language language = mediaUri.Language; 
     if (language == null) 
     { 
      language = Context.Language; 
     } 
     Sitecore.Data.Version version = mediaUri.Version; 
     if (version == null) 
     { 
      version = Sitecore.Data.Version.Latest; 
     } 
     Sitecore.Data.Items.Item mediaItem = database.GetItem(mediaPath, language, version); 
     if (mediaItem == null) 
     { 
      return (MediaData)null; 
     } 
     // Check for language fallback 
     if (mediaItem.Versions.Count == 0) 
     { 
      // Workout your language fallback here from config or sitecore settings etc... 
      language = Language.Parse("en"); 
      // Try and get the media item in the fallback language 
      mediaItem = database.GetItem(mediaPath, language, version); 
      if (mediaItem == null) 
      { 
       return null; 
      } 
     } 
     return MediaManager.Config.ConstructMediaDataInstance(mediaItem); 
    } 
} 

Обратите внимание: это непроверенный код. Вы должны сохранить резервную копию в конфигурации или изменить шаблон языка в файле sitecore.

Как только у вас есть этот класс, вам нужно будет обновить свой web.config, чтобы использовать вашего провайдера через Sitecores. Поэтому найти этот раздел в web.config и измените тип, чтобы быть вашим классом и Assembley:

<!-- MEDIA PATH --> 
<mediaPath defaultProvider="default"> 
    <providers> 
    <clear /> 
    <add name="default" type="Sitecore.Resources.Media.MediaPathProvider, Sitecore.Kernel" /> 
    </providers> 
</mediaPath> 
+0

Спасибо Ричард, я буду тестировать его и вернусь к вам .. – user166013

+0

Запасной код для медиа-библиотеки работает отлично. Спасибо Richard :) – user166013

+0

Привет, Ричард, на моей локальной машине, когда я запускал код, я не получал никаких ошибок при открытии PDF-файла (на моей локальной машине обычно для элементов медиабиблиотеки необходимые изображения не отображаются, поэтому предполагается, что резервное копирование работая), но когда код был развернут на стадии, я начал получать 404 страницы не найден. при проверке как на английском, так и на немецком языке есть один и тот же URL-адрес PDF, но PDF открывается на английском языке не на немецком языке. вы уверены, что резервные работы для элементов медиабиблиотеки? – user166013

1

Какой шаблон вы используете, чтобы загрузить PDF? Если вы используете /sitecore/templates/System/Media/Unversioned/Pdf, то это наследует от /sitecore/templates/System/Media/Unversioned/File и поле блоб для этого помечается как разделяемая все равно:

File Template

Общие поля являются общими для всех языковых версий, так что если вы загрузите английскую PDF и ссылку на что тот же элемент мультимедиа из немецкого предмета, затем он будет ссылаться на оригинальный английский PDF.

In Sitecore, when adding a field to a template, there's a checkbox called "shared". What's it for?

+0

Привет, спасибо за сообщение .. Я знаю, что в шаблоне есть общее поле. Но если в будущем у клиента есть документ на немецком языке. то, если поле является общим, я думаю, что sitecore возьмет последний документ. поэтому я не предпочел это как решение. – user166013

+0

Если это возможное будущее требование, то языковой запас, как предложил Ричард, - это путь, который мне не был понят с вашего вопроса. – jammykam

0

Это лучшая практика, чтобы попытаться определить, является ли СМИ должны быть версированным раньше времени. Если вы знаете, средства массовой информации будет необходимо версионируются на основе языка, вы должны убедиться, что обновлять в вашем web.config следующий атрибут:

<!--By default, Media items are not versionable and the below setting is set to false in the web.config. 
    If you upload an image in one language, it will persist across all language versions. 
    If you change this to true, then versioning will apply and you would have to set the media item into all language versions, 
    or enable fallback, but if enforce version presence is turned on and media template guids are included in EnforceVersionPresenceTemplates, 
    then you'll have to make sure all language versions at least exist--> 
    <setting name="Media.UploadAsVersionableByDefault"> 
    <patch:attribute name="value">true</patch:attribute> 
    </setting> 

Частичный модуль Язык Запасной Alex Shyba будет успешно работать с этим. Я бы рекомендовал не применять присутствие версии на любых медиа-шаблонах (не хочу, чтобы администраторы должны были создавать пустые языковые версии).Затем они могут создавать английские версии, а затем создавать только языковую версию, когда им необходимо переопределить ее.

Вам понадобится, в случае использования частичного возврата языка, чтобы убедиться, что флажки enable fallback отмечены на полях шаблона носителя.

Я также рекомендую обновить медиа-провайдер, чтобы он вставлял язык в URL-адрес носителя, так что кеширование не вступает в игру. EG: если вы создаете PDF с именем Directions.pdf и загружаете его по адресу www.site.com/media/Directions.pdf, при переключении между языками он очень хорошо может кэшировать его. Таким образом, вы хотите обновить медиа-провайдер, чтобы закодировать URL-адрес мультимедиа с помощью языка контекста.

Вы можете посмотреть демо здесь: https://github.com/Verndale-Corp/Sitecore-Fallback-FullDemo

public class CustomMediaProvider : MediaProvider 
{ 
    public override string GetMediaUrl(MediaItem item, MediaUrlOptions options) 
    { 
     Assert.ArgumentNotNull((object)item, "item"); 
     Assert.ArgumentNotNull((object)options, "options"); 

     string result = base.GetMediaUrl(item, options); 

     // Added by Verndale, check if language should be embedded 
     UrlOptions urlOptions = UrlOptions.DefaultOptions; 
     urlOptions = LanguageHelper.CheckOverrideLanguageEmbedding(urlOptions); 
     if (urlOptions.LanguageEmbedding == LanguageEmbedding.Always && options.UseItemPath) 
     { 
      result = "/" + Sitecore.Context.Language.Name.ToLowerInvariant() + Sitecore.StringUtil.EnsurePrefix('/', result); 
     } 

     return result; 
    } 

    public static UrlOptions CheckOverrideLanguageEmbedding(UrlOptions urlOptions) 
    { 
     var thisSite = Sitecore.Context.Site; 

     if (urlOptions.Site != null) 
      thisSite = urlOptions.Site; 

     if (!String.IsNullOrEmpty(thisSite.SiteInfo.Properties["languageEmbedding"])) 
     { 
      if (thisSite.SiteInfo.Properties["languageEmbedding"].ToLower() == "never") 
       urlOptions.LanguageEmbedding = LanguageEmbedding.Never; 
      else if (thisSite.SiteInfo.Properties["languageEmbedding"].ToLower() == "always") 
       urlOptions.LanguageEmbedding = LanguageEmbedding.Always; 
      else if (thisSite.SiteInfo.Properties["languageEmbedding"].ToLower() == "asneeded") 
       urlOptions.LanguageEmbedding = LanguageEmbedding.AsNeeded; 
     } 

     return urlOptions; 
    } 
} 
Смежные вопросы