/*
 * 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
