/*
 * English resources for the Internet control panel applet
 *
 * 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 "inetcpl.h"

#pragma code_page(65001)

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

STRINGTABLE DISCARDABLE
BEGIN
    IDS_CPL_NAME        "Configurações da Internet"
    IDS_CPL_INFO        "Configurar o Wine Internet Browser e opções relacionadas"
END

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

/* "General" propsheet */
IDD_GENERAL DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Geral"
BEGIN

    GROUPBOX    " Página inicial ", IDC_STATIC, 4, 4, 312, 52
    LTEXT       "Escolha o endereço que será usado como página inicial.",
                IDC_STATIC, 58, 10, 252, 10
    EDITTEXT    IDC_HOME_EDIT, 58, 22, 252, 12, WS_VISIBLE | ES_AUTOHSCROLL
    PUSHBUTTON  "Página &atual", IDC_HOME_CURRENT, 58, 36, 80, 14
    PUSHBUTTON  "Página &padrão", IDC_HOME_DEFAULT, 144, 36, 80, 14
    PUSHBUTTON  "Página em &branco", IDC_HOME_BLANK, 230, 36, 80, 14

END

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

/* "Content" propsheet */
IDD_CONTENT DIALOG  0, 0, 320, 220
STYLE WS_CAPTION | WS_CHILD | WS_DISABLED
FONT 8, "MS Shell Dlg"
CAPTION "Conteúdo"
BEGIN

    GROUPBOX    " Certificados ", IDC_STATIC, 4, 4, 312, 50
    LTEXT       "Certificados são usados para sua identificação pessoal e para identificar certificados de autoridades e editores.",
                IDC_STATIC, 58, 14, 252, 18
    PUSHBUTTON  "Certificados...", IDC_CERT, 146, 34, 80, 14
    PUSHBUTTON	"Editores...", IDC_CERT_PUBLISHER, 230, 34, 80, 14

END
