/*
 * 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
#ifdef WINELIB
   MENUITEM "&Apie Wine",                 MNID_HELP_WINE
#endif
 }
}

IDD_INDEX DIALOG DISCARDABLE 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 DISCARDABLE 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 DISCARDABLE
{
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
