changeset 65:4416cfac86ae

Convert EUC-JP files to UTF8
author Thibaut Girka <thib@sitedethib.com>
date Fri, 26 Nov 2010 10:53:15 +0100 (2010-11-26)
parents 045ca45f9610
children d112357a0ec1
files font/font_face.cc font/font_layout.cc font/font_peer_ft2.cc font/font_peer_x11.cc font/text_stream.cc music2/koedec.cc music2/koedec_ogg.cc music2/movie.cc music2/music.cc music2/nwatowav.cc music2/wavfile.cc music2/wavfile.h scn2k/scn2k.h scn2k/scn2k_cmd.cc scn2k/scn2k_cmd.h scn2k/scn2k_flags.h scn2k/scn2k_grp.cc scn2k/scn2k_impl.cc scn2k/scn2k_impl.h scn2k/scn2k_text.cc scn2k/scn2kdump.cc scn2k/test.cc system/file.cc system/file.h system/file_impl.h system/system_config.cc system/system_config.h system/visarc.cc window/button.cc window/event.cc window/event.h window/menuitem.cc window/menuitem.h window/picture.cc window/picture.h window/render.cc window/render.h window/system.cc window/widget.cc window/widget.h xlovesys.cc
diffstat 41 files changed, 1308 insertions(+), 1308 deletions(-) [+]
line wrap: on
line diff
--- a/font/font_face.cc
+++ b/font/font_face.cc
@@ -49,7 +49,7 @@ namespace XKFont {
 	{
 		cache = new Cache;
 
-		/* name: ';' ���ڤ��ʣ�������ǽ */
+		/* name: ';' 区切りで複数指定可能 */
 		char* name = new char[strlen(name_orig)+1];
 		while(*name_orig != 0) {
 			const char* next_name = strchr(name_orig, ';');
@@ -137,7 +137,7 @@ namespace XKFont {
 			return face;
 		} catch(...) {
 			std::cerr << "Cannot create font face; font "<<pimpl->fontname<<", size "<<size<<std::endl;
-			/* �̤��礭����õ�� */
+			/* 別の大きさを探す */
 			int i;
 			for (i=0; i<size; i++) {
 				if (cache.find(size-i) != cache.end()) return cache[size-i];
@@ -153,7 +153,7 @@ namespace XKFont {
 					return face;
 				} catch(...) {};
 			}
-			/* ���Ĥ���ʤ� */
+			/* 見つからない */
 			throw;
 		}
 	}
--- a/font/font_layout.cc
+++ b/font/font_layout.cc
@@ -1,5 +1,5 @@
 /*  layout2.cc
- *     �ƥ����Ȥζ�§�������쥤�����Ȥʤɤ�Ԥ�
+ *     テキストの禁則処理、レイアウトなどを行う
  */
 /*
  * Copyright (c) 2004-2006  Kazunori "jagarl" Ueno
@@ -37,37 +37,37 @@ using namespace std;
 #include "font.h"
 #include "text.h"
 
-const int line_skip = 1; // �ԤȹԤδ֤δֳ�
-const int ruby_textskip = 0; // ʸ���ȥ�Ӥδ֤δֳ�
-const int ruby_lineskip = 1; // ��Ӥ�����Ȥ��˹Դ֤˲ä�����
-const double ruby_scale = 0.4; // ��ӤΥ�������
+const int line_skip = 1; // 行と行の間の間隔
+const int ruby_textskip = 0; // 文字とルビの間の間隔
+const int ruby_lineskip = 1; // ルビがあるときに行間に加える値
+const double ruby_scale = 0.4; // ルビのスケール
 
 class TextGlyphStreamHelper;
 
 enum KinsokuType { KinsokuHead = 1, KinsokuTail = 2};
 static int kinsoku_table1[] = {
 /* 0 1 2 3 4 5 6 7     0 1 2 3 4 5 6 7 */
-   0,0,2,2,2,2,0,0, /* �ء������������� */
-   0,2,2,0,0,0,0,0, /* ���������������� */
-   0,0,0,0,0,0,0,0, /* ���������������� */
-   0,0,0,0,2,0,0,0, /* ���������������� */
-   0,2,0,0,2,2,1,2, /* �����¡áġšơ� */
-   1,2,1,2,1,2,1,2, /* �ȡɡʡˡ̡͡Ρ� */
-   1,2,1,2,1,2,1,2, /* �Сѡҡӡԡա֡� */
-   1,2,1,2,0,0,0,0, /* �ء١ڡۡܡݡޡ� */
-   0,0,0,0,0,0,0,0, /* ��������� */
-   0,0,0,0,0,0,0,0, /* ���������� */
-   0,0,0,0,0,0,0,0, /* ������������ */
-   0,0,0,0,0,0,0,0, /* ���������������� */
+   0,0,2,2,2,2,0,0, /* X 、。,.・: */
+   0,2,2,0,0,0,0,0, /* ;?!゛゜´`¨ */
+   0,0,0,0,0,0,0,0, /* ^ ̄_ヽヾゝゞ〃 */
+   0,0,0,0,2,0,0,0, /* 仝々〆〇ー―‐/ */
+   0,2,0,0,2,2,1,2, /* \〜‖|…‥‘’ */
+   1,2,1,2,1,2,1,2, /* “”()〔〕[] */
+   1,2,1,2,1,2,1,2, /* {}〈〉《》「」 */
+   1,2,1,2,0,0,0,0, /* 『』【】+−±× */
+   0,0,0,0,0,0,0,0, /* ÷=≠<>≦≧∞ */
+   0,0,0,0,0,0,0,0, /* ∴♂♀°′″℃¥ */
+   0,0,0,0,0,0,0,0, /* $¢£%#&*@ */
+   0,0,0,0,0,0,0,0, /* §☆★○●◎◇X */
    0
 };
 static int kinsoku_table2[] = {
-  0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,0, /* �������������������������������� */
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* �������������������������������� */
-  0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, /* �����¤äĤŤƤǤȤɤʤˤ̤ͤΤ� */
-  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* �ФѤҤӤԤդ֤פؤ٤ڤۤܤݤޤ� */
-  0,0,0,2,0,2,0,2,0,0,0,0,0,0,2,0, /* ������������������ */
-  0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0, /* ���������� */
+  0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,0, /*  ぁあぃいぅうぇえぉおかがきぎく */
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ぐけげこごさざしじすずせぜそぞた */
+  0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0, /* だちぢっつづてでとどなにぬねのは */
+  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* ばぱひびぴふぶぷへべぺほぼぽまみ */
+  0,0,0,2,0,2,0,2,0,0,0,0,0,0,2,0, /* むめもゃやゅゆょよらりるれろゎわ */
+  0,0,0,0,0,2,2,0,0,0,0,0,0,0,0,0, /* ゐゑをんヴヵヶ */
   0
 };
 
@@ -121,7 +121,7 @@ void TextGlyphStreamHelper::Init(TextGly
 
 TextGlyphStreamHelper::Iterator
 TextGlyphStreamHelper::Add(int& x, TextGlyphStreamHelper::Iterator begin, TextGlyphStreamHelper::Iterator end, int max_x) {
-	/* text �� glyph ���Ѵ����� */
+	/* text を glyph に変換する */
 	TextGlyph gl;
 	Iterator it;
 	gl.x = x; gl.y = 0; gl.r = r; gl.g = g; gl.b = b; gl.flag = TextGlyph::Flag(0); gl.is_rev = false;
@@ -164,12 +164,12 @@ TextGlyphStreamHelper::Iterator TextGlyp
 	if (it == send) return it;
 	if (it->type != TextElem::escape || it->impl.Escape.type != TextElem::ruby_start) return sbegin;
 	it++;
-	/* �ޤ�����ʸ���� */
+	/* まず、本文描画 */
 	int str_firstpos = data->size();
 	int str_width = 0;
 	it = Add(str_width, it, send);
 	if (it == send || it->type != TextElem::escape || it->impl.Escape.type != TextElem::ruby_startruby) {
-		// ���ꤨ�ʤ��Ϥ����������礨���ʤˤ⤷�ʤ��ǽ�λ
+		// ありえないはずだが、取り合えずなにもしないで終了
 		cerr << "TextGlyphStream::AddRuby : invalid operation; fallback to the upeer level"<<endl;
 		data->erase(data->begin()+str_firstpos, data->end());
 		return sbegin+1;
@@ -178,7 +178,7 @@ TextGlyphStreamHelper::Iterator TextGlyp
 	int str_lastpos = data->size()-1;
 	TextGlyph& str_first = data->begin()[str_firstpos];
 	TextGlyph& str_last = data->back();
-	// ���ˡ��ե���Ȥ��꤫���ƥ������
+	// 次に、フォントを取りかえてルビ描画
 	int ruby_firstpos = data->size();
 	XKFont::Face* save_font = face;
 	if (ruby_face == 0) ruby_face = font->FaceLoad(ruby_scale);
@@ -186,7 +186,7 @@ TextGlyphStreamHelper::Iterator TextGlyp
 	int ruby_width = 0;
 	it = Add(ruby_width, it, send);
 	if (it->type != TextElem::escape || it->impl.Escape.type != TextElem::ruby_end) {
-		/* ���ꤨ�ʤ��Ϥ����������礨���ʤˤ⤷�ʤ��ǽ�λ */
+		/* ありえないはずだが、取り合えずなにもしないで終了 */
 		cerr << "TextGlyphStream::AddRuby : invalid operation; fallback to the upeer level"<<endl;
 		data->erase(data->begin()+str_firstpos, data->end());
 		return sbegin+1;
@@ -196,27 +196,27 @@ TextGlyphStreamHelper::Iterator TextGlyp
 	TextGlyph& ruby_first = (*data)[ruby_firstpos];
 	TextGlyph& ruby_last = data->back();
 
-	/* ��Ӥ��ư���٤��⤵����� */
+	/* ルビを移動すべき高さを求める */
 	int dummy, str_ascent, ruby_descent;
 	CalcHeight(str_ascent, dummy, data->begin()+str_firstpos, data->begin()+ruby_firstpos);
 	CalcHeight(dummy, ruby_descent, data->begin()+ruby_firstpos, data->end());
 	int ruby_height = str_ascent + ruby_descent + ruby_textskip;
 
-	/* ���󥿥�󥰤������Ρ���Ӥκ�¦����¦�Υޡ����� */
+	/* センタリングした場合の、ルビの左側、右側のマージン */
 	int leftmergin, rightmergin;
 	leftmergin = str_first.glyph->advance.x/2 - (ruby_first.glyph->advance.x+1)/2;
 	rightmergin = str_last.glyph->advance.x/2 - (ruby_last.glyph->advance.x+1)/2;
 
-	/* ��ӡ���ʸ�β������ΰ�ư */
+	/* ルビ、本文の横方向の移動 */
 	int ruby_xstart_add = 0, ruby_xend_add = 0, str_xstart_add=0, str_xend_add = 0;
-	if (ruby_width+leftmergin+rightmergin <= str_width) { // ��Ӥ�����������
+	if (ruby_width+leftmergin+rightmergin <= str_width) { // ルビの方が小さい
 		ruby_xstart_add = leftmergin;
 		ruby_xend_add = str_width-rightmergin-ruby_width;
-	} else if (ruby_width <= str_width) { // �ޡ�����򸺤餹ɬ�פ���
+	} else if (ruby_width <= str_width) { // マージンを減らす必要あり
 		leftmergin = (str_width-ruby_width)/2;
 		ruby_xstart_add = leftmergin;
 		ruby_xend_add = str_width-leftmergin-ruby_width;
-	} else { // ��Ӥ������礭��
+	} else { // ルビの方が大きい
 		int str_count = ruby_firstpos - str_firstpos;
 		str_xstart_add = ruby_width/str_count/2 - str_first.glyph->advance.x/2;
 		str_xend_add = (ruby_width-str_width) - (ruby_width/str_count/2-str_last.glyph->advance.x/2);
@@ -225,7 +225,7 @@ TextGlyphStreamHelper::Iterator TextGlyp
 	AdjustPosition(str_xstart_add+x, str_xend_add+x, 0, data->begin()+str_firstpos, data->begin()+ruby_firstpos);
 	AdjustPosition(ruby_xstart_add+x, ruby_xend_add+x, -ruby_height, data->begin()+ruby_firstpos, data->end());
 
-	/* ��ʸ����ʸ������ɽ�������褦�� glyph �ν��֤����줫�������롼�ײ� */
+	/* 本文が一文字ずつ表示されるように glyph の順番を入れかえ、グループ化 */
 	vector<TextGlyph> save;
 	save.assign(data->begin()+str_firstpos, data->end());
 	iterator it_str = save.begin();
@@ -258,13 +258,13 @@ void TextGlyphStreamHelper::SetGroup(Tex
 
 void TextGlyphStreamHelper::AdjustPosition(int xstart_add, int xend_add, int y_add, TextGlyphStreamHelper::iterator begin, TextGlyphStreamHelper::iterator end) {
 	iterator it;
-	/* ʸ����������� */
+	/* 文字数を数える */
 	int total_count = 0;
 	for (it = begin; it != end; it++) {
 		if (it->flag & TextGlyph::Group) continue;
 		total_count++;
 	}
-	/* ʸ���֤Υ���åפ��ѹ� */
+	/* 文字間のギャップを変更 */
 	int incr = 0;
 	if (total_count != 1) incr = (xend_add - xstart_add) * 256 / (total_count-1);
 	int cur = xstart_add * 256;
@@ -278,7 +278,7 @@ void TextGlyphStreamHelper::AdjustPositi
 }
 void TextGlyphStreamHelper::CalcHeight(int& ascent_r, int& descent_r, TextGlyphStreamHelper::iterator begin, TextGlyphStreamHelper::iterator end) {
 	iterator it;
-	/* ����� descent, ascent ��׻� */
+	/* 最大の descent, ascent を計算 */
 	int ascent = 0;
 	int descent = 0;
 	for (it = begin; it != end; it++) {
@@ -357,7 +357,7 @@ void TextHorizLayout::SetName(void) {
 	Iterator it;
 
 	tab_width = 0;
-	/* ��Ƭ��̾���ʤ顢�������� */
+	/* 行頭が名前なら、処理開始 */
 	for (; pos != end; pos++) {
 		if (pos->type == TextElem::escape || pos->type == TextElem::glyph) break;
 		int x = 0;
@@ -366,7 +366,7 @@ void TextHorizLayout::SetName(void) {
 
 	if (pos->type != TextElem::escape || pos->impl.Escape.type != TextElem::name_start) return;
 
-	/* ̾���򥻥åȤ�����Ƭ�Ρ֤�ʬ��ޤ�ƥ����������ꤹ�� */
+	/* 名前をセットし、行頭の「の分を含めてタブ幅を設定する */
 	pos++;
 	for (it = pos; it != end; it++) {
 		if (it->type == TextElem::escape && it->impl.Escape.type == TextElem::name_end) break;
@@ -377,9 +377,9 @@ void TextHorizLayout::SetName(void) {
 	pos++;
 	helper.SetGroup(data->begin() + line_firstpos, data->end());
 
-	// ��Ƭ�Ρ�ʬ�򳫤���
+	// 行頭の「分を開ける
 	try {
-		tab_width += helper.CharWidth(0xa1d6); /* �� */
+		tab_width += helper.CharWidth(0xa1d6); /* 「 */
 	} catch(...) {}
 	
 	return;
@@ -387,7 +387,7 @@ void TextHorizLayout::SetName(void) {
 
 void TextHorizLayout::SetLineHead(void) {
 
-	/* ��Ƭ�� �֤ʤɤ��� */
+	/* 行頭は 「などか? */
 
 	for (; pos != end; pos++) {
 		if (pos->type == TextElem::escape || pos->type == TextElem::glyph) break;
@@ -396,7 +396,7 @@ void TextHorizLayout::SetLineHead(void) 
 	}
 	if (pos->type != TextElem::glyph || Kinsoku(pos->impl.Glyph.code) != KinsokuHead) return;
 
-	/* �֤ʤΤǡ��������� */
+	/* 「なので、処理する */
 	if (tab_width != 0) tab_width -= helper.CharWidth(pos->impl.Glyph.code);
 	int line_firstpos = data->size();
 	pos = helper.Add(tab_width, pos, pos+1);
@@ -406,7 +406,7 @@ void TextHorizLayout::SetLineHead(void) 
 void TextHorizLayout::MakeLine(int line_start, int width, vector<int>& lineheights) {
 	
 	int x = tab_width;
-	/* �ޤ�����ʸ�����褹�� */
+	/* まず、全文字描画する */
 	while(pos != end) {
 		pos = helper.Add(x, pos, end);
 		if (pos->type == TextElem::escape && pos->impl.Escape.type == TextElem::ruby_start) { 
@@ -417,7 +417,7 @@ void TextHorizLayout::MakeLine(int line_
 			if (pos->impl.Escape.type != TextElem::ruby_start) pos++;
 		}
 	}
-	/* �Ԥ�ʬ�䤷�Ƥ��� */
+	/* 行に分割していく */
 	TextGlyphStream::iterator it_start = data->begin() + line_start;
 	TextGlyphStream::iterator it_end = data->end();
 	TextGlyphStream::iterator it = it_start;
@@ -426,7 +426,7 @@ void TextHorizLayout::MakeLine(int line_
 	int xstart = tab_width;
 	int xend = width;
 	while(it != it_end) {
-		// ���ιԤν��������
+		// この行の終わりを決める
 		bool is_ruby = false;
 		TextGlyphStream::iterator it_line_start = it;
 		for (; it != it_end; it++) {
@@ -434,21 +434,21 @@ void TextHorizLayout::MakeLine(int line_
 			if (it->flag & TextGlyph::Group) is_ruby = true;
 			if (!(it->flag & TextGlyph::Group)) group_head = it;
 		}
-		// ��ʿ��ư���礭������롣�ǥե���Ȥǥ��ְ��֤ޤ��᤹
+		// 水平移動の大きさを決める。デフォルトでタブ位置まで戻す
 		int xadd_start = -xstart + tab_width;
 		int xadd_end = xadd_start;
-		// it == ���Ԥ���Ƭ�ʤΤǡ����Ԥ��������᤹
-		// �������� �����ʸ����ɽ�����ݾ�
+		// it == 次行の先頭なので、今行の末尾へ戻す
+		// ただし、 最低一文字の表示は保証
 		if (it != it_line_start && it != it_line_start+1 && it != it_end) it--;
 		if (it != it_end) {
-			// ���롼�ײ�����Ƥ���ʸ���ǽ�λ�����顢����ʸ�����᤹
+			// グループ化されている文字で終了したら、前の文字に戻す
 			if (it->flag & TextGlyph::Group) it = group_head;
-			// ������Ƭ��§ʸ���ʤ餳�ιԤ������
+			// 次が行頭禁則文字ならこの行に入れる
 			if ( (it+1) != it_end && (it+1)->flag & TextGlyph::Kinsoku) it++;
-			// ��ư�����礭�������
-			// ��ü������������ʸ���ʤ�Ⱦʸ��ʬ�����ͤ��Ф�
+			// 移動する大きさを決める
+			// 行端ぞろえ、行末文字なら半文字分だけ突き出る
 			int glyph_xend = it->x + it->glyph->advance.x;
-			if (it != it_line_start && (it-1)->flag & TextGlyph::Group) { // ���롼�ײ�ʸ���ξ�硢��ʸ�����⸫��
+			if (it != it_line_start && (it-1)->flag & TextGlyph::Group) { // グループ化文字の場合、1文字前も見る
 				if (glyph_xend < (it-1)->x + (it-1)->glyph->advance.x)
 					glyph_xend = (it-1)->x + (it-1)->glyph->advance.x;
 			}
@@ -458,7 +458,7 @@ void TextHorizLayout::MakeLine(int line_
 		}
 		if (it != it_end) {
 			it->flag = TextGlyph::Flag(it->flag | TextGlyph::LineEnd);
-			it++; // it == ���Ԥ���Ƭ��
+			it++; // it == 次行の先頭へ
 		}
 		int ascent, descent;
 		helper.CalcHeight(ascent, descent, it_start, it);
@@ -472,11 +472,11 @@ void TextHorizLayout::MakeLine(int line_
 		cur_y += ascent + descent + line_skip;
 		lineheights.push_back(ascent+descent+line_skip);
 
-		/* ���ιԤ� */
+		/* 次の行へ */
 		if (it != it_end) {
 			it_start = it;
 			group_head = it_start;
-			/* ��ʸ���ܤ����롼�ײ�����Ƥ���С����롼�פ���Ƭʸ���ˤ��� */
+			/* 1文字目がグループ化されていれば、グループの先頭文字にする */
 			xstart = it->x;
 			if (it->flag & TextGlyph::Group) {
 				TextGlyphStream::iterator jit;
@@ -545,7 +545,7 @@ int TextGlyphStream::height(void) {
 		if (ymax < y) ymax = y;
 		if (it == begin()) break;
 		if (it->flag & TextGlyph::LineEnd) {
-			if (!(it->flag & TextGlyph::PhraseEnd)) break; // PhraseEnd �ϺǸ��ʸ��
+			if (!(it->flag & TextGlyph::PhraseEnd)) break; // PhraseEnd は最後の文字
 		}
 	}
 	return ymax + 1;
--- a/font/font_peer_ft2.cc
+++ b/font/font_peer_ft2.cc
@@ -228,8 +228,8 @@ bool PeerFt2::GlyphCreate(unsigned int c
 	slot = face->glyph;
 	if (slot) {
 		// if (! FT_Load_Glyph(face, index, FT_LOAD_DEFAULT)) {
-		// BITMAP ���� �ʤ��� render ���Ƥ���ʤ��ġ�
-		// LOAD_DEFAULT �Ǥ⡢�����б������ɤ��դ����Τǰ���������
+		// BITMAP だと なぜか render してくれない……
+		// LOAD_DEFAULT でも、下に対応コードを付けたので一応は大丈夫
 		if (! FT_Load_Glyph(face, index, FT_LOAD_NO_BITMAP))
 			FT_Render_Glyph(slot, ft_render_mode_normal);
 	}
@@ -252,7 +252,7 @@ bool PeerFt2::GlyphCreate(unsigned int c
 		glyph->bitmap.buffer = new unsigned char[bmsize];
 		memcpy(glyph->bitmap.buffer, slot->bitmap.buffer, bmsize);
 	}
-// �ʤ��� Render �����Τ� MONO �ʤ��Ȥ�����ġ�
+// なぜか Render したのに MONO なことがある……
 /* for freetype < 2.1.3, use ``ft_pixel_mode_mono'' */
 	if (slot->bitmap.pixel_mode == ft_pixel_mode_mono) {
 		int i, j;
--- a/font/font_peer_x11.cc
+++ b/font/font_peer_x11.cc
@@ -61,8 +61,8 @@ inline int read_little_endian_int(const 
 **
 ** Fontinfo / FontSetInfo
 **
-**   fontset �������� pixel size �����
-**   �̤�fontset��������뤿��Υ��饹
+**   fontset から特定 pixel size を持つ
+**   別のfontsetを作成するためのクラス
 */
 struct FontInfo {
 	std::map<int, string> fontlist;
@@ -83,7 +83,7 @@ struct FontSetInfo {
 **
 */
 FontInfo::FontInfo(Display* display, const char* fontname_orig) {
-	/* �ե���Ȥ��礭���ط��ξ����õ� */
+	/* フォントの大きさ関係の情報を消去 */
 	int i;
 	char* fontname = new char[strlen(fontname_orig)+50];
 	int minus_count = 0;
@@ -102,13 +102,13 @@ FontInfo::FontInfo(Display* display, con
 		}
 		if (! is_skip) fontname[fc++] = fontname_orig[i];
 	}
-	/* �ե���Ⱦ�������� */
+	/* フォント情報を得る */
 	fontname[fc] = 0;
 	int count;
 	char** fontnamelist = XListFonts(display, fontname, 100, &count);
 	for (i=0; i<count; i++) {
 		char* curfont = fontnamelist[i];
-		/* fontname ���� pixel size ��������� */
+		/* fontname から pixel size 情報を得る */
 		int j;
 		int minus_count = 0;
 		for (j=0; curfont[j] != 0; j++) {
@@ -122,7 +122,7 @@ FontInfo::FontInfo(Display* display, con
 			}
 		}
 	}
-	/* �����˼��Ԥ�����硢�Ȥꤢ���� fontname ������Ƥ��� */
+	/* 検索に失敗した場合、とりあえず fontname を入れておく */
 	if (fontlist.find(0) == fontlist.end()) {
 		fontlist[0] = string(fontname);
 	}
@@ -132,15 +132,15 @@ FontInfo::FontInfo(Display* display, con
 }
 string FontInfo::Search(int pixsize) {
 	int i;
-	/* pixsize �˶ᤤ�ե���Ȥ�(�����)���� */
+	/* pixsize に近いフォントが(あれば)帰す */
 	if (fontlist.find(pixsize) != fontlist.end()) return fontlist[pixsize];
 	for (i=1; i<4; i++) {
 		if (fontlist.find(pixsize-i) != fontlist.end()) return fontlist[pixsize-i];
 		if (fontlist.find(pixsize+i) != fontlist.end()) return fontlist[pixsize+i];
 	}
-	/* ���Ĥ���ʤ���fontlist[0] ��ù����Ƶ��� */
-	/* pt/xres/yres �ʤɤΥե�����ɤ� '-0-' �Ȥ����Τ������ '-*-'���Ѵ�
-	** pixsize ��Ϳ����줿 pixsize �ˤ���
+	/* 見つからない:fontlist[0] を加工して帰す */
+	/* pt/xres/yres などのフィールドに '-0-' というのがあれば '-*-'に変換
+	** pixsize は与えられた pixsize にする
 	*/
 	string basefont_s = fontlist[0];
 	const char* basefont = basefont_s.c_str();
@@ -246,7 +246,7 @@ PeerX11::PeerX11(const char* fontname, i
 		string err = "XKFont::PeerX11:PeerX11() : No supported Color mode of X : neither TrueColor nor DirectColor";
 		throw std::runtime_error(err);
 	}
-	/* ������ */
+	/* 色の初期化 */
 	white = visual->red_mask | visual->green_mask | visual->blue_mask;
 	black = 0;
 	if (visual->green_mask == 0) {
@@ -266,7 +266,7 @@ PeerX11::PeerX11(const char* fontname, i
 
 	XSupportsLocale(); //FIXME: er... yes?
 
-	/* font �ɤ߹��� */
+	/* font 読み込み */
 	FontSetInfo fsinfo(display,fontname);
 	string fontset_name = fsinfo.Search(fontsize);
 	char** missing_cl;
@@ -306,7 +306,7 @@ printf("locale %s\n",XLocaleOfOM(XOMOfOC
 		ascent = MAX(ascent, font_structs[i]->ascent);
 	}
 	
-	/* �����Ѥ� pixmap ����� */
+	/* 描画用の pixmap を作成 */
 	XGCValues gc_values;
 	unsigned int gc_values_mask;
 	gc_values.function = GXcopy;
@@ -321,7 +321,7 @@ printf("locale %s\n",XLocaleOfOM(XOMOfOC
 
 	canvas = XCreatePixmap(display, w, width, height, DefaultDepth(display, scr));
 
-	/* ���᡼��ž���Ѥ� image �κ��� */
+	/* イメージ転送用の image の作成 */
 	int ignore;
 	use_shm = false;
 	if (XShmQueryExtension(display) == True) {
--- a/font/text_stream.cc
+++ b/font/text_stream.cc
@@ -223,15 +223,15 @@ void TextStream::RemoveName(char* name, 
 	Iterator it;
 	for (it = container.begin(); it != container.end(); it++) {
 		if (it->type == TextElem::escape && it->impl.Escape.type == TextElem::name_start) {
-			// ��Ƭ��̾����
+			// 行頭の名前?
 			int pt = it - container.begin();
 			Iterator name_start = it;
 			for (; it != container.end(); it++) {
 				if (it->type == TextElem::escape && it->impl.Escape.type == TextElem::name_end) break;
 			}
 			if (it != container.end()) {
-				// ̾�������Ĥ��ä��ΤǺ��
-				if (name) { // ��¸�褬����ʤ���¸����
+				// 名前が見つかったので削除
+				if (name) { // 保存先があるなら保存する
 					Iterator name_end = it;
 					int pos = 0;
 					namelen--;
@@ -247,7 +247,7 @@ void TextStream::RemoveName(char* name, 
 						}
 					}
 					name[pos] = 0;
-					name = 0; // �ǽ�˽Ф�̾���Τ���¸����
+					name = 0; // 最初に出た名前のみ保存する
 				}
 				it++;
 				container.erase(name_start, it);
@@ -341,7 +341,7 @@ std::string TextStream::Save(void) {
 				*buf++ = (code/0x10) + 'A';
 				*buf++ = (code%0x10) + 'A';
 			} else {
-				code = codeconv_euc_to_sjis(code); // save file �δ��������ɤ�SJIS
+				code = codeconv_euc_to_sjis(code); // save file の漢字コードはSJIS
 				*buf++ = code/256;
 				*buf++ = code%256;
 			}
--- a/music2/koedec.cc
+++ b/music2/koedec.cc
@@ -39,11 +39,11 @@ using namespace std;
 
 /*********************************************
 **
-**	FindKoe -- RealLive�β������������ֽ���
+**	FindKoe -- RealLiveの音声アーカイブ処理
 **
 */
 
-/* ���ե�����Υ����������ѤΥ���å��� */
+/* 声ファイルのアーカイブ用のキャッシュ */
 #define koe_cache_size 7
 struct AvgKoeTable {
 	int koe_num;
@@ -101,7 +101,7 @@ AvgKoeInfo AvgKoeCache::Find(int file_nu
 	list<AvgKoeHead>::iterator it;
 	it = find(cache.begin(), cache.end(), file_number);
 	if (it == cache.end()) {
-		/* ������ head ���� */
+		/* 新たに head を作る */
 		char fname[100];
 		KoeType type = koe_unknown;
 		sprintf(fname, "z%03d.koe", file_number);
@@ -145,11 +145,11 @@ AvgKoeInfo AvgKoeCache::Find(int file_nu
 		if (cache.size() >= koe_cache_size) cache.pop_back();
 		it = cache.begin();
 	}
-	if (it->file_number != file_number) return info; // �ֹ椬��������
+	if (it->file_number != file_number) return info; // 番号がおかしい
 	AvgKoeTable* table = it->Find(index);
 	//FIXME: table == NULL ?
-	if (table == 0) return info; // index �����դ���ʤ�
-	// info ���������
+	if (table == 0) return info; // index が見付からない
+	// info を作成する
 	info.length = table->length;
 	info.offset = table->offset;
 	info.rate = it->rate;
@@ -179,8 +179,8 @@ AvgKoeHead::AvgKoeHead(FILE* _s, int _fi
 	rate = 22050;
 	type = _type;
 	if (stream == NULL) return;
-	/* header �ɤ߹��� */
-	if (type == koe_nwk) { // ���������� : .nwk file
+	/* header 読み込み */
+	if (type == koe_nwk) { // 新しい形式 : .nwk file
 		rate = 44100;
 		fread(head, 4, 1, stream);
 		int table_len = read_little_endian_int(head);
@@ -215,7 +215,7 @@ AvgKoeHead::AvgKoeHead(FILE* _s, int _fi
 		int table_len = read_little_endian_int(head+0x10);
 		rate = read_little_endian_int(head+0x18);
 		if (rate == 0) rate = 22050;
-		/* table �ɤ߹��� */
+		/* table 読み込み */
 		table.reserve(table_len);
 		char* buf = new char[table_len*8];
 		fread(buf, table_len, 8, stream);
@@ -244,7 +244,7 @@ AvgKoeTable* AvgKoeHead::Find(int koe_nu
 
 /*********************************************
 **
-**	MakeWavHeader : koe �ե������ wave header ���դ���
+**	MakeWavHeader : koe ファイルに wave header を付ける
 **
 */
 
@@ -278,14 +278,14 @@ const char* MakeWavHeader(int rate, int 
 
 /*********************************************
 **
-**	decode_koe -- �����ǡ���Ÿ��
+**	decode_koe -- 音声データ展開
 **
 */
 
 extern char* decode_koe(AvgKoeInfo info, int* len);
 
-/* 8bit -> 16bit �ؤ��Ѵ��ơ��֥롣����� signed short ����
-** �Ȥꤢ���� unsigned �ǰ��äƤ���
+/* 8bit -> 16bit への変換テーブル。本来は signed short だが
+** とりあえず unsigned で扱っている
 */
 
 unsigned short koe_8bit_trans_tbl[256] = {
@@ -323,9 +323,9 @@ unsigned short koe_8bit_trans_tbl[256] =
   0x707f,0x7261,0x7447,0x7631,0x781f,0x7a11,0x7c07,0x7fff
 };
 
-/* ADPCM����������ʤ��餷����������DPCM�Υʤ᤿�ơ��֥롣
-** ��ư��������㤤���������256byte���ä���
-** �ơ��֥�Ǥ�����ʤ��Ǥ���
+/* ADPCM・・・じゃないらしい。ただのDPCMのナめたテーブル。
+** 自動生成すりゃいいんだけど256byteだったら
+** テーブルでも問題ないでしょ
 */
 
 char koe_ad_trans_tbl[256] = {
@@ -368,7 +368,7 @@ char* decode_koe(AvgKoeInfo info, int* d
 		fseek(info.stream, -20, SEEK_CUR);
 		return decode_koe_ogg(info, dest_len);
 	}
-	/* avg32 �����ǡ���Ÿ�� */
+	/* avg32 の声データ展開 */
 	table = (char*)malloc(info.length*2);
 	fseek(info.stream, info.offset, SEEK_SET);
 	fread(table, 2, info.length, info.stream);
@@ -376,7 +376,7 @@ char* decode_koe(AvgKoeInfo info, int* d
 	all_len = 0;
 	for (i=0; i < info.length; i++)
 		all_len += read_little_endian_short(table + i*2);
-	/* �ǡ����ɤ߹��� */
+	/* データ読み込み */
 	src_orig  = (unsigned char*) malloc(all_len);
 	dest_orig = (unsigned short*)malloc(info.length * 0x1000 + 0x2c);
 	if (src_orig == NULL || dest_orig == NULL) return NULL;
@@ -388,13 +388,13 @@ char* decode_koe(AvgKoeInfo info, int* d
 	dest = dest_orig + 0x2c;
 	/* memset(dest_data, 0, table_len * 0x1000); */
 	
-	/* Ÿ�� */
+	/* 展開 */
 	for (i=0; i<info.length; i++) {
 		int slen = read_little_endian_short(table+i*2);
 		if (slen == 0) { // do nothing
 			memset(dest, 0, 0x1000);
 			dest += 0x800; src += 0;
-		} else if (slen == 0x400) { // table �Ѵ�
+		} else if (slen == 0x400) { // table 変換
 			for (j=0; j<0x400; j++) {
 				write_little_endian_short((char*)(dest+0), koe_8bit_trans_tbl[*src]);
 				write_little_endian_short((char*)(dest+1), koe_8bit_trans_tbl[*src]);
--- a/music2/koedec_ogg.cc
+++ b/music2/koedec_ogg.cc
@@ -72,7 +72,7 @@ struct OggInfo {
 	int offset;
 };
 
-/* ogg stream �ɤ߹����Ѥ� dummy callback */
+/* ogg stream 読み込み用の dummy callback */
 static size_t ogg_readfunc(void* ptr, size_t size, size_t nmemb, void* datasource) {
 	OggInfo* info = (OggInfo*)datasource;
 	int pt = ftell(info->stream) - info->offset;
@@ -110,8 +110,8 @@ static int fseek_wrap(FILE *f,ogg_int64_
 
 extern char* decode_koe_ogg(AvgKoeInfo info, int* dest_len) {
 	if (info.stream == NULL) return NULL;
-	// Voice �ե������ľ�ܻ��ꤹ��������ȥ꡼���������Ƥ��ޤ��Τ�
-	// ɬ�פ���ʬ�����ڤ�Ф��� callback ��ͳ�ǵ���
+	// Voice ファイルを直接指定すると全ストリームを再生してしまうので
+	// 必要な部分だけ切り出して callback 経由で帰す
 	fseek(info.stream, info.offset, SEEK_SET);
 
 	ov_callbacks callback;
@@ -151,7 +151,7 @@ extern char* decode_koe_ogg(AvgKoeInfo i
 	} while(1);
 	ov_clear(&vf);
 
-	*dest_len = cur; // ���ޤ�����С��ȤǤ��Ƥ�Τ��ʤ��ġ�
+	*dest_len = cur; // うまくコンバートできてるのかなあ……
 	const char* header = MakeWavHeader(info.rate, channels, 2, cur);
 	memcpy(out, header, 0x2c);
 	
--- a/music2/movie.cc
+++ b/music2/movie.cc
@@ -26,7 +26,7 @@
  */
 
 /*
- * movie.cc  smpeg �ˤ��ư�����
+ * movie.cc  smpeg による動画再生
  *
 */
 
--- a/music2/music.cc
+++ b/music2/music.cc
@@ -25,7 +25,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-/*  music.cc	SDL_mixer ���Ѥ������ں����롼���� */
+/*  music.cc	SDL_mixer を用いた音楽再生ルーチン */
 
 
 #include <string.h>
@@ -94,11 +94,11 @@ void MuSys::PlayCDROM(char* name, int pl
 	if (track == -1) track = atoi(name);
 	if (config->track_name.WaveTrack(name) != NULL)
 		strncpy(wave, config->track_name.WaveTrack(name), 127);
-	if (wave[0] == 0 && track != 0) { /* DSTRACK �����Ĥ���ʤ���硢CDTRACK����Ѥ��� */
+	if (wave[0] == 0 && track != 0) { /* DSTRACK が見つからない場合、CDTRACKを使用する */
 		sprintf(wave, "audio_%02d", track);
 	}
 	if (wave == 0) return;
-	// BGM ����
+	// BGM 再生
 	if (!pcm_enable) return;
 	if (play_count == 0)
 		bgm_start(wave, -1);
@@ -187,7 +187,7 @@ void MuSys::FinalizeMusic(void)
 
 /*************************************************************************
 **
-** �ե������ɤ߹��� / �������ޥ�ɸƤӽФ�
+** ファイル読み込み / 外部コマンド呼び出し
 */
 
 struct WavChunk {
@@ -205,7 +205,7 @@ void WavChunk::callback(void *userdata, 
 {
 	WavChunk* chunk = (WavChunk*)userdata;
 	int count;
-	if (chunk->loop_pt == -2) { // �������
+	if (chunk->loop_pt == -2) { // 再生終了後
 		memset(stream, 0, len);
 		return;
 	}
@@ -214,8 +214,8 @@ void WavChunk::callback(void *userdata, 
 	count = chunk->wav->Read( (char*)stream_dup, 4, len/4);
 
 	if (count != len/4) {
-		// �Ǹ�ޤǺ�������
-		if (chunk->loop_pt == -1) { // ��λ
+		// 最後まで再生した
+		if (chunk->loop_pt == -1) { // 終了
 			chunk->loop_pt = -2;
 			memset(stream_dup+count*4, 0, len-count*4);
 		} else {
@@ -227,9 +227,9 @@ void WavChunk::callback(void *userdata, 
 	int cur_vol = (*chunk->volmod)*SDL_MIX_MAXVOLUME/255;
 	
 	if (fadetime_total) {
-		// ���ڤ������ (fade out)
+		// 音楽を停止中 (fade out)
 		int count_total = fadetime_total*(WAVFILE::freq/1000);
-		if (fadecount > count_total || fadetime_total == 1) { // �������
+		if (fadecount > count_total || fadetime_total == 1) { // 音楽停止
 			chunk->loop_pt = -2;
 			memset(stream, 0, len);
 			delete[] stream_dup;
@@ -262,7 +262,7 @@ fprintf(stderr,"bgm start %s\n",path);
 	Mix_PauseMusic();
 	Mix_HaltMusic();
 	Mix_HookMusic(0,0);
-	/* ���˺������Ƥ����Τ�λ */
+	/* 前に再生していたのを終了 */
 	if (wav_playing.wav != NULL) {
 		delete wav_playing.wav;
 		wav_playing.wav = NULL;
@@ -281,7 +281,7 @@ void effec_start(int chn, const char* pa
 	if (!mu->pcm_enable) return;
 
 	SDL_RWops* op = OpenSDLRW(path);
-	if (op == NULL) { // �ե����뤬���դ���ʤ�
+	if (op == NULL) { // ファイルが見付からない
 		return;
 	}
 	Mix_Pause(chn);
@@ -310,7 +310,7 @@ void MuSys::PlayKoe(const char* path) {
 	int chn = MIX_PCM_KOE;
 
 	Mix_Pause(chn);
-	Mix_HaltChannel(chn); // ����� RWop �����������Ϥ���
+	Mix_HaltChannel(chn); // これで RWop が解放されるはず…
 	if (mu->play_chunk[chn] != NULL) {
 		Mix_FreeChunk(mu->play_chunk[chn]);
 		mu->play_chunk[chn] = NULL;
@@ -341,13 +341,13 @@ AvgKoeInfo OpenKoeFile(const char* path)
 	info.stream = NULL;
 	info.length = 0;
 	info.offset = 0;
-	if (isdigit(path[0]) && strchr(path,'.') == NULL) { // ���� (��ĥ�����ʤ�)
-		/* avg32 �����β������������֤Υ���å���򸡺� */
+	if (isdigit(path[0]) && strchr(path,'.') == NULL) { // 数値 (拡張子等なし)
+		/* avg32 形式の音声アーカイブのキャッシュを検索 */
 		int pointer = atoi(path);
 		int file_no = pointer / radix;
 		int index = pointer % radix;
 		info = FindKoe(file_no, index);
-	} else { // �ե�����
+	} else { // ファイル
 		int length;
 		ARCINFO* arcinfo = FileSearcher::GetInstance()->Find(FileSearcher::KOE, path, ".WPD");
 		if (arcinfo == NULL) return info;
@@ -362,7 +362,7 @@ AvgKoeInfo OpenKoeFile(const char* path)
 }
 
 static SDL_RWops* OpenSDLRW(const char* path) {
-	/* �ޤ� wav �ե������õ�� */
+	/* まず wav ファイルを探す */
 	FileSearcher* file_searcher = FileSearcher::GetInstance();
 	ARCINFO* info = file_searcher->Find(FileSearcher::WAV, path, ".wav");
 	if (info == NULL) {
@@ -392,7 +392,7 @@ static SDL_RWops* OpenSDLRW(const char* 
 }
 
 static WAVFILE* OpenWaveFile(const char* path) {
-	/* �ޤ� wav �ե������õ�� */
+	/* まず wav ファイルを探す */
 	FileSearcher* file_searcher = FileSearcher::GetInstance();
 	ARCINFO* info = file_searcher->Find(FileSearcher::WAV, path, ".wav");
 	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "wav");
@@ -404,7 +404,7 @@ static WAVFILE* OpenWaveFile(const char*
 		WAVFILE* w = WAVFILE::MakeConverter(new WAVFILE_Stream(f, size));
 		return w;
 	}
-	/* ���� nwa �ե����� */
+	/* 次に nwa ファイル */
 	info = file_searcher->Find(FileSearcher::WAV, path, ".nwa");
 	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "nwa");
 	if (info != NULL) {
@@ -416,7 +416,7 @@ static WAVFILE* OpenWaveFile(const char*
 		return w;
 	}
 
-	/* ���� mp3 �ե����� */
+	/* 次に mp3 ファイル */
 	info = file_searcher->Find(FileSearcher::WAV, path, ".mp3");
 	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "mp3");
 	if (info != NULL) {
@@ -431,7 +431,7 @@ static WAVFILE* OpenWaveFile(const char*
 		delete w;
 	}
 
-	/* ���� ogg �ե����� */
+	/* 次に ogg ファイル */
 	info = file_searcher->Find(FileSearcher::WAV, path, ".ogg");
 	if (info == NULL) info = file_searcher->Find(FileSearcher::BGM, path, "ogg");
 	if (info != NULL) {
--- a/music2/nwatowav.cc
+++ b/music2/nwatowav.cc
@@ -1,24 +1,24 @@
-/* nwatowav : Visual Arts �ϤΥ�����Υǥ�ǻȤ��� nwa ������
-**            �ե������ wav �������Ѵ�����
+/* nwatowav : Visual Arts 系のゲームのデモで使われる nwa 形式の
+**            ファイルを wav 形式に変換する
 **
 **     compile : gcc -O2 -o nwatowav nwatowav.cc
 **     usage : nwatowav [nwa-file [outfile]]
 **	       nwatowav [nwk-file [outfile]]
-**     example : nwatowav HM06.nwa HM06.wav	# BGM�ե����롣HM06.wav ��Ÿ�������
-**		 nwatowav z2813.nwk z2813	# �����ե����롣 z2813-100.wav �ʤɤΥե�����̾��Ÿ�������
-**		 nwatowav z0513.ovk z0513	# �����ե����롣 z0513-100.ogg �ʤɤΥե�����̾��Ÿ�������
+**     example : nwatowav HM06.nwa HM06.wav	# BGMファイル。HM06.wav に展開される
+**		 nwatowav z2813.nwk z2813	# 音声ファイル。 z2813-100.wav などのファイル名で展開される
+**		 nwatowav z0513.ovk z0513	# 音声ファイル。 z0513-100.ogg などのファイル名で展開される
 **
 **
-** 2004.5.19 ��������<s1100089@u-aizu.ac.jp> ���� CLANNAD ��̵����nwa�������б�����
-**           �ѥå��򤤤��������Τǡ�Ŭ�Ѥ��ޤ��������꤬�Ȥ��������ޤ���
-** 2006.9.10 �����奢�ե����פβ����ե�������� (complevel = 5) �򥵥ݡ���
-**	     .nwk �Ȥ�����ĥ�Ҥ���ĥե������������Ȳ����ե�����Ȥ���
-**	     ��ᡢʬ�䤷��Ÿ������褦�ˤ���
-** 2007.7.28 �֥�ȥ�Х����������פβ����ե�������� (*.ovk; ogg Ϣ�뷿)
-**		�򥵥ݡ��ȡ�.ovk �Ȥ�����ĥ�Ҥ��ĥե�������������
-**		�����ե�����Ȥ��Ʋ�ᡢʬ�䤷��Ÿ������褦�ˤ���
-**	     �֥�ȥ�Х����������פ�BGM�ե������¿�̤ΥΥ�������������
-**	     �����ʥ���󥰥����̤ν�������ɬ�פ��ä���
+** 2004.5.19 小松さん<s1100089@u-aizu.ac.jp> から CLANNAD の無圧縮nwa形式に対応する
+**           パッチをいただいたので、適用しました。ありがとうございます。
+** 2006.9.10 「智代アフター」の音声ファイル形式 (complevel = 5) をサポート
+**	     .nwk という拡張子を持つファイルを受け取ると音声ファイルとして
+**	     解釈、分割して展開するようにする
+** 2007.7.28 「リトルバスターズ!」の音声ファイル形式 (*.ovk; ogg 連結型)
+**		をサポート。.ovk という拡張子をもつファイルを受け取ると
+**		音声ファイルとして解釈、分割して展開するようにする
+**	     「リトルバスターズ!」のBGMファイルに多量のノイズが乗る問題も
+**	      解決(ランレングス圧縮の処理が不必要だった)
 */
 
 /*
@@ -28,14 +28,14 @@
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted.
  *
- * ���Υץ������κ�Ԥ� jagarl �Ǥ���
+ * このプログラムの作者は jagarl です。
  *
- * ���Υץ�����ࡢ�ڤӥ���ѥ���ˤ�ä����������Х��ʥ��
- * �ץ��������ѹ����롢���ʤ��ˤ�����餺�����۲�ǽ�Ǥ���
- * ���κݡ��嵭 Copyright ɽ�����ݻ�����ʤɤξ��ϲݤ���
- * �����б������ݤʤΤǥХ�����������᡼���Ϣ���򤹤�
- * �ʤɤ�ɬ�פ⤢��ޤ��󡣥������ΰ�����ή�Ѥ��뤳�Ȥ�ޤᡢ
- * ����ͳ�ˤ��Ȥ�����������
+ * このプログラム、及びコンパイルによって生成したバイナリは
+ * プログラムを変更する、しないにかかわらず再配布可能です。
+ * その際、上記 Copyright 表示を保持するなどの条件は課しま
+ * せん。対応が面倒なのでバグ報告を除き、メールで連絡をする
+ * などの必要もありません。ソースの一部を流用することを含め、
+ * ご自由にお使いください。
  *
  * THIS SOFTWARE IS PROVIDED BY KAZUNORI 'jagarl' UENO ``AS IS'' AND ANY
  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
@@ -54,9 +54,9 @@
 
 /********************************************
 **
-**	nwa �ե����ޥåȤˤĤ���
+**	nwa フォーマットについて
 **
-**		���ΤȤ��Ƥϰʲ��ι�¤�����
+**		全体としては以下の構造を持つ
 **		NWA Header
 **		data offset index
 **		data block<0>
@@ -64,104 +64,104 @@
 **		...
 **		data block<N>
 **
-**	NWA Header: �ե�������Ƭ���� 44 bytes
-**		magic number �ʤɤϤʤ��Τ�nwa �ե����뤫��
-**		�ǡ���������������Ƚ�Ǥ���ɬ�פ�����
-**		�ǡ��������� little endian �ǡ�
-**		short(signed 2byte)�ޤ��� int(signed 4byte) �Ǥ��롣
+**	NWA Header: ファイル先頭から 44 bytes
+**		magic number などはないのでnwa ファイルかは
+**		データの整合性から判断する必要がある
+**		データは全て little endian で、
+**		short(signed 2byte)または int(signed 4byte) である。
 **
-**		+00 short   channel ��(1/2)
-**		+02 short   sample ��Ĥ������ bit ��(16)
-**		+04 int     ���ȿ�(���ä�����Υǡ�����)
-**		+08 int     ���̥�٥롧-1~5.2�ǺǾ��Υǡ�����0�Ǻ����������(-1��̵����raw�ǡ����Ȥߤʤ����)
+**		+00 short   channel 数(1/2)
+**		+02 short   sample 一つあたりの bit 数(16)
+**		+04 int     周波数(一秒あたりのデータ数)
+**		+08 int     圧縮レベル:-1~5.2で最小のデータ、0で最大の復元度(-1は無圧縮rawデータとみなされる)
 **		+12 int     ?
-**		+16 int     �֥��å���
-**		+20 int     Ÿ����Υǡ������礭��(�Х���ñ��)
-**		+24 int     ���̻��Υǡ������礭��(nwa �ե�������礭�����Х���ñ��)
-**		+28 int     ����ץ����Ÿ����Υǡ�����(16bit data�ʤ� short ñ��==����ץ�ñ�̤Υǡ������礭��)
-**		+32 int     �ǡ������֥��å���Ÿ���������Υ���ץ�ñ�̤Υǡ�����
-**		+36 int     �ǽ��֥��å���Ÿ���������Υ���ץ�ñ�̤Υǡ�����
+**		+16 int     ブロック数
+**		+20 int     展開後のデータの大きさ(バイト単位)
+**		+24 int     圧縮時のデータの大きさ(nwa ファイルの大きさ。バイト単位)
+**		+28 int     サンプル数:展開後のデータ数(16bit dataなら short 単位==サンプル単位のデータの大きさ)
+**		+32 int     データ1ブロックを展開した時のサンプル単位のデータ数
+**		+36 int     最終ブロックを展開した時のサンプル単位のデータ数
 **		+40 int     ?
 **		
 **	data offset index
-**		���֥��å��� x 4 byte �Υǡ���
-**		���줾�� int �Υǡ��������֥��å���³���Ƥ���
+**		全ブロック数 x 4 byte のデータ
+**		それぞれ int のデータが全ブロック数続いている
 **
-**		�ǡ����֥��å�����Ƭ��ؤ��ե�������Ƭ����ΰ���(���ե��å�)
-**		����Ǽ����Ƥ���
+**		データブロックの先頭を指すファイル先頭からの位置(オフセット)
+**		が格納されている
 **
 **	data block
-**		Ĺ���ϲ��ѡ�Ÿ�����뤳�Ȥǰ�����礭�����ĥǡ�����Ÿ������롣
-**		�ǡ�����DPCM�������� PCM �ǡ����� a,b,c �ʤ�� (a),b-a, c-b ��
-**		���ä���ʬ�ǡ�����������3-5bit,�ؿ�3bit�η�������¸����Ƥ��롣
-**		���Ū�ˡ�16bit �Υǡ�����¿���ξ�� 6-8bit �dz�Ǽ����롣
-**		�����Υӥåȿ��ϰ��̥�٥�0��5bit�����̥�٥�2��3bit�Ȥʤ롣
-**		�ʲ������̥�٥�2�ξ��ˤĤ����ä�ʤ�롣
-**		��Υ��ξ�硧
-**			+00 short  �֥��å���κǽ�Υǡ���
+**		長さは可変。展開することで一定の大きさをもつデータに展開される。
+**		データはDPCM形式。元 PCM データが a,b,c ならば (a),b-a, c-b と
+**		いった差分データが、仮数3-5bit,指数3bitの形式で保存されている。
+**		結果的に、16bit のデータが多くの場合 6-8bit で格納される。
+**		仮数のビット数は圧縮レベル0で5bit、圧縮レベル2で3bitとなる。
+**		以下、圧縮レベル2の場合について話を進める。
+**		モノラルの場合:
+**			+00 short  ブロック内の最初のデータ
 **			+02- bit stream
-**		���ƥ쥪�ξ�硧
-**			+00 short  ��(?)�����ͥ�κǽ�Υǡ���
-**			+02 short  ��(?)�����ͥ�κǽ�Υǡ���
+**		ステレオの場合:
+**			+00 short  左(?)チャンネルの最初のデータ
+**			+02 short  右(?)チャンネルの最初のデータ
 **			+04- bit stream
 **
-**		��ʬ�ǡ��������٤��⤯�ʤ��Τdzƥ֥��å�����Ƭ��
-**		���Τʥǡ����ˤ�����������(��)
+**		差分データの精度が高くないので各ブロックの先頭で
+**		正確なデータにより補正される(?)
 **
 **	bit stream
 **		little endian
-**		+0 - +2 : �ؿ�
-**		+3 - +5 : ����
-**		�η������㤨�� a,b,c �Ȥ���8bit�ǡ���������С�
-**		a&0x07 : �ǡ������λؿ�
-**		(a>>3)&0x07 : �ǡ������β���(signed ; 
-**		((b<<2)|(a>>6))&0x07 : �ǡ������λؿ�
-**		(b>>1)&0x07 : �ǡ������β���
-**		�Ȥʤ롣
-**		���������ؿ����ͤˤ�겾����bit�����Ѳ����뤳�Ȥ����롣
-**		�ؿ� = 1 - 6 �ξ�硧
-**			a=�ؿ���b=������p=���Υǡ����Ȥ��ơ�����Υǡ���d ��
-**			b��2bit�ܤ�Ω�äƤ����硧
+**		+0 - +2 : 指数
+**		+3 - +5 : 仮数
+**		の形式。例えば a,b,c という8bitデータがあれば、
+**		a&0x07 : データ1の指数
+**		(a>>3)&0x07 : データ1の仮数(signed ; 
+**		((b<<2)|(a>>6))&0x07 : データ2の指数
+**		(b>>1)&0x07 : データ2の仮数
+**		となる。
+**		ただし、指数の値により仮数のbit数が変化することがある。
+**		指数 = 1 - 6 の場合:
+**			a=指数、b=仮数、p=前のデータとして、今回のデータd は
+**			bの2bit目が立っている場合:
 **				d = p - (b&3)<<(4+a)
-**			Ω�äƤʤ���硧
+**			立ってない場合:
 **				d = p + (b&3)<<(4+a)
-**		�ؿ� = 0 �ξ�硧������¸�ߤ��ʤ�(�ǡ�����3bit�Ȥʤ�)
+**		指数 = 0 の場合:仮数は存在しない(データは3bitとなる)
 **			d = p
-**			�����奢�ե����פβ����ե����� (complevel == 5) �Ǥϥ���󥰥������Ѥ˻Ȥ��Ƥ��롣
-**		�ؿ� = 7
-**			���� bit ��Ω�äƤ����硧
-**				d = 0 (����̤����)
-**				(�ǡ�����4bit�Ȥʤ�)
-**			���� bit ��Ω�äƤʤ���硧
+**			「智代アフター」の音声ファイル (complevel == 5) ではランレングス圧縮用に使われている。
+**		指数 = 7
+**			次の bit が立っている場合:
+**				d = 0 (現在未使用)
+**				(データは4bitとなる)
+**			次の bit が立ってない場合:
 **				complevel = 0,1,2:
-**				   ���� b = 6bit
-**				   b �� 5bit �ܤ�Ω�äƤ����硧
+**				   仮数 b = 6bit
+**				   b の 5bit 目が立っている場合:
 **					d = p - (b&0x1f)<<(4+7)
-**				   Ω�äƤʤ���硧
+**				   立ってない場合:
 **					d = p + (b&0x1f)<<(4+7)
-**				   (�ǡ�����10bit�Ȥʤ�)
+**				   (データは10bitとなる)
 **				complevel = 3,4,5:
-**				   ���� b = 8bit
-**				   b �� 7bit �ܤ�Ω�äƤ����硧
+**				   仮数 b = 8bit
+**				   b の 7bit 目が立っている場合:
 **					d = p - (b&0x7f)<<9
-**				   Ω�äƤʤ���硧
+**				   立ってない場合:
 **					d = p + (b&0x1f)<<9
-**				   (�ǡ�����10bit�Ȥʤ�)
+**				   (データは10bitとなる)
 **
-**		���̥�٥뤬�ۤʤ��硢���Ȥ��а��̥�٥�==0��
-**			�ؿ�==1~6��d�κǾ��bit��Ω�äƤ�����
+**		圧縮レベルが異なる場合、たとえば圧縮レベル==0で
+**			指数==1~6でdの最上位bitが立っている場合
 **				d = p - (b&0x0f)<<(2+a)
-**			�ؿ�==7��d�κǾ��bit��Ω�äƤ�����
+**			指数==7でdの最上位bitが立っている場合
 **				d = p - (b&0x7f)<<(2+7)
-**				(b : 8bit�ʤΤǥǡ�����12bit�Ȥʤ�)
-**		�Τ褦�ˡ����٤������Ѳ�����褦�ˤʤäƤ��롣
+**				(b : 8bitなのでデータは12bitとなる)
+**		のように、精度だけが変化するようになっている。
 **
-**	�إå��ɤ߹��ߤˤĤ��Ƥ�NWAData::ReadHeader()����
-**	bit stream ����Υǡ���Ÿ���ˤĤ��Ƥ� NWADecode()����
+**	ヘッダ読み込みについてはNWAData::ReadHeader()参照
+**	bit stream からのデータ展開については NWADecode()参照
 **************************************************************
 */
 
-// #define NDEBUG /* �ʤ��� assert�����ä�����®�������� */
+// #define NDEBUG /* なぜか assertが入った方が速い、、、 */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -172,9 +172,9 @@
 
 #ifdef WORDS_BIGENDIAN
 #error Sorry, This program does not support BIG-ENDIAN system yet.
-/* �⤷ big endian �Υ����ƥ���б���������
-** �ʲ��� *_little_endian_* �ڤ�
-** getbits() �ؿ����ѹ�����ɬ�פ�����
+/* もし big endian のシステムに対応させる場合
+** 以下の *_little_endian_* 及び
+** getbits() 関数を変更する必要がある
 */
 #endif
 
@@ -200,7 +200,7 @@ inline int getbits(const char*& data, in
 	return ret & ((1<<bits)-1); /* mask */
 }
 
-/* ���ꤵ�줿�����Υإå���Ĥ��� */
+/* 指定された形式のヘッダをつくる */
 const char* make_wavheader(int size, int channels, int bps, int freq) {
 	static char wavheader[0x2c] = {
 		'R','I','F','F',
@@ -227,7 +227,7 @@ const char* make_wavheader(int size, int
 	return wavheader;
 }
 
-/* NWA �� bitstreamŸ����ɬ�פȤʤ���� */
+/* NWA の bitstream展開に必要となる情報 */
 class NWAInfo {
 	private:
 		int channels;
@@ -256,7 +256,7 @@ template<class NWAI> void NWADecode(cons
 	int i;
 	int shift = 0;
 	const char* dataend = data+datasize;
-	/* �ǽ�Υǡ������ɤ߹��� */
+	/* 最初のデータを読み込む */
 	if (info.Bps() == 8) {d[0] = *data++; datasize--;}
 	else /* info.Bps() == 16 */ {d[0] = read_little_endian_short(data); data+=2; datasize-=2;}
 	if (info.Channels() == 2) {
@@ -264,18 +264,18 @@ template<class NWAI> void NWADecode(cons
 		else /* info.Bps() == 16 */ {d[1] = read_little_endian_short(data); data+=2; datasize-=2;}
 	}
 	int dsize = outdatasize / (info.Bps()/8);
-	int flip_flag = 0; /* stereo �� */
+	int flip_flag = 0; /* stereo 用 */
 	int runlength = 0;
 	for (i=0; i<dsize; i++) {
 		if (data >= dataend) break;
-		if (runlength == 0) { // ���ԡ��롼����Ǥʤ��ʤ�ǡ����ɤ߹���
+		if (runlength == 0) { // コピーループ中でないならデータ読み込み
 			int type = getbits(data, shift, 3);
-			/* type �ˤ��ʬ����0, 1-6, 7 */
+			/* type により分岐:0, 1-6, 7 */
 			if (type == 7) {
-				/* 7 : �礭�ʺ�ʬ */
-				/* RunLength() ͭ������CompLevel==5, �����ե�����) �Ǥ�̵�� */
+				/* 7 : 大きな差分 */
+				/* RunLength() 有効時(CompLevel==5, 音声ファイル) では無効 */
 				if (getbits(data, shift, 1) == 1) {
-					d[flip_flag] = 0; /* ̤���� */
+					d[flip_flag] = 0; /* 未使用 */
 				} else {
 					int BITS, SHIFT;
 					if (info.CompLevel() >= 3) {
@@ -294,7 +294,7 @@ template<class NWAI> void NWADecode(cons
 						d[flip_flag] += (b&MASK2)<<SHIFT;
 				}
 			} else if (type != 0) {
-				/* 1-6 : �̾�κ�ʬ */
+				/* 1-6 : 通常の差分 */
 				int BITS, SHIFT;
 				if (info.CompLevel() >= 3) {
 					BITS = info.CompLevel()+3;
@@ -311,9 +311,9 @@ template<class NWAI> void NWADecode(cons
 				else
 					d[flip_flag] += (b&MASK2)<<SHIFT;
 			} else { /* type == 0 */
-				/* ����󥰥����̤ʤ��ξ��Ϥʤˤ⤷�ʤ� */
+				/* ランレングス圧縮なしの場合はなにもしない */
 				if (info.UseRunLength() == true) {
-					/* ����󥰥����̤���ξ�� */
+					/* ランレングス圧縮ありの場合 */
 					runlength = getbits(data,shift,1);
 					if (runlength==1) {
 						runlength = getbits(data,shift,2);
@@ -332,7 +332,7 @@ template<class NWAI> void NWADecode(cons
 			write_little_endian_short(outdata, d[flip_flag]);
 			outdata += 2;
 		}
-		if (info.Channels() == 2) flip_flag ^= 1; /* channel �ڤ��ؤ� */
+		if (info.Channels() == 2) flip_flag ^= 1; /* channel 切り替え */
 	}
 	return;
 }
@@ -377,9 +377,9 @@ class NWAData {
 			}
 			return blocksize * (bps/8);
 		}
-		/* data �� BlockLength �ʾ��Ĺ������Ĥ���
-		** �֤��ͤϺ��������ǡ�����Ĺ������λ���� 0��
-		** ���顼���� -1
+		/* data は BlockLength 以上の長さを持つこと
+		** 返り値は作成したデータの長さ。終了時は 0。
+		** エラー時は -1
 		*/
 		int Decode(FILE* in, char* data, int& skip_count);
 		void Rewind(FILE* in);
@@ -398,7 +398,7 @@ void NWAData::ReadHeader(FILE* in, int _
 	if (offset_start == -1) offset_start = 0;
 	if (_file_size != -1) filesize = _file_size;
 	curblock = -1;
-	/* header �ɤ߹��� */
+	/* header 読み込み */
 	if (in == NULL || feof(in) || ferror(in)) {
 		fprintf(stderr,"invalid stream\n");
 		return;
@@ -420,18 +420,18 @@ void NWAData::ReadHeader(FILE* in, int _
 	blocksize = read_little_endian_int(header+0x20);
 	restsize = read_little_endian_int(header+0x24);
 	dummy2 = read_little_endian_int(header+0x28);
-	if (complevel == -1) {	/* ̵����raw�ǡ��� */
-		/* Ŭ���˷���Ǥ����� */
+	if (complevel == -1) {	/* 無圧縮rawデータ */
+		/* 適当に決め打ちする */
 		blocksize = 65536;
 		restsize = (datasize % (blocksize * (bps/8))) / (bps/8);
 		blocks = datasize / (blocksize * (bps/8)) + (restsize > 0 ? 1 : 0);
 	}
 	if (blocks <= 0 || blocks > 1000000) {
-		/* �����֤�Ķ����ʤäƤΤϤʤ��Ǥ���*/
+		/* 1時間を超える曲ってのはないでしょ*/
 		fprintf(stderr,"too large blocks : %d\n",blocks);
 		return;
 	}
-	/* regular file �ʤ� filesize �ɤ߹��� */
+	/* regular file なら filesize 読み込み */
 	if (filesize == 0 && fstat(fileno(in), &sb)==0 && (sb.st_mode&S_IFMT) == S_IFREG) {
 		int pos = ftell(in);
 		fseek(in, 0, SEEK_END);
@@ -443,7 +443,7 @@ void NWAData::ReadHeader(FILE* in, int _
 		}
 	}
 	if (complevel == -1) return;
-	/* offset index �ɤ߹��� */
+	/* offset index 読み込み */
 	offsets = new int[blocks];
 	fread(offsets, blocks, 4, in);
 	for (i=0; i<blocks; i++) {
@@ -465,7 +465,7 @@ void NWAData::Rewind(FILE* in) {
 
 int NWAData::CheckHeader(void) {
 	if (complevel != -1 && offsets == NULL) return false;
-	/* �ǡ������Τ�ΤΥ����å� */
+	/* データそのもののチェック */
 	if (channels != 1 && channels != 2) {
 		fprintf(stderr,"This program only supports mono / stereo data : data have %d channels.\n",channels);
 		return false;
@@ -492,7 +492,7 @@ int NWAData::CheckHeader(void) {
 		fprintf(stderr,"This program only supports -1,0,1,2 compression level : the level of data is %d\n",complevel);
 		return false;
 	}
-	/* �����������å� */
+	/* 整合性チェック */
 	if (filesize != 0 && filesize != compdatasize) {
 		fprintf(stderr,"file size is invalid : %d != %d\n",filesize,compdatasize);
 		return false;
@@ -510,7 +510,7 @@ int NWAData::CheckHeader(void) {
 		fprintf(stderr,"total sample count is invalid : samplecount %d != %d*%d+%d(block*blocksize+lastblocksize).\n",samplecount,blocks-1,blocksize,restsize);
 		return false;
 	}
-	tmpdata = new char[blocksize*byps*2]; /* ����ʾ���礭���Ϥʤ������������� */
+	tmpdata = new char[blocksize*byps*2]; /* これ以上の大きさはないだろう、、、 */
 	return true;
 }
 
@@ -523,10 +523,10 @@ class NWAInfo_sw2 {
 };
 
 int NWAData::Decode(FILE* in, char* data, int& skip_count) {
-	if (complevel == -1) {		/* ̵���̻��ν��� */
+	if (complevel == -1) {		/* 無圧縮時の処理 */
 		if (feof(in) || ferror(in)) return -1;
 		if (curblock == -1) {
-			/* �ǽ�Υ֥��å��ʤ顢wave header ���� */
+			/* 最初のブロックなら、wave header 出力 */
 			memcpy(data, make_wavheader(datasize, channels, bps, freq), 0x2c);
 			curblock++;
 			fseek(in, offset_start + 0x2c, SEEK_SET);
@@ -555,12 +555,12 @@ int NWAData::Decode(FILE* in, char* data
 	if (blocks == curblock) return 0;
 	if (feof(in) || ferror(in)) return -1;
 	if (curblock == -1) {
-		/* �ǽ�Υ֥��å��ʤ顢wave header ���� */
+		/* 最初のブロックなら、wave header 出力 */
 		memcpy(data, make_wavheader(datasize, channels, bps, freq), 0x2c);
 		curblock++;
 		return 0x2c;
 	}
-	/* �����ɤ߹��ࡿ�ǥ����ɤ���ǡ������礭�������� */
+	/* 今回読み込む/デコードするデータの大きさを得る */
 	int curblocksize, curcompsize;
 	if (curblock != blocks-1) {
 		curblocksize = blocksize * (bps/8);
@@ -576,9 +576,9 @@ int NWAData::Decode(FILE* in, char* data
 		curblock++;
 		return -2;
 	}
-	/* �ǡ����ɤ߹��� */
+	/* データ読み込み */
 	fread(tmpdata, 1, curcompsize, in);
-	/* Ÿ�� */
+	/* 展開 */
 	if (channels == 2 && bps == 16 && complevel == 2) {
 		NWAInfo_sw2 info;
 		NWADecode(info, tmpdata, data, curcompsize, curblocksize);
--- a/music2/wavfile.cc
+++ b/music2/wavfile.cc
@@ -247,9 +247,9 @@ WAVFILE::WAVFILE(void) {
 }
 
 int WAVFILE_Stream::Read(char* in_buf, int blksize, int length) {
-	/* �ե�������ɤ߹��� */
+	/* ファイルの読み込み */
 	if (data_length == 0 && stream_length == 0) return -1;
-	/* wf->data �˥ǡ����λĤ꤬����Ф�����ɤ߹��� */
+	/* wf->data にデータの残りがあればそれも読み込む */
 	if (data_length > blksize*length) {
 		memcpy(in_buf, data, blksize*length);
 		data += blksize * length;
@@ -275,7 +275,7 @@ int WAVFILE_Stream::Read(char* in_buf, i
 
 void WAVFILE_Stream::Seek(int count) {
         int blksize = 1;
-        /* block size ������ */
+        /* block size の設定 */
 	blksize *= wavinfo.Channels * (wavinfo.DataBits/8);
 	data_length = 0;
 	stream_length = stream_length_orig - stream_top - count*blksize;
@@ -326,7 +326,7 @@ WAVFILE* WAVFILE::MakeConverter(WAVFILE*
 		need = true;
 	}
 	if (!need) return new_reader;
-	/* �Ѵ���ȤΥե����ޥåȤ����� */
+	/* 変換もとのフォーマットを得る */
 	int from_format;
 	if (new_reader->wavinfo.DataBits == 8) from_format = AUDIO_S8;
 	else from_format = AUDIO_S16;
@@ -379,9 +379,9 @@ int WAVFILE_Converter::Read(char* buf, i
 			}
 			cvt->len = cnt;
 			SDL_ConvertAudio(cvt);
-			if (freq < original->wavinfo.SamplingRate) { // rate conversion �� SDL_ConvertAudio �ǤϤ��ޤ��Ԥ��ʤ�
-				// 48000Hz -> 44100Hz or 22050Hz �ʤɤ�����
-				// Ĺ����û���ʤ�Ϥ��ʤΤǡ��ä˽����Ϥʤ�
+			if (freq < original->wavinfo.SamplingRate) { // rate conversion は SDL_ConvertAudio ではうまく行かない
+				// 48000Hz -> 44100Hz or 22050Hz などを想定
+				// 長さは短くなるはずなので、特に処理はなし
 				cvt->len = conv_wave_rate( (short*)(cvt->buf), cvt->len_cvt/4, original->wavinfo.SamplingRate, freq, tmpbuf);
 				cvt->len *= 4;
 			} else {
@@ -402,8 +402,8 @@ int WAVFILE_Converter::Read(char* buf, i
 	}
 	return copied_length / blksize;
 }
-/* format �� signed, 16bit, little endian, stereo �ȷ�ᤦ��
-** ���ˤ�äƤ��� big endian �ˤʤ뤳�Ȥ⤢�뤫�⡣
+/* format は signed, 16bit, little endian, stereo と決めうち
+** 場合によっていは big endian になることもあるかも。
 */
 static int conv_wave_rate(short* in_buf, int length, int in_rate, int out_rate, char* tmpbuf) {
 	int input_rate = in_rate;
@@ -415,13 +415,13 @@ static int conv_wave_rate(short* in_buf,
 
 	if (input_rate == output_rate) return length;
 	if (length <= 0) return 0;
-	/* ���̤μ��ȿ��Ѵ��������䴰 */
+	/* 一般の周波数変換:線型補完 */
 	int& first_flag = *(int*)(tmpbuf);
 	int& prev_time = *(int*)(tmpbuf+4);
 	int& prev_sample1 = *(int*)(tmpbuf+8);
 	int& prev_sample2 = *(int*)(tmpbuf+12);
 	out = (short*)(tmpbuf+16);
-	/* ���Ƥʤ�ǡ��������� */
+	/* 初めてならデータを初期化 */
 	if (first_flag == 0) {
 		first_flag = 1;
 		prev_time = 0;
@@ -429,7 +429,7 @@ static int conv_wave_rate(short* in_buf,
 		prev_sample2 = short(read_little_endian_short((char*)(in_buf++)));
 		length--;
 	}
-	/* �����������ǡ����̤����� */
+	/* 今回作成するデータ量を得る */
 	dtime = prev_time + length * output_rate_d;
 	outlen = (int)(dtime / input_rate_d);
 	out_orig = out;
@@ -439,14 +439,14 @@ static int conv_wave_rate(short* in_buf,
 		write_little_endian_short((char*)out, prev_sample2);
 		out++;
 	}
-	dtime -= input_rate_d*outlen; /* ���� prev_time */
+	dtime -= input_rate_d*outlen; /* 次の prev_time */
 
 	time = 0;
 	next_sample1 = short(read_little_endian_short((char*)(in_buf++)));
 	next_sample2 = short(read_little_endian_short((char*)(in_buf++)));
 	for (i=0; i < outlen; i++) {
-		/* double �Ƿ׻����Ƥߤ����ɤ�����ñ�ˤϹ�®����̵���餷�� */
-		/* �ʤ����Ѵ��� 1ʬ�Υǡ�����1�����٤�����(Celeron 700MHz) */
+		/* double で計算してみたけどそう簡単には高速化は無理らしい */
+		/* なお、変換は 1分のデータに1秒程度かかる(Celeron 700MHz) */
 		time += input_rate;
 		while(time-prev_time>output_rate) {
 			prev_sample1 = next_sample1;
@@ -676,7 +676,7 @@ enum mad_flow MP3FILE_impl::callback_wri
 	if (write_pointer + nsamples * nchannels * 2 > write_data_len) {
 		nsamples = (write_data_len - write_pointer) / nchannels / 2;
 	}
-	write_data_len &= ~(nchannels*2-1);	/* write_data_len �Ϥ��餫����ݤ�Ƥ��� */
+	write_data_len &= ~(nchannels*2-1);	/* write_data_len はあらかじめ丸めておく */
 	src_pointer += nsamples;
 	if (write_data == NULL) { // skip data write
 		write_pointer += nsamples*2*2;
--- a/music2/wavfile.h
+++ b/music2/wavfile.h
@@ -1,5 +1,5 @@
 /*
- * wavfile.h  WAV file��Ϣ
+ * wavfile.h  WAV file関連
  *
  *  Copyright: wavfile.c (c) Erik de Castro Lopo  erikd@zip.com.au
  *
--- a/scn2k/scn2k.h
+++ b/scn2k/scn2k.h
@@ -63,6 +63,6 @@ class PicContainer;
 class AyuSysConfig;
 class Surface;
 
-void dprintf(const char* fmt, ...); // debug ��
-void eprintf(const char* fmt, ...); // ���ޥ�ɼ¹�(XXXexec)������
+void dprintf(const char* fmt, ...); // debug 用
+void eprintf(const char* fmt, ...); // コマンド実行(XXXexec)追跡用
 #endif
--- a/scn2k/scn2k_cmd.cc
+++ b/scn2k/scn2k_cmd.cc
@@ -39,7 +39,7 @@ using namespace std;
 
 
 // #define SCN_DUMP
-/* �������� @@@ ��ɽ�� */
+/* 注意点: @@@ で表記 */
 
 
 
@@ -115,11 +115,11 @@ int Flags::Get(int type, int number) con
 	if (index == 11) index = 9;
 	if (index > TYPE_VARMAX || uint(type) > 4) return 0;
 	if (type == 0) {
-		// A[]..G[], Z[] ��ľ���ɤ�
+		// A[]..G[], Z[] を直に読む
 		if (uint(number) >= 2000) return 0;
 		return var[index][number];
 	} else {
-		// Ab[]..G4b[], Z8b[] �ʤɤ��ɤ�
+		// Ab[]..G4b[], Z8b[] などを読む
 		int factor = 1 << (type - 1);
 		int eltsize = 32 / factor;
 		if (uint(number) >= (64000 / factor)) return 0;
@@ -144,11 +144,11 @@ void Flags::Set(VarInfo info, int value)
 		fprintf(stderr,"Error: invalid access to Var<%d>[%d]\n",info.type,info.number);
 	}
 	if (type == 0) {
-		// A[]..G[], Z[] ��ľ�˽�
+		// A[]..G[], Z[] を直に書く
 		if (uint(info.number) >= 2000) return;
 		var[index][info.number] = value;
 	} else {
-		// Ab[]..G4b[], Z8b[] �ʤɤ��
+		// Ab[]..G4b[], Z8b[] などを書く
 		int factor = 1 << (type - 1);
 		int eltsize = 32 / factor;
 		int eltmask = (1 << factor) - 1;
@@ -340,13 +340,13 @@ void Flags::SaveSys(string& save) { //FI
 }
 
 bool Flags::Exec(Cmd& cmd) {
-	if (cmd.cmd_type == CMD_FLAGS) { // �����黻
+	if (cmd.cmd_type == CMD_FLAGS) { // 代入演算
 		if (cmd.args.size() != 2) return false;
 		Set(cmd.args[0], cmd.args[1].value);
 		cmd.clear();
 		return true;
 	}
-	if (cmd.cmd1 == 1 && cmd.cmd2 == 0x0a) { // ʸ����黻
+	if (cmd.cmd1 == 1 && cmd.cmd2 == 0x0a) { // 文字列演算
 		VarInfo arg1 = cmd.args[0];
 		switch(cmd.cmd3) {
 			case 0:
@@ -360,7 +360,7 @@ bool Flags::Exec(Cmd& cmd) {
 					for (i=0; i < sc[i] && len != 0; i++, len--) {
 						if (sc[i]<0 && sc[i+1]!=0) i++;
 					}
-					s.erase(i); // ���Ѥ� len ʸ���ޤ��ڤ�ͤ��
+					s.erase(i); // 全角で len 文字まで切り詰める
 					SetStr(arg1, s);
 	// fprintf(stderr,"Set[%d,%d]<-%s\n",arg1.type,arg1.number,s.c_str());
 				} else break;
@@ -371,7 +371,7 @@ bool Flags::Exec(Cmd& cmd) {
 					SetStr(arg1, "");
 					cmd.clear();
 				} else if (cmd.cmd4 == 1) {
-					// �ΰ�����ʸ���󥯥ꥢ
+					// 領域指定で文字列クリア
 					VarInfo v1 = cmd.args[0];
 					VarInfo v2 = cmd.args[1];
 					eprintf("memclear(str). Var[%d]<%d> - Var[%d]<%d>\n",v1.type, v1.number, v2.type, v2.number);
@@ -407,7 +407,7 @@ bool Flags::Exec(Cmd& cmd) {
 				break; }
 			case 5: // substring, index from left
 			case 6: // substring, index from right
-				// �����б��餷��
+				// 全角対応らしい
 				//FIXME: Make sure it works properly
 				{ int offset = cmd.args[2].value;
 				int len = strlen(cmd.Str(cmd.args[1]));
@@ -415,7 +415,7 @@ bool Flags::Exec(Cmd& cmd) {
 				const char* s = str.c_str();
 				if (cmd.cmd3 == 6) offset = len - offset;
 				if (offset < 0) offset = 0;			
-				// ��Ƭ N ʸ�����ɤ����Ф�
+				// 先頭 N 文字を読み飛ばす
 				int i;
 				int offset_top = 0;
 				for (i=0; i<offset && s[offset_top] != 0; i++) {
@@ -424,7 +424,7 @@ bool Flags::Exec(Cmd& cmd) {
 				}
 				if (s[offset_top] == 0) {
 					SetStr(arg1, "");
-				} else if (cmd.cmd4 == 0) { // Ĺ�����¤ʤ�
+				} else if (cmd.cmd4 == 0) { // 長さ制限なし
 				    SetStr(arg1, string(s, offset_top, len-offset_top));
 				} else { // cmd.cmd4 == 1
 					int slen = cmd.args[3].value;
@@ -447,7 +447,7 @@ bool Flags::Exec(Cmd& cmd) {
 				SetSys(i);
 				cmd.clear();
 				break; }
-			case 8: // ʸ������ڤä�û������
+			case 8: // 文字列を切って短くする
 				if (cmd.args[1].value <= 0) {
 					SetStr(arg1, "");
 				} else if (cmd.args[1].value < strlen(cmd.Str(cmd.args[1]))) {
@@ -455,7 +455,7 @@ bool Flags::Exec(Cmd& cmd) {
 				}
 				cmd.clear();
 				break;
-			case 0x0e: // �����⡼�ɤ�itoa
+			case 0x0e: // 漢字モードでitoa
 				{
 				int arg1 = cmd.args[0].value;
 				string result;
@@ -488,19 +488,19 @@ bool Flags::Exec(Cmd& cmd) {
 				cmd.clear();
 				}
 				break;
-			case 0x0f: case 0x11: // itoa (0x11 ������ zero padding ����äݤ�)
+			case 0x0f: case 0x11: // itoa (0x11 の方は zero padding するっぽい)
 				if (cmd.cmd4 == 0) {
 					int arg1 = cmd.args[0].value;
 					char buf[1024]; sprintf(buf, "%d", arg1);
 					SetStr(cmd.args[1], buf);
 					cmd.clear();
 				} else if (cmd.cmd4 == 1) {
-					// ����(SJIS) : 82 [4f+N]
-					// ��Ϥ��������ʤ���
+					// 漢字(SJIS) : 82 [4f+N]
+					// やはり漢字じゃない?
 					int arg1 = cmd.args[0].value;
 					char buf[1024]; char fmt[1024];
 					if (cmd.cmd3 == 0x0f) {
-						sprintf(fmt, "%%%dd",cmd.args[2].value); /* ����ǥѥǥ��� */
+						sprintf(fmt, "%%%dd",cmd.args[2].value); /* 空白でパディング */
 					} else {
 						sprintf(fmt, "%%0%dd",cmd.args[2].value);
 					}
@@ -509,7 +509,7 @@ bool Flags::Exec(Cmd& cmd) {
 					cmd.clear();
 				}
 				break;
-			case 0x64: // ʸ�����ɽ�� : ������ƥ����ȥ�����ɥ���ɽ��
+			case 0x64: // 文字列の表示 : 引数をテキストウィンドウに表示
 				if (cmd.cmd4 == 1) {
 					char buf[256];
 					snprintf(buf, 255, "%d", Get(cmd.args[0].type, cmd.args[0].number));
@@ -521,9 +521,9 @@ bool Flags::Exec(Cmd& cmd) {
 				break;
 		}
 	}
-	if (cmd.cmd1 == 1 && cmd.cmd2 == 0x0b) { // �����ѿ��黻
+	if (cmd.cmd1 == 1 && cmd.cmd2 == 0x0b) { // 数値変数演算
 		if (cmd.cmd3 == 0 && cmd.cmd4 == 0) {
-			/* ʣ�����ѿ��򥻥å� */
+			/* 複数の変数をセット */
 			VarInfo v1 = cmd.args[0];
 			eprintf("set multiple-var Var[%d]<%d> <- ",v1.type, v1.number);
 			int i;
@@ -539,7 +539,7 @@ bool Flags::Exec(Cmd& cmd) {
 			eprintf("\n");
 			cmd.clear();
 		} else if (cmd.cmd3 == 1 && cmd.cmd4 == 0) {
-			/* �ΰ������ѿ��򥯥ꥢ */
+			/* 領域指定で変数をクリア */
 			VarInfo v1 = cmd.args[0];
 			VarInfo v2 = cmd.args[1];
 			eprintf("memclear. Var[%d]<%d> - Var[%d]<%d>\n",v1.type, v1.number, v2.type, v2.number);
@@ -552,7 +552,7 @@ bool Flags::Exec(Cmd& cmd) {
 			}
 			cmd.clear();
 		} else if (cmd.cmd3 == 1 && cmd.cmd4 == 1) {
-			/* �ΰ������ѿ��򥻥å� */
+			/* 領域指定で変数をセット */
 			VarInfo v1 = cmd.args[0];
 			VarInfo v2 = cmd.args[1];
 			int value = cmd.args[2].value;
@@ -565,7 +565,7 @@ bool Flags::Exec(Cmd& cmd) {
 					Set(v1, value);
 			}
 			cmd.clear();
-		} else if (cmd.cmd3 == 4 && cmd.cmd4 == 1) { // �ΰ襯�ꥢ(sysfunc.txt)
+		} else if (cmd.cmd3 == 4 && cmd.cmd4 == 1) { // 領域クリア(sysfunc.txt)
 			VarInfo v1 = cmd.args[0];
 			int step = cmd.args[1].value;
 			int deal = cmd.args[2].value;
@@ -576,7 +576,7 @@ bool Flags::Exec(Cmd& cmd) {
 				v1.number += step;
 			}
 			cmd.clear();
-		} else if (cmd.cmd3 == 0x64 && cmd.cmd4 == 0) { //�ΰ�ǿ��ͤ��פ���
+		} else if (cmd.cmd3 == 0x64 && cmd.cmd4 == 0) { //領域で数値を合計する
 			VarInfo v1 = cmd.args[0];
 			VarInfo v2 = cmd.args[1];
 			eprintf("sum var. Var[%d]<%d> - Var[%d]<%d>\n",v1.type, v1.number, v2.type, v2.number);
@@ -633,9 +633,9 @@ bool SimpleCmd::operator==(const SimpleC
 **   Cmd
 */
 
-/* ���� num := 0x24 0xff <int num> */
-/* �ѿ� var := 0x24 <uchar type> 0x5b <exp> 0x5d */
-/* �� token := num | var | 0x28 <exp> 0x29 | <plus|minus> token */
+/* 数値 num := 0x24 0xff <int num> */
+/* 変数 var := 0x24 <uchar type> 0x5b <exp> 0x5d */
+/* 項 token := num | var | 0x28 <exp> 0x29 | <plus|minus> token */
 
 int Cmd::GetLeftToken(const char*& d, VarInfo& info) {
 	bool var_flag = true;
@@ -648,7 +648,7 @@ int Cmd::GetLeftToken(const char*& d, Va
 		var_flag = false;
 	}
 	if (d[0] == 0x24 && ((unsigned const char*)d)[1] == 0xff) {
-	// if ( (d[0] == 0x30 || d[0] == 0x31) && d[1] == 0x24 && ((unsigned const char*)d)[2] == 0xff) 	/* @@@ not supported; selection ��ǡ�0x30|0x31 ���տ魯�뤳�Ȥ����� */
+	// if ( (d[0] == 0x30 || d[0] == 0x31) && d[1] == 0x24 && ((unsigned const char*)d)[2] == 0xff) 	/* @@@ not supported; selection 内で、0x30|0x31 が付随することがある */
 		// numerical atom
 		d += 6;
 		value = read_little_endian_int(d-4);
@@ -746,8 +746,8 @@ Cmd::Cmd(const Flags& f, int _sys_ver) :
 	pos = -1;
 }
 
-/* �黻�� op := 0x5c <uchar op> */
-/* ���� exp: [op] <token> [op <token> [...]] */
+/* 演算子 op := 0x5c <uchar op> */
+/* 数式 exp: [op] <token> [op <token> [...]] */
 int Cmd::GetExpression(const char*& d, VarInfo* info_ptr) {
 #define STACK_DEPTH 1024
 #define OP_LB 11
@@ -755,7 +755,7 @@ int Cmd::GetExpression(const char*& d, V
 	int val_stack[STACK_DEPTH];
 	int stack_count = 0;
 	
-	// ������ɤ߹���
+	// 第一項の読み込み
 	while(*d == 0x28) {
 		d++;
 		dprintf("(");
@@ -772,7 +772,7 @@ int Cmd::GetExpression(const char*& d, V
 	
 	if (*d != 0x5c && stack_count == 0) {
 		if (info_ptr) *info_ptr = info;
-		return value; // ñ���left-term�Ϥ����ǽ�λ��ͭ����info_ptr�򵢤��ʲ�ǽ���������
+		return value; // 単純なleft-termはここで終了。有効なinfo_ptrを帰す(可能性がある)
 	}
 	
 	while(*d == 0x5c) {
@@ -783,7 +783,7 @@ int Cmd::GetExpression(const char*& d, V
 		if (op_type >= 10) SetError();
 		int cur_pri = op_pri(op_type);
 		while(stack_count != 0 && op_pri(op_stack[stack_count-1]) <= cur_pri) {
-			// ͥ���̤ι⤤����Ԥ���黻��Ԥ�
+			// 優先順位の高い、先行する演算を行う
 			value = eval(val_stack[stack_count-1], op_stack[stack_count-1], value);
 			stack_count--;
 		}
@@ -798,12 +798,12 @@ int Cmd::GetExpression(const char*& d, V
 		value = GetLeftToken(d, info);
 
 		while (*d != 0x5c && stack_count > 0) {
-			// ̤�¹Ԥα黻�򽪤�餻��
+			// 未実行の演算を終わらせる
 			if (op_stack[stack_count-1] != OP_LB) {
 				value = eval(val_stack[stack_count-1], op_stack[stack_count-1], value);
 				stack_count--;
 			} else if (*d == 0x29) { /* op_stack == OP_LB */
-			// bracket ��ü������С��Ĥ��Ƥ���
+			// bracket 終端があれば、閉じておく
 				d++;
 				dprintf(")");
 				stack_count--;
@@ -819,7 +819,7 @@ int Cmd::GetExpression(const char*& d, V
 	return value;
 }
 
-// ���ʬ�����Ѥˡ����黻�Ȼ��ѱ黻�κ�����ΤǤ������ѥ롼����������GetExpression�Ǻ����٤��ʤ�)
+// 条件分岐専用に、条件演算と算術演算の混合を検知できる専用ルーチン(本来はGetExpressionで差し支えない)
 int Cmd::GetExpressionCond(const char*& d) {
 	char op_stack[STACK_DEPTH];
 	int val_stack[STACK_DEPTH];
@@ -828,7 +828,7 @@ int Cmd::GetExpressionCond(const char*& 
 #define ATTR_FLAG 1
 	int stack_count = 0;
 	
-	// ������ɤ߹���
+	// 第一項の読み込み
 	while(*d == 0x28) {
 		d++;
 		dprintf("(");
@@ -850,7 +850,7 @@ int Cmd::GetExpressionCond(const char*& 
 		else dprintf("err.");
 		int cur_pri = op_pri_cond(op_type);
 		while(stack_count != 0 && op_pri_cond(op_stack[stack_count-1]) <= cur_pri) {
-			// ͥ���̤ι⤤����Ԥ���黻��Ԥ�
+			// 優先順位の高い、先行する演算を行う
 			if (op_stack[stack_count-1] >= 60) {
 				if (valattr_stack[stack_count-1] != ATTR_FLAG || valattr != ATTR_FLAG) SetError();
 			} else {
@@ -873,7 +873,7 @@ int Cmd::GetExpressionCond(const char*& 
 		valattr = ATTR_VAL;
 
 		while (*d != 0x5c && stack_count > 0) {
-			// ̤�¹Ԥα黻�򽪤�餻��
+			// 未実行の演算を終わらせる
 			if (op_stack[stack_count-1] != OP_LB) {
 				if (op_stack[stack_count-1] >= 60) {
 					if (valattr_stack[stack_count-1] != ATTR_FLAG || valattr != ATTR_FLAG) SetError();
@@ -883,7 +883,7 @@ int Cmd::GetExpressionCond(const char*& 
 				value = eval(val_stack[stack_count-1], op_stack[stack_count-1], value);
 				if (op_stack[stack_count-1] >= 40) valattr = ATTR_FLAG;
 				stack_count--;
-			// bracket ��ü������С��Ĥ��Ƥ���
+			// bracket 終端があれば、閉じておく
 			} else if (*d == 0x29) { /* op_stack == OP_LB */
 				d++;
 				dprintf(")");
@@ -905,23 +905,23 @@ args = 0x28 <exp> [[0x2c] <exp> [[0x2c] 
 */
 
 int Cmd::GetArgs(const char*& d) {
-	if (*d != 0x28) return 0; /* �����ʤ� */
+	if (*d != 0x28) return 0; /* 引数なし */
 	d++;
 	dprintf("args:");
 	VarInfo var;
 	int i; for (i=0; i<100 ; i++) {
-		/* number, variable, string �μ��̤ʤ��ͤ����� */
-		if (*d == 0x61) { // �褯�狼��ʤ�(���奢�ե���)
+		/* number, variable, string の種別なく値を得る */
+		if (*d == 0x61) { // よくわからない(智代アフター)
 			dprintf("@%d",d[1]);
 			d += 2;
 			if (*d == 0x28) {
 				dprintf("{");
-				GetArgs(d); // (A,B,C)�᤬�ޤޤ�뤳�Ȥ�����
+				GetArgs(d); // (A,B,C)節が含まれることがある
 				dprintf("}");
 			} else {
 				dprintf("{}");
 			}
-		} else if (d[0] == 0x0a || d[0] == 0x40) { // �褯�狼��ʤ� (Little Busters!)
+		} else if (d[0] == 0x0a || d[0] == 0x40) { // よくわからない (Little Busters!)
 			int var;
 			if (system_version == 0) { var = read_little_endian_int(d+1); d += 5;}
 			else { var = read_little_endian_short(d+1); d += 3;}
@@ -935,7 +935,7 @@ int Cmd::GetArgs(const char*& d) {
 			args.push_back(var);
 		} else SetError();
 		if (*d == 0x29) break;
-		if (*d == 0x2c) {d++;} // ���� arg ���黻�ҤǻϤޤ롢�ʤɤ��ʤ����¸�ߤ��ʤ�
+		if (*d == 0x2c) {d++;} // 次の arg が演算子で始まる、などがなければ存在しない
 		dprintf(",");
 	}
 	if (*d == 0x29) d++;
@@ -944,48 +944,48 @@ int Cmd::GetArgs(const char*& d) {
 }
 
 int Cmd::GetArgsSpecial(int normal_args,const char*& d) {
-	if (*d != 0x28) return 0; /* �����ʤ� */
+	if (*d != 0x28) return 0; /* 引数なし */
 	d++;
 	dprintf("args:");
 	int i; for (i=0; i<normal_args; i++) {
-		/* number, variable, string �μ��̤ʤ��ͤ����� */
+		/* number, variable, string の種別なく値を得る */
 		if (*d == 0x24 || (*d == 0x5c && (d[1] == 1 || d[1] == 0)) || *d == 0x28) {
 			GetExpression(d);
 		} else if (StrType(d)) {
 			GetString(d);
 		} else SetError();
 		if (*d == 0x29) break;
-		if (*d == 0x2c) {d++;} // ���� arg ���黻�ҤǻϤޤ롢�ʤɤ��ʤ����¸�ߤ��ʤ�
+		if (*d == 0x2c) {d++;} // 次の arg が演算子で始まる、などがなければ存在しない
 		dprintf(",");
 	}
 	for (i=0; i<argc ; i++) {
 		if (*d == 0x28) {
 /*
 ** cmd 01-22:0c1c, 01-22:0835
-** Princess Bride �Υ����ɤ�����륢�˥�ξ���
-** �ʤ���_PBCARDANM* �β����Ϥ��Υ��ޥ�ɤǤΤ߻Ȥ��Ƥ���Τǡ��ü�����Ȥ���̵�뤹�뤳�Ȥ��ǽ
+** Princess Bride のカードが落ちるアニメの場面
+** なお、_PBCARDANM* の画像はこのコマンドでのみ使われているので、特殊処理として無視することも可能
 **
 ** cmd 01-04:0276, 026c, 0270
-** ʣ���� enum �� args �ο�����³���������ü�����Ȥ���ʬΥ����
+** 複数の enum が args の数だけ続く処理。特殊処理として分離する
 */
 dprintf("enum.<");
-			/* (...) ����� or ��¤�Τβ�ǽ�������� */
+			/* (...) は列挙型 or 構造体の可能性がある */
 			const char* d_orig = d;
 			int pt = args.size(); args.push_back(VarInfo(0));
 			int count = GetArgs(d);
 			args[pt] = VarInfo(count);
 dprintf(">");
 		} else if (*d == 0x61 && (d[1] >= 0x00 && d[1] <= 0x04) && d[2] == 0x28 ) {
-			/* �Ȥ��륳�ޥ�ɤ� 01-21:004b, 01-28:0064 �Τ����줫��R,C,PB,LO)
-			** �����Υ��ޥ�ɤ�
-			** arg1: �����ե�����̾
-			** arg2 : Sel �ֹ�
-			** �餷����arg3 �ʹߤ� 0x61 <00-04> (a,b,c,...) �Ȥʤ�ʥ���׾�� enum ��ɽ�������)
-			** () ��ΰ����Ϥ��ޤ��ޤǡ�a �Τߡʲ����ե�����̾�ˡ�
+			/* 使われるコマンドは 01-21:004b, 01-28:0064 のいずれか(R,C,PB,LO)
+			** それらのコマンドは
+			** arg1: 画像ファイル名
+			** arg2 : Sel 番号
+			** らしく、arg3 以降が 0x61 <00-04> (a,b,c,...) となる(ダンプ上は enum と表記される)
+			** () 内の引数はさまざまで、a のみ(画像ファイル名)、
 			** a,b b=SEL?
-			** a,b,c (b,c)=��ɸ��
+			** a,b,c (b,c)=座標?
 			** a,(b,c,d,e,f,g) b-g = src / dest?
-			** �餷��
+			** らしい
 			*/
 			dprintf("kasane. #%d <",d[1]);
 			d += 2;
@@ -994,21 +994,21 @@ dprintf(">");
 			args[pt] = VarInfo(count);
 			dprintf(">");
 		} else if (*d == 0x24 || (*d == 0x5c && (d[1] == 1 || d[1] == 0))) {
-			/* cmd 01-15:0028 ; �Ϥ�� 0x24 �᤬���ꡢ³���� 0x28 ��ˤʤ� */
+			/* cmd 01-15:0028 ; 始めに 0x24 節があり、続いて 0x28 節になる */
 			VarInfo var;
 			GetExpression(d, &var);
 			args.push_back(var);
-			i--; // ���ΰ�����argc �ο��ˤ�����ʤ�
+			i--; // この引数はargc の数には入らない
 		} else SetError();
 		if (d[0] == 0x0a || d[0] == 0x40) {
-			/* cmd 01-15:0028 ; 0x28 ��θ����� 0x0a �᤬��� */
+			/* cmd 01-15:0028 ; 0x28 節の後に毎回 0x0a 節が来る */
 			int var;
 			if (system_version == 0) { var = read_little_endian_int(d+1); d += 5;}
 			else { var = read_little_endian_short(d+1); d += 3;}
 			dprintf("line %d; ",var);
 		}
 		if (*d == 0x29) break;
-		if (*d == 0x2c) {d++;} // ���� arg ���黻�ҤǻϤޤ롢�ʤɤ��ʤ����¸�ߤ��ʤ�
+		if (*d == 0x2c) {d++;} // 次の arg が演算子で始まる、などがなければ存在しない
 		dprintf(",");
 	}
 	if (*d == 0x29) d++;
@@ -1124,7 +1124,7 @@ void Cmd::GetSelection(const char*& d) {
 			else { var = read_little_endian_short(d+1); d += 3;}
 			dprintf("Line %d; ",var);
 			if (text.length() != 0) {
-				if (cond_result) ; // ����᤬ true �ʤ�ɽ�����ʤ�
+				if (cond_result) ; // 条件節が true なら表示しない
 				else {
 					const char* str = text.c_str();
 					VarInfo var;
@@ -1145,12 +1145,12 @@ void Cmd::GetSelection(const char*& d) {
 			dprintf(":cond:");
 			d++;
 			while(d[0] != 0x29) {
-				int result = GetExpressionCond(d); // PRINT- ��Ǥʤ��Ф��������ɽ��������ʸ���ᡢ�ޤ���PRINT��ΤϤ�
-				if (*d == 0x32) { // 0x32 �ʤ顢���ߤξ�����ɽ�����ʤ�
+				int result = GetExpressionCond(d); // PRINT- 節でないばあい、条件表示。次は文字節、またはPRINT節のはず
+				if (*d == 0x32) { // 0x32 なら、現在の条件節を表示しない
 					d++; dprintf("##");
 					cond_result = result;
-				} else if (*d == 0x31) { // 0x31 �ʤ顢���ߤξ�����ɽ������
-						// Little Busters! : ���ξ�������������̤����
+				} else if (*d == 0x31) { // 0x31 なら、現在の条件節を表示する
+						// Little Busters! : この条件で正しいかは未検証
 					d++; dprintf("***");
 					cond_result = !result;
 				}
@@ -1165,7 +1165,7 @@ void Cmd::GetSelection(const char*& d) {
 		} else if (*d == 0x23 && strncmp(d,"###PRINT",8) == 0) {
 			d += 8;
 			if (d[0] != 0x28) SetError();
-			else { // ʸ���ѿ������Ƥ�ɽ��
+			else { // 文字変数の内容の表示
 				d++;
 				dprintf("Print.");
 				VarInfo info;
@@ -1173,7 +1173,7 @@ void Cmd::GetSelection(const char*& d) {
 				if (d[0] != 0x29 || info.type == -1) SetError();
 				d++;
 				dprintf(";");/*
-				// ���ͤ�����ʸ�����Ѵ�������Ͽ
+				// 数値を全角文字に変換して登録
 				char str[10], str2[20]; // itoa
 				sprintf(str, "%d", info.value);
 				int i; for (i=0; str[i] != 0; i++) {
@@ -1187,7 +1187,7 @@ void Cmd::GetSelection(const char*& d) {
 	}
 	d++;
 	/* @@@ */
-	/* ���פ��ʤ���礬����Τǥ����ȥ����� */
+	/* 一致しない場合があるのでコメントアウト */
 	// if (arg_count != argc) SetError();
 	dprintf("\n}\n");
 }
@@ -1198,7 +1198,7 @@ void Cmd::GetCmd(Flags& flags_orig, cons
 
 	cmdstr[0] = 0;
 	rawdata = d;
-	if (*d == 0x23) { /* ���ޥ�� */
+	if (*d == 0x23) { /* コマンド */
 		cmd_type = CMD_OTHER;
 		cmd1 = *(unsigned const char*)(d+1);
 		cmd2 = *(unsigned const char*)(d+2);
@@ -1209,8 +1209,8 @@ void Cmd::GetCmd(Flags& flags_orig, cons
 		/* verbose */
 			// dprintf(" 0x23 - cmd %02x-%02x:%04x:%02x[%2d] \n",cmd1,cmd2,cmd3,cmd4,argc);
 			sprintf(cmdstr, "%02x-%02x:%04x:%02x  : %s",cmd1,cmd2,cmd3,cmd4, CmdDescr(cmd1,cmd2,cmd3,cmd4));
-		/* ���������� */
-		/* �ü�����Τ�� */
+		/* 引数を得る */
+		/* 特殊引数のもの */
 		int is_special = 0;
 		if (cmd1 == 0) {
 			if (cmd2 == 1) {
@@ -1229,12 +1229,12 @@ void Cmd::GetCmd(Flags& flags_orig, cons
 					if (*d++ != 0x28) { SetError(); return;}
 					dprintf("\t");
 					int cond = GetExpressionCond(d);
-					if (cmd3 == 1) cond = !cond; // �դˤʤ�
+					if (cmd3 == 1) cond = !cond; // 逆になる
 					if (*d++ != 0x29) { SetError(); return; }
 					int jumpto = read_little_endian_int(d);
 					d += 4;
 					dprintf("-> %d\n", jumpto);
-					if (! cond) jump_arg = jumpto; /* condition ����������ʤ���硢������ */
+					if (! cond) jump_arg = jumpto; /* condition が満たされない場合、ジャンプ */
 					is_special = 1;
 				} else if (cmd3 == 4) {
 					/* switch to */
@@ -1264,7 +1264,7 @@ void Cmd::GetCmd(Flags& flags_orig, cons
 			}
 		}
 retry:
-		/* ���̰����Τ�� */
+		/* 一般引数のもの */
 		if (!is_special) {
 			dprintf(" 0x23 - cmd %02x-%02x:%04x:%02x[%2d]  : %s\n",cmd1,cmd2,cmd3,cmd4,argc,CmdDescr(cmd1,cmd2,cmd3,cmd4));
 			dprintf("\t");
@@ -1278,7 +1278,7 @@ retry:
 			dprintf("\n");
 
 		}
-	} else if (*d == 0x24) { /* �����黻 */
+	} else if (*d == 0x24) { /* 代入演算 */
 		if (d[1] == 0x12 || d[2] != 0x5b) SetError();
 		dprintf("expr: ");
 		sprintf(cmdstr, "expr");
@@ -1291,20 +1291,20 @@ retry:
 		else dprintf("%s",op_str[type]);
 		d += 2;
 		int value2 = GetExpression(d);
-		// ���������������
+		// 代入情報を埋め込む
 		if (type != 30) value2 = eval(value, type-20, value2);
 		cmd_type = CMD_FLAGS;
 		args.push_back(info);
 		args.push_back(value2);
 		dprintf("\n");
-	} else if (StrType(d)) { /* ʸ������ */
+	} else if (StrType(d)) { /* 文字出力 */
 		VarInfo info;
 		info.type = TYPE_STR;
 		info.value = GetString(d);
 		args.push_back(info);
 		cmd_type = CMD_TEXT;
 		dprintf("\n");
-	} else if (*d == 0x0a || *d == 0x40 || *d == 0x21) { /* �ǥХå��ѥǡ����ȴ��ɥե饰 */
+	} else if (*d == 0x0a || *d == 0x40 || *d == 0x21) { /* デバッグ用データと既読フラグ */
 		cmd_type = CMD_NOP;
 		if (*d == 0x0a) {
 			dprintf("line ");
@@ -1319,9 +1319,9 @@ retry:
 			}
 			dprintf("%d\n", l);
 		} else { /* 0x40, 0x21 */
-			// ���ɥޡ������餷��������ȥ꡼�ݥ���Ȥȥ����֥ݥ���Ȥ�Ȥ��롣
-			// RealLive 1.2.5���顢0x40�ϥ����֥ݥ���ȡ�0x21�ϥ���ȥ꡼�ݥ���ȡ�
-			// 1.2.5�������ɤ����0x40���Ȥ��롣
+			// 既読マーカーらしい。エントリーポイントとセーブポイントも使われる。
+			// RealLive 1.2.5から、0x40はセーブポイント、0x21はエントリーポイント。
+			// 1.2.5以前、どちらも0x40が使われる。
 			int kidoku_index;
 			d++;
 			if (system_version == 0) {
@@ -1332,10 +1332,10 @@ retry:
 				d += 2;
 			}
 			dprintf("kidoku marker %d\n", kidoku_index);
-			// text_readflag�ϡ�����kidoku_index��Ȥä����ɤ����ʡ�
+			// text_readflagは、このkidoku_indexを使ったら良いかな。
 		}
 	} else if (*d == 0x2c) { /* ??? */
-		dprintf("commd;0x2c\n"); // conditional jump �ιԤ���ˤ褯����餷���ʾ�ˡ����Ϥ狼��ʤ���
+		dprintf("commd;0x2c\n"); // conditional jump の行き先によくあるらしい(常に、かはわからない)
 		d++;
 	} else { 
 		SetError();
@@ -1456,7 +1456,7 @@ const char* Cmd::Str(const VarInfo& info
 }
 
 int Cmd::AddStr(char* s) {
-	// 1-0a-0064 �Ϥ���������Τ�ɬ�פ餷��
+	// 1-0a-0064 はこういうものが必要らしい
 	int start = strend;
 	while (*s) strheap[strend++] = *s++;
 	strheap[strend++] = 0;
@@ -1474,7 +1474,7 @@ void Cmd::read(const CmdSimplified& from
 	cmd3 = from.cmd3;
 	cmd4 = from.cmd4;
 	argc = from.argc;
-	/* args ���ɤ߹��� */
+	/* args の読み込み */
 	args.clear();
 	char* d = from.args;
 	if (d == NULL) return;
@@ -1517,7 +1517,7 @@ void Cmd::write(CmdSimplified& to, char*
 	to.cmd3 = cmd3;
 	to.cmd4 = cmd4;
 	to.argc = argc;
-	/* args �ν񤭹��� */
+	/* args の書き込み */
 	if (args.empty()) {
 		to.args = NULL;
 	} else {
@@ -1549,7 +1549,7 @@ void CmdSimplified::copy(const CmdSimpli
 	*this = from;
 	if (args == NULL) return;
 	char* args_old = from.args;
-	/* args �Υ��ԡ� */
+	/* args のコピー */
 	while(*args_old != TYPE_END) {
 		if (*args_old == TYPE_VAL) {
 			args_old += 5;
@@ -1569,16 +1569,16 @@ void CmdSimplified::Save(string& saveret
 	sprintf(buf, "%02x-%02x:%04x:%02x(%02d),", cmd1, cmd2, cmd3, cmd4, argc);
 	saveret += buf;
 	
-	/* args �Υ��ԡ� */
+	/* args のコピー */
 	char* d = args;
 	while(d && *d != TYPE_END) {
 		if (*d == TYPE_VAL) {
 			d++;
 			sprintf(buf, "%d,", read_little_endian_int(d));
 			d += 4;
-		} else { /* TYPE_STR �Ȳ��� */
+		} else { /* TYPE_STR と仮定 */
 			d++;
-			if (strlen(d) > 1000) d[1000] = 0; // ���ꤨ�ʤ�������
+			if (strlen(d) > 1000) d[1000] = 0; // ありえない・・・
 			int i; int cnt = 0;
 			buf[cnt++] = '"';
 			for (i=0; d[i] != 0; i++) {
@@ -1681,7 +1681,7 @@ int main(int argc, char** argv) {
 		char* data = info->CopyRead();
 		char* d = data;
 		char* dend = d + info->Size();
-		/* version ��ǧ */
+		/* version 確認 */
 		if (read_little_endian_int(d) == 0x1cc) {
 			system_version = 0;
 		} else if (read_little_endian_int(d) == 0x1d0) {
@@ -1703,7 +1703,7 @@ int main(int argc, char** argv) {
 		const char* dstart = d;
 		fprintf(stderr,"Dumping %s\n",fname);
 		Flags flags;
-		/* �ǽ餫��Ǹ�ޤǥ��ޥ�ɼ��� -> ���Ϥ򷫤��֤� */
+		/* 最初から最後までコマンド取得 -> 出力を繰り返す */
 		while(dcur<dend) {
 			const char* dprev = dcur;
 			Cmd cmd(flags, system_version); cmd.ClearError();
--- a/scn2k/scn2k_cmd.h
+++ b/scn2k/scn2k_cmd.h
@@ -23,7 +23,7 @@ enum SkipMode {
 	SKIP_GRP_NODRAW=64, SKIPEND_TEXT=256, SKIPEND_KEY=512, SKIP_IN_MENU=1024
 };
 
-struct CmdSimplified { // Cmd ÊÝžÍÑ
+struct CmdSimplified { // Cmd 保存用
 	int type, cmd1, cmd2, cmd3, cmd4, argc;
 	char* args;
 	void Save(std::string& save);
--- a/scn2k/scn2k_flags.h
+++ b/scn2k/scn2k_flags.h
@@ -27,12 +27,12 @@ struct VarInfo {
 
 class Flags {
 /* flag:
-**  type 0-5 : ¥í¡Œ¥«¥ëÀ°¿ô¡¢³Æ2000žÄ
-**  type 6, 25 : ¥°¥í¡Œ¥Ð¥ëÀ°¿ô¡¢2000žÄ
-**      type 10,11: ¥í¡Œ¥«¥ëÀ°¿ô??¡¢³Æ2000žÄ
-**	type 12 : ¥°¥í¡Œ¥Ð¥ëÊž»úÎó¡¢2000žÄ (º£€Ï̵»ë€·€Æ€âÎÉ€€€¬)
-**	type 18 : ¥í¡Œ¥«¥ëÊž»úÎó¡¢2000žÄ
-**	type 25: ¥·¥¹¥Æ¥àÊÑ¿ô¡Ê¥Þ¥Š¥¹ºÂÉž€Ê€É¡©¡Ë 1000 žÄ¡©
+**  type 0-5 : ローカル整数、各2000個
+**  type 6, 25 : グローバル整数、2000個
+**      type 10,11: ローカル整数??、各2000個
+**	type 12 : グローバル文字列、2000個 (今は無視しても良いが)
+**	type 18 : ローカル文字列、2000個
+**	type 25: システム変数(マウス座標など?) 1000 個?
 **  type 26-32, 51 : 1-bit access to 0-6, 25
 **  type 52-58, 77 : 2-bit access to 0-6, 25
 **  type 78-84, 103 : 4-bit access to 0-6, 25
--- a/scn2k/scn2k_grp.cc
+++ b/scn2k/scn2k_grp.cc
@@ -126,17 +126,17 @@ void GrpObj::GetSrcGeom(int& width, int&
 		if (name.length() == 0) {
 			return;
 		}
-		/* �ܥ���ΰ��־������� */
-		/* g00 �ե�����Υإå���ʬ�˰��־�������äƤ��� */
+		/* ボタンの位置情報を求める */
+		/* g00 ファイルのヘッダ部分に位置情報は入っている */
 		string path(name);
 		path += ".g00";
 		ARCINFO* info = FileSearcher::GetInstance()->Find(FileSearcher::PDT, path.c_str(), "g00");
-		if (info == NULL) { // �ե����뤬���Ĥ���ʤ�
+		if (info == NULL) { // ファイルが見つからない
 			fprintf(stderr, "GrpObj::GetSrcGeom : Cannot find file %s\n", path.c_str());
 			return;
 		}
 		const char* data = info->Read();
-		if (data != NULL && *data == 2) { // �����ե�������˥ܥ������¸�ߤ���
+		if (data != NULL && *data == 2) { // 画像ファイル内にボタン情報が存在する
 			int srclen = read_little_endian_int(data+5);
 			int i;
 			for (i=0; i<srclen; i++) {
@@ -148,7 +148,7 @@ void GrpObj::GetSrcGeom(int& width, int&
 				if (width < src_pos.back().width()) width = src_pos.back().width();
 				if (height < src_pos.back().height()) height = src_pos.back().height();
 			}
-		} else { // �����ե����뤫���礭������
+		} else { // 画像ファイルから大きさ取得
 			width = read_little_endian_short(data+1);
 			height = read_little_endian_short(data+3);
 			src_pos.push_back(Rect(0,0,width,height));
@@ -213,7 +213,7 @@ void GrpObj::CreateSurface(PicContainer*
 		delete p;
 	}
 	src_pos.clear();
-	// picture �����
+	// picture を作成
 	pic_parent = parent;
 	picture = parent->create_leaf(Rect(_posx,_posy,_posx+1,_posy+1), 0);
 	picture->hide();
@@ -225,14 +225,14 @@ void GrpObj::UpdateSurface(void) {
 	int width = 0, height = 0;
 	if (gtype == FILE || gtype == GAN) {
 		if (name.length() == 0) return;
-		// �ե�����̾��¸�ߤ����硢�ե�������ɤ߹���
+		// ファイル名が存在する場合、ファイルを読み込み
 		GetSrcGeom(width, height);
 		if (width <= 0 || height <= 0) return;
-		// surface ������
+		// surface の設定
 		if (surface_num == 0 && ( (zoom > 0 && zoom != 256) || rotate > 0)) {
 			ZoomRotate();
 		} else {
-			// ���̤� surface ������
+			// 普通に surface を設定
 			string path(name);
 			path += ".g00";
 			picture->SetSurface(path.c_str(), 0, 0);
@@ -240,10 +240,10 @@ void GrpObj::UpdateSurface(void) {
 		}
 		if (attr & BLIT_ADD)
 			picture->SetSurfaceAttribute(PicBase::BLIT_ADD);
-	} else if (gtype == MOJI) { // �ƥ���������
+	} else if (gtype == MOJI) { // テキスト描画
 		if (print_moji.length() == 0) return;
 		UpdateMoji();
-	} else if (gtype == DIGIT) { // ���ͤ����ɽ��
+	} else if (gtype == DIGIT) { // 数値を画像表示
 		UpdateDigit();
 	}
 }
@@ -251,7 +251,7 @@ void GrpObj::UpdateSurface(void) {
 void GrpObj::ZoomRotate(void) {
 	picture->SetSurface( (Surface*)0, 0, 0);
 
-	// ��ž���̾�����Ϻ�ɸ�������������濴�ˤʤ�
+	// 回転、縮小拡大は座標原点が画像の中心になる
 	string path(name);
 	path += ".g00";
 	Surface* surface_orig = pic_parent->Root().NewSurface(path.c_str());
@@ -262,20 +262,20 @@ void GrpObj::ZoomRotate(void) {
 	picture->SetSurface(zoom_surface, 0, 0);
 	picture->SetSurfaceFreeFlag();
 	//picture->Move(PosX() + - zoom_r.width()/2, PosY() + - zoom_r.height()/2);
-// �濴��ɸ���狼��󡦡���
+// 中心座標がわからん・・・
 	picture->Move(320 - zoom_r.width()/2, 240 - zoom_r.height()/2);
 	picture->SetSurfaceRect(Rect(0, 0, zoom_r.width(), zoom_r.height()));
 
 	pic_parent->Root().DeleteSurface(surface_orig);
 }
 
-void GrpObj::UpdateMoji(void) { // ʸ�����礭�������ʤɤ��ѹ�
+void GrpObj::UpdateMoji(void) { // 文字の大きさ、色などを変更
 	if (print_moji.length() == 0 || print_size <= 2) return;
 	if (pic_parent == 0) return;
-	/* �ƥ����Ȥ��礭�������� */
+	/* テキストの大きさを得る */
 	int r, g, b;
-	if (print_r == -1 || print_g == -1 || print_b == -1) {// ������ʤ�
-		r = g = b = 0;  // �Ȥꤢ������(clannad ��Save/Load��˥塼��)
+	if (print_r == -1 || print_g == -1 || print_b == -1) {// 色設定なし
+		r = g = b = 0;  // とりあえず黒(clannad のSave/Loadメニュー用)
 	} else {
 		r = print_r;
 		g = print_g;
@@ -284,8 +284,8 @@ void GrpObj::UpdateMoji(void) { // ʸ�����礭�������ʤɤ��ѹ�
 	TextStream ts = TextStream::ParseMoji(print_moji.c_str(), r, g, b, print_size);
 	TextGlyphStream gs;
 	vector<int> lh;
-	// �Ȥꤢ���� drawable width �Ͻ�ʬ���礭��(2048)���
-	DefaultLayout(print_size-2)->Layout(ts, gs, lh, 2048); // print_size ���Τޤޤ��ȼ崳�礭������Τ� -2
+	// とりあえず drawable width は充分に大きく(2048)取る
+	DefaultLayout(print_size-2)->Layout(ts, gs, lh, 2048); // print_size そのままだと弱干大きすぎるので -2
 	int width = gs.width();
 	int height = gs.height();
 	Surface* surface = pic_parent->Root().NewSurface(width, height, ALPHA_MASK);
@@ -297,9 +297,9 @@ void GrpObj::UpdateMoji(void) { // ʸ�����礭�������ʤɤ��ѹ�
 }
 
 void GrpObj::UpdateDigit(void) {
-	// ����ɽ���ο���ʸ�����ɽ������
+	// 画像表示の数値文字列を表示する
 	if (name.length() == 0) return;
-	// �ե�����̾��¸�ߤ����硢�ե�������ɤ߹���
+	// ファイル名が存在する場合、ファイルを読み込み
 	string path(name);
 	path += ".g00";
 	Surface* surface_orig = pic_parent->Root().NewSurface(path.c_str());
@@ -310,14 +310,14 @@ void GrpObj::UpdateDigit(void) {
 	GetSrcGeom(width, height);
 	if (width <= 0 || height <= 0) return;
 	if (src_pos.size() < 14) {
-		// ɬ�פʿ��� object ���ʤ�
-		// ɽ���Ǥ��ʤ�ʬ�ζ��� rect ���ɲä��Ƥ���
+		// 必要な数の object がない
+		// 表示できない分の空の rect を追加しておく
 		for (i=src_pos.size(); i<14; i++)
 			src_pos.push_back(Rect(0,0,0,0));
 		pic_parent->Root().DeleteSurface(surface_orig);
 		return;
 	}
-	// ����η׻�
+	// 桁数の計算
 	char num_str[20];
 	if (dig_number < 0) sprintf(num_str, "%d", -dig_number);
 	else sprintf(num_str, "%d", dig_number);
@@ -333,9 +333,9 @@ void GrpObj::UpdateDigit(void) {
 	Surface* surface = pic_parent->Root().NewSurface(width*total_count, height, ALPHA_MASK);
 	DSurfaceFill(surface, Rect(*surface), 0, 0, 0, 0);
 
-	/* surface �˥��ԡ����� */
+	/* surface にコピーする */
 	int cur_x = 0;
-	if ( (attr & DIG_PACK) && !(attr & DIG_ZERO)) { // �Ϥ�˶��������
+	if ( (attr & DIG_PACK) && !(attr & DIG_ZERO)) { // 始めに空白を挿入
 		cur_x += space_count * width;
 	}
 	int plus = 10, minus = 11, plusminus = 12;
@@ -349,12 +349,12 @@ void GrpObj::UpdateDigit(void) {
 			DSurfaceMove(surface, src_pos[plus], surface, Rect(cur_x,0));
 		cur_x += width;
 	}
-	if (attr & DIG_ZERO) { // �������ѥǥ���
+	if (attr & DIG_ZERO) { // ゼロ・パディング
 		for (i=0; i<space_count; i++) {
 			DSurfaceMove(surface, src_pos[0], surface, Rect(cur_x, 0));
 			cur_x += width;;
 		}
-	} else if (!(attr & DIG_PACK)) { // PACK ���ץ����ʤ�
+	} else if (!(attr & DIG_PACK)) { // PACK オプションなし
 		cur_x += space_count * width;
 	}
 	for (i=0; num_str[i] != 0; i++) {
@@ -362,7 +362,7 @@ void GrpObj::UpdateDigit(void) {
 		cur_x += width;
 	}
 	
-	/* picture ������ */
+	/* picture に設定 */
 	picture->SetSurface(surface, 0, 0);
 	picture->SetSurfaceRect(Rect(0,0,width*total_count,height));
 	picture->SetSurfaceFreeFlag();
@@ -381,7 +381,7 @@ void GrpObj::CreateGan(Event::Container&
 		anm = NULL;
 	}
 	if (gan_name.empty()) return;
-	/* ���ˡ��᥷������ (.GAN �ե�����)����� */
+	/* アニーメション情報 (.GAN ファイル)を求める */
 	string path(gan_name);
 	path += ".gan";
 	ARCINFO* info = FileSearcher::GetInstance()->Find(FileSearcher::GAN, path.c_str(), "gan");
@@ -399,21 +399,21 @@ void GrpObj::CreateGan(Event::Container&
 	attr = Attribute(attr | UPDATE_POS);
 
 	const char* buf = data + 16;
-	buf += strlen(buf) + 1; // �����ե�����̾�����äƤ���
-	buf += 4; // ��� 20000
-	int pics = read_little_endian_int(buf); buf += 4; // ʣ���Υ��˥᡼�����������äƤ����硢����� 
-	// �ʲ���pics �󷫤��֤�
-	// ���˥᡼������Ԥ����Τ����
+	buf += strlen(buf) + 1; // 画像ファイル名が入っている
+	buf += 4; // 定数 20000
+	int pics = read_little_endian_int(buf); buf += 4; // 複数のアニメーション情報が入っている場合、情報数 
+	// 以下、pics 回繰り返し
+	// アニメーションを行う実体を作成
 	AnmAlphaMove* wid = new AnmAlphaMove(event, picture);
 
-	if (event_number && event_number < pics) { // ʣ���Υ��˥᡼�������󤬤����硢��ξ�����ɤ����Ф� */
+	if (event_number && event_number < pics) { // 複数のアニメーション情報がある場合、先の情報を読み飛ばす */
 		int i; for (i=0; i<event_number; i++) {
-			buf += 4; // ��� 30000
+			buf += 4; // 定数 30000
 			int ptns = read_little_endian_int(buf); buf += 4;
 			buf += ptns*52;
 		}
 	}
-	buf += 4; // ��� 30000
+	buf += 4; // 定数 30000
 	int ptns = read_little_endian_int(buf); buf += 4;
 	int total_time = 0;
 	int i;
@@ -425,7 +425,7 @@ void GrpObj::CreateGan(Event::Container&
 		int a = read_little_endian_int(buf+i*52+4*8+4);
 		x += PosX();
 		y += PosY();
-		if (p == -1) { a = 0; p = 0; } // p == -1 �ʤ�ʤˤ�ɽ�����ʤ�
+		if (p == -1) { a = 0; p = 0; } // p == -1 ならなにも表示しない
 		if (p >= src_pos.size()) {
 			fprintf(stderr,"Reading GAN file %s (G00 %s) : not enough pictures in .G00 file\n", path.c_str(), name.c_str());
 			a = 0; p = 0;
@@ -433,7 +433,7 @@ void GrpObj::CreateGan(Event::Container&
 		total_time += t;
 		wid->ptns.push_back(AnmAlphaMove::Ptn(Rect(x,y), src_pos[p], a, total_time));
 	}
-	wid->SetPtn(); // �ѥ�������Ͽ��λ
+	wid->SetPtn(); // パターン登録終了
 	attr = Attribute(attr | ANM_PLAYSTART);
 	anm = wid;
 }
@@ -449,16 +449,16 @@ void GrpObj::CreateGanSpecial(Event::Con
 		anm = NULL;
 	}
 
-	// ���˥᡼������Ԥ����Τ����
+	// アニメーションを行う実体を作成
 	AnmAlphaMove* wid = new AnmAlphaMove(event, picture);
 
 	int i;
 	switch(event_number) {
-		case 0: // pattern �� 0 ����Ǹ�ޤ��Ѳ�������
+		case 0: // pattern を 0 から最後まで変化させる
 			for (i=0; i<src_pos.size(); i++) {
 				wid->ptns.push_back(AnmAlphaMove::Ptn(Rect(PosX(), PosY()), src_pos[i], 255, time*i));
 			}
-			wid->SetPtn(); // �ѥ�������Ͽ��λ
+			wid->SetPtn(); // パターン登録終了
 			anm = wid;
 			attr = Attribute(attr | ANM_PLAYSTART);
 			break;
@@ -470,7 +470,7 @@ void GrpObj::CreateGanSpecial(Event::Con
 void GrpObj::SetZoomRotate(int new_zoom, int new_rotate) {
 	if (zoom == new_zoom && rotate == new_rotate) return;
 	if ( zoom == -1 || new_zoom == -1) {
-		attr = Attribute(attr | UPDATE_POS); // centering ����
+		attr = Attribute(attr | UPDATE_POS); // centering する
 	}
 	zoom = new_zoom;
 	if (new_rotate != -1) rotate = new_rotate;
@@ -535,7 +535,7 @@ void GrpObj::_debug_Dump(int id, int ind
 **
 **	class ScnGrp*
 */
-/* Princess Bride: �طʲ�ΰ����Τ߰�ư���μ��� */
+/* Princess Bride: 背景画の一部のみ移動、の実装 */
 
 ScnGrpMove::ScnGrpMove(Event::Container& container, PicBase* _pic, PicRoot& _root, Surface* _dest, const Rect& _dest_r, Surface* _src, const Rect& _from, const Rect& _to, int total_time) :
 	WidAnmTime(container, _pic, total_time),
@@ -563,7 +563,7 @@ void ScnGrpMove::Exec(int count) {
 }
 
 void ScnGrpAnm::CalcTotal(void) {
-	/* total time ��׻� */
+	/* total time を計算 */
 	if (empty()) return;
 	int tm = 0;
 	vector<ScnGrpAnmAtom>::iterator it;
@@ -883,13 +883,13 @@ Grp::~Grp() {
 
 Surface* Grp::Dsurface(int pdt) {
 	if (pdt == 0) return surface;
-	if (dsurface[pdt] == 0) { // �Ȥꤢ�������̤��礭���Ȥ������Ȥˤ���
+	if (dsurface[pdt] == 0) { // とりあえず画面の大きさということにする
 		if (pdt == WORKPDT)
 			dsurface[pdt] = parent.Root().NewSurface(parent.Width(), parent.Height(), ALPHA_MASK);
 		else
 			dsurface[pdt] = parent.Root().NewSurface(parent.Width(), parent.Height(), NO_MASK);
 	}
-	if (ssurface[pdt]) { // ssurface ��¸�ߤ���С�dsurface �˥��ԡ������֤�
+	if (ssurface[pdt]) { // ssurface が存在すれば、dsurface にコピーして返す
 		DSurfaceMove(ssurface[pdt], Rect(*ssurface[pdt]), dsurface[pdt], Rect(0,0));
 		parent.Root().DeleteSurface(ssurface[pdt]);
 		ssurface[pdt] = 0;
@@ -943,7 +943,7 @@ void Grp::LoadSurface(const char* str, i
 		if (ssurface[pdt]) parent.Root().DeleteSurface(ssurface[pdt]);
 		ssurface[pdt] = bg;
 		if (pdt == 0) {
-			/* �Ȥꤢ���� Princess Bride �Υ��˥᡼������������ */
+			/* とりあえず Princess Bride のアニメーション効果専用 */
 			Rect r(*ssurface[0]);
 			Rect dr(*surface);
 			int x = (dr.width()-r.width())/2;
@@ -1046,14 +1046,14 @@ void Grp::StartAnm(int type) {
 		anm1 = NULL;
 	}
 	map<int,GrpObj>::iterator it;
-	// ����ɽ�����object��õ�
+	// 現在表示中のobjectを消去
 	deleted_pic.push_back(screen);
 	for (it=grpobj.begin(); it!=grpobj.end(); it++) {
-		if (! (it->second.attr & GrpObj::WIPEON)) { // �����ڤ��ؤ����� object ���
+		if (! (it->second.attr & GrpObj::WIPEON)) { // 画像切り替え時に object 削除
 			deleted_pic.push_back(it->second.DeletePic());
 		} else {
 			GrpObj& new_obj = bs_obj[it->first];
-			if (new_obj.name.empty()) { // ������ object ��¸�ߤ��ʤ�������Ƥ�����Ѥ�
+			if (new_obj.name.empty()) { // 新しい object が存在しなければ内容を引き継ぐ
 				new_obj = it->second;
 				it->second.DeletePic();
 			} else {
@@ -1062,10 +1062,10 @@ void Grp::StartAnm(int type) {
 			}
 		}
 	}
-	grpobj.clear(); // �����֥������Ⱥ��
+	grpobj.clear(); // 全オブジェクト削除
 
-	// ���������֥������Ȥ�����screen ��ư
-	// ������ screen_front ��������Ƥ���
+	// 全画像オブジェクトの前にscreen 移動
+	// 新しい screen_front を作成しておく
 	screen = screen_front;
 	screen->hide();
 	screen->SetSurface(surface_update, 0, 0);
@@ -1075,8 +1075,8 @@ void Grp::StartAnm(int type) {
 	screen_front->hide();
 	screen_front->ZMove(screen);
 	
-	// ������ object �ع�����surface_update �ؿ����� object ��ɽ��
-	// (object �������� picture �� hide ����Ƥ���)
+	// 新しい object へ更新、surface_update へ新しい object を表示
+	// (object 作成時は picture は hide されている)
 	for (it=bs_obj.begin(); it!=bs_obj.end(); it++) {
 		grpobj[it->first] = it->second;
 		it->second.DeletePic();
@@ -1090,10 +1090,10 @@ void Grp::StartAnm(int type) {
 		}
 	}
 	bs_obj.clear();
-	// �������̳���
+	// 画像効果開始
 	switch(sel.sel_no) {
 		default:
-		case 0: case 50: // 0 �� 50 �ΰ㤤���ɤ��狼��ʤ�
+		case 0: case 50: // 0 と 50 の違いが良くわからない
 			if (skip_mode & SKIP_GRP_NOEFFEC)
 				anm1 = new WidAnmAlpha(event, screen, ALPHA_MAX, ALPHA_MAX, 0);
 			else if (skip_mode & SKIP_GRP_FAST)
@@ -1114,7 +1114,7 @@ void Grp::StartShake(int total, const in
 		anm2 = NULL;
 	}
 	if (skip_mode & SKIP_GRP_NOEFFEC) return;
-	AnmAlphaMove* new_anm = new AnmAlphaMove(event, &parent); // shake screen �Ǥϸ����̤κ�ɸ���ɤ餹
+	AnmAlphaMove* new_anm = new AnmAlphaMove(event, &parent); // shake screen では元画面の座標を揺らす
 	int i;
 	int tm = 0;
 	for (i=0; i<total; i+=3) {
@@ -1124,7 +1124,7 @@ void Grp::StartShake(int total, const in
 		tm += pattern[i+2];
 	}
 	new_anm->ptns.push_back(AnmAlphaMove::Ptn(Rect(0,0), Rect(0,0), 255, tm));
-	new_anm->SetPtn(); // �ѥ�������Ͽ��λ
+	new_anm->SetPtn(); // パターン登録終了
 	new_anm->Play();
 	anm2 = new_anm;
 }
@@ -1134,35 +1134,35 @@ void Grp::AbortAnm(void) {
 	anm1->Abort();
 	delete anm1;
 	anm1 = NULL;
-	/* �������̽�λ */
-	/* �Ť����̤ؤβ������̤�����оõ� */
+	/* 画像効果終了 */
+	/* 古い画面への画像効果があれば消去 */
 	if (anm2 && anm2->pic[0] != screen) {
 		anm2->Abort();
 		delete anm2;
 		anm2 = NULL;
 	}
-	/* pdt1 -> pdt0 �إ��ԡ� */
+	/* pdt1 -> pdt0 へコピー */
 	DSurfaceMove(dsurface[1], Rect(*dsurface[1]), surface, Rect(0,0));
 	screen->SetSurface(surface, 0, 0);
-	// �������̳��ϻ���¸�ߤ���object��õ�
-	// ������ object ɽ��
+	// 画像効果開始時に存在したobjectを消去
+	// 新しい object 表示
 	RefreshObj();
 	return;
 }
 
 void Grp::LoadSurface(const char* str) {
-	if (anm1 != NULL) AbortAnm(); // �������褬����äƤʤ���ж�����λ
+	if (anm1 != NULL) AbortAnm(); // 前の描画が終わってなければ強制終了
 	LoadSurface(str, 1);
 	bg_name = str;
 }
 
 void Grp::LoadSurface(void) {
-	if (anm1 != NULL) AbortAnm(); // �������褬����äƤʤ���ж�����λ
+	if (anm1 != NULL) AbortAnm(); // 前の描画が終わってなければ強制終了
 	LoadSurface(bg_name.c_str(), 1);
 }
 
 void Grp::AddSurface(const char* str) {
-	if (anm1 != NULL) AbortAnm(); // �������褬����äƤʤ���ж�����λ
+	if (anm1 != NULL) AbortAnm(); // 前の描画が終わってなければ強制終了
 	LoadSurface(bg_name.c_str());
 
 	string s = str;
@@ -1185,7 +1185,7 @@ void Grp::CreateObj(int index) {
 	GrpObj& g = grpobj[index];
 	g.CreateSurface(&parent);
 	g.order = index;
-	if (g.picture == NULL) return; // ���顼��surface ��¸�ߤ��ʤ�
+	if (g.picture == NULL) return; // エラー:surface が存在しない
 	g.picture->hide();
 	SetObjChanged(index);
 	ZMoveObj(index);
@@ -1200,7 +1200,7 @@ void Grp::CreateSubObj(int grp_index, in
 	g = &g->children_obj[index];
 	g->CreateSurface(&parent);
 	g->order = index;
-	if (g->picture == NULL) return; // ���顼��surface ��¸�ߤ��ʤ�
+	if (g->picture == NULL) return; // エラー:surface が存在しない
 	g->picture->hide();
 	//TODO
 	SetObjChanged(grp_index);
@@ -1212,8 +1212,8 @@ void Grp::ZMoveObj(int index) {
 	if (cur == grpobj.end()) return;
 	GrpObj& g = grpobj[index];
 	if (g.picture == NULL) return;
-	// ��ʬ������� object ������С���������ɽ��
-	// �����Ǥʤ���� screen ������ɽ��
+	// 自分より前に object があれば、その前に表示
+	// そうでなければ screen の前に表示
 	GrpObjMap::iterator cur_backobj = grpobj.end();
 	GrpObjMap::iterator it;
 	for (it = grpobj.begin(); it != grpobj.end(); it++) {
@@ -1235,10 +1235,10 @@ void Grp::ZMoveObj(int index) {
 }
 
 void Grp::SwapObj(int index1, int index2) {
-	// �ǥե�����ͤ��� order ���ѹ�����Ƥ������Τߡ�order ����¸�����
-	// �ޤ���ξ����object��swap
+	// デフォルト値から order が変更されていた場合のみ、order は保存される
+	// まずは両方のobjectをswap
 	if (grpobj.find(index1) == grpobj.end()) {
-		if (grpobj.find(index2) == grpobj.end()) return; // �ɤ���� object ��¸�ߤ��ʤ�
+		if (grpobj.find(index2) == grpobj.end()) return; // どちらの object も存在しない
 		grpobj[index1] = grpobj[index2];
 		if (grpobj[index1].order == index2)
 			grpobj[index1].order = index1;
@@ -1246,7 +1246,7 @@ void Grp::SwapObj(int index1, int index2
 		grpobj.erase(index2);
 		ZMoveObj(index1);
 		return;
-	} else if (grpobj.find(index2) == grpobj.end()) { // index2 ��¸�ߤ��ʤ����
+	} else if (grpobj.find(index2) == grpobj.end()) { // index2 が存在しない場合
 		grpobj[index2] = grpobj[index1];
 		if (grpobj[index2].order == index1)
 			grpobj[index2].order = index2;
@@ -1269,7 +1269,7 @@ void Grp::SwapObj(int index1, int index2
 	}
 }
 
-bool Grp::Pressed(int x, int y, void* pointer) { // �ޥ�������å��ǥ���󥻥�
+bool Grp::Pressed(int x, int y, void* pointer) { // マウスクリックでキャンセル
 	Grp* g = (Grp*)pointer;
 	if (g->status == WAIT_MOVIE)
 		g->music->StopMovie();
@@ -1283,7 +1283,7 @@ bool Grp::Pressed(int x, int y, void* pointer) { // �ޥ�������å��ǥ���󥻥�
 	return false; // event deleted
 }
 
-/* mode.cgm �� decode �� */
+/* mode.cgm の decode 用 */
 static unsigned char decode_char[256] = {
 	0x8b, 0xe5, 0x5d, 0xc3, 0xa1, 0xe0, 0x30, 0x44, 
 	0x00, 0x85, 0xc0, 0x74, 0x09, 0x5f, 0x5e, 0x33, 
@@ -1320,7 +1320,7 @@ static unsigned char decode_char[256] = 
 };
 
 void Grp::LoadCgm() {
-	/* cgm �ե������ɤ߹��� */
+	/* cgm ファイル読み込み */
 	const char* fname = config->GetParaStr("#CGTABLE_FILE");
 	if (fname == NULL) return;
 	ARCINFO* info = FileSearcher::GetInstance()->Find(FileSearcher::ALL, fname, "");
@@ -1337,11 +1337,11 @@ void Grp::LoadCgm() {
 	cgm_size = read_little_endian_int(data+0x10);
 
 	int i, j;
-	// xor ���
+	// xor 解除
 	for (i=0; i < sz-0x20; i++) {
 		data[i+0x20]^=decode_char[i&0xff];
 	}
-	// Ÿ��
+	// 展開
 	int dest_size = cgm_size * 36;
 	char* dest = new char[dest_size+1024];
 	char* src = data + 0x28;
@@ -1359,7 +1359,7 @@ void Grp::LoadCgm() {
 
 /*****************************************************
 *
-*   Grp :: Save, Load : �����֥ե��������
+*   Grp :: Save, Load : セーブファイル処理
 *
 */
 void Grp::Save(std::string& str) {
@@ -1426,7 +1426,7 @@ void Grp::LoadSys(const char* save) {
 
 /*****************************************************
 *
-*   Grp :: Wait , Exec : ���ޥ�ɼ¹���
+*   Grp :: Wait , Exec : コマンド実行部
 *
 */
 static vector<int> drawn_images;
@@ -1509,7 +1509,7 @@ bool Grp::Wait(unsigned int current_time
 	return false;
 }
 
-void Grp::DeleteObjPic(int num) { // object �� surface �Τߺ��
+void Grp::DeleteObjPic(int num) { // object の surface のみ削除
 	if (grpobj.find(num) == grpobj.end()) return;
 	deleted_pic.push_back(grpobj[num].DeletePic());
 }
@@ -1539,12 +1539,12 @@ void Grp::DeleteSubObj(int num_grp, int 
 
 void Grp::Exec(Cmd& cmd) {
 	if (cmd.cmd_type == CMD_TEXTEND) {
-		music->StopKoe(500); // �ƥ����Ƚ�λ������ߤ��
+		music->StopKoe(500); // テキスト終了で声を止める
 		cmd.clear();
 		return;
 	}
 	if (cmd.cmd_type == CMD_WAITFRAMEUPDATE) {
-		// wait ������� RefreshObj() ���Ƥ���
+		// wait する場合は RefreshObj() しておく
 		RefreshObj();
 	}
 	if (cmd.cmd_type != CMD_OTHER) return;
@@ -1552,8 +1552,8 @@ void Grp::Exec(Cmd& cmd) {
 	CommandHandler::Exec(cmd);
 
 	//TODO: ???
-	if (cmd.cmd1 == 1 && cmd.cmd2 == 60 && cmd.cmd3 == 0) { // ??? : KANOGI : �������֥������Ȥκ����
-		DeleteObjPic(cmd.args[0].value); // ��ե�����̾��surface����
+	if (cmd.cmd1 == 1 && cmd.cmd2 == 60 && cmd.cmd3 == 0) { // ??? : KANOGI : 画像オブジェクトの削除?
+		DeleteObjPic(cmd.args[0].value); // 旧ファイル名のsurfaceを削除
 		GrpObj& g = grpobj[cmd.args[0].value];
 		g.attr = GrpObj::Attribute(g.attr | GrpObj::HIDDEN);
 		cmd.clear();
--- a/scn2k/scn2k_impl.cc
+++ b/scn2k/scn2k_impl.cc
@@ -76,7 +76,7 @@ Scn2k::Scn2k(Event::Container& _event, P
 	menu = NULL;
 	menu_mouseshown = false;
 
-	/* �ޥ��������������� */
+	/* マウスカーソルを作成 */
 	mouse_type = 0;
 	mouse_surface = NULL;
 	mouse_pressed = 0;
@@ -107,7 +107,7 @@ char* Scn2k::OpenScript(int new_scn_numb
 	if (info == NULL) goto err;
 	data = info->Read();
 
-	/* version ��ǧ */
+	/* version 確認 */
 	scenario_magic = read_little_endian_int(data + 4);
 	if (scenario_magic != 0x2712 && scenario_magic != 0x1adb2) {
 		fprintf(stderr,"Invalid scenario header : scenario number %d\n",new_scn_number);
@@ -123,7 +123,7 @@ char* Scn2k::OpenScript(int new_scn_numb
 		fprintf(stderr,"Invalid scenario header : scenario number %d\n",new_scn_number);
 		goto err;
 	}
-	/* header ���� subroutine number �Ȥ���� */
+	/* header から subroutine number とりだし */
 	if (call_vec) {
 		int i;
 		for (i=0; i<100; i++) {
@@ -170,7 +170,7 @@ bool Scn2k::ChangeScript(int new_scn_num
 			scn_pt = 0;
 		}
 	} else if (call_no < 0) {
-		scn_pt = -call_no; // �ǥХå���
+		scn_pt = -call_no; // デバッグ用
 	}
 
 	scn_number = new_scn_number;
@@ -205,21 +205,21 @@ bool Scn2k::ReadCmdAt(Cmd& cmd, int scn,
 	return true;
 }
 
-extern bool save_req, load_req; // �����ܡ��ɤ��饻���֡������ɤǤ���褦��
+extern bool save_req, load_req; // キーボードからセーブ・ロードできるように
 extern bool pressAreq;
 
 void Scn2k::Elapsed(unsigned int current_time) {
-	SetWakeup(current_time + 10); // 10ms�˰�󥷥ʥꥪ������ץȲ��
+	SetWakeup(current_time + 10); // 10msに一回シナリオスクリプト解釈
 	if (script == NULL) return;
-//VarInfo info; info.type = 6; info.number = 0; // PB �Ρְ�󥲡���򳫻Ϥ������Ȥ�����ץե饰
+//VarInfo info; info.type = 6; info.number = 0; // PB の「一回ゲームを開始したことがある」フラグ
 //flag.Set(info,1);
-//info.type = 0; info.number = 604; // Princess Bride: ���ꥢ�о�����ե饰 (��)
+//info.type = 0; info.number = 604; // Princess Bride: クリア対象設定フラグ (聖)
 //flag.Set(info, 1); 
 
 
 	Cmd cmd(flag, system_version);
 	int cnt1;
-	int cnt2 = 1000; // flag / jump / flag �ϥ��ޥ�ɤκ���¹Բ��
+	int cnt2 = 1000; // flag / jump / flag 系コマンドの最大実行回数
 
 	/* XXX */
 	if (save_req) {
@@ -237,12 +237,12 @@ void Scn2k::Elapsed(unsigned int current
 		return;
 	}
 
-	/* �������Ϥʤɤ��б� */
-	// ��˥塼��ʳ��� shift �����������줿�饹���å׳���
+	/* キー入力などに対応 */
+	// メニュー内以外で shift キーが押されたらスキップ開始
 	if ( (skip_mode&SKIP_IN_MENU) == 0) {
 		if (event.pressed(KEY_SHIFT)) {
 			if (skip_mode & SKIP_TEXT) {
-				; // �����å���ʤ�ʤˤ⤷�ʤ�
+				; // スキップ中ならなにもしない
 			} else {
 				SetSkipMode(SkipMode(SKIP_TEXT | SKIP_GRP_NOEFFEC | SKIPEND_KEY));
 			}
@@ -261,8 +261,8 @@ void Scn2k::Elapsed(unsigned int current
 		}
 	}
 
-	for (cnt1=0; cnt1<20; cnt1++) { // ���ˤĤ� 20 �ĤΥ��ޥ�ɼ¹�
-		// ¾�Υ��ޥ�ɼ¹���ʤ齪λ
+	for (cnt1=0; cnt1<20; cnt1++) { // 一回につき 20 個のコマンド実行
+		// 他のコマンド実行中なら終了
 		if ( (cmd.cmd_type == CMD_NOP && SysWait(cmd)) ||
 		     // (cmd.cmd_type == CMD_NOP && text_exec.Wait(current_time, cmd)) ||
 		     // (cmd.cmd_type == CMD_NOP && grp_exec.Wait(current_time, cmd))) {
@@ -270,7 +270,7 @@ void Scn2k::Elapsed(unsigned int current
 		     (cmd.cmd_type == CMD_NOP && text_exec.Wait(current_time, cmd))) {
 			break;
 		}
-		// ���ޥ���ɤ߹���
+		// コマンド読み込み
 		for (; cnt2 > 0; cnt2--) {
 			scn_point = script - script_start;
 			eprintf("%d / %d :", script - script_start, script_end-script_start);
@@ -355,7 +355,7 @@ fprintf(stderr," -> fall back to %d\n",s
 
 		if (cmd.cmd_type == CMD_TEXT && cmd.pos != -1) {
 			set<int>& readflag = text_readflag[scn_number];
-			if (readflag.find(cmd.pos) == readflag.end()) { // ̤�ɥƥ�����ȯ��
+			if (readflag.find(cmd.pos) == readflag.end()) { // 未読テキスト発見
 				readflag.insert(cmd.pos);
 				if (skip_mode & SKIPEND_TEXT) {
 					if (!(skip_mode & SKIPEND_KEY)) SetSkipMode(SKIP_NO);
@@ -474,10 +474,10 @@ void Scn2k::SysExec(Cmd& cmd) {
 			return;
 		}
 		if (cmd.cmd_type == CMD_BACKLOGREQ_FWD) {
-			cmd.clear(); // backlog mode �ʳ��� fwd �򲡤���Ƥ�ʤˤ⤷�ʤ�
+			cmd.clear(); // backlog mode 以外で fwd を押されてもなにもしない
 			return;
 		}
-		SetSkipMode(SKIP_IN_MENU); // �ƥ����ȥ����å����Ϥ���������
+		SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
 		menu = new Scn2kMenu(Scn2kMenu::MENU_BACKLOG, *this, flag, text_exec, system_version);
 		menu->InitPanel(event, parent);
 		menu->InitTitle(Scn2kSaveTitle(*this));
@@ -490,7 +490,7 @@ void Scn2k::SysExec(Cmd& cmd) {
 		int scn=0, pt=0;
 		config->GetParam("#CANCELCALL", 2, &scn, &pt);
 		if (scn) {
-			// ������å����줿�� global call ��Ԥ�
+			// 右クリックされたら global call を行う
 			cmd.cmd_type = CMD_OTHER;
 			cmd.cmd1 = 0;
 			cmd.cmd2 = 1;
@@ -499,16 +499,16 @@ void Scn2k::SysExec(Cmd& cmd) {
 			cmd.args.clear();
 			cmd.args.push_back(VarInfo(SCN_INFO_MENU));
 			cmd.args.push_back(0);
-			SetSkipMode(SKIP_IN_MENU); // �ƥ����ȥ����å����Ϥ���������
+			SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
 		}
 	}
 	if (cmd.cmd_type == CMD_SAVECMDGRP || cmd.cmd_type == CMD_SAVECMDGRP_START || cmd.cmd_type == CMD_SAVECMDGRP_ONCE || cmd.cmd_type == CMD_SAVECMD_ONCE) {
-		// �������ޥ�����ϥ����å�����¸���������ֻ�����¸�Ǥ���褦�ˤ���
+		// 画像コマンド等はスタックに保存し、セーブ時に保存できるようにする
 		if (cmd.cmd_type == CMD_SAVECMDGRP_START) {
 			vector<CmdSimplified>::iterator it, cur;
 			cur = cmd_stack.begin();
 			cmd_stack_str = cmd_stack_str_orig;
-			/* ������Ϣ���ޥ�ɰʳ����̤ˤ��� */
+			/* 画像関連コマンド以外を別にする */
 			for (it=cmd_stack.begin(); it != cmd_stack.end(); it++) {
 				if (it->type != CMD_SAVECMDGRP && it->type != CMD_SAVECMDGRP_START && it->type != CMD_SAVECMDGRP_ONCE) {
 					cur->copy(*it, cmd_stack_str);
@@ -517,7 +517,7 @@ void Scn2k::SysExec(Cmd& cmd) {
 			}
 			cmd_stack.erase(cur, cmd_stack.end());
 		}
-		if (cmd.cmd_type == CMD_SAVECMD_ONCE || cmd.cmd_type == CMD_SAVECMDGRP_ONCE) { // Ʊ�����ޥ�ɤ�����к������
+		if (cmd.cmd_type == CMD_SAVECMD_ONCE || cmd.cmd_type == CMD_SAVECMDGRP_ONCE) { // 同じコマンドがあれば削除する
 			vector<CmdSimplified>::iterator it;
 			for (it = cmd_stack.end(); it != cmd_stack.begin(); ) {
 				--it;
@@ -543,22 +543,22 @@ void Scn2k::SysExec(Cmd& cmd) {
 		    int call_no = 0;
 		    if (cmd.args.size() >= 2) call_no = cmd.args[1].value;
 			eprintf("global jump to %d\n",cmd.args[0].value);
-			if (! ChangeScript(cmd.args[0].value, call_no)) return; // �ɤ߹���ʤ�; abort.
+			if (! ChangeScript(cmd.args[0].value, call_no)) return; // 読み込めない; abort.
 			cmd.clear();
-		} else if (cmd.cmd3 == 0x0c || cmd.cmd3 == 0x12) { // call (0x12 ��������̯)
+		} else if (cmd.cmd3 == 0x0c || cmd.cmd3 == 0x12) { // call (0x12 の方は微妙)
 			int new_scn = cmd.args[0].value;
 			int new_pt = 0;
-			if (cmd.args.size() >= 2) { // subroutine number ���դ�
-					// �������դ��Τ⤢��餷��
+			if (cmd.args.size() >= 2) { // subroutine number が付く
+					// 引数が付くのもあるらしい
 				new_pt = cmd.args[1].value;
 			}
 			if (new_scn == SCN_INFO_MENU) { // menu call
 				config->GetParam("#CANCELCALL", 2, &new_scn, &new_pt);
-				stack.push_back(StackItem(SCN_INFO, SCN_INFO_MENU)); // menu call �򼨤��ü�ʵ���
+				stack.push_back(StackItem(SCN_INFO, SCN_INFO_MENU)); // menu call を示す特殊な記号
 			} else {
 				int i;
 				VarInfo var;
-				// ���������ѿ���ȼ�� subroutine call
+				// ローカル変数を伴う subroutine call
 				var.type = 11;
 				var.number = 0;
 				int saved_vars = 0;
@@ -583,7 +583,7 @@ void Scn2k::SysExec(Cmd& cmd) {
 					
 				var.type = 11;
 				var.number = 0;
-				// �ü�� subroutine call �ʤΤǡ�;�פʾ����������Ϥ�
+				// 特殊な subroutine call なので、余計な情報を引数に渡す
 				for (i=2; i<cmd.args.size(); i++) {
 					flag.Set(var, cmd.args[i].value);
 // fprintf(stderr,"<%d:%d>=%d;",var.type,var.number,cmd.args[i].value);
@@ -595,20 +595,20 @@ void Scn2k::SysExec(Cmd& cmd) {
 			stack.push_back(StackItem(scn_number, scn_pt));
 // fprintf(stderr,"\nglobal call %d:%d from %d:%d\n",new_scn,new_pt,scn_number,scn_pt);
 			eprintf("global call to %d, %d\n",new_scn, new_pt);
-			if (! ChangeScript(new_scn, new_pt)) return; // �ɤ߹���ʤ�; abort.
+			if (! ChangeScript(new_scn, new_pt)) return; // 読み込めない; abort.
 			cmd.clear();
-		} else if (cmd.cmd3 == 0x65) { // ʸ������֤��ͤ򥻥åȤ���
+		} else if (cmd.cmd3 == 0x65) { // 文字列の返り値をセットする
 			int arg1 = cmd.args[0].value;
 			string s = cmd.Str(cmd.args[1]);
 			int sp = stack_strbuffer.size();
 			stack.push_back(StackItem(SCN_INFO_RETSTR+arg1, sp));
 			stack_strbuffer.push_back(s);
 			cmd.clear();
-		} else if (cmd.cmd3 == 0x0d || cmd.cmd3 == 0x0a || cmd.cmd3 == 0x11 || cmd.cmd3 == 0x13) { // return (0a: local return) (0x13�Ϥ褯�狼��ʤ�)
+		} else if (cmd.cmd3 == 0x0d || cmd.cmd3 == 0x0a || cmd.cmd3 == 0x11 || cmd.cmd3 == 0x13) { // return (0a: local return) (0x13はよくわからない)
 // fprintf(stderr,"global return : stack size %d\n",stack.size());
 			if (stack.empty()) {
 				cmd.clear();
-				return; // �����������������abort
+				return; // スタックがおかしい:abort
 			}
 			map<int, string> retstr;
 			while( (!stack.empty()) && stack.back().scn_number >= SCN_INFO_RETSTR) {
@@ -621,7 +621,7 @@ void Scn2k::SysExec(Cmd& cmd) {
 			}
 			if (stack.empty()) {
 				cmd.clear();
-				return; // �����������������abort
+				return; // スタックがおかしい:abort
 			}
 			StackItem s = stack.back();
 			stack.pop_back();
@@ -631,12 +631,12 @@ void Scn2k::SysExec(Cmd& cmd) {
 				stack.pop_back();
 				if (mode == SCN_INFO_MENU) {
 // fprintf(stderr,"\nInfo Menu;");
-					// menu �⡼�ɽ�λ
+					// menu モード終了
 					SetSkipMode(SkipMode(skip_mode & (~SKIP_IN_MENU) ));
 				} else if (mode >= SCN_INFO_LOCALS && mode <= SCN_INFO_LOCALS+50) {
 // fprintf(stderr,"\nInfo Local;");
 					int i;
-					// ���������ѿ��򸵤��᤹
+					// ローカル変数を元に戻す
 					VarInfo var;
 					var.type = 11;
 					var.number = 0;
@@ -675,7 +675,7 @@ void Scn2k::SysExec(Cmd& cmd) {
 			}
 			if (cmd.cmd3 == 0x11 || cmd.cmd3 == 0x13) {
 // fprintf(stderr,"\nSet RetLocal;");
-				// �֤��ͤ򥻥åȤ���
+				// 返り値をセットする
 				map<int,string>::iterator it;
 				VarInfo var;
 				var.type = TYPE_VARLOCSTR;
@@ -698,7 +698,7 @@ void Scn2k::SysExec(Cmd& cmd) {
 // fprintf(stderr,"global return : return to %d:%d\n",s.scn_number,s.scn_pt);
 // fprintf(stderr,"\nglobal return %d:%d from %d:%d\n",s.scn_number,s.scn_pt,scn_number, script - script_start);
 			if (s.scn_number != -1) {
-				if (! ChangeScript(s.scn_number, 0)) return; // �ɤ߹���ʤ�; abort.
+				if (! ChangeScript(s.scn_number, 0)) return; // 読み込めない; abort.
 			}
 			script = script_start + s.scn_pt;
 			cmd.clear();
@@ -710,15 +710,15 @@ void Scn2k::SysExec(Cmd& cmd) {
 			DllCall_LB(cmd, flag);
 			cmd.clear();
 		}
-	} else if (cmd.cmd1 == 0 && cmd.cmd2 == 0x04) { // ��˥塼�⡼��
+	} else if (cmd.cmd1 == 0 && cmd.cmd2 == 0x04) { // メニューモード
 		if (cmd.cmd3 == 300 || cmd.cmd3 == 301 || cmd.cmd3 == 302) {
-			// ��˥塼�����return
+			// メニューからのreturn
 			cmd.cmd2 = 1;
 			cmd.cmd3 = 0x0d;
 			SysExec(cmd);
 		}
 	} else if (cmd.cmd1 == 1 && cmd.cmd2 == 0x04) {
-		if (cmd.cmd3 == 0 && cmd.cmd4 == 0) { // �����ȥ�̾����
+		if (cmd.cmd3 == 0 && cmd.cmd4 == 0) { // タイトル名設定
 			const char* name = cmd.Str(cmd.args[0]);
 			if (name == NULL) name = "";
 			window_title = name;
@@ -728,7 +728,7 @@ void Scn2k::SysExec(Cmd& cmd) {
 			parent.Root().SetWindowCaption(setname.c_str());
 			cmd.clear();
 		} else if (cmd.cmd3 == 0x82 && cmd.cmd4 == 0) {
-			/* cmd.cmd3 == 0x82 : �ޥ����� press ���֥��ꥢ���� */
+			/* cmd.cmd3 == 0x82 : マウスの press 状態クリアかも */
 			event.presscount(MOUSE_LEFT);
 			event.presscount(MOUSE_RIGHT);
 			cmd.clear();
@@ -750,25 +750,25 @@ void Scn2k::SysExec(Cmd& cmd) {
 			flag.Set(cmd.args[3], right);
 			cmd.clear();
 		} else if (cmd.cmd3 == 0x15e || cmd.cmd3 == 0x161 || cmd.cmd3 == 0x162 || cmd.cmd3 == 0x14c || cmd.cmd3 == 0x7d1) {
-/* 15e, 161, 162, 14c, 7d1 : �ʤ�餫�Υ����ƥ������֤���skip mode�ʤɡ��� */
-/* 7d1: == 1 || 14c: == 1 || (15e==1&&161==1&&162==0) || (press_val == 2) : �����å��桩 �����ȥ���̤Υ��˥᡼�����λ */
+/* 15e, 161, 162, 14c, 7d1 : なんらかのシステム情報を返す(skip modeなど?) */
+/* 7d1: == 1 || 14c: == 1 || (15e==1&&161==1&&162==0) || (press_val == 2) : スキップ中? タイトル画面のアニメーション終了 */
 			flag.SetSys(0);
 			cmd.clear();
-		} else if (cmd.cmd3 == 0x4b0) { // ��λ
+		} else if (cmd.cmd3 == 0x4b0) { // 終了
 			System::Main::Quit();
 			//script = NULL; script_start = NULL; script_end = NULL;
 			cmd.clear();
 			cmd.cmd_type = CMD_WAITFRAMEUPDATE;
-		} else if (cmd.cmd3 == 0x4b4 || cmd.cmd3 == 0x4b5) { // ����贬���ᤷ
+		} else if (cmd.cmd3 == 0x4b4 || cmd.cmd3 == 0x4b5) { // 選択肢巻き戻し
 			LoadRollback(cmd);
 		} else if (cmd.cmd3 == 0x58d) {
-        		// ���˥�����|�����֤��줿�ֹ���֤���
+        		// 前にロード|セーブされた番号を返す。
         	int lastsave;
         	config->GetParam("#LASTSAVE", 1, &lastsave);
         	flag.SetSys(lastsave-1);
 		} else if (cmd.cmd3 == 0x585) {
-        		// �������ε�Ͽ���줿���ա������ȥ�ʤɤ��֤����
-        		// �ǡ������ʤ��ʤ� sys �� 0��������ʤ� 1 ���֤�
+        		// 第一引数の記録された日付、タイトルなどが返される
+        		// データがないなら sys に 0が、あるなら 1 が返る
 			int y,m,d,wd,h,min,s,ms;
 			string title;
 fprintf(stderr,"StatSave %d:",cmd.args[0].value+1);
@@ -793,7 +793,7 @@ fprintf(stderr,"StatSave %d:",cmd.args[0
 			Save(cmd);
 		} else if (cmd.cmd3 == 0xc25) { // load
 			Load(cmd);
-		} else if (cmd.cmd3 == 0x4b1 || cmd.cmd3 == 0x4b3) { // menu ����� (4b3: �Хåɥ����)
+		} else if (cmd.cmd3 == 0x4b1 || cmd.cmd3 == 0x4b3) { // menu へ戻る (4b3: バッドエンド)
 			int scn_start;
 			if (config->GetParam("#SEEN_MENU", 1, &scn_start) == 0) {
 				ChangeScript(scn_start, 0);
@@ -834,7 +834,7 @@ fprintf(stderr,"StatSave %d:",cmd.args[0
 #include <errno.h>
 #include <unistd.h>
 
-// �����֥ե������̾����Ĥ���
+// セーブファイルの名前をつくる
 string Scn2k::MakeSaveFile(void) const {
 	struct stat sstatus;
 	string dir = "~/.xkanon";
@@ -846,7 +846,7 @@ string Scn2k::MakeSaveFile(void) const {
 			dir = new_dir;
 		}
 	}
-	// savepath�˥ե�����̾�����äƤ���С�����򥻡��֥ե�����Ȥ��ƻȤ�
+	// savepathにファイル名が入っていれば、それをセーブファイルとして使う
 	if (stat(dir.c_str(), &sstatus) == -1) {
 		if (errno != ENOENT) {
 			fprintf(stderr,"Cannot open save file; dir %s is not directory\n",dir.c_str());
@@ -860,11 +860,11 @@ string Scn2k::MakeSaveFile(void) const {
 			return dir;
 		}
 	}
-	// �ե�����̾����
+	// ファイル名を作る
 	const char* regname = config->GetParaStr("#REGNAME");
 
 	char* fname = new char[strlen(regname)+1];
-	/* �쥸���ȥ�̾��ե�����̾�Ȥ���ͭ���ʤ�Τˤ��� */
+	/* レジストリ名をファイル名として有効なものにする */
 	int i; for (i=0; regname[i]!=0; i++) {
 		char c = regname[i];
 		if (c == '\\' || c == '/' || c == ':' || c <= 0x20) c = '_';
@@ -877,7 +877,7 @@ string Scn2k::MakeSaveFile(void) const {
 	return dir;
 }
 
-// �����֥ե������̾����Ĥ���
+// セーブファイルの名前をつくる
 string Scn2kSaveTitle::operator() (int number) const {
 	int y,m,d,wd,h,min,sec,msec;
 	string title;
@@ -999,7 +999,7 @@ void Scn2k::LoadSys(void) {
 		delete[] savedata;
 	}
 
-	/* ����� */
+	/* 初期化 */
 	int scn_start; config->GetParam("#SEEN_START", 1, &scn_start);
 	ChangeScript(scn_start, 0);
 	save_scn = 0;
@@ -1032,7 +1032,7 @@ bool Scn2k::StatSaveFile(int num, int& y
 	min = t->tm_min;
 	sec = t->tm_sec;
 	msec = 0;
-	/* �����ȥ�μ��� */
+	/* タイトルの取得 */
 	FILE* savefile = fopen(path.c_str(), "rb");
 	if (savefile == NULL) return false;
 	char regname[1024];
@@ -1080,7 +1080,7 @@ void Scn2k::LoadRollback(Cmd& cmd) {
 	text_exec.Load(savedata.c_str());
 	grp_exec.Load(savedata.c_str());
 
-	/* ���̤β����ʤ� */
+	/* 画面の回復など */
 	SetSkipMode(SKIP_NO);
 	vector<CmdSimplified>::iterator it;
 	cmd.clear();
@@ -1098,7 +1098,7 @@ void Scn2k::LoadRollback(Cmd& cmd) {
 void Scn2k::Save(Cmd& cmd) {
 	if (cmd.cmd_type == CMD_SAVEREQ) {
 		if (menu == NULL) {
-			SetSkipMode(SKIP_IN_MENU); // �ƥ����ȥ����å����Ϥ���������
+			SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
 			menu = new Scn2kMenu(Scn2kMenu::MENU_SAVE, *this, flag, text_exec, system_version);
 			menu->InitPanel(event, parent);
 			menu->InitTitle(Scn2kSaveTitle(*this));
@@ -1113,7 +1113,7 @@ void Scn2k::Save(Cmd& cmd) {
 	FILE* f = NULL;
 	if (save_scn == 0) {
 		fprintf(stderr,"Cannot decide save point\n");
-		return; // �����ְ��֤���¸����Ƥʤ�
+		return; // セーブ位置が保存されてない
 	}
 	string path = MakeSaveFile();
 	int file_number = 1;
@@ -1126,7 +1126,7 @@ void Scn2k::Save(Cmd& cmd) {
 	sprintf(buf, ".%d",file_number);
 	path += buf;
 
-	/* �����֥ե������ǧ */
+	/* セーブファイル確認 */
 	
 	sprintf(buf, "KEY=%s\n", config->GetParaStr("#REGNAME")); save += buf;
 	string save_sys; SaveImpl(save_sys);
@@ -1161,7 +1161,7 @@ void Scn2k::Load(Cmd& cmd) {
 			menu = new Scn2kMenu(Scn2kMenu::MENU_LOAD, *this, flag, text_exec, system_version);
 			menu->InitPanel(event, parent);
 			menu->InitTitle(Scn2kSaveTitle(*this));
-			SetSkipMode(SKIP_IN_MENU); // �ƥ����ȥ����å����Ϥ���������
+			SetSkipMode(SKIP_IN_MENU); // テキストスキップ等はここで中断
 			if (mouse_surface) menu_mouseshown = true;
 			else menu_mouseshown = false;
 			ShowCursor();
@@ -1212,7 +1212,7 @@ void Scn2k::Load(Cmd& cmd) {
 		rollback_data = rollback_end;
 	}
 
-	/* ���̤β����ʤ� */
+	/* 画面の回復など */
 	SetSkipMode(SKIP_NO);
 	vector<CmdSimplified>::iterator it;
 	for (it = cmd_stack.begin(); it != cmd_stack.end(); it++) {
@@ -1235,7 +1235,7 @@ void Scn2k::SaveImpl(string& save) {
 	sprintf(buf, "Title=%s\nMouseType=%d\nMouseShown=1\n",window_title.c_str(), mouse_type); save += buf;
 	vector<StackItem>::iterator sit;
 	for (sit=stack.begin(); sit!=stack.end(); sit++) {
-		if (sit->scn_number == SCN_INFO && sit->scn_pt == SCN_INFO_MENU) break; // ��˥塼������ľ���ޤǤΥ����å�����¸
+		if (sit->scn_number == SCN_INFO && sit->scn_pt == SCN_INFO_MENU) break; // メニューに入る直前までのスタックを保存
 		sprintf(buf, "Stack=%d,%d\n",sit->scn_number,sit->scn_pt);
 		save += buf;
 	}
@@ -1329,7 +1329,7 @@ void Scn2k::SetSkipMode(SkipMode mode) {
 **
 **/
 static double* lb_ef_param = 0;
-void DLLCall_LB_EF00_0(Cmd& cmd, Flags& flags) { // ���ե����Ȥ�����
+void DLLCall_LB_EF00_0(Cmd& cmd, Flags& flags) { // エフェクトの設定
 	if (lb_ef_param == 0) {
 		lb_ef_param = new double[sizeof(double) * 0x60 * 8];
 	}
@@ -1402,7 +1402,7 @@ void DLLCall_LB_EF00_0(Cmd& cmd, Flags& flags) { // ���ե����Ȥ�����
 	return;
 }
 
-void DLLCall_LB_EF00_1(Cmd& cmd, Flags& flags) { // �׻���Ԥ�
+void DLLCall_LB_EF00_1(Cmd& cmd, Flags& flags) { // 計算を行う
 	if (lb_ef_param == 0) {
 		fprintf(stderr,"Warning : DLLCall_LB_EF00_1 : Script error : effect calculation was called before setting\n");
 		return;
@@ -1419,7 +1419,7 @@ void DLLCall_LB_EF00_1(Cmd& cmd, Flags& flags) { // �׻���Ԥ�
 	m *= 3;
 
 	// 0 < x < 1
-	// va - vd �� 0-1 ���ϰϤ��о�������ģ����ؿ�
+	// va - vd は 0-1 の範囲で対称性を持つ3次関数
 	double x = double(flags.Get(5, 1162 + index)) * 0.001;
 	double va = (x * x * x)/6;
 	double vb = (-x*x*x + 3*x*x - 3*x + 1) / 6;
@@ -1445,12 +1445,12 @@ void DLLCall_LB_EF00_1(Cmd& cmd, Flags& flags) { // �׻���Ԥ�
 }
 
 
-void DllCall_LB(Cmd& cmd, Flags& flags) {	// ��ȥ�Х����������� EF00.dll �򥨥ߥ�졼��
+void DllCall_LB(Cmd& cmd, Flags& flags) {	// リトルバスターズ!の EF00.dll をエミュレート
 	if (cmd.args[0].value == 1) {
 		// "EF00.dll"
-		if (cmd.args[1].value == 0) { // ���ե����Ȥ�����
+		if (cmd.args[1].value == 0) { // エフェクトの設定
 			DLLCall_LB_EF00_0(cmd, flags);
-		} else if (cmd.args[1].value == 1) { // �׻���Ԥ�
+		} else if (cmd.args[1].value == 1) { // 計算を行う
 			DLLCall_LB_EF00_1(cmd, flags);
 		}
 	} else {
@@ -1669,7 +1669,7 @@ void LoadMenu::SetPage(int new_page) {
 				else button->SetText("----");
 			}
 		}
-		// �ܥ�������Ƥ��ѹ�����
+		// ボタンの内容を変更する
 		if (select_value < cur_page || select_value > cur_page+12)
 			btn_local->SetValue(-1);
 		else
@@ -1697,18 +1697,18 @@ void LoadMenu::SetValue(int new_value) {
 	in_setpage = true;
 
 	if (new_value < 0 || new_value > title.size() ||
-	    (interface.type == Scn2kMenu::MENU_LOAD && title_valid[new_value] == 0) ) { // ̵���������
+	    (interface.type == Scn2kMenu::MENU_LOAD && title_valid[new_value] == 0) ) { // 無効な選択肢
 		if (select_value < select_page/10 || select_value > select_page/10+12)
 			btn_local->SetValue(-1);
 		else
 			btn_local->SetValue(select_value-select_page/10);
-	} else { // �������ѹ�����
+	} else { // 選択肢を変更する
 		if (select_value == new_value) {
-			PressOk(); // ���֥륯��å�
+			PressOk(); // ダブルクリック
 		} else {
 			select_value = new_value;
 			if (interface.type == Scn2kMenu::MENU_SAVE && title_valid[select_value] == 0) {
-				PressOk(); // �����������֥ǡ����ʤ�̵��������
+				PressOk(); // 新しいセーブデータなら無条件に選択
 			}
 		}
 	}
@@ -1718,23 +1718,23 @@ void LoadMenu::SetValue(int new_value) {
 
 void LoadMenu::PressOk(void) {
 	if (select_value == -1) {
-		btn_set->SetValue(-1); // �ʤˤ⤷�ʤ�
+		btn_set->SetValue(-1); // なにもしない
 		return;
 	}
 	menu->deactivate();
 	if (interface.type == Scn2kMenu::MENU_LOAD) {
 		interface.cmd.cmd_type = CMD_LOAD;
 		interface.cmd.args.push_back(VarInfo(select_value));
-		awk_dialog = new Dialog(*pevent, pparent, "�ե����������ɤ��ޤ�����", true);
+		awk_dialog = new Dialog(*pevent, pparent, "ファイルをロードしますか?", true);
 		awk_dialog->set_pointer = this;
 		awk_dialog->set_func = ChangeDialog;
 	} else {// MENU_SAVE
 		interface.cmd.cmd_type = CMD_SAVE;
 		interface.cmd.args.push_back(VarInfo(select_value));
-		if (title_valid[select_value] == 0) { // �����������֥ǡ���
+		if (title_valid[select_value] == 0) { // 新しいセーブデータ
 			interface.status = Scn2kMenu::MenuStatus(Scn2kMenu::MENU_CMD | Scn2kMenu::MENU_DELETE);
-		} else { // �����֥ǡ������񤭡���ǧ
-			awk_dialog = new Dialog(*pevent, pparent, "�ǡ������񤭤��ޤ�����", true);
+		} else { // セーブデータを上書き:確認
+			awk_dialog = new Dialog(*pevent, pparent, "データを上書きしますか?", true);
 			awk_dialog->set_pointer = this;
 			awk_dialog->set_func = ChangeDialog;
 		}
@@ -1742,10 +1742,10 @@ void LoadMenu::PressOk(void) {
 }
 
 void LoadMenu::Cancel(void) {
-	if (awk_dialog != NULL) { // �����������Υ���󥻥�
+	if (awk_dialog != NULL) { // ダイアログのキャンセル
 		awk_dialog->status = Dialog::CANCEL;
 		ChangeDialog(this, awk_dialog);
-	} else { // ���̥���󥻥�
+	} else { // 一般キャンセル
 		btn_set->SetValue(1);
 	}
 }
@@ -1778,7 +1778,7 @@ void LoadMenu::ChangeBtnSet(void* pointe
 void LoadMenu::ChangeDialog(void* pointer, Dialog* widget) {
 	LoadMenu* instance = (LoadMenu*)pointer;
 	if (widget->status == Dialog::CANCEL) {
-		// �����������õOK �ܥ�������
+		// ダイアログ消去、OK ボタン復帰
 		delete instance->awk_dialog;
 		instance->awk_dialog = NULL;
 		instance->menu->activate();
@@ -1850,7 +1850,7 @@ void BacklogMenu::Exec(Cmd& cmd) {
 	}
 	if (cmd.cmd_type != CMD_NOP) return;
 	if (backlog_update) return;
-	// backlog ��ǿ��ξ��֤˹���
+	// backlog を最新の状態に更新
 	cmd.clear();
 	BacklogItem item;
 
--- a/scn2k/scn2k_impl.h
+++ b/scn2k/scn2k_impl.h
@@ -86,7 +86,7 @@ class Scn2k : Event::Time {
 			SCN_INFO = 999999, SCN_INFO_MENU = 10000001,
 			SCN_INFO_LOCALS = 10000100, SCN_INFO_LOCALSTR = 10000200,
 			SCN_INFO_RETSTR = 10000300
-		}; // stack ���Ѥޤ���ü���ֹ�
+		}; // stack に積まれる特殊な番号
 
 		int save_scn, save_point;
 
@@ -123,7 +123,7 @@ class Scn2k : Event::Time {
 
 		virtual void Elapsed(unsigned int current_time);
 
-		// �����ִ�Ϣ
+		// セーブ関連
 		std::string MakeSaveFile(void) const;
 		bool StatSaveFile(int num, int& year, int& month, int& day, int& wday, int& hour,int& min, int& sec, int& msec, std::string& title) const;
 		void SaveImpl(std::string& s);
--- a/scn2k/scn2k_text.cc
+++ b/scn2k/scn2k_text.cc
@@ -1,31 +1,31 @@
 /*
 TODO:
-	���դΥ�٥뤬�����ڤ��ؤ����˷礱��Τ���
-	�������� : �ʹ֤����촹���ʤ�
-	kcursor ������ WidText ���饹��Ǥ����
-	WidText ���饹�ˤϿ����˰ʲ�������ä���
-		���������Ƚ�λ�塢���ꥢ�ʤ��˿����ʥƥ����Ȥ��ɲá�������start-wait����
-		��ʸ�������� (Start) �� Wait(��������ɽ���Ԥ�)��ʬΥ��
-			Start �����ʸ�������賫�Ϥ��롣����å��������衣
-			Flush ����ȥХåե����ʸ���򤹤٤����褹��
-			Wait �����������塢����å������ޤǥ��������ɽ������ޤ��Ԥ�
-		Text ¦�ξ��֤Ȥ��Ƥ� Wait �Τߤ���� (PREPARE�����Τ��Ԥ�)
-		��������Skip �θ����Ϥɤä�����ġ��ʸ����ϡ���
+	日付のラベルが画面切り替え時に欠けるのを修正
+	画像効果 : 人間の入れ換わりなど
+	kcursor の操作を WidText クラスに任せる
+	WidText クラスには新たに以下の操作を加える
+		・ウェイト終了後、クリアなしに新たなテキストを追加、新たにstart-waitする
+		・文字の描画 (Start) と Wait(カーソル表示待ち)の分離。
+			Start すると文字を描画開始する。クリックで全描画。
+			Flush するとバッファ内の文字をすべて描画する
+			Wait すると全描画後、クリックされるまでカーソルを表示するまで待つ
+		Text 側の状態としては Wait のみを持つ (PREPAREに戻るのを待つ)
+		ただし、Skip の権利はどっちがもつ?(現状は?)
 
-	GrpObj: NextObj �� GrpObj ��ʬΥ��CreateObj �ϸ����̤ꡢVisible=1 ���˹Ԥ���
-		���줾�� num=0 (screen) �λ�leaf �Ȥ��Ƽ�����delete���ϿƤ�delete�Τߤ�
-		�Ԥ����Ҥ�GrpObj�μ��Τ�����������
-		Visible ���hide �ϼºݤ� hide �Ȥ���
-		ExecReservedCmd() �Ϥʤ�����Ϥ���Delete() ��ʤ��ʤ롣
-	���Υ���ReBlit() �����ޤ������ʤ�������̾��������ɥ����ä��������طʤ��ʤ��ʤ�
+	GrpObj: NextObj と GrpObj を分離。CreateObj は現状通り、Visible=1 時に行う。
+		それぞれ num=0 (screen) の枝leaf として実装。delete時は親のdeleteのみを
+		行い、子はGrpObjの実体だけを削除する
+		Visible 後のhide は実際に hide とする
+		ExecReservedCmd() はなくせるはず。Delete() もなくなる。
+	カノギ:ReBlit() がうまくいかないせいで名前ウィンドウが消えた時の背景がなくなる
 
-	���顧����ɽ��
-	SEL��������
+	くら:回想表示
+	SEL画像効果
 DONE:
-	�Ȥ��Υƥ����ȥ�����ɥ��������ܥ������
-	shake �������
-	���֥���������Υƥ����ȿ��μ���
-	�������̤β���
+	ともよのテキストウィンドウ実装、ボタン実装
+	shake の画像効果
+	オブジェクト内のテキスト色の実装
+	画像効果の改善
 */
 
 /*
@@ -230,7 +230,7 @@ void Text::PressFuncButton(void* pointer
 
 void Text::SetSkipMode(SkipMode _mode) {
 	if ( (skip_mode & SKIP_IN_MENU) && (_mode & SKIP_IN_MENU) == 0) {
-		if (status_mask & BACKLOG_WAIT_MASK) { // backlog mode ��������
+		if (status_mask & BACKLOG_WAIT_MASK) { // backlog mode から復帰
 			status_mask = Status(status_mask & (~(BACKLOG_MASK|BACKLOG_MASK_FWD|BACKLOG_MASK_KOE|BACKLOG_WAIT_MASK)));
 			text->wid->Clear();
 			if (status == WAIT_TEXT && text != NULL) {
@@ -278,15 +278,15 @@ void Text::InitWindow(void) {
 		const char* s = config->GetParaStr(buf);
 		if (s != NULL) replace_name[i] = s;
 	}
-	// replace_name2 : �������
-	// ������������ (CLANNAD)
+	// replace_name2 : 初期設定
+	// 渚、秋生、渚 (CLANNAD)
 	char name_nagisa[3] = {'\x8f', '\x8d', '\0'};
 	char name_akio[5] = {'\x8f', '\x48', '\x90', '\xb6', '\0'};
 	replace_name2[0] = name_nagisa;
 	replace_name2[1] = name_akio;
 	replace_name2[2] = name_nagisa;
 	text = NULL;
-	/* �ƥ�����®�٤����� */
+	/* テキスト速度の設定 */
 	int speed, mod, wait, auto_mod;
 	config->GetParam("#INIT_MESSAGE_SPEED", 1, &speed);
 	config->GetParam("#INIT_MESSAGE_SPEED_MOD", 1, &mod);
@@ -364,7 +364,7 @@ void Text::Save(string& str, bool rollba
 						buflen += snprintf(buf+buflen, 1000-buflen, ",\"%s\"", it->face.c_str());
 				}
 				buf[buflen++] = '\0';
-				if (buflen >= 1000) { // �����졢�Хå������������ƥ���礭���� 1000byte ��ۤ���Ȥ�
+				if (buflen >= 1000) { // 万が一、バックログ1アイテムの大きさが 1000byte を越えるとき
 					fprintf(stderr,"Fatal : Cannot save backlog crrectly; Please send bug report to the author.\n");
 				} else str += buf;
 			}
@@ -484,12 +484,12 @@ void Text::Load(const char* str) {
 			}
 		} while (*strend != 0);
 	}
-	if (new_backlog.empty() && (!backlog.empty())) { // empty �ʤ� save_selectcount �ޤ� backlog �򴬤��᤹
+	if (new_backlog.empty() && (!backlog.empty())) { // empty なら save_selectcount まで backlog を巻き戻す
 		vector<BacklogItem>::iterator it = backlog.end();
 		do {
 			it--;
 			if (it->scn == BacklogItem::SaveSelect && it->pos == save_selectcount) {
-				// Save ���֤򸫤Ĥ����餽��ʹߤ� erase
+				// Save 位置を見つけたらそれ以降を erase
 				backlog.erase(it, backlog.end());
 				break;
 			}
@@ -520,10 +520,10 @@ void Text::show(int num) {
 		char key[1024];
 		sprintf(key, "#WINDOW.%03d.KEYCUR_MOD", text_window_number);
 		config->GetParam(key, 3, &d, &kx, &ky);
-		// �������ʤ���������
+		// 正しくない気がする
 		kx += text->wid->Pic()->PosX();
 		ky += text->wid->Pic()->PosY();
-		// ��̯�˲��ˤ���
+		// 微妙に下にする
 		ky += 8;
 		kcursor->Pic()->Move(kx, ky);
 	}
@@ -535,7 +535,7 @@ void Text::DrawBacklog(BacklogItem& item
 	status_mask = Status(status_mask | BACKLOG_WAIT_MASK);
 	drawn_backlog_item = item;
 	if (item.text.container.empty()) {
-		// cmd ���� text ���Ƥ�ƹ���
+		// cmd から text 内容を再構成
 		TextStream saved_text = text_stream;
 		text_stream.Clear();
 		AddText(cmd.Str(cmd.args[0]));
@@ -582,9 +582,9 @@ void Text::CreateSelect(Cmd& cmd) {
 
 	int sel_size = cmd.args.size() / 2;
 	int i;
-	// cur_backlog_item �˼���backlog������٤����Ƥ����
-	// CreateSelect() �塢SAVEPOINT �ʤΤǸ��ߤ�backlog������(���Υ�å�����)��
-	// backlog ����������롣���θ塢backlog_item �� cur_backlog_item �����Ƥ����åȤ����(Wait()��)
+	// cur_backlog_item に次にbacklogに入るべき内容を作成
+	// CreateSelect() 後、SAVEPOINT なので現在のbacklogの内容(前のメッセージ)が
+	// backlog に代入される。その後、backlog_item に cur_backlog_item の内容がセットされる(Wait()内)
 	char backlog_sel_text[11] = {0x81,0x69,0x91,0x49,0x91,0xf0,0x8e,0x88,0x81,0x6a,0x00};
 	cur_backlog_item.Clear();
 	cur_backlog_item.AddTextPos(cmd);
@@ -598,10 +598,10 @@ void Text::CreateSelect(Cmd& cmd) {
 	}
 	sel_backlog_pos.push_back(cur_backlog_item.text.container.size());
 
-	if (sel_type == 0) { // Princess Bride: ���򥦥���ɥ�����ɽ��
+	if (sel_type == 0) { // Princess Bride: 選択ウィンドウを別表示
 External_select:
 		CreateSelBG();
-		hide(); // �ʤΤǡ��ƥ����ȥ�����ɥ��Ͼõ�
+		hide(); // なので、テキストウィンドウは消去
 		int baseposx, baseposy, repposx, repposy, centerx, centery;
 		int mojisize, col1, col2;
 		config->GetParam("#SELBTN.000.CENTERING", 2, &centerx, &centery);
@@ -610,7 +610,7 @@ External_select:
 		config->GetParam("#SELBTN.000.MOJISIZE", 1, &mojisize);
 		config->GetParam("#SELBTN.000.MOJIDEFAULTCOL", 1, &col1);
 		config->GetParam("#SELBTN.000.MOJISELECTCOL", 1, &col2);
-		if (col1 == col2) col2 = 1; // CLANNAD �ǤȤꤢ������
+		if (col1 == col2) col2 = 1; // CLANNAD でとりあえず。
 		int r, g, b;
 		sprintf(key, "#COLOR_TABLE.%03d", col1);
 		config->GetParam(key, 3, &r, &g, &b);
@@ -619,10 +619,10 @@ External_select:
 		config->GetParam(key, 3, &r, &g, &b);
 		Color seled(r,g,b);
 
-		/* �������åȺ��� */
-		/* ������ɥ��طʤ��礭������� */
+		/* ウィジット作成 */
+		/* ウィンドウ背景の大きさを求める */
 		if (baseposx == 0 && sel_bg_rect.width() != 0)
-			baseposx = (parent.Width()-sel_bg_rect.width()) / 2; // �ܥ�����֤򥻥󥿥��
+			baseposx = (parent.Width()-sel_bg_rect.width()) / 2; // ボタン位置をセンタリング
 		if (centerx)
 			baseposx = (parent.Width()-sel_bg_rect.width()-sel_size*repposx) / 2;
 		if (centery)
@@ -632,7 +632,7 @@ External_select:
 
 		for (i=0; i<sel_size; i++) {
 			PicBase* p;
-			// �طʺ���
+			// 背景作成
 			if (sel_bg2) {
 				p = sel_widget->create_node(Rect(baseposx, baseposy, baseposx+sel_bg_rect.width(), baseposy+sel_bg_rect.height()),0);
 				p->SetSurface(sel_bg2, 0, 0);
@@ -641,10 +641,10 @@ External_select:
 				p = sel_widget->create_node(Rect(baseposx, baseposy, baseposx+sel_bg_rect.width(), baseposy+sel_bg_rect.height()),0);
 				p->SetSurface(sel_bg1, 0, 0);
 			}
-			/* �ܥ������ */
+			/* ボタン作成 */
 			const char* str = cmd.Str(cmd.args[i*2]);
 			int value = cmd.args[i*2+1].value;
-			while(selects.size() <= value) selects.push_back(0); // vector ���礭���򹭤���
+			while(selects.size() <= value) selects.push_back(0); // vector の大きさを広げる
 
 			kconv( (const unsigned char*)str, (unsigned char*)key);
 			selects[value] = new WidTextButton(event, sel_widget, key, mojisize, WidTextButton::CENTER,
@@ -657,17 +657,17 @@ External_select:
 		}
 		sel_widget->show_all();
 		status = WAIT_SELECT_OUTBOX;
-	} else { // CLANNAD: �ƥ����ȥ�����ɥ���������ɽ��
+	} else { // CLANNAD: テキストウィンドウ内に選択肢表示
 		int mojisize;
 		config->GetParam("#SELBTN.000.MOJISIZE", 1, &mojisize);
 		Color fore(0xff,0xff,0xff);
 		Color seled(0xff,0xff,0xff);
 
 		show();
-		if (text == NULL) goto External_select; // �ƥ����ȡ�������ɥ���ɽ���Ǥ��ʤ���г��������ˤ���
+		if (text == NULL) goto External_select; // テキスト・ウィンドウを表示できなければ外部選択肢にする
 		text->wid->Clear();
 		if (kcursor) kcursor->hide();
-		/* �������åȺ���  : �ƥ�����ɽ���ϰϤ�Ʊ��*/
+		/* ウィジット作成  : テキスト表示範囲と同じ*/
 		int posx = text->wid->pictext->PosX();
 		int posy = text->wid->pictext->PosY();
 		int sel_w = text->wid->pictext->Width();
@@ -676,10 +676,10 @@ External_select:
 
 		int sel_y = 0;
 		for (i=0; i<sel_size; i++) {
-			/* �ܥ������ */
+			/* ボタン作成 */
 			const char* str = cmd.Str(cmd.args[i*2]);
 			int value = cmd.args[i*2+1].value;
-			while(selects.size() <= value) selects.push_back(0); // vector ���礭���򹭤���
+			while(selects.size() <= value) selects.push_back(0); // vector の大きさを広げる
 
 			kconv( (const unsigned char*)str, (unsigned char*)key);
 			selects[value] = new WidTextButton(event, sel_widget, key, mojisize, WidTextButton::Attribute(WidTextButton::REVERSE | WidTextButton::NOPADDING),
@@ -697,16 +697,16 @@ External_select:
 void Text::AddText(const char* str_o) {
 	char str[10001];
 	if (text == NULL) return;
-	/* �ޤ���replace string ���Ѵ� */
+	/* まず、replace string を変換 */
 	int i;
 	int cnt = 0;
-	/* �� = 81 96 A-Z = 0x82 [0x60-0x79] */
-	/* �� = 81 93 A-Z = 0x82 [0x60-0x79] */
+	/* * = 81 96 A-Z = 0x82 [0x60-0x79] */
+	/* % = 81 93 A-Z = 0x82 [0x60-0x79] */
 	for (i=0; cnt<10000 && str_o[i] != 0; i++) {
 		if (str_o[i] < 0) {
 			if ( (unsigned char)str_o[i] == 0x81 && (unsigned char)str_o[i+1] == 0x96 && (unsigned char)str_o[i+2] == 0x82) {
 				int c = str_o[i+3];
-				if (c >= 0x60 && c <= 0x79 && replace_name[c-0x60].length() != 0) { // ̾���Ѵ�
+				if (c >= 0x60 && c <= 0x79 && replace_name[c-0x60].length() != 0) { // 名前変換
 					i += 3;
 					strcpy(str+cnt, replace_name[c-0x60].c_str());
 					cnt += replace_name[c-0x60].length();
@@ -714,7 +714,7 @@ void Text::AddText(const char* str_o) {
 				}
 			} else if ( (unsigned char)str_o[i] == 0x81 && (unsigned char)str_o[i+1] == 0x93 && (unsigned char)str_o[i+2] == 0x82) {
 				int c = str_o[i+3];
-				if (c >= 0x60 && c <= 0x79 && replace_name2[c-0x60].length() != 0) { // ̾���Ѵ���
+				if (c >= 0x60 && c <= 0x79 && replace_name2[c-0x60].length() != 0) { // 名前変換2
 					i += 3;
 					strcpy(str+cnt, replace_name2[c-0x60].c_str());
 					cnt += replace_name2[c-0x60].length();
@@ -732,7 +732,7 @@ void Text::AddText(const char* str_o) {
 	for (char* s = str_top; *s != 0; s++) {
 		// if (*(unsigned char*)s == 0xa1 && *(unsigned char*)(s+1) == 0xda) { /* euc */
 		if (*(unsigned char*)s == 0x81 && *(unsigned char*)(s+1) == 0x79) { /* sjis */
-			// ̾��
+			// 名前
 			*s = 0;
 			if (s != str_top) text_stream.Add(str_top);
 			s += 2;
@@ -745,7 +745,7 @@ void Text::AddText(const char* str_o) {
 					text_stream.AddName(name_top);
 					break;
 				}
-				if (*s < 0 && s[1] != 0) s++; // ����ʸ���ʤ飲�����Ф�
+				if (*s < 0 && s[1] != 0) s++; // 全角文字なら2字飛ばす
 			}
 			str_top = s;
 		}
@@ -780,7 +780,7 @@ void Text::Exec(Cmd& cmd) {
 			cmd.clear();
 		else
 			cmd.cmd_type = CMD_SAVEPOINT;
-		text_parsing = true; /* �ƥ������Ԥ�ľ��Υƥ����Ȱ��֡᥻���ְ��� */
+		text_parsing = true; /* テキスト待ち直後のテキスト位置=セーブ位置 */
 		return;
 	}
 
@@ -809,7 +809,7 @@ print_blit^=1;
 		else {
 			if ( (status == WAIT_TEXT && text != NULL) || status == WAIT_SELECT_INBOX || status == WAIT_SELECT_OUTBOX) {
 				if(text && text->wid->status != WidText::PREPARE && text->wid->status != WidText::WAIT && text->wid->status != WidText::WAIT2) {
-					text->wid->Flush(); // ɽ����Ǹ�ξ��֤ˤ���
+					text->wid->Flush(); // 表示を最後の状態にする
 				}
 				if (status == WAIT_TEXT && text != NULL && kcursor != NULL) kcursor->show();
 			}
@@ -849,7 +849,7 @@ print_blit^=1;
 	}
 	if (status_mask & SKIPEND_MASK) {
 		if ( (skip_mode & SKIP_TEXT) && (skip_mode & SKIPEND_TEXT)) {
-			if (skip_mode & SKIPEND_KEY) { // shift skip ��
+			if (skip_mode & SKIPEND_KEY) { // shift skip 中
 				SkipMode new_mode = SkipMode(skip_mode & (~SKIPEND_TEXT));
 				if (new_mode & (SKIP_GRP_NOEFFEC || SKIP_GRP_NODRAW))
 					new_mode = SkipMode(new_mode & (~SKIP_GRP_FAST));
@@ -872,7 +872,7 @@ print_blit^=1;
 	if (event.presscount(MOUSE_RIGHT)) {
 		if ( (status == WAIT_TEXT && text != NULL) || status == WAIT_SELECT_INBOX || status == WAIT_SELECT_OUTBOX) {
 			if(text && text->wid->status != WidText::PREPARE && text->wid->status != WidText::WAIT && text->wid->status != WidText::WAIT2) {
-				text->wid->Flush(); // ɽ����Ǹ�ξ��֤ˤ���
+				text->wid->Flush(); // 表示を最後の状態にする
 			}
 			cmd.cmd_type = CMD_MENUREQ;
 			if (!(status_mask & STATSAVE_MASK)) {
@@ -887,7 +887,7 @@ print_blit^=1;
 	if (event.presscount(MOUSE_UP)) {
 		if ( (status == WAIT_TEXT && text != NULL) || status == WAIT_SELECT_INBOX || status == WAIT_SELECT_OUTBOX) {
 			if(text && text->wid->status != WidText::PREPARE && text->wid->status != WidText::WAIT && text->wid->status != WidText::WAIT2) {
-				text->wid->Flush(); // ɽ����Ǹ�ξ��֤ˤ���
+				text->wid->Flush(); // 表示を最後の状態にする
 			}
 			cmd.cmd_type = CMD_BACKLOGREQ;
 			if (!(status_mask & STATSAVE_MASK)) {
@@ -901,7 +901,7 @@ print_blit^=1;
 		if ( (status == WAIT_TEXT && text != NULL ) || status == WAIT_SELECT_INBOX || status == WAIT_SELECT_OUTBOX) {
 			if (skip_mode) skip_mode = SKIP_NO;
 			if (text && text->wid->status != WidText::PREPARE && text->wid->status != WidText::WAIT && text->wid->status != WidText::WAIT2) {
-				text->wid->Flush(); // ɽ����Ǹ�ξ��֤ˤ���
+				text->wid->Flush(); // 表示を最後の状態にする
 				return true;
 			}
 			status_mask = Status(status_mask & (~CLEARSCR_MASK) | CLEARSCR_WAIT_MASK);
@@ -966,7 +966,7 @@ print_blit^=1;
 		delete sel_widget;
 		sel_widget = NULL;
 		status = NORMAL;
-		// CreateSelect() �Ǻ������줿 cur_backlog_item �� backlog_item ��ȿ�Ǥ�����
+		// CreateSelect() で作成された cur_backlog_item を backlog_item へ反映させる
 		cur_backlog_item.text.InsertColor(sel_backlog_pos[sel_val], sel_backlog_pos[sel_val+1], 0xff, 0, 0);
 		backlog_item = cur_backlog_item;
 		cur_backlog_item.Clear();
@@ -1029,7 +1029,7 @@ static const char* btnname[BTNCNT] = {
 	"EXBTN_002"
 };
 
-static int btnpos[BTNCNT] = { // g00 �ե�������Υܥ������ΰ���
+static int btnpos[BTNCNT] = { // g00 ファイル内のボタン情報の位置
 //	0, 1, 13, 12, 2, 3, 4, 5, 6, 7 // princess bride?
 	0, 1, 13, 14, 2, 3, 4, 5, 6, 7 // tomoyo after?
 };
@@ -1088,7 +1088,7 @@ void Text::SetCursor(int cursor_no) {
 	char key[1024];
 	sprintf(key, "#CURSOR.%03d.NAME", cursor_no);
 	string path = config->GetParaStr(key);
-	if (path.length() == 0) return; // ̾���ʤ�
+	if (path.length() == 0) return; // 名前なし
 	path += ".pdt";
 	int w,h,cont,speed;
 	sprintf(key, "#CURSOR.%03d.SIZE", cursor_no);
@@ -1098,7 +1098,7 @@ void Text::SetCursor(int cursor_no) {
 	sprintf(key, "#CURSOR.%03d.SPEED", cursor_no);
 	config->GetParam(key, 1, &speed);
 
-	// speed �ǣ�����cont ���Ѳ�
+	// speed で1周、cont 回変化
 	if (kcursor != NULL) delete kcursor;
 
 	kcursor = new WidTimeCursor(event, speed/cont, &parent, path.c_str(), 0, 0, w, 0, cont, Rect(0,0,w,h));
@@ -1258,7 +1258,7 @@ void TextWindow::MakeWaku(PicContainer& 
 	AyuSysConfig *config = AyuSysConfig::GetInstance();
 	char key[1024];
 	std::string str;
-	/* �Ȥ���� */
+	/* 枠を作成 */
 	sprintf(key, "#WAKU.%03d.000.NAME", waku_no);
 	const char* name = config->GetParaStr(key);
 	if (name != NULL && name[0] == 0) name = NULL;
@@ -1271,7 +1271,7 @@ void TextWindow::MakeWaku(PicContainer& 
 
 	if (name == NULL && back == NULL && btn == NULL) return;
 
-	/* �ޤ����ƥ������طʤ����� */
+	/* まず、テキスト背景を設定 */
 	if (back != NULL) {
 		str = back; str += ".g00";
 		int rc, gc, bc, ac, flag;
@@ -1285,14 +1285,14 @@ void TextWindow::MakeWaku(PicContainer& 
 			Rect rect(*back_s);
 			Surface* s = pic.Root().NewSurface(rect.width(), rect.height(), ALPHA_MASK);
 			DSurfaceMove(back_s, rect, s, rect);
-			DSurfaceFillA(s, rect, rc, gc, bc, ac); // Ʃ��������
+			DSurfaceFillA(s, rect, rc, gc, bc, ac); // 透明度設定
 			pic.SetSurface(s, 0, 0);
 			pic.SetSurfaceFreeFlag(1);
 			if (flag == 0) wid->Pic()->SetSurfaceAttribute(PicBase::BLIT_MULTIPLY);
 			pic.Root().DeleteSurface(back_s);
 		}
 	}
-	/* ���������Ⱦ�������� */
+	/* その前に枠飾りを設定 */
 	if (name != NULL) {
 		str = name; str += ".g00";
 		Surface* s = pic.Root().NewSurface(str.c_str());
@@ -1307,26 +1307,26 @@ void TextWindow::MakeWaku(PicContainer& 
 	}
 	if (btn == NULL) return;
 	if (use_btn == NULL) return;
-	// �ܥ���κ���
-	// ���Ѥ���ܥ���ˤĤ��Ƥϡ�ɬ�פ˱����� show() ���뤳��
+	// ボタンの作成
+	// 使用するボタンについては、必要に応じて show() すること
 
-	/* �ܥ���ΰ��־������� */
+	/* ボタンの位置情報を求める */
 	str = btn; str += ".g00";
 	ARCINFO* info = FileSearcher::GetInstance()->Find(FileSearcher::PDT, str.c_str(), "g00");
 	if (info == NULL) return; // cannot find file
 	const char* data = info->Read();
-	/* g00 �ե�����Υإå���ʬ�˰��־�������äƤ��� */
-	/* ¸�ߤ��ʤ���Хܥ�������ǤϤʤ� */
+	/* g00 ファイルのヘッダ部分に位置情報は入っている */
+	/* 存在しなければボタン画像ではない */
 	if (data == NULL || *data != 2) {
 		delete info;
 		return;
 	}
-	int index_count = read_little_endian_int(data+5); // 0x70 == 112 ( 8 �Ĥ��ĥ��롼�פʤΤǡ�14�ĤΥܥ��� ) ��ɸ��
+	int index_count = read_little_endian_int(data+5); // 0x70 == 112 ( 8 個ずつグループなので、14個のボタン ) が標準
 	int i;
 	for (i=0; i<BTNCNT; i++) {
 		if (!use_btn[i]) continue;
 		if (btnpos[i]*8 >= index_count) {
-			continue; // �ܥ���¸�ߤ��ʤ�
+			continue; // ボタンが存在しない
 		}
 		int x, y, w, h;
 		sprintf(key, "#WAKU.%03d.000.%s_BOX", waku_no, btnname[i]);
@@ -1365,8 +1365,8 @@ TextWindow::TextWindow(PicContainer& par
 	sprintf(key, "#WINDOW.%03d.WAKU_SETNO", win_no);if (config->GetParam(key, 1, &waku_no) == -1) return;
 	sprintf(key, "#WINDOW.%03d.LUBY_SIZE", win_no); if (config->GetParam(key, 1, &ruby) == -1) return;
 
-	/* �ƥ����ȥ������åȡ����̤α������դޤǻ��� */
-	/* posd == 2 �ʤ���̲��ˤҤäĤ��褦������ */
+	/* テキストウィジット:画面の右下一杯まで使用 */
+	/* posd == 2 なら画面下にひっつくように配置 */
 	Rect r(0,0);
 	if (posd == 2) {
 		r = WakuSize(parent, waku_no);
@@ -1376,16 +1376,16 @@ TextWindow::TextWindow(PicContainer& par
 	} else /* posd == 0 ? */
 		r = Rect(posx, posy, parent.Width(), parent.Height());
 
-	/* �ƥ����ȥ�����ɥ��κ��� */
+	/* テキストウィンドウの作成 */
 	int w = size*cntw; int h = (size+ruby+2)*cnth;
 	wid = new WidText(event, &parent, r, Rect(mposx, mposy, mposx+w, mposy+h), size);
 	wid->stream.kanji_type = TextStream::sjis;
-	/* �饦����ɥ��κ��� */
+	/* 顔ウィンドウの作成 */
 	for (i=0; i<8; i++) {
 		int x,y;
 		sprintf(key, "#WINDOW.%03d.FACE.%03d", win_no, i);
 		if (config->GetParam(key, 2, &x, &y) == -1) continue;
-		/* �饦����ɥ���������� */
+		/* 顔ウィンドウを作成する */
 		if (x >= 0 && y >= 0) {
 			face_pics[i] = wid->PicNode()->create_leaf(Rect(x,y), PicBase::FIT_SURFACE);
 		} else {
@@ -1394,7 +1394,7 @@ TextWindow::TextWindow(PicContainer& par
 		face_pics[i]->show();
 	}
 	face = face_pics[0];
-	// �ܥ��������
+	// ボタンの設定
 	for (i=0; i<BTNCNT; i++) {
 		int num;
 		sprintf(key, "#WINDOW.%03d.%s_USE", win_no, btnname[i]);
@@ -1420,15 +1420,15 @@ TextWindow::TextWindow(PicContainer& par
 			sprintf(key, "#WINDOW.%03d.NAME_WAKU_SETNO", win_no);
 			if (config->GetParam(key, 1, &name_waku) != -1 && name_waku != -1) {
 				Rect waku_r = WakuSize(parent, name_waku);
-				waku_r.rmove(r.lx, r.ty); // �ƥ����ȥ�����ɥ����֤�ư����
-				waku_r.rmove(name_posx, name_posy-waku_r.height()); // NAME_POS �ذ�������
+				waku_r.rmove(r.lx, r.ty); // テキストウィンドウ位置に動かす
+				waku_r.rmove(name_posx, name_posy-waku_r.height()); // NAME_POS へ位置補正
 				name_container = parent.create_node(waku_r, 0);
 				MakeWaku(*name_container, event, name_waku, win_no, 0, callback);
 				Rect name_r(0,0,w,h);
 				name_r.rmove(name_mposx, name_mposy);
 				name = new WidLabel(name_container, name_r, true, 0, name_size);
 				name->show();
-			} else { // ̾�������Ȥʤ�
+			} else { // 名前専用枠なし
 				Rect name_r(0, 0, w, h);
 				name_r.rmove(r.lx, r.ty);
 				name_r.rmove(name_posx, name_posy-name_size);
--- a/scn2k/scn2kdump.cc
+++ b/scn2k/scn2kdump.cc
@@ -123,7 +123,7 @@ int main(int argc, char** argv) {
 		char* data = info->CopyRead();
 		char* d = data;
 		char* dend = d + info->Size();
-		/* version ��ǧ */
+		/* version 確認 */
 		if (read_little_endian_int(d) == 0x1cc) {
 			system_version = 0;
 		} else if (read_little_endian_int(d) == 0x1d0) {
@@ -150,7 +150,7 @@ int main(int argc, char** argv) {
 		if (n != 6) fprintf(stdout,"subroutine table %2d: %6d\n",i,n);
 }}
 		Flags flags;
-		/* �ǽ餫��Ǹ�ޤǥ��ޥ�ɼ��� -> ���Ϥ򷫤��֤� */
+		/* 最初から最後までコマンド取得 -> 出力を繰り返す */
 		while(dcur<dend) {
 			const char* dprev = dcur;
 			CmdD cmd(flags, system_version); cmd.ClearError();
@@ -210,26 +210,26 @@ DeleteFaceGraphics
 KoePlay
 	0x23 - cmd 01-17:0000:01[ 2] 
 	args:100000026,5
-DrawGraphics(���ʲ褢���
+DrawGraphics(前景画あり)
 	0x23 - cmd 01-21:004b:00[ 1] 
 	args:V<18>[1],10,kasane. #1 <args:V<18>[17],11>
 
-DrawGraphics(�طʤΤ�)
+DrawGraphics(背景のみ)
 	0x23 - cmd 01-21:0049:00[ 2] 
 	args:V<18>[1],10
 	
 Ruby
 	0x23 - cmd 00-03:0078:01[ 0] 
-	"��ͳ"
+	"理由"
 	0x23 - cmd 00-03:0078:00[ 1] 
-	"�櫓"
+	"わけ"
 SetTitle
 	0x23 - cmd 01-04:0000:00[ 1] 
 	args:"Long Long Time Ago..."
 WaitTime
 	0x23 - cmd 01-14:0069:00[ 1] 
 	args:3000
-ChangeBGM	���Ͱ����ϥե����ɥ����ȡ�����λ��֤ȿ�¬
+ChangeBGM	数値引数はフェードアウト、インの時間と推測
 0x23 - cmd 01-14:0000:02[ 3] 
 	args:"BGM18",700,700
 */
--- a/scn2k/test.cc
+++ b/scn2k/test.cc
@@ -66,22 +66,22 @@ int main(void) {
 	main_panel->show();
 	Scn2k scn(main.event, *main_panel, mu, config);
 	// MouseCursor* cursor = new MouseCursor
-	// scn.OpenScript(1002, -19482); // �������
-	//scn.OpenScript(1002, -18240); // ����������󳫻�
-	// scn.OpenScript(1002, -59528); // ����������󳫻�
+	// scn.OpenScript(1002, -19482); // ラブ生〜
+	//scn.OpenScript(1002, -18240); // ラブ生シーン開始
+	// scn.OpenScript(1002, -59528); // ラブ生シーン開始
 	// scn.OpenScript(2, 0);
 	// scn.OpenScript(320, 0);
-	//scn.OpenScript(320, -4269); // �����ץ˥�(Chap.2)
+	//scn.OpenScript(320, -4269); // オープニング(Chap.2)
 	//scn.OpenScript(320, -2523);
 	//scn.OpenScript(320, -7549);
-	// scn.OpenScript(310, 0); // ����ǥ���(Wed.day)
-	//scn.OpenScript(311, 0); // ����ǥ���
-	// scn.OpenScript(100, -2244); // �����
-	// scn.OpenScript(100, -9008); // �����
-	//scn.OpenScript(1001, -118520 ); // ����衧��륯��
-	// scn.OpenScript(1, 0); // ����
-	// scn.OpenScript(414,380); // ����
-	// scn.OpenScript(9142,0); // ����
+	// scn.OpenScript(310, 0); // エンディング(Wed.day)
+	//scn.OpenScript(311, 0); // エンディング
+	// scn.OpenScript(100, -2244); // 選択肢
+	// scn.OpenScript(100, -9008); // 選択肢
+	//scn.OpenScript(1001, -118520 ); // 選択肢:葛城クン
+	// scn.OpenScript(1, 0); // 開始
+	// scn.OpenScript(414,380); // 開始
+	// scn.OpenScript(9142,0); // 開始
 	// config.SetParam("#SEEN_START", 1, 9140);
 	//scn.show_textwindow(0);
 	
--- a/system/file.cc
+++ b/system/file.cc
@@ -1,9 +1,9 @@
 bool init_end=false;
-/*  file.cc  : KANON �ΰ��̥ե����롦PDT �ե�����ʲ����ե�����ˤ�Ÿ����
- *            ����Υ᥽�å�
- *     class ARCFILE : ��˥ե��������Τ򰷤����饹
- *     class ARCINFO : ��˥ե��������Σ��ĤΥե�����򰷤����饹
- *     class PDTCONV : PDT �ե������Ÿ����Ԥ���
+/*  file.cc  : KANON の圧縮ファイル・PDT ファイル(画像ファイル)の展開の
+ *            ためのメソッド
+ *     class ARCFILE : 書庫ファイル全体を扱うクラス
+ *     class ARCINFO : 書庫ファイルの中の1つのファイルを扱うクラス
+ *     class PDTCONV : PDT ファイルの展開を行う。
  *
  */
 
@@ -85,7 +85,7 @@ using namespace std;
 
 // #define delete fprintf(stderr,"file.cc: %d.",__LINE__), delete
 
-/* FileSearcher class �� default ����� */
+/* FileSearcher class の default の振る舞い */
 FileSearcher *FileSearcher::_singleton = NULL;
 FileSearcher::ARCTYPE FileSearcher::default_is_archived[TYPEMAX] = {
 	ATYPE_DIR, ATYPE_DIR, ATYPE_DIR, ATYPE_DIR,
@@ -100,16 +100,16 @@ const char* FileSearcher::default_dirnam
 
 /*********************************************
 **  ARCFILE / DIRFILE:
-**	��˥ե����롢���뤤�ϥǥ��쥯�ȥ��
-**	���Τ�������륯�饹
+**	書庫ファイル、あるいはディレクトリの
+**	全体を管理するクラス
 **
-**	��˥ե����뤫��ե������ȴ���Ф���Find()
-**	Find ������Τ�Read��������Ƥ������롣
+**	書庫ファイルからファイルの抜き出しはFind()
+**	Find したものをReadすると内容が得られる。
 */
 
 ARCFILE::ARCFILE(const char* aname) {
 	struct stat sb;
-	/* �ѿ������ */
+	/* 変数初期化 */
 	arcname = NULL;
 	list_point = 0;
 	filenames_orig = NULL;
@@ -119,7 +119,7 @@ ARCFILE::ARCFILE(const char* aname) {
 		arcname[0]='\0';
 		return;
 	} // NULFILE
-	/* �ǥ��쥯�ȥ꤫�ݤ��Υ����å� */
+	/* ディレクトリか否かのチェック */
 	if (stat(aname,&sb) == -1) { /* error */
 		perror("stat");
 	}
@@ -141,9 +141,9 @@ ARCFILE::ARCFILE(const char* aname) {
 void ARCFILE::Init(void) {
 	if (! arc_atom.empty()) return;
 	if (arcname == NULL) return;
-	/* �ե������������ */
+	/* ファイル数を得る */
 	int slen = CheckFileDeal();
-	/* �ե�����̾�Υ��å� */
+	/* ファイル名のセット */
 	ListupFiles(slen);
 	if ( (!arc_atom.empty()) && arc_atom[0].filename) filenames_orig = arc_atom[0].filename;
 	sort(arc_atom.begin(), arc_atom.end());
@@ -160,16 +160,16 @@ ARCFILE::iterator ARCFILE::SearchName(co
 	Init();
 	if (f == NULL) return arc_atom.end();
 	if (arc_atom.empty()) return arc_atom.end();
-	/* ���顼�����å� */
+	/* エラーチェック */
 	if (strlen(f)>500) return arc_atom.end();
 	if (ext && strlen(ext)>500) return arc_atom.end();
 
-	/* ���� */
+	/* 検索 */
 	strncpy(buf, f, 1000);
 	buf[1000]=0;
 	it = lower_bound(arc_atom.begin(), arc_atom.end(), (char*)buf);
 	if (it != arc_atom.end() && strcmp(it->filename_lower, buf) == 0) return it;
-	// ��ĥ�Ҥ�Ĥ��Ƹ���
+	// 拡張子をつけて検索
 	if (ext) {
 		strcpy(buf_ext, buf);
 		char* ext_pt = strrchr(buf_ext, '.');
@@ -181,7 +181,7 @@ ARCFILE::iterator ARCFILE::SearchName(co
 		if (it != arc_atom.end() && strcmp(it->filename_lower, buf_ext) == 0) return it;
 	}
 
-	/* ��ʸ���ˤ��� ���� */
+	/* 小文字にして 検索 */
 	int i; int l = strlen(f);
 	if (l > 500) l = 500;
 	for (i=0; i<l; i++)
@@ -190,13 +190,13 @@ ARCFILE::iterator ARCFILE::SearchName(co
 	it = lower_bound(arc_atom.begin(), arc_atom.end(), (char*)buf);
 	if (it != arc_atom.end() && strcmp(it->filename_lower, buf) == 0) return it;
 
-	// ��ĥ�Ҥ�Ĥ��Ƹ���
+	// 拡張子をつけて検索
 	if (ext == NULL) return arc_atom.end();
 	strcpy(buf_ext, buf);
 	char* ext_pt = strrchr(buf_ext, '.');
 	if (ext_pt == NULL || ext_pt == buf_ext) ext_pt = buf_ext + strlen(buf_ext);
 	*ext_pt++ = '.';
-	/* ��ĥ�Ҥ�Ĺ�������� */
+	/* 拡張子の長さを得る */
 	l = strlen(ext);
 	for (i=0; i<l; i++)
 		ext_pt[i] = tolower(*ext++);
@@ -218,7 +218,7 @@ ARCINFO* ARCFILE::Find(const char* fname
 ARCINFO* ARCFILE::MakeARCINFO(ARCFILE_ATOM& atom) {
 	if (atom.arcsize == atom.filesize)
 		return new ARCINFO(arcname, atom);
-	else // ������
+	else // 圧縮付
 		return new ARCINFO_AVG32(arcname, atom);
 }
 ARCINFO* NULFILE::MakeARCINFO(ARCFILE_ATOM& atom) {
@@ -297,7 +297,7 @@ char* ARCFILE::ListItem(void) {
 
 int ARCFILE::CheckFileDeal(void) {
 	char buf[0x20];
-	/* �إå��Υ����å� */
+	/* ヘッダのチェック */
 	FILE* stream = fopen(arcname, "rb");
 	if (stream == NULL) {
 		fprintf(stderr, "Cannot open archive file : %s\n",arcname);
@@ -386,7 +386,7 @@ void DIRFILE::ListupFiles(int fname_len)
 		fprintf(stderr, "Cannot open dir file : %s\n",arcname);
 		return;
 	}
-	/* ���Ū�� arcname �Υǥ��쥯�ȥ�˰�ư���� */
+	/* 一時的に arcname のディレクトリに移動する */
 	int old_dir_fd = open(".",O_RDONLY);
 	if (old_dir_fd < 0) {
 		closedir(dir);
@@ -427,7 +427,7 @@ void DIRFILE::ListupFiles(int fname_len)
 		arc_atom.push_back(atom);
 		buf += l*2+2; fname_len -= l*2+2;
 	}
-	/* chdir() �����Τ򸵤���� */
+	/* chdir() したのを元に戻る */
 	closedir(dir);
 	fchdir(old_dir_fd); close(old_dir_fd);
 }
@@ -447,7 +447,7 @@ void NULFILE::ListupFiles(int fname_len)
 }
 
 int SCN2kFILE::CheckFileDeal(void) {
-	/* �إå��Υ����å� */
+	/* ヘッダのチェック */
 	FILE* stream = fopen(arcname, "rb");
 	if (stream == NULL) {
 		fprintf(stderr, "Cannot open archive file : %s\n",arcname);
@@ -462,7 +462,7 @@ int SCN2kFILE::CheckFileDeal(void) {
 	}
 	char* buf = new char[10000*8];
 	fread(buf, 10000, 8, stream);
-	/* size == 0 �Υǡ�����¸�ߤ��ʤ� */
+	/* size == 0 のデータは存在しない */
 	int count = 0;
 	int i; for (i=0; i<10000; i++) {
 		int tmp_offset = read_little_endian_int(buf+i*8);
@@ -472,7 +472,7 @@ int SCN2kFILE::CheckFileDeal(void) {
 	}
 	fclose(stream);
 	delete[] buf;
-	return count*13; /* �ե�����̾�� seenXXXX.txt �����顢���12ʸ��+null */
+	return count*13; /* ファイル名は seenXXXX.txt だから、一つ12文字+null */
 }
 
 void SCN2kFILE::ListupFiles(int fname_len) {
@@ -492,23 +492,23 @@ void SCN2kFILE::ListupFiles(int fname_le
 		int tmp_offset = read_little_endian_int(buf+i*8);
 		int tmp_size = read_little_endian_int(buf+i*8+4);
 		if (tmp_size <= 0 || tmp_offset < 0 || tmp_offset+tmp_size > int(arc_size) ) continue;
-		/* header �����ư��̷����ʤɤ�Ĵ�٤� */
+		/* header を得て圧縮形式などを調べる */
 		fseek(stream, tmp_offset, SEEK_SET);
 		fread(header, 0x200, 1, stream);
 		int header_top = read_little_endian_int(header+0);
 		int file_version = read_little_endian_int(header+4);
 
 		if (file_version == 0x1adb2) ; // Little Busters!
-		else if (file_version != 0x2712) continue; /* system version ���㤦 */
+		else if (file_version != 0x2712) continue; /* system version が違う */
 
-		if (header_top == 0x1cc) { /* �Ť����� : avg2000 */
+		if (header_top == 0x1cc) { /* 古い形式 : avg2000 */
 			int header_size = read_little_endian_int(header+0)+read_little_endian_int(header+0x20)*4;
 			int data_size = read_little_endian_int(header+0x24);
 			atom.arcsize = data_size + header_size;
 			atom.filesize = data_size + header_size;
 			atom.private_data = header_size;
 
-		} else if (header_top == 0x1b8) { /* ���븥�� */
+		} else if (header_top == 0x1b8) { /* 初夜献上 */
 			int header_size = read_little_endian_int(header+0)+read_little_endian_int(header+0x08)*4;
 			int data_size = read_little_endian_int(header+0x0c);
 			int compdata_size = read_little_endian_int(header+0x10);
@@ -516,7 +516,7 @@ void SCN2kFILE::ListupFiles(int fname_le
 			atom.filesize = data_size + header_size;
 			atom.private_data = header_size;
 			
-		} else if (header_top == 0x1d0) { /* ������������ reallive */
+		} else if (header_top == 0x1d0) { /* 新しい形式: reallive */
 			int header_size = read_little_endian_int(header+0x20);
 			int data_size = read_little_endian_int(header+0x24);
 			int compdata_size = read_little_endian_int(header+0x28);
@@ -525,7 +525,7 @@ void SCN2kFILE::ListupFiles(int fname_le
 			atom.private_data = header_size;
 		} else {
 			fprintf(stderr,"invalid header top; %x : not supported\n",header_top);
-			continue; /* ���ݡ��Ȥ��ʤ����� */
+			continue; /* サポートしない形式 */
 		}
 
 		atom.offset = tmp_offset;
@@ -608,7 +608,7 @@ const char * KeyHolder::GetKey(void)
 }
 
 /********************************************************
-** FileSearcher ���饹�μ���
+** FileSearcher クラスの実装
 */
 
 FileSearcher* FileSearcher::GetInstance(void) {
@@ -647,7 +647,7 @@ FileSearcher::~FileSearcher(void) {
 }
 
 int FileSearcher::InitRoot(char* root) {
-	/* ɬ�פ˱����� ~/ ��Ÿ�� */
+	/* 必要に応じて ~/ を展開 */
 	if (root[0] == '~' && root[1] == '/') {
 		char* home = getenv("HOME");
 		if (home != NULL) {
@@ -657,7 +657,7 @@ int FileSearcher::InitRoot(char* root) {
 			root = new_root;
 		}
 	}
-	/* �Ť��ǡ�����ä� */
+	/* 古いデータを消す */
 	int i;
 	for (i=0; i<TYPEMAX; i++) {
 		if (searcher[i] != NULL &&
@@ -671,13 +671,13 @@ int FileSearcher::InitRoot(char* root) {
 	if (root_dir) delete root_dir;
 	dat_dir = NULL;
 
-	/* �������ǥ��쥯�ȥ�Τ�Ȥǽ���� */
+	/* 新しいディレクトリのもとで初期化 */
 	root_dir = new DIRFILE(root);
 	root_dir->Init();
-	/* dat/ �򸡺� */
+	/* dat/ を検索 */
 	char* dat_path = root_dir->SearchFile("dat");
 	if (dat_path == NULL) {
-		/* ���Ĥ���ʤ��ä��� root �� dat ������ˤĤ��� */
+		/* 見つからなかったら root を dat の代わりにつかう */
 		dat_dir = root_dir;
 	} else {
 		dat_dir = new DIRFILE(dat_path);
@@ -693,7 +693,7 @@ void FileSearcher::SetFileInformation(FI
 	int type = tp;
 	if (type < 0 || type >= TYPEMAX) return;
 	ARCFILE* next_arc = NULL;
-	/* ���Ǥ� searcher ��¸�ߤ���в��� */
+	/* すでに searcher が存在すれば解放 */
 	if (searcher[type] != NULL &&
 	  searcher[type] != root_dir &&
 	  searcher[type] != dat_dir) {
@@ -701,7 +701,7 @@ void FileSearcher::SetFileInformation(FI
 		delete searcher[type];
 	}
 	searcher[type] = NULL;
-	/* Ŭ���˽���� */
+	/* 適当に初期化 */
 	if (filenames[type] != NULL &&
 		filenames[type] != default_dirnames[type]) delete[] filenames[type];
 	filenames[type] = filename;
@@ -714,18 +714,18 @@ void FileSearcher::SetFileInformation(FI
 void FileSearcher::AppendFileInformation(FILETYPE tp, ARCTYPE is_arc, char* filename) {
 	int type = tp;
 	if (type < 0 || type >= TYPEMAX) return;
-	/* searcher ���ޤ�������Ƥ��Ƥʤ���� */
+	/* searcher がまだ割り当てられてない場合 */
 	if (searcher[type] == NULL ||
 	  searcher[type] == root_dir ||
 	  searcher[type] == dat_dir) {
 		searcher[type] = MakeARCFILE(is_archived[type], filenames[type]);
-		if (searcher[type] == NULL) { /* �����Ǥ��ʤ��ä���� */
-			/* ���η������ FileInformation �Ȥ��� */
+		if (searcher[type] == NULL) { /* 作成できなかった場合 */
+			/* この型情報を FileInformation とする */
 			SetFileInformation(tp, is_arc, filename);
 			return;
 		}
 	}
-	/* ����� */
+	/* 初期化 */
 	ARCFILE* arc = MakeARCFILE(is_arc, filename);
 	/* append */
 	ARCFILE* cur;
@@ -773,7 +773,7 @@ err:
 
 ARCINFO* FileSearcher::Find(FILETYPE type, const char* fname, const char* ext) {
 	if (searcher[type] == NULL) {
-		/* searcher ���� */
+		/* searcher 作成 */
 		if (filenames[type] == NULL) {
 			searcher[type] = dat_dir;
 		} else {
@@ -788,10 +788,10 @@ ARCINFO* FileSearcher::Find(FILETYPE typ
 }
 
 char** FileSearcher::ListAll(FILETYPE type) {
-	/* �Ȥꤢ���� searcher ������ */
+	/* とりあえず searcher を初期化 */
 	Find(type, "THIS FILENAME MAY NOT EXIST IN THE FILE SYSTEM !!!");
 	if (searcher[type] == NULL) return NULL;
-	/* ���ե�����Υꥹ�ȥ��å� */
+	/* 全ファイルのリストアップ */
 	int deal = 0;
 	ARCFILE* file;
 	for (file = searcher[type]; file != NULL; file = file->Next())
@@ -834,7 +834,7 @@ int ARCINFO::Size(void) const {
 	return info.filesize;
 }
 
-/* ���ԡ����֤� */
+/* コピーを返す */
 char* ARCINFO::CopyRead(void) {
 	const char* d = Read();
 	if (d == NULL) return NULL;
@@ -845,13 +845,13 @@ char* ARCINFO::CopyRead(void) {
 }
 
 const char* ARCINFO::Path(void) const {
-	if (info.offset != 0) return NULL; /* archive file �ʤΤǥѥ��򵢤��ʤ� */
+	if (info.offset != 0) return NULL; /* archive file なのでパスを帰せない */
 	char* ret = new char[strlen(arcfile)+1];
 	strcpy(ret, arcfile);
 	return ret;
 }
 
-/* �ߴ������� */
+/* 互換性専用 */
 FILE* ARCINFO::OpenFile(int* length) const {
 	FILE* f = fopen(arcfile, "rb");
 	if (info.offset) lseek(fileno(f), info.offset, SEEK_SET);
@@ -859,20 +859,20 @@ FILE* ARCINFO::OpenFile(int* length) con
 	return f;
 }
 
-// Ÿ�������Ϥʤ�
+// 展開処理はなし
 bool ARCINFO::ExecExtract(void) {
 	return true;
 }
 
-/* �ɤ߹��ߤ򳫻Ϥ��� */
+/* 読み込みを開始する */
 const char* ARCINFO::Read(void) {
-	// ���Ǥ˥ǡ������ɤ߹��ߺѤߤʤ鲿�⤷�ʤ�
+	// すでにデータを読み込み済みなら何もしない
 	if (data != NULL) return data;
 
 	if (info.offset < 0 || info.arcsize <= 0) {
 		return NULL;
 	}
-	/* �ե�����򳫤� */
+	/* ファイルを開く */
 	fd = open(arcfile, O_RDONLY);
 	if (fd < 0) {
 		return NULL;
@@ -882,7 +882,7 @@ const char* ARCINFO::Read(void) {
 		fd = -1;
 		return NULL;
 	}
-	/* mmap ���ߤ� */
+	/* mmap を試みる */
 #ifdef HAVE_MMAP
 	mmapped_memory = (char*)mmap(NULL, info.arcsize, PROT_READ, MAP_SHARED, fd, info.offset);
 	if (mmapped_memory != MAP_FAILED) {
@@ -891,7 +891,7 @@ const char* ARCINFO::Read(void) {
 	} else
 #endif /* HAVE_MMAP */
 	{
-		/* ���ԡ����̤˥ե�������ɤ߹��� */
+		/* 失敗:普通にファイルを読み込み */
 		char* d = new char[info.arcsize];
 		read(fd, d, info.arcsize);
 		close(fd);
@@ -899,9 +899,9 @@ const char* ARCINFO::Read(void) {
 		use_mmap = false;
 		data = d;
 	}
-	/* Ÿ������ */
+	/* 展開する */
 	if (! ExecExtract()) {
-		// ����
+		// 失敗
 #ifdef HAVE_MMAP
 		if (use_mmap) {
 			munmap(mmapped_memory, info.arcsize);
@@ -915,7 +915,7 @@ const char* ARCINFO::Read(void) {
 	}
 #ifdef HAVE_MMAP
 	if (use_mmap && data != (const char*)mmapped_memory) {
-		// ���Ǥ� mmap ��ɬ�פʤ�
+		// すでに mmap は必要ない
 		munmap(mmapped_memory, info.arcsize);
 		close(fd);
 		fd = -1;
@@ -927,7 +927,7 @@ const char* ARCINFO::Read(void) {
 
 /**********************************************
 **
-**	����Ÿ���ϥ��饹�����������
+**	画像展開系クラスの定義、実装
 **
 ***********************************************
 */
@@ -1036,7 +1036,7 @@ class JPEGCONV : public GRPCONV {
 #endif
 
 GRPCONV* GRPCONV::AssignConverter(const char* inbuf, int inlen, const char* fname) {
-	/* �ե���������Ƥ˱���������С������������Ƥ� */
+	/* ファイルの内容に応じたコンバーターを割り当てる */
 	GRPCONV* conv = NULL;
 	if (inlen < 10) return NULL; /* invalid file */
 	if (strncmp(inbuf, "PDT10", 5) == 0 || strncmp(inbuf, "PDT11", 5) == 0) { /* PDT10 or PDT11 */
@@ -1084,16 +1084,16 @@ GRPCONV* GRPCONV::AssignConverter(const 
 }
 
 PDTCONV::PDTCONV(const char* _inbuf, int _inlen,const char* filename) {
-//	PDT FILE �Υإå�
-//	+00 'PDT10'	(PDT11 ��̤�б�)
-//	+08 �ե����륵���� (̵��)
-//	+0C width (�ۤܤ��٤ơ�640)
-//	+10 height(�ۤܤ��٤ơ�480)
-//	+14 (mask ��) x ��ɸ (�ºݤ�̵�롦�������ե������ 0 )
-//	+1c (mask ��) y��ɸ (�ºݤ�̵�� ���������ե������ 0 )
-//	+20 mask ��¸�ߤ���С�mask �ؤΥݥ���
+//	PDT FILE のヘッダ
+//	+00 'PDT10'	(PDT11 は未対応)
+//	+08 ファイルサイズ (無視)
+//	+0C width (ほぼすべて、640)
+//	+10 height(ほぼすべて、480)
+//	+14 (mask の) x 座標 (実際は無視・・・全ファイルで 0 )
+//	+1c (mask の) y座標 (実際は無視 ・・・全ファイルで 0 )
+//	+20 mask が存在すれば、mask へのポインタ
 
-	/* �إå������å� */
+	/* ヘッダチェック */
 	if (_inlen < 0x20) {
 		fprintf(stderr, "Invalid PDT file %s : size is too small\n",filename);
 		return;
@@ -1116,14 +1116,14 @@ PDTCONV::PDTCONV(const char* _inbuf, int
 
 
 G00CONV::G00CONV(const char* _inbuf, int _inlen, const char* filename) {
-//	G00 FILE �Υإå�
+//	G00 FILE のヘッダ
 //	+00 type (1, 2)
 //	+01: width(word)
 //	+03: height(word)
-//	type 1: (color table �դ� LZ ���� ; PDT11 ���б�)
-//		+05: ���̥�����(dword) ; +5 ����ȥǡ������ΤΥ�����
-//		+09: Ÿ���奵����(dword)
-//	type 2: (�ޥ����ġ����������ΰ��ʬ�䤷�Ƥ��줾�찵��)
+//	type 1: (color table 付き LZ 圧縮 ; PDT11 に対応)
+//		+05: 圧縮サイズ(dword) ; +5 するとデータ全体のサイズ
+//		+09: 展開後サイズ(dword)
+//	type 2: (マスク可、画像を矩形領域に分割してそれぞれ圧縮)
 //		+05: index size
 //		+09: index table(each size is 0x18)
 //			+00
@@ -1133,14 +1133,14 @@ G00CONV::G00CONV(const char* _inbuf, int
 //		+09+0x18*size+08: (data top)
 //
 
-	/* �ǡ�����������ɤ߹��� */
+	/* データから情報読み込み */
 	int type = *_inbuf;
 
 	int w = read_little_endian_short(_inbuf+1);
 	int h = read_little_endian_short(_inbuf+3);
 	if (w < 0 || h < 0) return;
 
-	if (type == 0 || type == 1) { // color table �դ�����
+	if (type == 0 || type == 1) { // color table 付き圧縮
 		if (_inlen < 13) {
 			fprintf(stderr, "Invalid G00 file %s : size is too small\n",filename);
 			return;
@@ -1153,7 +1153,7 @@ G00CONV::G00CONV(const char* _inbuf, int
 			return;
 		}
 		Init(filename, _inbuf, _inlen, w, h, false);
-	} else if (type == 2) { // color table �ʤ����ޥ����դ��Ĥΰ���
+	} else if (type == 2) { // color table なし、マスク付き可の圧縮
 
 		int head_size = read_little_endian_short(_inbuf+5);
 		if (head_size < 0 || head_size*24 > _inlen) return;
@@ -1172,17 +1172,17 @@ G00CONV::G00CONV(const char* _inbuf, int
 
 bool G00CONV::Read(char* image) {
 	if (data == NULL) return false;
-	/* header ���� */
+	/* header 識別 */
 	int type = *data;
 	if (type == 0) return Read_Type0(image);
 	else if (type == 1) return Read_Type1(image);
 	else if (type == 2) return Read_Type2(image);
 }
 
-/* ����Ū�� LZ ���̤�Ÿ���롼���� */
-/* datasize �ϥǡ������礭����char / short / int ������ */
-/* datatype �� Copy1Pixel (1�ǡ����Υ��ԡ�)�ڤ� ExtractData(LZ ���̤ξ��������
-** �Ȥ����᥽�åɤ�����������饹 */
+/* 一般的な LZ 圧縮の展開ルーチン */
+/* datasize はデータの大きさ、char / short / int を想定 */
+/* datatype は Copy1Pixel (1データのコピー)及び ExtractData(LZ 圧縮の情報を得る
+** というメソッドを実装したクラス */
 static int bitrev_table[256] = {
 	0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
 	0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
@@ -1207,7 +1207,7 @@ template<class DataType, class DataSize>
 	const char* lsrc = src; char* ldest = dest;
 
 	if (lsrc+50 < lsrcend && ldest+1024 < ldestend) {
-		/* �ޤ����ϰϥ����å���ˤ����ƹ�®�ʥ롼�����Ȥ� */
+		/* まず、範囲チェックを緩くして高速なルーチンを使う */
 		lsrcend -= 50;
 		ldestend += 1024;
 		while (ldest < ldestend && lsrc < lsrcend) {
@@ -1233,7 +1233,7 @@ template<class DataType, class DataSize>
 		lsrcend += 50;
 		ldestend += 1024;
 	}
-	/* �Ĥ���Ѵ� */
+	/* 残りを変換 */
 	while (ldest < ldestend && lsrc < lsrcend) {
 		count += 8;
 		int flag = int(*(unsigned char*)lsrc++);
@@ -1258,12 +1258,12 @@ template<class DataType, class DataSize>
 	return 0;
 }
 
-/* �����򸺤餹�����wrapper */
+/* 引数を減らすためのwrapper */
 template<class DataType, class DataSize> inline int lzExtract(DataType datatype, DataSize datasize ,const char*& src, char*& dest, const char* srcend, char* destend) {
 	return lzExtract<DataType, DataSize>(datatype,src,dest,srcend,destend);
 }
 
-/* ���̤� PDT */
+/* 普通の PDT */
 class Extract_DataType {
 	public:
 		static void ExtractData(const char*& lsrc, int& data, int& size) {
@@ -1286,7 +1286,7 @@ class Extract_DataType {
 		static int IsRev(void) { return 0; }
 };
 
-/* PDT11 ������ʳ��Ѵ� */
+/* PDT11 の第一段階変換 */
 class Extract_DataType_PDT11 {
 	private:
 		int* index_table;
@@ -1305,7 +1305,7 @@ class Extract_DataType_PDT11 {
 		static int IsRev(void) { return 0; }
 };
 
-/* �ޥ����� */
+/* マスク用 */
 class Extract_DataType_Mask {
 	public:
 		void ExtractData(const char*& lsrc, int& data, int& size) {
@@ -1321,7 +1321,7 @@ class Extract_DataType_Mask {
 		static int IsRev(void) { return 0; }
 };
 
-/* ����� */
+/* 書庫用 */
 class Extract_DataType_ARC {
 	public:
 		void ExtractData(const char*& lsrc, int& data, int& size) {
@@ -1337,7 +1337,7 @@ class Extract_DataType_ARC {
 		static int IsRev(void) { return 0; }
 };
 
-/* avg2000 �Υ��ʥꥪ�� */
+/* avg2000 のシナリオ用 */
 class Extract_DataType_SCN2k {
 	public:
 		void ExtractData(const char*& lsrc, int& data, int& size) {
@@ -1353,7 +1353,7 @@ class Extract_DataType_SCN2k {
 		static int IsRev(void) { return 1; }
 };
 
-/* ReadLive �� type0 */
+/* ReadLive の type0 */
 class Extract_DataType_G00Type0 {
 	public:
 		static void ExtractData(const char*& lsrc, int& data, int& size) {
@@ -1385,7 +1385,7 @@ bool PDTCONV::Read(char* image) {
 		if (! Read_PDT11(image)) return false;
 	}
 	if (! is_mask) return true;
-	// �ޥ����ɤ߹���
+	// マスク読み込み
 	int mask_pt = read_little_endian_int(data + 0x1c);
 	char* buf = new char[width*height+1024];
 	const char* src = data + mask_pt;
@@ -1452,8 +1452,8 @@ bool PDTCONV::Read_PDT11(char* image) {
 	return true;
 }
 
-/* dest �� dest_end ���� 256 byte �ʾ���ޤ�
-** �񤭹��߲�ǽ�Ǥ��뤳�ȡ�
+/* dest は dest_end よりも 256 byte 以上先まで
+** 書き込み可能であること。
 */
 void ARCINFO::Extract(char*& dest_start, char*& src_start, char* dest_end, char* src_end) {
 	const char* src = src_start;
@@ -1468,12 +1468,12 @@ void ARCINFO::Extract2k(char*& dest_star
 }
 
 bool ARCINFO_AVG32::ExecExtract(void) {
-	// �إå��Υ����å�
+	// ヘッダのチェック
 	if (strncmp(data, "PACK", 4) != 0) return false;
 	if (read_little_endian_int(data+8) != info.filesize) return false;
 	if (read_little_endian_int(data+12) != info.arcsize) return false;
 
-	// �ե������Ÿ������
+	// ファイルを展開する
 	char* ret_data = new char[info.filesize+1024];
 
 	const char* s = data + 0x10;
@@ -1510,10 +1510,10 @@ bool ARCINFO2k::ExecExtract(void) {
 	char* ret_data = new char[info.filesize + 1024];
 	char* decoded_data = new char[info.arcsize + 1024];
 	
-	/* header �Υ��ԡ� */
+	/* header のコピー */
 	memcpy(ret_data, data, info.private_data);
 
-	/* �ޤ���xor �ΰŹ沽��� */
+	/* まず、xor の暗号化を解く */
 	const char* s; const char* send;
 	char* d; char* dend;
 
@@ -1528,7 +1528,7 @@ bool ARCINFO2k::ExecExtract(void) {
 	if (info.filesize == info.arcsize) {
 		memcpy(ret_data+info.private_data, decoded_data + info.private_data + 8, info.arcsize - info.private_data - 8);
 	} else {
-		/* ���̤���Ƥ���ʤ顢�����Ÿ�� */
+		/* 圧縮されているなら、それを展開 */
 		s = (const char*)(decoded_data + info.private_data + 8);
 		send = (const char*)(decoded_data + info.arcsize);
 		d = ret_data + info.private_data;
@@ -1552,13 +1552,13 @@ bool G00CONV::Read_Type0(char* image) {
 	int uncompress_size = read_little_endian_int(data+9);
 	char* uncompress_data = new char[uncompress_size+1024];
 
-	// �ޤ�Ÿ��
+	// まず展開
 	const char* src = data + 13;
 	const char* srcend = data + datalen;
 	char* dest = uncompress_data;
 	char* dstend = uncompress_data + uncompress_size;
 	while(lzExtract(Extract_DataType_G00Type0(), char(), src, dest, srcend, dstend)){};
-	// image �˥��ԡ�
+	// image にコピー
 	CopyRGB(image, uncompress_data);
 	delete[] uncompress_data;
 	return true;
@@ -1569,7 +1569,7 @@ bool G00CONV::Read_Type1(char* image) {
 	int uncompress_size = read_little_endian_int(data+9) + 1;
 	char* uncompress_data = new char[uncompress_size + 1024];
 
-	// �ޤ���Ÿ��
+	// まず、展開
 	const char* src = data + 13;
 	const char* srcend = data + datalen;
 	char* dest = uncompress_data;
@@ -1598,7 +1598,7 @@ bool G00CONV::Read_Type1(char* image) {
 
 bool G00CONV::Read_Type2(char* image) {
 	memset(image, 0, width*height*4);
-	/* ʬ���ΰ������ */
+	/* 分割領域を得る */
 	int region_deal = read_little_endian_int(data+5);
 	REGION* region_table = new REGION[region_deal];
 
@@ -1612,7 +1612,7 @@ bool G00CONV::Read_Type2(char* image) {
 		head += 24;
 	}
 
-	// Ÿ��
+	// 展開
 	int uncompress_size = read_little_endian_int(head+4);
 	char* uncompress_data = new char[uncompress_size + 1024];
 
@@ -1622,7 +1622,7 @@ bool G00CONV::Read_Type2(char* image) {
 	char* destend = uncompress_data + uncompress_size;
 	while(lzExtract(Extract_DataType_SCN2k(), char(), src, dest, srcend, destend)){};
 
-	/* region_deal2 == region_deal �ΤϤ��ġ�*/
+	/* region_deal2 == region_deal のはず……*/
 	int region_deal2 = read_little_endian_int(uncompress_data);
 	if (region_deal > region_deal2) region_deal = region_deal2;
 
@@ -1633,7 +1633,7 @@ bool G00CONV::Read_Type2(char* image) {
 		srcend = (const char*)(uncompress_data + offset + length);
 		while(src < srcend) {
 			int x, y, w, h;
-			/* ���ԡ������ΰ������ */
+			/* コピーする領域を得る */
 			x = read_little_endian_short(src);
 			y = read_little_endian_short(src+2);
 			w = read_little_endian_short(src+6);
@@ -1670,7 +1670,7 @@ void G00CONV::Copy_32bpp(char* image, in
 
 void GRPCONV::CopyRGBA_rev(char* image, const char* buf) {
 	int mask = is_mask ? 0 : 0xff000000;
-	/* ���Ѵ���Ԥ� */
+	/* 色変換を行う */
 	int len = width * height;
 	int i;
 	unsigned char* s = (unsigned char*)buf;
@@ -1686,7 +1686,7 @@ void GRPCONV::CopyRGBA(char* image, cons
 		CopyRGB(image, buf);
 		return;
 	}
-	/* ���Ѵ���Ԥ� */
+	/* 色変換を行う */
 	int len = width * height;
 	int i;
 	int* outbuf = (int*)image;
@@ -1697,7 +1697,7 @@ void GRPCONV::CopyRGBA(char* image, cons
 }
 
 void GRPCONV::CopyRGB(char* image, const char* buf) {
-	/* ���Ѵ���Ԥ� */
+	/* 色変換を行う */
 	int len = width * height;
 	int i;
 	unsigned char* s = (unsigned char*)buf;
@@ -1914,7 +1914,7 @@ void JPEGCONV::SetupSrc(struct jpeg_deco
 
 #endif /* HAVE_LIBJPEG */
 BMPCONV::BMPCONV(const char* _inbuf, int _inlen, const char* _filename) {
-	/* �ǡ�����������ɤ߹��� */
+	/* データから情報読み込み */
 	int w = read_little_endian_int(_inbuf + 0x12);
 	int h = read_little_endian_int(_inbuf + 0x16);
 	if (h < 0) h = -h;
@@ -1926,7 +1926,7 @@ BMPCONV::BMPCONV(const char* _inbuf, int
 bool BMPCONV::Read(char* image) {
 	if (data == NULL) return false;
 
-	/* �ޥ����Υ����å� */
+	/* マスクのチェック */
 	int bpp = read_little_endian_short(data+0x1c);
 	int h = read_little_endian_int(data + 0x16);
 	int dsz = read_little_endian_int(data + 0x22);
--- a/system/file.h
+++ b/system/file.h
@@ -1,8 +1,8 @@
-/*  file.h  : KANON �ΰ��̥ե����롦PDT �ե�����ʲ����ե�����ˤ�Ÿ����
- *            ����Υ��饹
- *     class FileSearcher : �ե�����δ�����Ԥ�
- *     class ARCINFO : ��˥ե��������Σ��ĤΥե�����򰷤����饹
- *     class PDTCONV : PDT �ե������Ÿ����Ԥ���
+/*  file.h  : KANON の圧縮ファイル・PDT ファイル(画像ファイル)の展開の
+ *            ためのクラス
+ *     class FileSearcher : ファイルの管理を行う
+ *     class ARCINFO : 書庫ファイルの中の1つのファイルを扱うクラス
+ *     class PDTCONV : PDT ファイルの展開を行う。
  */
 
 /*
@@ -88,21 +88,21 @@ static int write_little_endian_short(cha
 
 /*********************************************
 **  FileSearcher:
-**	��˥ե����롿�ǥ��쥯�ȥ��ޤᡢ
-**	���ե�����δ�����Ԥ���
+**	書庫ファイル/ディレクトリを含め、
+**	全ファイルの管理を行う。
 **
-**	�ǽ�ˡ�����ե����뤫��ե�����μ��ऴ�Ȥ�
-**	�ºݤ����äƤ���ǥ��쥯�ȥꡢ��ˤ����ꤹ��
+**	最初に、設定ファイルからファイルの種類ごとに
+**	実際に入っているディレクトリ、書庫を設定する
 **
-**	�ʹߤ�Find() �᥽�åɤǼºݤΥե���������Ƥ�����
+**	以降はFind() メソッドで実際のファイルの内容を得る
 **
 */
 
-/* ARCFILE �� DIRFILE �ϥե�������ऴ�Ȥξ��� */
+/* ARCFILE と DIRFILE はファイル種類ごとの情報 */
 class ARCFILE;
 class DIRFILE;
 class SCN2kFILE;
-/* ARCINFO �ϥե�������ɤ߹��ि���ɬ�� */
+/* ARCINFO はファイルを読み込むために必要 */
 class ARCINFO;
 class ARCFILE_ATOM;
 
@@ -131,9 +131,9 @@ class FileSearcher {
 	public:
 #define TYPEMAX 14
 		enum FILETYPE {
-			/* �����0 - 15 �ޤ� reserved */
-			ALL = 1, /* dat/ �ʲ��Υե�����(�ǥե���Ȥθ�����) */
-			ROOT= 2, /* ������Υ��󥹥ȡ���ǥ��쥯�ȥ� */
+			/* 一応、0 - 15 まで reserved */
+			ALL = 1, /* dat/ 以下のファイル(デフォルトの検索先) */
+			ROOT= 2, /* ゲームのインストールディレクトリ */
 			PDT = 3, /* default: PDT/ */
 			SCN = 4, /* default: DAT/SEEN.TXT */
 			ANM = 5, /* default: DAT/ALLANM.ANL */
@@ -152,19 +152,19 @@ class FileSearcher {
 		static FileSearcher* GetInstance(void);
 		static void Quit(void);
 
-		/* ���˥�����Υǡ���������ǥ��쥯�ȥ�����ꤹ��ɬ�פ����� */
+		/* 初めにゲームのデータがあるディレクトリを設定する必要がある */
 		int InitRoot(char* root);
-		/* �ե�����η����Ȥξ���򥻥åȤ��� */
+		/* ファイルの型ごとの情報をセットする */
 		void SetFileInformation(FILETYPE type, ARCTYPE is_arc,
 			char* filename);
-		/* ʣ���Υե�������Ĥη��˴�Ϣ�Ť��� */
+		/* 複数のファイルを一つの型に関連づける */
 		void AppendFileInformation(FILETYPE type, ARCTYPE is_arc,
 			char* filename);
 		ARCFILE* MakeARCFILE(ARCTYPE tp, const char* filename);
-		/* fname �ǻ��ꤵ�줿̾���Υե�����򸡺� */
+		/* fname で指定された名前のファイルを検索 */
 		class ARCINFO* Find(FILETYPE type, const char* fname, const char* ext=0);
-		/* �������Υե�����򤹤٤ƥꥹ�ȥ��å�
-		** ������ NULL pointer
+		/* ある種類のファイルをすべてリストアップ
+		** 末尾は NULL pointer
 		*/
 		char** ListAll(FILETYPE type);
 
@@ -173,14 +173,14 @@ class FileSearcher {
 		~FileSearcher();
 
 	private:
-		/* InitRoot() �λ����ǽ����������ѿ� */
+		/* InitRoot() の時点で初期化される変数 */
 		DIRFILE* root_dir;
 		DIRFILE* dat_dir;
 		ARCFILE* searcher[TYPEMAX];
-		/* �ե������¸�߰��֤� information */
+		/* ファイルの存在位置の information */
 		ARCTYPE is_archived[TYPEMAX];
 		const char* filenames[TYPEMAX];
-		/* �ǥե���Ȥ� information */
+		/* デフォルトの information */
 		static ARCTYPE default_is_archived[TYPEMAX];
 		static const char* default_dirnames[TYPEMAX];
 		static FileSearcher *_singleton;
@@ -188,14 +188,14 @@ class FileSearcher {
 
 class ARCINFO {
 	protected:
-		/* �ե����뤽�Τ�Τξ��� */
+		/* ファイルそのものの情報 */
 		ARCFILE_ATOM& info;
 		char* arcfile;
-		/* mmap ���Ƥ����硢���ξ��� */
+		/* mmap している場合、その情報 */
 		bool use_mmap;
 		char* mmapped_memory;
 		int fd;
-		/* �ե��������Ƥ����äƤ���Хåե� */
+		/* ファイル内容の入っているバッファ */
 		const char* data;
 
 	protected:
@@ -205,18 +205,18 @@ class ARCINFO {
 
 		virtual bool ExecExtract(void);
 	public:
-		/* dest ��256byte ���٤�;͵�����뤳�� */
+		/* dest は256byte 程度の余裕があること */
 		static void Extract(char*& dest, char*& src, char* destend, char* srcend);
 		static void Extract2k(char*& dest, char*& src, char* destend, char* srcend);
 		virtual ~ARCINFO();
-		/* ɬ�פʤ� Read ���˸Ƥ֤��Ȥǽ�����ʬ��Ǥ��� */
+		/* 必要なら Read 前に呼ぶことで処理を分割できる */
 		int Size(void) const;
-		char* CopyRead(void); /* Read() �������ƤΥ��ԡ����֤� */
+		char* CopyRead(void); /* Read() して内容のコピーを返す */
 		const char* Read(void);
-		/* �ե����뤬 regular file �ξ�硢�ե�����̾�򵢤� */
-		/* �����Ǥʤ��ʤ� 0 �򵢤� */
+		/* ファイルが regular file の場合、ファイル名を帰す */
+		/* そうでないなら 0 を帰す */
 		const char* Path(void) const;
-		FILE* OpenFile(int* length=0) const; /* �ߴ����Τ��ᡧraw file �ξ�硢�ե�����򳫤� */
+		FILE* OpenFile(int* length=0) const; /* 互換性のため:raw file の場合、ファイルを開く */
 };
 
 class GRPCONV {
--- a/system/file_impl.h
+++ b/system/file_impl.h
@@ -54,8 +54,8 @@ class ARCFILE {
 		int list_point;
 		std::vector<ARCFILE_ATOM> arc_atom;
 		typedef std::vector<ARCFILE_ATOM>::iterator iterator;
-		ARCFILE* next; /* FILESEARCH �ΰ�Ĥη���ʣ���� ARCFILE ����ĤȤ����ꥹ�Ȥ�Ĥ��� */
-		/* arcname �˻��ꤵ�줿�ե����롿�ǥ��쥯�ȥ�����ƥ����å� */
+		ARCFILE* next; /* FILESEARCH の一つの型が複数の ARCFILE を持つとき、リストをつくる */
+		/* arcname に指定されたファイル/ディレクトリの内容チェック */
 		virtual int CheckFileDeal(void);
 		virtual void ListupFiles(int fname_len);
 		virtual ARCINFO* MakeARCINFO(ARCFILE_ATOM&);
@@ -66,9 +66,9 @@ class ARCFILE {
 		ARCFILE* Next(void) { return next; }
 		void Init(void);
 		virtual ~ARCFILE();
-		/* �ե����븡�� */
+		/* ファイル検索 */
 		class ARCINFO* Find(const char* fname, const char* ext);
-		/* �ե�����ꥹ�Ȥν��� */
+		/* ファイルリストの出力 */
 		int Deal(void) { Init(); return arc_atom.size(); }
 		void ListFiles(FILE* out);
 		void InitList(void);
@@ -88,7 +88,7 @@ class SCN2kFILE : public ARCFILE {
 class CattleyaFILE : public ARCFILE {
 	private:
 		bool is_compress;
-		/* header �� Huffman �ڹ����� */
+		/* header の Huffman 木構築用 */
 		char* bitbuf;
 		char* bitbuf_end;
 		int ltree[0x400];
@@ -129,8 +129,8 @@ class DIRFILE : public ARCFILE {
 	public:
 		DIRFILE(char* fname) : ARCFILE(fname) {}
 		virtual ~DIRFILE() {}
-		FILE* Open(const char* fname); /* FILE* �򳫤� */
-		char* SearchFile(const char* dirname); /* �ե����븡�� */
+		FILE* Open(const char* fname); /* FILE* を開く */
+		char* SearchFile(const char* dirname); /* ファイル検索 */
 };
 
 class ARCINFO_AVG32 : public ARCINFO {
--- a/system/system_config.cc
+++ b/system/system_config.cc
@@ -1,5 +1,5 @@
 /*  system_config.cc
- *      gameexe.ini �ե�������ɤ߹���
+ *      gameexe.ini ファイルの読み込み
  */
 
 /*
@@ -41,16 +41,16 @@ using namespace std;
 # define dprintf(X)
 #endif /* DEBUG_CONFIG */
 
-#define MAXTOKEN 10 /* = �Ƕ��ڤ�줿�ΰ�κ���� */
-#define MAXVARS 32 /* , �Ƕ��ڤ�줿���ͤκ���� */
+#define MAXTOKEN 10 /* = で区切られた領域の最大数 */
+#define MAXVARS 32 /* , で区切られた数値の最大数 */
 
-// ������ե�������ɤ߹���
-/* config �� ʸ���󡢿��󡢤���ʣ��ʤɡ����������ʷ��������ꤦ�� */
-/* ʸ����ȿ���ϰ��̤� AyuSys_Config ���饹�˴ޤ�� */
+// 初期化ファイルの読み込み
+/* config は 文字列、数列、その複合など、いろいろな形式がありうる */
+/* 文字列と数列は一般に AyuSys_Config クラスに含める */
 
 
 /**********************************************************/
-/* �Ȥꤢ�����ϥå�������դ�ʸ���� */
+/* とりあえずハッシュ比較付き文字列 */
 class HashStr {
 	const char* str;
 	unsigned int hash;
@@ -80,7 +80,7 @@ HashStr::HashStr(const char* s ) {
 	char* new_str = new char[strlen(s)+1];
 	strcpy(new_str, s);
 	str = new_str;
-	/* calc hash... Ŭ�� */
+	/* calc hash... 適当 */
 	int h = strlen(s);
 	while(*s != 0) {
 		h = *s + ((h * (0x9449+*s))>>7);
@@ -101,32 +101,32 @@ HashStr::HashStr(const HashStr& orig) {
 
 /**********************************************************
 **AyuSys_Config_[String | Intlist] :
-** ���������
-**	original : ������
-**	old_data : ���� ClearDiff() �����Ȥ�������
-**	new_data : ClearDiff() �ʹߤ����ꤷ�����Ƥ���¸
-**	�ǡ������ꡧ
-**	Init() : ����������
-**	Set() : ������ѹ�
-**	Get() : �Ǥ⿷�������������
+** 設定の本体
+**	original : 元設定
+**	old_data : 前回 ClearDiff() したときの設定
+**	new_data : ClearDiff() 以降に設定した内容を保存
+**	データ設定:
+**	Init() : 元設定を作成
+**	Set() : 設定を変更
+**	Get() : 最も新しい設定を得る
 **
-**	�ѹ��ε�Ͽ��
-**	Diff() : �����ClearDiff() �����ѹ��������Ƥ�����
-**	DiffLen() : Diff() ��ɬ�פ�ʸ����Ĺ������
-**	ClearDiff() : �ѹ���Ͽ��ä�
-**	PatchOld() : Diff() ��������Ͽ�˴�Ť����ѹ����ξ��֤��᤹
-**	PatchNew() : Diff() ��������Ͽ�˴�Ť����ѹ���ξ��֤��᤹
+**	変更の記録:
+**	Diff() : 前回のClearDiff() から変更した内容を得る
+**	DiffLen() : Diff() で必要な文字列長を得る
+**	ClearDiff() : 変更記録を消す
+**	PatchOld() : Diff() で得た記録に基づき、変更前の状態に戻す
+**	PatchNew() : Diff() で得た記録に基づき、変更後の状態に戻す
 **
-**	�����꤫����ѹ��ε�Ͽ��
-**	SetOriginal() : ��������᤹
-**	DiffOriginal() : �����꤫�鸽�ߤ�������ѹ�������
-**	DiffOriginalLen() : DiffOriginal() ��ɬ�פ�ʸ����Ĺ������
-**	PatchOriginal() : DiffOriginal() ��������Ͽ�˴�Ť�����������줹��
+**	元設定からの変更の記録:
+**	SetOriginal() : 元設定に戻す
+**	DiffOriginal() : 元設定から現在の設定の変更を得る
+**	DiffOriginalLen() : DiffOriginal() で必要な文字列長を得る
+**	PatchOriginal() : DiffOriginal() で得た記録に基づき、設定を復旧する
 */
 
 /************************************************
 ** AyuSysConfigStringItem
-** ʸ�����ǡ����Ȥ��Ƥ���������
+** 文字列をデータとしてもつ設定項目
 */
 class AyuSysConfigStringItem {
 	char* original_data;
@@ -160,22 +160,22 @@ public:
 			strcpy(new_data, o.new_data);
 		}
 	}
-	/* ���ꡧInit �ǽ������Set ���ѹ���Get ���ѹ���ͥ�褷�Ƽ��Ф� */
-	void Init(int deal, const char* str) { /* deal ��̵�� */
+	/* 設定:Init で初期化、Set で変更、Get で変更を優先して取り出す */
+	void Init(int deal, const char* str) { /* deal は無視 */
 		if (original_data) delete[] original_data;
 		int len = strlen(str);
 		original_data = new char[len+1];
 		strcpy(original_data, str);
 		original_data[len] = '\0';
 	}
-	void Set(int deal, const char* str) { /* deal ��̵�� */
+	void Set(int deal, const char* str) { /* deal は無視 */
 		if (new_data) delete[] new_data;
 		int len = strlen(str);
 		new_data = new char[len+1];
 		strcpy(new_data, str);
 		new_data[len] = '\0';
 	}
-	const char* Get(int deal) const {/* deal ��̵�� */
+	const char* Get(int deal) const {/* deal は無視 */
 		if (new_data) return new_data;
 		else if (old_data) return old_data;
 		return original_data;
@@ -186,16 +186,16 @@ public:
 	int Deal(void) const {
 		return 1;
 	}
-	/* ���ꥸ�ʥ뤫����Ѳ���Ĵ�� :
-	** DiffOriginal ���Ѳ���ʸ����Ǽ��Ф���PatchOriginal ��
-	** �Ѳ���ȿ��
+	/* オリジナルからの変化の調査 :
+	** DiffOriginal で変化を文字列で取り出し、PatchOriginal で
+	** 変化を反映
 	*/
 	int DiffOriginalLen(void) {
 		if (new_data == NULL) return 0;
 		return strlen(new_data)+1;
 	}
 	void DiffOriginal(string& data) {
-		if (new_data == NULL) { /* �������ʤ� */
+		if (new_data == NULL) { /* あり得ない */
 			fprintf(stderr,"AyuSysConfigStringItem::DiffOriginal : this method must not called if not required!\n");
 			return;
 		}
@@ -263,7 +263,7 @@ public:
 
 /************************************************
 ** AyuSysConfigIntlistItem
-** �������ǡ����Ȥ��Ƥ���������
+** 数値列をデータとしてもつ設定項目
 */
 class AyuSysConfigIntlistItem {
 	int item_deal;
@@ -300,8 +300,8 @@ public:
 			memcpy(new_data, o.new_data, sizeof(int)*item_deal);
 		}
 	}
-	/* ���ꡧInit �ǽ������Set ���ѹ���Get ���ѹ���ͥ�褷�Ƽ��Ф� */
-	void Init(int deal, const int* list) { /* deal ��̵�� */
+	/* 設定:Init で初期化、Set で変更、Get で変更を優先して取り出す */
+	void Init(int deal, const int* list) { /* deal は無視 */
 		if (original_data) delete[] original_data;
 		original_data = NULL;
 		if (deal <= 0) {
@@ -311,13 +311,13 @@ public:
 		original_data = new int[item_deal];
 		memcpy(original_data, list, sizeof(int)*deal);
 	}
-	void Set(int deal, const int* list) { /* deal ��̵�� */
+	void Set(int deal, const int* list) { /* deal は無視 */
 		item_deal = deal;
 		if (new_data) delete[] new_data;
 		new_data = new int[item_deal];
 		memcpy(new_data, list, sizeof(int)*item_deal);
 	}
-	const int* Get(int deal) const {/* deal ��̵�� */
+	const int* Get(int deal) const {/* deal は無視 */
 		if (item_deal == 0) return NULL;
 		if (deal > item_deal) {
 			fprintf(stderr,"AyuSysConfigIntlistItem::Get : invalid items deal %d (correct: %d)\n",deal,item_deal);
@@ -327,7 +327,7 @@ public:
 		else if (old_data) return old_data;
 		return original_data;
 	}
-	const int* GetOriginal(int deal) const {/* deal ��̵�� */
+	const int* GetOriginal(int deal) const {/* deal は無視 */
 		if (item_deal == 0) return NULL;
 		if (deal > item_deal) {
 			fprintf(stderr,"AyuSysConfigIntlistItem::Get : invalid items deal %d (correct: %d)\n",deal,item_deal);
@@ -338,16 +338,16 @@ public:
 	int Deal(void) const {
 		return item_deal;
 	}
-	/* ���ꥸ�ʥ뤫����Ѳ���Ĵ�� :
-	** DiffOriginal ���Ѳ���ʸ����Ǽ��Ф���PatchOriginal ��
-	** �Ѳ���ȿ��
+	/* オリジナルからの変化の調査 :
+	** DiffOriginal で変化を文字列で取り出し、PatchOriginal で
+	** 変化を反映
 	*/
 	int DiffOriginalLen(void) {
 		if (new_data == NULL) return 0;
 		return  12 * item_deal + 1;
 	}
 	void DiffOriginal(string& data) {
-		if (new_data == NULL) { /* �������ʤ� */
+		if (new_data == NULL) { /* あり得ない */
 			fprintf(stderr,"AyuSysConfigStringItem::DiffOriginal : this method must not called if not required!\n");
 			return;
 		}
@@ -409,8 +409,8 @@ public:
 
 /************************************************
 ** AyuSysConfigItem
-** �ǡ���̾ -> �ǡ������Τ� map �ȡ�map ���Τ�
-** �͡�������Ԥ�����Υ᥽�å�
+** データ名 -> データ本体の map と、map 全体に
+** 様々な操作を行うためのメソッド
 */
 
 template<class ItemType, class DataType> class AyuSysConfigItem {
@@ -420,22 +420,22 @@ template<class ItemType, class DataType>
 	maptype data;
 public:
 	void SetOrig(HashStr& name, int deal, const DataType* str) {
-		if (str == NULL) return; /* ̵�� */
+		if (str == NULL) return; /* 無効 */
 		data[name].Init(deal, str);
 	}
 	void Set(HashStr& name, int deal, const DataType* new_data) {
-		if (new_data == NULL) return; /* ̵�� */
-		/* ����򸡺� */
+		if (new_data == NULL) return; /* 無効 */
+		/* 設定を検索 */
 		mapiterator it = data.find(name);
-		/* ���꤬������˸��Ĥ���ʤ��ʤ鼺�� */
+		/* 設定が元設定に見つからないなら失敗 */
 		if (it == data.end()) {
 			fprintf(stderr,"AyuSysConfigItem::Set : there is no '%s' parameter\n",name.c_str());
 			return;
 		}
-		/* ������ѹ� */
+		/* 設定を変更 */
 		it->second.Set(deal, new_data);
 	}
-	/* �����������ͥ�褷���֤� */
+	/* 新しい設定を優先して返す */
 	const DataType* Get(int deal, HashStr& name) const {
 		const_mapiterator it = data.find(name);
 		if (it == data.end()) return NULL;
@@ -451,9 +451,9 @@ public:
 		if (it == data.end()) return NULL;
 		return it->second.Deal();
 	}
-	/* ���ꥸ�ʥ뤫����Ѳ���Ĵ�� :
-	** DiffOriginal ���Ѳ���ʸ����Ǽ��Ф���PatchOriginal ��
-	** �Ѳ���ȿ��
+	/* オリジナルからの変化の調査 :
+	** DiffOriginal で変化を文字列で取り出し、PatchOriginal で
+	** 変化を反映
 	*/
 	void DiffOriginal(string& ret_str) {
 		mapiterator it = data.begin();
@@ -510,7 +510,7 @@ public:
 // template AyuSysConfigItem<AyuSysConfigIntlistItem, int>;
 
 /************************************************/
-/* ��å� */
+/* ラッパ */
 struct AyuSysConfigString {
 	AyuSysConfigItem<AyuSysConfigStringItem,char> orig;
 	void Dump(FILE* f) const {
@@ -527,12 +527,12 @@ struct AyuSysConfigIntlist {
 };
 
 /************************************************/
-/* AyuSysConfig ���饹 */
+/* AyuSysConfig クラス */
 int AyuSysConfig::SearchParam(const char* name) const{
 	HashStr str(name);
-	if (str_config->orig.Get(1, str)) return 1; /* char* �Υѥ�᡼�� */
-	else if (int_config->orig.Get(1, str)) return 2; /* int �Υѥ�᡼�� */
-	/* XXX.015.XXX ����Υ���̾�� XXX.000.XXX �η��˵��ʲ����ƺƸ��� */
+	if (str_config->orig.Get(1, str)) return 1; /* char* のパラメータ */
+	else if (int_config->orig.Get(1, str)) return 2; /* int のパラメータ */
+	/* XXX.015.XXX の類のキー名を XXX.000.XXX の形に規格化して再検索 */
 	char name_copy[1024];
 	strncpy(name_copy, name, 1000);
 	name_copy[1000] = 0;
@@ -544,8 +544,8 @@ int AyuSysConfig::SearchParam(const char
 		s++;
 	}
 	HashStr str2(name_copy);
-	if (str_config->orig.Get(1, str2)) return 1; /* char* �Υѥ�᡼�� */
-	else if (int_config->orig.Get(1, str2)) return 2; /* int �Υѥ�᡼�� */
+	if (str_config->orig.Get(1, str2)) return 1; /* char* のパラメータ */
+	else if (int_config->orig.Get(1, str2)) return 2; /* int のパラメータ */
 	else return 0;
 }
 const char* AyuSysConfig::GetParaStr(const char* name) const{
@@ -652,7 +652,7 @@ void AyuSysConfig::SetOrigParamArray(con
 	int_config->orig.SetOrig(str, deal, array);
 }
 void AyuSysConfig::SetOriginal(void) {
-	/* ���Ƥ�����򸵤��᤹ */
+	/* 全ての設定を元に戻す */
 	str_config->orig.SetOriginal();
 	int_config->orig.SetOriginal();
 	change_flag = 1;
@@ -674,8 +674,8 @@ void AyuSysConfig::Dump(FILE* f) const {
 }
 
 /************************************************
-** AyuSysConfig �Υ��󥹥ȥ饯����
-** ���Ƥ� config ���ܤ���������
+** AyuSysConfig のコンストラクタ:
+** 全ての config 項目を初期化する
 */
 
 AyuSysConfig * AyuSysConfig::_singleton = NULL;
@@ -703,24 +703,24 @@ AyuSysConfig::AyuSysConfig(void) {
 	str_config = new AyuSysConfigString;
 	int_config = new AyuSysConfigIntlist;
 
-	/****** ʸ���� *******/
-	SetOrigParaStr("#WAKUPDT", "GRDAT");	/* �ȡ��ޥ�����������ʤɤβ����ե����� */
-	SetOrigParaStr("#REGNAME", "xclannad");	/* �쥸���ȥ�̾�������֥ե�����κ����˻Ȥ� */
-	SetOrigParaStr("#CAPTION", "xclannad");	/* ������ɥ��Υ����ȥ� */
-	SetOrigParaStr("#SAVENAME","SAVE.INI");	/* �����֥ե������̾�� */
-	SetOrigParaStr("#SAVETITLE", "This is save file"); /* �����֥ե��������Ƭ��ʸ���� */
-	SetOrigParaStr("#SAVENOTITLE", "-----------------"); /* �Ȥ��Ƥʤ������֥ǡ�����̾�� */
-	SetOrigParaStr("#CGM_FILE", "MODE.CGM");/* CG mode �����꤬��¸���줿�ե�����̾ */
-	SetOrigParaStr("#CGTABLE_FILE", "MODE.CGM");/* CG mode �����꤬��¸���줿�ե�����̾ */
+	/****** 文字列 *******/
+	SetOrigParaStr("#WAKUPDT", "GRDAT");	/* 枠、マウスカーソルなどの画像ファイル */
+	SetOrigParaStr("#REGNAME", "xclannad");	/* レジストリ名。セーブファイルの作成に使う */
+	SetOrigParaStr("#CAPTION", "xclannad");	/* ウィンドウのタイトル */
+	SetOrigParaStr("#SAVENAME","SAVE.INI");	/* セーブファイルの名前 */
+	SetOrigParaStr("#SAVETITLE", "This is save file"); /* セーブファイルの先頭の文字列 */
+	SetOrigParaStr("#SAVENOTITLE", "-----------------"); /* 使われてないセーブデータの名前 */
+	SetOrigParaStr("#CGM_FILE", "MODE.CGM");/* CG mode の設定が保存されたファイル名 */
+	SetOrigParaStr("#CGTABLE_FILE", "MODE.CGM");/* CG mode の設定が保存されたファイル名 */
 
-	SetOrigParaStr("#WAKU.000.000.NAME", ""); // �ƥ����ȥ�����ɥ�����������̾
-	SetOrigParaStr("#WAKU.000.000.BACK", ""); // �ƥ����ȥ�����ɥ��Υƥ������طʲ���̾
-	SetOrigParaStr("#WAKU.000.000.BTN", ""); // �ƥ����ȥ�����ɥ��Υܥ������̾
+	SetOrigParaStr("#WAKU.000.000.NAME", ""); // テキストウィンドウの窓飾り画像名
+	SetOrigParaStr("#WAKU.000.000.BACK", ""); // テキストウィンドウのテキスト背景画像名
+	SetOrigParaStr("#WAKU.000.000.BTN", ""); // テキストウィンドウのボタン画像名
 
-	SetOrigParaStr("#MOUSE_CURSOR.000.NAME", ""); // �ޥ�����������Υե�����̾
-	SetOrigParaStr("#CURSOR.000.NAME", ""); // �꥿���󥫡�����Υե�����̾
-	SetOrigParaStr("#SELBTN.000.NAME", ""); // ������ط�
-	SetOrigParaStr("#SELBTN.000.BACK", ""); // ������ط�
+	SetOrigParaStr("#MOUSE_CURSOR.000.NAME", ""); // マウスカーソルのファイル名
+	SetOrigParaStr("#CURSOR.000.NAME", ""); // リターンカーソルのファイル名
+	SetOrigParaStr("#SELBTN.000.NAME", ""); // 選択肢背景
+	SetOrigParaStr("#SELBTN.000.BACK", ""); // 選択肢背景
 
 	char name_str[8] = "#NAME.A";
 	for (i='A'; i<='Z'; i++) {
@@ -728,109 +728,109 @@ AyuSysConfig::AyuSysConfig(void) {
 		SetOrigParaStr(name_str, "");
 	}
 
-	/****** ������ *******/
-	SetOrigParam("#CANCELCALL", 2, 0,0); /* ����󥻥�ܥ���(������å�)�����Ȥ��˸ƤӽФ���륵�֥롼�����ֹ�(��˥塼) */
-	SetOrigParam("#COM2_TITLE", 1, 1); /* �� */
-	SetOrigParam("#COM2_TITLE_COLOR", 1, 2); /* ����西���ȥ�ο� */
-	SetOrigParam("#COM2_TITLE_INDENT", 1, 2); /* �� */
-	SetOrigParam("#SAVEFILETIME", 1, 24); /* �����֤�����ο� */
-	SetOrigParam("#SEEN_START", 1, 0); /* ������򳫻Ϥ��륷�ʥꥪ�ֹ� */
-	SetOrigParam("#SEEN_SRT", 1, 0); /* ������򳫻Ϥ��륷�ʥꥪ�ֹ�(���������繥��) */
-	SetOrigParam("#SEEN_MENU",  1, 0); /* ��˥塼�Υ��ʥꥪ�ֹ� */
-	SetOrigParam("#SEEN_TEXT_CURRENT",  1, 0); /* seen.txt �� root directory ���֤��� */
-	SetOrigParam("#FADE_TIME", 1, 40); /* ���̤Υե����ɡ������Ȥ�®�� */
-	SetOrigParam("#NVL_SYSTEM",1, 0); /* �ƥ����ȥ�����ɥ��������̤��ݤ� */
-	SetOrigParam("#WINDOW_ATTR", 5, -1, 128,128, 190, 0); /* �ƥ����ȥ�����ɥ��ο� */
-	SetOrigParam("#WINDOW_ATTR_AREA", 4, 4,4,4,4); /* �ƥ����ȥ�����ɥ����ϰ� */
-	SetOrigParam("#WINDOW_ATTR_TYPE", 1, 0); /* �ƥ����ȥ�����ɥ���ȾƩ���ˤ��뤫 */
-	SetOrigParam("#WINDOW_MSG_POS", 2, 22, 350); /* �ƥ����ȥ�����ɥ��ΰ��� */
-	SetOrigParam("#WINDOW_COM_POS", 2,450, 250); /* ���򥦥���ɥ��ΰ��� */
-	SetOrigParam("#WINDOW_GRP_POS", 2, 16, 100); /* �ʤˤ��Υ�����ɥ��ΰ��� */
-	SetOrigParam("#WINDOW_SUB_POS", 2, 48, 100); /* �ʤˤ��Υ�����ɥ��ΰ��� */
-	SetOrigParam("#WINDOW_SYS_POS", 2, 32, 100); /* �ʤˤ��Υ�����ɥ��ΰ��� */
-	SetOrigParam("#WINDOW_WAKU_TYPE", 1, 0); /* �ƥ����ȥ�����ɥ����Ȥμ��ࡣxkanon �ȼ����� */
-	SetOrigParam("#RETN_CONT", 1, 16); /* �꥿���󥫡�����ο� */
-	SetOrigParam("#RETN_SPEED",1,100); /* �꥿���󥫡������ư��®�� */
-	SetOrigParam("#RETN_XSIZE", 1, 16); /* �꥿���󥫡�������礭�� */
-	SetOrigParam("#RETN_YSIZE", 1, 16); /* �꥿���󥫡�������礭�� */
-	SetOrigParam("#FONT_SIZE", 1, 26); /* �ե���Ȥ��礭�� */
-	SetOrigParam("#FONT_WEIGHT", 1, 100); /* �ե���Ȥ� weight */
-	SetOrigParam("#MSG_MOJI_SIZE", 2, 12, 29); /* ʸ�����礭��(Ⱦ��) */
-	SetOrigParam("#MESSAGE_SIZE", 2, 23, 3); /* ��å�����������ɥ���ʸ���� */
-	SetOrigParam("#COM_MESSAGE_SIZE", 2, 23, 3); /* ��å�����������ɥ���ʸ���� */
-	SetOrigParam("#INIT_MESSAGE_SPEED", 1, 30); /* �ƥ�����ɽ��®�� */
-	SetOrigParam("#INIT_MESSAGE_SPEED_MOD", 1, 0); /* �ƥ�����ɽ�� no wait */
-	SetOrigParam("#MESSAGE_KEY_WAIT_USE", 1, 0); /* �ƥ����ȿʹԥ����ȥ⡼�� */
-	SetOrigParam("#MESSAGE_KEY_WAIT_TIME", 1, 1500); /* �����ȥ⡼�ɤǤΥ����Ԥ����� */
+	/****** 数値列 *******/
+	SetOrigParam("#CANCELCALL", 2, 0,0); /* キャンセルボタン(右クリック)したときに呼び出されるサブルーチン番号(メニュー) */
+	SetOrigParam("#COM2_TITLE", 1, 1); /* ? */
+	SetOrigParam("#COM2_TITLE_COLOR", 1, 2); /* 選択肢タイトルの色 */
+	SetOrigParam("#COM2_TITLE_INDENT", 1, 2); /* ? */
+	SetOrigParam("#SAVEFILETIME", 1, 24); /* セーブする場所の数 */
+	SetOrigParam("#SEEN_START", 1, 0); /* ゲームを開始するシナリオ番号 */
+	SetOrigParam("#SEEN_SRT", 1, 0); /* ゲームを開始するシナリオ番号(好き好き大好き) */
+	SetOrigParam("#SEEN_MENU",  1, 0); /* メニューのシナリオ番号 */
+	SetOrigParam("#SEEN_TEXT_CURRENT",  1, 0); /* seen.txt を root directory に置くか */
+	SetOrigParam("#FADE_TIME", 1, 40); /* 画面のフェード・アウトの速度 */
+	SetOrigParam("#NVL_SYSTEM",1, 0); /* テキストウィンドウが全画面か否か */
+	SetOrigParam("#WINDOW_ATTR", 5, -1, 128,128, 190, 0); /* テキストウィンドウの色 */
+	SetOrigParam("#WINDOW_ATTR_AREA", 4, 4,4,4,4); /* テキストウィンドウの範囲 */
+	SetOrigParam("#WINDOW_ATTR_TYPE", 1, 0); /* テキストウィンドウを半透明にするか */
+	SetOrigParam("#WINDOW_MSG_POS", 2, 22, 350); /* テキストウィンドウの位置 */
+	SetOrigParam("#WINDOW_COM_POS", 2,450, 250); /* 選択ウィンドウの位置 */
+	SetOrigParam("#WINDOW_GRP_POS", 2, 16, 100); /* なにかのウィンドウの位置 */
+	SetOrigParam("#WINDOW_SUB_POS", 2, 48, 100); /* なにかのウィンドウの位置 */
+	SetOrigParam("#WINDOW_SYS_POS", 2, 32, 100); /* なにかのウィンドウの位置 */
+	SetOrigParam("#WINDOW_WAKU_TYPE", 1, 0); /* テキストウィンドウの枠の種類。xkanon 独自設定 */
+	SetOrigParam("#RETN_CONT", 1, 16); /* リターンカーソルの数 */
+	SetOrigParam("#RETN_SPEED",1,100); /* リターンカーソルの動く速度 */
+	SetOrigParam("#RETN_XSIZE", 1, 16); /* リターンカーソルの大きさ */
+	SetOrigParam("#RETN_YSIZE", 1, 16); /* リターンカーソルの大きさ */
+	SetOrigParam("#FONT_SIZE", 1, 26); /* フォントの大きさ */
+	SetOrigParam("#FONT_WEIGHT", 1, 100); /* フォントの weight */
+	SetOrigParam("#MSG_MOJI_SIZE", 2, 12, 29); /* 文字の大きさ(半角) */
+	SetOrigParam("#MESSAGE_SIZE", 2, 23, 3); /* メッセージウィンドウの文字数 */
+	SetOrigParam("#COM_MESSAGE_SIZE", 2, 23, 3); /* メッセージウィンドウの文字数 */
+	SetOrigParam("#INIT_MESSAGE_SPEED", 1, 30); /* テキスト表示速度 */
+	SetOrigParam("#INIT_MESSAGE_SPEED_MOD", 1, 0); /* テキスト表示 no wait */
+	SetOrigParam("#MESSAGE_KEY_WAIT_USE", 1, 0); /* テキスト進行オートモード */
+	SetOrigParam("#MESSAGE_KEY_WAIT_TIME", 1, 1500); /* オートモードでのキー待ち時間 */
 
-	SetOrigParam("#GRP_DC_TIMES", 1, 4); /* ΢���̤ο� */
-	SetOrigParam("#MUSIC_LINEAR_PAC",1,0); /* PCM �ǡ����� 8bit -> 16bit �Ѵ���Ԥ��� */
-	SetOrigParam("#MUSIC_TYPE",1,0); /* PCM �ǡ����μ��� */
-	SetOrigParam("#WINDOW_MSGBK_BOX",1,0); /* �Хå������ѤΥܥ��� */
-	SetOrigParam("#WINDOW_MSGBK_LBOX_POS",4,15,7,8,0); /* �Хå������ѤΥܥ���(��)�ΰ��� */
-	SetOrigParam("#WINDOW_MSGBK_RBOX_POS",4,7,7,0,0); /* �Хå������ѤΥܥ���(��)�ΰ��� */
-	SetOrigParam("#MSGBK_MOD",1,0); /* �Хå������ѤΥܥ������Ѥ��뤫 */
+	SetOrigParam("#GRP_DC_TIMES", 1, 4); /* 裏画面の数 */
+	SetOrigParam("#MUSIC_LINEAR_PAC",1,0); /* PCM データの 8bit -> 16bit 変換を行うか */
+	SetOrigParam("#MUSIC_TYPE",1,0); /* PCM データの種類 */
+	SetOrigParam("#WINDOW_MSGBK_BOX",1,0); /* バックログ用のボタン */
+	SetOrigParam("#WINDOW_MSGBK_LBOX_POS",4,15,7,8,0); /* バックログ用のボタン(左)の位置 */
+	SetOrigParam("#WINDOW_MSGBK_RBOX_POS",4,7,7,0,0); /* バックログ用のボタン(左)の位置 */
+	SetOrigParam("#MSGBK_MOD",1,0); /* バックログ用のボタンを使用するか */
 
 	SetOrigParam("#WAKU.000.000.TYPE", 1, 5);
-	SetOrigParam("#WAKU.000.000.MOVE_BOX", 5, 0, 0, 0, 0, 0); // �ƥ����ȥ�����ɥ��ΰ�ư�ѥܥ������
-	SetOrigParam("#WAKU.000.000.CLEAR_BOX", 5, 0, 0, 0, 0, 0); //    ����õ��ѥܥ������
-	SetOrigParam("#WAKU.000.000.READJUMP_BOX", 5, 0, 0, 0, 0, 0); // �����å��ѥܥ������
-	SetOrigParam("#WAKU.000.000.AUTOMODE_BOX", 5, 0, 0, 0, 0, 0); // �������ѥܥ������
-	SetOrigParam("#WAKU.000.000.MSGBK_BOX", 5, 0, 0, 0, 0, 0); // �Хå������ܥ������
-	SetOrigParam("#WAKU.000.000.MSGBKLEFT_BOX", 5, 0, 0, 0, 0, 0); // �Хå������ʿʤ��˥ܥ������
-	SetOrigParam("#WAKU.000.000.MSGBKRIGHT_BOX", 5, 0, 0, 0, 0, 0); // �Хå����������˥ܥ������
-	SetOrigParam("#WAKU.000.000.EXBTN_000_BOX", 5, 0, 0, 0, 0, 0); // ����¾�ܥ��󣰰���
-	SetOrigParam("#WAKU.000.000.EXBTN_001_BOX", 5, 0, 0, 0, 0, 0); // ����¾�ܥ��󣱰���
-	SetOrigParam("#WAKU.000.000.EXBTN_002_BOX", 5, 0, 0, 0, 0, 0); // ����¾�ܥ��󣲰���
+	SetOrigParam("#WAKU.000.000.MOVE_BOX", 5, 0, 0, 0, 0, 0); // テキストウィンドウの移動用ボタン位置
+	SetOrigParam("#WAKU.000.000.CLEAR_BOX", 5, 0, 0, 0, 0, 0); //    一時消去用ボタン位置
+	SetOrigParam("#WAKU.000.000.READJUMP_BOX", 5, 0, 0, 0, 0, 0); // スキップ用ボタン位置
+	SetOrigParam("#WAKU.000.000.AUTOMODE_BOX", 5, 0, 0, 0, 0, 0); // オート用ボタン位置
+	SetOrigParam("#WAKU.000.000.MSGBK_BOX", 5, 0, 0, 0, 0, 0); // バックログボタン位置
+	SetOrigParam("#WAKU.000.000.MSGBKLEFT_BOX", 5, 0, 0, 0, 0, 0); // バックログ(進める)ボタン位置
+	SetOrigParam("#WAKU.000.000.MSGBKRIGHT_BOX", 5, 0, 0, 0, 0, 0); // バックログ(戻る)ボタン位置
+	SetOrigParam("#WAKU.000.000.EXBTN_000_BOX", 5, 0, 0, 0, 0, 0); // その他ボタン0位置
+	SetOrigParam("#WAKU.000.000.EXBTN_001_BOX", 5, 0, 0, 0, 0, 0); // その他ボタン1位置
+	SetOrigParam("#WAKU.000.000.EXBTN_002_BOX", 5, 0, 0, 0, 0, 0); // その他ボタン2位置
 
-	SetOrigParam("#WINDOW.000.MOJI_SIZE", 1, 21); // ʸ��������
-	SetOrigParam("#WINDOW.000.MOJI_REP", 2, -1, 2); // ʸ����;͵
-	SetOrigParam("#WINDOW.000.MOJI_CNT", 2, 20, 3); // ������ɥ����ʸ����
-	SetOrigParam("#WINDOW.000.MOJI_POS", 4, 100, 0, 180, 40); // �ƥ����Ȱ��֡�3���ܤ�x ��1���ܤ�y�餷��
-	SetOrigParam("#WINDOW.000.MOJI_SHADOW", 1, 0); // ʸ���˱Ƥ��դ��뤫
-	SetOrigParam("#WINDOW.000.LUBY_SIZE", 1, 8); // ��Ӥ�ʸ��������
-	SetOrigParam("#WINDOW.000.MOJI_MIN", 2, 8, 1); // ʸ��Ʊ�Τη�֡�
-	SetOrigParam("#WINDOW.000.SELCOM_USE", 1, 0); // �����μ�����ˡ
-	SetOrigParam("#WINDOW.000.POS", 4, 100, 0, 0, 260); // ������ɥ�����
-	SetOrigParam("#WINDOW.000.ATTR_MOD", 1, 0); // ������ɥ���
-	SetOrigParam("#WINDOW.000.ATTR", 5, -1, -1, -1, -1, -1); // ������ɥ���
-	/* SELCOM �Ϥ褯�狼���Τ�̵�� */
-	SetOrigParam("#WINDOW.000.OPEN_ANM_MOD", 1, 0); // ������ɥ��򳫤��Ȥ��θ��̤餷��
+	SetOrigParam("#WINDOW.000.MOJI_SIZE", 1, 21); // 文字サイズ
+	SetOrigParam("#WINDOW.000.MOJI_REP", 2, -1, 2); // 文字の余裕
+	SetOrigParam("#WINDOW.000.MOJI_CNT", 2, 20, 3); // ウィンドウ内の文字数
+	SetOrigParam("#WINDOW.000.MOJI_POS", 4, 100, 0, 180, 40); // テキスト位置。3つ目がx で1つ目がyらしい
+	SetOrigParam("#WINDOW.000.MOJI_SHADOW", 1, 0); // 文字に影を付けるか
+	SetOrigParam("#WINDOW.000.LUBY_SIZE", 1, 8); // ルビの文字サイズ
+	SetOrigParam("#WINDOW.000.MOJI_MIN", 2, 8, 1); // 文字同士の隙間?
+	SetOrigParam("#WINDOW.000.SELCOM_USE", 1, 0); // 選択肢の実装方法
+	SetOrigParam("#WINDOW.000.POS", 4, 100, 0, 0, 260); // ウィンドウ位置
+	SetOrigParam("#WINDOW.000.ATTR_MOD", 1, 0); // ウィンドウ色
+	SetOrigParam("#WINDOW.000.ATTR", 5, -1, -1, -1, -1, -1); // ウィンドウ色
+	/* SELCOM はよくわからんので無視 */
+	SetOrigParam("#WINDOW.000.OPEN_ANM_MOD", 1, 0); // ウィンドウを開くときの効果らしい
 	SetOrigParam("#WINDOW.000.OPEN_ANM_TIME", 1, 500);
-	SetOrigParam("#WINDOW.000.CLOSE_ANM_MOD", 1, 0); // ������ɥ����Ĥ���Ȥ��θ��̤餷��
+	SetOrigParam("#WINDOW.000.CLOSE_ANM_MOD", 1, 0); // ウィンドウを閉じるときの効果らしい
 	SetOrigParam("#WINDOW.000.CLOSE_ANM_TIME", 1, 500);
-	SetOrigParam("#WINDOW.000.WAKU_SETNO", 1, 0); // �Ȥμ���
-	SetOrigParam("#WINDOW.000.MOVE_USE", 1, 0); // ������ɥ��Ȱ�ư�ܥ�����Ѥβ���
-	SetOrigParam("#WINDOW.000.CLEAR_USE", 1, 0); // ������ɥ��Ⱦõ�ܥ�����Ѥβ���
-	SetOrigParam("#WINDOW.000.READJUMP_USE", 1, 0); // �����åץܥ�����Ѥβ���
-	SetOrigParam("#WINDOW.000.AUTOMODE_USE", 1, 0); // �����åץܥ�����Ѥβ���
-	SetOrigParam("#WINDOW.000.MSGBK_USE", 1, 0); // �Хå������ܥ�����Ѥβ���
-	SetOrigParam("#WINDOW.000.MSGBKLEFT_USE", 1, 0); // �Хå������ʿʤ�˥ܥ�����Ѥβ���
-	SetOrigParam("#WINDOW.000.MSGBKRIGHT_USE", 1, 0); // �Хå����������˥ܥ�����Ѥβ���
-	SetOrigParam("#WINDOW.000.EXBTN_000_USE", 1, 0); // ����¾�ܥ��󣰻��Ѥβ���
-	SetOrigParam("#WINDOW.000.EXBTN_001_USE", 1, 0); // ����¾�ܥ��󣱻��Ѥβ���
-	SetOrigParam("#WINDOW.000.EXBTN_002_USE", 1, 0); // ����¾�ܥ��󣲻��Ѥβ���
-	SetOrigParam("#WINDOW.000.NAME_MOD", 1, 0); // ̾��������ɥ������ӻ��Ѥ��뤫
-	SetOrigParam("#WINDOW.000.NAME_MOJI_SIZE", 1, 20); // ̾���ե���ȤΥ�����
-	SetOrigParam("#WINDOW.000.NAME_MOJI_POS", 2, 0, 0); // ̾��������ɥ���ʸ���ΰ���
-	SetOrigParam("#WINDOW.000.NAME_MOJI_MIN", 1, 0); // ̾��������ɥ�����
-	SetOrigParam("#WINDOW.000.NAME_CENTERING", 1, 1); // ̾���Υ��󥿥�󥰤�̵ͭ
-	SetOrigParam("#WINDOW.000.NAME_POS", 2, 159, 78); // ̾��������ɥ����֡ʺ������֤餷����
-	SetOrigParam("#WINDOW.000.NAME_WAKU_SETNO", 1, -1); // ̾��������ɥ����֡ʺ������֤餷����
-	SetOrigParam("#WINDOW.000.FACE.000", 5, 0, 0, 1, 1, 1); // �饦����ɥ�����(�Ϥᣲ�Ĥ�x,y��MOJI_POS��������а��֤ʤΤ�����)
-	SetOrigParam("#WINDOW.000.KEYCUR_MOD", 3, 0, 0, 0); // �꥿���󥫡�����ΰ���
+	SetOrigParam("#WINDOW.000.WAKU_SETNO", 1, 0); // 枠の種類
+	SetOrigParam("#WINDOW.000.MOVE_USE", 1, 0); // ウィンドウ枠移動ボタン使用の可否
+	SetOrigParam("#WINDOW.000.CLEAR_USE", 1, 0); // ウィンドウ枠消去ボタン使用の可否
+	SetOrigParam("#WINDOW.000.READJUMP_USE", 1, 0); // スキップボタン使用の可否
+	SetOrigParam("#WINDOW.000.AUTOMODE_USE", 1, 0); // スキップボタン使用の可否
+	SetOrigParam("#WINDOW.000.MSGBK_USE", 1, 0); // バックログボタン使用の可否
+	SetOrigParam("#WINDOW.000.MSGBKLEFT_USE", 1, 0); // バックログ(進む)ボタン使用の可否
+	SetOrigParam("#WINDOW.000.MSGBKRIGHT_USE", 1, 0); // バックログ(戻る)ボタン使用の可否
+	SetOrigParam("#WINDOW.000.EXBTN_000_USE", 1, 0); // その他ボタン0使用の可否
+	SetOrigParam("#WINDOW.000.EXBTN_001_USE", 1, 0); // その他ボタン1使用の可否
+	SetOrigParam("#WINDOW.000.EXBTN_002_USE", 1, 0); // その他ボタン2使用の可否
+	SetOrigParam("#WINDOW.000.NAME_MOD", 1, 0); // 名前ウィンドウを別途使用するか
+	SetOrigParam("#WINDOW.000.NAME_MOJI_SIZE", 1, 20); // 名前フォントのサイズ
+	SetOrigParam("#WINDOW.000.NAME_MOJI_POS", 2, 0, 0); // 名前ウィンドウの文字の位置
+	SetOrigParam("#WINDOW.000.NAME_MOJI_MIN", 1, 0); // 名前ウィンドウの幅
+	SetOrigParam("#WINDOW.000.NAME_CENTERING", 1, 1); // 名前のセンタリングの有無
+	SetOrigParam("#WINDOW.000.NAME_POS", 2, 159, 78); // 名前ウィンドウ位置(左下位置らしい)
+	SetOrigParam("#WINDOW.000.NAME_WAKU_SETNO", 1, -1); // 名前ウィンドウ位置(左下位置らしい)
+	SetOrigParam("#WINDOW.000.FACE.000", 5, 0, 0, 1, 1, 1); // 顔ウィンドウ位置(始め2つがx,y、MOJI_POSからの相対位置なのに注意)
+	SetOrigParam("#WINDOW.000.KEYCUR_MOD", 3, 0, 0, 0); // リターンカーソルの位置
 
 
-	SetOrigParam("#CURSOR.000.SIZE", 2, 0, 0); // �꥿���󥫡�������礭��
-	SetOrigParam("#CURSOR.000.CONT", 1, 50); // �꥿���󥫡�����η����֤���
-	SetOrigParam("#CURSOR.000.SPEED", 1, 1000); // �֥�󥯤���®��
+	SetOrigParam("#CURSOR.000.SIZE", 2, 0, 0); // リターンカーソルの大きさ
+	SetOrigParam("#CURSOR.000.CONT", 1, 50); // リターンカーソルの繰り返し数
+	SetOrigParam("#CURSOR.000.SPEED", 1, 1000); // ブリンクする速さ
 
 	SetOrigParam("#SELBTN.000.CENTERING", 2, 0, 0);
-	SetOrigParam("#SELBTN.000.BASEPOS", 2, 0, 0); // ����襦����ɥ��ΰ���
-	SetOrigParam("#SELBTN.000.REPPOS", 2, 0, 50); // ����襦����ɥ��μ��ΰ��֡����С�
-	SetOrigParam("#SELBTN.000.MOJISIZE", 4, 26, 0,0,0); // ʸ�����礭��
-	SetOrigParam("#SELBTN.000.MOJIDEFAULTCOL", 1, 0); // ���������ʸ����
-	SetOrigParam("#SELBTN.000.MOJISELECTCOL", 1, 0); // �������ʸ����
+	SetOrigParam("#SELBTN.000.BASEPOS", 2, 0, 0); // 選択肢ウィンドウの位置
+	SetOrigParam("#SELBTN.000.REPPOS", 2, 0, 50); // 選択肢ウィンドウの次の位置(相対)
+	SetOrigParam("#SELBTN.000.MOJISIZE", 4, 26, 0,0,0); // 文字の大きさ
+	SetOrigParam("#SELBTN.000.MOJIDEFAULTCOL", 1, 0); // 非選択時の文字色
+	SetOrigParam("#SELBTN.000.MOJISELECTCOL", 1, 0); // 選択時の文字色
 
 	SetOrigParam("#COLOR_TABLE.000", 3, 255,255,255);
 	SetOrigParam("#SHAKE.000", 3, 0,0,0);
@@ -850,30 +850,30 @@ AyuSysConfig::~AyuSysConfig(void) {
 }
 
 static int SplitVar(const char* str, int* ret_var, int ret_size) {
-	/* , ���뤤�� ),:( �򥻥ѥ졼���Ȥ��ơ�-?[0-9]+ ��
-	** �ե����ޥåȤο�������ɤ߹��ࡣ��Ƭ�� (�������� ) ���դ����롣
-	** (),-[0-9] �ʳ���ʸ�������ä��餽���ǽ�λ
-	** ����줿�ǡ��������֤�
+	/* , あるいは ),:( をセパレータとして、-?[0-9]+ の
+	** フォーマットの数値列を読み込む。先頭に (、末尾に ) が付きうる。
+	** (),-[0-9] 以外の文字があったらそこで終了
+	** 得られたデータ数を返す
 	*/
 	if (*str == '(') str++;
 	int i; for (i=0; i<ret_size; i++) {
 		int c; int is_positive = 1;
-		/* ���ѥ졼�����ɤ����Ф� */
+		/* セパレータの読み飛ばし */
 		c = *str;
 		if (c == ',' || c == ':') {
 			str++;
 		} else if (c == ')' && str[1] == '(') {
 			str += 2;
 		}
-		/* - �� parse */
+		/* - を parse */
 		c = *str;
 		if (c == '-' && isdigit(str[1])) {
 			is_positive = -1; str++;
 		} else if (! isdigit(c)) {
-			return i; /* �۾��ʸ���򸫤Ĥ�������λ */
+			return i; /* 異常な文字を見つけた:終了 */
 		}
 		int number = 0;
-		/* �����ɤ߹��� */
+		/* 数字読み込み */
 		while(isdigit( (c=*str) )) {
 			number *= 10;
 			number += c-'0';
@@ -883,7 +883,7 @@ static int SplitVar(const char* str, int
 	}
 	return i;
 }
-/* ����줿���ΰ��������롣-1 �ʤ饨�顼�������� */
+/* 決められた数の引数を得る。-1 ならエラーが生じた */
 static inline int SplitVar(const char* str, int& var1) {
 	if (SplitVar(str, &var1, 1) != 1) return -1;
 	return 0;
@@ -925,17 +925,17 @@ bool AyuSysConfig::LoadInitFile(void)
 	unsigned char* buf_end = buf_orig + size;
 	int line_count = 0;
 	while(buf_orig < buf_end) {
-		/* buf_orig �������ɤ߹��� */
-		/* ���κݤˡ�
-		** ��Ƭ�� # �ʳ��ʤ鼡�ιԤޤǤȤФ�
-		** ��"" ���Υ��ڡ�����TAB����Ȥ�������ʸ�� (0x20 �ʲ���ASCII������)����
-		** ��= �Ƕ��ڤ롣���ڤ�Ϻ����10�Ĥǡ�tokens �����������
-		** �ʤɤ�����Ԥ�
+		/* buf_orig から一行読み込む */
+		/* その際に、
+		** ・頭が # 以外なら次の行までとばす
+		** ・"" 外のスペース、TABを初めとする制御文字 (0x20 以下のASCIIコード)を削除
+		** ・= で区切る。区切りは最大で10個で、tokens に代入される
+		** などの操作を行う
 		*/
 
-		/* # �����å� */
+		/* # チェック */
 		if (*buf_orig != '#') {
-			/* ���� '\n' �ޤ��ɤ����Ф� */
+			/* 次の '\n' まで読み飛ばし */
 			while(buf_orig < buf_end &&
 				*buf_orig != '\n' && *buf_orig != '\r') buf_orig++;
 			if (buf_orig < buf_end-1 && *buf_orig == '\r' && buf_orig[1] == '\n') buf_orig += 2;
@@ -943,7 +943,7 @@ bool AyuSysConfig::LoadInitFile(void)
 			line_count++;
 			continue;
 		}
-		/* ����� */
+		/* 初期化 */
 		token_deal = 1;
 		tokens[0] = buf;
 		buf_ptr = NULL;
@@ -951,7 +951,7 @@ bool AyuSysConfig::LoadInitFile(void)
 
 		while(buf_orig < buf_end && buf_ptr < 1023) {
 			if (in_quote) {
-				/* "" ���� */
+				/* "" の中 */
 				int c = *buf_orig;
 				if (c == '\n' || c == '\r') {
 					break;
@@ -961,13 +961,13 @@ bool AyuSysConfig::LoadInitFile(void)
 					buf[buf_ptr++] = c;
 				}
 				buf_orig++;
-			} else { /* quote ����Ƥʤ� */
-				/* ����ʸ�����ɤ����Ф� */
+			} else { /* quote されてない */
+				/* 制御文字を読み飛ばす */
 				while(*buf_orig <= 0x20 && buf_orig < buf_end &&
 					*buf_orig != '\n' && *buf_orig != '\r') buf_orig++;
 				int c = *buf_orig;
 				if (c == '\n' || c == '\r') break;
-				/* = �ʤ鼡�� token */
+				/* = なら次の token */
 				if (c == '=') {
 					c = 0;
 					tokens[token_deal++] = buf+buf_ptr+1;
@@ -980,10 +980,10 @@ bool AyuSysConfig::LoadInitFile(void)
 			}
 		}
 		buf[buf_ptr] = '\0';
-		/* ������ \r\n ��õ� */
+		/* 末尾の \r\n を消去 */
 		if (buf_orig < buf_end-1 && buf_orig[0] == '\r' && buf_orig[1] == '\n') buf_orig += 2;
 		else if (buf_orig < buf_end && (buf_orig[0] == '\r' || buf_orig[0] == '\n')) buf_orig++;
-		/* ɬ�פʤ� parse ���Ƥ���� */
+		/* 必要なら parse 内容を出力 */
 		dprintf(("line %3d ",line_count));
 		for (i=0; i<token_deal; i++) {
 			dprintf(("%d:\"%s\", ",i,tokens[i]));
@@ -994,18 +994,18 @@ bool AyuSysConfig::LoadInitFile(void)
 		}
 
 
-		/* ����줿���Ƥ� parse */
+		/* 得られた内容を parse */
 
-		/* #NAME=<ʸ����> */
+		/* #NAME=<文字列> */
 		int type = SearchParam(tokens[0]);
-		if (type == 1) { /* #NAME=<ʸ����> */
+		if (type == 1) { /* #NAME=<文字列> */
 			if (token_deal != 2) {
 				dprintf(("Parse error, line %d, %s\n",line_count, tokens[0]));
 				goto parse_error;
 			}
 			SetOrigParaStr(tokens[0], tokens[1]);
 			goto parse_end;
-		} else if (type == 2) { /* #NAME=<������> */
+		} else if (type == 2) { /* #NAME=<数値列> */
 			if (token_deal != 2) {
 				dprintf(("Parse error, line %d, %s\n",line_count, tokens[0]));
 				goto parse_error;
@@ -1014,14 +1014,14 @@ bool AyuSysConfig::LoadInitFile(void)
 			SetOrigParamArray(tokens[0], number_deal, numbers);
 			goto parse_end;
 		}
-		/* ����Ū������ʳ� : cdrom track �ʤ� */
+		/* 一般的な設定以外 : cdrom track など */
 		if (strncmp(tokens[0],"#NAME.", 6) == 0) {
 			if (token_deal != 2) goto parse_error;
 			SetOrigParaStr(tokens[0], tokens[1]);
 			goto parse_end;
 		} else if (strncmp(tokens[0],"#DIRC.",6) == 0) {
 			if (token_deal != 3) goto parse_error;
-			/* �ե���������λ��� */
+			/* ファイル形式の指定 */
 			FileSearcher::FILETYPE type;
 			char* name = tokens[0]+6;
 			if (strcmp(name, "PDT") == 0) type = FileSearcher::PDT;
@@ -1034,11 +1034,11 @@ bool AyuSysConfig::LoadInitFile(void)
 			else if (strcmp(name, "WAV") == 0) type = FileSearcher::WAV;
 			else if (strcmp(name, "KOE") == 0) type = FileSearcher::KOE;
 			else if (strcmp(name, "GAN") == 0) type = FileSearcher::GAN;
-			else goto parse_error; /* ¾�� ALL,ROOT,MID,KOE,BGM�����֤�¸�ߤ��ʤ� */
+			else goto parse_error; /* 他に ALL,ROOT,MID,KOE,BGM。たぶん、存在しない */
 			if (tokens[2][0] == 'N') { /* directory */
 				file_searcher->SetFileInformation(type, FileSearcher::ATYPE_DIR, tokens[1]);
 				dprintf(("set file directory; type %s, directory %s\n",name,tokens[1]));
-			} else if (tokens[2][0] == 'P' && tokens[2][1] == ':') { /* ���������� */
+			} else if (tokens[2][0] == 'P' && tokens[2][1] == ':') { /* アーカイブ */
 				file_searcher->SetFileInformation(type, FileSearcher::ATYPE_ARC, tokens[2]+2);
 				dprintf(("set file archive; type %s, file %s\n",name,tokens[2]+2));
 			} else goto parse_error;
@@ -1046,7 +1046,7 @@ bool AyuSysConfig::LoadInitFile(void)
 		}
 		if (strncmp(tokens[0],"#ADRC.",6) == 0) {
 			if (token_deal != 3) goto parse_error;
-			/* �ե���������λ��� */
+			/* ファイル形式の指定 */
 			FileSearcher::FILETYPE type;
 			char* name = tokens[0]+6;
 			if (strcmp(name, "PDT") == 0) type = FileSearcher::PDT;
@@ -1059,14 +1059,14 @@ bool AyuSysConfig::LoadInitFile(void)
 			else if (strcmp(name, "WAV") == 0) type = FileSearcher::WAV;
 			else if (strcmp(name, "KOE") == 0) type = FileSearcher::KOE;
 			else if (strcmp(name, "GAN") == 0) type = FileSearcher::GAN;
-			else goto parse_error; /* ¾�� ALL,ROOT,MID,KOE,BGM�����֤�¸�ߤ��ʤ� */
+			else goto parse_error; /* 他に ALL,ROOT,MID,KOE,BGM。たぶん、存在しない */
 			if (tokens[2][0] == 'N') { /* directory */
 				file_searcher->AppendFileInformation(type, FileSearcher::ATYPE_DIR, tokens[1]);
 				dprintf(("set file directory; type %s, directory %s\n",name,tokens[1]));
-			} else if (tokens[2][0] == 'P' && tokens[2][1] == ':') { /* ���������� */
+			} else if (tokens[2][0] == 'P' && tokens[2][1] == ':') { /* アーカイブ */
 				file_searcher->AppendFileInformation(type, FileSearcher::ATYPE_ARC, tokens[2]+2);
 				dprintf(("set file archive; type %s, file %s\n",name,tokens[2]+2));
-			} else if (tokens[2][0] == 'R' && tokens[2][1] == ':') { /* ���컶�륢�������� */
+			} else if (tokens[2][0] == 'R' && tokens[2][1] == ':') { /* それ散るアーカイブ */
 				file_searcher->AppendFileInformation(type, FileSearcher::ATYPE_ARC, tokens[2]+2);
 				dprintf(("set file archive; type %s, file %s\n",name,tokens[2]+2));
 			} else goto parse_error;
@@ -1074,7 +1074,7 @@ bool AyuSysConfig::LoadInitFile(void)
 		}
 		if (strncmp(tokens[0],"#FOLDNAME.",10) == 0) {
 			if (token_deal != 3) goto parse_error;
-			/* �ե���������λ��� */
+			/* ファイル形式の指定 */
 			FileSearcher::FILETYPE type;
 			char* name = tokens[0]+10;
 			if (strcmp(name, "PDT") == 0) type = FileSearcher::PDT;
@@ -1087,11 +1087,11 @@ bool AyuSysConfig::LoadInitFile(void)
 			else if (strcmp(name, "WAV") == 0) type = FileSearcher::WAV;
 			else if (strcmp(name, "BGM") == 0) type = FileSearcher::BGM;
 			else if (strcmp(name, "GAN") == 0) type = FileSearcher::GAN;
-			else goto parse_error; /* ¾�� ALL,ROOT,MID,KOE,BGM�����֤�¸�ߤ��ʤ� */
+			else goto parse_error; /* 他に ALL,ROOT,MID,KOE,BGM。たぶん、存在しない */
 			if (tokens[2][0] == '0') { /* directory */
 				file_searcher->AppendFileInformation(type, FileSearcher::ATYPE_DIR, tokens[1]);
 				dprintf(("set file directory; type %s, directory %s\n",name,tokens[1]));
-			} else if (tokens[2][0] == '1' && tokens[2][1] == ':') { /* ���������� */
+			} else if (tokens[2][0] == '1' && tokens[2][1] == ':') { /* アーカイブ */
 				file_searcher->AppendFileInformation(type, FileSearcher::ATYPE_SCN2k, tokens[2]+2);
 				dprintf(("set file archive; type %s, file %s\n",name,tokens[2]+2));
 			} else goto parse_error;
@@ -1106,7 +1106,7 @@ bool AyuSysConfig::LoadInitFile(void)
 		if (strcmp(tokens[0], "#DSTRACK") == 0) {
 			/* #DSTRACK=00000000-99999000-00782556="filename"   ="name"       */
 			/* #DSTRACK=00000000-99999000-00782556="name"       */
-			/* ����ȡ�����Σ��Ĥ�Υѥ�᡼��������ʷ����֤��λ��κ������ϰ��֡� */
+			/* 第二トークンの3つめのパラメータを得る(繰り返しの時の再生開始位置) */
 			int start_pt = 0;
 			const char* tk1 = strchr(tokens[1], '-');
 			const char* tk2 = NULL;
@@ -1133,14 +1133,14 @@ bool AyuSysConfig::LoadInitFile(void)
 			dprintf(("Set SE %d, name %s\n",atoi(tokens[0]+4), tokens[1]));
 			goto parse_end;
 		}
-		/* ������ܤ����Ĥ���ʤ��ä� */
+		/* 設定項目が見つからなかった */
 		dprintf(("Cannot find configuration name: %s\n",tokens[0]));
 	parse_error:
 	parse_end:
 		line_count++;
 	}
 	delete info;
-	/* �ǥե���ȤΥ��ץ�������ꤹ�� */
+	/* デフォルトのオプションを指定する */
 	// set_game(GetParaStr("#REGNAME"), *this);
 	return true;
 }
--- a/system/system_config.h
+++ b/system/system_config.h
@@ -1,5 +1,5 @@
 /*  system_config.h
- *      gameexe.ini �ե�������ɤ߹���
+ *      gameexe.ini ファイルの読み込み
  */
 
 /*
@@ -27,7 +27,7 @@
 
 #include <string>
 
-/* CD Track ̾ <-> Track �ֹ���Ѵ���Ԥ� */
+/* CD Track 名 <-> Track 番号の変換を行う */
 class TrackName {
 	private:
 		char** track;
@@ -51,12 +51,12 @@ class TrackName {
 		const char* WaveTrack(char* name);
 		const char* SETrack(int num);
 };
-/* gameexe.ini �����ꤵ���ѥ�᡼�� */
-/* �ޤ����ˡ�������ܤ� SetOrigPara* �ǥ��åȤ���
-** ������������̾��255ʸ���ʲ��Ǥ���ɬ�פ����롣
+/* gameexe.ini で設定されるパラメータ */
+/* まず初めに、設定項目を SetOrigPara* でセットする
+** ただし、設定名は255文字以下である必要がある。
 **
-** SetPara* ��������ܤ��ѹ��Ǥ���
-** �ޤ���GetPara* ��������ܤ������롣
+** SetPara* で設定項目は変更できる
+** また、GetPara* で設定項目を得られる。
 */
 
 class AyuSysConfig {
@@ -65,10 +65,10 @@ class AyuSysConfig {
 		static void Quit(void);
 
 		bool LoadInitFile(void);
-		/* �ѥ�᡼���򸡺����� */
-		/* str �ʤ� 1, int �ʤ� 2, ���Ĥ���ʤ��ʤ� 0 */
+		/* パラメータを検索する */
+		/* str なら 1, int なら 2, 見つからないなら 0 */
 		int SearchParam(const char* name) const;
-		/* �ѥ�᡼�������� */
+		/* パラメータを得る */
 		const char* GetParaStr(const char* name) const; /* str */
 		int GetParam(const char* name, int deal, ...) const; /* int, error -> return -1, no error -> return 0 */
 		int GetOriginalParam(const char* name, int deal, ...) const; /* int, error -> return -1, no error -> return 0 */
@@ -78,28 +78,28 @@ class AyuSysConfig {
 			return n;
 		}
 		const int* GetParamArray(const char* name, int& deal) const;
-		/* �ѥ�᡼�����ѹ����� */
+		/* パラメータを変更する */
 		void SetParaStr(const char* name, const char* var); /* str */
 		void SetParam(const char* name, int deal, ...); /* int */
 
-		/* ���ꥸ�ʥ������ط�
-		** SetOriginal : ���Ƥ��������ξ��֤��᤹
-		** DiffOriginal : ���ξ��֤ȸ��ߤξ��֤��ѹ�ʬ������
-		** PatchOriginal: DiffOriginal ������ʸ����������
-		**   �Ϥ���DiffOriginal �ƤӽФ����ξ��֤��᤹
+		/* オリジナルの設定関係
+		** SetOriginal : 全ての設定を初めの状態に戻す
+		** DiffOriginal : 初めの状態と現在の状態の変更分を得る
+		** PatchOriginal: DiffOriginal で得た文字列を引数に
+		**   渡す。DiffOriginal 呼び出し時の状態に戻す
 		*/
 		void SetOriginal(void);
 		void DiffOriginal(std::string&);
 		const char* PatchOriginal(const char*);
-		/* config �����Ƥ�ɽ������ */
+		/* config の内容を表示する */
 		void Dump(FILE* f) const;
 
 	private:
-		/* �������Ԥ� */
-		/* AyuSys ����Τ߲�ǽ */
+		/* 元設定を行う */
+		/* AyuSys からのみ可能 */
 		void SetOrigParaStr(const char* name, const char* var); /* str */
 		void SetOrigParam(const char* name, int para_deal, ...); /* int */
-		void SetOrigParamArray(const char* name, int deal, int* array); /* ��Ȥ��ʤ� */
+		void SetOrigParamArray(const char* name, int deal, int* array); /* 上とおなじ */
 		AyuSysConfig(void);
 		~AyuSysConfig();
 
--- a/system/visarc.cc
+++ b/system/visarc.cc
@@ -2,8 +2,8 @@
 #define VERSION "1.00"
 
 /*****************************************
-**	Visual Arts �ΰ��̽�˥ե������
-**	Ÿ������
+**	Visual Arts の圧縮書庫ファイルを
+**	展開する
 **
 **	usage : visarc x <arcfile> <file> [<file> ...]
 **		visarc l <arcfile>
@@ -239,12 +239,12 @@ void ExtractPngRgbaGraphic(char* path,ch
 	}
 	if (! masked) {
 		for (int i = 0; i < conv->Width() * conv->Height(); i++) {
-			data[4*i+3] = 0xff;	// ��Ʃ���٤����ˤ���
+			data[4*i+3] = 0xff;	// 不透明度を最大にする
 		}
 	}
-	if (outpath == NULL) ChangeExt(path,".png", buf); // path ��Ĥ���
+	if (outpath == NULL) ChangeExt(path,".png", buf); // path をつくる
 	else fname = outpath;
-	FILE* out = fopen(fname, "wb"); // �ե�����򳫤�
+	FILE* out = fopen(fname, "wb"); // ファイルを開く
 	if (out == NULL) {
 		fprintf(stderr, "Cannot open raw file : %s\n",buf);
 		delete conv;
@@ -267,7 +267,7 @@ int main(int argc, char* argv[]) {
 		usage(); return -1;
 	}
 	for (i=2; i<argc; i++) {
-		/* option ���� */
+		/* option を削る */
 		argc--;
 		int j; for (j=i; j<argc; j++) argv[j] = argv[j+1];
 	}
--- a/window/button.cc
+++ b/window/button.cc
@@ -25,15 +25,15 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-/* r,g,b �δ��ܿ��� number (0:left 1:right 2:up 3:down)������Υӥåȥޥåפ��������
-** width/height�Τɤ��餫��-1�ˤ���ȡ�����ˤ��碌�ƥ�������
+/* r,g,b の基本色で number (0:left 1:right 2:up 3:down)の矢印のビットマップを作成する
+** width/heightのどちらかを-1にすると、それにあわせてスケール
 */
 #include <stdlib.h>
 extern char* create_button(int number, int& width, int& height, int r, int g, int b);
 extern char* create_box(int& width, int& height, int r, int g, int b);
 
-// �ܥ����bitmap
-// ����󥰥��Ǵʰװ���
+// ボタンのbitmap
+// ランレングスで簡易圧縮
 static int buttonleft_cnt = 990;
 static char buttonleft[991] = {
 	0x00,0x10,0x04,0x7e,0x39,0x00,0x22,0x04,0x7f,0x59,0x00,0x1e,0x04,0x81,0x79,0x00,
@@ -379,7 +379,7 @@ static char* extract_button(int number, 
 	char* out = new char[width*height];
 	int outc = 0;
 	int i;
-	// ����󥰥���Ÿ��
+	// ランレングスの展開
 	for (i=0; i<size; i++) {
 		int c = *(unsigned char*)(data+i);
 		int s = 0;
@@ -396,15 +396,15 @@ static char* extract_button(int number, 
 	return out;
 }
 
-// R,G,B �λ��꿧����쿧�ˡ����뤵���Ѥ������� RGB -> HLS -> RGB �Ѵ��Ǻ�������
+// R,G,B の指定色を基底色に、明るさを変えた色を RGB -> HLS -> RGB 変換で作成する
 struct ButtonColor {
 	int rs[8];
 	int gs[8];
 	int bs[8];
 	int as[8];
-	int* c_min, *c_mid, *c_max; // rgb->hls->rgb�Ѵ��ѡ�r,g,b ��⤤���max,mid,min�˳�����Ƥ�
+	int* c_min, *c_mid, *c_max; // rgb->hls->rgb変換用。r,g,b を高い順にmax,mid,minに割り当てる
 	bool is_gray;
-	int hc, hd, l, s; // h,l,s �ϡ�h ���ǤϾ�� c_min|mid|max�ˤ�����
+	int hc, hd, l, s; // h,l,s 系。h 要素は上の c_min|mid|maxにも入る
 	ButtonColor(int _r, int _g, int _b);
 	void SetBrightness1(int n, int c1);
 	void SetBrightness(int c1, int c2, int c3, int c4, int c5);
@@ -419,7 +419,7 @@ ButtonColor::ButtonColor(int r, int g, i
 	}
 	*rs = r; *bs = b; *gs = g;
 	
-	// r,g,b �ξ����max,mid,min��rs,gs,bs�˳�����Ƥ�
+	// r,g,b の昇順にmax,mid,minをrs,gs,bsに割り当てる
 	if (r > g) {
 		if (r > b) { // r = max
 			c_max = rs;
@@ -511,7 +511,7 @@ static void draw_button(char* rdata, int
 	int xadd = width*65536/bwidth;
 	int yadd = height*65536/bheight;
 
-	// ���Υӥåȥޥåפ��忧���ʤ���̾�����
+	// 元のビットマップに着色しながら縮小する
 	for (by=0; by<bheight; by++) {
 		ScaleData* d = data + y*width;
 		char* s = bdata + by*bwidth;
@@ -550,16 +550,16 @@ char* create_button(int number, int& wid
 	int bwidth, bheight;
 	char* bdata = extract_button(number, bwidth, bheight);
 	if (bdata == NULL) return NULL;
-	// ����Ψ�˹�碌��width,height�򥻥å�
+	// 拡大率に合わせてwidth,heightをセット
 	if (width == -1 && height == -1) width = bwidth, height = bheight;
 	else if (width == -1) width = bwidth * height / bheight;
 	else if (height == -1) height = bheight * width / bwidth;
 	if (width > bwidth) width = bwidth;
 	if (height > bheight) height = bheight;
 
-	// �������ꤹ��
+	// 色を設定する
 	ButtonColor color(r,g,b);
-	// ����
+	// 描画
 	char* rdata = (char*)malloc(width*height*4*3);
 	color.SetBrightness(0x60, 0xa0, 0xc0, 0xe0, 0xe0);
 	draw_button(rdata, width, height, bdata, bwidth, bheight, color);
@@ -591,9 +591,9 @@ static void draw_box(char* buf, int widt
 	const int* gs = color.gs;
 	const int* bs = color.bs;
 	const int* as = color.as;
-	// �ޤ���Ʀ����
+	// まず、豆腐を書く
 	drawbox(buf, Rect(0,0,width,height), width, rs[3],gs[3],bs[3],as[3]);
-	// ��
+	// 影
 	if (height > 2) {
 		drawbox(buf, Rect(0,0,width,kage_w1), width, rs[4], gs[4], bs[4],as[4]);
 		drawbox(buf, Rect(0,height-kage_w1,width,height), width, rs[1], gs[1], bs[1],as[1]);
@@ -612,7 +612,7 @@ static void draw_box(char* buf, int widt
 
 char* create_box(int& width, int& height, int r, int g, int b) {
 	ButtonColor color(r,g,b);
-	// scale ��������
+	// scale のカーソル
 	if (width == -1 && height == -1) width = 32, height = 48;
 	else if (width == -1) width = height*3/2;
 	else if (height == -1) height = width * 3/2;
@@ -622,7 +622,7 @@ char* create_box(int& width, int& height
 	if (kage_w2 <= 1) kage_w2 = 2;
 	
 	char* buf = (char*)malloc(width*height*4*3);
-	// ����
+	// 描画
 	color.SetBrightness(0x60, 0xa0, 0xc0, 0xe0, 0xe0);
 	draw_box(buf, width, height, kage_w1, kage_w2, color);
 	color.SetBrightness(0x60, 0xa0, 0xe0, 0xe0, 0xe0);
--- a/window/event.cc
+++ b/window/event.cc
@@ -35,7 +35,7 @@
 
 using namespace std;
 
-bool save_req = false, load_req = false, grpdump_req = false; //  scn2k/scn2k_impl.cc: �����ܡ��ɤ��饻���֡������ɤǤ���褦��
+bool save_req = false, load_req = false, grpdump_req = false; //  scn2k/scn2k_impl.cc: キーボードからセーブ・ロードできるように
 bool pressAreq=false,pressFreq=false,pressDreq=false;
 namespace Event {
 /* Impl: struct Event::Video */
@@ -73,7 +73,7 @@ inline int Video::point_in(int x, int y)
 	else return -1;
 }
 
-/* ���������ư��������塢���ν�˽���դ� */
+/* カーソルの動く順序:上、左の順に準位付け */
 bool operator <(const Video& pos1, const Video& pos2) {
 	if (pos1.region.ty < pos2.region.ty) return true;
 	if (pos1.region.ty == pos2.region.ty) return pos1.region.lx < pos2.region.lx;
@@ -142,11 +142,11 @@ void ContainerImplTime::Delete(Time* del
 
 bool ContainerImplTime::Exec(unsigned int current_time) {
 	if (current_time == Time::NEVER_WAKE) return true;
-	// �ƤӽФ��ޤǤ˺������줿item���ɲ� 
+	// 呼び出しまでに作製されたitemを追加 
 	insert(end(), new_item.begin(), new_item.end());
 	new_item.clear();
 	if (empty()) return true;
-	if (current_time == Time::FRAME_UPDATE) { // �ӥǥ��ե졼��ι�����
+	if (current_time == Time::FRAME_UPDATE) { // ビデオフレームの更新時
 		for (iterator it = begin(); it != end(); it++) {
 			if (! it->valid) continue;
 			
@@ -155,8 +155,8 @@ bool ContainerImplTime::Exec(unsigned in
 				it->instance->Elapsed(prev_execed_time);
 			}
 		}
-	} else { // �����Ѳ���
-		if (current_time < prev_execed_time) prev_execed_time = 0; /* ���֤����ꤷ�ƣ�����ä��Ȥ� */
+	} else { // 時間変化時
+		if (current_time < prev_execed_time) prev_execed_time = 0; /* 時間が一回りして0に戻ったとき */
 		for (iterator it = begin(); it != end(); it++) {
 			if (! it->valid) continue;
 			unsigned tm = it->instance->Wakeup();
@@ -166,7 +166,7 @@ bool ContainerImplTime::Exec(unsigned in
 		}
 		prev_execed_time = current_time;
 	}
-	// ������˺�����줿 item ��ºݤ˺��
+	// 処理中に削除された item を実際に削除
 	erase(remove_if(begin(), end(), is_invalid), end());
 	return true;
 }
@@ -209,7 +209,7 @@ class ContainerImplVideo : private vecto
 		void Press(void);
 		void TakeScreenshot(void);
 		iterator cur_pos;
-		Video* cur_item; // ���ߤΥե�����������
+		Video* cur_item; // 現在のフォーカス位置
 		int cur_pressed_x, cur_pressed_y;
 };
 
@@ -319,7 +319,7 @@ void ContainerImplVideo::Motion(int x, i
 	
 	}
 	
-	/* @@@ �ɥ�å������ȥޥ����򲡤������ΥХåƥ��󥰤ǡ����ܥ���򲡤��ʤ��ȱ����״�Ϣ�ΥХ��β�ǽ������ */
+	/* @@@ ドラッグ処理とマウスを押す処理のバッティングで「二回ボタンを押さないと云々」関連のバグの可能性あり */
 	if (button_pressed & (1<<MOUSE_LEFT)) {
 		if (cur_item) cur_item->Drag(cur_pressed_x, cur_pressed_y, x, y);
 		return;
@@ -386,8 +386,8 @@ bool ContainerImplVideo::Exec(void) {
 	SDL_PumpEvents();
 	while(SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_ALLEVENTS) == 1) {
 		switch(event.type) {
-			case SDL_QUIT: return false; // @@@ �ʤˤ����ʤ���
-			case SDL_ACTIVEEVENT: // �ʤˤ⤷�ʤ�
+			case SDL_QUIT: return false; // @@@ なにかやらないと
+			case SDL_ACTIVEEVENT: // なにもしない
 				// cout<<"active : gain "<<int(event.active.gain)<<", state "<<int(event.active.state)<<endl;
 				break;
 			case SDL_KEYDOWN:
@@ -495,12 +495,12 @@ bool ContainerImplVideo::Exec(void) {
 				// cout << "mouse which "<<int(event.button.which)<<"button "<<int(event.button.button)<<
 				//	"state "<<int(event.button.state)<<"x "<<event.button.x << "y "<<event.button.y<<endl;
 				break;
-			case SDL_VIDEOEXPOSE: // redraw ��ɬ�פ����롩
+			case SDL_VIDEOEXPOSE: // redraw の必要がある?
 				// cout<<"expose."<<endl;
 				break;
 		}
 	}
-	// Motion �ƤӽФ��ϰ�����
+	// Motion 呼び出しは一回だけ
 	if (is_mouse_motion)
 		Motion(motion_x, motion_y);
 	return true;
@@ -595,9 +595,9 @@ bool Container::presscount(int mask) {
 
 } /* end of namespace Container */
 
-// ���ꡧ
-// z ���� xy ������ߴ��ġ���®��
-// ��ư���륦�����å�����ι�®��
-// ������
-// ʸ����ΰ����Τ߹����ι�®��
-// �ֳ��� z �� x �ʤ��ΰ�̵������y �ʤ��ΰ������פ��ɤ�����Expose
+// 問題:
+// z 軸と xy 軸の相互干渉;高速化
+// 移動するウィジット描画の高速化
+// キャッシュ
+// 文字列の一部のみ更新の高速化
+// 「階層 z で x なる領域無効化、y なる領域生成」で良い?>Expose
--- a/window/event.h
+++ b/window/event.h
@@ -38,8 +38,8 @@ namespace Event {
 	class Container;
 
 	/*
-	** �ޥ����� press, �ɥ�å���in/out �򸡽ФǤ���
-	** focus ��������� left/right/space(==press) �Υ�����Ƚ�̤Ǥ���
+	** マウスの press, ドラッグ、in/out を検出できる
+	** focus がある時の left/right/space(==press) のキーを判別できる
 	*/
 	struct Video {
 		public:
@@ -52,7 +52,7 @@ namespace Event {
 			virtual void KeyLeft(void) {}
 			virtual void KeyRight(void) {}
 
-			int point_in(int x, int y); /* z or -1 ���֤����礭���ۤɹ⤤�Ȥ����ˤ��� */
+			int point_in(int x, int y); /* z or -1 を返す。大きいほど高いところにある */
 
 			Video(Container& container);
 			Video(Container& container, const Rect& init_rect);
@@ -109,9 +109,9 @@ namespace Event {
 			void Delete(Time* item);
 
 			typedef bool (*motionfunc)(int x, int y, void* pointer);
-			void RegisterGlobalMotionFunc(motionfunc, void* pointer); // �ޥ����ΰ�ư�Τ��Ӥ˸ƤӽФ����ؿ�����Ͽ����
+			void RegisterGlobalMotionFunc(motionfunc, void* pointer); // マウスの移動のたびに呼び出される関数を登録する
 			void DeleteGlobalMotionFunc(motionfunc, void* pointer);
-			void RegisterGlobalPressFunc(motionfunc, void* pointer); // �ޥ����Υ���å��Τ��Ӥ˸ƤӽФ����ؿ�����Ͽ����
+			void RegisterGlobalPressFunc(motionfunc, void* pointer); // マウスのクリックのたびに呼び出される関数を登録する
 			void DeleteGlobalPressFunc(motionfunc, void* pointer);
 
 			Container(void);
--- a/window/menuitem.cc
+++ b/window/menuitem.cc
@@ -91,7 +91,7 @@ void MenuItem::deactivate(void) {
 
 void MenuItem::pack(void) {
 	int x_min = 0, y_min = 0;
-	if (lb_width == -1) { // ��˥�٥��Ž��
+	if (lb_width == -1) { // 上にラベルを貼る
 		if (lb_left < 0) lb_left = 0;
 		if (lb_bottom < 0) lb_bottom = 0;
 		if (label && label->Pic()) {
@@ -100,7 +100,7 @@ void MenuItem::pack(void) {
 		} else {
 			y_min = lb_bottom;
 		}
-	} else { // ���˥�٥��Ž��
+	} else { // 左にラベルを貼る
 		if (lb_right < 0) lb_right = 0;
 		if (label && label->Pic()) {
 			int label_width = label->Pic()->Width();
@@ -142,7 +142,7 @@ void MenuItem::pack(void) {
 	}
 
 	int x=x_min, y=y_min;
-	// width / height �κƳ������
+	// width / height の再割り当て
 	if (menu_width > width + x_min) {
 		int dif = menu_width - width - x_min;
 		int n = x_size + 1;
@@ -177,7 +177,7 @@ void MenuItem::pack(void) {
 			y += item_height[i];
 		}
 	}
-	// ���֤κƳ������
+	// 位置の再割り当て
 	it = item.begin();
 	for (i=0; i<y_size; i++) {
 		for (j=0; j<x_size; j++) {
@@ -190,7 +190,7 @@ void MenuItem::pack(void) {
 			it++;
 		}
 	}
-	// ���˥�٥뤬�����硢��٥�ι⤵�����Υ��󥿥��
+	// 左にラベルがある場合、ラベルの高さ方向のセンタリング
 	if (label && label->Pic() && lb_width != -1) {
 		int label_width = label->Pic()->Width();
 		int label_height = label->Pic()->Height();
--- a/window/menuitem.h
+++ b/window/menuitem.h
@@ -34,23 +34,23 @@
 #define MenuRadioButton WidMenuRadioButton
 #define MenuScale WidMenuScale
 
-// ɬ�פʤ�Ρ�
+// 必要なもの:
 //	
-//	��٥롧surface��Ž�줿�����褤�����ޤ�������
-//	��٥���֡��ܥ���ξ塢�⤷���ϱ�
-//		���ξ�硧�������justify ����Τǡ���٥����Τ����ȱ��ޡ�����ɬ��
-//		��ξ�硧������justify ����Τǡ����ޡ�����Ȳ��ޡ�����ɬ��
+//	ラベル:surfaceも貼れた方がよいが、まあいいや
+//	ラベル位置:ボタンの上、もしくは右
+//		右の場合:右中央へjustify するので、ラベル全体の幅と右マージンが必要
+//		上の場合:左下へjustify するので、左マージンと下マージンが必要
 
-//	���ơ�x,y�Ŀ�����ꡢ�����������������
+//	内容:x,y個数を指定、その中で中央割り当て
 
-//		��٥���־��󡧾�ʤ麸����justify, ���ʤ鱦�����justify
-//		�ʤΤǡ����ؤΥޡ�����Ⱦ�ؤΥޡ�����
-//	��٥�ܻͳѥܥ���ʥ����å��ܥå�����
-//		�ܥ��󤬲�������deactivate�����
+//		ラベル位置情報:上なら左下にjustify, 右なら右中央にjustify
+//		なので、下へのマージンと上へのマージン、
+//	ラベル+四角ボタン(チェックボックス)
+//		ボタンが押されるとdeactivateされる
 //
-//	�饸���ܥ���
-//		�ƥ����ȥܥ���ν����Ρ�x,y �θĿ������
-//	��������
+//	ラジオボタン
+//		テキストボタンの集合体。x,y の個数を指定
+//	スケール
 
 struct MenuItem : PicWidget {
 	int x_size, y_size;
--- a/window/picture.cc
+++ b/window/picture.cc
@@ -45,7 +45,7 @@ using namespace std;
 void DSurfaceBlitAlpha(Surface* src_o, const Rect& srcrect_o, Surface* dst_o, const Rect& dstrect_o, const unsigned char* alpha, const Rect& alpharect);
 void DSurfaceBlitAdd(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect, unsigned char alpha);
 void DSurfaceBlitMultiply(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect);
-void DSurfaceFill(Surface* src, const Rect& rect, int r, int g, int b, int a=0xff); // ���ꥢ
+void DSurfaceFill(Surface* src, const Rect& rect, int r, int g, int b, int a=0xff); // クリア
 #if 0 /* DEBUG */
 #include<sys/types.h>
 #include<sys/time.h>
@@ -101,11 +101,11 @@ PicBase::~PicBase() {
 	if (surface_own != NULL && (attribute & SURFACE_FREE)) root->DeleteSurface(surface_own);
 	if (surface_alpha != NULL && (attribute & ALPHA_FREE)) delete surface_alpha;
 	iterator it;
-	if (parent) { // ��ʬ��Ƥ�����
+	if (parent) { // 自分を親から削除
 		parent->children.remove(this);
-		// root �� update ���󤫤鼫ʬ����
+		// root の update 情報から自分を削除
 		parent->Root().DeleteUpdatePic(this);
-		// ��ʬ���ΰ���ľ��
+		// 自分の領域を書き直す
 		Rect old_ppos = rel_pos;
 		parent->QueryAbsPos(old_ppos);
 		parent->ReBlit(old_ppos);
@@ -113,9 +113,9 @@ PicBase::~PicBase() {
 }
 
 void PicBase::Blit(const Rect& rpos_orig) {
-	// �ºݤ����褹���ΰ������
+	// 実際に描画する領域を得る
 	Rect rpos = rpos_orig;
-	// ��widget������ꤵ�줿clip area ����������ꤹ��
+	// 親widget上に設定されたclip area 内に描画を限定する
 	if (clip_area.width() != 0) {
 		Rect clip = clip_area;
 		clip = child_pos(clip, this);
@@ -123,7 +123,7 @@ void PicBase::Blit(const Rect& rpos_orig
 	}
 	Rect apos = QueryAbsPos(rpos);
 	if (rpos.empty()) return;
-	// ɬ�פ˱�������¸������
+	// 必要に応じて保存、描画
 	if (attribute & CACHE_BACK) root->BlitSurface(root->surface, apos, surface_back, rpos);
 	if (! (attribute & NO_PICTURE)) {
 		rpos.rmove(surface_x, surface_y);
@@ -134,7 +134,7 @@ void PicBase::Blit(const Rect& rpos_orig
 //if (apos.ty < 200) fprintf(stderr,"Blit: %p : (%d,%d,%d,%d) -> (%d,%d,%d,%d)\n",surface_own,rpos_orig.lx,rpos_orig.ty,rpos_orig.rx,rpos_orig.by,apos.lx,apos.ty,apos.rx,apos.by);
 		root->BlitSurface(surface_own, rpos, surface_alpha, surface_alpha_rect, root->surface, apos, attribute);
 		rpos.rmove(-surface_x, -surface_y);
-	} else if (parent == 0) { // �Ƥ����ʤ��ʤ��طʾõ����Ǥ����
+	} else if (parent == 0) { // 親がいないなら背景消去の責任をもつ
 		DSurfaceFill(root->surface, apos, 0, 0, 0);
 	}
 	PicContainer* cur = dynamic_cast<PicContainer*>(this);
@@ -144,7 +144,7 @@ void PicBase::Blit(const Rect& rpos_orig
 }
 
 void PicBase::SimpleBlit(Surface* screen) {
-	// �ºݤ����褹���ΰ������
+	// 実際に描画する領域を得る
 	Rect rpos(0, 0, rel_pos.width(), rel_pos.height());
 	Rect apos = QueryAbsPos(rpos);
 	if (rpos.empty()) return;
@@ -162,7 +162,7 @@ Rect PicBase::QueryAbsPos(Rect& rpos) {
 	if (parent == NULL) { // root container
 		return rpos;
 	}
-	// �Ƥκ�ɸ���Ѵ��塢Query ����
+	// 親の座標に変換後、Query する
 	Rect ppos = parent_pos(rpos);
 	Rect apos = parent->QueryAbsPos(ppos);
 	rpos = child_pos(ppos, this);
@@ -200,14 +200,14 @@ void PicBase::ZMove(PicBase* move_to) {
 		fprintf(stderr,"Error: PicBase::ZMove was called with a no-brother picture\n");
 		return;
 	}
-	// move_to �� zpos �Τ�������������� picture ����񤭤ʤ���ɬ�פ�����
+	// move_to と zpos のうち、後ろの方の picture から書きなおす必要がある
 	iterator redraw_zpos = z_pos; redraw_zpos++;
-	if (move_to == ZMOVE_BOTTOM) { // �����̤�
+	if (move_to == ZMOVE_BOTTOM) { // 最背面へ
 		parent->children.erase(z_pos);
 		parent->children.push_front(this);
 		z_pos = parent->children.begin();
 		redraw_zpos = parent->children.begin();
-	} else if (move_to == ZMOVE_TOP) { // �����̤�
+	} else if (move_to == ZMOVE_TOP) { // 最前面へ
 		redraw_zpos = z_pos; redraw_zpos++;
 		parent->children.erase(z_pos);
 		parent->children.push_back(this);
@@ -224,7 +224,7 @@ void PicBase::ZMove(PicBase* move_to) {
 	if (! is_hidden_now) {
 		is_cached = false;
 		ReBlit();
-		/* @@@ parent->Blit() �� Blit() �ΰ㤤��ʬ����ʤ��Τǽ��� 06/12/02
+		/* @@@ parent->Blit() と Blit() の違いが分からないので修正 06/12/02
 		Rect ppos = rel_pos;
 		parent->QueryAbsPos(ppos);
 		parent->ReBlit(ppos);
@@ -272,16 +272,16 @@ bool PicBase::IsParent(PicBase* to) {
 }
 
 void PicBase::show(void) {
-	/* ��ʬ�οƤ����٤� shown ���� */
+	/* 自分の親がすべて shown か? */
 	PicContainer* cur;
 	for (cur = parent; cur != 0; cur = cur->parent)
 		if (cur->is_hidden) break;
-	if (cur != NULL) { // �Ƥ�����Ƥ���Τ�ɽ���Ϥ��ʤ�
+	if (cur != NULL) { // 親が隠れているので表示はしない
 		is_hidden = false;
 		is_hidden_now = true;
 		return;
 	}
-	if (is_hidden == false) return; // ���Ǥ�ɽ������Ƥ���ΤǤʤˤ⤷�ʤ�
+	if (is_hidden == false) return; // すでに表示されているのでなにもしない
 	if (widget != NULL) {
 		widget->activate();
 	}
@@ -330,8 +330,8 @@ void PicBase::SetSurfaceColorKey(int r, 
 
 void PicBase::SetSurfaceAlphaFile(const char* file) {
 
-	/* �ե�����򸵤� alpha ������������� */
-	/* �ե����롧 �ѥ�ե��� 'fil' �ե����� */
+	/* ファイルを元に alpha 画像を作成する */
+	/* ファイル: パルフェの 'fil' ファイル */
 	ARCINFO* info = FileSearcher::GetInstance()->Find(FileSearcher::PDT, file,"fil");
 	if (info == NULL) return;
 	char* new_alpha = info->CopyRead();
@@ -349,7 +349,7 @@ err_ret:
 	h = sr.height();
 	if (alpha_size < w*h) goto err_ret;
 	int i,j;
-	if ( ((SDL_Surface*)surface_own)->format->Amask == 0) { // mask �� surface �˷������
+	if ( ((SDL_Surface*)surface_own)->format->Amask == 0) { // mask を surface に繰り込む
 		Surface* dest = root->NewSurface(w,h, ALPHA_MASK);
 		for (i=0; i<h; i++) {
 			char* a = new_alpha + w*i;
@@ -371,8 +371,8 @@ err_ret:
 		root->DeleteSurface(surface_own);
 		surface_own = dest;
 		SetSurfaceAlpha(0, Rect(0,0));
-	} else { // �����˥ޥ�������
-		/* �ޥ����Τ�����0xff �Ǥ���٤���ʬ���������Ƚ�̡��ѹ����� */
+	} else { // 外部にマスク作成
+		/* マスクのうち、0xff であるべき部分を画像から判別、変更する */
 		for (i=0; i<h; i++) {
 			char* a = new_alpha + w*i;
 			char* s = (char*)((SDL_Surface*)surface_own)->pixels + ((SDL_Surface*)surface_own)->pitch*i;
@@ -406,7 +406,7 @@ void PicBase::SetSurface(Surface* new_su
 	surface_h = -1;
 
 	if (attribute & FIT_SURFACE) {
-		// surface ���礭���˼�ʬ���礭�����ѹ�
+		// surface の大きさに自分の大きさを変更
 		parent->ReBlit(rel_pos);
 		if (surface_own == 0) {
 			rel_pos = Rect(rel_pos.lx, rel_pos.ty);
@@ -488,7 +488,7 @@ PicContainer::~PicContainer() {
 	iterator end = children.end();
 	for (iterator it = children.begin(); it != end; ) {
 		iterator it_next = it; it_next++;
-		if ((*it)->widget != NULL) delete (*it)->widget; // picture ��widget ����°���Ƥ���ʤ顢�������delete
+		if ((*it)->widget != NULL) delete (*it)->widget; // picture にwidget が付属しているなら、そちらをdelete
 		else delete (*it);
 		it = it_next;
 	}
@@ -502,16 +502,16 @@ void PicContainer::BlitBack(iterator z, 
 
 	Rect ppos = parent_pos(rpos);
 	if (is_hidden_now) goto parent_redraw;
-	// cache ����Ƥ����ΰ��õ��
-	// z���Ȥ�����å��夷�Ƥ���С������ǽ�λ
+	// cache されている領域を探す
+	// z自身がキャッシュしていれば、ここで終了
 	if ( ((*z)->attribute & CACHE_BACK) && ( (*z)->is_cached) && (*z)->rel_pos.is_inner(rpos)) {
 		Rect cpos = child_pos(rpos, *z);
 		Rect apos = (*z)->QueryAbsPos(cpos);
 		root->BlitSurface( (*z)->surface_back, cpos, root->surface, apos);
 		return;
 	}
-	// z ��겼�λҤ�����å��塢���뤤�� SOLID ����Ǥ��ʤ�����
-	for (it = z; it != begin;) { // �Ҥ�container�ξ��Υ����å��Ͼ�ά
+	// z より下の子がキャッシュ、あるいは SOLID 描画できないか?
+	for (it = z; it != begin;) { // 子がcontainerの場合のチェックは省略
 		it--;
 		if ( (*it)->is_hidden_now) continue;
 		if ( (*it)->rel_pos.is_crossed(rpos)) {
@@ -526,7 +526,7 @@ void PicContainer::BlitBack(iterator z, 
 			}
 		}
 	}
-	// ��ʬ���Ȥ�����å��塢���뤤�� SOLID ����Ǥ��ʤ�����
+	// 自分自身がキャッシュ、あるいは SOLID 描画できないか?
 	if (rel_solid_area.is_inner(ppos)) {
 		goto self_redraw;
 	}
@@ -544,7 +544,7 @@ parent_redraw:
 	}
 	if (is_hidden_now) return;
 self_redraw:
-	BlitSelf(rpos); // �Ҥ����褻������ʬ��������
+	BlitSelf(rpos); // 子は描画せず、自分だけ描画
 children_redraw:
 	for (; it != z; it++) {
 		if ( (*it)->is_hidden_now) continue;
@@ -586,11 +586,11 @@ void PicContainer::BlitFront(iterator z,
 }
 
 void PicContainer::BlitSelf(Rect rpos) {
-	// �ºݤ����褹���ΰ������
+	// 実際に描画する領域を得る
 	rpos.intersect(Rect(0, 0, rel_pos.width(), rel_pos.height()));
 	if (rpos.empty()) return;
 	Rect apos = QueryAbsPos(rpos);
-	// ɬ�פ˱�������¸������
+	// 必要に応じて保存、描画
 	if (attribute & CACHE_BACK) root->BlitSurface(root->surface, apos, surface_back, rpos);
 	if (! (attribute & NO_PICTURE)) {
 		rpos.rmove(surface_x, surface_y);
@@ -600,7 +600,7 @@ void PicContainer::BlitSelf(Rect rpos) {
 			rpos.intersect(clip);
 		}
 		root->BlitSurface(surface_own, rpos, surface_alpha, surface_alpha_rect, root->surface, apos, attribute);
-	} else if (parent == NULL) { // �Ƥ����ʤ��ʤ��طʾõ����Ǥ����
+	} else if (parent == NULL) { // 親がいないなら背景消去の責任をもつ
 		DSurfaceFill(root->surface, apos, 0, 0, 0);
 	}
 }
@@ -628,7 +628,7 @@ void PicContainer::set_nowhiddenflag(boo
 	}
 }
 
-void PicContainer::RMove(int add_x, int add_y) { // event widget �ΰ�ư����������ΤǻҤˤĤ��Ƥ�RMove��ƤӽФ�
+void PicContainer::RMove(int add_x, int add_y) { // event widget の移動があり得るので子についてもRMoveを呼び出す
 	PicBase::RMove(add_x, add_y);
 	iterator end = children.end();
 	for (iterator it = children.begin(); it != end; it++) {
@@ -724,7 +724,7 @@ class FileToSurface {
 
 FileToSurface::FileToSurface(const PicRoot& _root) : root(_root) {
 	count = 0;
-	count_max = 32; // ����å����̡ʷ���Ǥ���
+	count_max = 32; // キャッシュ量(決め打ち)
 };
 
 FileToSurface::~FileToSurface() {
@@ -761,7 +761,7 @@ inline Surface* FileToSurface::LoadSurfa
 	Surface* s = NULL;
 	if (conv->Read(mem)) {
 		MaskType is_mask = conv->IsMask() ? ALPHA_MASK : NO_MASK;
-		if (is_mask == ALPHA_MASK) { // alpha �����٤� 0xff �ʤ�ޥ���̵���Ȥ���
+		if (is_mask == ALPHA_MASK) { // alpha がすべて 0xff ならマスク無しとする
 			int len = conv->Width()*conv->Height();
 			unsigned int* d = (unsigned int*)mem;
 			int i; for (i=0; i<len; i++) {
@@ -787,12 +787,12 @@ Surface* FileToSurface::Load(string name
 	Surface* surface = LoadSurface(name, mem);
 	if (surface == NULL) return NULL;
 
-	while (count >= count_max) { // count_max �ʾ�Υǡ������ǽ�ʤ�������
+	while (count >= count_max) { // count_max 以上のデータを可能なら削除する
 		qiterator it;
 		for (it=queue.begin(); it != queue.end(); it++) {
 			if (DeleteData(*it)) break;
 		}
-		if (it == queue.end()) break; // ���ǡ�����������ʤ齪λ
+		if (it == queue.end()) break; // 全データが使用中なら終了
 	}
 	SurfaceIndex* new_index = new SurfaceIndex;
 	new_index->filename = name;
@@ -849,7 +849,7 @@ PicRoot::PicRoot(void) {
 }
 
 PicRoot::~PicRoot() {
-	// if (surface) DeleteSurfaceImpl(surface); // SDL_GetVideoSurface() ���� surface �ϳ�����ɬ�פ��ʤ��餷��
+	// if (surface) DeleteSurfaceImpl(surface); // SDL_GetVideoSurface() した surface は開放の必要がないらしい
 	surface = NULL;
 	delete root;
 	delete ftosurface;
@@ -877,7 +877,7 @@ void PicRoot::DeleteUpdatePic(PicBase* p
 }
 
 void PicRoot::ExecUpdate(void) {
-	/* ���̤����ΰ��õ�� */
+	/* 共通する領域を消去する */
 	sort(update_rects.begin(), update_rects.end(), UpdateItem::less);
 	vector<UpdateItem>::iterator it;
 	vector<UpdateItem>::iterator end = update_rects.end();
@@ -891,12 +891,12 @@ void PicRoot::ExecUpdate(void) {
 		vector<UpdateItem>::iterator jt = it; jt++;
 		for (; jt != end; jt++) {
 			if (apos.is_inner(jt->apos)) {
-				if (jt->pic == pic || jt->pic->IsParent(pic)) { // �Ƥ����̡������ΰ�ⶦ��
-					jt->rpos = Rect(0,0); // empty rect �򥻥å�
+				if (jt->pic == pic || jt->pic->IsParent(pic)) { // 親が共通、かつ領域も共通
+					jt->rpos = Rect(0,0); // empty rect をセット
 					jt->apos = Rect(0,0);
 				}
-			} else if (jt->apos.is_inner(apos)) { // ���˼�ʬ����ޤ����
-				if (jt->pic == pic || jt->pic->IsParent(pic)) { // �Ƥ����̡������ΰ�ⶦ��
+			} else if (jt->apos.is_inner(apos)) { // 相手に自分が包含される
+				if (jt->pic == pic || jt->pic->IsParent(pic)) { // 親が共通、かつ領域も共通
 					it->rpos = Rect(0,0);
 					it->apos = Rect(0,0);
 					break;
@@ -955,7 +955,7 @@ Surface* PicRoot::NewSurface(const char*
 	if (with_mask == COLOR_MASK) {
 		SDL_SetColorKey( (SDL_Surface*)s, SDL_SRCCOLORKEY, *(Uint32*)s->pixels);
 	}
-	/* xkanon �λij� */
+	/* xkanon の残骸 */
 	if (strcmp(f, "grdat") == 0)
         	SDL_SetColorKey(s, SDL_SRCCOLORKEY, 0x55aa66);
 	return s;
@@ -1039,7 +1039,7 @@ bool PicRoot::with_mask(Surface* s) {
 void PicRoot::SetWindowCaption(const char* caption) {
 #if USE_X11
 //	SDL_WM_SetCaption(caption, 0);
-	// SDL�δؿ��Ǥ�2�Х���ʸ���򥵥ݡ��Ȥ��Ƥ���ʤ��Τǡ�Ʊ�������Ƥ˽���
+	// SDLの関数では2バイト文字をサポートしてくれないので、同等の内容に修正
 	SDL_SysWMinfo info;
 	memset(&info,0,sizeof(info));
 	SDL_VERSION(&(info.version));
--- a/window/picture.h
+++ b/window/picture.h
@@ -44,7 +44,7 @@ namespace Event {
 	class Video;
 }
 
-/* PicBase �����Ƥ򥤥٥�Ȥ�Ϣư�����뤿��Υ��󥿡��ե����� */
+/* PicBase の内容をイベントと連動させるためのインターフェース */
 class PicAnm {
 	public:
 		typedef std::vector<PicBase*>::iterator iterator;
@@ -104,7 +104,7 @@ class PicBase {
 		**		the latter form is used for 'rel_pos',
 		**		because rel_pos is defined as the relative position to the parent
 		*/
-		Rect QueryAbsPos(Rect& ppos); // ���� picture ��� rel_pos ��ɽ������Τ˼ºݤ�ɬ�פ����к�ɸ������
+		Rect QueryAbsPos(Rect& ppos); // この picture 内の rel_pos を表示するのに実際に必要な絶対座標を得る
 
 		static Rect child_pos(Rect rpos, PicBase* child) { /* return 'cpos' */
 			rpos.intersect(child->rel_pos);
@@ -129,9 +129,9 @@ class PicBase {
 
 		virtual void RMove(int add_x, int add_y);
 		void Move(int new_rx, int new_ry);
-		#define ZMOVE_TOP ((PicBase*)0xffff00ff) /* �����̤� */
-		#define ZMOVE_BOTTOM ((PicBase*)0xffff0fff) /* �����̤� */
-		void ZMove(PicBase* back); // back �����˰�ư(back �ȼ�ʬ��Ʊ���Ƥ���Ĥ���)
+		#define ZMOVE_TOP ((PicBase*)0xffff00ff) /* 最前面へ */
+		#define ZMOVE_BOTTOM ((PicBase*)0xffff0fff) /* 最背面へ */
+		void ZMove(PicBase* back); // back の前に移動(back と自分は同じ親を持つこと)
 
 		void SetSurface(Surface* new_surface, int x, int y, int attribute = 0);
 		void SetSurface(const char* new_surface, int x, int y);
@@ -166,8 +166,8 @@ class PicContainer : public PicBase {
 	private:
 		friend class PicBase;
 
-		void BlitBack(iterator z, Rect rpos); // z �������������
-		void BlitFront(iterator z, Rect rpos); // z ��ޤᡢz��������ΰ������
+		void BlitBack(iterator z, Rect rpos); // z より後ろの領域を描画
+		void BlitFront(iterator z, Rect rpos); // z を含め、zより前の領域を描画
 		void BlitChildren(Rect rpos);
 		void BlitSelf(Rect rpos);
 		void BlitSelf(void) {
@@ -212,8 +212,8 @@ struct PicRoot {
 		void ExecUpdate(void);
 		void SetWindowCaption(const char* caption);
 
-		// Surface ���
-		Surface* NewSurfaceFromRGBAData(int w, int h, char* data, MaskType with_mask) const; // data �� malloc ���줿��ΤǤ��뤳��(SDL����������)
+		// Surface 操作
+		Surface* NewSurfaceFromRGBAData(int w, int h, char* data, MaskType with_mask) const; // data は malloc されたものであること(SDLの内部仕様)
 		Surface* NewSurface(int w, int h, MaskType with_mask) const;
 		Surface* NewSurface(const char* filename, MaskType with_mask = ALPHA_MASK);
 		Surface* RotZoomSurface(Surface* from, double zoom, double rotate_angle);
@@ -239,7 +239,7 @@ struct PicRoot {
 
 class PicWidget {
 	private:
-		PicBase* pic; /* ����Ѿ�����٤��������ٱ������������Τ� instance */
+		PicBase* pic; /* 本来継承するべきだが、遅延初期化したいので instance */
 	public:
 		PicWidget(void);
 		virtual ~PicWidget();
--- a/window/render.cc
+++ b/window/render.cc
@@ -172,7 +172,7 @@ void DSurfaceMove(Surface* src_o, const 
 	SDL_Surface* dst = (SDL_Surface*)dst_o;
 	SDL_Surface* src = (SDL_Surface*)src_o;
 
-	if (dst->format->BytesPerPixel != src->format->BytesPerPixel) return; // RGB�Ѵ��ϤǤ��ʤ�
+	if (dst->format->BytesPerPixel != src->format->BytesPerPixel) return; // RGB変換はできない
 
 	Rect srcrect(srcrect_o), dstrect(dstrect_o);
 	clip_rect(srcrect, dstrect, dst);
@@ -188,7 +188,7 @@ void DSurfaceMove(Surface* src_o, const 
 	char* smem_end = src_o->mem_end(srcrect);
 	char* dmem_end = dst_o->mem_end(dstrect);
 
-	// ����˽Ťʤ꤬���ꡢsrc �����¦�ξ�硢���ԡ��������ž����
+	// メモリに重なりがあり、src が上位側の場合、コピー方向を逆転する
 	if (smem < dmem && dmem < smem_end) {
 		int i,j;
 		for (i=0; i<height; i++) {
@@ -221,7 +221,7 @@ void DSurfaceFillA(Surface* dsto, const 
 	char* dmem = (char*)(dst->pixels) + rect.ty*dbpl + rect.lx*bpp;
 	unsigned int pixel = SDL_MapRGBA(dst->format, r, g, b, 0);
 	unsigned int pixela = SDL_MapRGBA(dst->format, r, g, b, a);
-	a += a>>7; /* 0-256 �ˤ��� */
+	a += a>>7; /* 0-256 にする */
 	int i, j;
 	for (i=0; i<height; i++) {
 		char* d = dmem;
@@ -281,7 +281,7 @@ static void blit_line(Uint32* dest, Uint
 	int j;
 	int ax = ax0;
 	const unsigned char* a = alpha + ax0;
-	if (awidth == 1) { //  ���Ȥ褯����ΤǺ�Ŭ��
+	if (awidth == 1) { //  わりとよくあるので最適化
 		for (j=aj0; j < aj1; j++) {
 			blit_pixel(dest++, src++, alpha, use_srcalpha);
 		}
@@ -357,7 +357,7 @@ void DSurfaceBlitAdd(Surface* src_o, con
 	SDL_Surface* dst = (SDL_Surface*)dst_o;
 	SDL_Surface* src = (SDL_Surface*)src_o;
 
-	if (dst->format->BytesPerPixel != src->format->BytesPerPixel) return; // RGB�Ѵ��ϤǤ��ʤ�
+	if (dst->format->BytesPerPixel != src->format->BytesPerPixel) return; // RGB変換はできない
 
 	Rect srcrect(srcrect_o), dstrect(dstrect_o);
 	clip_rect(srcrect, dstrect, dst);
@@ -437,7 +437,7 @@ void DSurfaceBlitMultiply(Surface* src_o
 	char* smem = src_o->mem(srcrect);
 
 	SDL_PixelFormat& fmt = *dst->format;
-	/* dst �� 0-255 �� 0-pixel ���Ѵ�������ѻ��� */
+	/* dst の 0-255 を 0-pixel に変換する(積算) */
 	int i;
 	int table1[256], table2[256], table3[256];
 	Uint32 src_pixel = *(Uint32*)smem;
--- a/window/render.h
+++ b/window/render.h
@@ -32,11 +32,11 @@
 #include "surface.h"
 
 Rect DSurfaceRenderText(TextGlyphStream::iterator start, TextGlyphStream::iterator end, const Rect& srcrect,
-						Surface* dst, const Rect& dstrect); // Êž»úÉÁ²è
+						Surface* dst, const Rect& dstrect); // 文字描画
 
-void DSurfaceFill(Surface* src, const Rect& rect, int r, int g, int b, int a=0xff); // ¥¯¥ê¥¢
-void DSurfaceFillA(Surface* src, const Rect& rect, int r, int g, int b, int a=0xff); // ¥Æ¥­¥¹¥È¥Š¥£¥ó¥É¥ŠÇØ·Ê€ÎÀßÄê
-void DSurfaceMove(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect); // ¥³¥Ô¡Œ
+void DSurfaceFill(Surface* src, const Rect& rect, int r, int g, int b, int a=0xff); // クリア
+void DSurfaceFillA(Surface* src, const Rect& rect, int r, int g, int b, int a=0xff); // テキストウィンドウ背景の設定
+void DSurfaceMove(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect); // コピー
 void DSurfaceBlitAlpha(Surface* src_o, const Rect& srcrect_o, Surface* dst_o, const Rect& dstrect_o, const unsigned char* alpha, const Rect& alpharect);
 void DSurfaceBlitAdd(Surface* src_o, const Rect& srcrect, Surface* dst_o, const Rect& dstrect, unsigned char alpha);
 void DSurfaceBlitMultiply(Surface* src_o, const Rect& srcrect_o, Surface* dst_o, const Rect& dstrect_o);
--- a/window/system.cc
+++ b/window/system.cc
@@ -79,12 +79,12 @@ namespace System {
 				old_time = start_time;
 			}
 
-	// ���ꡧ
-	// z ���� xy ������ߴ��ġ���®��
-	// ��ư���륦�����å�����ι�®��
-	// ������
-	// ʸ����ΰ����Τ߹����ι�®��
-	// �ֳ��� z �� x �ʤ��ΰ�̵������y �ʤ��ΰ������פ��ɤ�����Expose
+	// 問題:
+	// z 軸と xy 軸の相互干渉;高速化
+	// 移動するウィジット描画の高速化
+	// キャッシュ
+	// 文字列の一部のみ更新の高速化
+	// 「階層 z で x なる領域無効化、y なる領域生成」で良い?>Expose
 	/*
 			Uint32 end_time = SDL_GetTicks();
 			Uint32 delay = (end_time-start_time);
@@ -98,7 +98,7 @@ namespace System {
 	void Main::SetCursor(Surface* s, const Rect& r) {
 		if (instance == NULL) return;
 		if (instance->cursor) delete instance->cursor;
-		if (s == NULL) { // ��������õ�
+		if (s == NULL) { // カーソル消去
 			instance->cursor = NULL;
 		} else if (s == DEFAULT_MOUSECURSOR) {
 			instance->cursor = NULL;
--- a/window/widget.cc
+++ b/window/widget.cc
@@ -142,9 +142,9 @@ MouseCursor::~MouseCursor() {
 
 bool MouseCursor::Motionfunc(int x, int y, void* pointer) {
 	MouseCursor* _this = (MouseCursor*)pointer;
-	// ���夬��������ݥ���Ȥξ��
+	// 左上がカーソルポイントの場合
 	// _this->Pic()->Move(x,y);
-	// ��������������ݥ���Ȥξ��
+	// 左下がカーソルポイントの場合
 	_this->Pic()->Move(x,y-_this->Pic()->Height());
 	return true;
 }
@@ -196,7 +196,7 @@ void Button::Toggle(bool new_toggle) {
 		return;
 	}
 	is_toggled = new_toggle;
-	// if (is_in) return; // is_in �˴ؤ�餺�������åȤ�ɽ�����ѹ����뤳�Ȥˤ���
+	// if (is_in) return; // is_in に関わらずウィジットの表示を変更することにする
 	if (is_toggled) {
 		if (nptn > 2)
 			Pic()->SetSurfacePos(sx+sdx*2, sy+sdy*2);
@@ -252,26 +252,26 @@ extern char* create_box(int& width, int&
 
 void Scale::Init(Rect r_orig) {
 	int r=cursor_color.r, g=cursor_color.g, b=cursor_color.b;
-	// ���
+	// 矢印
 	int arrow_width = -1;
 	cursor_width = -1;
 	char* button1;
 	char* button2;
 	if (is_vertical) {
-		// �����ɬ�פ��ΰ����
+		// 矢印に必要な領域確保
 		int arrow_height = r_orig.width();
 		button1 = create_button(2, arrow_height, arrow_width, r, g, b);
 		button2 = create_button(3, arrow_height, arrow_width, r, g, b);
 		if (r_orig.height() < arrow_width*4) {
-			if (r_orig.height() < 8) r_orig.by = r_orig.ty + 8; // ������������϶����ѹ�
+			if (r_orig.height() < 8) r_orig.by = r_orig.ty + 8; // 小さすぎる場合は強制変更
 			free( (void*)button1);
 			free( (void*)button2);
 			arrow_width = r_orig.height()/4;
-			// �Ƴ������
+			// 再割り当て
 			button1 = create_button(2, arrow_height, arrow_width, r, g, b);
 			button2 = create_button(3, arrow_height, arrow_width, r, g, b);
 		}
-		// ����ܥ���κ���
+		// 矢印ボタンの作成
 		Surface* a1s = parent->Root().NewSurfaceFromRGBAData(arrow_height, arrow_width*3, button1, ALPHA_MASK);
 		int x = r_orig.lx; int y = r_orig.ty;
 		arrow_up = new Button(container, parent, a1s, 0, 0, 0, arrow_width, 3, Rect(x,y,x+arrow_height,y+arrow_width),1);
@@ -280,32 +280,32 @@ void Scale::Init(Rect r_orig) {
 		x = r_orig.rx - arrow_height; y = r_orig.by - arrow_width;
 		arrow_down = new Button(container, parent, a2s, 0, 0, 0, arrow_width, 3, Rect(x,y,x+arrow_height,y+arrow_width),1);
 		arrow_down->Pic()->SetSurfaceFreeFlag();
-		// picture�����ʥܥ����ư���ΰ��
+		// picture作成(ボタンの動く領域)
 		Rect r = r_orig;
 		r.ty += arrow_width;
 		r.by -= arrow_width;
 		panel = parent->create_node(r, 0);
 		SetPic(panel);
-		// �ܥ�����濴�������衢����
+		// ボタンの中心線を描画、設定
 		Surface* s = parent->Root().NewSurface(r.width()/2, r.height(), ALPHA_MASK);
 		DSurfaceFill(s, Rect(0,0,r.width()/2,r.height()), 0, 0, 0, 0xff);
 		Pic()->SetSurface(s, -r.width()/4, 0, 0);
 		Pic()->SetSurfaceFreeFlag();
 	} else {
-		// �����ɬ�פ��ΰ����
+		// 矢印に必要な領域確保
 		int arrow_height = r_orig.height();
 		button1 = create_button(0, arrow_width, arrow_height, r, g, b);
 		button2 = create_button(1, arrow_width, arrow_height, r, g, b);
 		if (r_orig.width() < arrow_width*4) {
-			if (r_orig.width() < 8) r_orig.rx = r_orig.lx + 8; // ������������϶����ѹ�
+			if (r_orig.width() < 8) r_orig.rx = r_orig.lx + 8; // 小さすぎる場合は強制変更
 			free( (void*)button1);
 			free( (void*)button2);
 			arrow_width = r_orig.width()/4;
-			// �Ƴ������
+			// 再割り当て
 			button1 = create_button(2, arrow_width, arrow_height, r, g, b);
 			button2 = create_button(3, arrow_width, arrow_height, r, g, b);
 		}
-		// ����ܥ���κ���
+		// 矢印ボタンの作成
 		Surface* a1s = parent->Root().NewSurfaceFromRGBAData(arrow_width, arrow_height*3, button1, ALPHA_MASK);
 		int x = r_orig.lx; int y = r_orig.ty;
 		arrow_up = new Button(container, parent, a1s, 0, 0, 0, arrow_height, 3, Rect(x,y,x+arrow_width,y+arrow_height),1);
@@ -314,13 +314,13 @@ void Scale::Init(Rect r_orig) {
 		x = r_orig.rx - arrow_width; y = r_orig.by - arrow_height;
 		arrow_down = new Button(container, parent, a2s, 0, 0, 0, arrow_height, 3, Rect(x,y,x+arrow_width,y+arrow_height),1);
 		arrow_down->Pic()->SetSurfaceFreeFlag();
-		// picture�����ʥܥ����ư���ΰ��
+		// picture作成(ボタンの動く領域)
 		Rect r = r_orig;
 		r.lx += arrow_width;
 		r.rx -= arrow_width;
 		panel = parent->create_node(r, 0);
 		SetPic(panel);
-		// �ܥ�����濴�������衢����
+		// ボタンの中心線を描画、設定
 		Surface* s = parent->Root().NewSurface(r.width(), r.height()/2, ALPHA_MASK);
 		DSurfaceFill(s, Rect(0,0,r.width(),r.height()/2), 0, 0, 0, 0xff);
 		Pic()->SetSurface(s, 0, -r.height()/4, 0);
@@ -344,14 +344,14 @@ void Scale::InitCursor(int width_ratio) 
 	if (width_ratio < 0) width_ratio = 0;
 	else if (width_ratio > 1024) width_ratio = 1024;
 	if (is_vertical) {
-		if (width_ratio == 0) cursor_width = Pic()->Width() * 3 / 2; // ����1.5��
+		if (width_ratio == 0) cursor_width = Pic()->Width() * 3 / 2; // 幅の1.5倍
 		else cursor_width = Pic()->Height()*width_ratio/1024;
-		if (cursor_width <= 0) return; // ��������ʤ��ʤ����Τ�����
+		if (cursor_width <= 0) return; // カーソルなし(いいのか?)
 		region = Rect(0, 0, Pic()->Width(), cursor_width);
 	} else { // horizontal
-		if (width_ratio == 0) cursor_width = Pic()->Height() * 3 / 2; // �⤵��1.5��
+		if (width_ratio == 0) cursor_width = Pic()->Height() * 3 / 2; // 高さの1.5倍
 		else cursor_width = Pic()->Width()*width_ratio/1024;
-		if (cursor_width <= 0) return; // ��������ʤ��ʤ����Τ�����
+		if (cursor_width <= 0) return; // カーソルなし(いいのか?)
 		region = Rect(0, 0, cursor_width, Pic()->Height());
 	}
 
@@ -368,7 +368,7 @@ void Scale::InitCursor(int width_ratio) 
 	cursor->drag_pointer = (void*)this;
 	cursor->show();
 
-	// ������򥯥�å������Ȥ��ΰ�ư�̷׻�
+	// 矢印等をクリックしたときの移動量計算
 	int bar_width;
 	if (is_vertical) bar_width = Pic()->Height();
 	else bar_width = Pic()->Width();
@@ -479,7 +479,7 @@ TextButton::TextButton(Event::Container&
 	fore(_fore), pressed(_pressed), back(_back)
 {
 	bool rect_changed = false;
-	// �ޤ����ƥ������ΰ�ι���������
+	// まず、テキスト領域の広さを得る
 	Rect r(r_orig);
 
 	if (text == NULL) text = "";
@@ -489,7 +489,7 @@ TextButton::TextButton(Event::Container&
 	TextStream ts = TextStream::ParseMoji(text, _fore.r , _fore.g, _fore.b, text_size);
 	TextGlyphStream gs = DefaultLayout(text_size)->Layout(ts, width);
 
-	if (r.width() == 0) { // ʸ���˹�碌�ƥ������åȺ���
+	if (r.width() == 0) { // 文字に合わせてウィジット作成
 		rect_changed = true;
 		width = gs.width() + text_size;
 		r.rx = r.lx + gs.width();
@@ -502,7 +502,7 @@ TextButton::TextButton(Event::Container&
 	}
 
 	if (rect_changed) {
-		// �礭���ѹ�
+		// 大きさ変更
 		Pic()->SetSurfaceRect(r);
 	}
 
@@ -515,7 +515,7 @@ TextButton::TextButton(Event::Container&
 	y = (Pic()->Height() - gs.height()) / 2;
 
 	//FIXME: (back.a == NULL ?)
-	if (back.a == 0) { // �طʤʤ����⤷���ϥܥ��󲡤ξ��֤Τ��طʤ���
+	if (back.a == 0) { // 背景なし、もしくはボタン押の状態のみ背景あり
 		surface = root.NewSurface(r.width(), r.height()*2, ALPHA_MASK);
 		DSurfaceFill(surface, Rect(*surface), 0, 0, 0, 0);
 		if (attribute & REVERSE) {
@@ -532,8 +532,8 @@ TextButton::TextButton(Event::Container&
 			DSurfaceRenderText(gs.begin(), gs.end(), Rect(0,0,gs.width(),gs.height()), surface, Rect(x,y+r.height()));
 		}
 		nptn = 2;
-	} else { // �ܥ��󷿤��طʤ���
-		/* ��٥��Ѥ� Surface ���� */
+	} else { // ボタン型の背景あり
+		/* ラベル用の Surface を作る */
 		width = r.width(); height = r.height();
 		char* box = create_box(width, height, back.r, back.g, back.b);
 		surface = root.NewSurfaceFromRGBAData(r.width(), r.height()*3, box, ALPHA_MASK);
@@ -558,7 +558,7 @@ TextButton::TextButton(Event::Container&
 void TextButton::SetText(const char* text, const Color& _fore, const Color& _pressed, const Color& _back)
 {
 	int width = Pic()->Width(); int height = Pic()->Height();
-	// �ޤ����ƥ������ΰ�ι���������
+	// まず、テキスト領域の広さを得る
 	if (text == NULL) text = "";
 
 	TextGlyphStream gs = DefaultLayout(text_size)->Layout(text, width);
@@ -575,7 +575,7 @@ void TextButton::SetText(const char* tex
 	surface = NULL;
 
 	//FIXME: (back.a == NULL) ?
-	if (back.a == 0) { // �طʤʤ�
+	if (back.a == 0) { // 背景なし
 		surface = root.NewSurface(width, height*2, ALPHA_MASK);
 		DSurfaceFill(surface, Rect(*surface), 0, 0, 0, 0);
 		if (attribute & REVERSE) {
@@ -589,7 +589,7 @@ void TextButton::SetText(const char* tex
 		gs.SetReverse(false);
 		nptn = 2;
 	} else {
-		/* ��٥��Ѥ� Surface ���� */
+		/* ラベル用の Surface を作る */
 		char* box = create_box(width, height, _back.r, _back.g, _back.b);
 		surface = root.NewSurfaceFromRGBAData(width, height*3, box, ALPHA_MASK);
 	
@@ -701,7 +701,7 @@ label_wait:
 	cursor_activated = false;
 	if (cursor) cursor->hide();
 	while(cur_pos != gstream.end()) {
-		// ���������뤷�Ƥϼ������衢�򷫤��֤�
+		// スクロールしては次行描画、を繰り返す
 		for (scroll_height = CalcScrollHeight(); scroll_height > 0; scroll_height--) {
 			status = SCROLL;
 label_scroll:
@@ -763,7 +763,7 @@ void Text::Start(void) {
 	bottom_pos.clear();
 	layout.Layout(stream, gstream, bottom_pos, pictext->Width()-fontsize/2);
 
-	// height ���ѻ��ͤȤ��� bottom_pos ��׻�
+	// height の積算値として bottom_pos を計算
 	std::vector<int>::iterator it;
 	int pos = 0;
 	for (it = bottom_pos.begin(); it != bottom_pos.end(); it++) {
@@ -783,13 +783,13 @@ void Text::Start(void) {
 }
 
 void Text::DrawText(int& nChar) {
-	// �����ϰϤ�����
+	// 描画範囲を得る
 	iterator end = gstream.end();
 	iterator it = cur_pos;
-	while(nChar && it != end) { // nChar < 0 �ʤ����������ʸ��������
+	while(nChar && it != end) { // nChar < 0 なら出来るだけの文字を描画
 		if (! (it->flag & TextGlyph::Group)) nChar--;
 		if (it->flag & TextGlyph::LineEnd) {
-			if (bottom_pos[line_number+1] > srcrect.by) { //���Ԥ���Ȳ��̤���ФƤ��ޤ�
+			if (bottom_pos[line_number+1] > srcrect.by) { //改行すると画面から出てしまう
 				it++;
 				if (nChar == 0) nChar = 1;
 				break;
@@ -798,14 +798,14 @@ void Text::DrawText(int& nChar) {
 		}
 		it++;
 	}
-	// ���褹��
+	// 描画する
 	Rect r = DSurfaceRenderText(cur_pos, it, srcrect, surface, Rect(0,0,0,0));
 	pictext->ReBlit(r);
 	cur_pos = it;
 }
 
 void Text::Scrollup(int& nChar) {
-	if (nChar < 0) { // �����ʬ���������뤹��
+	if (nChar < 0) { // 一画面分スクロールする
 		DSurfaceFill(surface, Rect(*surface), 0, 0, 0, 0);
 		pictext->ReBlit();
 		srcrect = Rect(*surface);
@@ -814,7 +814,7 @@ void Text::Scrollup(int& nChar) {
 		scrolled_count = 0;
 		return;
 	}
-	// �����������������
+	// スクロール幅を求める
 	const int max_scroll_count = 8;
 	int dy = bottom_pos[line_number+1] - bottom_pos[line_number];
 	int cur_dy;
@@ -873,7 +873,7 @@ Label::Label(PicContainer* parent, const
 
 	TextGlyphStream gs = DefaultLayout(text_size)->Layout(text, width);
 
-	if (r.width() == 0) { // ʸ���˹�碌�ƥ������åȺ���
+	if (r.width() == 0) { // 文字に合わせてウィジット作成
 		width = gs.width();
 		r.rx = r.lx + gs.width();
 	}
@@ -883,7 +883,7 @@ Label::Label(PicContainer* parent, const
 
 	SetPic(parent->create_leaf(r, 0));
 
-	/* ��٥��Ѥ� Surface ���� */
+	/* ラベル用の Surface を作る */
 	surface = parent->Root().NewSurface(r.width(), r.height(), ALPHA_MASK);
 	
 	DSurfaceFill(surface, Rect(*surface), 0, 0, 0, 0);
@@ -927,18 +927,18 @@ Dialog::Dialog(Event::Container& contain
 
 	XKFont::HorizLayout& layout = *DefaultLayout(26);
 	int dialog_width = parent->Width() / 2;
-	TextGlyphStream s_ok = layout.Layout("�ϣ�", dialog_width);
-	TextGlyphStream s_cancel = layout.Layout("���", dialog_width);
+	TextGlyphStream s_ok = layout.Layout("OK", dialog_width);
+	TextGlyphStream s_cancel = layout.Layout("取消", dialog_width);
 	TextGlyphStream s_text = layout.Layout(text, dialog_width);
 
 	Rect r_text(0, 0, s_text.width(), s_text.height());
 	Rect r_ok(0, 0, s_ok.width(), s_ok.height());
 	Rect r_cancel(0, 0, s_cancel.width(), s_cancel.height());
 
-	/* �����������ܥå����� Surface ���� */
+	/* ダイアログボックスの Surface を作る */
 	int dwidth = r_text.width() + (r_text.width()/10)*2 + 6;
 	int dheight = r_text.height() + r_ok.height() + r_cancel.height()*3 + 4;
-	surface_diag = parent->Root().NewSurface(dwidth, dheight, NO_MASK); // alpha �ʤ�
+	surface_diag = parent->Root().NewSurface(dwidth, dheight, NO_MASK); // alpha なし
 	DSurfaceFill(surface_diag, Rect(*surface_diag), 0xf0, 0xd0, 0xa0);
 	DrawBox(surface_diag, Rect(0,0,dwidth,dheight));
 
@@ -950,20 +950,20 @@ Dialog::Dialog(Event::Container& contain
 	parent->Root().BlitSurface(surface_text, r_text, surface_diag, Rect(x, y, x+r_text.width(), y+r_text.height()));
 	parent->Root().DeleteSurface(surface_text);
 
-	/* panel ��Ĥ��� */
+	/* panel をつくる */
 	x = (parent->Width()-dwidth)/2;
 	y = (parent->Height()-dheight)/2;
 	SetPic(parent->create_node(Rect(x, y, x+dwidth, y+dheight), 0));
 
-	/* �ܥ����������� */
-	/* f8d8c8 �ط�(��)*/
-	/* f0d0a0 �ط�*/
-	/* b08040 �ȡ���)*/
-	/* 805010 ��*/
-	/* 382018 ��*/
-	/* 9890f8 ��*/ 
-	/* dc6448 ��*/
-	/* �ƥܥ���Ϻ����˥ܥ������� 1/4, �岼�˥ܥ������� 1/4 �Υޡ��������� */
+	/* ボタンを作成する */
+	/* f8d8c8 背景(明)*/
+	/* f0d0a0 背景*/
+	/* b08040 枠(明)*/
+	/* 805010 枠*/
+	/* 382018 黒*/
+	/* 9890f8 青*/ 
+	/* dc6448 赤*/
+	/* 各ボタンは左右にボタン幅の 1/4, 上下にボタン幅の 1/4 のマージンを持つ */
 	Rect r_btn(r_ok); r_btn.join(r_cancel);
 	int btn_width = r_btn.width() * 3 / 2;
 	int btn_height = r_btn.height() * 3 / 2;
@@ -1184,8 +1184,8 @@ void AnmAlphaMove::Exec(int count) {
 	if (ptns.empty()) return;
 	if (cur_count != 0 && ptns[cur_count].next_tick > count) return;
 	if (cur_count >= ptns.size()) return;
-	// ���Υѥ������õ��
-	// count <= it->next_tick �ʤ�����������Ǹ�� it ��õ��
+	// 次のパターンを探す
+	// count <= it->next_tick なる条件を満たす最後の it を探す
 	std::vector<Ptn>::iterator it;
 	for (it=ptns.begin()+cur_count; it != ptns.end(); it++) {
 		if (count <= it->next_tick) break;
@@ -1212,7 +1212,7 @@ void AnmAlphaMove::Finish(void) {
 	if (ptns.empty()) return;
 	if (cur_count >= ptns.size() - 1) return;
 	cur_count = ptns.size() - 1;
-	Exec(ptns[cur_count].next_tick); // �Ǹ�� pattern �ξ��֤ˤ���
+	Exec(ptns[cur_count].next_tick); // 最後の pattern の状態にする
 }
 
 AnmPtnSolid::AnmPtnSolid(Event::Container& container, PicBase* _pic, const unsigned char* _ptn, const Rect& _alpha_r, int total_time) :
@@ -1288,68 +1288,68 @@ void AnmPtnAlpha::Finish(void) {
 
 /*
 
-Widget ���
-	Mouse: �ޥ������֤�Ϣư���롣Surface �� origin ��ɬ��
-	Panel : �ʤˤ�¸�ߤ��ʤ��Ȥ�����ĥ��Ĥ��Ƥ���
-		�ط�ĥ��Ĥ����ǽ
-		ButtonPanel : ̵������ǽ��Group �� Button ��������������ä��顢��Button / Label ���֥������벼�׾��֤ˤʤ�
-			Ʊ���ѿ��򰷤��ܥ���ϸ�§��Ʊ��ButtonPanel �β������뤳�ȡ�Ʊ�����롣��®����ǽ��
-			�����Ǥʤ���硢�ܥ���� GlobalVariable �ե饰��Ω�Ƥ�ɬ�פ�����
-		�طʼ��ࡧWindow
-			������Ʃ���٤��ȷ����̡��˻����ǽ���ȷ������ȡ���ʬ�Ȥɤ���η��Ǥ��ǽ
-			����ʬ�Ȥʤ顢����Ū�ˤϾ��ȡ����ȡ������Ȥ��� Surface �Ǵ��������
+Widget の種類
+	Mouse: マウス位置に連動する。Surface と origin が必須
+	Panel : なにも存在しないところに張りつけていく
+		背景張りつけも可能
+		ButtonPanel : 無効化可能。Group の Button がカーソルに入ったら、全Button / Label が「カーソル下」状態になる
+			同一変数を扱うボタンは原則、同一ButtonPanel の下に入ること(同期する。高速化可能)
+			そうでない場合、ボタンの GlobalVariable フラグを立てる必要がある
+		背景種類:Window
+			内部の透明度と枠形を別々に指定可能。枠形は全枠、部分枠どちらの形でも可能
+			(部分枠なら、内部的には上枠、下枠、左右枠と別 Surface で管理する)
 		DragButton
-			Panel ���Τ�ɥ�å���������ѹ��Ǥ���ܥ���
-	Button: ̵�������̾�䥫�����벼��ܥ��󲡲� ��picture / animation
-		Toggle Button �ˤǤ���(Group�������RadioButton�ˤ�Ǥ���)
-	Label : ̵�������̾�䥫�����벼����animation
-		animation ��
-		����ؤ��Ѳ�
-		�����ؤ��Ѳ�
-		������ѷ�
-		�Σ��Ĥη������ġ�
-		������
-		��x / y increment �ˤ������ΰ�� x,y ���礭������ꤹ��Ⱥ��夫�鱦�塢�������Ȥ������ؾ�����ΰ���ѹ����Ƥ�����
-		�����Ѳ��������Ѳ��ˡ����ơ��֥����ꤹ�롣Surface �� alpha �ΤߤȤ���
-			�ɤ���⡢��ĤΥ�٥�˻Ȥ����֤�Ĺ������ꤹ��
-		��callback �ˤ�롣���ꤷ��������ְʾ夬Ω�Ĥ�CallBack ���ƤӽФ��졢������Surface , origin ����ꤹ�롣
+			Panel 全体をドラッグし、場所変更できるボタン。
+	Button: 無効化>通常>カーソル下>ボタン押下 のpicture / animation
+		Toggle Button にできる(Group化すればRadioButtonにもできる)
+	Label : 無効化>通常>カーソル下 のanimation
+		animation は
+		・上への変化
+		・下への変化
+		・常時変形
+		の3つの形式をもつ。
+		形式は
+		・x / y increment による(全領域と x,y の大きさを指定すると左上から右上、左下、という方へ勝手に領域を変更していく)
+		・色変化(明度変化)。色テーブルを指定する。Surface は alpha のみとする
+			どちらも、一つのラベルに使う時間の長さを指定する
+		・callback による。指定した一定時間以上が立つとCallBack が呼び出され、新たなSurface , origin を指定する。
 
-		��Surface ��
-			���̤β���
-			ʸ�����Ŭ���˲��۲���
-			����������
-		�Τ����줫
+		・Surface は
+			普通の画像
+			文字列(適当に仮想化)
+			画像数値列
+		のいずれか
 	Cursor
-		�꥿���󥫡����롣Label �ΰ�
+		リターンカーソル。Label の一種。
 	Number
-		������ɽ�����롣�ե���Ȥ��礭�����⤷���ϲ���������
+		数字を表示する。フォントの大きさ、もしくは画像数値列
 	Text
-		�ƥ����Ȥ�ɽ������
-		�ѥͥ���礭���������ꤹ���Ŭ���ˤ�äƤ����
-		��������ΰ��֡�ʸ���μ�/�ǽ��ˤ���ꤹ�뤳��
-		��ǽ��ʸ������®�����ꡢ�ɤ����Ф�����ʾ�˺ǹ�®�Dz����äѤʤ���
-	ProgressBar �ʤ�
-		�С���Ĺ�������뤤�ϰ��֤��ѿ����礭���򼨤���
-		Tick, Max ����ꡢ�ѿ����Ѳ��ˤ�Ŭ�����б��Ǥ���褦�ˤ���
-		�С��������Ȥ��ƽ�/����Surface �Ϸ����֤��ǻȤ���®�پ塢32pixel ���餤���ä��ۤ����������⡩��
-		�С�������˥ܥ����Ȥ��롣Surface ����Υ᥽�åɤ��㤦������
-		���ץ���󡧥С��Τɤ����򥯥�å����줿�Ȥ��������˰�ư���뤫�����˸����äư�ư���뤫
-		���ץ���󡩡�����ܥ���ʤ���ʤ�����
+		テキストを表示する
+		パネルの大きさだけ指定すると適当にやってくれる
+		カーソルの位置(文字の次/最終)を指定すること
+		機能:文字送り速度設定、読み飛ばし設定(常に最高速で押しっぱなし)
+	ProgressBar など
+		バーの長さ、あるいは位置で変数の大きさを示す。
+		Tick, Max を指定、変数の変化には適当に対応できるようにする
+		バーの方向として縦/横。Surface は繰り返しで使う(速度上、32pixel くらいあったほうがいいかも?)
+		バーの代わりにボタンも使える。Surface 指定のメソッドが違うだけ。
+		オプション:バーのどこかをクリックされたとき、そこに移動するかそこに向かって移動するか
+		オプション?:矢印ボタン(いらないか)
 	ScrollBar
-		��/�ġ�Panel ��Ϣư����(����, ProgressBar �ΰ��Ȥ��Ƽ���)
-		(Panel ¦�ǡָ����ʤ���ʬ��delete, ��������ʬ�ϼ�ư�Ǻ����׵�ǽ��Ĥ��롩���Хå�������
+		横/縦。Panel と連動する(専用, ProgressBar の一種として実装)
+		(Panel 側で「見えない部分はdelete, 見える部分は自動で作成」機能をつける?:バックログ)
 
 	
 	
-��˥塼�νФ���
-	������å�
-	�ܥ���򲡤�
-	��������������ʤ��ΰ�˹Ԥ��ȥ̤äȽФƤ���
-��˥塼�⡼����
-	�ܥ���򲡤��ƽ�λ
-	�ޥåפ��äƤ������ƥ�˥塼��̾�����꿶����󼡸��˹����ä���˥塼�ˤʤ�
-	̾�����꿶��Ⱦ��̾���ꥹ�Ȥ��ǤƤ���
-	̾�����꿶��Ȳ���̾���ꥹ�Ȥ��ФƤ���
+メニューの出し方
+	右クリック
+	ボタンを押す
+	上の方、右の方など領域に行くとヌっと出てくる
+メニューモード内
+	ボタンを押して終了
+	マップを作っておき、各メニューに名前を割り振ると二次元に広がったメニューになる
+	名前を割り振ると上に名前リストがでてくる
+	名前を割り振ると横に名前リストが出てくる
 
 */
 // }
--- a/window/widget.h
+++ b/window/widget.h
@@ -87,7 +87,7 @@ struct Button : public Event::Video, Pic
 	DragFunc drag_func;
 	void* drag_pointer;
 
-	/* �Ѿ� */
+	/* 継承 */
 	void activate(void) { Event::Video::activate();}
 	void deactivate(void) { Event::Video::deactivate();}
 	void SetRegion(const Rect& new_rect) { Event::Video::SetRegion(new_rect);}
@@ -131,11 +131,11 @@ struct Scale : Event::Video, PicWidget {
 		static void PressCursor(void* pointer, Button* from);
 		static void DragCursor(int x_from, int y_from,int x, int y, void* pointer, Button* from);
 
-		// �Ѿ���Event::Video
+		// 継承:Event::Video
 		void Press(void);
 		void Motion(int x, int y);
 
-		/* �Ѿ� : PicWidget */
+		/* 継承 : PicWidget */
 		void activate(void) { Event::Video::activate();}
 		void deactivate(void) { Event::Video::deactivate();}
 		void SetRegion(const Rect& new_rect) { Event::Video::SetRegion(new_rect);}
@@ -167,7 +167,7 @@ struct Text : public Event::Video, Event
 		TimeCursor* cursor;
 		Surface* surface;
 		TextGlyphStream gstream;
-		std::vector<int> bottom_pos; // �Թ⤵(height)���߷���
+		std::vector<int> bottom_pos; // 行高さ(height)の累計値
 		XKFont::HorizLayout layout;
 		int fontsize;
 
--- a/xlovesys.cc
+++ b/xlovesys.cc
@@ -28,8 +28,8 @@
 // #define ROOTPATH "/mnt/KEY/CLANNAD"
 // #define ROOTPATH "/home/uenok/pb"
 // #define FONT "msgothic.ttc"
-	/* kochi-mincho-subst.ttf ���뤤�� -*-*-*-r-*--24-*-*-*-*-*-jisx0208.1983-* �ʤ� */
-	/* TrueType Font �� /usr/X11R6/lib/X11/fonts/TrueType/ �ʤɤ�¸�ߤ���ɬ�פ����� */
+	/* kochi-mincho-subst.ttf あるいは -*-*-*-r-*--24-*-*-*-*-*-jisx0208.1983-* など */
+	/* TrueType Font は /usr/X11R6/lib/X11/fonts/TrueType/ などに存在する必要がある */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -55,7 +55,7 @@ const char key_lb_orig[] = {0x4b, 0x45, 
 const char key_lb_new[] = "KEY\\LittleBusters";
 
 
-extern "C" int main(int argc, char* argv[]); /* SDL.h ����������Τ�ɬ�פʤ��Ϥ��ʤ�����ɡġ� */
+extern "C" int main(int argc, char* argv[]); /* SDL.h で定義されるので必要ないはずなんだけど…… */
 
 int main(int argc, char *argv[]) {
 	AyuSysConfig *config = AyuSysConfig::GetInstance();
@@ -116,7 +116,7 @@ int main(int argc, char *argv[]) {
 	FileSearcher::GetInstance()->InitRoot(rootPath);
 	config->LoadInitFile();
 	const char* regname = config->GetParaStr("#REGNAME");
-	if (strcmp(regname, key_lb_orig) == 0) { // "��ȥ�Х��������� -> LittleBusters��#REGNAME���ѹ�
+	if (strcmp(regname, key_lb_orig) == 0) { // "リトルバスターズ! -> LittleBustersに#REGNAMEを変更
 		config->SetParaStr("#REGNAME", key_lb_new);
 	}
 	if (xor_key == NULL)