using System.Collections; using System.Globalization; using System.Resources; using SharepointToolbox.Localization; namespace SharepointToolbox.Tests.Localization; [Trait("Category", "Unit")] public class LocaleCompletenessTests { /// /// Verifies every EN key in Strings.resx has a non-empty, non-bracketed FR translation. /// [Fact] public void AllEnKeys_HaveNonEmptyFrTranslation() { var rm = new ResourceManager("SharepointToolbox.Localization.Strings", typeof(Strings).Assembly); var enResourceSet = rm.GetResourceSet(CultureInfo.InvariantCulture, true, true); Assert.NotNull(enResourceSet); var frCulture = new CultureInfo("fr"); var failures = new List(); foreach (DictionaryEntry entry in enResourceSet) { var key = entry.Key?.ToString(); if (string.IsNullOrEmpty(key)) continue; var frValue = rm.GetString(key, frCulture); if (string.IsNullOrWhiteSpace(frValue)) { failures.Add($" [{key}]: null or whitespace"); } else if (frValue.StartsWith("[", StringComparison.Ordinal)) { failures.Add($" [{key}]: bracketed fallback — '{frValue}'"); } } Assert.True(failures.Count == 0, $"The following {failures.Count} key(s) are missing or invalid in Strings.fr.resx:\n" + string.Join("\n", failures)); } /// /// Spot-checks 5 keys that must contain diacritics after Plan 02 fixes. /// This test FAILS until Plan 02 corrects the FR translations. /// [Fact] public void FrStrings_ContainExpectedDiacritics() { var rm = new ResourceManager("SharepointToolbox.Localization.Strings", typeof(Strings).Assembly); var frCulture = new CultureInfo("fr"); var failures = new List(); void CheckDiacritic(string key, char expectedChar) { var value = rm.GetString(key, frCulture); if (value == null || !value.Contains(expectedChar)) { failures.Add($" [{key}] = '{value ?? "(null)"}' — expected to contain '{expectedChar}'"); } } // Déplacer must contain é (currently "Deplacer") CheckDiacritic("transfer.mode.move", 'é'); // Créer les sites must contain é (currently "Creer les sites") CheckDiacritic("bulksites.execute", 'é'); // Modèles enregistrés must contain è (currently "Modeles enregistres") CheckDiacritic("templates.list", 'è'); // Terminé : {0} réussis, {1} échoués must contain é (currently "Termine : ...") CheckDiacritic("bulk.result.success", 'é'); // Bibliothèque cible must contain è (currently "Bibliotheque cible") CheckDiacritic("folderstruct.library", 'è'); Assert.True(failures.Count == 0, $"The following {failures.Count} key(s) are missing expected diacritics in Strings.fr.resx " + $"(fix in Plan 02):\n" + string.Join("\n", failures)); } }