/*
 * 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 "resource.h"

#pragma code_page(65001)

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

STRINGTABLE DISCARDABLE
{
    IDS_HTMLDISABLED    "A interpretação de HTML está desativada."
    IDS_HTMLDOCUMENT    "Documento HTML"
    IDS_DOWNLOADING     "Fazendo o download..."
    IDS_INSTALLING      "Instalando..."
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

STRINGTABLE DISCARDABLE
{
    IDS_HTMLDISABLED    "A interpretação de HTML está desactivada."
    IDS_HTMLDOCUMENT    "Documento HTML"
    IDS_DOWNLOADING     "A descarregar..."
    IDS_INSTALLING      "A instalar..."
}


LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE  0, 0, 260, 95
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Instalador Wine Gecko"
FONT 8, "MS Shell Dlg"
{
    LTEXT "O Wine não pôde encontrar o pacote Gecko que é necessário para aplicações com HTML embutido " \
          "funcionarem corretamente. O Wine pode automaticamente efetuar o download e instalá-lo para você.\n\n" \
          "Nota: é recomendável usar os pacotes da sua distribuição ao invés disso. \n\
Veja http://wiki.winehq.org/Gecko para mais detalhes.",
          ID_DWL_STATUS, 10, 10, 240, 60, SS_LEFT
    CONTROL "Progresso", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12
    DEFPUSHBUTTON "&Instalar", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP
    PUSHBUTTON "&Cancelar", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

ID_DWL_DIALOG DIALOG LOADONCALL MOVEABLE DISCARDABLE  0, 0, 260, 95
STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Instalador Wine Gecko"
FONT 8, "MS Shell Dlg"
{
    LTEXT "O Wine não conseguiu encontrar o pacote Gecko que é necessário para aplicações com HTML embutido " \
          "funcionarem corretamente. O Wine pode automaticamente efetuar o download e instalá-lo por si.\n\n" \
          "Nota: é recomendável usar os pacotes da sua distribuição em vez disso. \n\
Veja http://wiki.winehq.org/Gecko para mais detalhes.",
          ID_DWL_STATUS, 10, 10, 240, 50, SS_LEFT
    CONTROL "Progresso", ID_DWL_PROGRESS, PROGRESS_CLASSA, WS_BORDER|PBS_SMOOTH, 10, 50, 240, 12
    DEFPUSHBUTTON "&Instalar", ID_DWL_INSTALL, 200, 70, 50, 15, WS_GROUP | WS_TABSTOP
    PUSHBUTTON "&Cancelar", IDCANCEL, 140, 70, 50, 15, WS_GROUP | WS_TABSTOP
}


LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN

IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65
STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Hiperlink"
FONT 8, "MS Shell Dlg"
{
    GROUPBOX "Informação do Hiperlink", -1, 5, 5, 190, 55
    LTEXT "&Tipo:", -1, 10, 22, 20, 10
    COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
    LTEXT "&URL:", -1, 10, 42, 20, 10
    EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "Cancelar", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}

LANGUAGE LANG_PORTUGUESE, SUBLANG_PORTUGUESE

IDD_HYPERLINK DIALOG LOADONCALL MOVEABLE DISCARDABLE 0, 0, 250, 65
STYLE DS_CENTER | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Hiperligação"
FONT 8, "MS Shell Dlg"
{
    GROUPBOX "Informação da Hiperligação", -1, 5, 5, 190, 55
    LTEXT "&Tipo:", -1, 10, 22, 20, 10
    COMBOBOX IDC_TYPE, 35, 20, 45, 100, WS_TABSTOP | WS_GROUP | WS_VSCROLL | CBS_DROPDOWNLIST | CBS_HASSTRINGS
    LTEXT "&URL:", -1, 10, 42, 20, 10
    EDITTEXT IDC_URL, 35, 40, 150, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "OK", IDOK, 200, 10, 45, 14, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "Cancelar", IDCANCEL, 200, 28, 45, 14, WS_GROUP | WS_TABSTOP
}


LANGUAGE LANG_PORTUGUESE, SUBLANG_NEUTRAL

ID_PROMPT_DIALOG DIALOG 0, 0, 200, 90
STYLE WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION ""
FONT 8, "MS Shell Dlg"
{
    LTEXT "", ID_PROMPT_PROMPT, 10, 10, 180, 30
    EDITTEXT ID_PROMPT_EDIT, 10, 45, 180, 14, ES_AUTOHSCROLL | WS_BORDER | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "OK", IDOK, 40, 65, 45, 15, BS_DEFPUSHBUTTON | WS_GROUP | WS_TABSTOP
    PUSHBUTTON "Cancelar", IDCANCEL, 115, 65, 45, 15, WS_GROUP | WS_TABSTOP
}
