/*
 * French language resource file for Credentials UI
 *
 * Copyright 2007 Jonathan Ernst
 *
 * 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
 */

LANGUAGE LANG_FRENCH, SUBLANG_NEUTRAL

IDD_CREDDIALOG DIALOG DISCARDABLE  0, 0, 213, 149
STYLE DS_MODALFRAME | DS_NOIDLEMSG | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "IDS_TITLEFORMAT"
FONT 8, "MS Shell Dlg"
BEGIN
    CONTROL         IDB_BANNER,IDC_STATIC,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
                    0,213,37
    LTEXT           "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
    LTEXT           "&Nom d'utilisateur :",IDC_STATIC,8,62,72,12,SS_CENTERIMAGE
    CONTROL         "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
                    CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,12
    LTEXT           "&Mot de passe :",IDC_STATIC,8,80,72,12,SS_CENTERIMAGE
    EDITTEXT        IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
    CONTROL         "&Se souvenir de mon mot de passe",IDC_SAVE,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
    DEFPUSHBUTTON   "OK",IDOK,97,128,50,14
    PUSHBUTTON      "Annuler",IDCANCEL,156,128,50,14
END

STRINGTABLE DISCARDABLE
{
    IDS_TITLEFORMAT     "Se connecter à %s"
    IDS_MESSAGEFORMAT   "Connexion à %s"
    IDS_INCORRECTPASSWORDTITLE  "Échec lors de la connexion"
    IDS_INCORRECTPASSWORD       "Assurez-vous que votre nom d'utilisateur\net votre mot de passe sont corrects."
    IDS_CAPSLOCKONTITLE "VERR.MAJ est activé"
    IDS_CAPSLOCKON      "Le verrouillage majuscule étant activé, cela pourrait provoquer une erreur lors de la saisie de votre mot de passe.\n\nAppuyez sur la touche VERR.MAJ de votre clavier afin de désactiver le verrouilage majuscule avant\nde saisir votre mot de passe."
}
