Bug 305039 - (Win32 only) Make Windows installer more 'Unicode-aware'. r=rstrong
authorEhsan Akhgari <ehsan.akhgari@gmail.com>
Mon, 12 Jan 2009 22:22:27 -0800
changeset 23584 efc8e32bfe59015539b551762db6f32a44ae7af2
parent 23583 db430def4ce64c30173d27b77bf1c2cb0621e3b9
child 23585 9dbded90af2ae7e94e3910d4428035003258e36e
push id4622
push userrstrong@mozilla.com
push dateTue, 13 Jan 2009 06:22:54 +0000
treeherdermozilla-central@efc8e32bfe59 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersrstrong
bugs305039
milestone1.9.2a1pre
Bug 305039 - (Win32 only) Make Windows installer more 'Unicode-aware'. r=rstrong
browser/installer/windows/Makefile.in
toolkit/locales/en-US/installer/windows/charset.mk
toolkit/mozapps/installer/windows/nsis/AppAssocReg.dll
toolkit/mozapps/installer/windows/nsis/Processes.dll
toolkit/mozapps/installer/windows/nsis/ShellLink.dll
toolkit/mozapps/installer/windows/nsis/UAC.dll
toolkit/mozapps/installer/windows/nsis/makensis.mk
toolkit/mozapps/installer/windows/nsis/nsProcess.dll
toolkit/mozapps/installer/windows/nsis/preprocess-locale.pl
toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin
--- a/browser/installer/windows/Makefile.in
+++ b/browser/installer/windows/Makefile.in
@@ -16,16 +16,17 @@
 # The Initial Developer of the Original Code is
 # IBM Corporation.
 # Portions created by the Initial Developer are Copyright (C) 2004
 # the Initial Developer. All Rights Reserved.
 #
 # Contributor(s):
 #  Brian Ryner <bryner@brianryner.com>
 #  Chase Phillips <cmp@mozilla.org>
+#  Ehsan Akhgari <ehsan.akhgari@gmail.com>
 #
 # Alternatively, the contents of this file may be used under the terms of
 # either the GNU General Public License Version 2 or later (the "GPL"), or
 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 # in which case the provisions of the GPL or the LGPL are applicable instead
 # of those above. If you wish to allow use of your version of this file only
 # under the terms of either the GPL or the LGPL, and not to allow others to
 # use your version of this file under the terms of the MPL, indicate your
@@ -47,78 +48,111 @@ include $(topsrcdir)/toolkit/mozapps/ins
 
 CONFIG_DIR = instgen
 SFX_MODULE = $(topsrcdir)/other-licenses/7zstub/firefox/7zSD.sfx
 
 PP_LOCALIZED_FILES = \
 	packages-static \
 	$(NULL)
 
-INSTALLER_FILES = \
-	app.tag \
+# All script and locale files used by the Unicode version of NSIS need to be
+# converted from UTF-8 to UTF-16LE
+INSTALLER_FILES_CONV = \
 	nsis/installer.nsi \
 	nsis/uninstaller.nsi \
 	nsis/shared.nsh \
 	$(NULL)
 
+INSTALLER_FILES = \
+	app.tag \
+	$(NULL)
+
+# All script and locale files used by the Unicode version of NSIS need to be
+# converted from UTF-8 to UTF-16LE
+BRANDING_FILES_CONV = \
+	branding.nsi \
+	$(NULL)
+
 BRANDING_FILES = \
-	branding.nsi \
 	wizHeader.bmp \
 	wizHeaderRTL.bmp \
 	wizWatermark.bmp \
 	$(NULL)
 
 DEFINES += \
 	-DAB_CD=$(AB_CD) \
 	-DPKG_BASENAME="$(PKG_BASENAME)" \
 	-DPKG_INST_BASENAME="$(PKG_INST_BASENAME)" \
 	-DMOZ_APP_VERSION=$(MOZ_APP_VERSION) \
 	-DMOZ_APP_NAME=$(MOZ_APP_NAME) \
 	-DMOZ_APP_DISPLAYNAME=${MOZ_APP_DISPLAYNAME} \
 	-DMOZILLA_VERSION=${MOZILLA_VERSION} \
 	$(NULL)
 
 include $(topsrcdir)/config/config.mk
-include $(call EXPAND_LOCALE_SRCDIR,toolkit/locales)/installer/windows/charset.mk
 
 installer::
 	$(MAKE) -C .. installer-stage
 	$(MAKE) $(CONFIG_DIR)/setup.exe
 
 # For building the uninstaller during the application build so it can be
 # included for mar file generation.
 uninstaller::
 	$(RM) -rf $(CONFIG_DIR) && mkdir $(CONFIG_DIR)
+	for i in $(INSTALLER_FILES_CONV); do \
+	  iconv -f UTF-8 -t UTF-16LE $(srcdir)/$$i | \
+	    cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > \
+	    $(CONFIG_DIR)/`basename $$i`; \
+	done
 	$(INSTALL) $(addprefix $(srcdir)/,$(INSTALLER_FILES)) $(CONFIG_DIR)
+	for i in $(BRANDING_FILES_CONV); do \
+	  iconv -f UTF-8 -t UTF-16LE $(DIST)/branding/$$i | \
+	    cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > \
+	    $(CONFIG_DIR)/$$i; \
+	done
 	$(INSTALL) $(addprefix $(DIST)/branding/,$(BRANDING_FILES)) $(CONFIG_DIR)
 	$(EXIT_ON_ERROR) \
 	for i in $(PP_LOCALIZED_FILES); do \
 	  $(PERL) $(topsrcdir)/config/preprocessor.pl $(DEFINES) $(ACDEFINES) $(srcdir)/$$i > $(CONFIG_DIR)/$$i; \
 	done
 	$(PERL) $(topsrcdir)/config/preprocessor.pl -Fsubstitution $(DEFINES) $(ACDEFINES) \
-	  $(srcdir)/nsis/defines.nsi.in > $(CONFIG_DIR)/defines.nsi
+	  $(srcdir)/nsis/defines.nsi.in | iconv -f UTF-8 -t UTF-16LE | \
+	  cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > \
+	  $(CONFIG_DIR)/defines.nsi
 	$(PERL) $(topsrcdir)/toolkit/mozapps/installer/windows/nsis/preprocess-locale.pl \
 	  $(topsrcdir) $(call EXPAND_LOCALE_SRCDIR,browser/locales)/installer $(AB_CD) \
-	  $(WIN_INSTALLER_CHARSET) $(CONFIG_DIR)
+	  $(CONFIG_DIR)
 
 $(CONFIG_DIR)/setup.exe::
 	$(RM) -rf $(CONFIG_DIR) && mkdir $(CONFIG_DIR)
+	for i in $(INSTALLER_FILES_CONV); do \
+	  iconv -f UTF-8 -t UTF-16LE $(srcdir)/$$i | \
+	    cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > \
+	    $(CONFIG_DIR)/`basename $$i`; \
+	done
 	$(INSTALL) $(addprefix $(srcdir)/,$(INSTALLER_FILES)) $(CONFIG_DIR)
+	for i in $(BRANDING_FILES_CONV); do \
+	  iconv -f UTF-8 -t UTF-16LE $(DIST)/branding/$$i | \
+	    cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > \
+	    $(CONFIG_DIR)/$$i; \
+	done
 	$(INSTALL) $(addprefix $(DIST)/branding/,$(BRANDING_FILES)) $(CONFIG_DIR)
 	$(EXIT_ON_ERROR) \
 	for i in $(PP_LOCALIZED_FILES); do \
 	  $(PERL) $(topsrcdir)/config/preprocessor.pl $(DEFINES) $(ACDEFINES) $(srcdir)/$$i > $(CONFIG_DIR)/$$i; \
 	done
 	$(PERL) $(topsrcdir)/toolkit/mozapps/installer/windows/nsis/make-installremoves.pl \
 	  ../removed-files > $(CONFIG_DIR)/removed-files.log
 	$(PERL) $(topsrcdir)/config/preprocessor.pl -Fsubstitution $(DEFINES) $(ACDEFINES) \
-	  $(srcdir)/nsis/defines.nsi.in > $(CONFIG_DIR)/defines.nsi
+	  $(srcdir)/nsis/defines.nsi.in | iconv -f UTF-8 -t UTF-16LE | \
+	  cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > \
+	  $(CONFIG_DIR)/defines.nsi
 	$(PERL) $(topsrcdir)/toolkit/mozapps/installer/windows/nsis/preprocess-locale.pl \
 	  $(topsrcdir) $(call EXPAND_LOCALE_SRCDIR,browser/locales)/installer $(AB_CD) \
-	  $(WIN_INSTALLER_CHARSET) $(CONFIG_DIR)
+	  $(CONFIG_DIR)
 
 include $(topsrcdir)/config/rules.mk
 include $(topsrcdir)/toolkit/mozapps/installer/windows/nsis/makensis.mk
 
 export::
 ifndef MOZ_BRANDING_DIRECTORY
 	$(NSINSTALL) -D $(DIST)/branding
 	cp $(srcdir)/nsis/branding.nsi $(DIST)/branding/branding.nsi
deleted file mode 100644
--- a/toolkit/locales/en-US/installer/windows/charset.mk
+++ /dev/null
@@ -1,21 +0,0 @@
-WIN_INSTALLER_CHARSET = CP1252
-
-# possibilities are:
-# ANSI_CHARSET                    CP1252
-# BALTIC_CHARSET                  CP1257
-# CHINESEBIG5_CHARSET             CP950
-# EASTEUROPE_CHARSET              CP1250
-# GB2312_CHARSET                  CP936
-# GREEK_CHARSET                   CP1253
-# HANGUL_CHARSET                  CP949
-# RUSSIAN_CHARSET                 CP1251
-# SHIFTJIS_CHARSET                CP932
-# TURKISH_CHARSET                 CP1254
-# VIETNAMESE_CHARSET              CP1258
-# Korean language edition of Windows:
-# JOHAB_CHARSET                   CP1361
-# Middle East language edition of Windows:
-# ARABIC_CHARSET                  CP1256
-# HEBREW_CHARSET                  CP1255
-# Thai language edition of Windows:
-# THAI_CHARSET                    CP874
index 9d43816c689f3552af900dc074eb354b75b75d52..b0d7f23bc1f1946ee749f3d694f38af5adbd4f76
GIT binary patch
literal 4608
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
deleted file mode 100755
index e532bf8bb55a5b7cadfe6d6e05058ae3f446739a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
index 980949f01dad091cd9151ab1e4fb2a7d7cb0164d..4d5a533903d3e74f78cd945a650646618b6f3f5b
GIT binary patch
literal 4608
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
Qy0*D?yY6<|_e7R|0Lo=CvH$=8
index ff93bfb0d75a346e3d77414ffe4e126580791072..88a597e611dc149d3dc3ee660585182afe94cc2a
GIT binary patch
literal 17920
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
Ty6n{Kf5v3Lc)oc4Up@aD#q_}I
--- a/toolkit/mozapps/installer/windows/nsis/makensis.mk
+++ b/toolkit/mozapps/installer/windows/nsis/makensis.mk
@@ -16,16 +16,17 @@
 # The Initial Developer of the Original Code is
 # the Mozilla Foundation <http://www.mozilla.org>.
 # Portions created by the Initial Developer are Copyright (C) 2006
 # the Initial Developer. All Rights Reserved.
 #
 # Contributor(s):
 #   Robert Strong <rstrong@mozilla.com> - Initial perl scripts (install_sub.pl)
 #   Benjamin Smedberg <benjamin@smedbergs.us> - Makefile-izing
+#   Ehsan Akhgari <ehsan.akhgari@gmail.com> - Unicode installer support
 #
 # Alternatively, the contents of this file may be used under the terms of
 # either the GNU General Public License Version 2 or later (the "GPL"), or
 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 # in which case the provisions of the GPL or the LGPL are applicable instead
 # of those above. If you wish to allow use of your version of this file only
 # under the terms of either the GPL or the LGPL, and not to allow others to
 # use your version of this file under the terms of the MPL, indicate your
@@ -39,47 +40,59 @@
 ifndef CONFIG_DIR
 $(error CONFIG_DIR must be set before including makensis.mk)
 endif
 
 ABS_CONFIG_DIR := $(shell pwd)/$(CONFIG_DIR)
 
 SFX_MODULE ?= $(error SFX_MODULE is not defined)
 
-TOOLKIT_NSIS_FILES = \
-	AppAssocReg.dll \
+# UTF-8 encoded files that need to be converted to UTF-16LE for NSIS
+TOOLKIT_NSIS_FILES_CONV = \
 	common.nsh \
 	locales.nsi \
-	nsProcess.dll \
 	overrides.nsh \
-	ShellLink.dll \
-	UAC.dll \
 	version.nsh \
 	$(NULL)
 
+TOOLKIT_NSIS_FILES = \
+	AppAssocReg.dll \
+	nsProcess.dll \
+	ShellLink.dll \
+	UAC.dll \
+	$(NULL)
+
 $(CONFIG_DIR)/setup.exe::
+	for i in $(TOOLKIT_NSIS_FILES_CONV); do \
+	  iconv -f UTF-8 -t UTF-16LE $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/$$i | \
+	    cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > $(CONFIG_DIR)/$$i; \
+	done
 	$(INSTALL) $(addprefix $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/,$(TOOLKIT_NSIS_FILES)) $(CONFIG_DIR)
 	$(INSTALL) $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/setup.ico $(CONFIG_DIR)
-	cd $(CONFIG_DIR) && makensis.exe installer.nsi
+	cd $(CONFIG_DIR) && makensisu.exe installer.nsi
 # Support for building the uninstaller when repackaging locales
 ifeq ($(CONFIG_DIR),l10ngen)
-	cd $(CONFIG_DIR) && makensis.exe uninstaller.nsi
+	cd $(CONFIG_DIR) && makensisu.exe uninstaller.nsi
 endif
 
 $(CONFIG_DIR)/7zSD.sfx:
 	$(CYGWIN_WRAPPER) upx --best -o $(CONFIG_DIR)/7zSD.sfx $(SFX_MODULE)
 
 installer::
 	$(INSTALL) $(CONFIG_DIR)/removed-files.log $(CONFIG_DIR)/setup.exe $(DEPTH)/installer-stage
 	cd $(DEPTH)/installer-stage && $(CYGWIN_WRAPPER) 7z a -r -t7z $(ABS_CONFIG_DIR)/app.7z -mx -m0=BCJ2 -m1=LZMA:d24 -m2=LZMA:d19 -m3=LZMA:d19  -mb0:1 -mb0s1:2 -mb0s2:3
 	$(MAKE) $(CONFIG_DIR)/7zSD.sfx
 	$(NSINSTALL) -D $(DIST)/$(PKG_INST_PATH)
 	cat $(CONFIG_DIR)/7zSD.sfx $(CONFIG_DIR)/app.tag $(CONFIG_DIR)/app.7z > "$(DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe"
 	chmod 0755 "$(DIST)/$(PKG_INST_PATH)$(PKG_INST_BASENAME).exe"
 
 # For building the uninstaller during the application build so it can be
 # included for mar file generation.
 uninstaller::
+	for i in $(TOOLKIT_NSIS_FILES_CONV); do \
+	  iconv -f UTF-8 -t UTF-16LE $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/$$i | \
+	    cat $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin - > $(CONFIG_DIR)/$$i; \
+	done
 	$(INSTALL) $(addprefix $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/,$(TOOLKIT_NSIS_FILES)) $(CONFIG_DIR)
 	$(INSTALL) $(MOZILLA_DIR)/toolkit/mozapps/installer/windows/nsis/setup.ico $(CONFIG_DIR)
-	cd $(CONFIG_DIR) && makensis.exe uninstaller.nsi
+	cd $(CONFIG_DIR) && makensisu.exe uninstaller.nsi
 	$(NSINSTALL) -D $(DIST)/bin/uninstall
 	cp $(CONFIG_DIR)/helper.exe $(DIST)/bin/uninstall
index 86138f69ec45caed02d3ca767f313179a3f821e0..8f0384ffad5570ca03e0813b067696706af44285
GIT binary patch
literal 4096
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
--- a/toolkit/mozapps/installer/windows/nsis/preprocess-locale.pl
+++ b/toolkit/mozapps/installer/windows/nsis/preprocess-locale.pl
@@ -14,80 +14,76 @@
 # The Original Code is Mozilla installer build scripts.
 #
 # The Initial Developer of the Original Code is Mozilla Foundation
 # Portions created by the Initial Developer are Copyright (C) 2006
 # the Initial Developer. All Rights Reserved.
 #
 # Contributor(s):
 #  Robert Strong <robert.bugzilla@gmail.com>
+#  Ehsan Akhgari <ehsan.akhgari@gmail.com>
 #
 # Alternatively, the contents of this file may be used under the terms of
 # either the GNU General Public License Version 2 or later (the "GPL"), or
 # the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 # in which case the provisions of the GPL or the LGPL are applicable instead
 # of those above. If you wish to allow use of your version of this file only
 # under the terms of either the GPL or the LGPL, and not to allow others to
 # use your version of this file under the terms of the MPL, indicate your
 # decision by deleting the provisions above and replace them with the notice
 # and other provisions required by the GPL or the LGPL. If you do not delete
 # the provisions above, a recipient may use your version of this file under
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
-my $topsrcdir = "$ARGV[0]";
+my $mozsrcdir = "$ARGV[0]";    # dir that contains the toolkit source
 my $appLocaleDir = "$ARGV[1]";
 my $AB_CD = "$ARGV[2]";
-my $langCP = "$ARGV[3]";
-my $configDir = "$ARGV[4]";
+my $configDir = "$ARGV[3]";
 my $nsisVer = "v6";
 # Set the language ID to 0 to make this locale the default locale. An actual
 # ID will need to be used to create a multi-language installer (e.g. for CD
 # distributions, etc.).
 my $langID = 0;
 my $nsisCP = "-";
 my $fontName = "-";
 my $fontSize = "-";
 my $RTL = "-";
 my $line;
 my $lnum;
 
 # Read the codepage for the locale and the optional font name, font size, and
 # whether the locale is right to left from locales.nsi.
-my $inFile = "$topsrcdir/toolkit/mozapps/installer/windows/nsis/locales.nsi";
+my $inFile = "$mozsrcdir/toolkit/mozapps/installer/windows/nsis/locales.nsi";
 open(locales, "<$inFile");
+if (!-e $inFile) {
+  die "Error $inFile does not exist!";
+}
 
 $lnum = 1;
 while( $line = <locales> ) {
   $line =~ s/[\r\n]*//g;    # remove \r and \n
   if ($line =~ m|^!define $AB_CD\_rtl|) {
     $RTL = "RTL";
   }
   $lnum++;
 }
 close locales;
 
-# In NSIS codepage CP1252 is specified with a '-'. For all other locales
-# specify the number for the locales codepage.
-if ($langCP ne "CP1252") {
-  $nsisCP = $langCP;
-  $nsisCP =~ s/^CP(.*)$/$1/g;
-}
-
 # Create the main NSIS language file with just the codepage, font, and
 # RTL information
 open(outfile, ">$configDir/nlf.in");
 print outfile "# Header, don't edit\r\nNLF $nsisVer\r\n# Start editing here\r\n";
 print outfile "# Language ID\r\n$langID\r\n";
 print outfile "# Font and size - dash (-) means default\r\n$fontName\r\n$fontSize\r\n";
 print outfile "# Codepage - dash (-) means ANSI code page\r\n$nsisCP\r\n";
 print outfile "# RTL - anything else than RTL means LTR\r\n$RTL\r\n";
 close outfile;
-&cpConvert("nlf.in", "baseLocale.nlf", $langCP);
+&cpConvert("nlf.in", "baseLocale.nlf");
 
 
 # Create the main NSIS language file
 $inFile = "$appLocaleDir/override.properties";
 if (!-e $inFile) {
   die "Error $inFile does not exist!";
 }
 open(infile, "<$inFile");
@@ -98,23 +94,23 @@ while( $line = <infile> ) {
   next if ($line =~ m|^#|);
   my @values = split('=', $line, 2);
   next if (@values[0] eq undef) || (@values[1] eq undef);
   my $value = @values[1];
   $value =~ s/^\s+//; # trim whitespace from the beginning of the string
   $value =~ s/\s+$//; # trim whitespace from the end of the string
   $value =~ s/^"(.*)"$/$1/g; # remove " at the beginning and end of the value
   $value =~ s/(")/\$\\$1/g;  # prefix " with $\
-  $value =~ s/…/.../g;     # replace  (unicode ellipsis) with ...
+  $value =~ s/(\\[rnt])/\$$1/g; # prefix all occurences of \r, \n and \t with $
   print outfile "LangString  ^@values[0] $langID \"$value\"\r\n";
   $lnum++;
 }
 close infile;
 close outfile;
-&cpConvert("override.properties", "overrideLocale.nsh", $langCP);
+&cpConvert("override.properties", "overrideLocale.nsh");
 
 
 # Create the main Modern User Interface language file
 $inFile = "$appLocaleDir/mui.properties";
 if (!-e $inFile) {
   die "Error $inFile does not exist!";
 }
 open(infile, "<$inFile");
@@ -128,26 +124,26 @@ print outfile "!define MUI_LANGNAME \"ba
 $lnum = 1;
 while( $line = <infile> ) {
   $line =~ s/[\r\n]*//g;    # remove \r and \n
   next if ($line =~ m|^#|) || ($line eq "");
   my @values = split('=', $line, 2);
   next if (@values[0] eq undef) || (@values[1] eq undef);
   my $value = @values[1];
   $value =~ s/(")/\$\\$1/g;  # prefix " with $\
-  $value =~ s/(\\n)/\\r$1/g; # insert \\r before each occurence of \\n
-  $value =~ s/(\\r)\\r/$1/g; # replace all ocurrences of \\r\\r with \\r
-  $value =~ s/…/.../g;     # replace  (unicode ellipsis) with ...
+  $value =~ s/(\\n)/\\r$1/g; # insert \r before each occurence of \n
+  $value =~ s/(\\r)\\r/$1/g; # replace all ocurrences of \r\r with \r
+  $value =~ s/(\\[rnt])/\$$1/g; # prefix all occurences of \r, \n and \t with $
   print outfile "!define @values[0] \"$value\"\r\n";
   $lnum++;
 }
 print outfile "!insertmacro MOZ_MUI_LANGUAGEFILE_END\r\n";
 close infile;
 close outfile;
-&cpConvert("mui.properties", "baseLocale.nsh", $langCP);
+&cpConvert("mui.properties", "baseLocale.nsh");
 
 
 # Create the custom language file for our custom strings
 $inFile = "$appLocaleDir/custom.properties";
 if (!-e $inFile) {
   die "Error $inFile does not exist!";
 }
 open(infile, "<$inFile");
@@ -156,31 +152,30 @@ open(outfile, ">$configDir/custom.proper
 $lnum = 1;
 while( $line = <infile> ) {
   $line =~ s/[\r\n]*//g;    # remove \r and \n
   next if ($line =~ m|^#|) || ($line eq "");
   my @values = split('=', $line, 2);
   next if (@values[0] eq undef) || (@values[1] eq undef);
   my $string = @values[1];
   $string =~ s/"/\$\\"/g;       # replace " with $\"
-  $string =~ s/(\\n)/\\r$1/g;   # insert \\r before each occurence of \\n
-  $string =~ s/(\\r)\\r/$1/g;   # replace all ocurrences of \\r\\r with \\r
-  $string =~ s/(\\[rn])/\$$1/g; # prefix all occurences of \\r and \\n with $
-  $string =~ s/…/.../g;       # replace  (unicode ellipsis) with ...
+  $string =~ s/(\\n)/\\r$1/g;   # insert \r before each occurence of \n
+  $string =~ s/(\\r)\\r/$1/g;   # replace all ocurrences of \r\r with \r
+  $string =~ s/(\\[rnt])/\$$1/g; # prefix all occurences of \r, \n and \t with $
   print outfile "LangString @values[0] $langID \"$string\"\r\n";
   $lnum++;
 }
 close infile;
 close outfile;
-&cpConvert("custom.properties", "customLocale.nsh", $langCP);
+&cpConvert("custom.properties", "customLocale.nsh");
 
 
 # Converts a file's codepage
 sub cpConvert
 {
   my $srcFile = $_[0];
   my $targetFile = $_[1];
-  my $targetCodepage = $_[2];
-  print "iconv -f UTF-8 -t $targetCodepage $configDir/$srcFile > $configDir/$targetFile\n";
-  system("iconv -f UTF-8 -t $targetCodepage $configDir/$srcFile > $configDir/$targetFile") &&
-    die "Error converting codepage to $targetCodepage for $configDir/$srcFile";
+  my $prependBOM = "cat $mozsrcdir/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin -";
+  print "iconv -f UTF-8 -t UTF-16LE $configDir/$srcFile | $prependBOM > $configDir/$targetFile\n";
+  system("iconv -f UTF-8 -t UTF-16LE $configDir/$srcFile | $prependBOM > $configDir/$targetFile") &&
+    die "Error converting codepage to UTF-16LE for $configDir/$srcFile";
   unlink <$configDir/$srcFile>;
 }
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/installer/windows/nsis/utf16-le-bom.bin
@@ -0,0 +1,1 @@
+
\ No newline at end of file