Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,10 @@ public void Memo_Back_Template_Subtitle_Is_Translated_And_Selector_Stays_FR(stri
{
// Regression test for #358 / #443 — two bugs caught by ai-01 validation:
// Bug 1: apostrophe U+2019 in source vs U+0027 in template -> subtitle stays FR.
// Bug 2: converting text_fr->text_en in ifCond breaks family grouping (6/8 families vanish).
// Bug 2: converting text_fr->text_en in the old ifCond selector broke family grouping
// (6/8 families vanish). #449 replaced that selector with language-invariant
// control-break helpers ({{#ifFamilyHeader}}/{{#ifSubfamilyHeader}}); this test
// now asserts those helpers survive translation instead.
var original = ReadTemplate("Cards/Memo/Argumentum_Memo_Back_fr.json");
var loc = GetFallaciesLocalization();

Expand All @@ -159,10 +162,12 @@ public void Memo_Back_Template_Subtitle_Is_Translated_And_Selector_Stays_FR(stri
translated.Should().NotContain("L'art de jamais avoir tort",
$"{destLang} Memo Back must have a translated subtitle, not the FR original (#358)");

// (b) The ifCond selector must stay FR-invariant — text_fr must remain
// so that Famille(FR)==text_fr(FR) still groups all 8 families correctly.
translated.Should().Contain("text_fr ",
$"{destLang} Memo Back ifCond must keep text_fr (FR-invariant selector for family grouping)");
// (b) Grouping is language-invariant (control-break helpers from #449) and must survive
// translation untouched, so all 8 families still group correctly in every language.
translated.Should().Contain("{{#ifFamilyHeader}}",
$"{destLang} Memo Back family grouping helper must survive translation (language-invariant control-break, #449)");
translated.Should().Contain("{{#ifSubfamilyHeader}}",
$"{destLang} Memo Back subfamily grouping helper must survive translation (language-invariant control-break, #449)");
}

[Theory]
Expand All @@ -176,8 +181,9 @@ public void Memo_Back_Taxonomy_Display_Tokens_Are_Localized_While_Grouping_Selec
// labels in French (Famille / Sous-Famille / Soussousfamille) in EN/RU/PT because the Memo
// BackFieldConversions only carried tagline_fr. At runtime the Back is rendered through
// BackFieldConversions (TranslateCardSetInfo, front:false), so the taxonomy DISPLAY tokens
// must be localized there — while the FR-invariant ifCond family selector (Famille == text_fr)
// must stay untouched so the 8 families still group correctly.
// must be localized there — while the language-invariant control-break grouping helpers
// (#449: {{#ifFamilyHeader}}/{{#ifSubfamilyHeader}}) must survive translation so the 8
// families still group correctly in every language.
var original = ReadTemplate("Cards/Memo/Argumentum_Memo_Back_fr.json");
var loc = GetFallaciesLocalization();

Expand All @@ -194,11 +200,11 @@ public void Memo_Back_Taxonomy_Display_Tokens_Are_Localized_While_Grouping_Selec
translated.Should().NotContain("{{Sous-Famille}}", $"{destLang} Back subfamily label must no longer be the FR token");
translated.Should().NotContain("{{Soussousfamille}}", $"{destLang} Back subsubfamily label must no longer be the FR token");

// (c) The FR-invariant grouping selector must survive: ifCond keeps Famille == text_fr.
// NB: this template is read raw from the .json (no JSON-unescape), so the operator quotes
// appear escaped on disk as \"==\" — assert against that on-disk form.
translated.Should().Contain("Famille \\\"==\\\"", $"{destLang} Back ifCond family operand must stay FR (data-driven grouping)");
translated.Should().Contain("text_fr ", $"{destLang} Back ifCond must keep text_fr (FR-invariant selector)");
// (c) Grouping is language-invariant: #449 replaced the old ifCond Famille==text_fr selector
// with control-break helpers. They must survive translation so the 8 families still
// group correctly in EN/RU/PT.
translated.Should().Contain("{{#ifFamilyHeader}}", $"{destLang} Back family grouping helper must survive translation (language-invariant control-break, #449)");
translated.Should().Contain("{{#ifSubfamilyHeader}}", $"{destLang} Back subfamily grouping helper must survive translation (language-invariant control-break, #449)");

// (d) The CSS colour class binding ({{Famille_camelCase}}) must stay intact.
translated.Should().Contain("Famille_camelCase", $"{destLang} Back CSS colour class binding must be preserved");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,10 +210,10 @@ public class AssetConverterConfig
nameof(FallacyMindMapDocumentConfig.LinkExpression),
}),
StaticConversions = new List<(string sourceText, List<(string Language, string destText)> textConversions)>(new[]{
(nameof(Fallacy.TextFr), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.TextEn)), ("ru", nameof(Fallacy.TextRu)), ("pt", nameof(Fallacy.TextPt)), ("es", nameof(Fallacy.TextEs))}) ),
(nameof(Fallacy.DescFr), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.DescEn)), ("ru", nameof(Fallacy.DescRu)), ("pt", nameof(Fallacy.DescPt)), ("es", nameof(Fallacy.DescEs))}) ),
(nameof(Fallacy.ExampleFr), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.ExampleEn)), ("ru", nameof(Fallacy.Exampleru)), ("pt", nameof(Fallacy.ExamplePt)), ("es", nameof(Fallacy.ExampleEs))}) ),
("LinkFrFallback", new List<(string Language, string destText)>(new []{("en", "LinkEnFallback"), ("ru", "LinkRuFallback"), ("pt", "LinkPtFallback"), ("es", "LinkEsFallback") }) ),
(nameof(Fallacy.TextFr), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.TextEn)), ("ru", nameof(Fallacy.TextRu)), ("pt", nameof(Fallacy.TextPt)), ("es", nameof(Fallacy.TextEs)), ("ar", nameof(Fallacy.TextAr)), ("fa", nameof(Fallacy.TextFa)), ("zh", nameof(Fallacy.TextZh))}) ),
(nameof(Fallacy.DescFr), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.DescEn)), ("ru", nameof(Fallacy.DescRu)), ("pt", nameof(Fallacy.DescPt)), ("es", nameof(Fallacy.DescEs)), ("ar", nameof(Fallacy.DescAr)), ("fa", nameof(Fallacy.DescFa)), ("zh", nameof(Fallacy.DescZh))}) ),
(nameof(Fallacy.ExampleFr), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.ExampleEn)), ("ru", nameof(Fallacy.Exampleru)), ("pt", nameof(Fallacy.ExamplePt)), ("es", nameof(Fallacy.ExampleEs)), ("ar", nameof(Fallacy.ExampleAr)), ("fa", nameof(Fallacy.ExampleFa)), ("zh", nameof(Fallacy.ExampleZh))}) ),
("LinkFrFallback", new List<(string Language, string destText)>(new []{("en", "LinkEnFallback"), ("ru", "LinkRuFallback"), ("pt", "LinkPtFallback"), ("es", "LinkEsFallback"), ("ar", "LinkArFallback"), ("fa", "LinkFaFallback"), ("zh", "LinkZhFallback") }) ),
}),
},
// Fallacy family hierarchy: FR names → localized names
Expand All @@ -226,9 +226,9 @@ public class AssetConverterConfig
nameof(FallacyMindMapDocumentConfig.SoussousFamilleExpression),
}),
StaticConversions = new List<(string sourceText, List<(string Language, string destText)> textConversions)>(new[]{
(nameof(Fallacy.Soussousfamille), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.Subsubfamily)), ("ru", nameof(Fallacy.SubsubfamilyRu)), ("pt", nameof(Fallacy.SubsubfamilyPt)), ("es", nameof(Fallacy.SubsubfamilyEs))}) ),
(nameof(Fallacy.SousFamille), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.Subfamily)), ("ru", nameof(Fallacy.SubfamilyRu)), ("pt", nameof(Fallacy.SubfamilyPt)), ("es", nameof(Fallacy.SubfamilyEs))}) ),
(nameof(Fallacy.Famille), new List<(string Language, string destText)>(new []{("en", "Family"), ("ru", nameof(Fallacy.FamilyRu)), ("pt", nameof(Fallacy.FamilyPt)), ("es", nameof(Fallacy.FamilyEs))}) ),
(nameof(Fallacy.Soussousfamille), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.Subsubfamily)), ("ru", nameof(Fallacy.SubsubfamilyRu)), ("pt", nameof(Fallacy.SubsubfamilyPt)), ("es", nameof(Fallacy.SubsubfamilyEs)), ("ar", nameof(Fallacy.SubsubfamilyAr)), ("fa", nameof(Fallacy.SubsubfamilyFa)), ("zh", nameof(Fallacy.SubsubfamilyZh))}) ),
(nameof(Fallacy.SousFamille), new List<(string Language, string destText)>(new []{("en", nameof(Fallacy.Subfamily)), ("ru", nameof(Fallacy.SubfamilyRu)), ("pt", nameof(Fallacy.SubfamilyPt)), ("es", nameof(Fallacy.SubfamilyEs)), ("ar", nameof(Fallacy.SubfamilyAr)), ("fa", nameof(Fallacy.SubfamilyFa)), ("zh", nameof(Fallacy.SubfamilyZh))}) ),
(nameof(Fallacy.Famille), new List<(string Language, string destText)>(new []{("en", "Family"), ("ru", nameof(Fallacy.FamilyRu)), ("pt", nameof(Fallacy.FamilyPt)), ("es", nameof(Fallacy.FamilyEs)), ("ar", nameof(Fallacy.FamilyAr)), ("fa", nameof(Fallacy.FamilyFa)), ("zh", nameof(Fallacy.FamilyZh))}) ),
}),
},
// Virtue root title translation (data is FR-only, only tree root name changes)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
{
public class Fallacy : CsvBase<Fallacy, FallacyClassMap>, IMindMapItem, ICsvBase
{
public string GetId()

Check warning on line 10 in Generation/Converters/Argumentum.AssetConverter/Entities/Fallacy.cs

View workflow job for this annotation

GitHub Actions / build (Debug)

'Fallacy.GetId()' hides inherited member 'CsvBase<Fallacy, FallacyClassMap>.GetId()'. Use the new keyword if hiding was intended.

Check warning on line 10 in Generation/Converters/Argumentum.AssetConverter/Entities/Fallacy.cs

View workflow job for this annotation

GitHub Actions / build (Release)

'Fallacy.GetId()' hides inherited member 'CsvBase<Fallacy, FallacyClassMap>.GetId()'. Use the new keyword if hiding was intended.
{
return Id;
}
Expand All @@ -20,7 +20,7 @@
public string Description => DescFr;
public string Example => ExampleFr;
public string Link => LinkFrFallback;
public string Id { get; set; }

Check warning on line 23 in Generation/Converters/Argumentum.AssetConverter/Entities/Fallacy.cs

View workflow job for this annotation

GitHub Actions / build (Debug)

'Fallacy.Id' hides inherited member 'CsvBase<Fallacy, FallacyClassMap>.Id'. Use the new keyword if hiding was intended.

Check warning on line 23 in Generation/Converters/Argumentum.AssetConverter/Entities/Fallacy.cs

View workflow job for this annotation

GitHub Actions / build (Release)

'Fallacy.Id' hides inherited member 'CsvBase<Fallacy, FallacyClassMap>.Id'. Use the new keyword if hiding was intended.

public string LinkFrFallback => string.IsNullOrEmpty(LinkFr) ? LinkEn : LinkFr;

Expand All @@ -30,6 +30,14 @@

public string LinkPtFallback => string.IsNullOrEmpty(LinkPt) ? string.IsNullOrEmpty(LinkEn) ? LinkFr : LinkEn : LinkPt;

public string LinkEsFallback => string.IsNullOrEmpty(LinkEs) ? string.IsNullOrEmpty(LinkEn) ? LinkFr : LinkEn : LinkEs;

public string LinkArFallback => string.IsNullOrEmpty(LinkAr) ? string.IsNullOrEmpty(LinkEn) ? LinkFr : LinkEn : LinkAr;

public string LinkFaFallback => string.IsNullOrEmpty(LinkFa) ? string.IsNullOrEmpty(LinkEn) ? LinkFr : LinkEn : LinkFa;

public string LinkZhFallback => string.IsNullOrEmpty(LinkZh) ? string.IsNullOrEmpty(LinkEn) ? LinkFr : LinkEn : LinkZh;

//public string FileName => $"argumentum_{Path}-{TextFr.ToLower().Replace(" ","_")}";

public string PK { get; set; }
Expand Down Expand Up @@ -119,6 +127,42 @@

public string LinkEs { get; set; }

public string FamilyAr { get; set; }
public string SubfamilyAr { get; set; }
public string SubsubfamilyAr { get; set; }

public string TextAr { get; set; }

public string DescAr { get; set; }

public string ExampleAr { get; set; }

public string LinkAr { get; set; }

public string FamilyFa { get; set; }
public string SubfamilyFa { get; set; }
public string SubsubfamilyFa { get; set; }

public string TextFa { get; set; }

public string DescFa { get; set; }

public string ExampleFa { get; set; }

public string LinkFa { get; set; }

public string FamilyZh { get; set; }
public string SubfamilyZh { get; set; }
public string SubsubfamilyZh { get; set; }

public string TextZh { get; set; }

public string DescZh { get; set; }

public string ExampleZh { get; set; }

public string LinkZh { get; set; }

public string PlusLienstransverses { get; set; }
public string TypeLienTransverse { get; set; }
public string Shape { get; set; }
Expand Down Expand Up @@ -200,6 +244,27 @@
Map(m => m.DescEs).Name("desc_es").Optional();
Map(m => m.ExampleEs).Name("example_es").Optional();
Map(m => m.LinkEs).Name("link_es").Optional();
Map(m => m.FamilyAr).Name("Family_ar").Optional();
Map(m => m.SubfamilyAr).Name("Subfamily_ar").Optional();
Map(m => m.SubsubfamilyAr).Name("Subsubfamily_ar").Optional();
Map(m => m.TextAr).Name("text_ar").Optional();
Map(m => m.DescAr).Name("desc_ar").Optional();
Map(m => m.ExampleAr).Name("example_ar").Optional();
Map(m => m.LinkAr).Name("link_ar").Optional();
Map(m => m.FamilyFa).Name("Family_fa").Optional();
Map(m => m.SubfamilyFa).Name("Subfamily_fa").Optional();
Map(m => m.SubsubfamilyFa).Name("Subsubfamily_fa").Optional();
Map(m => m.TextFa).Name("text_fa").Optional();
Map(m => m.DescFa).Name("desc_fa").Optional();
Map(m => m.ExampleFa).Name("example_fa").Optional();
Map(m => m.LinkFa).Name("link_fa").Optional();
Map(m => m.FamilyZh).Name("Family_zh").Optional();
Map(m => m.SubfamilyZh).Name("Subfamily_zh").Optional();
Map(m => m.SubsubfamilyZh).Name("Subsubfamily_zh").Optional();
Map(m => m.TextZh).Name("text_zh").Optional();
Map(m => m.DescZh).Name("desc_zh").Optional();
Map(m => m.ExampleZh).Name("example_zh").Optional();
Map(m => m.LinkZh).Name("link_zh").Optional();
Map(m => m.Lxfr145).Name("Lxfr145").Optional();
Map(m => m.Remarques).Name("Remarques");
Map(m => m.Latin).Name("Latin").Optional();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ public override string GetLogMessage()
{
("fr", "en"),
("fr", "ru"),
("fr", "pt")
("fr", "pt"),
("fr", "es"),
("fr", "ar"),
("fr", "fa"),
("fr", "zh")
}),
ImageFormat = MagickFormat.Png,
TargetDensity = 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,11 @@ public override string GetLogMessage()
{
("fr", "en"),
("fr", "ru"),
("fr", "pt")
("fr", "pt"),
("fr", "es"),
("fr", "ar"),
("fr", "fa"),
("fr", "zh")
}),
ImageFormat = MagickFormat.Png,
TargetDensity = 0,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class TaxonomyValidationTests
{
private readonly AssetConverterConfig _config;
private IList<Fallacy> _fallacies;
private readonly List<string> _supportedLanguages = new List<string> { "fr", "en", "ru", "pt" };
private readonly List<string> _supportedLanguages = new List<string> { "fr", "en", "ru", "pt", "es", "ar", "fa", "zh" };

/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="TaxonomyValidationTests"/>.
Expand Down
Loading