/*
 *  Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch>
 *  Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 *
 * 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 "notepad_res.h"

LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT

MAIN_MENU MENU
{
 POPUP "&File" {
  MENUITEM "&New\tCtrl+N",      CMD_NEW
  MENUITEM "&Open...\tCtrl+O",  CMD_OPEN
  MENUITEM "&Save\tCtrl+S",     CMD_SAVE
  MENUITEM "Save &as...",       CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "&Print...\tCtrl+P",            CMD_PRINT
  MENUITEM "Page Se&tup...",    CMD_PAGE_SETUP
  MENUITEM "P&rinter Setup...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "E&xit",             CMD_EXIT
 }
POPUP "&Edit" {
  MENUITEM "&Undo\tCtrl+Z",     CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "Cu&t\tCtrl+X",      CMD_CUT
  MENUITEM "&Copy\tCtrl+C",     CMD_COPY
  MENUITEM "&Paste\tCtrl+V",    CMD_PASTE
  MENUITEM "&Delete\tDel",      CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Select &all\tCtrl+A",       CMD_SELECT_ALL
  MENUITEM "&Time/Date\tF5",    CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Wrap long lines",  CMD_WRAP
  MENUITEM "&Font...",          CMD_FONT
 }
POPUP "&Search" {
  MENUITEM "&Search...\tCtrl+F",   CMD_SEARCH
  MENUITEM "&Search next\tF3",  CMD_SEARCH_NEXT
  MENUITEM "&Replace...\tCtrl+H", CMD_REPLACE
 }
POPUP "&Help" {
  MENUITEM "&Contents\tF1",     CMD_HELP_CONTENTS
  MENUITEM "&About Notepad",    CMD_HELP_ABOUT_NOTEPAD
 }
}

STRINGTABLE
{
STRING_PAGESETUP_HEADERVALUE,   "#msgctxt#do not translate#&f"
STRING_PAGESETUP_FOOTERVALUE,   "Page &p"

STRING_NOTEPAD,                                 "Notepad"
STRING_ERROR,                                   "ERROR"
STRING_WARNING,                                 "WARNING"
STRING_INFO,                                    "Information"

STRING_UNTITLED,                                "Untitled"

STRING_ALL_FILES,                               "All files (*.*)"
STRING_TEXT_FILES_TXT,                  "Text files (*.txt)"

STRING_TOOLARGE,                                "File '%s' is too large for notepad.\n\
Please use a different editor."
STRING_NOTEXT,                                  "You did not enter any text.\
\nPlease type something and try again."
STRING_DOESNOTEXIST,                            "File '%s' does not exist.\n\n\
Do you want to create a new file?"
STRING_NOTSAVED,                                "File '%s' has been modified.\n\n\
Would you like to save the changes?"
STRING_NOTFOUND,                                        "'%s' could not be found."
STRING_OUT_OF_MEMORY,                   "Not enough memory to complete this \
task.\nClose one or more applications to increase the amount of free memory."

STRING_UNICODE_LE,     "Unicode (UTF-16)"
STRING_UNICODE_BE,     "Unicode (UTF-16 big-endian)"
STRING_UTF8,           "Unicode (UTF-8)"

STRING_LOSS_OF_UNICODE_CHARACTERS,         "%s\n\
This file contains Unicode characters which will be lost if\n\
you save this file in the %s encoding.\n\
To keep these characters, click Cancel, and then select\n\
one of the Unicode options in the Encoding drop down list.\n\
Continue?"
}

LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL

/* @makedep: notepad.ico */
IDI_NOTEPAD ICON "notepad.ico"
