Localization

Multi-language support for validation messages and error handling in Validixty.

What is Localization?

Localization in Validixty provides comprehensive support for multiple languages and cultures. You can customize validation error messages, set culture-specific formatting, and provide localized user experiences for global applications.

Why Use Localization?

  • Global Applications: Support users in multiple languages
  • Cultural Adaptation: Format data according to local conventions
  • Custom Messages: Tailor error messages to your application
  • Compliance: Meet localization requirements for different markets

Before Using Validixty

Without localization support, handling multiple languages requires extensive manual work:

public class ValidationMessages
{
    private readonly string _culture;

    public ValidationMessages(string culture)
    {
        _culture = culture;
    }

    public string GetMessage(string key)
    {
        switch (_culture)
        {
            case "ar":
                return GetArabicMessage(key);
            case "fr":
                return GetFrenchMessage(key);
            case "es":
                return GetSpanishMessage(key);
            default:
                return GetEnglishMessage(key);
        }
    }

    private string GetEnglishMessage(string key)
    {
        return key switch
        {
            "EmailRequired" => "Email address is required",
            "EmailInvalid" => "Please enter a valid email address",
            "PasswordRequired" => "Password is required",
            "PasswordTooShort" => "Password must be at least 8 characters",
            _ => "Validation error"
        };
    }

    private string GetArabicMessage(string key)
    {
        return key switch
        {
            "EmailRequired" => "البريد الإلكتروني مطلوب",
            "EmailInvalid" => "يرجى إدخال بريد إلكتروني صحيح",
            "PasswordRequired" => "كلمة المرور مطلوبة",
            "PasswordTooShort" => "كلمة المرور يجب أن تكون 8 أحرف على الأقل",
            _ => "خطأ في التحقق"
        };
    }

    // Similar methods for other languages...
}

public ValidationResult ValidateUser(User user, string culture)
{
    var messages = new ValidationMessages(culture);
    var errors = new List();

    if (string.IsNullOrEmpty(user.Email))
        errors.Add(messages.GetMessage("EmailRequired"));

    if (!string.IsNullOrEmpty(user.Email) &&
        !Regex.IsMatch(user.Email, "^[^@\\s]+@[^@\\s]+\\.[^@\\s]+$"))
        errors.Add(messages.GetMessage("EmailInvalid"));

    // More validation with manual message lookup...

    return errors.Any() ? ValidationResult.Failure(string.Join("; ", errors))
                       : ValidationResult.Success();
}

After Using Validixty

With Validixty's Localization, multi-language support is built-in:

using Validixty.Core;

// Set culture for the application
LocalizationManager.SetCulture("ar"); // Arabic

// Register custom messages (optional)
LocalizationManager.RegisterMessage("EmailAddress", "ar", "البريد الإلكتروني غير صحيح");
LocalizationManager.RegisterMessage("Required", "ar", "هذا الحقل مطلوب");

// Validation automatically uses localized messages
var result = Validation.For("User")
    .CheckEmail(user.Email)
    .Check(x => !string.IsNullOrEmpty(x.Name), "NameRequired")
    .Validate();

How It Saves Time

  • Automatic localization: No manual message management
  • Built-in translations: Common messages already translated
  • Easy customization: Override messages as needed
  • Culture-aware formatting: Automatic number/date formatting

Usage Examples

Setting Culture

// Set culture globally
LocalizationManager.SetCulture("ar"); // Arabic
LocalizationManager.SetCulture("fr"); // French
LocalizationManager.SetCulture("es"); // Spanish
LocalizationManager.SetCulture("zh-CN"); // Chinese (Simplified)

// Set culture for current thread
Thread.CurrentThread.CurrentCulture = new CultureInfo("ar-SA");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("ar-SA");

// Validation will automatically use Arabic messages

Custom Error Messages

// Register custom messages for specific cultures
LocalizationManager.RegisterMessage("EmailAddress", "ar", "البريد الإلكتروني غير صحيح");
LocalizationManager.RegisterMessage("Required", "ar", "هذا الحقل مطلوب");
LocalizationManager.RegisterMessage("PasswordStrength", "ar", "كلمة المرور ضعيفة جداً");

// Register messages for multiple cultures
LocalizationManager.RegisterMessages(new Dictionary>
{
    ["EmailAddress"] = new Dictionary
    {
        ["ar"] = "البريد الإلكتروني غير صحيح",
        ["fr"] = "Adresse e-mail invalide",
        ["es"] = "Dirección de correo electrónico inválida"
    },
    ["Required"] = new Dictionary
    {
        ["ar"] = "هذا الحقل مطلوب",
        ["fr"] = "Ce champ est requis",
        ["es"] = "Este campo es obligatorio"
    }
});

Validation with Localized Messages

// Fluent API with localization
var result = Validation.For("User")
    .CheckEmail(user.Email) // Uses localized "invalid email" message
    .Check(x => !string.IsNullOrEmpty(x.Name), "NameRequired") // Custom key
    .CheckPassword(user.Password) // Uses localized password messages
    .Validate();

// DataAnnotations with localization
public class LocalizedUserModel
{
    [EmailAddress] // Automatically localized
    public string Email { get; set; }

    [Required(ErrorMessage = "NameRequired")] // Custom key for localization
    public string Name { get; set; }

    [CreditCard] // Localized card validation messages
    public string CreditCard { get; set; }
}

Loading Messages from Resources

// Load messages from .resx files or external sources
LocalizationManager.LoadFromResourceFile("ValidationMessages.ar.resx");
LocalizationManager.LoadFromResourceFile("ValidationMessages.fr.resx");

// Load from JSON
string jsonMessages = "{ \"ar\": { \"EmailAddress\": \"البريد الإلكتروني غير صحيح\", \"Required\": \"هذا الحقل مطلوب\" }, \"fr\": { \"EmailAddress\": \"Adresse e-mail invalide\", \"Required\": \"Ce champ est requis\" } }";
LocalizationManager.LoadFromJson(jsonMessages);

// Load from database or external service
var messages = await LoadMessagesFromDatabaseAsync();
LocalizationManager.LoadFromDictionary(messages);

Culture-Specific Validation

// Phone number validation with culture-specific formatting
LocalizationManager.SetCulture("ar");

// Egyptian phone number (automatically uses Arabic format)
var phoneResult = Validation.Personal.PhoneNumber.Valid(
    x => x.Country == CountriesEnum.Egypt, "+201234567890");

// Date validation with culture-specific format
LocalizationManager.SetCulture("fr");

// French date format (DD/MM/YYYY)
var dateResult = Validation.Personal.DateOfBirth.Valid("25/12/1990");

// Currency validation with culture-specific formatting
LocalizationManager.SetCulture("de");

// German number format (1.234,56 €)
var amountResult = Validation.Finance.CurrencyCode.Valid("EUR");

Fallback and Default Messages

// Configure fallback behavior
LocalizationManager.Configure(new LocalizationConfig
{
    FallbackToEnglish = true, // Use English if culture not found
    UseMessageKeysAsDefault = false, // Don't show raw keys to users
    DefaultCulture = "en-US", // Default culture
    EnableCaching = true // Cache localized messages
});

// Custom fallback logic
LocalizationManager.SetFallbackProvider((key, culture) =>
{
    // Try parent culture (e.g., "ar-SA" -> "ar")
    var parentCulture = culture.Split('-')[0];
    if (parentCulture != culture)
    {
        return LocalizationManager.GetMessage(key, parentCulture);
    }

    // Use English as final fallback
    return LocalizationManager.GetMessage(key, "en");
});

Integration with ASP.NET Core

// Configure localization in Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddLocalization(options => options.ResourcesPath = "Resources");

    services.Configure(options =>
    {
        var supportedCultures = new[]
        {
            new CultureInfo("en-US"),
            new CultureInfo("ar-SA"),
            new CultureInfo("fr-FR"),
            new CultureInfo("es-ES")
        };

        options.DefaultRequestCulture = new RequestCulture("en-US");
        options.SupportedCultures = supportedCultures;
        options.SupportedUICultures = supportedCultures;
    });

    // Initialize Validixty localization
    LocalizationManager.InitializeWithAspNetCore(services);
}

// In controller
public class AccountController : Controller
{
    public IActionResult Register()
    {
        // Culture is automatically detected from request
        var result = Validation.For("User")
            .CheckEmail(model.Email)
            .Validate();

        return View();
    }
}