/*
 * Help Viewer
 *
 * Copyright 2009 Aurimas Fišeras <aurimas@gmail.com>
 *
 * 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 "winhelp_res.h"

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

LANGUAGE LANG_LITHUANIAN, SUBLANG_NEUTRAL

/* Menu */

MAIN_MENU MENU
{
 POPUP "&Failas" {
   MENUITEM "&Atverti",                   MNID_FILE_OPEN
   MENUITEM SEPARATOR
   MENUITEM "&Spausdinti",                MNID_FILE_PRINT
   MENUITEM "Spaus&dintuvo nuostatos...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
   MENUITEM "Iš&eiti",                    MNID_FILE_EXIT
 }
 POPUP "&Taisa" {
   MENUITEM "&Kopijuoti...",              MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "Ko&mentuoti...",             MNID_EDIT_ANNOTATE
 }
 POPUP "&Adresynas" {
   MENUITEM "&Apibrėžti...",              MNID_BKMK_DEFINE
 }
 POPUP "&Parinktys" {
   POPUP    "Žinynas visuomet matomas"
   BEGIN
     MENUITEM "Numatyta",                 MNID_OPTS_HELP_DEFAULT
     MENUITEM "Matomas",                  MNID_OPTS_HELP_VISIBLE
     MENUITEM "Nematomas",                MNID_OPTS_HELP_NONVISIBLE
   END
   MENUITEM "Istorija",                   MNID_OPTS_HISTORY
   POPUP    "Šriftas"
   BEGIN
     MENUITEM "&Mažas",                   MNID_OPTS_FONTS_SMALL
     MENUITEM "&Normalus",                MNID_OPTS_FONTS_NORMAL
     MENUITEM "&Didelis",                 MNID_OPTS_FONTS_LARGE
   END
   MENUITEM "Naudoti &sistemos spalvas",  MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "&Žinynas" {
   MENUITEM "Pa&galba apie žinyną",       MNID_HELP_HELPON
   MENUITEM "&Visada viršuje",            MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "&Informacija...",            MNID_HELP_ABOUT
 }
}

IDD_INDEX DIALOG 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Indeksas"
{
    LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}

IDD_SEARCH DIALOG 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Paieška"
{
    LTEXT  "Dar nerealizuota", -1, 10, 10, 180, 150
}

/* Strings */
STRINGTABLE
{
STID_WINE_HELP,       "Wine žinynas"
STID_WHERROR,         "KLAIDA"
STID_WARNING,         "ĮSPĖJIMAS"
STID_INFO,            "Informacija"
STID_NOT_IMPLEMENTED, "Nerealizuota"
STID_HLPFILE_ERROR_s, "Klaida skaitant žinyno failą „%s“"
STID_INDEX,           "&Rodyklė"
STID_CONTENTS,        "Santrauka"
STID_BACK,            "&Atgal"
STID_ALL_FILES,       "Visi failai (*.*)"
STID_HELP_FILES_HLP,  "Žinyno failai (*.hlp)"
STID_FILE_NOT_FOUND_s "Nepavyko rasti „%s“. Ar norite rasti šį failą patys?"
STID_NO_RICHEDIT      "Nepavyko rasti RichEdit realizacijos... Nutraukiama"
STID_PSH_INDEX,       "Žinyno temos: "
}

CONTEXT_MENU MENU
BEGIN
  POPUP ""
  BEGIN
    MENUITEM "Komentuoti...",            MNID_CTXT_ANNOTATE
    MENUITEM "Kopijuoti",                MNID_CTXT_COPY
    MENUITEM "Spausdinti...",            MNID_CTXT_PRINT
    POPUP    "Šriftas"
    BEGIN
      MENUITEM "Mažas",                  MNID_CTXT_FONTS_SMALL
      MENUITEM "Normalus",               MNID_CTXT_FONTS_NORMAL
      MENUITEM "Didelis",                MNID_CTXT_FONTS_LARGE
    END
    POPUP   "Žinynas visuomet matomas"
    BEGIN
      MENUITEM "Numatyta",               MNID_CTXT_HELP_DEFAULT
      MENUITEM "Matomas",                MNID_CTXT_HELP_VISIBLE
      MENUITEM "Nematomas",              MNID_CTXT_HELP_NONVISIBLE
    END
    MENUITEM "Naudoti sistemos spalvas", MNID_CTXT_SYSTEM_COLORS
  END
END
