From 7be5d94529c8419b4bd5da4dcd838795622643cb Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 6 Dec 2023 15:30:16 -0800 Subject: Link localizations from WixExtensions the same as sections --- src/api/wix/WixToolset.Data/Localization.cs | 39 ++++++++++++- .../wix/WixToolset.Data/LocalizationLocation.cs | 31 ++++++++++ src/api/wix/WixToolset.Data/LocalizedControl.cs | 10 +++- .../WixToolset.Extensibility/BaseExtensionData.cs | 4 +- .../wix/WixToolset.Extensibility/IExtensionData.cs | 6 -- src/ext/Bal/wixext/BalExtensionData.cs | 6 -- src/ext/ComPlus/wixext/ComPlusExtensionData.cs | 6 -- src/ext/ComPlus/wixlib/en-us.wxl | 2 +- .../Dependency/wixext/DependencyExtensionData.cs | 6 -- src/ext/Dependency/wixlib/en-us.wxl | 2 +- src/ext/DirectX/wixext/DirectXExtensionData.cs | 6 -- src/ext/Firewall/wixext/FirewallExtensionData.cs | 2 - src/ext/Firewall/wixlib/en-us.wxl | 2 +- src/ext/Http/wixext/HttpExtensionData.cs | 6 -- src/ext/Http/wixlib/en-us.wxl | 2 +- src/ext/Iis/wixext/IIsExtensionData.cs | 6 -- src/ext/Iis/wixlib/en-us.wxl | 2 +- src/ext/Msmq/wixext/MsmqExtensionData.cs | 6 -- src/ext/Msmq/wixlib/en-us.wxl | 2 +- src/ext/NetFx/wixext/NetFxExtensionData.cs | 2 - src/ext/PowerShell/wixext/PSExtensionData.cs | 6 -- src/ext/Sql/wixext/SqlExtensionData.cs | 6 -- src/ext/Sql/wixlib/en-us.wxl | 2 +- src/ext/UI/wixext/UIExtensionData.cs | 2 - src/ext/UI/wixlib/WixUI_en-us.wxl | 2 +- src/ext/Util/wixext/UtilExtensionData.cs | 2 - src/ext/Util/wixlib/en-us.wxl | 2 +- src/ext/VisualStudio/wixext/VSExtensionData.cs | 6 -- src/wix/WixToolset.Core/Librarian.cs | 5 ++ src/wix/WixToolset.Core/Linker.cs | 8 +++ src/wix/WixToolset.Core/LocalizationParser.cs | 10 +++- src/wix/WixToolset.Core/Resolver.cs | 24 +++----- .../CompileCoreTestExtensionWixlib.csproj | 17 +++--- .../test/CompileCoreTestExtensionWixlib/Program.cs | 8 ++- .../test/Example.Extension/Data/example.en-us.wxl | 3 + .../test/Example.Extension/Data/example.ja-jp.wxl | 3 + src/wix/test/Example.Extension/Data/example.wxs | 6 ++ .../ExtensionFixture.cs | 67 ++++++++++++++++++++-- .../ExampleExtensionLocalized/LocalizedPackage.wxs | 18 ++++++ .../PackageComponents.wxs | 12 ++++ .../ExampleExtensionLocalized/data/example.txt | 1 + 41 files changed, 237 insertions(+), 121 deletions(-) create mode 100644 src/api/wix/WixToolset.Data/LocalizationLocation.cs create mode 100644 src/wix/test/Example.Extension/Data/example.en-us.wxl create mode 100644 src/wix/test/Example.Extension/Data/example.ja-jp.wxl create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/LocalizedPackage.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/PackageComponents.wxs create mode 100644 src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/data/example.txt diff --git a/src/api/wix/WixToolset.Data/Localization.cs b/src/api/wix/WixToolset.Data/Localization.cs index 70c096de..d7727f17 100644 --- a/src/api/wix/WixToolset.Data/Localization.cs +++ b/src/api/wix/WixToolset.Data/Localization.cs @@ -15,11 +15,20 @@ namespace WixToolset.Data private readonly Dictionary variables = new Dictionary(); private readonly Dictionary localizedControls = new Dictionary(); + /// + /// Instantiates a new localization object with default location. + /// + public Localization(int? codepage, int? summaryInformationCodepage, string culture, IDictionary variables, IDictionary localizedControls) : + this(LocalizationLocation.Source, codepage, summaryInformationCodepage, culture, variables, localizedControls) + { + } + /// /// Instantiates a new localization object. /// - public Localization(int? codepage, int? summaryInformationCodepage, string culture, IDictionary variables, IDictionary localizedControls) + public Localization(LocalizationLocation location, int? codepage, int? summaryInformationCodepage, string culture, IDictionary variables, IDictionary localizedControls) { + this.Location = location; this.Codepage = codepage; this.SummaryInformationCodepage = summaryInformationCodepage; this.Culture = culture?.ToLowerInvariant() ?? String.Empty; @@ -27,6 +36,11 @@ namespace WixToolset.Data this.localizedControls = new Dictionary(localizedControls); } + /// + /// Gets the location the localization came from. + /// + public LocalizationLocation Location { get; private set; } + /// /// Gets the codepage. /// @@ -57,9 +71,27 @@ namespace WixToolset.Data /// The localized controls. public ICollection> LocalizedControls => this.localizedControls; + /// + /// Updates the location, if the location is a higher state than the current state. + /// + /// Location to update to. + /// This localization object. + public Localization UpdateLocation(LocalizationLocation location) + { + if (this.Location < location) + { + this.Location = location; + } + + return this; + } + internal JsonObject Serialize() { - var jsonObject = new JsonObject(); + var jsonObject = new JsonObject() + { + { "location", this.Location.ToString().ToLowerInvariant() } + }; if (this.Codepage.HasValue) { @@ -108,6 +140,7 @@ namespace WixToolset.Data internal static Localization Deserialize(JsonObject jsonObject) { + var location = jsonObject.GetEnumOrDefault("location", LocalizationLocation.Source); var codepage = jsonObject.GetValueOrDefault("codepage", null); var summaryCodepage = jsonObject.GetValueOrDefault("summaryCodepage", null); var culture = jsonObject.GetValueOrDefault("culture"); @@ -131,7 +164,7 @@ namespace WixToolset.Data } } - return new Localization(codepage, summaryCodepage, culture, variables, controls); + return new Localization(location, codepage, summaryCodepage, culture, variables, controls); } } } diff --git a/src/api/wix/WixToolset.Data/LocalizationLocation.cs b/src/api/wix/WixToolset.Data/LocalizationLocation.cs new file mode 100644 index 00000000..773c4d9f --- /dev/null +++ b/src/api/wix/WixToolset.Data/LocalizationLocation.cs @@ -0,0 +1,31 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.Data +{ + /// + /// Location where the localization was loaded. + /// + public enum LocalizationLocation + { + /// + /// Localization loaded from .wxl source file. + /// + Source, + + /// + /// Localization loaded from .wixlib library. + /// + Library, + + /// + /// Localization loaded from .wixlib library within .wixext WixExtension. + /// + Extension, + + /// + /// Localization placed in .wixext WixExtension as the default culture localization for the + /// WixExtension. + /// + ExtensionDefaultCulture + } +} diff --git a/src/api/wix/WixToolset.Data/LocalizedControl.cs b/src/api/wix/WixToolset.Data/LocalizedControl.cs index 1252842b..9f59ce46 100644 --- a/src/api/wix/WixToolset.Data/LocalizedControl.cs +++ b/src/api/wix/WixToolset.Data/LocalizedControl.cs @@ -45,7 +45,10 @@ namespace WixToolset.Data /// Get key for a localized control. /// /// The localized control id. - public string GetKey() => LocalizedControl.GetKey(this.Dialog, this.Control); + public string GetKey() + { + return LocalizedControl.GetKey(this.Dialog, this.Control); + } /// /// Get key for a localized control. @@ -53,7 +56,10 @@ namespace WixToolset.Data /// The optional id of the control's dialog. /// The id of the control. /// The localized control id. - public static string GetKey(string dialog, string control) => String.Concat(dialog, "/", control); + public static string GetKey(string dialog, string control) + { + return String.Concat(dialog, "/", control); + } internal JsonObject Serialize() { diff --git a/src/api/wix/WixToolset.Extensibility/BaseExtensionData.cs b/src/api/wix/WixToolset.Extensibility/BaseExtensionData.cs index e4a10fd9..291b1014 100644 --- a/src/api/wix/WixToolset.Extensibility/BaseExtensionData.cs +++ b/src/api/wix/WixToolset.Extensibility/BaseExtensionData.cs @@ -2,6 +2,7 @@ namespace WixToolset.Extensibility { + using System; using WixToolset.Data; /// @@ -10,8 +11,9 @@ namespace WixToolset.Extensibility public abstract class BaseExtensionData : IExtensionData { /// - /// See + /// Obsolete in WiX v5. Use the WixLocalization/@ExtensionDefaultCulture attribute in the wxl file instead. /// + [Obsolete("Set the ExtensionDefaultCulture attribute in the WixLocalization source file instead.")] public virtual string DefaultCulture => null; /// diff --git a/src/api/wix/WixToolset.Extensibility/IExtensionData.cs b/src/api/wix/WixToolset.Extensibility/IExtensionData.cs index 823e2beb..e6565f4a 100644 --- a/src/api/wix/WixToolset.Extensibility/IExtensionData.cs +++ b/src/api/wix/WixToolset.Extensibility/IExtensionData.cs @@ -9,12 +9,6 @@ namespace WixToolset.Extensibility /// public interface IExtensionData { - /// - /// Gets the optional default culture. - /// - /// The optional default culture. - string DefaultCulture { get; } - /// /// /// diff --git a/src/ext/Bal/wixext/BalExtensionData.cs b/src/ext/Bal/wixext/BalExtensionData.cs index 55daf005..9dc99705 100644 --- a/src/ext/Bal/wixext/BalExtensionData.cs +++ b/src/ext/Bal/wixext/BalExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.Bal /// public sealed class BalExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = BalSymbolDefinitions.ByName(name); diff --git a/src/ext/ComPlus/wixext/ComPlusExtensionData.cs b/src/ext/ComPlus/wixext/ComPlusExtensionData.cs index 9cd5341e..5e9d225d 100644 --- a/src/ext/ComPlus/wixext/ComPlusExtensionData.cs +++ b/src/ext/ComPlus/wixext/ComPlusExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.ComPlus /// public sealed class ComPlusExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = ComPlusSymbolDefinitions.ByName(name); diff --git a/src/ext/ComPlus/wixlib/en-us.wxl b/src/ext/ComPlus/wixlib/en-us.wxl index 0ec0f55c..592cc641 100644 --- a/src/ext/ComPlus/wixlib/en-us.wxl +++ b/src/ext/ComPlus/wixlib/en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/Dependency/wixext/DependencyExtensionData.cs b/src/ext/Dependency/wixext/DependencyExtensionData.cs index 2f30c2bf..c3c8fc03 100644 --- a/src/ext/Dependency/wixext/DependencyExtensionData.cs +++ b/src/ext/Dependency/wixext/DependencyExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.Dependency /// public sealed class DependencyExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - /// /// Gets the contained .wixlib content. /// diff --git a/src/ext/Dependency/wixlib/en-us.wxl b/src/ext/Dependency/wixlib/en-us.wxl index ca0a3ea6..9d6cc63a 100644 --- a/src/ext/Dependency/wixlib/en-us.wxl +++ b/src/ext/Dependency/wixlib/en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/DirectX/wixext/DirectXExtensionData.cs b/src/ext/DirectX/wixext/DirectXExtensionData.cs index d61af23f..e0d81979 100644 --- a/src/ext/DirectX/wixext/DirectXExtensionData.cs +++ b/src/ext/DirectX/wixext/DirectXExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.DirectX /// public sealed class DirectXExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions) { return Intermediate.Load(typeof(DirectXExtensionData).Assembly, "WixToolset.DirectX.directx.wixlib", symbolDefinitions); diff --git a/src/ext/Firewall/wixext/FirewallExtensionData.cs b/src/ext/Firewall/wixext/FirewallExtensionData.cs index 7481d993..55a7b999 100644 --- a/src/ext/Firewall/wixext/FirewallExtensionData.cs +++ b/src/ext/Firewall/wixext/FirewallExtensionData.cs @@ -7,8 +7,6 @@ namespace WixToolset.Firewall public sealed class FirewallExtensionData : BaseExtensionData { - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = FirewallSymbolDefinitions.ByName(name); diff --git a/src/ext/Firewall/wixlib/en-us.wxl b/src/ext/Firewall/wixlib/en-us.wxl index 52dbab55..64c5a1ac 100644 --- a/src/ext/Firewall/wixlib/en-us.wxl +++ b/src/ext/Firewall/wixlib/en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/Http/wixext/HttpExtensionData.cs b/src/ext/Http/wixext/HttpExtensionData.cs index 04e3dcee..ff6934bd 100644 --- a/src/ext/Http/wixext/HttpExtensionData.cs +++ b/src/ext/Http/wixext/HttpExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.Http /// public sealed class HttpExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = HttpSymbolDefinitions.ByName(name); diff --git a/src/ext/Http/wixlib/en-us.wxl b/src/ext/Http/wixlib/en-us.wxl index de3e93cd..44731a5f 100644 --- a/src/ext/Http/wixlib/en-us.wxl +++ b/src/ext/Http/wixlib/en-us.wxl @@ -1,6 +1,6 @@  - + diff --git a/src/ext/Iis/wixext/IIsExtensionData.cs b/src/ext/Iis/wixext/IIsExtensionData.cs index 6a0e1f09..ccbe362d 100644 --- a/src/ext/Iis/wixext/IIsExtensionData.cs +++ b/src/ext/Iis/wixext/IIsExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.Iis /// public sealed class IIsExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = IisSymbolDefinitions.ByName(name); diff --git a/src/ext/Iis/wixlib/en-us.wxl b/src/ext/Iis/wixlib/en-us.wxl index 1b6096fb..65bc1435 100644 --- a/src/ext/Iis/wixlib/en-us.wxl +++ b/src/ext/Iis/wixlib/en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/Msmq/wixext/MsmqExtensionData.cs b/src/ext/Msmq/wixext/MsmqExtensionData.cs index 91485724..f434001f 100644 --- a/src/ext/Msmq/wixext/MsmqExtensionData.cs +++ b/src/ext/Msmq/wixext/MsmqExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.Msmq /// public sealed class MsmqExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = MsmqSymbolDefinitions.ByName(name); diff --git a/src/ext/Msmq/wixlib/en-us.wxl b/src/ext/Msmq/wixlib/en-us.wxl index 3252fc17..9965ca51 100644 --- a/src/ext/Msmq/wixlib/en-us.wxl +++ b/src/ext/Msmq/wixlib/en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/NetFx/wixext/NetFxExtensionData.cs b/src/ext/NetFx/wixext/NetFxExtensionData.cs index 8dd9e003..61d618cf 100644 --- a/src/ext/NetFx/wixext/NetFxExtensionData.cs +++ b/src/ext/NetFx/wixext/NetFxExtensionData.cs @@ -10,8 +10,6 @@ namespace WixToolset.Netfx /// public sealed class NetfxExtensionData : BaseExtensionData { - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = NetfxSymbolDefinitions.ByName(name); diff --git a/src/ext/PowerShell/wixext/PSExtensionData.cs b/src/ext/PowerShell/wixext/PSExtensionData.cs index 66627942..8ba83498 100644 --- a/src/ext/PowerShell/wixext/PSExtensionData.cs +++ b/src/ext/PowerShell/wixext/PSExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.PowerShell /// public sealed class PSExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions) { return Intermediate.Load(typeof(PSExtensionData).Assembly, "WixToolset.PowerShell.powershell.wixlib", symbolDefinitions); diff --git a/src/ext/Sql/wixext/SqlExtensionData.cs b/src/ext/Sql/wixext/SqlExtensionData.cs index 60de94fe..77a86bde 100644 --- a/src/ext/Sql/wixext/SqlExtensionData.cs +++ b/src/ext/Sql/wixext/SqlExtensionData.cs @@ -10,12 +10,6 @@ namespace WixToolset.Sql /// public sealed class SqlExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = SqlSymbolDefinitions.ByName(name); diff --git a/src/ext/Sql/wixlib/en-us.wxl b/src/ext/Sql/wixlib/en-us.wxl index 9e6e8765..654970a8 100644 --- a/src/ext/Sql/wixlib/en-us.wxl +++ b/src/ext/Sql/wixlib/en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/UI/wixext/UIExtensionData.cs b/src/ext/UI/wixext/UIExtensionData.cs index 32557029..349a5912 100644 --- a/src/ext/UI/wixext/UIExtensionData.cs +++ b/src/ext/UI/wixext/UIExtensionData.cs @@ -7,8 +7,6 @@ namespace WixToolset.UI public sealed class UIExtensionData : BaseExtensionData { - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = null; diff --git a/src/ext/UI/wixlib/WixUI_en-us.wxl b/src/ext/UI/wixlib/WixUI_en-us.wxl index c9904b61..a06f8b17 100644 --- a/src/ext/UI/wixlib/WixUI_en-us.wxl +++ b/src/ext/UI/wixlib/WixUI_en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/Util/wixext/UtilExtensionData.cs b/src/ext/Util/wixext/UtilExtensionData.cs index d3ca3358..c9de2876 100644 --- a/src/ext/Util/wixext/UtilExtensionData.cs +++ b/src/ext/Util/wixext/UtilExtensionData.cs @@ -7,8 +7,6 @@ namespace WixToolset.Util public sealed class UtilExtensionData : BaseExtensionData { - public override string DefaultCulture => "en-US"; - public override bool TryGetSymbolDefinitionByName(string name, out IntermediateSymbolDefinition symbolDefinition) { symbolDefinition = UtilSymbolDefinitions.ByName(name); diff --git a/src/ext/Util/wixlib/en-us.wxl b/src/ext/Util/wixlib/en-us.wxl index fc2db184..b144989e 100644 --- a/src/ext/Util/wixlib/en-us.wxl +++ b/src/ext/Util/wixlib/en-us.wxl @@ -1,7 +1,7 @@  - + diff --git a/src/ext/VisualStudio/wixext/VSExtensionData.cs b/src/ext/VisualStudio/wixext/VSExtensionData.cs index 82c5b118..9477ce67 100644 --- a/src/ext/VisualStudio/wixext/VSExtensionData.cs +++ b/src/ext/VisualStudio/wixext/VSExtensionData.cs @@ -7,12 +7,6 @@ namespace WixToolset.VisualStudio public sealed class VSExtensionData : BaseExtensionData { - /// - /// Gets the default culture. - /// - /// The default culture. - public override string DefaultCulture => "en-US"; - public override Intermediate GetLibrary(ISymbolDefinitionCreator symbolDefinitions) { return Intermediate.Load(typeof(VSExtensionData).Assembly, "WixToolset.VisualStudio.vs.wixlib", symbolDefinitions); diff --git a/src/wix/WixToolset.Core/Librarian.cs b/src/wix/WixToolset.Core/Librarian.cs index f6357c6c..8f5239c0 100644 --- a/src/wix/WixToolset.Core/Librarian.cs +++ b/src/wix/WixToolset.Core/Librarian.cs @@ -63,6 +63,11 @@ namespace WixToolset.Core return null; } + foreach (var localization in localizationsByCulture.Values) + { + localization.UpdateLocation(LocalizationLocation.Library); + } + trackedFiles = this.ResolveFilePathsToEmbed(context, sections); if (this.Messaging.EncounteredError) diff --git a/src/wix/WixToolset.Core/Linker.cs b/src/wix/WixToolset.Core/Linker.cs index 5c021ca0..59728741 100644 --- a/src/wix/WixToolset.Core/Linker.cs +++ b/src/wix/WixToolset.Core/Linker.cs @@ -87,6 +87,14 @@ namespace WixToolset.Core if (library != null) { sections.AddRange(library.Sections); + + if (library.Localizations?.Count > 0) + { + // Include localizations from the extension data and be sure to note that the localization came from + // an extension. It is important to remember whiche localization came from an extension when filtering + // localizations during the resolve process later. + localizations.AddRange(library.Localizations.Select(l => l.UpdateLocation(LocalizationLocation.Extension))); + } } } diff --git a/src/wix/WixToolset.Core/LocalizationParser.cs b/src/wix/WixToolset.Core/LocalizationParser.cs index 995efe40..29d3d932 100644 --- a/src/wix/WixToolset.Core/LocalizationParser.cs +++ b/src/wix/WixToolset.Core/LocalizationParser.cs @@ -86,6 +86,7 @@ namespace WixToolset.Core private static Localization ParseWixLocalizationElement(IMessaging messaging, XElement node) { var sourceLineNumbers = SourceLineNumber.CreateFromXObject(node); + var location = LocalizationLocation.Source; int? codepage = null; int? summaryInformationCodepage = null; string culture = null; @@ -96,6 +97,13 @@ namespace WixToolset.Core { switch (attrib.Name.LocalName) { + case "ExtensionDefaultCulture": + if (Common.GetAttributeYesNoValue(messaging, sourceLineNumbers, attrib) == YesNoType.Yes) + { + location = LocalizationLocation.ExtensionDefaultCulture; + } + break; + case "Codepage": codepage = Common.GetValidCodePage(attrib.Value, allowNoChange: true, onlyAnsi: false, sourceLineNumbers); break; @@ -147,7 +155,7 @@ namespace WixToolset.Core } } - return messaging.EncounteredError ? null : new Localization(codepage, summaryInformationCodepage, culture, variables, localizedControls); + return messaging.EncounteredError ? null : new Localization(location, codepage, summaryInformationCodepage, culture, variables, localizedControls); } /// diff --git a/src/wix/WixToolset.Core/Resolver.cs b/src/wix/WixToolset.Core/Resolver.cs index 2eebc80a..97f0223f 100644 --- a/src/wix/WixToolset.Core/Resolver.cs +++ b/src/wix/WixToolset.Core/Resolver.cs @@ -230,21 +230,6 @@ namespace WixToolset.Core AddFilteredLocalizations(result, filter, localizations); - // Filter localizations provided by extensions with data. - var creator = context.ServiceProvider.GetService(); - - foreach (var data in context.ExtensionData) - { - var library = data.GetLibrary(creator); - - if (library?.Localizations != null && library.Localizations.Any()) - { - var extensionFilter = (!filter.Any() && data.DefaultCulture != null) ? new[] { data.DefaultCulture } : filter; - - AddFilteredLocalizations(result, extensionFilter, library.Localizations); - } - } - return result; } @@ -265,10 +250,15 @@ namespace WixToolset.Core private static void AddFilteredLocalizations(List result, IEnumerable filter, IEnumerable localizations) { - // If there is no filter, return all localizations. + // If there is no filter, return all localizations provided by the user (either as a .wxl or from a .wixlib on the command-line) + // **and only** the extension's default culture localizations. if (!filter.Any()) { - result.AddRange(localizations); + // The filter turns out to be really simple, skip localizations that came from an extension (LocalizationLocation.Extension) + // but keep those that are marked as the extension's default culture (LocalizationLocation.ExtensionDefaultCulture). + var filtered = localizations.Where(l => l.Location != LocalizationLocation.Extension); + + result.AddRange(filtered); } else // filter localizations in order specified by the filter { diff --git a/src/wix/test/CompileCoreTestExtensionWixlib/CompileCoreTestExtensionWixlib.csproj b/src/wix/test/CompileCoreTestExtensionWixlib/CompileCoreTestExtensionWixlib.csproj index b526a209..2938be48 100644 --- a/src/wix/test/CompileCoreTestExtensionWixlib/CompileCoreTestExtensionWixlib.csproj +++ b/src/wix/test/CompileCoreTestExtensionWixlib/CompileCoreTestExtensionWixlib.csproj @@ -8,6 +8,8 @@ Exe false Major + + $(BaseOutputPath)TestData\$(Configuration)\example.wixlib @@ -15,20 +17,19 @@ - - $(BaseOutputPath)TestData\$(Configuration)\example.wixlib - + + + - + - + diff --git a/src/wix/test/CompileCoreTestExtensionWixlib/Program.cs b/src/wix/test/CompileCoreTestExtensionWixlib/Program.cs index a6c88ddb..bb65b467 100644 --- a/src/wix/test/CompileCoreTestExtensionWixlib/Program.cs +++ b/src/wix/test/CompileCoreTestExtensionWixlib/Program.cs @@ -1,6 +1,7 @@ // Copyright(c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. using System.Collections.Generic; +using System.IO; using WixInternal.Core.TestPackage; namespace CompileCoreTestExtensionWixlib @@ -17,8 +18,6 @@ namespace CompileCoreTestExtensionWixlib var buildArgs = new List(); buildArgs.Add("build"); buildArgs.Add("-bindfiles"); - buildArgs.Add("-bindpath"); - buildArgs.Add("Data"); buildArgs.Add("-intermediateFolder"); buildArgs.Add(intermediateFolder); buildArgs.Add("-o"); @@ -26,6 +25,11 @@ namespace CompileCoreTestExtensionWixlib foreach (var path in args[2].Split(';')) { + var folder = Path.GetDirectoryName(Path.GetFullPath(path)); + + buildArgs.Add("-bindpath"); + buildArgs.Add(folder); + buildArgs.Add(path); } diff --git a/src/wix/test/Example.Extension/Data/example.en-us.wxl b/src/wix/test/Example.Extension/Data/example.en-us.wxl new file mode 100644 index 00000000..8dfc1c30 --- /dev/null +++ b/src/wix/test/Example.Extension/Data/example.en-us.wxl @@ -0,0 +1,3 @@ + + + diff --git a/src/wix/test/Example.Extension/Data/example.ja-jp.wxl b/src/wix/test/Example.Extension/Data/example.ja-jp.wxl new file mode 100644 index 00000000..32d52e83 --- /dev/null +++ b/src/wix/test/Example.Extension/Data/example.ja-jp.wxl @@ -0,0 +1,3 @@ + + + diff --git a/src/wix/test/Example.Extension/Data/example.wxs b/src/wix/test/Example.Extension/Data/example.wxs index af5d5086..a5298ac3 100644 --- a/src/wix/test/Example.Extension/Data/example.wxs +++ b/src/wix/test/Example.Extension/Data/example.wxs @@ -4,11 +4,17 @@ + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs b/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs index 429226f5..a59187b6 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs @@ -18,7 +18,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void CanBuildAndQuery() { - var folder = TestData.Get(@"TestData\ExampleExtension"); + var folder = TestData.Get("TestData", "ExampleExtension"); var build = new Builder(folder, typeof(ExampleExtensionFactory), new[] { Path.Combine(folder, "data") }); var results = build.BuildAndQuery(Build, "Wix4Example"); @@ -58,7 +58,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void CanBuildWithExampleExtension() { - var folder = TestData.Get(@"TestData\ExampleExtension"); + var folder = TestData.Get("TestData", "ExampleExtension"); using (var fs = new DisposableFileSystem()) { @@ -156,6 +156,65 @@ namespace WixToolsetTest.CoreIntegration } } + [Fact] + public void CanBuildWithExampleExtensionLocalizedDefault() + { + var folder = TestData.Get("TestData", "ExampleExtensionLocalized"); + + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "LocalizedPackage.wxs"), + "-ext", ExtensionPaths.ExampleExtensionPath, + "-bindpath", Path.Combine(folder, "data"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(intermediateFolder, "bin", "extest.msi") + }); + + result.AssertSuccess(); + + var pdb = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb")); + var section = pdb.Sections.Single(); + + var property = section.Symbols.OfType().Single(t => t.Id.Id == "LocalizedProperty"); + WixAssert.StringEqual("en-us", property.Value); + } + } + + [Fact] + public void CanBuildWithExampleExtensionLocalizedNonDefault() + { + var folder = TestData.Get("TestData", "ExampleExtensionLocalized"); + + using (var fs = new DisposableFileSystem()) + { + var intermediateFolder = fs.GetFolder(); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "LocalizedPackage.wxs"), + "-culture", "ja-jp", + "-ext", ExtensionPaths.ExampleExtensionPath, + "-bindpath", Path.Combine(folder, "data"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(intermediateFolder, "bin", "extest.msi") + }); + + result.AssertSuccess(); + + var pdb = Intermediate.Load(Path.Combine(intermediateFolder, "bin", "extest.wixpdb")); + var section = pdb.Sections.Single(); + + var property = section.Symbols.OfType().Single(t => t.Id.Id == "LocalizedProperty"); + WixAssert.StringEqual("ja-jp", property.Value); + } + } + [Fact] public void CanParseCommandLineWithExtension() { @@ -192,7 +251,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void CannotBuildWithMissingExtension() { - var folder = TestData.Get(@"TestData\ExampleExtension"); + var folder = TestData.Get("TestData", "ExampleExtension"); using (var fs = new DisposableFileSystem()) { @@ -213,7 +272,7 @@ namespace WixToolsetTest.CoreIntegration [Fact] public void CannotBuildWithMissingVersionedExtension() { - var folder = TestData.Get(@"TestData\ExampleExtension"); + var folder = TestData.Get("TestData", "ExampleExtension"); using (var fs = new DisposableFileSystem()) { diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/LocalizedPackage.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/LocalizedPackage.wxs new file mode 100644 index 00000000..646c0875 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/LocalizedPackage.wxs @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/PackageComponents.wxs b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/PackageComponents.wxs new file mode 100644 index 00000000..7f17b538 --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/PackageComponents.wxs @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/data/example.txt b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/data/example.txt new file mode 100644 index 00000000..1b4ffe8a --- /dev/null +++ b/src/wix/test/WixToolsetTest.CoreIntegration/TestData/ExampleExtensionLocalized/data/example.txt @@ -0,0 +1 @@ +This is example.txt. \ No newline at end of file -- cgit v1.2.3-55-g6feb