/*
 * Copyright 2010 Alexander N. Sørnes <alex@thehandofagony.com>
 * Copyright 2010 YunSOng Hwang
  *
 * 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_KOREAN, SUBLANG_DEFAULT

IDD_BROWSE_OPEN DIALOG 10, 10, 200, 70
STYLE DS_MODALFRAME | WS_CAPTION
CAPTION "URL 열기"
FONT 8, "MS Shell Dlg"
{
    LTEXT "인터넷 익스플로어로 열 URL 지정",-1,25, 5, 150,15
    LTEXT "열기:", -1, 2, 32, 20, 15
    EDITTEXT IDC_BROWSE_OPEN_URL, 25, 30, 160, 13
    DEFPUSHBUTTON "확인(&O)", IDOK, 25, 50, 50, 15
    PUSHBUTTON "취소(&C)", IDCANCEL, 85, 50, 50, 15
}

IDR_BROWSE_MAIN_MENU MENU
{
    POPUP "파일(&F)"
    {
        POPUP "새 작업(&N)"
        {
            MENUITEM "창(&W)",                 ID_BROWSE_NEW_WINDOW
        }
        MENUITEM "열기(&O)...",                    ID_BROWSE_OPEN
        MENUITEM "저장(&S)",                       ID_BROWSE_SAVE
        MENUITEM "다른 이름으로 저장(&A)...",                 ID_BROWSE_SAVE_AS
        MENUITEM SEPARATOR
        MENUITEM "인쇄 형식(&F)...",            ID_BROWSE_PRINT_FORMAT
        MENUITEM "인쇄(&I)...",                   ID_BROWSE_PRINT
        MENUITEM "인쇄 미리보기(&W)...",           ID_BROWSE_PRINT_PREVIEW
        MENUITEM SEPARATOR
        MENUITEM "속성(&P)...",              ID_BROWSE_PROPERTIES
        MENUITEM "닫기(&C)",                      ID_BROWSE_QUIT
    }
    POPUP "보기(&V)"
    {
        POPUP "도구바(&T)"
        {
            MENUITEM "표준 바(&S)",           ID_BROWSE_BAR_STD
            MENUITEM "주소 바(&A)",            ID_BROWSE_BAR_ADDR
        }
    }
    POPUP "즐겨찾기(&F)"
    {
        MENUITEM "즐겨찾기 추가(&A)...",        ID_BROWSE_ADDFAV
        MENUITEM SEPARATOR
    }
    POPUP "도움말(&H)"
    {
        MENUITEM "인터넷 익스플로어 정보(&A)...", ID_BROWSE_ABOUT
    }
}

STRINGTABLE
{
    IDS_TB_BACK             "뒤로"
    IDS_TB_FORWARD          "앞으로"
    IDS_TB_STOP             "멈추기"
    IDS_TB_REFRESH          "새로 고침"
    IDS_TB_HOME             "홈"
    IDS_TB_PRINT            "인쇄"
}

STRINGTABLE
{
    IDS_ADDRESS             "주소"
}
