/*
 *  Notepad (French resources)
 *
 *  Copyright 1997,98 Marcel Baur <mbaur@g26.ethz.ch>
 *  Translation by Laurent Buffler <laurent@bluewin.ch>
 *  Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 *  Copytight 2009 Jonathan Ernst <jonathan@ernstfamily.ch>
 *
 * 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 "notepad_res.h"

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

LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL

MAIN_MENU MENU
{
 POPUP "&Fichier" {
  MENUITEM "&Nouveau\tCtrl+N",       CMD_NEW
  MENUITEM "&Ouvrir...\tCtrl+O",   CMD_OPEN
  MENUITEM "&Enregistrer\tCtrl+S", CMD_SAVE
  MENUITEM "Enregistrer &sous...", CMD_SAVE_AS
  MENUITEM SEPARATOR
  MENUITEM "Im&primer...\tCtrl+P",         CMD_PRINT
  MENUITEM "&Mise en page...",  CMD_PAGE_SETUP
  MENUITEM "&Configuration de l'imprimante...", CMD_PRINTER_SETUP
  MENUITEM SEPARATOR
  MENUITEM "&Quitter",          CMD_EXIT
 }
POPUP "É&dition" {
  MENUITEM "&Annuler\tCtrl+Z",  CMD_UNDO
  MENUITEM SEPARATOR
  MENUITEM "Co&uper\tCtrl+X",   CMD_CUT
  MENUITEM "&Copier\tCtrl+C",   CMD_COPY
  MENUITEM "C&oller\tCtrl+V",   CMD_PASTE
  MENUITEM "&Effacer\tDel",     CMD_DELETE
  MENUITEM SEPARATOR
  MENUITEM "Tout &sélectionner\tCtrl+A", CMD_SELECT_ALL
  MENUITEM "&Heure/Date\tF5",   CMD_TIME_DATE
  MENUITEM SEPARATOR
  MENUITEM "&Retour à la ligne automatique", CMD_WRAP
  MENUITEM "&Police...",        CMD_FONT
 }
POPUP "&Rechercher" {
  MENUITEM "&Rechercher...\tCtrl+F", CMD_SEARCH
  MENUITEM "&Suivant\tF3",      CMD_SEARCH_NEXT
  MENUITEM "&Remplacer...\tCtrl+H", CMD_REPLACE
 }
POPUP "Aid&e" {
  MENUITEM "&Sommaire",         CMD_HELP_CONTENTS
  MENUITEM "&Rechercher...",    CMD_HELP_SEARCH
  MENUITEM "&Utiliser l'aide",  CMD_HELP_ON_HELP
  MENUITEM SEPARATOR
  MENUITEM "À &propos du Bloc-notes", CMD_HELP_ABOUT_NOTEPAD
 }
}

/* Dialog `Page setup' */

DIALOG_PAGESETUP DIALOG 0, 0, 225, 95
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 8, "MS Shell Dlg"
CAPTION "Mise en page"
{
LTEXT    "&En-tête :",  0x140,   10, 07, 50, 15
EDITTEXT IDC_PAGESETUP_HEADERVALUE,   60, 05,110, 12, WS_BORDER | WS_TABSTOP
LTEXT    "&Pied de page :",  0x142,   10, 24, 50, 15
EDITTEXT IDC_PAGESETUP_FOOTERVALUE,   60, 22,110, 12, WS_BORDER | WS_TABSTOP

GROUPBOX "&Marges (millimètres):",  0x144,  10, 43,160, 45
LTEXT    "&Gauche :",        0x145,   20, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_LEFTVALUE,     50, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Haut :",         0x148,    20, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_TOPVALUE,      50, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Droite :",       0x14B, 100, 55, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_RIGHTVALUE,   130, 55, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP
LTEXT    "&Bas :",      0x14E,100, 73, 30, 10, WS_CHILD
EDITTEXT IDC_PAGESETUP_BOTTOMVALUE,  130, 73, 35, 11, WS_CHILD | WS_BORDER | WS_TABSTOP

DEFPUSHBUTTON "OK",         IDOK,                   180,  3, 40, 15, WS_TABSTOP
PUSHBUTTON    "Annuler",     IDCANCEL,               180, 21, 40, 15, WS_TABSTOP
PUSHBUTTON    "&Aide",       IDHELP,                180, 39, 40, 15, WS_TABSTOP
}

IDD_OFN_TEMPLATE  DIALOG  DISCARDABLE 50,50,300,15
STYLE DS_3DLOOK | DS_CONTROL | WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_BORDER
FONT 8, "MS Shell Dlg"
BEGIN
  LTEXT "Codage", -1, 5,0, 50,12
  COMBOBOX IDC_OFN_ENCCOMBO, 59,0, 156,48, WS_CHILD | WS_VSCROLL | CBS_DROPDOWNLIST
END

STRINGTABLE DISCARDABLE
{
STRING_PAGESETUP_HEADERVALUE,   "&f"
STRING_PAGESETUP_FOOTERVALUE,   "Page &p"

STRING_NOTEPAD,                                 "Bloc-notes"
STRING_ERROR,                                   "ERREUR"
STRING_WARNING,                                 "ATTENTION"
STRING_INFO,                                    "Information"

STRING_UNTITLED,                                "(sans titre)"

STRING_ALL_FILES,                               "Tous les fichiers (*.*)"
STRING_TEXT_FILES_TXT,                          "Fichiers texte (*.txt)"

STRING_TOOLARGE,                                "Le fichier « %s » est trop grand pour le bloc-notes.\n\
Veuillez utiliser un autre éditeur."
STRING_NOTEXT,                                  "Vous n'avez pas entré de texte. \
Veuillez taper quelque chose et recommencer"
STRING_DOESNOTEXIST,                            "Le fichier « %s » n'existe pas.\n\n\
Voulez-vous créer un nouveau fichier ?"
STRING_NOTSAVED,                                "Le fichier « %s » a été modifié\n\n\
Voulez-vous enregistrer vos modifications ?"
STRING_NOTFOUND,                                "« %s » non trouvé."
STRING_OUT_OF_MEMORY,                           "Pas assez de mémoire pour terminer cette \
tâche.\nFermez une ou plusieurs applications pour libérer\n\
de la mémoire."

STRING_UNICODE_LE,     "Unicode (UTF-16)"
STRING_UNICODE_BE,     "Unicode (UTF-16 big-endian)"

STRING_LOSS_OF_UNICODE_CHARACTERS,         "%s\n\
Ce fichier contient des caractères Unicode qui seront perdus si\n\
vous le sauvez dans le codage %s.\n\
Pour conserver ces caractères, cliquez sur Annuler et sélectionnez\n\
une des alternatives Unicode dans la liste déroulante Codage.\n\
Continuer ?"
}
