From b67c97675852318ee034ee35849489c15b1575b2 Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Mon, 9 Mar 2026 13:21:21 +0100 Subject: [PATCH] english language for app-captcha --- .../FluentValidationGermanLanguage.cs | 37 ------------------- .../Localization/LanguageManagerExtensions.cs | 18 --------- zero/Localization/ZeroLocalizationModule.cs | 3 -- zero/Security/CaptchaTagHelper.cs | 14 ++++++- .../German/FluentValidationEnglishLanguage.cs | 12 ++++++ .../German/ServiceCollectionExtensions.cs | 17 ++++++++- zero/Validation/ZeroValidationModule.cs | 1 + 7 files changed, 41 insertions(+), 61 deletions(-) delete mode 100644 zero/Localization/FluentValidationGermanLanguage.cs delete mode 100644 zero/Localization/LanguageManagerExtensions.cs create mode 100644 zero/Validation/German/FluentValidationEnglishLanguage.cs diff --git a/zero/Localization/FluentValidationGermanLanguage.cs b/zero/Localization/FluentValidationGermanLanguage.cs deleted file mode 100644 index b5556516..00000000 --- a/zero/Localization/FluentValidationGermanLanguage.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace zero.Localization; - -public class FluentValidationGermanLanguage -{ - public static readonly Dictionary Translations = new() - { - { "EmailValidator", "Keine gültige E-Mail-Adresse" }, - { "GreaterThanOrEqualValidator", "Der Wert muss grösser oder gleich '{ComparisonValue}' sein." }, - { "GreaterThanValidator", "Der Wert muss grösser sein als '{ComparisonValue}'." }, - { "LengthValidator", "Die Länge muss zwischen {MinLength} und {MaxLength} Zeichen liegen. Es wurden {TotalLength} Zeichen eingetragen." }, - { "MinimumLengthValidator", "Die Länge muss größer oder gleich {MinLength} sein. Sie haben {TotalLength} Zeichen eingegeben." }, - { "MaximumLengthValidator", "Die Länge muss kleiner oder gleich {MaxLength} sein. Sie haben {TotalLength} Zeichen eingegeben." }, - { "LessThanOrEqualValidator", "Der Wert muss kleiner oder gleich '{ComparisonValue}' sein." }, - { "LessThanValidator", "Der Wert muss kleiner sein als '{ComparisonValue}'." }, - { "NotEmptyValidator", "Dieses Feld darf nicht leer sein." }, - { "NotEqualValidator", "Dieser Wert darf nicht '{ComparisonValue}' sein." }, - { "NotNullValidator", "Dieses Feld darf nicht leer sein." }, - { "PredicateValidator", "Der Wert entspricht nicht der festgelegten Bedingung." }, - { "AsyncPredicateValidator", "Der Wert entspricht nicht der festgelegten Bedingung." }, - { "RegularExpressionValidator", "Dieses Feld weist ein ungültiges Format auf." }, - { "EqualValidator", "Der Wert muss gleich '{ComparisonValue}' sein." }, - { "ExactLengthValidator", "Dieses Feld muss genau {MaxLength} lang sein. Es wurden {TotalLength} eingegeben." }, - { "ExclusiveBetweenValidator", "Der Wert muss zwischen {From} und {To} sein (exklusiv). Es wurde {PropertyValue} eingegeben." }, - { "InclusiveBetweenValidator", "Der Wert muss zwischen {From} and {To} sein. Es wurde {PropertyValue} eingegeben." }, - { "CreditCardValidator", "Keine gültige Kreditkartennummer." }, - { "ScalePrecisionValidator", "Das Feld darf insgesamt nicht mehr als {ExpectedPrecision} Ziffern enthalten, mit Berücksichtigung von {ExpectedScale} Dezimalstellen. Es wurden {Digits} Ziffern und {ActualScale} Dezimalstellen gefunden." }, - { "EmptyValidator", "Dieses Feld sollte leer sein." }, - { "NullValidator", "Dieses Feld sollte leer sein." }, - { "EnumValidator", "Dieses Feld hat einen Wertebereich, der '{PropertyValue}' nicht enthält." }, - // Additional fallback messages used by clientside validation integration. - { "Length_Simple", "Die Länge muss zwischen {MinLength} und {MaxLength} Zeichen liegen." }, - { "MinimumLength_Simple", "Die Länge muss größer oder gleich {MinLength} sein." }, - { "MaximumLength_Simple", "Die Länge muss kleiner oder gleich {MaxLength} sein." }, - { "ExactLength_Simple", "Dieses Feld muss genau {MaxLength} lang sein." }, - { "InclusiveBetween_Simple", "Der Wert muss zwischen {From} and {To} sein." } - }; -} \ No newline at end of file diff --git a/zero/Localization/LanguageManagerExtensions.cs b/zero/Localization/LanguageManagerExtensions.cs deleted file mode 100644 index 42db29aa..00000000 --- a/zero/Localization/LanguageManagerExtensions.cs +++ /dev/null @@ -1,18 +0,0 @@ -using FluentValidation.Resources; - -namespace zero.Localization; - -public static class LanguageManagerExtensions -{ - public static ILanguageManager AddGermanOverrides(this ILanguageManager manager) - { - if (manager is LanguageManager languageManager) - { - foreach (var kvp in FluentValidationGermanLanguage.Translations) - { - languageManager.AddTranslation("de", kvp.Key, kvp.Value); - } - } - return manager; - } -} \ No newline at end of file diff --git a/zero/Localization/ZeroLocalizationModule.cs b/zero/Localization/ZeroLocalizationModule.cs index 3a41a6d6..f4987fc5 100644 --- a/zero/Localization/ZeroLocalizationModule.cs +++ b/zero/Localization/ZeroLocalizationModule.cs @@ -12,9 +12,6 @@ internal class ZeroLocalizationModule : ZeroModule public override void ConfigureServices(IServiceCollection services, IConfiguration configuration) { // hint: think about using https://github.com/nuages-io/nuages-localization - - ValidatorOptions.Global.LanguageManager.AddGermanOverrides(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/zero/Security/CaptchaTagHelper.cs b/zero/Security/CaptchaTagHelper.cs index 47d1d634..7961c618 100644 --- a/zero/Security/CaptchaTagHelper.cs +++ b/zero/Security/CaptchaTagHelper.cs @@ -8,7 +8,7 @@ using zero.Security; namespace zero.TagHelpers; -[HtmlTargetElement("app-captcha", Attributes = "for", TagStructure = TagStructure.NormalOrSelfClosing)] +[HtmlTargetElement("app-captcha", Attributes = "for,lang", TagStructure = TagStructure.NormalOrSelfClosing)] public class CaptchaTagHelper(IOptionsMonitor options) : TagHelper { [HtmlAttributeNotBound] @@ -18,6 +18,9 @@ public class CaptchaTagHelper(IOptionsMonitor options) : TagHelp [HtmlAttributeName("for")] public ModelExpression For { get; set; } + [HtmlAttributeName("lang")] + public string Lang { get; set; } + private readonly CaptchaOptions _options = options.CurrentValue; @@ -41,7 +44,14 @@ public class CaptchaTagHelper(IOptionsMonitor options) : TagHelp output.PreElement.AppendHtml($""); output.PreElement.AppendHtml($""); - foreach ((string key, string value) in _options.Localization) + CaptchaLocalizationOptions texts = _options.Localization; + + if (Lang == "en") + { + texts = CaptchaLocalizationOptions.English; + } + + foreach ((string key, string value) in texts) { output.Attributes.SetAttribute($"data-cap-i18n-{key}", value); } diff --git a/zero/Validation/German/FluentValidationEnglishLanguage.cs b/zero/Validation/German/FluentValidationEnglishLanguage.cs new file mode 100644 index 00000000..290e906c --- /dev/null +++ b/zero/Validation/German/FluentValidationEnglishLanguage.cs @@ -0,0 +1,12 @@ +namespace zero.Validation; + +public class FluentValidationEnglishLanguage +{ + public static Dictionary Translations = new() + { + { "EmailValidator", "Invalid email address" }, + { "UrlValidator", "Not a well-formed URL" }, + { "HexValidator", "Invalid HEX value" }, + { "CaptchaValidator", "The captcha was not solved" } + }; +} \ No newline at end of file diff --git a/zero/Validation/German/ServiceCollectionExtensions.cs b/zero/Validation/German/ServiceCollectionExtensions.cs index cf4c3208..10707b12 100644 --- a/zero/Validation/German/ServiceCollectionExtensions.cs +++ b/zero/Validation/German/ServiceCollectionExtensions.cs @@ -7,8 +7,9 @@ namespace zero.Validation; public static class ServiceCollectionExtensions { - public static void AddGermanValidation(this IServiceCollection services) + public static void AddValidationLanguageExtensions(this IServiceCollection services) { + ValidatorOptions.Global.LanguageManager.AddEnglishOverrides(); ValidatorOptions.Global.LanguageManager.AddGermanOverrides(); services.Replace(ServiceLifetime.Scoped); } @@ -27,4 +28,18 @@ public static class ServiceCollectionExtensions } return manager; } + + static ILanguageManager AddEnglishOverrides(this ILanguageManager manager) + { + if (manager is LanguageManager) + { + var lmanager = manager as LanguageManager; + + foreach (var kvp in FluentValidationEnglishLanguage.Translations) + { + lmanager.AddTranslation("en", kvp.Key, kvp.Value); + } + } + return manager; + } } \ No newline at end of file diff --git a/zero/Validation/ZeroValidationModule.cs b/zero/Validation/ZeroValidationModule.cs index a33d66cd..70e43525 100644 --- a/zero/Validation/ZeroValidationModule.cs +++ b/zero/Validation/ZeroValidationModule.cs @@ -7,6 +7,7 @@ internal class ZeroValidationModule : ZeroModule { public override void ConfigureServices(IServiceCollection services, IConfiguration configuration) { + services.AddValidationLanguageExtensions(); services.AddScoped(typeof(IZeroMergedValidator<>), typeof(ZeroMergedValidator<>)); } } \ No newline at end of file