/*
 * 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
 */

/* UTF-8 */
#pragma code_page(65001)

/* Menu */

MAIN_MENU MENU LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
{
 POPUP "ファイル(&F)" {
  MENUITEM "開く(&O)", MNID_FILE_OPEN
  MENUITEM SEPARATOR
  MENUITEM "印刷(&P)", MNID_FILE_PRINT
  MENUITEM "プリンタの設定(&S)...", MNID_FILE_SETUP
   MENUITEM SEPARATOR
  MENUITEM "終了(&X)", 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	"Help always visible"
   BEGIN
     MENUITEM "Default",	MNID_OPTS_HELP_DEFAULT
     MENUITEM "Visible",	MNID_OPTS_HELP_VISIBLE
     MENUITEM "Non visible",	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 "情報(&I)...", MNID_HELP_ABOUT
#ifdef WINELIB
   MENUITEM "WINE について(&A)", MNID_HELP_WINE
#endif
 }
}

IDD_INDEX DIALOG DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
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 DISCARDABLE 0, 0, 200, 190 LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
FONT 9, "MS Shell Dlg"
CAPTION "検索"
{
    LTEXT  "未実装", -1, 10, 10, 180, 150
}

/* Strings */
STRINGTABLE DISCARDABLE LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
{
STID_WINE_HELP, 	"WINE ヘルプ"
STID_WHERROR, 		"エラー"
STID_WARNING,  		"警告"
STID_INFO,  		"情報"
STID_NOT_IMPLEMENTED, 	"非実装"
STID_HLPFILE_ERROR_s, 	"ヘルプファイル `%s' を読み込んでいるときにエラー"
STID_INDEX, 		"索引(&I)"
STID_CONTENTS,		"概要"
STID_BACK, 		"戻る(&B)"
STID_ALL_FILES, 	"すべてのファイル (*.*)"
STID_HELP_FILES_HLP, 	"ヘルプ ファイル (*.hlp)"
STID_FILE_NOT_FOUND_s	"'%s' が見つかりません。自分でこのファイルを探しますか?"
STID_NO_RICHEDIT	"リッチエディット実装が見つかりません... 終了します"
STID_PSH_INDEX,		"ヘルプ トピック: "
}

CONTEXT_MENU MENU LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT
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   "Help always visible"
		BEGIN
			MENUITEM "Default",     MNID_CTXT_HELP_DEFAULT
			MENUITEM "Visible",     MNID_CTXT_HELP_VISIBLE
			MENUITEM "Non visible", MNID_CTXT_HELP_NONVISIBLE
		END
		MENUITEM "システム カラーを使う",   MNID_CTXT_SYSTEM_COLORS
	END
END

#pragma code_page(default)
