mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.6 KiB
95 lines
2.6 KiB
// ==========================================================================
|
|
// Squidex Headless CMS
|
|
// ==========================================================================
|
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|
// All rights reserved. Licensed under the MIT license.
|
|
// ==========================================================================
|
|
|
|
using Squidex.Domain.Apps.Core.Apps;
|
|
using Squidex.Domain.Apps.Core.Contents;
|
|
using Squidex.Domain.Apps.Core.Schemas;
|
|
using Squidex.Infrastructure;
|
|
|
|
namespace Squidex.Domain.Apps.Core.ConvertContent;
|
|
|
|
public sealed class ResolveLanguages : IContentFieldConverter
|
|
{
|
|
private readonly LanguagesConfig languages;
|
|
private readonly HashSet<string> languageCodes;
|
|
|
|
public bool ResolveFallback { get; init; }
|
|
|
|
public ResolveLanguages(LanguagesConfig languages, params Language[] filteredLanguages)
|
|
{
|
|
this.languages = languages;
|
|
|
|
if (filteredLanguages?.Length > 0)
|
|
{
|
|
languageCodes = languages.AllKeys.Intersect(filteredLanguages.Select(x => x.Iso2Code)).ToHashSet();
|
|
}
|
|
else
|
|
{
|
|
languageCodes = languages.AllKeys.ToHashSet();
|
|
}
|
|
|
|
if (languageCodes.Count == 0)
|
|
{
|
|
languageCodes.Add(languages.Master);
|
|
}
|
|
}
|
|
|
|
public ContentFieldData? ConvertFieldAfter(IRootField field, ContentFieldData source)
|
|
{
|
|
if (!field.Partitioning.Equals(Partitioning.Language))
|
|
{
|
|
return source;
|
|
}
|
|
|
|
if (ResolveFallback)
|
|
{
|
|
foreach (var languageCode in languageCodes)
|
|
{
|
|
if (source.TryGetNonNull(languageCode, out _))
|
|
{
|
|
continue;
|
|
}
|
|
|
|
foreach (var fallback in languages.GetPriorities(languageCode))
|
|
{
|
|
if (fallback == languageCode)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
if (source.TryGetNonNull(fallback, out var fallbackValue))
|
|
{
|
|
source[languageCode] = fallbackValue;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
while (true)
|
|
{
|
|
var isRemoved = false;
|
|
|
|
foreach (var (key, _) in source)
|
|
{
|
|
if (!languageCodes.Contains(key))
|
|
{
|
|
source.Remove(key);
|
|
isRemoved = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!isRemoved)
|
|
{
|
|
break;
|
|
}
|
|
}
|
|
|
|
return source;
|
|
}
|
|
}
|
|
|