sitecore中媒体库项的语言回退

sitecore中媒体库项的语言回退,sitecore,sitecore6,sitecore-media-library,Sitecore,Sitecore6,Sitecore Media Library,我有很多英文PDF。我有英语和德语的网页 如果在德语页面中,我想显示英语lang的PDF,这是不可能的,因为德语版本的PDF不可用,所以我尝试对媒体库项目进行回退,即使没有帮助 有人能告诉我这方面有什么替代方案吗 注意:我不想上传德文版的英文文档,因为还有其他语言可用,客户不能用所有语言多次上传 我需要上传一个文件,只有英文,但在所有其他语言显示,无论该文件是在该语言或没有 即使我需要通过代码进行更改也没关系 提前感谢有几种方法可以做到这一点。可以在渲染代码中执行此操作,也可以使用中的语言回退模

我有很多英文PDF。我有英语和德语的网页

如果在德语页面中,我想显示英语lang的PDF,这是不可能的,因为德语版本的PDF不可用,所以我尝试对媒体库项目进行回退,即使没有帮助

有人能告诉我这方面有什么替代方案吗

注意:我不想上传德文版的英文文档,因为还有其他语言可用,客户不能用所有语言多次上传

我需要上传一个文件,只有英文,但在所有其他语言显示,无论该文件是在该语言或没有

即使我需要通过代码进行更改也没关系


提前感谢

有几种方法可以做到这一点。可以在渲染代码中执行此操作,也可以使用中的语言回退模块

要在代码中实现这一点,您需要创建一个新的MediaProvider。创建一个从
Sitecore.Resources.Media.MediaProvider继承的类
,并重写
受保护的虚拟MediaData GetMediaData(MediaUri MediaUri)
方法

此方法获取上下文语言或Uri中语言的sitecore项。因此,您可以在此处实施回退:

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>

您使用哪个模板上载PDF?如果您使用的是
/sitecore/templates/System/Media/Unversioned/Pdf
,则该文件继承自
/sitecore/templates/System/Media/Unversioned/File
,并且该文件的blob字段仍标记为共享:

共享字段是跨语言版本共享的,因此,如果上载英文PDF并从德语项目链接到同一媒体项目,则它将链接到原始英文PDF


最好的做法是尝试确定媒体是否需要提前进行版本控制。如果您知道需要根据语言对媒体进行版本控制,则应确保在web.config中更新以下属性:


真的
Alex Shyba的部分语言回退模块将成功地处理此问题。我建议不要在任何媒体模板上强制设置版本(不要强迫管理员创建空白语言版本)。然后,他们可以创建英语版本,然后仅在需要重写时创建语言版本

在使用部分语言回退的情况下,您将需要确保在“媒体版本模板”字段中选中“启用回退”复选框

我还建议更新媒体提供程序,使其将语言嵌入媒体url中,这样缓存就不会发挥作用。例如:如果您创建一个名为Directions.pdf的pdf文件,并将其加载到www.site.com/media/Directions.pdf,当您在不同语言之间切换时,它很可能会缓存它。因此,您需要更新媒体提供程序,以使用上下文语言对媒体url进行编码

您可以在此处看到演示:

公共类CustomMediaProvider:MediaProvider
{
公共重写字符串GetMediaUrl(MediaItem项、MediaUrlOptions选项)
{
Assert.ArgumentNotNull((对象)项,“项”);
Assert.ArgumentNotNull((对象)选项,“选项”);
字符串结果=base.GetMediaUrl(项、选项);
//由Verndale添加,检查是否应嵌入语言
URLPOPTIONS URLPOPTIONS=URLPOPTIONS.DefaultOptions;
urlOptions=LanguageHelper.CheckOverrideLanguageEmbedding(urlOptions);
if(urlpoptions.LanguageEmbedding==LanguageEmbedding.Always&&options.UseItemPath)
{
result=“/”+Sitecore.Context.Language.Name.ToLowerInvariant()+Sitecore.StringUtil.EnsurePrefix(“/”,result);
}
返回结果;
}
公共静态URLPOPTIONS CHECKOVERRIDELANGEGEEMBEDDING(URLPOPTIONS URLPOPTIONS)
{
var thisSite=Sitecore.Context.Site;
如果(urlpoptions.Site!=null)
thisSite=urlpoptions.Site;
如果(!String.IsNullOrEmpty(thisSite.SiteInfo.Properties[“languageEmbedding”]))
{
if(thisSite.SiteInfo.Properties[“languageEmbedding”].ToLower()=“从不”)
urlOptions.LanguageEmbedding=LanguageEmbedding.Never;
else if(thisSite.SiteInfo.Properties[“languageEmbedding”].ToLower()=“始终”)
urlOptions.LanguageEmbedding=LanguageEmbedding.Always;
else if(thisSite.SiteInfo.Properties[“languageEmbedding”].ToLower()=“根据需要”)
urlpoptions.LanguageEmbedding=LanguageEmbedding.AsNeeded;
}
返回选项;
}
}

你好,谢谢你的帖子。。我知道模板中有一个共享字段。但如果将来客户也有德语文档。那么,如果该字段是共享的,我想sitecore会使用最新的文档。因此,我不希望将此作为解决方案。如果这是未来可能的需求,那么Richard建议的语言回退就是一条出路,这在您的问题中我并不清楚。媒体库的回退代码工作正常。谢谢Richard:)嗨Richard,在我的本地机器上,当我运行代码时,打开PDF时没有收到任何错误(在我的本地机器上,通常对于媒体库项目,不会显示必要的图像,因此假设回退正在工作),但当代码部署到stage时,我开始看到404页未找到。经验证,英语和德语都具有相同的PDF URL,但PDF是以英语而不是德语打开的。