/*
 * Spanish resources for shdocvw
 *
 * Copyright 2010 José Rostagno
 *
 * 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_SPANISH, SUBLANG_NEUTRAL

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "Abrir URL"
FONT 8, "MS Shell Dlg"
{
    LTEXT "Especifique la dirección que desea abrir en Internet Explorer",-1,25, 5, 150,15
    LTEXT "Abrir:", -1, 2, 32, 20, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13
    DEFPUSHBUTTON "&Aceptar", IDOK, 25, 50, 50, 15
    PUSHBUTTON "&Cancelar", IDCANCEL, 85, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "&Archivo"
    {
        POPUP "&Nuevo"
        {
            MENUITEM "&Ventana",                 ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "&Abrir...",                    ID_BROWSE_OPEN
        MENUITEM "&Guardar",                       ID_BROWSE_SAVE
        MENUITEM "Guardar &como...",                 ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "&Formato de impresión...",            ID_BROWSE_PRINT_FORMAT
        MENUITEM "&Imprimir...",                   ID_BROWSE_PRINT
        MENUITEM "&Vista previa de impresión...",           ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "&Propiedades...",              ID_BROWSE_PROPERTIES
    }
    POPUP "&Ver"
    {
        POPUP "&Barra de herramientas"
        {
            MENUITEM "Barra &estándar",           ID_BROWSE_BAR_STD
            MENUITEM "Barra de &direcciones",            ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "&Favoritos"
    {
        MENUITEM "&Añadir a Favoritos...",        ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "A&yuda"
    {
        MENUITEM "Acerca &de Internet Explorer...", ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "Atrás"
    IDS_TB_FORWARD          "Adelante"
    IDS_TB_STOP             "Detener"
    IDS_TB_REFRESH          "Recargar"
    IDS_TB_HOME             "Inicio"
    IDS_TB_PRINT            "Imprimir"
}

STRINGTABLE
{
    IDS_ADDRESS             "Dirección"
}
