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!),