/*
 * Copyright 2003 Ulrich Czekalla for CodeWeavers
 * Copyright 2005,2007,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

UIINSERTOBJECT DIALOG  0, 0, 294, 151
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "객체 삽입"
FONT 9, "MS Shell Dlg"
BEGIN
    LISTBOX         IDC_OBJTYPELIST,82,19,131,66,LBS_SORT |
                    LBS_NOINTEGRALHEIGHT | WS_VISIBLE | WS_VSCROLL |
                    WS_TABSTOP
    LTEXT           "객체 타입:",IDC_OBJTYPELBL,82,7,53,8,WS_VISIBLE
    DEFPUSHBUTTON   "확인",IDOK,221,7,66,14
    PUSHBUTTON      "취소",IDCANCEL,221,24,66,14
    GROUPBOX        "결과",IDC_RESULT,7,103,208,41
    CONTROL         "새로 만들기",IDC_CREATENEW,"Button",BS_AUTORADIOBUTTON |
                    WS_GROUP,7,20,62,10
    CONTROL         "컨트롤 만들기",IDC_CREATECONTROL,"Button",
                    BS_AUTORADIOBUTTON | NOT WS_VISIBLE,7,54,62,10
    CONTROL         "파일로부터 만들기",IDC_CREATEFROMFILE,"Button",
                    BS_AUTORADIOBUTTON,7,37,67,10
    LTEXT           "",IDC_RESULTDESC,49,112,159,23
    PUSHBUTTON      "컨트롤 추가(&A)...",IDC_ADDCONTROL,81,88,63,14,NOT WS_VISIBLE
    CONTROL         "아이콘으로 보기",IDC_ASICON,"Button",BS_AUTOCHECKBOX |
                    WS_TABSTOP | NOT WS_VISIBLE,223,58,64,10
    PUSHBUTTON      "찾기...",IDC_BROWSE,155,88,50,14,NOT WS_VISIBLE
    LTEXT           "파일:",IDC_FILELBL,58,21,20,8, NOT WS_VISIBLE
    EDITTEXT        IDC_FILE,83,37,132,13,ES_AUTOHSCROLL | NOT WS_VISIBLE
END

STRINGTABLE
{
  IDS_RESULTOBJDESC	"새  %s 객체를 문서에 삽입"
  IDS_RESULTFILEOBJDESC	"작성한 풀그림을 사용하여 활성화시킬수 있는 객체를 문서파일 내용으로 삽입하시오."
  IDS_BROWSE            "찾기"
  IDS_NOTOLEMOD         "이 파일은 올바른 OLE모듈이 아닌거로 보입니다. OLE컨트롤을 등록할수 없습니다."
  IDS_NOTOLEMODCAPTION  "컨트롤 더하기"
}

IDD_PASTESPECIAL4 DIALOG 3, 15, 299, 140
STYLE DS_MODALFRAME | DS_SETFONT | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "특별하게  붙여넣기"
FONT 9, "MS Shell Dlg"
BEGIN
    LTEXT         "원본:", -1, 6, 9, 30, 8, WS_VISIBLE | WS_GROUP
    CONTROL       "붙여넣기(&P)", IDC_PS_PASTE, "Button", BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE,
                  1, 44, 55, 10
    CONTROL       "링크로 붙여넣기(&L)", IDC_PS_PASTELINK, "Button", BS_AUTORADIOBUTTON | WS_VISIBLE,
                  1, 61, 69, 10
    LTEXT         "다른 이름으로(&A):", -1, 73, 25, 59, 8, WS_VISIBLE | WS_GROUP
    LISTBOX       IDC_PS_PASTELIST,     73, 36, 150, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_PASTELINKLIST, 73, 36, 150, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | NOT WS_VISIBLE
    LISTBOX       IDC_PS_DISPLAYLIST,   73, 36, 150, 57, LBS_NOTIFY | LBS_USETABSTOPS | WS_VSCROLL | WS_BORDER | WS_VISIBLE
    CONTROL       "확인", IDOK, "Button", BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP | WS_VISIBLE, 226, 6, 66, 14
    CONTROL       "취소", IDCANCEL, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 226, 23, 66, 14
    CONTROL       "도움말(&H)", IDC_OLEUIHELP, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 226, 42, 66, 14
    CONTROL       "아이콘으로 보기(&D)", IDC_PS_DISPLAYASICON, "Button", BS_AUTOCHECKBOX | WS_TABSTOP | WS_VISIBLE, 226, 59, 70, 14
    CONTROL       "", IDC_PS_ICONDISPLAY, "Static", SS_ICON | WS_VISIBLE, 224, 75, 66, 44
    CONTROL       "아이콘 바꾸기(&I)...", IDC_PS_CHANGEICON, "Button", BS_PUSHBUTTON | WS_TABSTOP | WS_VISIBLE, 224, 123, 66, 14
    CONTROL       "", IDC_PS_RESULTIMAGE, "Static", SS_ICON | WS_VISIBLE, 8, 101, 42, 34
    CONTROL       "<< 결과 텍스트는 여기다가 >>", IDC_PS_RESULTTEXT, "Static", SS_NOPREFIX | WS_VISIBLE, 54, 100, 159, 35
    CONTROL       "결과", -1, "Button", BS_GROUPBOX | WS_GROUP | WS_VISIBLE, 6, 90, 212, 48
    CONTROL       "", IDC_PS_SOURCETEXT, "Edit", ES_READONLY | ES_AUTOHSCROLL | WS_VISIBLE, 37, 9, 180, 8
END

STRINGTABLE
{
    IDS_PS_PASTE_DATA                     "당신의 문서 %s에 클립보드의 내용 삽입하기."
    IDS_PS_PASTE_OBJECT                   "당신의 문서에 클립보드의 내용들을 첨부하면  %s를 사용해서 이것을 실행할 수 있습니다."
    IDS_PS_PASTE_OBJECT_AS_ICON           "당신의 문서에 클립보드의 내용들을 첨부하면  %s를 사용해서 이것을 실행할 수 있습니다. 이것은 아이콘으로 나타내질 겁니다."
    IDS_PS_PASTE_LINK_DATA                "당신의 문서 %s에 클립보드의 내용 삽입하기.  이 데이터는 원본 파일에 연결되어 있어서 파일이 바뀌면 당신의 문서도 바뀔겁니다."
    IDS_PS_PASTE_LINK_OBJECT              "당신의 문서에 클립보드에 있는 그림을 집어넣습니다.  이 그림은 원본 파일에 연결되어 있어서 파일이 바뀌면 당신의 문서도 바뀔겁니다."
    IDS_PS_PASTE_LINK_OBJECT_AS_ICON      "당신의 문서에 클립보드에 있는 단축아이콘을 집어넣습니다.  이 단축아이콘은 원본 파일에 연결되어 있어서 파일이 바뀌면 당신의 문서도 바뀔겁니다t."
    IDS_PS_NON_OLE                        "당신의 문서에 클립보드의 내용 삽입하기."
    IDS_PS_UNKNOWN_TYPE                   "알수 없는 형식"
    IDS_PS_UNKNOWN_SRC                    "알수 없는 원본"
    IDS_PS_UNKNOWN_APP                    "내가 만든 프로그램"
}
