/*
 * Korean resources for MSI
 *
 * Copyright 2005 Mike McCormack
 * Copyright 2010 Detlef Riekenberg
 * 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 "windef.h"

#pragma code_page(65001)

LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT

STRINGTABLE DISCARDABLE
{
	4 " 지정한 설치 패키지를 열 수 없습니다. 파일 경로를 확인하고 다시 시도하십시오."
	5 "%s  경로를 찾을수 없습니다"
	9 "디스크 %s 삽입"
	10 "Windows Installer %s\n\n" \
	"사용법:\n" \
	"msiexec 명령 {필수 매개변수}  [선택적 매개변수]\n\n" \
	"제품 설치:\n" \
	"\t/i {package|productcode} [property]\n" \
	"\t/package {package|productcode} [property]\n" \
	"\t/a package [property]\n" \
	"설치 복구:\n" \
	"\t/f[p|o|e|d|c|a|u|m|s|v] {package|productcode}\n" \
	"제품 제거:\n" \
	"\t/uninstall {package|productcode} [property]\n" \
	"\t/x {package|productcode} [property]\n" \
	"제품 알리기:\n" \
	"\t/j[u|m] package [/t transform] [/g languageid]\n" \
	"패치 추가:\n" \
	"\t/p patchpackage [property]\n" \
	"\t/p patchpackage /a package [property]\n" \
	"위의 명령어를 위한 Log 와 UI 한정자 :\n" \
	"\t/l[*][i|w|e|a|r|u|c|m|o|p|v|][+|!] logfile\n" \
	"\t/q{|n|b|r|f|n+|b+|b-}\n" \
	"MSI 서비스  등록:\n" \
	"\t/y\n" \
	"MSI 서비스 등록 해제:\n" \
	"\t/z\n" \
	"도움말  보기:\n" \
	"\t/help\n" \
	"\t/?\n"
	11 "%s를 포함하는 폴더를 입력하세여"
	12 "빠진 부분(feature)을 위한 설치 원본"
	13 "빠진 부분(feature)을 위한 네트워크 드라이브"
	14 "부분(feature)에서:"
	15 " %s를 포함하는 폴더 선택"
}
