/*
 * Resources for MSI
 *
 * Copyright 2005 Mike McCormack
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#include "windef.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

STRINGTABLE
{
	4 "The specified installation package could not be opened.  Please check the file path and try again."
	5 "path %s not found"
	9 "insert disk %s"
	10 "Windows Installer %s\n\n" \
	"Usage:\n" \
	"msiexec command {required parameter} [optional parameter]\n\n" \
	"Install a product:\n" \
	"\t/i {package|product_code} [property]\n" \
	"\t/package {package|product_code} [property]\n" \
	"\t/a package [property]\n" \
	"Repair an installation:\n" \
	"\t/f[p|o|e|d|c|a|u|m|s|v] {package|product_code}\n" \
	"Uninstall a product:\n" \
	"\t/uninstall {package|product_code} [property]\n" \
	"\t/x {package|product_code} [property]\n" \
	"Advertise a product:\n" \
	"\t/j[u|m] package [/t transform] [/g languageid]\n" \
	"Apply a patch:\n" \
	"\t/p patch_package [property]\n" \
	"\t/p patch_package /a package [property]\n" \
	"Log and UI Modifiers for above commands:\n" \
	"\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
	"\t/q{|n|b|r|f|n+|b+|b-}\n" \
	"Register MSI Service:\n" \
	"\t/y\n" \
	"Unregister MSI Service:\n" \
	"\t/z\n" \
	"Display this help:\n" \
	"\t/help\n" \
	"\t/?\n"
	11 "enter which folder contains %s"
	12 "install source for feature missing"
	13 "network drive for feature missing"
	14 "feature from:"
	15 "choose which folder contains %s"
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

/* @makedep: msiserver.tlb */
1 TYPELIB msiserver.tlb

/* @makedep: msiserver.rgs */
1 WINE_REGISTRY msiserver.rgs

/* @makedep: instadvert.bmp */
0x1001 BITMAP instadvert.bmp

/* @makedep: instabsent.bmp */
0x1002 BITMAP instabsent.bmp

/* @makedep: instlocal.bmp */
0x1003 BITMAP instlocal.bmp

#define WINE_FILEDESCRIPTION_STR "Wine MSI dll"
#define WINE_FILENAME_STR "msi.dll"
#define WINE_FILEVERSION 4,5,6001,22159
#define WINE_FILEVERSION_STR "4.5.6001.22159"
#define WINE_PRODUCTVERSION 4,5,6001,22159
#define WINE_PRODUCTVERSION_STR "4.5.6001.22159"

#include "wine/wine_common_ver.rc"
