Blank Dialogs for .NET Framework 2.0 Patches

When you download a patch for .NET Framework 2.0 and double-click to install
it, you'll find that the dialog is missing some text as in the example below.

.NET Framework 2.0 Patch UI

This is due, in part, to a bug in Windows Installer when the

ProductLanguage property
is 0 in the

Property table

Windows Installer contains localized string tables for some basic text like
for the Cancel button, and some errors that may be returned if the package can't
be opened, a patch cannot be uninstalled, and other issues mainly before a
package can even be loaded. Until the package is loaded and the ProductLanguage
property is read, Windows Installer uses the user's default user interface
language; after that, language resources are used according to the
ProductLanguage property value. Localized strings are expected to be found in

ActionText table
and the

Error table
, which includes strings such as Error 20, typically read in
English as "Please wait while Windows configures [ProductName]", which should be
displayed in the dialog above.

In Windows Installer 3.1 and prior, when ProductLanguage is 0 Windows
Installer does not pick the right strings in another resource – a binary
resource – nor does it even contain a lot of strings commonly found in the Error
table. This is now fixed in Windows Installer 4.0 for Windows Vista.

Since the right common Error strings were not properly selected, the setup
build team did not merge resources into the ActionText and Error tables. It was
decided that displaying no text is better than displaying only English text.
Before being released, this was also the case for Visual Studio 2005 but since
VS was language-specific we made sure they merged the correct ActionText and
Error table strings into the .msi file. To display localized strings in
popup dialogs for language-neutral products where ProductLanguage = 0, we do
embed "resource merge modules". These are .msm files that contain
localized resources such as error strings and dialogs. When necessary, we
extract a .msm file according to the user's default user interface
language and extract what strings or dialogs we need. We cannot, unfortunately,
use that approach to provide strings used in the

basic UI
you see above.

The wrapper that ships with the .NET Framework 2.0 redistributable is an
external UI handler that does not, unfortunately, use localized transforms but
instead processes messages from Windows Installer and displays localized text
based on those messages. Since transforms are not used, no transforms are cached
along with the product package so the patch UI will not contain text for some

To fix this you can create a transform that will add localized strings to the
ActionText and Error tables. You can do this in Orca, for example, following the
instructions below.

  1. Extract the .NET Framework 2.0 .msi file from the redistributable

    dotnetfx.exe /c /t:"%CD%\dotnetfx"

  2. Open netfx.msi in Orca
  3. Select the Error table
  4. Shift + Click to select errors 0 through 1903, and press Delete,
    confirming deletion
  5. Click the Transform menu and select New Transform
  6. Click the Tables menu and select Import Tables…
  7. Browse to the Samples\SysMgmt\Msi\database\INTL sub-directory of
    the Platform SDK
  8. Change the file filter to "All Files (*.*)"
  9. Ctrl + Click to select ActionTe.ENU and Error.ENU (or any
    supported corresponding files for other languages, using the three-letter
    language abbreviation as the file extension)
  10. Click Open
  11. Click OK
  12. Click the Transform menu and select Transform Properties…
  13. Check Add Existing Row
  14. Click OK
  15. Click the Transform menu and select Generate Transform…
  16. Save the .mst file

I have created
for all languages contained in the Windows Installer SDK, along with
that describes what language – in both native and English names
– each file contains.

When installing the redistributable, your bootstrap application will have to
pick the correct UI transform however is necessary. You can then install the
.NET Framework 2.0 redistributable with the following command.

dotnetfx.exe /c:"msiexec.exe /i netfx.msi /l*v install.log USING_EXUIH=1

Substitute path with the path to the transform you want to use, and of
course substitute "enu" with the three-letter Windows language code you want to
use during translation. Do be aware that this is the language that will be used
when installing future patches since the transform is cached along with the
product package. You cannot, unfortunately, transform a package when installing
a patch; it must be done during the initial installation.

This approach is not officially supported by Microsoft, so please use
caution. Future patches along with newer Windows Installer runtimes may resolve
the localization problems discussed above, and using localized transforms in
this manner may cause any solution to not work correctly based on the user's
default user interface language. If you need to redistribute the .NET Framework
2.0 runtime, you might consider doing so silently with a basic "Please wait"
sort of dialog or simply requiring that users first install the .NET Framework
2.0 from Windows Update, Microsoft Update, or some other distribution media. If
you simply require a patch and the .NET Framework 2.0 is already installed, you
must either install the patch silently or bear the empty dialog as you see