using System.Globalization; using MeWeb.Core.Checks; namespace MeWeb.App.Services; public static class Texts { public static string Summary(Finding finding) => finding?.Summary is null ? "" : Localizer.Instance.Format(finding.Summary, finding.Args.Select(Argument).ToArray()); public static string Value(Fact fact) { if (fact.Text is not null) return Isolate(fact.Text); if (fact.Key is null) return fact.Date is null ? "" : Date(fact.Date); var args = fact.Amount is null ? fact.Args.Select(Argument).ToArray() : new object[] { Money(fact.Amount.Value, fact.Currency) }; return Localizer.Instance.Format(fact.Key, args); } public static string Source(Fact fact) { var parts = new List(); if (fact.Basis is not null) parts.Add(Localizer.Instance[fact.Basis]); if (fact.Date is not null && fact.Key is not null) parts.Add(Date(fact.Date)); return string.Join(", ", parts); } public static string Money(decimal amount, string currency) { var format = (NumberFormatInfo)Localizer.Instance.Culture.NumberFormat.Clone(); format.CurrencySymbol = currency switch { "EUR" => "€", "USD" => "$", "GBP" => "£", _ => currency ?? "", }; return amount.ToString("C2", format); } public static string Date(string text) { var culture = Localizer.Instance.Culture; if (DateTime.TryParseExact(text, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var day)) return day.ToString("d", culture); if (DateTime.TryParseExact(text, "yyyy-MM", CultureInfo.InvariantCulture, DateTimeStyles.None, out var month)) return month.ToString("Y", culture); return text; } public static string Isolate(string text) => string.IsNullOrEmpty(text) ? text : $"\u2068{text}\u2069"; static object Argument(string text) => DateTime.TryParseExact(text, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var day) ? day.ToString("d", Localizer.Instance.Culture) : text; }