/*
 * Copyright 2001 Eric Pouech
 * Copyright 2006 Jonathan Ernst
 * Copyright 2009 Frédéric Delanoy
 *
 * 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 "wineconsole_res.h"

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

LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL

STRINGTABLE
BEGIN
IDS_EDIT,		"É&dition"
IDS_DEFAULT,		"Par &défaut"
IDS_PROPERTIES,		"&Propriétés"
IDS_MARK,		"&Marquer"
IDS_COPY,		"&Copier"
IDS_PASTE,		"C&oller"
IDS_SELECTALL,		"&Sélectionner tout"
IDS_SCROLL,		"&Défiler"
IDS_SEARCH,		"C&hercher"
IDS_FNT_DISPLAY,	"Chaque caractère a %ld pixels de largeur et %ld pixels de hauteur"
IDS_FNT_PREVIEW_1,	"Ceci est un test"
IDS_FNT_PREVIEW_2,	""
IDS_DLG_TIT_DEFAULT,    "Configuration par défaut"
IDS_DLG_TIT_CURRENT,    "Configuration courante"
IDS_DLG_TIT_ERROR,	"Erreur de configuration"
IDS_DLG_ERR_SBWINSIZE,	"La taille du tampon écran doit être plus grande ou égale à celle du tampon de la fenêtre"

IDS_CMD_INVALID_EVENT_ID   "wineconsole : impossible de déchiffrer l'identifiant d'événement\n"
IDS_CMD_INVALID_BACKEND    "wineconsole : moteur invalide\n"
IDS_CMD_INVALID_OPTION     "wineconsole : option de ligne de commande non reconnue\n"
IDS_CMD_ABOUT              "Démarre un programme dans une console Wine\n"
IDS_CMD_LAUNCH_FAILED      "wineconsole : échec lors du démarrage du programme %s.\n"\
                           "La commande est invalide.\n"

IDS_USAGE_HEADER           "\nUsage :\n  wineconsole [options] <commande>\n\nOptions :\n"
IDS_USAGE_BACKEND          "  --backend={user|curses}  Utilisez « user »   pour utiliser une nouvelle fenêtre\n"\
                           "                                    « curses » pour essayer de convertir le terminal courant en console Wine\n"
IDS_USAGE_COMMAND          "  <commande>               Le programme Wine à exécuter dans la console\n"
IDS_USAGE_FOOTER           "\nExemple : « wineconsole cmd » démarre l'interpréteur de commandes de Wine dans une console Wine\n\n"

END

IDD_OPTION DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 214, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Options "
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Taille du curseur", -1, 10, 11, 63, 49, BS_GROUPBOX
	AUTORADIOBUTTON "&Petit", IDC_OPT_CURSOR_SMALL, 14, 25, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Moyen", IDC_OPT_CURSOR_MEDIUM, 14, 35, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "&Grand", IDC_OPT_CURSOR_LARGE, 14, 45, 44, 10, WS_TABSTOP

	GROUPBOX "Contrôle", -1, 75, 11, 129, 49, BS_GROUPBOX
	LTEXT "Menu contextuel", -1, 83, 23, 53, 10
	AUTOCHECKBOX "&Control", IDC_OPT_CONF_CTRL, 142, 23, 60, 10, WS_TABSTOP
	AUTOCHECKBOX "S&hift", IDC_OPT_CONF_SHIFT, 142, 33, 60, 10, WS_TABSTOP
	LTEXT "Édition rapide", -1, 83, 48, 53, 10
	AUTOCHECKBOX "&activer", IDC_OPT_QUICK_EDIT, 142, 48, 60, 10, WS_TABSTOP

	GROUPBOX "Historique des commandes", -1, 10, 62, 194, 35, BS_GROUPBOX
	LTEXT "&Nombre de commandes mémorisées :", -1, 14, 72, 78, 18
	EDITTEXT IDC_OPT_HIST_SIZE, 94, 74, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	AUTOCHECKBOX "&Supprimer les doublons", IDC_OPT_HIST_NODOUBLE, 142, 72, 60, 18, WS_TABSTOP|BS_MULTILINE
}

IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 205, 106
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Police "
FONT 8, "MS Shell Dlg"
{
	LTEXT "&Police", -1, 5, 5, 24, 8
	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
	LTEXT "&Couleur", -1, 100, 5, 50, 8
	CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16
	CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16
	LTEXT "&Taille", -1, 158, 5, 40, 8
	LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 43, WS_VSCROLL
	CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40
	LTEXT "", IDC_FNT_FONT_INFO, 120, 69, 78, 28
}

IDD_CONFIG DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 205, 107
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " Configuration "
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "Taille mémoire tampon écran", -1, 10, 11, 100, 42, BS_GROUPBOX
	LTEXT "&Largeur :", -1, 14, 25, 54, 9
	EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "Ha&uteur :", -1, 14, 39, 54, 9
	EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

	GROUPBOX "Taille de la fenêtre", -1, 10, 55, 100, 42
	LTEXT "La&rgeur :", -1, 14, 69, 54, 9
	EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "Hau&teur :", -1, 14, 83, 54, 9
	EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

	GROUPBOX "Fin du programme", -1, 115, 11, 80, 42, BS_GROUPBOX
	AUTOCHECKBOX "&Fermer la console", IDC_CNF_CLOSE_EXIT, 119, 25, 70, 20, WS_TABSTOP

	GROUPBOX "Édition", -1, 115, 55, 80, 42
	COMBOBOX IDC_CNF_EDITION_MODE, 119, 69, 73, 13, CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
}

IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 206, 60
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Paramètres de la console"
FONT 8, "MS Shell Dlg"
{
	GROUPBOX "", -1, 10, 10, 185, 31, BS_GROUPBOX
	AUTORADIOBUTTON "Sauver les paramètres pour les prochaines sessions", IDC_SAV_SAVE, 14, 15, 180, 10, WS_TABSTOP
	AUTORADIOBUTTON "Appliquer uniquement à la session courante", IDC_SAV_SESSION, 14, 27, 180, 10, WS_TABSTOP

	PUSHBUTTON "OK", IDOK, 55, 45, 35, 12
	PUSHBUTTON "Annuler", IDCANCEL, 120, 45, 35, 12
}
