/*
 * Copyright 1999 Eric Kohl
 * Copyright 2008 Michael Stefaniuc
 *
 * 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 "comctl32.h"

LANGUAGE LANG_ROMANIAN, SUBLANG_NEUTRAL

#pragma code_page(65001)

IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Proprietăți pentru %s"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&OK",      IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "&Renunță", IDCANCEL,58,122,50,14
  PUSHBUTTON    "A&plică",  IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "&Ajutor",  IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS|WS_GROUP|WS_TABSTOP|TCS_MULTILINE,4,4,212,114
END


IDD_WIZARD DIALOG DISCARDABLE 0, 0, 290, 159
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Expert"
FONT 8, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< &Înapoi",  IDC_BACK_BUTTON,71,138,50,14
  DEFPUSHBUTTON "&Următor >", IDC_NEXT_BUTTON,121,138,50,14
  DEFPUSHBUTTON "&Termină",   IDC_FINISH_BUTTON,121,138,50,14
  PUSHBUTTON    "&Renunță",   IDCANCEL,178,138,50,14
  PUSHBUTTON    "&Ajutor",    IDHELP,235,138,50,14,WS_GROUP
  LTEXT         "", IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "Tab", IDC_TABCONTROL,"SysTabControl32",WS_CLIPSIBLINGS | WS_DISABLED,7,7,258,5
  LTEXT         "", IDC_SUNKEN_LINEHEADER,0,35,290,1,SS_LEFT | SS_SUNKEN | WS_CHILD | WS_VISIBLE
END


IDD_TBCUSTOMIZE DIALOG DISCARDABLE 10, 20, 357, 125
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Personalizare toolbar"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&Închide",     IDCANCEL,308,6,44,14
  PUSHBUTTON    "&Resetează",   IDC_RESET_BTN,308,23,44,14
  PUSHBUTTON    "&Ajutor",      IDC_HELP_BTN,308,40,44,14
  PUSHBUTTON    "Mută în &sus", IDC_MOVEUP_BTN,308,74,44,14
  PUSHBUTTON    "Mută în &jos", IDC_MOVEDN_BTN,308,91,44,14
  LTEXT         "&Butoane disponibile:", -1,4,5,84,10
  LISTBOX       IDC_AVAILBTN_LBOX,4,17,120,100, LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
  PUSHBUTTON    "A&daugă ->",   IDOK, 131, 42, 44, 14
  PUSHBUTTON    "<- &Șterge",   IDC_REMOVE_BTN,131,62,44,14
  LTEXT         "Butoane &toolbar:", -1,182,5,78,10
  LISTBOX       IDC_TOOLBARBTN_LBOX, 182,17,120,100,LBS_NOTIFY | LBS_OWNERDRAWFIXED | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | LBS_DISABLENOSCROLL | WS_BORDER | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP
END

STRINGTABLE DISCARDABLE
{
    IDS_CLOSE    "Închide"
}

STRINGTABLE DISCARDABLE
{
    IDM_TODAY    "Azi:"
    IDM_GOTODAY  "Mergi la Azi"
}

STRINGTABLE DISCARDABLE
{
    IDS_SEPARATOR "Separator"
}

STRINGTABLE DISCARDABLE
{
    HKY_NONE "Nimic"
}
