/*
 * Copyright 2001 Eric Pouech
 * Copyright 2005,2007,2011 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 "wineconsole_res.h"

#pragma code_page(65001)

LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT

STRINGTABLE
BEGIN
IDS_EDIT,		"편집(&E)"
IDS_DEFAULT,		"기본으로 설정(&D)"
IDS_PROPERTIES,		"속성(&P)"
IDS_MARK,		"&Mark"
IDS_COPY,		"복사(&C)"
IDS_PASTE,		"붙여넣기(&P)"
IDS_SELECTALL,		"모두 선택(&S)"
IDS_SCROLL,		"스크롤(&R)"
IDS_SEARCH,		"찾기(&E)"
IDS_FNT_DISPLAY,	"각각의 글자는 %ld  픽셀 너비에 %ld 픽셀 높이를 가집니다"
IDS_FNT_PREVIEW,	"이것은 테스트입니다"
IDS_DLG_TIT_DEFAULT,    "설치 - 기본 설정"
IDS_DLG_TIT_CURRENT,    "설치 - 현재 설정"
IDS_DLG_TIT_ERROR,	"설정 에러"
IDS_DLG_ERR_SBWINSIZE, 	"스크린 버퍼 크기는 반드시 창보다 같거나 커야합니다."

IDS_CMD_INVALID_EVENT_ID  "wineconsole: 이벤트 id를 붙여 넣을 수 없습니다\n"
IDS_CMD_INVALID_BACKEND    "wineconsole: 올바르지 않은 백엔드\n"
IDS_CMD_INVALID_OPTION    "wineconsole: 이해할수 없는 명령 라인 옵션\n"
IDS_CMD_ABOUT              "Wine 콘솔에서 프로그램 시작\n"
IDS_CMD_LAUNCH_FAILED      "wineconsole: 풀그림 %s 시작 실패.\n"\
                           "이 명령은 올바르지 않습니다.\n"

IDS_USAGE_HEADER           "\n사용법:\n  wineconsole [옵션] <명령>\n\n옵션:\n"
IDS_USAGE_BACKEND          "  --backend={user|curses}  사용자가 새 창을 열 것인지,\n"\
                           "                            curses가 Wine 콘솔처럼 현재 터미널에  나타낼 것인지 선택\n"
IDS_USAGE_COMMAND          "  <명령>                 The Wine 프로그램은 콘솔을 통해서 시작됨\n"
IDS_USAGE_FOOTER           "\n예:\n  wineconsole cmd\nWine 콘솔에서 Wine 명령 프롬프트 시작\n\n"

END

IDD_OPTION DIALOG 36, 24, 208, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " 옵션 "
FONT 9, "MS Shell Dlg"
{
	GROUPBOX "커서 크기", -1, 10, 11, 60, 44, BS_GROUPBOX
	AUTORADIOBUTTON "작게(&S)", IDC_OPT_CURSOR_SMALL, 14, 23, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "중간(&M)", IDC_OPT_CURSOR_MEDIUM, 14, 33, 44, 10, WS_TABSTOP
	AUTORADIOBUTTON "크게(&L)", IDC_OPT_CURSOR_LARGE, 14, 43, 44, 10, WS_TABSTOP

	GROUPBOX "컨트롤", -1, 75, 11, 125, 44, BS_GROUPBOX
	LTEXT "팝업 메뉴", -1, 79, 23, 40, 10
	AUTOCHECKBOX "컨트롤(&C)", IDC_OPT_CONF_CTRL, 129, 23, 60, 10, WS_TABSTOP
	AUTOCHECKBOX "쉬프트(&H)", IDC_OPT_CONF_SHIFT, 129, 33, 60, 10, WS_TABSTOP
	LTEXT "빠른 편집", -1, 79, 43, 50, 10
	AUTOCHECKBOX "가능(&E)", IDC_OPT_QUICK_EDIT, 129, 43, 60, 10, WS_TABSTOP

	GROUPBOX "명령 히스토리", -1, 10, 57, 190, 35, BS_GROUPBOX
	LTEXT "다시 부르는 명령의 갯수(&N):", -1, 14, 67, 78, 18
	EDITTEXT IDC_OPT_HIST_SIZE, 92, 69, 31, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_OPT_HIST_SIZE_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	AUTOCHECKBOX "두번  제거(&R)", IDC_OPT_HIST_NODOUBLE, 130, 67, 50, 18, WS_TABSTOP|BS_MULTILINE
}

IDD_FONT DIALOG LOADONCALL MOVEABLE DISCARDABLE 36, 24, 140, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " 글꼴 "
FONT 9, "MS Shell Dlg"
{
	LTEXT "글꼴(&F)", -1, 5, 5, 24, 8
	LISTBOX IDC_FNT_LIST_FONT, 5, 18, 90, 42, LBS_SORT|WS_VSCROLL
	LTEXT "색상(&C)", -1, 100, 5, 50, 8
	CONTROL "", IDC_FNT_COLOR_FG, "WineConColorPreview", 0L, 100, 18, 48, 16
	CONTROL "", IDC_FNT_COLOR_BK, "WineConColorPreview", 0L, 100, 40, 48, 16
	LTEXT "크기;(&S)", -1, 158, 5, 40, 8
	LISTBOX IDC_FNT_LIST_SIZE, 158, 18, 40, 60, WS_VSCROLL
	CONTROL "", IDC_FNT_PREVIEW, "WineConFontPreview", 0L, 5, 60, 109, 40
	LTEXT "", IDC_FNT_FONT_INFO, 128, 76, 80, 18
}

IDD_CONFIG DIALOG 36, 24, 206, 105
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION " 설정 "
FONT 9, "MS Shell Dlg"
{
	GROUPBOX "버퍼 존", -1, 10, 11, 100, 42, BS_GROUPBOX
	LTEXT "너비(&W) :", -1, 14, 25, 54, 9
	EDITTEXT IDC_CNF_SB_WIDTH, 68, 23, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "높이(&H) :", -1, 14, 39, 54, 9
	EDITTEXT IDC_CNF_SB_HEIGHT, 68, 37, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_SB_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

	GROUPBOX "창 크기", -1, 10, 55, 100, 42
	LTEXT "너비(&I) :", -1, 14, 69, 54, 9
	EDITTEXT IDC_CNF_WIN_WIDTH, 68, 67, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_WIDTH_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0
	LTEXT "높이(&E) :", -1, 14, 83, 54, 9
	EDITTEXT IDC_CNF_WIN_HEIGHT, 68, 81, 36, 12, WS_TABSTOP|WS_BORDER|ES_NUMBER
	CONTROL "", IDC_CNF_WIN_HEIGHT_UD, "msctls_updown32", UDS_SETBUDDYINT|UDS_ALIGNRIGHT|UDS_AUTOBUDDY|UDS_ARROWKEYS|UDS_NOTHOUSANDS, 0, 0, 0, 0

	GROUPBOX "풀그림의 끝", -1, 115, 11, 80, 42, BS_GROUPBOX
	AUTOCHECKBOX "콘솔 닫기(&C)", IDC_CNF_CLOSE_EXIT, 119, 25, 72, 20, WS_TABSTOP

	GROUPBOX "에디션", -1, 115, 55, 80, 42
	COMBOBOX IDC_CNF_EDITION_MODE, 119, 69, 72, 20, CBS_DROPDOWNLIST|WS_VSCROLL|WS_TABSTOP
}

IDD_SAVE_SETTINGS DIALOG LOADONCALL MOVEABLE DISCARDABLE 20, 20, 170, 60
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION " 콘솔 매개변수"
FONT 9, "MS Shell Dlg"
{
	GROUPBOX "", -1, 10, 10, 150, 31, BS_GROUPBOX
	AUTORADIOBUTTON "나중의 세션을 위해 설정 보존", IDC_SAV_SAVE, 14, 15, 140, 10, WS_TABSTOP
	AUTORADIOBUTTON "오직 현재의 세션만 변경", IDC_SAV_SESSION, 14, 27, 140, 10, WS_TABSTOP

	PUSHBUTTON "확인", IDOK, 35, 45, 35, 12
	PUSHBUTTON "취소", IDCANCEL, 80, 45, 35, 12
}
