/*
 * Help Viewer
 *
 * Copyright 1996 Ulrich Schmid
 * Copyright 2002 Sylvain Petreolle <spetreolle@yahoo.fr>
 *
 * 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 "winhelp_res.h"

#pragma code_page(65001)

LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT

/* Menu */

MAIN_MENU MENU
{
 POPUP "파일(&F)" {
  MENUITEM "열기(&O)...", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "인쇄(&P)", MNID_FILE_PRINT
  MENUITEM "프린터 설정(&S)...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "종료(&E)", MNID_FILE_EXIT
 }
 POPUP "편집(&E)" {
   MENUITEM "복사(&C)...", MNID_EDIT_COPYDLG
   MENUITEM SEPARATOR
   MENUITEM "주석(&A)...", MNID_EDIT_ANNOTATE
 }
 POPUP "책갈피(&B)" {
   MENUITEM "정의(&D)...", MNID_BKMK_DEFINE
 }
 POPUP "옵션(&O)" {
   POPUP	"가능한 도움말 보이기"
   BEGIN
     MENUITEM "기본",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "보이기",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "보여주지 않기",	MNID_OPTS_HELP_NONVISIBLE
  END
  MENUITEM "기록",		MNID_OPTS_HISTORY
  POPUP    "글꼴"
  BEGIN
    MENUITEM "작게",		MNID_OPTS_FONTS_SMALL
    MENUITEM "보통",    	MNID_OPTS_FONTS_NORMAL
    MENUITEM "크게",     	MNID_OPTS_FONTS_LARGE
  END
  MENUITEM "시스템 색상 사용",	MNID_OPTS_SYSTEM_COLORS
 }
 POPUP "도움말(&H)" {
   MENUITEM "도움말 사용법(&O)", MNID_HELP_HELPON
   MENUITEM "항상 위(&T)", MNID_HELP_HELPTOP
   MENUITEM SEPARATOR
   MENUITEM "Wine 도움말 정보(&I)...", MNID_HELP_ABOUT
 }
}


IDD_INDEX DIALOG 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 9, "MS Shell Dlg"
CAPTION "인덱스"
{
    LISTBOX IDC_INDEXLIST, 10, 10, 180, 150, LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_BORDER
}

IDD_SEARCH DIALOG 0, 0, 200, 190
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 9, "MS Shell Dlg"
CAPTION "찾기"
{
    LTEXT  "아직 구현되지 않음", -1, 10, 10, 180, 150
}

/* Strings */

STRINGTABLE
{
STID_WINE_HELP, 	"Wine 도움말"
STID_WHERROR, 		"에러"
STID_WARNING,  		"경고"
STID_INFO,  		"정보"
STID_NOT_IMPLEMENTED, 	"구현되지 않았음"
STID_HLPFILE_ERROR_s, 	"도움말 파일 `%s'를 읽는 도중 오류 발생"
STID_INDEX, 		"목차(&C)"
STID_CONTENTS,		"요약"
STID_BACK, 		"뒤로(&B)"
STID_ALL_FILES, 	"모든 파일 (*.*)"
STID_HELP_FILES_HLP, 	"도움말 파일 (*.hlp)"
STID_FILE_NOT_FOUND_s	"%s을 찾을 수 없습니다'. 이 파일을 직접 찾겠습니까?"
STID_NO_RICHEDIT	"richedit  구현을 찾을수 업습니다.. 취소중"
STID_PSH_INDEX,		"도움말 목차: "
}

CONTEXT_MENU MENU
BEGIN
	POPUP ""
	BEGIN
		MENUITEM "주석...",       MNID_CTXT_ANNOTATE
		MENUITEM "복사",                MNID_CTXT_COPY
		MENUITEM "인쇄...",            MNID_CTXT_PRINT
		POPUP    "글꼴"
		BEGIN
			MENUITEM "좁게",       MNID_CTXT_FONTS_SMALL
			MENUITEM "보통",      MNID_CTXT_FONTS_NORMAL
			MENUITEM "넓게",       MNID_CTXT_FONTS_LARGE
		END
		POPUP   "도움말  항상 보이기"
		BEGIN
			MENUITEM "기본",     MNID_CTXT_HELP_DEFAULT
			MENUITEM "보이기",     MNID_CTXT_HELP_VISIBLE
			MENUITEM "안 보이기", MNID_CTXT_HELP_NONVISIBLE
		END
		MENUITEM "시스템 색상 사용",   MNID_CTXT_SYSTEM_COLORS
	END
END
