/*
 * Portuguese language resource file for Credentials UI
 *
 * Copyright 2008 Ricardo Filipe
 * Copyright 2010 Gustavo Henrique Milaré
 *
 * 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 "credui_resources.h"

#pragma code_page(65001)

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

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,-1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
                    0,213,37
    LTEXT           "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
    LTEXT           "Nome de &usuário:",-1,8,62,72,12,SS_CENTERIMAGE
    CONTROL         "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
                    CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
    LTEXT           "&Senha:",-1,8,80,72,12,SS_CENTERIMAGE
    EDITTEXT        IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
    CONTROL         "&Lembrar a senha",IDC_SAVE,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
    DEFPUSHBUTTON   "OK",IDOK,97,128,50,14
    PUSHBUTTON      "Cancelar",IDCANCEL,156,128,50,14
END

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

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,-1,"Static",SS_BITMAP | SS_CENTERIMAGE,0,
                    0,213,37
    LTEXT           "IDS_MESSAGEFORMAT",IDC_MESSAGE,8,48,199,8,NOT WS_GROUP
    LTEXT           "&User name:",-1,8,62,72,12,SS_CENTERIMAGE
    CONTROL         "",IDC_USERNAME,"ComboBoxEx32",CBS_DROPDOWN |
                    CBS_NOINTEGRALHEIGHT | WS_TABSTOP,80,62,126,87
    LTEXT           "&Password:",-1,8,80,72,12,SS_CENTERIMAGE
    EDITTEXT        IDC_PASSWORD,80,80,126,12,ES_PASSWORD | ES_AUTOHSCROLL
    CONTROL         "&Lembrar a password",IDC_SAVE,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,80,98,126,12
    DEFPUSHBUTTON   "OK",IDOK,97,128,50,14
    PUSHBUTTON      "Cancelar",IDCANCEL,156,128,50,14
END


LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

STRINGTABLE DISCARDABLE
{
    IDS_TITLEFORMAT     "Conectar a %s"
    IDS_MESSAGEFORMAT   "Conectando a %s"
    IDS_INCORRECTPASSWORDTITLE  "Logon mal sucedido"
    IDS_INCORRECTPASSWORD       "Certifique-se de que nome de usuário\ne senha estão corretos."
    IDS_CAPSLOCKONTITLE "Caps Lock ligado"
    IDS_CAPSLOCKON      "Ter o Caps Lock ligado pode provocar a introdução incorreta da sua senha.\n\nPressione a tecla Caps Lock no seu teclado para desligar o Caps Lock antes\nde introduzir a senha."
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

STRINGTABLE DISCARDABLE
{
    IDS_TITLEFORMAT     "Ligar a %s"
    IDS_MESSAGEFORMAT   "A ligar a %s"
    IDS_INCORRECTPASSWORDTITLE  "Logon mal sucedido"
    IDS_INCORRECTPASSWORD       "Verifique que o seu nome de utilizador\ne password estão correctos."
    IDS_CAPSLOCKONTITLE "Caps Lock ligado"
    IDS_CAPSLOCKON      "Tendo o Caps Lock ligado pode provocar que introduza a sua password incorrectamente.\n\nPressione a tecla Caps Lock no seu teclado para desligar o Caps Lock antes\nde introduzir a password."
}
