--- solenv/bin/modules/installer/download.pm
+++ solenv/bin/modules/installer/download.pm 
@@ -422,6 +422,11 @@
 	{
 		$languages = "";
 	}	
+
+	if ( length ($languages) > 50 )
+	{
+		$languages = 'multi';
+	}
 
 	return $languages;
 }
@@ -949,11 +949,17 @@
 	my ($templatefile, $languagesarrayref) = @_;
 
 	my $alllangstring = "";
+	my %nsislangs;
 
+	for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ )
+	{
+		my $onelanguage = ${$languagesarrayref}[$i];
+		my $nsislanguage = nsis_language_converter($onelanguage);
+		$nsislangs{$nsislanguage}++;
+	}
+
-	for ( my $i = 0; $i <= $#{$languagesarrayref}; $i++ )
+	foreach my $nsislanguage ( keys(%nsislangs) )
 	{
-		my $onelanguage = ${$languagesarrayref}[$i];
-		my $nsislanguage = nsis_language_converter($onelanguage);
 		# Syntax: !insertmacro MUI_LANGUAGE "English"
 		my $langstring = "\!insertmacro MUI_LANGUAGE_PACK " . $nsislanguage . "\n";
 		$alllangstring = $alllangstring . $langstring;
--- ../../../2.0.2-pristine/build/OOO_2_0_2/scp2/source/ooo/file_library_ooo.scp	2006-06-02 13:06:38.003914500 +0000
+++ scp2/source/ooo/file_library_ooo.scp	2006-05-31 16:15:01.893875000 +0000
@@ -2687,3 +2687,13 @@
     Name = "onlinecheck.dll";
 End
 #endif
+#ifdef WNT
+
+File gid_File_Lib_sellangmsi
+    TXT_FILE_BODY;
+    Styles = (PACKED, BINARYTABLE, BINARYTABLE_ONLY);
+    Dir = gid_Dir_Program;
+    Name = "sellangmsi.dll";
+End
+
+#endif
dummy line to avoid confusing diff-mode
--- ../../../2.0.2-pristine/build/OOO_2_0_2/scp2/source/ooo/windowscustomaction_ooo.scp	2006-02-16 14:16:57.000000000 +0000
+++ scp2/source/ooo/windowscustomaction_ooo.scp	2006-06-02 08:03:48.643875000 +0000
@@ -382,3 +382,12 @@
 End
 
 
+
+WindowsCustomAction gid_Customaction_SelectLanguage
+	Name = "SelectLanguage";
+	Typ = "321";
+	Source = "sellangmsi.dll";
+	Target = "SelectLanguage";
+	Inbinarytable = 1;
+	Assignment1 = ("ControlEvent", "SetupType", "Next", "DoAction", "SelectLanguage", "1", "1");
+End
--- ../../../2.0.2-pristine/build/OOO_2_0_2/setup_native/prj/build.lst	2006-02-16 14:15:43.000000000 +0000
+++ setup_native/prj/build.lst	2006-05-31 12:16:31.550125000 +0000
@@ -5,6 +5,7 @@
 pk  setup_native\source\win32\customactions\regpatchactivex nmake -  w   sn_regpatchactivex NULL
 pk  setup_native\source\win32\customactions\reg4msdoc     nmake   -  w   sn_reg4msdoc NULL
 pk  setup_native\source\win32\customactions\regpython     nmake   -  w   sn_regpython NULL
+pk  setup_native\source\win32\customactions\sellang       nmake   -  w   sn_sellang NULL
 pk  setup_native\source\win32\customactions\javafilter    nmake   -  w   sn_javafilter NULL
 pk  setup_native\source\win32\customactions\quickstarter  nmake   -  w   sn_quickstarter NULL
 pk  setup_native\source\win32\customactions\shellextensions nmake   -  w   sn_shellextensions NULL
--- /dev/null
+++ setup_native/source/win32/customactions/sellang/exports.dxp	2006-05-31 12:15:54.268875000 +0000
@@ -0,0 +1 @@
+SelectLanguage
--- /dev/null
+++ setup_native/source/win32/customactions/sellang/makefile.mk	2006-05-31 12:13:28.331375000 +0000
@@ -0,0 +1,80 @@
+#*************************************************************************
+#
+#   OpenOffice.org - a multi-platform office productivity suite
+#
+#   The Contents of this file are made available subject to
+#   the terms of GNU Lesser General Public License Version 2.1.
+#
+#
+#     GNU Lesser General Public License Version 2.1
+#     =============================================
+#     Copyright 2005 by Sun Microsystems, Inc.
+#     901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+#     This library is free software; you can redistribute it and/or
+#     modify it under the terms of the GNU Lesser General Public
+#     License version 2.1, as published by the Free Software Foundation.
+#
+#     This library is distributed in the hope that it will be useful,
+#     but WITHOUT ANY WARRANTY; without even the implied warranty of
+#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+#     Lesser General Public License for more details.
+#
+#     You should have received a copy of the GNU Lesser General Public
+#     License along with this library; if not, write to the Free Software
+#     Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+#     MA  02111-1307  USA
+#
+#*************************************************************************
+
+PRJ=..$/..$/..$/..
+PRJNAME=setup_native
+TARGET=sellangmsi
+
+.IF "$(GUI)"=="WNT"
+
+# --- Settings -----------------------------------------------------
+
+ENABLE_EXCEPTIONS=TRUE
+NO_DEFAULT_STL=TRUE
+DYNAMIC_CRT=
+USE_DEFFILE=TRUE
+
+.INCLUDE : settings.mk
+
+CFLAGS+=-D_STLP_USE_STATIC_LIB
+
+# --- Files --------------------------------------------------------
+
+UWINAPILIB=
+
+SLOFILES = \
+	$(SLO)$/sellang.obj
+
+SHL1STDLIBS=	kernel32.lib\
+				user32.lib\
+				advapi32.lib\
+				shell32.lib\
+				msi.lib\
+				$(LIBSTLPORTST)								
+
+SHL1LIBS = $(SLB)$/$(TARGET).lib 
+
+SHL1TARGET = $(TARGET)
+SHL1IMPLIB = i$(TARGET)
+
+SHL1DEF = $(MISC)$/$(SHL1TARGET).def
+SHL1DEPN = $(SLB)$/$(TARGET).lib
+SHL1BASE = 0x1c000000
+DEF1NAME=$(SHL1TARGET)
+DEF1EXPORTFILE=exports.dxp
+
+# --- Targets --------------------------------------------------------------
+
+.INCLUDE : target.mk
+
+# -------------------------------------------------------------------------
+
+
+.ENDIF
+
--- /dev/null
+++ setup_native/source/win32/customactions/sellang/sellang.cxx	2006-06-02 09:13:53.893875000 +0000
@@ -0,0 +1,330 @@
+/*************************************************************************
+ *
+ *  OpenOffice.org - a multi-platform office productivity suite
+ *
+ *  The Contents of this file are made available subject to
+ *  the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ *    GNU Lesser General Public License Version 2.1
+ *    =============================================
+ *    Copyright 2005 by Sun Microsystems, Inc.
+ *    901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ *    This library is free software; you can redistribute it and/or
+ *    modify it under the terms of the GNU Lesser General Public
+ *    License version 2.1, as published by the Free Software Foundation.
+ *
+ *    This library is distributed in the hope that it will be useful,
+ *    but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *    Lesser General Public License for more details.
+ *
+ *    You should have received a copy of the GNU Lesser General Public
+ *    License along with this library; if not, write to the Free Software
+ *    Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ *    MA  02111-1307  USA
+ *
+ ************************************************************************/
+
+#define WIN32_LEAN_AND_MEAN
+#define _WIN32_WINNT 0x0500
+#undef WINVER
+#define WINVER 0x0500
+
+#pragma warning(push, 1) /* disable warnings within system headers as
+                          * warnings are now treated as errors...
+                          */
+#include <windows.h>
+#include <msiquery.h>
+#include <malloc.h>
+
+#ifdef UNICODE
+#define _UNICODE
+#define _tstring	wstring
+#else
+#define _tstring	string
+#endif
+#include <tchar.h>
+#include <string>
+#include <stdio.h>
+#pragma warning(pop)
+
+#include <systools/win32/uwinapi.h>
+
+/* #define VERBOSE_DEBUG_OUTPUT 1 */
+
+static const char *
+langid_to_string( LANGID langid, int *have_default_lang )
+{
+	/* Map from LANGID to string. The languages below are in the same
+	 * seemingly random order as in
+	 * setup_native/source/win32/msi-encodinglist.txt.
+	 * Only the language part is returned in the string.
+	 */
+	switch (PRIMARYLANGID (langid)) {
+	case LANG_ENGLISH:
+		if (have_default_lang != NULL &&
+		    langid == MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT))
+			*have_default_lang = 1;
+		return "en";
+#define CASE(primary, name) \
+		case LANG_##primary: return #name
+	CASE(PORTUGUESE, pt);
+	CASE(RUSSIAN, ru);
+	CASE(GREEK, el);
+	CASE(DUTCH, nl);
+	CASE(FRENCH, fr);
+	CASE(SPANISH, es);
+	CASE(FINNISH, fi);
+	CASE(HUNGARIAN, hu);
+	CASE(CATALAN, ca);
+	CASE(ITALIAN, it);
+	CASE(CZECH, cs);
+	CASE(SLOVAK, sk);
+	CASE(DANISH, da);
+	CASE(SWEDISH, sv);
+	CASE(POLISH, pl);
+	CASE(GERMAN, de);
+	CASE(THAI, th);
+	CASE(ESTONIAN, et);
+	CASE(JAPANESE, ja);
+	CASE(KOREAN, ko);
+	// CASE(KHMER, km);
+	// CASE(WELSH, cy);
+	CASE(CHINESE, zh);
+	CASE(TURKISH, tr);
+	CASE(HINDI, hi);
+	CASE(PUNJABI, pa);
+	CASE(TAMIL, ta);
+	CASE(ARABIC, ar);
+	CASE(HEBREW, he);
+	CASE(AFRIKAANS, af);
+	CASE(ALBANIAN, sq);
+	CASE(ARMENIAN, hy);
+	CASE(BASQUE, eu);
+	CASE(BELARUSIAN, be);
+	CASE(BENGALI, bn);
+	CASE(BULGARIAN, bg);
+	CASE(ICELANDIC, is);
+	CASE(INDONESIAN, id);
+	// CASE(LAO, lo);
+	CASE(LATVIAN, lv);
+	CASE(LITHUANIAN, lt);
+	// CASE(MALTESE, mt);
+	// CASE(ROMANSH, rm);
+	CASE(ROMANIAN, ro);
+	// CASE(KINYARWANDA, rw);
+	CASE(SANSKRIT, sa);
+	// CASE(SETSWANA, tn);
+	CASE(FARSI, fa);
+	CASE(FAEROESE, fo);
+	CASE(SLOVENIAN, sl);
+	// CASE(SORBIAN, sb);
+	// CASE(SUTU, st);
+	CASE(SWAHILI, sw);
+	CASE(TATAR, tt);
+	// CASE(TSONGA, ts);
+	CASE(UKRAINIAN, uk);
+	CASE(URDU, ur);
+	CASE(VIETNAMESE, vi);
+	// CASE(XHOSA, xh);
+	// CASE(YIDDISH, yi);
+	// CASE(ZULU, zu);
+	CASE(GUJARATI, gu);
+	// CASE(BRETON, br);
+	CASE(NEPALI, ne);
+	// CASE(NDEBELE, nr);
+	// CASE(SWAZI, ss);
+	// CASE(VENDA, ve);
+	// CASE(IRISH, ga);
+	CASE(MACEDONIAN, mk);
+	CASE(TELUGU, te);
+	CASE(MALAYALAM, ml);
+	CASE(MARATHI, mr);
+	CASE(ORIYA, or);
+	// CASE(KURDISH, ku);
+	// CASE(TAGALOG, tg);
+	// CASE(TIGRINYA, ti);
+	CASE(GALICIAN, gl);
+	CASE(KANNADA, kn);
+	CASE(MALAY, ms);
+	// CASE(TAJIK, tg);
+	CASE(GEORGIAN, ka);
+	// CASE(ESPERANTO, eo);
+#undef CASE
+	/* Special cases */
+	default:
+		switch (langid) {
+		case MAKELANGID(LANG_SERBIAN, 0x05): return "bs";
+#define CASE(primary, sub, name) \
+		case MAKELANGID(LANG_##primary, SUBLANG_##sub): return #name
+		
+		CASE(NORWEGIAN, NORWEGIAN_BOKMAL, nb);
+		CASE(NORWEGIAN, NORWEGIAN_NYNORSK, nn);
+		CASE(SERBIAN, DEFAULT, hr);
+		CASE(SERBIAN, SERBIAN_LATIN, sh);
+		CASE(SERBIAN, SERBIAN_CYRILLIC, sr);
+		// CASE(SOTHO, DEFAULT, ns);
+		// CASE(SOTHO, SOTHO_SOUTHERN, st);
+#undef CASE
+		default: return "";
+		}
+	}
+}
+
+static const char *ui_langs[100];
+static int num_ui_langs = 0;
+
+BOOL CALLBACK
+enum_ui_lang_proc (LPTSTR language, LONG_PTR /* unused_lParam */)
+{
+	long langid = strtol(language, NULL, 16);
+	if (langid > 0xFFFF)
+		return TRUE;
+	ui_langs[num_ui_langs] = langid_to_string((LANGID) langid, NULL);
+	num_ui_langs++;
+	if (num_ui_langs == sizeof(ui_langs) / sizeof(ui_langs[0]))
+		return FALSE;
+	return TRUE;
+}
+
+static BOOL
+present_in_ui_langs(const char *lang)
+{
+	for (int i = 0; i < num_ui_langs; i++)
+		if (memcmp (ui_langs[i], lang, 2) == 0)
+			return TRUE;
+	return FALSE;
+}
+
+extern "C" UINT __stdcall SelectLanguage( MSIHANDLE handle )
+{
+#ifdef VERBOSE_DEBUG_OUTPUT
+	char tem[2000];
+#endif
+	char feature[100];
+	MSIHANDLE database, view, record;
+	DWORD length;
+	int nlangs = 0;
+	/* Keeping this code simple and stupid... won't bother with any
+	 * dynamic arrays or whatnot. 100 is more than enough for this purpose.
+	 */
+	char langs[100][6];
+
+	database = MsiGetActiveDatabase(handle);
+
+	if (MsiDatabaseOpenViewA(database, "SELECT Feature from Feature WHERE Feature_Parent = 'gm_Langpack_Base'", &view) != ERROR_SUCCESS) {
+		MsiCloseHandle(database);
+		return ERROR_SUCCESS;
+	}
+
+#ifdef VERBOSE_DEBUG_OUTPUT
+	MessageBoxA(NULL, "MsiDatabaseOpenViewA success!", "SelectLanguage", MB_OK);
+#endif
+
+	if (MsiViewExecute(view, NULL) != ERROR_SUCCESS) {
+		MsiCloseHandle(view);
+		MsiCloseHandle(database);
+		return ERROR_SUCCESS;
+	}
+
+#ifdef VERBOSE_DEBUG_OUTPUT
+	MessageBoxA(NULL, "MsiViewExecute success!", "SelectLanguage", MB_OK);
+#endif
+
+	while (MsiViewFetch(view, &record) == ERROR_SUCCESS) {
+		length = sizeof(feature);
+		if (MsiRecordGetStringA(record, 1, feature, &length) != ERROR_SUCCESS) {
+			MsiCloseHandle(record);
+			MsiCloseHandle(view);
+			MsiCloseHandle(database);
+			return ERROR_SUCCESS;
+		}
+
+		/* Keep track of what languages are included in this installer, if
+		 * it is a multilangiage one.
+		 */
+		if (strcmp(feature, "gm_r_en_US") != 0)
+			strcpy(langs[nlangs++], feature + strlen("gm_r_"));
+
+		MsiCloseHandle(record);
+	}
+
+	MsiCloseHandle(view);
+
+	if (nlangs > 0) {
+		/* Deselect those languages that don't match any of the UI languages
+		 * available on the system.
+		 */
+
+		int i;
+		int have_system_default_lang = 0;
+		const char *system_default_lang = langid_to_string(GetSystemDefaultUILanguage(), &have_system_default_lang);
+		const char *user_locale_lang = langid_to_string(LANGIDFROMLCID(GetThreadLocale()), NULL);
+
+#ifdef VERBOSE_DEBUG_OUTPUT
+		sprintf(tem, "GetSystemDefaultUILanguage(): %#x = %s", GetSystemDefaultUILanguage(), system_default_lang);
+		MessageBoxA(NULL, tem, "SelectLanguage", MB_OK);
+#endif
+
+		EnumUILanguagesA(enum_ui_lang_proc, 0, 0);
+
+#ifdef VERBOSE_DEBUG_OUTPUT
+		sprintf(tem, "Have %d UI languages: ", num_ui_langs);
+		for (i = 0; i < num_ui_langs; i++) {
+			char *p = tem + strlen(tem);
+			sprintf(p, "%s%s", 
+			        ui_langs[i],
+			        (i + 1 < num_ui_langs) ? ", " : "");
+		}
+		MessageBoxA(NULL, tem, "SelectLanguage", MB_OK);
+#endif
+
+		/* If one of the alternative languages in a multi-language installer
+		 * is the system default UI language, deselect those languages that
+		 * aren't among the UI languages available on the system.
+		 * (On most Windows installations, just one UI language is present,
+		 * which obviously is the same as the default UI language. But
+		 * we want to be generic.)
+		 */
+		if (system_default_lang[0]) {
+			for (i = 0; i < nlangs; i++) {
+				if (memcmp (system_default_lang, langs[i], 2) == 0) {
+#ifdef VERBOSE_DEBUG_OUTPUT
+					sprintf(tem, "We have the system default language %s in the installer", system_default_lang);
+					MessageBoxA(NULL, tem, "SelectLanguage", MB_OK);
+#endif
+					have_system_default_lang = 1;
+				}
+			}
+		}
+
+		if (have_system_default_lang) {
+			for (i = 0; i < nlangs; i++) {
+				if (memcmp(system_default_lang, langs[i], 2) != 0 &&
+					memcmp(user_locale_lang, langs[i], 2) != 0 &&
+					!present_in_ui_langs(langs[i])) {
+					UINT rc;
+					sprintf(feature, "gm_r_%s", langs[i]);
+					rc = MsiSetFeatureStateA(handle, feature, INSTALLSTATE_ABSENT); 
+					if (rc != ERROR_SUCCESS) {
+#ifdef VERBOSE_DEBUG_OUTPUT
+						sprintf(tem, "MsiSetFeatureStateA %s failed: %d", feature, rc);
+						MessageBoxA(NULL, tem, "SelectLanguage", MB_OK);
+#endif
+					} else {
+#ifdef VERBOSE_DEBUG_OUTPUT
+						sprintf(tem, "MsiSetFeatureStateA %s OK!", feature);
+						MessageBoxA(NULL, tem, "SelectLanguage", MB_OK);
+#endif
+					}
+				}
+			}
+		}
+	}
+
+	MsiCloseHandle(database);
+
+	return ERROR_SUCCESS;
+}
--- instsetoo_native/util/makefile.mk
+++ instsetoo_native/util/makefile.mk
@@ -222,7 +222,7 @@
 .ENDIF			# "$(PKGFORMAT)"!=""
 .IF "$(OS)"!="MACOSX" || "$(PKGFORMAT)"!="portable"
 	$(PERL) -w $(SOLARENV)$/bin$/make_installer.pl -f $(PRJ)$/util$/openoffice.lst -l $(subst,$(@:s/_/ /:1)_, $(@:b)) -p OpenOffice -packagelist $(PRJ)$/inc_openoffice$/unix$/packagelist.txt -u $(OUT) -buildid $(BUILD) -msitemplate $(MSIOFFICETEMPLATEDIR) -msilanguage $(COMMONMISC)$/win_ulffiles -addsystemintegration $(subst,xxx,$(@:e:s/.//) $(PKGFORMATSWITCH))
-	$(PERL) -w $(SOLARENV)$/bin$/gen_update_info.pl --buildid $(BUILD) --arch "$(RTL_ARCH)" --os "$(RTL_OS)" --lstfile $(PRJ)$/util$/openoffice.lst --product OpenOffice --languages $(subst,$(@:s/_/ /:1)_, $(@:b)) $(PRJ)$/util$/update.xml > $(MISC)/$(@:b)_$(RTL_OS)_$(RTL_ARCH).update.xml
+	$(PERL) -w $(SOLARENV)$/bin$/gen_update_info.pl --buildid $(BUILD) --arch "$(RTL_ARCH)" --os "$(RTL_OS)" --lstfile $(PRJ)$/util$/openoffice.lst --product OpenOffice --languages $(subst,$(@:s/_/ /:1)_, $(@:b)) $(PRJ)$/util$/update.xml > $(MISC)/`date +%Y%m%d_%H%M`_$(RTL_OS)_$(RTL_ARCH).update.xml
 .ELSE                   # "$(OS)"!="MACOSX" || "$(PKGFORMAT)"!=""
 	$(PERL) -w $(SOLARENV)$/bin$/make_installer.pl -f $(PRJ)$/util$/openoffice.lst -l $(subst,$(@:s/_/ /:1)_, $(@:b)) -p OpenOffice -packagelist $(PRJ)$/inc_openoffice$/unix$/packagelist.txt -u $(OUT) -buildid $(BUILD) -destdir $(subst,$(@:s/_/ /:1)_,$(OUT)$/OpenOffice$/install$/ $(@:b))_inprogress$/ -simple staging
 	$(RM) $(subst,$(@:s/_/ /:1)_,$(OUT)$/OpenOffice$/install$/ $(@:b))$/gid_*
@@ -250,7 +250,7 @@
 openofficedev_% :
 .ENDIF			# "$(PKGFORMAT)"!=""
 	$(PERL) -w $(SOLARENV)$/bin$/make_installer.pl -f $(PRJ)$/util$/openoffice.lst -l $(subst,$(@:s/_/ /:1)_, $(@:b)) -p OpenOffice_Dev -packagelist $(PRJ)$/inc_openoffice$/unix$/packagelist.txt -u $(OUT) -buildid $(BUILD) -msitemplate $(MSIOFFICETEMPLATEDIR) -msilanguage $(COMMONMISC)$/win_ulffiles $(subst,xxx,$(@:e:s/.//) $(PKGFORMATSWITCH))
-	$(PERL) -w $(SOLARENV)$/bin$/gen_update_info.pl --buildid $(BUILD) --arch "$(RTL_ARCH)" --os "$(RTL_OS)" --lstfile $(PRJ)$/util$/openoffice.lst --product OpenOffice_Dev --languages $(subst,$(@:s/_/ /:1)_, $(@:b)) $(PRJ)$/util$/update.xml > $(MISC)/$(@:b)_$(RTL_OS)_$(RTL_ARCH).update.xml
+	$(PERL) -w $(SOLARENV)$/bin$/gen_update_info.pl --buildid $(BUILD) --arch "$(RTL_ARCH)" --os "$(RTL_OS)" --lstfile $(PRJ)$/util$/openoffice.lst --product OpenOffice_Dev --languages $(subst,$(@:s/_/ /:1)_, $(@:b)) $(PRJ)$/util$/update.xml > $(MISC)/`date +%Y%m%d_%H%M`_$(RTL_OS)_$(RTL_ARCH).update.xml
 
 openofficedevarchive_% :
 	$(PERL) -w $(SOLARENV)$/bin$/make_installer.pl -f $(PRJ)$/util$/openoffice.lst -l $(subst,$(@:s/_/ /:1)_, $(@:b)) -p OpenOffice_Dev -packagelist $(PRJ)$/inc_openoffice$/unix$/packagelist.txt -u $(OUT) -buildid $(BUILD) -msitemplate $(MSIOFFICETEMPLATEDIR) -msilanguage $(COMMONMISC)$/win_ulffiles -format archive
dummy line to avoid confusing diff-mode
