/*
 * Language neutral resources for Common Dialogs
 *
 * Copyright 1999 Bertho Stultiens
 * Copyright 1999 Klaas van Gend
 *
 * 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"
#include "winbase.h"
#include "winver.h"

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

#define WINE_FILEDESCRIPTION_STR "Common Dialog Boxes"
#define WINE_FILENAME_STR "comdlg32.dll"
#define WINE_FILEVERSION 4,0,0,950 /* Maybe 4.1.0.980 for win98?? */
#define WINE_FILEVERSION_STR "4.0"

#include "wine/wine_common_ver.rc"

/* Translators do not need to translate this text, unless the language uses a
 * different character set or if the distribution of characters looks wrong.
 * It is rendered illegibly small and is used to make a mock-up of a document.
 */
STRINGTABLE DISCARDABLE
{
    IDS_FAKEDOCTEXT
        "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. \
        Nulla a tortor. Etiam aliquet libero venenatis nunc.\n\
\n\
        Sed augue ante, fermentum sit amet, imperdiet et, gravida eu, enim. \
        Donec nibh quam, sodales in, commodo vel, facilisis id, neque.\n\
\n\
        Nunc eleifend bibendum nibh. Phasellus in lorem. Ut vel odio quis \
        libero adipiscing consequat. Donec consectetuer laoreet mauris.\n\
\n\
        Maecenas tempor, ligula sed congue nonummy, arcu dolor ornare erat, \
        egestas iaculis magna purus sed turpis.\n\
\n\
        Morbi ultricies est non ipsum. Cum sociis natoque penatibus et magnis \
        dis parturient montes, nascetur ridiculus mus.\n\
\n\
        Duis sit amet nibh quis purus sollicitudin blandit. Curabitur justo. \
        Phasellus varius, erat eu luctus pharetra, odio elit fringilla leo, \
        non vulputate turpis elit id neque. Vestibulum sit amet tellus sed \
        tortor fermentum consectetuer."
}


/* @makedep: pd32_collate.ico */
PD32_COLLATE ICON DISCARDABLE LOADONCALL pd32_collate.ico

/* @makedep: pd32_nocollate.ico */
PD32_NOCOLLATE ICON pd32_nocollate.ico

/* @makedep: pd32_portrait.ico */
PD32_PORTRAIT ICON pd32_portrait.ico

/* @makedep: pd32_landscape.ico */
PD32_LANDSCAPE ICON pd32_landscape.ico

/* @makedep: 800.bmp */
800 BITMAP DISCARDABLE LOADONCALL "800.bmp"

/* @makedep: folder.ico */
FOLDER ICON folder.ico

/* @makedep: folder2.ico */
FOLDER2 ICON folder2.ico

/* @makedep: floppy.ico */
FLOPPY ICON floppy.ico

/* @makedep: cdrom.ico */
CDROM ICON cdrom.ico

/* @makedep: hdisk.ico */
HDISK ICON hdisk.ico

/* @makedep: network.ico */
NETWORK ICON network.ico

/* @makedep: fontpics.bmp */
38 BITMAP DISCARDABLE LOADONCALL fontpics.bmp
