diff --git a/src/api/wix/WixToolset.Data/Localization.cs b/src/api/wix/WixToolset.Data/Localization.cs index 70c096de5..d7727f17a 100644 --- a/src/api/wix/WixToolset.Data/Localization.cs +++ b/src/api/wix/WixToolset.Data/Localization.cs @@ -15,11 +15,20 @@ public sealed class Localization 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 @@ public Localization(int? codepage, int? summaryInformationCodepage, string cultu 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 @@ public Localization(int? codepage, int? summaryInformationCodepage, string cultu /// 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 @@ internal JsonObject Serialize() 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 @@ internal static Localization Deserialize(JsonObject jsonObject) } } - 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 000000000..773c4d9f2 --- /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 1252842b4..9f59ce468 100644 --- a/src/api/wix/WixToolset.Data/LocalizedControl.cs +++ b/src/api/wix/WixToolset.Data/LocalizedControl.cs @@ -45,7 +45,10 @@ public LocalizedControl(string dialog, string control, int x, int y, int width, /// 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 @@ public LocalizedControl(string dialog, string control, int x, int y, int width, /// 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 e4a10fd98..291b10143 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 823e2beb3..e6565f4a7 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 55daf0053..9dc99705a 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 9cd5341e2..5e9d225dd 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 0ec0f55c9..592cc6414 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 2f30c2bf6..c3c8fc038 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 ca0a3ea67..9d6cc63af 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 d61af23f0..e0d819799 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 7481d993a..55a7b9990 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 52dbab558..64c5a1ac0 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 04e3dcee0..ff6934bd4 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 de3e93cd7..44731a5f7 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 6a0e1f097..ccbe362d5 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 1b6096fb0..65bc14354 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 914857241..f434001f4 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 3252fc17b..9965ca515 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 8dd9e003f..61d618cf0 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 666279423..8ba83498e 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 60de94feb..77a86bde6 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 9e6e87658..654970a88 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 325570292..349a59127 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 c9904b615..a06f8b175 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 d3ca33584..c9de28765 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 fc2db1843..b144989e1 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 82c5b118c..9477ce672 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 f6357c6cc..8f5239c0a 100644 --- a/src/wix/WixToolset.Core/Librarian.cs +++ b/src/wix/WixToolset.Core/Librarian.cs @@ -63,6 +63,11 @@ public ILibraryResult Combine(ILibraryContext context) 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 5c021ca0f..59728741d 100644 --- a/src/wix/WixToolset.Core/Linker.cs +++ b/src/wix/WixToolset.Core/Linker.cs @@ -87,6 +87,14 @@ public Intermediate Link(ILinkContext context) 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 995efe40a..29d3d932f 100644 --- a/src/wix/WixToolset.Core/LocalizationParser.cs +++ b/src/wix/WixToolset.Core/LocalizationParser.cs @@ -86,6 +86,7 @@ private static void AddWixVariable(IMessaging messaging, IDictionary diff --git a/src/wix/WixToolset.Core/Resolver.cs b/src/wix/WixToolset.Core/Resolver.cs index 2eebc80ae..97f0223f7 100644 --- a/src/wix/WixToolset.Core/Resolver.cs +++ b/src/wix/WixToolset.Core/Resolver.cs @@ -230,21 +230,6 @@ private static IEnumerable FilterLocalizations(IResolveContext con 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 @@ private static IEnumerable CalculateCultureFilter(IResolveContext contex 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 b526a209a..2938be48d 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 a6c88ddba..bb65b467f 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 @@ public static void Main(string[] args) 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 @@ public static void Main(string[] args) 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 000000000..8dfc1c302 --- /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 000000000..32d52e839 --- /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 af5d5086b..a5298ac3e 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 429226f53..a59187b60 100644 --- a/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs +++ b/src/wix/test/WixToolsetTest.CoreIntegration/ExtensionFixture.cs @@ -18,7 +18,7 @@ public class ExtensionFixture [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 @@ private static string ReplaceGuids(string value) [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 @@ public void CanBuildWithExampleExtensionWithRegistryPossibleKeyPath() } } + [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 @@ public void CanParseCommandLineWithExtension() [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 @@ public void CannotBuildWithMissingExtension() [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 000000000..646c0875d --- /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 000000000..7f17b538d --- /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 000000000..1b4ffe8a4 --- /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