using System.Collections.Immutable; using AtomUI.Generator.Localization.Catalog; using AtomUI.Generator.Localization.Xliff; using AtomUI.Build.Tasks.LocalizationBuild; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.Text; using Shouldly; using Xunit; namespace AtomUI.Generator.Tests.Localization; public class TranslationBundleCompilerTests { [Fact] public void Compile_Maps_Validated_Values_To_Ordinal_Catalog_Slots() { var catalog = new LanguageCatalogInfo( "Installed.Module", "Installed.Strings", "Installed", "global::Installed.Strings", [ new LanguageCatalogUnitInfo("Body", Location.None), new LanguageCatalogUnitInfo("Title", Location.None) ], Location.None); var source = Input( catalog, LanguageFileSourceKind.ModuleBuiltIn, SourceXliff(catalog.MetadataName)); var target = Input( catalog, LanguageFileSourceKind.StaticLanguagePack, TargetXliff(catalog.MetadataName)); var workItem = new CatalogCompilationWorkItem( new CatalogSymbolEntry(catalog, ownsCatalog: true), [Resolution(catalog, source), Resolution(catalog, target)]); var validation = CatalogSemanticValidator.Validate(workItem); validation.Diagnostics.ShouldBeEmpty(); var compiled = TranslationBundleCompiler.Compile(validation.Input.ShouldNotBeNull()); var bundle = compiled.Bundles.Single(bundle => bundle.Language == "zh-CN"); bundle.Values.ShouldBe(["本文", "标题"]); } private static LanguageInputResolution Resolution( LanguageCatalogInfo catalog, LanguageFileInput input) { return new LanguageInputResolution( input, LanguageInputActivationState.Active, catalog); } private static LanguageFileInput Input( LanguageCatalogInfo catalog, LanguageFileSourceKind sourceKind, string content) { var document = Xliff21Parser.Parse(content).Document!; return new LanguageFileInput( new AdditionalLanguageFile( $"{sourceKind}/{document.TargetLanguage ?? "en-US"}.xlf", SourceText.From(content), document), catalog.ModuleId, sourceKind, $"{catalog.ModuleId}.{sourceKind}", sourceKind == LanguageFileSourceKind.StaticLanguagePack ? LanguageFileContractValidation.Deferred : LanguageFileContractValidation.Verified, sourceKind == LanguageFileSourceKind.StaticLanguagePack ? LanguageSourceFingerprint.Compute(document) : null); } private static string SourceXliff(string fileId) { return $$""" Title Body """; } private static string TargetXliff(string fileId) { return $$""" Title标题 Body本文 """; } }