diff --git a/assets/Squidex.Assets.ImageSharp/ImageSharpThumbnailGenerator.cs b/assets/Squidex.Assets.ImageSharp/ImageSharpThumbnailGenerator.cs index cbb0934..033284e 100644 --- a/assets/Squidex.Assets.ImageSharp/ImageSharpThumbnailGenerator.cs +++ b/assets/Squidex.Assets.ImageSharp/ImageSharpThumbnailGenerator.cs @@ -77,7 +77,8 @@ protected override async Task CreateThumbnailCoreAsync(Stream source, string mim if (w > 0 || h > 0) { var resizeMode = GetResizeMode(options, w, h, image); - var resizeOptions = new ImageSharpOptions { Size = new Size(w, h), Mode = resizeMode, PremultiplyAlpha = true }; + var bgColor = options.Background != null && Color.TryParse(options.Background, out var color) ? color : Color.Transparent; + var resizeOptions = new ImageSharpOptions { Size = new Size(w, h), Mode = resizeMode, PremultiplyAlpha = true, PadColor = bgColor }; if (options.FocusX.HasValue && options.FocusY.HasValue) { @@ -89,14 +90,7 @@ protected override async Task CreateThumbnailCoreAsync(Stream source, string mim operation.Resize(resizeOptions); - if (options.Background != null && Color.TryParse(options.Background, out var color)) - { - operation.BackgroundColor(color); - } - else - { - operation.BackgroundColor(Color.Transparent); - } + operation.BackgroundColor(bgColor); } if (watermark != null) diff --git a/assets/Squidex.Assets.ImageSharp/Squidex.Assets.ImageSharp.csproj b/assets/Squidex.Assets.ImageSharp/Squidex.Assets.ImageSharp.csproj index da2848d..a3fbc1b 100644 --- a/assets/Squidex.Assets.ImageSharp/Squidex.Assets.ImageSharp.csproj +++ b/assets/Squidex.Assets.ImageSharp/Squidex.Assets.ImageSharp.csproj @@ -21,7 +21,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/text/Squidex.Text/Translations/DeepL/DeepLTranslationOptions.cs b/text/Squidex.Text/Translations/DeepL/DeepLTranslationOptions.cs index eb6f27c..9fce57d 100644 --- a/text/Squidex.Text/Translations/DeepL/DeepLTranslationOptions.cs +++ b/text/Squidex.Text/Translations/DeepL/DeepLTranslationOptions.cs @@ -11,6 +11,10 @@ public sealed class DeepLTranslationOptions { public string AuthKey { get; set; } + public string GlossaryById { get; set; } // glossary_id + public string GlossaryByName { get; set; } + public string TagHandling { get; set; } // tag_handling + public decimal CostsPerCharacterInEUR { get; set; } = 20m / 1_000_000; public Dictionary Mapping { get; set; } diff --git a/text/Squidex.Text/Translations/DeepL/DeepLTranslationService.cs b/text/Squidex.Text/Translations/DeepL/DeepLTranslationService.cs index cd0fc50..e56da87 100644 --- a/text/Squidex.Text/Translations/DeepL/DeepLTranslationService.cs +++ b/text/Squidex.Text/Translations/DeepL/DeepLTranslationService.cs @@ -35,6 +35,36 @@ private sealed class TranslationDto public string DetectedSourceLanguage { get; set; } } + private sealed class GlossariesDto + { + [JsonPropertyName("glossaries")] + public GlossaryDto[] Glossaries { get; set; } + } + + private sealed class GlossaryDto + { + [JsonPropertyName("glossary_id")] + public string GlossaryId { get; set; } // "def3a26b-3e84-45b3-84ae-0c0aaf3525f7" + + [JsonPropertyName("name")] + public string Name { get; set; } // "My Glossary" + + [JsonPropertyName("ready")] + public bool Ready { get; set; } // true + + [JsonPropertyName("source_lang")] + public string SourceLang { get; set; } // "EN" + + [JsonPropertyName("target_lang")] + public string TargetLang { get; set; } // "DE" + + [JsonPropertyName("creation_time")] + public DateTime CreationTime { get; set; } // "2021-08-03T14:16:18.329Z" + + [JsonPropertyName("entry_count")] + public int EntryCount { get; set; } // 1 + } + public bool IsConfigured { get; } = !string.IsNullOrWhiteSpace(options.Value.AuthKey); public async Task> TranslateAsync(IEnumerable texts, string targetLanguage, string? sourceLanguage = null, @@ -80,6 +110,45 @@ public async Task> TranslateAsync(IEnumerable(gl_jsonString)!; + + foreach (var glossary in gl_jsonResponse.Glossaries) + { + if (options.GlossaryByName.Equals(glossary.Name, StringComparison.Ordinal)) + { + options.GlossaryById = glossary.GlossaryId; + break; + } + } + } + catch (Exception ex) + { + AddError(TranslationResult.Failed(ex)); + } + } + + if (!string.IsNullOrWhiteSpace(options.GlossaryById)) + { + parameters.Add(new KeyValuePair("glossary_id", options.GlossaryById)); + } + + if (!string.IsNullOrWhiteSpace(options.TagHandling)) + { + parameters.Add(new KeyValuePair("tag_handling", options.TagHandling)); + } + using var httpRequest = new HttpRequestMessage(HttpMethod.Post, url) { Content = new FormUrlEncodedContent(parameters!),