/*
 * Comctl32
 * French language support
 *
 * Copyright 1999 Eric Kohl
 * Copyright 2003 Vincent Béron
 *
 * 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"

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

LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL

IDD_PROPSHEET DIALOG DISCARDABLE 0, 0, 220, 140
STYLE DS_CONTEXTHELP | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_VISIBLE
CAPTION "Propriétés pour %s"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "OK",     IDOK,4,122,50,14, WS_TABSTOP | WS_GROUP
  PUSHBUTTON    "Annuler", IDCANCEL,58,122,50,14
  PUSHBUTTON    "&Appliquer", IDC_APPLY_BUTTON,112,122,50,14,WS_DISABLED
  PUSHBUTTON    "Aide",   IDHELP,166,122,50,14,WS_TABSTOP|WS_GROUP
  CONTROL       "Onglet", 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 "Assistant"
FONT 8, "MS Shell Dlg"
BEGIN
  PUSHBUTTON    "< &Précédent", IDC_BACK_BUTTON,71,138,50,14
  DEFPUSHBUTTON "&Suivant >", IDC_NEXT_BUTTON,123,138,50,14
  DEFPUSHBUTTON "Terminer", IDC_FINISH_BUTTON,123,138,50,14
  PUSHBUTTON    "Annuler", IDCANCEL,178,138,50,14
  PUSHBUTTON    "Aide",    IDHELP,235,138,50,14,WS_GROUP
  LTEXT         "",        IDC_SUNKEN_LINE,7,129,278,1,SS_SUNKEN
  CONTROL       "Onglet",  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 "Personnaliser la barre d'outils"
FONT 8, "MS Shell Dlg"
BEGIN
  DEFPUSHBUTTON "&Fermer",  IDCANCEL,308,6,44,14
  PUSHBUTTON    "&Réinitialiser", IDC_RESET_BTN,308,23,44,14
  PUSHBUTTON    "Aid&e",    IDC_HELP_BTN,308,40,44,14
  PUSHBUTTON    "&Monter",  IDC_MOVEUP_BTN,308,74,44,14
  PUSHBUTTON    "&Descendre", IDC_MOVEDN_BTN,308,91,44,14
  LTEXT         "Boutons &disponibles :", -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&jouter ->",    IDOK, 131, 42, 44, 14
  PUSHBUTTON    "<- E&nlever", IDC_REMOVE_BTN,131,62,44,14
  LTEXT         "&Boutons de la barre d'outils :", -1,182,5,93,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    "Fermer"
}

STRINGTABLE DISCARDABLE
{
    IDM_TODAY    "Aujourd'hui :"
    IDM_GOTODAY  "Aller à aujourd'hui"
}

STRINGTABLE DISCARDABLE
{
    IDS_SEPARATOR "Séparateur"
}

STRINGTABLE DISCARDABLE
{
    HKY_NONE "Aucun"
}
