Fix build when Cultures is specified
Write the tests for the test data in the WixToolset.Sdk test and fix all the culture related bugs that fallout from that. Fixes 69999
Rob Mensching committed
Nov 16, 2022 at 20:22 UTC
d7956470db6e5111ebfdc4f6ee1b6d4b6c544c4c
17 files changed
+216
-105
src/wix/WixToolset.BuildTasks/WixAssignCulture.cs
+42
-41
@@ -17,6 +17,7 @@ namespace WixToolset.BuildTasks
17
public class WixAssignCulture : Task
18
{
19
private const string CultureAttributeName = "Culture";
20
+ private const string OutputSuffixMetadataName = "OutputSuffix";
21
private const string OutputFolderMetadataName = "OutputFolder";
22
private const string InvariantCultureIdentifier = "neutral";
23
private const string NullCultureIdentifier = "null";
@@ -35,21 +36,13 @@ namespace WixToolset.BuildTasks
36
/// The list of files to apply culture information to.
37
/// </summary>
38
[Required]
38
- public ITaskItem[] Files
39
- {
40
- get;
41
- set;
42
- }
39
+ public ITaskItem[] Files { get; set; }
40
41
/// <summary>
42
/// The files that had culture information applied
43
/// </summary>
44
[Output]
48
- public ITaskItem[] CultureGroups
49
- {
50
- get;
51
- private set;
52
- }
45
+ public ITaskItem[] CultureGroups { get; private set; }
46
47
/// <summary>
48
/// Applies culture information to the files specified by the Files property.
@@ -60,70 +53,66 @@ namespace WixToolset.BuildTasks
53
public override bool Execute()
54
{
55
// First, process the culture group list the user specified in the cultures property
63
- List<CultureGroup> cultureGroups = new List<CultureGroup>();
56
+ var cultureGroups = new List<CultureGroup>();
57
58
if (!String.IsNullOrEmpty(this.Cultures))
59
{
60
// Get rid of extra quotes
61
this.Cultures = this.Cultures.Trim('\"');
62
70
- foreach (string cultureGroupString in this.Cultures.Split(';'))
63
+ // MSBuild cannnot handle "" items for the invariant culture we require the neutral keyword
64
+ foreach (var cultureGroupString in this.Cultures.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
65
{
72
- if (0 == cultureGroupString.Length)
73
- {
74
- // MSBuild v2.0.50727 cannnot handle "" items
75
- // for the invariant culture we require the neutral keyword
76
- continue;
77
- }
78
- CultureGroup cultureGroup = new CultureGroup(cultureGroupString);
66
+ var cultureGroup = new CultureGroup(cultureGroupString);
67
cultureGroups.Add(cultureGroup);
68
}
69
}
70
else
71
{
72
// Only process the EmbeddedResource items if cultures was unspecified
85
- foreach (ITaskItem file in this.Files)
73
+ foreach (var file in this.Files)
74
{
75
// Ignore non-wxls
76
if (!String.Equals(file.GetMetadata("Extension"), ".wxl", StringComparison.OrdinalIgnoreCase))
77
{
90
- Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file type is not supported.", file.ItemSpec);
78
+ this.Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file type is not supported.", file.ItemSpec);
79
return false;
80
}
93
- XmlDocument wxlFile = new XmlDocument();
81
82
+ var wxlFile = new XmlDocument();
83
try
84
{
85
wxlFile.Load(file.ItemSpec);
86
}
87
catch (FileNotFoundException)
88
{
101
- Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file was not found.", file.ItemSpec);
89
+ this.Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}. The file was not found.", file.ItemSpec);
90
return false;
91
}
92
catch (Exception e)
93
{
106
- Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}: {1}", file.ItemSpec, e.Message);
94
+ this.Log.LogError("Unable to retrieve the culture for EmbeddedResource {0}: {1}", file.ItemSpec, e.Message);
95
return false;
96
}
97
98
// Take the culture value and try using it to create a culture.
111
- XmlAttribute cultureAttr = wxlFile.DocumentElement.Attributes[WixAssignCulture.CultureAttributeName];
112
- string wxlCulture = null == cultureAttr ? String.Empty : cultureAttr.Value;
99
+ var cultureAttr = wxlFile.DocumentElement.Attributes[WixAssignCulture.CultureAttributeName];
100
+ var wxlCulture = cultureAttr?.Value ?? String.Empty;
101
+
102
if (0 == wxlCulture.Length)
103
{
115
- // We use a keyword for the invariant culture because MSBuild v2.0.50727 cannnot handle "" items
104
+ // We use a keyword for the invariant culture because MSBuild cannnot handle "" items.
105
wxlCulture = InvariantCultureIdentifier;
106
}
107
108
// We found the culture for the WXL, we now need to determine if it maps to a culture group specified
109
// in the Cultures property or if we need to create a new one.
121
- Log.LogMessage(MessageImportance.Low, "Culture \"{0}\" from EmbeddedResource {1}.", wxlCulture, file.ItemSpec);
110
+ this.Log.LogMessage(MessageImportance.Low, "Culture \"{0}\" from EmbeddedResource {1}.", wxlCulture, file.ItemSpec);
111
123
- bool cultureGroupExists = false;
124
- foreach (CultureGroup cultureGroup in cultureGroups)
112
+ var cultureGroupExists = false;
113
+ foreach (var cultureGroup in cultureGroups)
114
{
126
- foreach (string culture in cultureGroup.Cultures)
115
+ foreach (var culture in cultureGroup.Cultures)
116
{
117
if (String.Equals(wxlCulture, culture, StringComparison.OrdinalIgnoreCase))
118
{
@@ -142,29 +131,32 @@ namespace WixToolset.BuildTasks
131
}
132
133
// If we didn't create any culture groups the culture was unspecificed and no WXLs were included
145
- // Build an unlocalized target in the output folder
134
+ // then build an unlocalized target in the output folder
135
if (cultureGroups.Count == 0)
136
{
137
cultureGroups.Add(new CultureGroup());
138
}
139
151
- List<TaskItem> cultureGroupItems = new List<TaskItem>();
140
+ var cultureGroupItems = new List<TaskItem>();
141
142
if (1 == cultureGroups.Count && 0 == this.Files.Length)
143
{
144
// Maintain old behavior, if only one culturegroup is specified and no WXL, output to the default folder
156
- TaskItem cultureGroupItem = new TaskItem(cultureGroups[0].ToString());
145
+ var cultureGroupItem = new TaskItem(cultureGroups[0].ToString());
146
+ cultureGroupItem.SetMetadata(OutputSuffixMetadataName, cultureGroups[0].OutputSuffix);
147
cultureGroupItem.SetMetadata(OutputFolderMetadataName, CultureGroup.DefaultFolder);
148
cultureGroupItems.Add(cultureGroupItem);
149
}
150
else
151
{
162
- foreach (CultureGroup cultureGroup in cultureGroups)
152
+ foreach (var cultureGroup in cultureGroups)
153
{
164
- TaskItem cultureGroupItem = new TaskItem(cultureGroup.ToString());
154
+ var cultureGroupItem = new TaskItem(cultureGroup.ToString());
155
+ cultureGroupItem.SetMetadata(OutputSuffixMetadataName, cultureGroup.OutputSuffix);
156
cultureGroupItem.SetMetadata(OutputFolderMetadataName, cultureGroup.OutputFolder);
157
cultureGroupItems.Add(cultureGroupItem);
167
- Log.LogMessage("Culture: {0}", cultureGroup.ToString());
158
+
159
+ this.Log.LogMessage("Culture: {0}", cultureGroup.ToString());
160
}
161
}
162
@@ -179,6 +171,11 @@ namespace WixToolset.BuildTasks
171
/// </summary>
172
public const string DefaultFolder = "";
173
174
+ /// <summary>
175
+ /// Language neutral.
176
+ /// </summary>
177
+ public const string DefaultSuffix = InvariantCultureIdentifier;
178
+
179
/// <summary>
180
/// Initialize a null culture group
181
/// </summary>
@@ -189,7 +186,7 @@ namespace WixToolset.BuildTasks
186
public CultureGroup(string cultureGroupString)
187
{
188
Debug.Assert(!String.IsNullOrEmpty(cultureGroupString));
192
- foreach (string cultureString in cultureGroupString.Split(','))
189
+ foreach (var cultureString in cultureGroupString.Split(','))
190
{
191
this.Cultures.Add(cultureString);
192
}
@@ -201,17 +198,21 @@ namespace WixToolset.BuildTasks
198
{
199
get
200
{
204
- string result = DefaultFolder;
201
if (this.Cultures.Count > 0 &&
202
!this.Cultures[0].Equals(InvariantCultureIdentifier, StringComparison.OrdinalIgnoreCase))
203
{
208
- result = this.Cultures[0] + "\\";
204
+ return this.Cultures[0] + "\\";
205
}
206
211
- return result;
207
+ return DefaultFolder;
208
}
209
}
210
211
+ public string OutputSuffix
212
+ {
213
+ get => (this.Cultures.Count > 0) ? this.Cultures[0] : InvariantCultureIdentifier;
214
+ }
215
+
216
public override string ToString()
217
{
218
if (this.Cultures.Count > 0)
src/wix/WixToolset.Sdk/tools/wix.targets
+7
-7
@@ -566,7 +566,7 @@
566
@(_ResolvedWixLibraryPaths);
567
@(_ResolvedWixExtensionPaths);
568
@(_BindInputs)"
569
- Outputs="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension);@(_BindBuiltOutputs)"
569
+ Outputs="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension);@(_BindBuiltOutputs)"
570
DependsOnTargets="$(CoreCompileDependsOn)"
571
Condition=" '@(Compile)' != '' ">
572
@@ -604,7 +604,7 @@
604
BindPaths="@(BindPath)"
605
BindVariables="@(BindVariable)"
606
BindFiles="$(BindFiles)"
607
- BindTrackingFile="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)"
607
+ BindTrackingFile="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)"
608
609
CabinetCachePath="$(_WixBuildCabinetCachePath)"
610
CabinetCreationThreadCount="$(CabinetCreationThreadCount)"
@@ -719,7 +719,7 @@
719
<Target
720
Name="ReadPreviousBindInputsAndBuiltOutputs">
721
722
- <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
722
+ <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
723
<Output TaskParameter="Inputs" ItemName="_BindInputs" />
724
<Output TaskParameter="BuiltOutputs" ItemName="_BindBuiltOutputs" />
725
</ReadTracking>
@@ -748,12 +748,12 @@
748
Name="UpdateFileWritesWithBindInformation"
749
AfterTargets="CoreCompile">
750
751
- <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
751
+ <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
752
<Output TaskParameter="Outputs" ItemName="FileWrites" />
753
</ReadTracking>
754
755
<ItemGroup>
756
- <FileWrites Include="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)" Condition=" Exists('$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)') " />
756
+ <FileWrites Include="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)" Condition=" Exists('$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)') " />
757
</ItemGroup>
758
</Target>
759
@@ -818,7 +818,7 @@
818
<!-- Don't add BuiltProjectOutputGroupKeyOutput - to avoid duplicates, we only want to get the updated list of TargetPaths from the TargetPath property below -->
819
820
<!-- Try to read the outputs from the bind tracking text file since that's the output list straight from compiler. -->
821
- <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
821
+ <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
822
<Output TaskParameter="Outputs" ItemName="_BuiltProjectOutputGroupOutputIntermediate" />
823
</ReadTracking>
824
@@ -894,7 +894,7 @@
894
</ItemGroup>
895
896
<!-- Add the bound content output files to the list to be copied. -->
897
- <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.Identity)$(BindTrackingFileExtension)">
897
+ <ReadTracking File="$(IntermediateOutputPath)$(BindTrackingFilePrefix)%(CultureGroup.OutputSuffix)$(BindTrackingFileExtension)">
898
<Output TaskParameter="BuiltContentOutputs" ItemName="_FullPathToCopy" />
899
<Output TaskParameter="CopiedOutputs" ItemName="_FullPathToCopy" />
900
</ReadTracking>
src/wix/test/WixToolsetTest.Sdk/MsbuildFixture.cs
+93
-3
@@ -252,15 +252,26 @@ namespace WixToolsetTest.Sdk
252
});
253
result.AssertSuccess();
254
255
+ var trackingContents = File.ReadAllLines(Path.Combine(baseFolder, "obj", "Release", "MsiPackageWithBindVariables.wixproj.BindTracking-neutral.txt"));
256
+ var lines = trackingContents.Select(l => l.Replace(baseFolder, "<basefolder>")).ToArray();
257
+ WixAssert.CompareLineByLine(new[]
258
+ {
259
+ "BuiltContentOutput\t<basefolder>\\obj\\Release\\cab1.cab",
260
+ "BuiltPdbOutput\t<basefolder>\\obj\\Release\\MsiPackageWithBindVariables.wixpdb",
261
+ "BuiltTargetOutput\t<basefolder>\\obj\\Release\\MsiPackageWithBindVariables.msi",
262
+ "Input\tdata\\test.txt",
263
+ "Intermediate\t<basefolder>\\obj\\Release\\cab1.cab"
264
+ }, lines);
265
+
266
var paths = Directory.EnumerateFiles(binFolder, @"*.*", SearchOption.AllDirectories)
267
.Select(s => s.Substring(baseFolder.Length + 1))
268
.OrderBy(s => s)
269
.ToArray();
270
WixAssert.CompareLineByLine(new[]
271
{
261
- @"bin\Release\en-US\cab1.cab",
262
- @"bin\Release\en-US\MsiPackageWithBindVariables.msi",
263
- @"bin\Release\en-US\MsiPackageWithBindVariables.wixpdb",
272
+ @"bin\Release\cab1.cab",
273
+ @"bin\Release\MsiPackageWithBindVariables.msi",
274
+ @"bin\Release\MsiPackageWithBindVariables.wixpdb",
275
}, paths);
276
}
277
}
@@ -424,6 +435,85 @@ namespace WixToolsetTest.Sdk
435
}
436
}
437
438
+ [Theory]
439
+ [InlineData(BuildSystem.DotNetCoreSdk)]
440
+ [InlineData(BuildSystem.MSBuild)]
441
+ [InlineData(BuildSystem.MSBuild64)]
442
+ public void CanBuildSingleCultureWithFallbackMsiPackage(BuildSystem buildSystem)
443
+ {
444
+ var sourceFolder = TestData.Get(@"TestData", "SingleCultureWithFallbackMsiPackage");
445
+
446
+ using (var fs = new TestDataFolderFileSystem())
447
+ {
448
+ fs.Initialize(sourceFolder);
449
+ var baseFolder = fs.BaseFolder;
450
+ var binFolder = Path.Combine(baseFolder, @"bin\");
451
+ var projectPath = Path.Combine(baseFolder, "SingleCultureWithFallbackMsiPackage.wixproj");
452
+
453
+ var result = MsbuildUtilities.BuildProject(buildSystem, projectPath, new[]
454
+ {
455
+ MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "WixMSBuildProps", MsbuildFixture.WixPropsPath)
456
+ });
457
+ result.AssertSuccess();
458
+
459
+ var trackingContents = File.ReadAllLines(Path.Combine(baseFolder, "obj", "Release", "SingleCultureWithFallbackMsiPackage.wixproj.BindTracking-de-DE.txt"));
460
+ var lines = trackingContents.Select(l => l.Replace(baseFolder, "<basefolder>")).ToArray();
461
+ WixAssert.CompareLineByLine(new[]
462
+ {
463
+ "BuiltContentOutput\t<basefolder>\\obj\\Release\\de-DE\\cab1.cab",
464
+ "BuiltPdbOutput\t<basefolder>\\obj\\Release\\de-DE\\SingleCultureWithFallbackMsiPackage.wixpdb",
465
+ "BuiltTargetOutput\t<basefolder>\\obj\\Release\\de-DE\\SingleCultureWithFallbackMsiPackage.msi",
466
+ "Input\t<basefolder>\\data\\test.txt",
467
+ "Intermediate\t<basefolder>\\obj\\Release\\de-DE\\cab1.cab"
468
+ }, lines);
469
+ }
470
+ }
471
+
472
+ [Theory]
473
+ [InlineData(BuildSystem.DotNetCoreSdk)]
474
+ [InlineData(BuildSystem.MSBuild)]
475
+ [InlineData(BuildSystem.MSBuild64)]
476
+ public void CanBuildMultiCulturalMsiPackage(BuildSystem buildSystem)
477
+ {
478
+ var sourceFolder = TestData.Get(@"TestData", "MultiCulturalMsiPackage");
479
+
480
+ using (var fs = new TestDataFolderFileSystem())
481
+ {
482
+ fs.Initialize(sourceFolder);
483
+ var baseFolder = fs.BaseFolder;
484
+ var slnPath = Path.Combine(baseFolder, "MultiCulturalMsiPackage.sln");
485
+ var projectFolder = Path.Combine(baseFolder, "MsiPackage");
486
+
487
+ var result = MsbuildUtilities.BuildProject(buildSystem, slnPath, new[]
488
+ {
489
+ MsbuildUtilities.GetQuotedPropertySwitch(buildSystem, "WixMSBuildProps", MsbuildFixture.WixPropsPath)
490
+ });
491
+ result.AssertSuccess();
492
+
493
+ var trackingEnuContents = File.ReadAllLines(Path.Combine(projectFolder, "obj", "x64", "Release", "MsiPackage.wixproj.BindTracking-en-US.txt"));
494
+ var enuLines = trackingEnuContents.Select(l => l.Replace(projectFolder, "<basefolder>")).ToArray();
495
+ WixAssert.CompareLineByLine(new[]
496
+ {
497
+ "BuiltContentOutput\t<basefolder>\\obj\\x64\\Release\\en-US\\cab1.cab",
498
+ "BuiltPdbOutput\t<basefolder>\\obj\\x64\\Release\\en-US\\MsiPackage.wixpdb",
499
+ "BuiltTargetOutput\t<basefolder>\\obj\\x64\\Release\\en-US\\MsiPackage.msi",
500
+ "Input\t<basefolder>\\data\\test.txt",
501
+ "Intermediate\t<basefolder>\\obj\\x64\\Release\\en-US\\cab1.cab"
502
+ }, enuLines);
503
+
504
+ var trackingDeuContents = File.ReadAllLines(Path.Combine(projectFolder, "obj", "x64", "Release", "MsiPackage.wixproj.BindTracking-de-DE.txt"));
505
+ var deuLines = trackingDeuContents.Select(l => l.Replace(projectFolder, "<basefolder>")).ToArray();
506
+ WixAssert.CompareLineByLine(new[]
507
+ {
508
+ "BuiltContentOutput\t<basefolder>\\obj\\x64\\Release\\de-DE\\cab1.cab",
509
+ "BuiltPdbOutput\t<basefolder>\\obj\\x64\\Release\\de-DE\\MsiPackage.wixpdb",
510
+ "BuiltTargetOutput\t<basefolder>\\obj\\x64\\Release\\de-DE\\MsiPackage.msi",
511
+ "Input\t<basefolder>\\data\\test.txt",
512
+ "Intermediate\t<basefolder>\\obj\\x64\\Release\\de-DE\\cab1.cab"
513
+ }, deuLines);
514
+ }
515
+ }
516
+
517
[Theory]
518
[InlineData(BuildSystem.DotNetCoreSdk)]
519
[InlineData(BuildSystem.MSBuild)]
src/wix/test/WixToolsetTest.Sdk/TestData/MsiPackageWithBindVariables/MsiPackageWithBindVariables.wixproj
-2
@@ -7,8 +7,6 @@
7
<ItemGroup>
8
<Compile Include="Package.wxs" />
9
10
- <EmbeddedResource Include="Package.en-us.wxl" />
11
-
10
<BindVariable Include="VersionVar=1.2.3" />
11
</ItemGroup>
12
src/wix/test/WixToolsetTest.Sdk/TestData/MsiPackageWithBindVariables/Package.wxs
+2
-2
@@ -1,8 +1,8 @@
1
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2
<Package Name="MsiPackage" Language="1033" Version="!(wix.VersionVar)" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3
- <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
3
+ <MajorUpgrade DowngradeErrorMessage="Downgrade disabled" />
4
5
- <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
5
+ <Feature Id="ProductFeature">
6
<Component Directory="INSTALLFOLDER">
7
<File Source="!(wix.DataFolderVar)\test.txt" />
8
</Component>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/MsiPackage.wixproj
+3
-29
@@ -1,37 +1,10 @@
1
-<?xml version="1.0" encoding="utf-8"?>
2
-<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
1
+<Project ToolsVersion="15.0" DefaultTargets="Build">
2
<Import Project="$(WixMSBuildProps)" />
3
+
4
<PropertyGroup>
5
- <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6
- <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
7
- <ProductVersion>0.9</ProductVersion>
8
- <ProjectGuid>7fb77005-c6e0-454f-8c2d-0a4a79c918ba</ProjectGuid>
9
- <OutputName>MsiPackage</OutputName>
10
- <OutputType>Package</OutputType>
11
- <Name>MsiPackage</Name>
12
- <RootNamespace>MsiPackage</RootNamespace>
5
<Cultures>en-US,en;de-DE</Cultures>
6
</PropertyGroup>
7
16
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
17
- <PlatformName>$(Platform)</PlatformName>
18
- <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
19
- <DefineConstants>Debug</DefineConstants>
20
- </PropertyGroup>
21
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
22
- <PlatformName>$(Platform)</PlatformName>
23
- <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
24
- </PropertyGroup>
25
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
26
- <PlatformName>$(Platform)</PlatformName>
27
- <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
28
- <DefineConstants>Debug</DefineConstants>
29
- </PropertyGroup>
30
- <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
31
- <PlatformName>$(Platform)</PlatformName>
32
- <OutputPath>bin\$(Platform)\$(Configuration)\</OutputPath>
33
- </PropertyGroup>
34
-
8
<ItemGroup>
9
<Compile Include="Package.wxs" />
10
<Compile Include="PackageComponents.wxs" />
@@ -39,6 +12,7 @@
12
13
<ItemGroup>
14
<EmbeddedResource Include="Package.en-us.wxl" />
15
+ <EmbeddedResource Include="Package.en.wxl" />
16
<EmbeddedResource Include="Package.de-de.wxl" />
17
</ItemGroup>
18
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.de-de.wxl
-7
@@ -1,11 +1,4 @@
1
-<?xml version="1.0" encoding="utf-8"?>
2
-
3
-<!--
4
-This file contains the declaration of all the localizable strings.
5
--->
1
<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="de-DE">
7
-
2
<String Id="DowngradeError" Value="German DowngradeError" />
3
<String Id="FeatureTitle" Value="German FeatureTitle" />
10
-
4
</WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.en-us.wxl
+1
-9
@@ -1,11 +1,3 @@
1
-<?xml version="1.0" encoding="utf-8"?>
2
-
3
-<!--
4
-This file contains the declaration of all the localizable strings.
5
--->
1
<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
-
8
- <String Id="DowngradeError" Value="A newer version of [ProductName] is already installed." />
9
- <String Id="FeatureTitle" Value="MsiPackage" />
10
-
2
+ <String Id="DowngradeError" Value="EN-US Downgrade Error" />
3
</WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.en.wxl
new
+4
@@ -0,0 +1,4 @@
1
+<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en">
2
+ <String Id="DowngradeError" Value="EN Downgrade Error" Overridable="true" />
3
+ <String Id="FeatureTitle" Value="EN Feature Title" Overridable="true" />
4
+</WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/MultiCulturalMsiPackage/MsiPackage/Package.wxs
+1
-2
@@ -1,7 +1,6 @@
1
<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2
- <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="yes" InstallerVersion="200">
2
+ <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a">
3
<MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
- <MediaTemplate />
4
5
<Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
6
<ComponentGroupRef Id="ProductComponents" />
src/wix/test/WixToolsetTest.Sdk/TestData/SimpleMsiPackage/MsiPackage/MsiPackage.wixproj
+1
-1
@@ -1,5 +1,5 @@
1
<?xml version="1.0" encoding="utf-8"?>
2
-<Project ToolsVersion="15.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2
+<Project ToolsVersion="15.0" DefaultTargets="Build">
3
<Import Project="$(WixMSBuildProps)" />
4
<PropertyGroup>
5
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/Package.de-de.wxl
new
+10
@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+
3
+<!--
4
+This file contains the declaration of all the localizable strings.
5
+-->
6
+<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="de-DE">
7
+
8
+ <String Id="DowngradeError" Value="German DowngradeError" />
9
+
10
+</WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/Package.en-us.wxl
renamed
+2
-2
@@ -5,7 +5,7 @@ This file contains the declaration of all the localizable strings.
5
-->
6
<WixLocalization xmlns="http://wixtoolset.org/schemas/v4/wxl" Culture="en-US">
7
8
- <String Id="DowngradeError" Value="A newer version of [ProductName] is already installed." />
9
- <String Id="FeatureTitle" Value="MsiPackage" />
8
+ <String Id="DowngradeError" Value="English Downgrade Error" Overridable="true" />
9
+ <String Id="FeatureTitle" Value="English Feature Title" Overridable="true" />
10
11
</WixLocalization>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/Package.wxs
new
+16
@@ -0,0 +1,16 @@
1
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
2
+ <Package Name="MsiPackage" Language="1033" Version="1.0.0.0" Manufacturer="Example Corporation" UpgradeCode="047730a5-30fe-4a62-a520-da9381b8226a" Compressed="yes" InstallerVersion="200">
3
+ <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" />
4
+ <MediaTemplate />
5
+
6
+ <Feature Id="ProductFeature" Title="!(loc.FeatureTitle)">
7
+ <ComponentGroupRef Id="ProductComponents" />
8
+ </Feature>
9
+ </Package>
10
+
11
+ <Fragment>
12
+ <StandardDirectory Id="ProgramFilesFolder">
13
+ <Directory Id="INSTALLFOLDER" Name="MsiPackage" />
14
+ </StandardDirectory>
15
+ </Fragment>
16
+</Wix>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/PackageComponents.wxs
new
+10
@@ -0,0 +1,10 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Wix xmlns="http://wixtoolset.org/schemas/v4/wxs">
3
+ <Fragment>
4
+ <ComponentGroup Id="ProductComponents" Directory="INSTALLFOLDER">
5
+ <Component>
6
+ <File Source="test.txt" />
7
+ </Component>
8
+ </ComponentGroup>
9
+ </Fragment>
10
+</Wix>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/SingleCultureWithFallbackMsiPackage.wixproj
new
+23
@@ -0,0 +1,23 @@
1
+<?xml version="1.0" encoding="utf-8"?>
2
+<Project ToolsVersion="15.0" DefaultTargets="Build">
3
+ <Import Project="$(WixMSBuildProps)" />
4
+ <PropertyGroup>
5
+ <Cultures>de-DE,en-us</Cultures>
6
+ </PropertyGroup>
7
+
8
+ <ItemGroup>
9
+ <Compile Include="Package.wxs" />
10
+ <Compile Include="PackageComponents.wxs" />
11
+ </ItemGroup>
12
+
13
+ <ItemGroup>
14
+ <EmbeddedResource Include="Package.en-us.wxl" />
15
+ <EmbeddedResource Include="Package.de-de.wxl" />
16
+ </ItemGroup>
17
+
18
+ <ItemGroup>
19
+ <BindPath Include="data" />
20
+ </ItemGroup>
21
+
22
+ <Import Project="$(WixTargetsPath)" />
23
+</Project>
src/wix/test/WixToolsetTest.Sdk/TestData/SingleCultureWithFallbackMsiPackage/data/test.txt
new
+1
@@ -0,0 +1 @@
1
+This is test.txt.
\ No newline at end of file