/*
 * Notepad (Russian resources)
 *
 * Copyright 2003 Igor Stepin
 *
 * 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"

/* UTF-8 */
#pragma code_page(65001)

LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT

MAIN_MENU MENU
{
 POPUP "&Файл" {
  MENUITEM "Созд&ать\tCtrl+N",           CMD_NEW
  MENUITEM "&Открыть...\tCtrl+O",             CMD_OPEN
  MENUITEM "&Сохранить\tCtrl+S",             CMD_SAVE
  MENUITEM "Сохранить &как...",       CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "&Печатать...\tCtrl+P",      CMD_PRINT
  MENUITEM "Пара&метры страницы...",    CMD_PAGE_SETUP
  MENUITEM "&Настройка принтера...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "В&ыход",             CMD_EXIT
 }
POPUP "&Правка" {
  MENUITEM "&Отменить\tCtrl+Z",     CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "&Вырезать\tCtrl+X",      CMD_CUT
  MENUITEM "&Копировать\tCtrl+C",     CMD_COPY
  MENUITEM "Вст&авить\tCtrl+V",    CMD_PASTE
  MENUITEM "&Удалить\tDel",      CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Выделить в&се",       CMD_SELECT_ALL
  MENUITEM "Врем&я и дата\tF5",    CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Перенос по словам",  CMD_WRAP
  MENUITEM "&Шрифт...",           CMD_FONT
 }
POPUP "П&оиск" {
  MENUITEM "&Найти...",           CMD_SEARCH
  MENUITEM "Найти &далее\tF3",  CMD_SEARCH_NEXT
  MENUITEM "&Заменить...\tCtrl+H", CMD_REPLACE
 }
POPUP "&Справка" {
  MENUITEM "&Содержание",         CMD_HELP_CONTENTS
  MENUITEM "&Поиск...",        CMD_HELP_SEARCH
  MENUITEM "&Использование справки",     CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "&О Notepad", CMD_HELP_ABOUT_NOTEPAD
 }
}

/* Dialog `Page setup' */

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Параметры страницы"
{
LTEXT    "В&ерхний колонтитул:",  0x140,   10, 07, 40, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "Н&ижний колонтитул:",  0x142,   10, 24, 40, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "Поля (мм):",      0x144,     10, 43,160, 45
LTEXT    "&Левое:",        0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Верхнее:",         0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Правое:",       0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Нижнее:",      0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "OK",         IDOK,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Отмена",     IDCANCEL,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Справка",       IDHELP,                180, 39, 40, 15, WS_TABSTOP
}

IDD_OFN_TEMPLATE  DIALOG  DISCARDABLE 50,50,300,15
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
  LTEXT "Кодировка:", -1, 5,0, 50,12
  COMBOBOX IDC_OFN_ENCCOMBO, 53,0, 156,48, WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST
END

STRINGTABLE DISCARDABLE
{
STRING_PAGESETUP_HEADERVALUE,   "&f"
STRING_PAGESETUP_FOOTERVALUE,   "Страница &p"

STRING_NOTEPAD,                                 "Блокнот"
STRING_ERROR,                                   "ОШИБКА"
STRING_WARNING,                                 "ВНИМАНИЕ"
STRING_INFO,                                    "Информация"

STRING_UNTITLED,                                "(без заголовка)"

STRING_ALL_FILES,                               "Все файлы (*.*)"
STRING_TEXT_FILES_TXT,                  "Текстовые файлы (*.txt)"

STRING_TOOLARGE,                                "Файл '%s' слишком большой для блокнота.\n \
Используйте другой редактор."
STRING_NOTEXT,                                  "Вы не ввели никакого текста. \
\nВведите что-нибудь и попробуйте еще."
STRING_DOESNOTEXIST,                            "Файл '%s'\nне существует\n\n \
Хотите создать новый файл?"
STRING_NOTSAVED,                                "Файл '%s'\nбыл изменен\n\n \
Хотите сохранить изменения?"
STRING_NOTFOUND,                                        "'%s' не найден."
STRING_OUT_OF_MEMORY,                   "Недостаточно памяти для завершения этой операции \
\nЗакройте одно или несколько приложений и повторите попытку."

STRING_UNICODE_LE,     "Юникод (UTF-16)"
STRING_UNICODE_BE,     "Юникод (UTF-16 big-endian)"

STRING_LOSS_OF_UNICODE_CHARACTERS,         "%s\n\
Этот файл содержит текст в формате Юникод, который будет потерян, если вы сохраните этот файл как файл в кодировке %s.\n\
Чтобы сохранить данные в формате Юникод, нажмите кнопку \"Отмена\" и выберите\n\
один из вариантов сохранения в формате Юникод.\n\
Продолжить?"
}
