メディアを事前にバージョン管理する必要があるかどうかを確認することをお勧めします。言語に基づいてメディアをバージョン管理する必要があることがわかっている場合は、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 の Partial Language Fallback モジュールはこれでうまく動作します。どのメディア テンプレートにもバージョンの存在を強制しないようにすることをお勧めします (管理者に空白の言語バージョンを強制的に作成させたくありません)。その後、英語版を作成し、それを上書きする必要がある場合にのみ言語版を作成できます。
部分言語フォールバックを使用する場合は、メディアのバージョン管理可能なテンプレート フィールドでフォールバックを有効にするチェックボックスがオンになっていることを確認する必要があります。
また、メディア プロバイダーを更新して、メディアの URL に言語を埋め込んで、キャッシュが機能しないようにすることもお勧めします。例: Directions.pdf という名前の 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;
}
}