diff -ruN joe-3.3/b.c zh-joe-3.3/b.c
--- joe-3.3/b.c	Mon Apr 25 21:11:22 2005
+++ zh-joe-3.3/b.c	Wed Nov  9 20:37:21 2005
@@ -56,13 +56,13 @@
 VFILE *vmem;
 
 unsigned char *msgs[] = {
-	US "No error",
-	US "New File",
-	US "Error reading file",
-	US "Error seeking file",
-	US "Error opening file",
-	US "Error writing file",
-	US "File on disk is newer"
+	US "沒有錯誤",
+	US "新檔",
+	US "讀取檔案錯誤",
+	US "尋找檔案錯誤",
+	US "開啟檔案錯誤",
+	US "寫入檔案錯誤",
+	US "磁碟上的檔案比較新"
 };
 
 /* Get size of gap (amount of free space) */
@@ -2662,18 +2662,18 @@
 	if ((f = fdopen(tmpfd, "a")) == NULL)
 		_exit(-1);
 
-	fprintf(f, "\n*** Modified files in JOE when it aborted on %s", ctime(&tim));
+	fprintf(f, "\n*** 於 %s 時不正常結束的 JOE 存檔", ctime(&tim));
 	if (sig)
-		fprintf(f, "*** JOE was aborted by signal %d\n", sig);
+		fprintf(f, "*** JJOE 因 signal %d 而不正常結束\n", sig);
 	else
-		fprintf(f, "*** JOE was aborted because the terminal closed\n");
+		fprintf(f, "*** JOE 因 terminal 連線中斷而不正常結束\n");
 	fflush(f);
 	for (b = bufs.link.next; b != &bufs; b = b->link.next)
 		if (b->changed) {
 			if (b->name)
-				fprintf(f, "\n*** File \'%s\'\n", b->name);
+				fprintf(f, "\n*** 檔名 \'%s\'\n", b->name);
 			else
-				fprintf(f, "\n*** File \'(Unnamed)\'\n");
+				fprintf(f, "\n*** 檔名 \'(未命名)\'\n");
 			fflush(f);
 			bsavefd(b->bof, fileno(f), b->eof->byte);
 		}
diff -ruN joe-3.3/bw.c zh-joe-3.3/bw.c
--- joe-3.3/bw.c	Mon Apr 25 21:11:22 2005
+++ zh-joe-3.3/bw.c	Wed Nov  9 20:37:21 2005
@@ -1116,9 +1116,9 @@
 	int c = brch(bw->cursor);
 
 	if (c == NO_MORE_DATA)
-		joe_snprintf_4((char *)buf, sizeof(buf), "** Line %ld  Col %ld  Offset %ld(0x%lx) **", bw->cursor->line + 1, piscol(bw->cursor) + 1, bw->cursor->byte, bw->cursor->byte);
+		joe_snprintf_4((char *)buf, sizeof(buf), "** 行數 %ld  列數 %ld  檔案大小 %ld(0x%lx) **", bw->cursor->line + 1, piscol(bw->cursor) + 1, bw->cursor->byte, bw->cursor->byte);
 	else
-		joe_snprintf_9((char *)buf, sizeof(buf), "** Line %ld  Col %ld  Offset %ld(0x%lx)  %s %d(0%o/0x%X) Width %d **", bw->cursor->line + 1, piscol(bw->cursor) + 1, bw->cursor->byte, bw->cursor->byte, bw->b->o.charmap->name, c, c, c, joe_wcwidth(bw->o.charmap->type,c));
+		joe_snprintf_9((char *)buf, sizeof(buf), "** 行數 %ld  列數 %ld  檔案大小 %ld(0x%lx)  Ascii碼 %d(0%o/0x%X) **", bw->cursor->line + 1, piscol(bw->cursor) + 1, bw->cursor->byte, bw->cursor->byte, bw->b->o.charmap->name, c, c, c, joe_wcwidth(bw->o.charmap->type,c));
 	msgnw(bw->parent, buf);
 	return 0;
 }
diff -ruN joe-3.3/cmd.c zh-joe-3.3/cmd.c
--- joe-3.3/cmd.c	Mon Apr 25 21:11:22 2005
+++ zh-joe-3.3/cmd.c	Wed Nov  9 20:37:21 2005
@@ -278,7 +278,7 @@
 			*notify = 1;
 		return 0;
 	} else {
-		if (mkqw(bw->parent, sc("Could not lock.  (S)teal, (I)gnore, (Q)uit? "), steal_lock, NULL, b, notify)) {
+		if (mkqw(bw->parent, sc("無法設定編輯狀態的鎖定  (S)繼續, (I)忽略, (Q)離開? "), steal_lock, NULL, b, notify)) {
 			return 0;
 		} else
 			return -1;
@@ -287,7 +287,7 @@
 
 int file_changed(BW *bw,int c,B *b,int *notify)
 {
-	if (mkqw(bw->parent, sc("Notice: File on disk changed! (hit ^C to continue)  "), file_changed, NULL, b, notify)) {
+	if (mkqw(bw->parent, sc("注意: 磁碟上的檔案已變更! (按 ^C 繼續)  "), file_changed, NULL, b, notify)) {
 		return 0;
 	} else
 		return -1;
@@ -308,9 +308,9 @@
 			for(x=0;bf1[x] && bf1[x]!=':';++x);
 			bf1[x]=0;
 			if(bf1[0])
-				joe_snprintf_1((char *)bf,sizeof(bf),"Locked by %s  (S)teal, (I)gnore, (Q)uit? ",bf1);
+				joe_snprintf_1((char *)bf,sizeof(bf),"被 %s 所鎖住 (S)繼續, (I)忽略, (Q)離開? ",bf1);
 			else
-				joe_snprintf_0((char *)bf,sizeof(bf),"Could not create lock.  (S)teal, (I)gnore, (Q)uit? ");
+				joe_snprintf_0((char *)bf,sizeof(bf),"無法設定編輯狀態的鎖定  (S)繼續, (I)忽略, (Q)離開? ");
 			if (mkqw(bw->parent, sz(bf), steal_lock, NULL, b, NULL)) {
 				uquery(bw);
 				if (!b->locked)
@@ -345,7 +345,7 @@
 		/* This happens when we try to block move from a window
 		   which is not on the screen */
 		if (b!=bw->b) {
-			msgnw(bw->parent,US "Modify other window first");
+			msgnw(bw->parent,US "請先到其他視窗內做區塊標示");
 			return 0;
 		}
 		b->didfirst = 1;
@@ -353,7 +353,7 @@
 			exmacro(bw->o.mfirst,1);
 	}
 	if (b->rdonly) {
-		msgnw(bw->parent, US "Read only");
+		msgnw(bw->parent, US "唯讀");
 		if (joe_beep)
 			ttputc(7);
 		return 0;
@@ -548,7 +548,7 @@
 
 	vsrm(s);	/* allocated in pw.c::rtnpw() */
 	if (!cmd)
-		msgnw(bw->parent, US "No such command");
+		msgnw(bw->parent, US "沒有這項指令");
 	else {
 		mac = mkmacro(-1, 0, 0, cmd);
 		ret = exmacro(mac, 1);
diff -ruN joe-3.3/joerc.in zh-joe-3.3/joerc.in
--- joe-3.3/joerc.in	Wed May  4 01:32:39 2005
+++ zh-joe-3.3/joerc.in	Wed Nov  9 20:37:21 2005
@@ -55,7 +55,7 @@
 
  -marking	Text between ^KB and cursor is highlighted (use with -lightoff)
 
- -asis		Characters 128 - 255 shown as-is
+-asis		Characters 128 - 255 shown as-is
 
  -force		Force final newline when files are saved
 
diff -ruN joe-3.3/jpicorc.in zh-joe-3.3/jpicorc.in
--- joe-3.3/jpicorc.in	Wed May  4 01:32:46 2005
+++ zh-joe-3.3/jpicorc.in	Wed Nov  9 20:37:21 2005
@@ -57,7 +57,7 @@
 
 -lightoff	Turn off highlighting after block copy or move
 
- -asis		Characters 128 - 255 shown as-is
+-asis		Characters 128 - 255 shown as-is
 
 -force		Force final newline when files are saved
 
diff -ruN joe-3.3/macro.c zh-joe-3.3/macro.c
--- joe-3.3/macro.c	Mon Apr 25 21:11:23 2005
+++ zh-joe-3.3/macro.c	Wed Nov  9 20:37:21 2005
@@ -381,7 +381,7 @@
  * When the macro is played, edit loop is run as a subroutine until dialog
  * is complete, then uquery returns, which continues macro execution.
  *
- * Completion of a dialog is indicated with 'notify' flag�(look at interactive
+ * Completion of a dialog is indicated with 'notify' flag(look at interactive
  * dialogs in ufile.c).
  */
 
@@ -681,7 +681,7 @@
 {
 	if (c >= '0' && c <= '9')
 		return dorecord(bw, c, NULL, NULL);
-	else if (mkqw(bw->parent, sc("Macro to record (0-9 or ^C to abort): "), dorecord, NULL, NULL, NULL))
+	else if (mkqw(bw->parent, sc("錄製巨集 (0-9 或 ^C 中斷): "), dorecord, NULL, NULL, NULL))
 		return 0;
 	else
 		return -1;
@@ -785,7 +785,7 @@
 {
 	if (c >= '0' && c <= '9')
 		return doplay(bw, c, NULL, NULL);
-	else if (mkqwna(bw->parent, sc("Play-"), doplay, NULL, NULL, NULL))
+	else if (mkqwna(bw->parent, sc("執行"), doplay, NULL, NULL, NULL))
 		return 0;
 	else
 		return -1;
@@ -812,7 +812,7 @@
 
 int uarg(BW *bw)
 {
-	if (wmkpw(bw->parent, US "No. times to repeat next command (^C to abort): ", NULL, doarg, NULL, NULL, utypebw, NULL, NULL, locale_map,0))
+	if (wmkpw(bw->parent, US "下一個指令重複的次數為 (^C 中斷): ", NULL, doarg, NULL, NULL, utypebw, NULL, NULL, locale_map,0))
 		return 0;
 	else
 		return -1;
@@ -839,7 +839,7 @@
 {
 	ifdepth++;
 	if (!ifflag) return 0;
-	if (wmkpw(bw->parent,US "If (^C to abort): ",NULL,doif,NULL,ifabrt,utypebw,NULL,NULL,locale_map,0)) return 0;
+	if (wmkpw(bw->parent,US "If (^C 中斷): ",NULL,doif,NULL,ifabrt,utypebw,NULL,NULL,locale_map,0)) return 0;
 	else return -1;
 }
 
@@ -914,7 +914,7 @@
 			*notify = 1;
 		return 0;
 	}
-	joe_snprintf_2((char *)msgbuf, JOE_MSGBUFSIZE, "Repeat %s%d", negarg ? "-" : "", unaarg);
+	joe_snprintf_2((char *)msgbuf, JOE_MSGBUFSIZE, "重複 %s%d", negarg ? "-" : "", unaarg);
 	if (mkqwna(bw->parent, sz(msgbuf), douarg, NULL, NULL, notify))
 		return 0;
 	else
@@ -927,7 +927,7 @@
 	negarg = 0;
 	if ((c >= '0' && c <= '9') || c == '-')
 		return douarg(bw, c, NULL, NULL);
-	else if (mkqwna(bw->parent, sc("Repeat"), douarg, NULL, NULL, NULL))
+	else if (mkqwna(bw->parent, sc("重複"), douarg, NULL, NULL, NULL))
 		return 0;
 	else
 		return -1;
diff -ruN joe-3.3/main.c zh-joe-3.3/main.c
--- joe-3.3/main.c	Mon Apr 25 21:11:23 2005
+++ zh-joe-3.3/main.c	Wed Nov  9 20:37:21 2005
@@ -226,7 +226,7 @@
 
 #ifndef __MSDOS__
 	if (!(cap = getcap(NULL, 9600, NULL, NULL))) {
-		fprintf(stderr, "Couldn't load termcap/terminfo entry\n");
+		fprintf(stderr, "無法載入 termcap/terminfo 項目\n");
 		return 1;
 	}
 #endif
@@ -241,7 +241,7 @@
 	if (c == 1) {
 		unsigned char buf[8];
 
-		fprintf(stderr, "There were errors in '%s'.  Use it anyway?", s);
+		fprintf(stderr, "在 '%s' 中有錯誤. 要使用它嗎？", s);
 		fflush(stderr);
 		fgets(buf, 8, stdin);
 		if (buf[0] == 'y' || buf[0] == 'Y')
@@ -258,7 +258,7 @@
 	if (c == 1) {
 		unsigned char buf[8];
 
-		fprintf(stderr, "There were errors in '%s'.  Use it anyway?", s);
+		fprintf(stderr, "在 '%s' 中有錯誤. 要使用它嗎？", s);
 		fflush(stderr);
 		fgets(buf, 8, stdin);
 		if (buf[0] == 'y' || buf[0] == 'Y')
@@ -287,9 +287,9 @@
 
 		if (!stat((char *)s,&sbuf)) {
 			if (sbuf.st_mtime<time_t) {
-				fprintf(stderr, "Warning: %s is newer than your %s.\n",t,s);
-				fprintf(stderr,"You should update or delete %s\n",s);
-				fprintf(stderr,"Hit enter to continue with %s ",t);
+				fprintf(stderr, "警告: %s 比 %s 更新喔。\n",t,s);
+				fprintf(stderr,"請更新或刪除 %s\n",s);
+				fprintf(stderr,"按 Enter 來繼續編輯 %s ",t);
 				fflush(stderr);
 				fgets((char *)buf, 8, stdin);
 				goto use_sys;
@@ -302,7 +302,7 @@
 			goto donerc;
 		}
 		if (c == 1) {
-			fprintf(stderr, "There were errors in '%s'.  Use it anyway (y,n)? ", s);
+			fprintf(stderr, "在 '%s' 中有錯誤. 要使用它嗎？", s);
 			fflush(stderr);
 			fgets((char *)buf, 8, stdin);
 			if (buf[0] == 'y' || buf[0] == 'Y') {
@@ -321,7 +321,7 @@
 	if (c == 1) {
 		unsigned char buf[8];
 
-		fprintf(stderr, "There were errors in '%s'.  Use it anyway (y,n)? ", s);
+		fprintf(stderr, "在 '%s' 中有錯誤. 要使用它嗎？", s);
 		fflush(stderr);
 		fgets((char *)buf, 8, stdin);
 		if (buf[0] == 'y' || buf[0] == 'Y')
@@ -338,7 +338,7 @@
 			if (argv[c][1])
 				switch (glopt(argv[c] + 1, argv[c + 1], NULL, 1)) {
 				case 0:
-					fprintf(stderr, "Unknown option '%s'\n", argv[c]);
+					fprintf(stderr, "未知的選項 '%s'\n", argv[c]);
 					break;
 				case 1:
 					break;
@@ -454,7 +454,7 @@
 	}
 	if (!nonotice) {
 		if (locale_map->type)
-			joe_snprintf_1((char *)msgbuf,JOE_MSGBUFSIZE,"\\i** Joe's Own Editor v" VERSION " ** (%s) ** Copyright © 2005 **\\i",locale_map->name);
+			joe_snprintf_1((char *)msgbuf,JOE_MSGBUFSIZE,"\\i** Joe's Own Editor v" VERSION " ** (%s) ** Copyright (C) 2005 **\\i",locale_map->name);
 		else
 			joe_snprintf_1((char *)msgbuf,JOE_MSGBUFSIZE,"\\i** Joe's Own Editor v" VERSION " ** (%s) ** Copyright (C) 2005 **\\i",locale_map->name);
 
diff -ruN joe-3.3/menu.c zh-joe-3.3/menu.c
--- joe-3.3/menu.c	Mon Apr 25 21:11:23 2005
+++ zh-joe-3.3/menu.c	Wed Nov  9 20:37:21 2005
@@ -43,11 +43,14 @@
 		col = 0;
 		for (x = 0; x != m->perline && y*m->perline+x+m->top<m->nitems; ++x) {
 			int atr, z, lcol;
-	
+
+			atr = BG_COLOR(bg_menu);
+/*
 			if (x + y*m->perline + m->top == m->cursor && m->t->curwin==m->parent)
 				atr = INVERSE|BG_COLOR(bg_menu);
 			else
 				atr = BG_COLOR(bg_menu);
+*/
 
 			if (col == m->w)
 				break;
diff -ruN joe-3.3/rc.c zh-joe-3.3/rc.c
--- joe-3.3/rc.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/rc.c	Wed Nov  9 20:37:21 2005
@@ -176,7 +176,7 @@
 	1,		/* indent step */
 	US "main",		/* *context */
 	US "\\i%n %m %M",	/* *lmsg */
-	US " %S Ctrl-K H for help",	/* *rmsg */
+	US " %S Ctrl-K H 線上輔助",	/* *rmsg */
 	0,		/* line numbers */
 	0,		/* read only */
 	0,		/* french spacing */
@@ -278,64 +278,64 @@
 	int low;		/* Low limit for numeric options */
 	int high;		/* High limit for numeric options */
 } glopts[] = {
-	{US "overwrite",4, NULL, (unsigned char *) &fdefault.overtype, US "Overtype mode", US "Insert mode", US "T Overtype " },
-	{US "hex",4, NULL, (unsigned char *) &fdefault.hex, US "Hex edit mode", US "Text edit mode", US "  Hex edit mode " },
-	{US "autoindent",	4, NULL, (unsigned char *) &fdefault.autoindent, US "Autoindent enabled", US "Autoindent disabled", US "I Autoindent " },
-	{US "wordwrap",	4, NULL, (unsigned char *) &fdefault.wordwrap, US "Wordwrap enabled", US "Wordwrap disabled", US "Word wrap " },
-	{US "tab",	5, NULL, (unsigned char *) &fdefault.tab, US "Tab width (%d): ", 0, US "D Tab width ", 0, 1, 64 },
-	{US "lmargin",	7, NULL, (unsigned char *) &fdefault.lmargin, US "Left margin (%d): ", 0, US "Left margin ", 0, 1, 63 },
-	{US "rmargin",	7, NULL, (unsigned char *) &fdefault.rmargin, US "Right margin (%d): ", 0, US "Right margin ", 0, 7, 255 },
-	{US "square",	0, &square, NULL, US "Rectangle mode", US "Text-stream mode", US "X Rectangle mode " },
+	{US "overwrite",4, NULL, (unsigned char *) &fdefault.overtype, US "覆寫模式", US "插入模式", US "T [**輸入模式的設定(overwrite)**] " },
+	{US "hex",4, NULL, (unsigned char *) &fdefault.hex, US "Hex編輯模式", US "文字編輯模式", US "* [**編輯模式的選擇(hex)**] " },
+	{US "autoindent",	4, NULL, (unsigned char *) &fdefault.autoindent, US "自動縮排 [開啟]", US "自動縮排 [關閉]", US "I [**自動縮排的設定(autoindent)**] " },
+	{US "wordwrap",	4, NULL, (unsigned char *) &fdefault.wordwrap, US "自動換行 [開啟]", US "自動換行 [關閉]", US "* [**自動換行的設定(wordwrap)**] " },
+	{US "tab",	5, NULL, (unsigned char *) &fdefault.tab, US "Tab 寬度 (%d): ", 0, US "D [**Tab寬度的設定(tab)**] ", 0, 1, 64 },
+	{US "lmargin",	7, NULL, (unsigned char *) &fdefault.lmargin, US "設定左邊界 (%d): ", 0, US "L [**設定左邊界(lmargin)**] ", 0, 1, 63 },
+	{US "rmargin",	7, NULL, (unsigned char *) &fdefault.rmargin, US "設定右邊界 (%d): ", 0, US "* [**設定右邊界(rmargin)**] ", 0, 7, 255 },
+	{US "square",	0, &square, NULL, US "矩形選取", US "行列選取", US "X [**選取區塊模式(square)**] " },
 	{US "icase",	0, &icase, NULL, US "Ignore case by default", US "Case sensitive by default", US "  Case insensitivity " },
 	{US "wrap",	0, &wrap, NULL, US "Search wraps", US "Search doesn't wrap", US "  Search wraps " },
 	{US "menu_explorer",	0, &menu_explorer, NULL, US "Menu explorer mode", US "Simple completion", US "  Menu explorer " },
 	{US "search_prompting",	0, &pico, NULL, US "Search prompting on", US "Search prompting off", US "  Search prompting " },
 	{US "menu_jump",	0, &menu_jump, NULL, US "Jump is on", US "Jump is off", US "  Jump into menu " },
 	{US "autoswap",	0, &autoswap, NULL, US "Autoswap ^KB and ^KK", US "  Autoswap off ", US "  Autoswap mode " },
-	{US "indentc",	5, NULL, (unsigned char *) &fdefault.indentc, US "Indent char %d (SPACE=32, TAB=9, ^C to abort): ", 0, US "  Indent char ", 0, 0, 255 },
-	{US "istep",	5, NULL, (unsigned char *) &fdefault.istep, US "Indent step %d (^C to abort): ", 0, US "  Indent step ", 0, 1, 64 },
-	{US "french",	4, NULL, (unsigned char *) &fdefault.french, US "One space after periods for paragraph reformat", US "Two spaces after periods for paragraph reformat", US "  french spacing " },
+	{US "indentc",	5, NULL, (unsigned char *) &fdefault.indentc, US "設定縮排字元 %d (SPACE=32, TAB=9, ^C 中斷): ", 0, US "* [**縮排長度的設定(indentc)**] ", 0, 0, 255 },
+	{US "istep",	5, NULL, (unsigned char *) &fdefault.istep, US "設定縮排段落 %d (^C 中斷): ", 0, US "* [**設定縮排的段落(istep)**] ", 0, 1, 64 },
+	{US "french",	4, NULL, (unsigned char *) &fdefault.french, US "段落重排後多 1 個空白", US "段落重排後多 2 個空白", US "* [**設定法國式段落排列(french)**] " },
 	{US "highlight",	4, NULL, (unsigned char *) &fdefault.highlight, US "Highlighting enabled", US "Highlighting disabled", US "Highlighting " },
-	{US "spaces",	4, NULL, (unsigned char *) &fdefault.spaces, US "Inserting spaces when tab key is hit", US "Inserting tabs when tab key is hit", US "  no tabs " },
-	{US "mid",	0, &mid, NULL, US "Cursor will be recentered on scrolls", US "Cursor will not be recentered on scroll", US "Center on scroll " },
-	{US "guess_crlf",0, &guesscrlf, NULL, US "Automatically detect MS-DOS files", US "Do not automatically detect MS-DOS files", US "  Auto detect CR-LF " },
+	{US "spaces",	4, NULL, (unsigned char *) &fdefault.spaces, US "設定按下 [TAB] 後插入 [空白] 字元", US "設定按下 [TAB] 後插入 [TAB ] 字元", US "* [**設定 TAB 鍵用途(spaces)**] " },
+	{US "mid",	0, &mid, NULL, US "螢幕捲動後游標自動向中間對齊功\能 [開啟]", US "螢幕捲動後游標自動向中間對齊功\能 [關閉]", US "* [**游標向中對齊(mid)**] " },
+	{US "guess_crlf",0, &guesscrlf, NULL, US "自動偵測 MS-DOS 檔格式(CR-LF) [開啟]", US "自動偵測 MS-DOS 檔格式(CR-LF) [關閉]", US "* [**自動偵測 MS-DOS 檔格式(guess_crlf)**] " },
 	{US "guess_indent",0, &guessindent, NULL, US "Automatically detect indentation", US "Do not automatically detect indentation", US "  Guess indent " },
-	{US "crlf",	4, NULL, (unsigned char *) &fdefault.crlf, US "CR-LF is line terminator", US "LF is line terminator", US "Z CR-LF (MS-DOS) " },
-	{US "linums",	4, NULL, (unsigned char *) &fdefault.linums, US "Line numbers enabled", US "Line numbers disabled", US "N Line numbers " },
-	{US "marking",	0, &marking, NULL, US "Anchored block marking on", US "Anchored block marking off", US "Marking " },
-	{US "asis",	0, &dspasis, NULL, US "Characters above 127 shown as-is", US "Characters above 127 shown in inverse", US "  Meta chars as-is " },
-	{US "force",	0, &force, NULL, US "Last line forced to have NL when file saved", US "Last line not forced to have NL", US "Force last NL " },
+	{US "crlf",	4, NULL, (unsigned char *) &fdefault.crlf, US "行的結尾是 CR-LF(DOS格式)", US "行的結尾是 LF(UNIX格式)", US "Z [*行尾字元的設定(crlf)*] " },
+	{US "linums",	4, NULL, (unsigned char *) &fdefault.linums, US "顯示行數功\能 [開啟]", US "顯示行數功\能 [關閉]", US "N [***行數顯示與否(linums)***] " },
+	{US "marking",	0, &marking, NULL, US "反白區塊隨游標移動功\能 [開啟]", US "反白區塊隨游標移動功\能 [關閉]", US "* [**區塊反白設定(marking)**] " },
+	{US "asis",	0, &dspasis, NULL, US "顯示 ASCII 127 以上的字元", US "以相反方式來顯示 ASCII 127 以上的字元", US "* [**中文顯示方式(asis)**] " },
+	{US "force",	0, &force, NULL, US "存檔後，檔尾自動加上一行空白行功\能 [開啟]", US "存檔後，檔尾自動加上一行空白行功\能 [關閉]", US "* [**存檔時檔尾的設定(force)**] " },
 	{US "joe_state",0, &joe_state, NULL, US "~/.joe_state file will be updated", US "~/.joe_state file will not be updated", US "  Joe_state file " },
-	{US "nobackups",	0, &nobackups, NULL, US "Backup files will not be made", US "Backup files will be made", US "  Disable backups " },
+	{US "nobackups",	0, &nobackups, NULL, US "自動產生備份檔功\能 [關閉]", US "自動產生備份檔功\能 [開啟]", US "* [**自動備份的設定(nobackups)**] " },
 	{US "nolocks",	0, &nolocks, NULL, US "Files will not be locked", US "Files will be locked", US "  Disable locks " },
 	{US "nomodcheck",	0, &nomodcheck, NULL, US "No mtime check", US "Mtime checking enabled", US "  Disable mtime check " },
 	{US "nocurdir",	0, &nocurdir, NULL, US "No current dir", US "Current dir enabled", US "  Disable current dir " },
 	{US "break_links",	0, &break_links, NULL, US "Hardlinks will be broken", US "Hardlinks not broken", US "  Break hard links " },
-	{US "lightoff",	0, &lightoff, NULL, US "Highlighting turned off after block operations", US "Highlighting not turned off after block operations", US "Auto unmark " },
-	{US "exask",	0, &exask, NULL, US "Prompt for filename in save & exit command", US "Don't prompt for filename in save & exit command", US "  Exit ask " },
-	{US "beep",	0, &joe_beep, NULL, US "Warning bell enabled", US "Warning bell disabled", US "Beeps " },
-	{US "nosta",	0, &staen, NULL, US "Top-most status line disabled", US "Top-most status line enabled", US "  Disable status line " },
-	{US "keepup",	0, &keepup, NULL, US "Status line updated constantly", US "Status line updated once/sec", US "  Fast status line " },
-	{US "pg",		1, &pgamnt, NULL, US "Lines to keep for PgUp/PgDn or -1 for 1/2 window (%d): ", 0, US "  No. PgUp/PgDn lines ", 0, -1, 64 },
-	{US "csmode",	0, &csmode, NULL, US "Start search after a search repeats previous search", US "Start search always starts a new search", US "Continued search " },
-	{US "rdonly",	4, NULL, (unsigned char *) &fdefault.readonly, US "Read only", US "Full editing", US "O Read only " },
+	{US "lightoff",	0, &lightoff, NULL, US "使用區塊功\能後，自動關閉高亮度區塊功\能 [關閉]", US "使用區塊功\能後，自動關閉高亮度區塊功\能 [開啟]", US "* [**區塊亮度設定(lightoff)**] " },
+	{US "exask",	0, &exask, NULL, US "離開時是否問要存的檔名 [是的]", US "離開時是否問要存的檔名 [不要]", US " [**離開時詢問要存檔的檔名(exask)**] " },
+	{US "beep",	0, &joe_beep, NULL, US "錯誤時發出\"嗶\"的聲音功\能 [開啟]", US "錯誤時發出\"嗶\"的聲音功\能 [關閉]", US "* [**錯誤時，是否發\"嗶\"聲(beep)**] " },
+	{US "nosta",	0, &staen, NULL, US "顯示最上面的狀態列功\能[關閉]", US "顯示最上面的狀態列功\能[開啟]", US "* [**狀態列開關(nosta)**] " },
+	{US "keepup",	0, &keepup, NULL, US "狀態列固定時間更新資料一次", US "狀態列每秒更新資料一次", US "* [**狀態列快速更新(keepup)**] " },
+	{US "pg",		1, &pgamnt, NULL, US "按下 [PgUp]/[PgDn] 時所保留的行數 或 -1(保留半個視窗) (%d): ", 0, US "* [**按PaUp/PaDn 時的行數(pg)**] ", 0, -1, 64 },
+	{US "csmode",	0, &csmode, NULL, US "按下 CTRL + F 以之前所輸入的字串繼續搜尋", US "按下 CTRL + F 都以新的字串進行搜尋", US "* [**搜尋字元的設定(csmode)**] " },
+	{US "rdonly",	4, NULL, (unsigned char *) &fdefault.readonly, US "唯讀模式", US "可編輯模式", US "O [**唯讀模式設定(rdonly)**] " },
 	{US "smarthome",	4, NULL, (unsigned char *) &fdefault.smarthome, US "Smart home key enabled", US "Smart home key disabled", US "  Smart home key " },
 	{US "indentfirst",	4, NULL, (unsigned char *) &fdefault.indentfirst, US "Smart home goes to indent first", US "Smart home goes home first", US "  To indent first " },
 	{US "smartbacks",	4, NULL, (unsigned char *) &fdefault.smartbacks, US "Smart backspace key enabled", US "Smart backspace key disabled", US "  Smart backspace " },
 	{US "purify",	4, NULL, (unsigned char *) &fdefault.purify, US "Indentation clean up enabled", US "Indentation clean up disabled", US "  Clean up indents " },
 	{US "picture",	4, NULL, (unsigned char *) &fdefault.picture, US "Picture drawing mode enabled", US "Picture drawing mode disabled", US "Picture mode " },
-	{US "backpath",	2, (int *) &backpath, NULL, US "Backup files stored in (%s): ", 0, US "  Path to backup files " },
-	{US "syntax",	9, NULL, NULL, US "Select syntax (^C to abort): ", 0, US "Y Syntax" },
-	{US "encoding",13, NULL, NULL, US "Select file character set (^C to abort): ", 0, US "Encoding " },
-	{US "single_quoted",	4, NULL, (unsigned char *) &fdefault.single_quoted, US "Single quoting enabled", US "Single quoting disabled", US "  ^G ignores ' ' " },
-	{US "c_comment",	4, NULL, (unsigned char *) &fdefault.c_comment, US "/* comments enabled", US "/* comments disabled", US "  ^G ignores /**/ " },
-	{US "cpp_comment",	4, NULL, (unsigned char *) &fdefault.cpp_comment, US "// comments enabled", US "// comments disabled", US "  ^G ignores // " },
-	{US "pound_comment",	4, NULL, (unsigned char *) &fdefault.pound_comment, US "# comments enabled", US "# comments disabled", US "  ^G ignores # " },
-	{US "vhdl_comment",	4, NULL, (unsigned char *) &fdefault.vhdl_comment, US "-- comments enabled", US "-- comments disabled", US "  ^G ignores -- " },
-	{US "semi_comment",	4, NULL, (unsigned char *) &fdefault.vhdl_comment, US "; comments enabled", US "; comments disabled", US "  ^G ignores ; " },
+	{US "backpath",	2, (int *) &backpath, NULL, US "備份檔儲存路徑(%s):", 0, US "* [**備份檔案路徑(backpath)**] " },
+	{US "syntax",	9, NULL, NULL, US "選擇語法效果 (^C 中斷): ", 0, US "Y [**選擇語法效果(syntax)**] " },
+	{US "encoding",13, NULL, NULL, US "選擇檔案編碼 (^C 中斷): ", 0, US "* [**檔案編碼設定(encoding)**] " },
+	{US "single_quoted",	4, NULL, (unsigned char *) &fdefault.single_quoted, US "以『`』為引言 [開啟]", US "以『`』為引言 [關閉]", US "  ^G 是否忽略 ' '(single_quoted) " },
+	{US "c_comment",	4, NULL, (unsigned char *) &fdefault.c_comment, US "以『/*』開頭為註解方式 [開啟]", US "以『/*』開頭為註解方式 [關閉]", US "  ^G 是否忽略 /**/ 註解方式(c_comment)" },
+	{US "cpp_comment",	4, NULL, (unsigned char *) &fdefault.cpp_comment, US "以『//』開頭為註解方式 [開啟]", US "以『//』開頭為註解方式 [關閉]", US "  ^G 是否忽略 // 註解方式(cpp_comment)" },
+	{US "pound_comment",	4, NULL, (unsigned char *) &fdefault.pound_comment, US "以『#』開頭為註解方式 [開啟]", US "以『#』開頭為註解方式 [關閉]", US "  ^G 是否忽略 # 註解方式(pound_comment)" },
+	{US "vhdl_comment",	4, NULL, (unsigned char *) &fdefault.vhdl_comment, US "以『--』開頭為註解方式 [開啟]", US "以『--』開頭為註解方式 [關閉]", US "  ^G 是否忽略 -- 註解方式(vhdl_comment)" },
+	{US "semi_comment",	4, NULL, (unsigned char *) &fdefault.vhdl_comment, US "以『;』開頭為註解方式 [開啟]", US "以『;』開頭為註解方式 [關閉]", US "  ^G 是否忽略 ; 註解方式(semi_comment)" },
 	{US "text_delimiters",	6, NULL, (unsigned char *) &fdefault.text_delimiters, US "Text delimiters (%s): ", 0, US "  Text delimiters " },
 	{US "floatmouse",	0, &floatmouse, 0, US "Clicking can move the cursor past end of line", US "Clicking past end of line moves cursor to the end", US "  Click past end " },
-	{US "rtbutton",	0, &rtbutton, 0, US "Mouse action is done with the right button", US "Mouse action is done with the left button", US "  Right button " },
+	{US "rtbutton",	0, &rtbutton, 0, US "滑鼠習慣以左鍵為主", US "滑鼠習慣以右鍵為主", US "* [**設定滑鼠習慣(rtbutton)**] " },
 	{US "nonotice",	0, &nonotice, NULL, 0, 0, 0 },
 	{US "noxon",	0, &noxon, NULL, 0, 0, 0 },
 	{US "orphan",	0, &orphan, NULL, 0, 0, 0 },
@@ -640,7 +640,7 @@
 		} else if (v >= glopts[x].low && v <= glopts[x].high)
 			*glopts[x].set = v;
 		else {
-			msgnw(bw->parent, US "Value out of range");
+			msgnw(bw->parent, US "數值超過範圍");
 			ret = -1;
 		}
 		break;
@@ -659,7 +659,7 @@
 		} else if (v >= glopts[x].low && v <= glopts[x].high)
 			*(int *) ((unsigned char *) &bw->o + glopts[x].ofst) = v;
 		else {
-			msgnw(bw->parent, US "Value out of range");
+			msgnw(bw->parent, US "數值超過範圍");
 			ret = -1;
 		}
 		break;
@@ -671,7 +671,7 @@
 		} else if (v >= glopts[x].low && v <= glopts[x].high)
 			*(int *) ((unsigned char *) &bw->o + glopts[x].ofst) = v;
 		else {
-			msgnw(bw->parent, US "Value out of range");
+			msgnw(bw->parent, US "數值超過範圍");
 			ret = -1;
 		}
 		break;
@@ -926,7 +926,7 @@
 		s[x] = (unsigned char *) joe_malloc(80);		/* FIXME: why 40 ??? */
 		switch (glopts[x].type) {
 		case 0:
-			joe_snprintf_2((char *)(s[x]), OPT_BUF_SIZE, "%s%s", glopts[x].menu, *glopts[x].set ? "ON" : "OFF");
+			joe_snprintf_2((char *)(s[x]), OPT_BUF_SIZE, "%s%s", glopts[x].menu, *glopts[x].set ? "開" : "關");
 			break;
 		case 1:
 			joe_snprintf_2((char *)(s[x]), OPT_BUF_SIZE, "%s%d", glopts[x].menu, *glopts[x].set);
@@ -938,7 +938,7 @@
 			zcpy(s[x], glopts[x].menu);
 			break;
 		case 4:
-			joe_snprintf_2((char *)(s[x]), OPT_BUF_SIZE, "%s%s", glopts[x].menu, *(int *) ((unsigned char *) &bw->o + glopts[x].ofst) ? "ON" : "OFF");
+			joe_snprintf_2((char *)(s[x]), OPT_BUF_SIZE, "%s%s", glopts[x].menu, *(int *) ((unsigned char *) &bw->o + glopts[x].ofst) ? "開" : "關");
 			break;
 		case 5:
 			joe_snprintf_2((char *)(s[x]), OPT_BUF_SIZE, "%s%d", glopts[x].menu, *(int *) ((unsigned char *) &bw->o + glopts[x].ofst));
@@ -981,7 +981,7 @@
 	if (!fd)
 		return -1;	/* Return if we couldn't open the rc file */
 
-	fprintf(stderr, "Processing '%s'...", name);
+	fprintf(stderr, "'%s'處理中...", name);
 	fflush(stderr);
 
 	while (fgets((char *)buf, sizeof(buf), fd)) {
@@ -1037,7 +1037,7 @@
 				buf[x] = 0;
 				if (!glopt(opt, arg, o, 2)) {
 					err = 1;
-					fprintf(stderr, "\n%s %d: Unknown option %s", name, line, opt);
+					fprintf(stderr, "\n%s %d: 未定義的設定 %s", name, line, opt);
 				}
 			}
 			break;
@@ -1070,11 +1070,11 @@
 								addcmd(buf + x, m);
 							else {
 								err = 1;
-								fprintf(stderr, "\n%s %d: macro missing from :def", name, line);
+								fprintf(stderr, "\n%s %d: 找不到巨集 :def", name, line);
 							}
 						} else {
 							err = 1;
-							fprintf(stderr, "\n%s %d: command name missing from :def", name, line);
+							fprintf(stderr, "\n%s %d: 找不到指令 :def", name, line);
 						}
 					} else if (!zcmp(buf + 1, US "inherit"))
 						if (context) {
@@ -1085,11 +1085,11 @@
 								kcpy(context, kmap_getcontext(buf + x));
 							else {
 								err = 1;
-								fprintf(stderr, "\n%s %d: context name missing from :inherit", name, line);
+								fprintf(stderr, "\n%s %d: 找不到內容 :inherit", name, line);
 							}
 						} else {
 							err = 1;
-							fprintf(stderr, "\n%s %d: No context selected for :inherit", name, line);
+							fprintf(stderr, "\n%s %d: 沒有選定任何的內容 :inherit", name, line);
 					} else if (!zcmp(buf + 1, US "include")) {
 						for (buf[x] = c; joe_isblank(locale_map,buf[x]); ++x) ;
 						for (c = x; !joe_isspace_eof(locale_map,buf[c]); ++c) ;
@@ -1100,7 +1100,7 @@
 								err = 1;
 								break;
 							case -1:
-								fprintf(stderr, "\n%s %d: Couldn't open %s", name, line, buf + x);
+								fprintf(stderr, "\n%s %d: 無法開啟 %s", name, line, buf + x);
 								err = 1;
 								break;
 							}
@@ -1108,7 +1108,7 @@
 							o = &fdefault;
 						} else {
 							err = 1;
-							fprintf(stderr, "\n%s %d: :include missing file name", name, line);
+							fprintf(stderr, "\n%s %d: :無法找到相關 include 檔", name, line);
 						}
 					} else if (!zcmp(buf + 1, US "delete"))
 						if (context) {
@@ -1121,12 +1121,12 @@
 							kdel(context, buf + x);
 						} else {
 							err = 1;
-							fprintf(stderr, "\n%s %d: No context selected for :delete", name, line);
+							fprintf(stderr, "\n%s %d: 沒有選定任何的內容 :delete", name, line);
 					} else
 						context = kmap_getcontext(buf + 1);
 				else {
 					err = 1;
-					fprintf(stderr, "\n%s %d: Invalid context name", name, line);
+					fprintf(stderr, "\n%s %d: 不正確的名稱", name, line);
 				}
 			}
 			break;
@@ -1137,7 +1137,7 @@
 
 				if (!context) {
 					err = 1;
-					fprintf(stderr, "\n%s %d: No context selected for macro to key-sequence binding", name, line);
+					fprintf(stderr, "\n%s %d: 未選定任何內容給巨集使用", name, line);
 					break;
 				}
 
@@ -1146,7 +1146,7 @@
 				m = mparse(m, buf, &x);
 				if (x == -1) {
 					err = 1;
-					fprintf(stderr, "\n%s %d: Unknown command in macro", name, line);
+					fprintf(stderr, "\n%s %d: 巨集內有未知的的指令", name, line);
 					break;
 				} else if (x == -2) {
 					fgets((char *)buf, 1024, fd);
@@ -1162,7 +1162,7 @@
 
 				/* Add binding to context */
 				if (kadd(cap, context, buf + x, m) == -1) {
-					fprintf(stderr, "\n%s %d: Bad key sequence '%s'", name, line, buf + x);
+					fprintf(stderr, "\n%s %d: 錯誤的按鍵順序設定 '%s'", name, line, buf + x);
 					err = 1;
 				}
 			}
@@ -1173,9 +1173,9 @@
 
 	/* Print proper ending string */
 	if (err)
-		fprintf(stderr, "\ndone\n");
+		fprintf(stderr, "\n完成\n");
 	else
-		fprintf(stderr, "done\n");
+		fprintf(stderr, "完成\n");
 
 	return err;		/* 0 for success, 1 for syntax error */
 }
diff -ruN joe-3.3/tab.c zh-joe-3.3/tab.c
--- joe-3.3/tab.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/tab.c	Wed Nov  9 20:37:21 2005
@@ -287,7 +287,7 @@
 	tab->pattern = vsncpy(NULL, 0, sc("*"));
 
 	if (!treload(m->object, m, m->parent->win->object, 1, NULL)) {
-		msgnw(m->parent, US "Couldn't read directory ");
+		msgnw(m->parent, US "無法讀取目錄");
 		vsrm(tab->pattern);
 		tab->pattern = orgpattern;
 		vsrm(tab->path);
diff -ruN joe-3.3/termcap.c zh-joe-3.3/termcap.c
--- joe-3.3/termcap.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/termcap.c	Wed Nov  9 20:37:21 2005
@@ -222,7 +222,7 @@
  joe_free(cap);
  return 0;
 */
-		fprintf(stderr, "Couldn't load termcap entry.  Using ansi default\n");
+		fprintf(stderr, "無法載入 termcap，使用 ansi 為內定值\n");
 		ti = 0;
 		cap->tbuf = vsncpy(cap->tbuf, 0, sc(defentry));
 		goto checktc;
diff -ruN joe-3.3/tty.c zh-joe-3.3/tty.c
--- joe-3.3/tty.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/tty.c	Wed Nov  9 20:37:21 2005
@@ -337,7 +337,7 @@
 
 	if (!termin) {
 		if (idleout ? (!(termin = stdin) || !(termout = stdout)) : (!(termin = fopen("/dev/tty", "r")) || !(termout = fopen("/dev/tty", "w")))) {
-			fprintf(stderr, "Couldn\'t open /dev/tty\n");
+			fprintf(stderr, "無法開啟 /dev/tty\n");
 			exit(1);
 		} else {
 #ifdef SIGWINCH
@@ -754,7 +754,7 @@
 		if (cmd)
 			execl((char *)s, (char *)s, "-c", cmd, NULL);
 		else {
-			fprintf(stderr, "You are at the command shell.  Type 'exit' to return\n");
+			fprintf(stderr, "你已在命命列的狀態下，鍵入 'exit' 即可返回 joe。\n");
 			execl((char *)s, (char *)s, NULL);
 		}
 		_exit(0);
@@ -818,7 +818,7 @@
 	omode = ttymode;
 	mpxsusp();
 	ttclsn();
-	fprintf(stderr, "You have suspended the program.  Type 'fg' to return\n");
+	fprintf(stderr, "你已經暫停目前這個 joe 程式，鍵入 'fg' 可以返回 joe。\n");
 	kill(0, SIGTSTP);
 #ifdef junk
 	/* Hmmm... this should not have been necessary */
diff -ruN joe-3.3/tw.c zh-joe-3.3/tw.c
--- joe-3.3/tw.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/tw.c	Wed Nov  9 20:37:21 2005
@@ -230,17 +230,17 @@
 					stalin = vsncpy(sv(stalin), sv(tmp));
 					vsrm(tmp);
 				} else {
-					stalin = vsncpy(sv(stalin), sc("Unnamed"));
+					stalin = vsncpy(sv(stalin), sc("未命名"));
 				}
 				}
 				break;
 			case 'm':
 				if (bw->b->changed)
-					stalin = vsncpy(sv(stalin), sc("(Modified)"));
+					stalin = vsncpy(sv(stalin), sc("(已更改)"));
 				break;
 			case 'R':
 				if (bw->b->rdonly)
-					stalin = vsncpy(sv(stalin), sc("(Read only)"));
+					stalin = vsncpy(sv(stalin), sc("(唯讀)"));
 				break;
 			case '*':
 				if (bw->b->changed)
@@ -348,7 +348,7 @@
 				break;
 			case 'M':
 				if (recmac) {
-					joe_snprintf_1((char *)buf, sizeof(buf), "(Macro %d recording...)", recmac->n);
+					joe_snprintf_1((char *)buf, sizeof(buf), "(巨集 %d 錄製中...)", recmac->n);
 					stalin = vsncpy(sv(stalin), sz(buf));
 				}
 				break;
@@ -576,7 +576,7 @@
 	if (bw->b->pid && bw->b->count==1)
 		return ukillpid(bw);
 	if (bw->b->changed && bw->b->count == 1 && !bw->b->scratch)
-		if (mkqw(bw->parent, sc("Lose changes to this file (y,n,^C)? "), naborttw, NULL, NULL, NULL))
+		if (mkqw(bw->parent, sc("放棄對這個檔案的更改 (y,n,^C)? "), naborttw, NULL, NULL, NULL))
 			return 0;
 		else
 			return -1;
@@ -602,7 +602,7 @@
 	if (bw->b->pid && bw->b->count==1)
 		return ukillpid(bw);
 	if (bw->b->changed && bw->b->count == 1 && !bw->b->scratch)
-		if (mkqw(bw->parent, sc("Lose changes to this file (y,n,^C)? "), naborttw1, NULL, NULL, NULL))
+		if (mkqw(bw->parent, sc("放棄對這個檔案的更改 (y,n,^C)? "), naborttw1, NULL, NULL, NULL))
 			return 0;
 		else
 			return -1;
diff -ruN joe-3.3/ublock.c zh-joe-3.3/ublock.c
--- joe-3.3/ublock.c	Fri Apr 22 21:51:40 2005
+++ zh-joe-3.3/ublock.c	Wed Nov  9 20:37:21 2005
@@ -301,7 +301,7 @@
 		prm(markk); markk=0;
 		updall();
 		nowmarking = 0;
-		msgnw(bw->parent, US "Selection cleared.");
+		msgnw(bw->parent, US "取消區塊標示");
 		return 0;
 	} else if (markk) {
 		/* Clear selection and start new one */
@@ -309,7 +309,7 @@
 		prm(markk); markk=0;
 		updall();
 		nowmarking = 1;
-		msgnw(bw->parent, US "Selection started.");
+		msgnw(bw->parent, US "開始標示區塊");
 		return umarkb(bw);
 	} else if (markb && markb->b==bw->cursor->b) {
 		nowmarking = 0;
@@ -326,7 +326,7 @@
 		return 0;
 	} else {
 		nowmarking = 1;
-		msgnw(bw->parent, US "Selection started.");
+		msgnw(bw->parent, US "開始標示區塊");
 		return umarkb(bw);
 	}
 }
@@ -436,7 +436,7 @@
 		if (lightoff)
 			unmark(bw);
 	} else {
-		msgnw(bw->parent, US "No block");
+		msgnw(bw->parent, US "尚未選取區塊");
 		return -1;
 	}
 	return 0;
@@ -522,7 +522,7 @@
 			return 0;
 		}
 	}
-	msgnw(bw->parent, US "No block");
+	msgnw(bw->parent, US "尚未選取區塊");
 	return -1;
 }
 
@@ -578,7 +578,7 @@
 			return 0;
 		}
 	} else {
-		msgnw(bw->parent, US "No block");
+		msgnw(bw->parent, US "尚未選取區塊");
 		return -1;
 	}
 }
@@ -622,7 +622,7 @@
 		}
 	} else {
 		vsrm(s);
-		msgnw(bw->parent, US "No block");
+		msgnw(bw->parent, US "尚未選取區塊");
 		return -1;
 	}
 }*/
@@ -776,7 +776,7 @@
 			prm(p);
 		} else {
 			/* Purity failure */
-			msgnw(bw->parent,US "Selected lines not properly indented");
+			msgnw(bw->parent,US "所選取的行落，尚未加以適當縮排。");
 			return 1;
 		}
 	}
@@ -859,7 +859,7 @@
 			prm(q);
 		} else {
 			/* Purity failure */
-			msgnw(bw->parent,US "Selected lines not properly indented");
+			msgnw(bw->parent,US "所選取的行落，尚未加以適當縮排。");
 			return 1;
 		}
 	}
@@ -907,7 +907,7 @@
 			updall();
 			return 0;
 		} else {
-			msgnw(bw->parent, US "No block");
+			msgnw(bw->parent, US "尚未選取區塊");
 			return -1;
 	} else {
 		int ret = 0;
@@ -941,7 +941,7 @@
 		flg = 1;
 		goto ok;
 	} if (!markv(1)) {
-		msgnw(bw->parent, US "No block");
+		msgnw(bw->parent, US "尚未選取區塊");
 		return -1;
 	}
       ok:
@@ -1087,23 +1087,23 @@
 int ufilt(BW *bw)
 {
 #ifdef __MSDOS__
-	msgnw(bw->parent, "Sorry, no sub-processes in DOS (yet)");
+	msgnw(bw->parent, "對不起!在 MS-DOS 下不能另外再執行子行程!");
 	return -1;
 #else
 	switch (checkmark(bw)) {
 	case 0:
-		if (wmkpw(bw->parent, US "Command to filter block through (^C to abort): ", &filthist, dofilt, NULL, NULL, utypebw, NULL, NULL, locale_map, 1))
+		if (wmkpw(bw->parent, US "用來過濾區塊的命令名稱 (^C 中斷): ", &filthist, dofilt, NULL, NULL, utypebw, NULL, NULL, locale_map, 1))
 			return 0;
 		else
 			return -1;
 	case 1:
-		if (wmkpw(bw->parent, US "Command to filter file through (^C to abort): ", &filthist, dofilt, NULL, NULL, utypebw, NULL, NULL, locale_map, 1))
+		if (wmkpw(bw->parent, US "用來過濾區塊的命令名稱 (^C 中斷): ", &filthist, dofilt, NULL, NULL, utypebw, NULL, NULL, locale_map, 1))
 			return 0;
 		else
 			return -1;
 	case 2:
 	default:
-		msgnw(bw->parent, US "No block");
+		msgnw(bw->parent, US "尚未選取區塊");
 		return -1;
 	}
 #endif
@@ -1174,7 +1174,7 @@
  * avg = sum/count
  *
  * stddev = sqrt(  (a-avg)^2 + (b-avg)^2 + (c-avg)^2 )
- *        = sqrt(  a^2-2*a*avg+avg^2  + b^2-2*b*avg+avg^2 +�c^2-2*c*avg+avg^2 )
+ *        = sqrt(  a^2-2*a*avg+avg^2  + b^2-2*b*avg+avg^2 +c^2-2*c*avg+avg^2 )
  *        = sqrt(  a^2+b^2+c^2 + 3*avg^2 - 2*avg*(a+b+c) )
  *        = sqrt(  sumsq + count*avg^2 - 2*avg*sum  )
  *
diff -ruN joe-3.3/uedit.c zh-joe-3.3/uedit.c
--- joe-3.3/uedit.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/uedit.c	Wed Nov  9 20:37:21 2005
@@ -1402,14 +1402,14 @@
 		if (merr)
 			msgnw(bw->parent, merr);
 		else
-			msgnw(bw->parent, US "Invalid line number");
+			msgnw(bw->parent, US "不正確的行數");
 		return -1;
 	}
 }
 
 int uline(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Go to line (^C to abort): ", &linehist, doline, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
+	if (wmkpw(bw->parent, US "跳到第幾行 (^C 中斷): ", &linehist, doline, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
 		return 0;
 	else
 		return -1;
@@ -1438,14 +1438,14 @@
 		if (merr)
 			msgnw(bw->parent, merr);
 		else
-			msgnw(bw->parent, US "Invalid column number");
+			msgnw(bw->parent, US "不正確的列數");
 		return -1;
 	}
 }
 
 int ucol(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Go to column (^C to abort): ", &colhist, docol, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
+	if (wmkpw(bw->parent, US "跳到第幾列 (^C 中斷): ", &colhist, docol, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
 		return 0;
 	else
 		return -1;
@@ -1474,14 +1474,14 @@
 		if (merr)
 			msgnw(bw->parent, merr);
 		else
-			msgnw(bw->parent, US "Invalid byte number");
+			msgnw(bw->parent, US "不正確的位元數");
 		return -1;
 	}
 }
 
 int ubyte(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Go to byte (^C to abort): ", &bytehist, dobyte, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
+	if (wmkpw(bw->parent, US "跳到第幾位元 (^C 中斷): ", &bytehist, dobyte, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
 		return 0;
 	else
 		return -1;
@@ -2051,7 +2051,7 @@
 int uquote(BW *bw)
 {
 	quotestate = 0;
-	if (mkqwna(bw->parent, sc("Ctrl- (or 0-9 for dec. ascii, x for hex, or o for octal)"), doquote, NULL, NULL, NULL))
+	if (mkqwna(bw->parent, sc("Ctrl- ( asci0-9 十進位, x 十六進位, o 八進位)"), doquote, NULL, NULL, NULL))
 		return 0;
 	else
 		return -1;
@@ -2183,7 +2183,7 @@
 		pdupown(bw->cursor, bw->b->marks + c - '0');
 		poffline(bw->b->marks[c - '0']);
 		if (c!=':') {
-			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "Mark %d set", c - '0');
+			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "設定第 %d 標記", c - '0');
 			msgnw(bw->parent, msgbuf);
 		}
 		return 0;
@@ -2197,7 +2197,7 @@
 {
 	if (c >= '0' && c <= ':')
 		return dosetmark(bw, c, NULL, NULL);
-	else if (mkqwna(bw->parent, sc("Set mark (0-9):"), dosetmark, NULL, NULL, NULL))
+	else if (mkqwna(bw->parent, sc("設定標記 (0-9):"), dosetmark, NULL, NULL, NULL))
 		return 0;
 	else
 		return -1;
@@ -2215,7 +2215,7 @@
 			bw->cursor->xcol = piscol(bw->cursor);
 			return 0;
 		} else {
-			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "Mark %d not set", c - '0');
+			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "標記 %d 沒有設定完成", c - '0');
 			msgnw(bw->parent, msgbuf);
 			return -1;
 	} else {
@@ -2228,7 +2228,7 @@
 {
 	if (c >= '0' && c <= '9')
 		return dogomark(bw, c, NULL, NULL);
-	else if (mkqwna(bw->parent, sc("Goto bookmark (0-9):"), dogomark, NULL, NULL, NULL))
+	else if (mkqwna(bw->parent, sc("跳到第幾書籤 (0-9):"), dogomark, NULL, NULL, NULL))
 		return 0;
 	else
 		return -1;
@@ -2260,7 +2260,7 @@
 				break;
 	}
 	if (c == NO_MORE_DATA) {
-		msgnw(bw->parent, US "Not found");
+		msgnw(bw->parent, US "找不到");
 		prm(q);
 		return -1;
 	} else {
@@ -2307,7 +2307,7 @@
 
 int umsg(BASE *b)
 {
-	if (wmkpw(b->parent, US "Msg (^C to abort): ", NULL, domsg, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
+	if (wmkpw(b->parent, US "訊息 (^C 中斷): ", NULL, domsg, NULL, NULL, NULL, NULL, NULL, locale_map, 0))
 		return 0;
 	else
 		return -1;
@@ -2329,7 +2329,7 @@
 
 int utxt(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Insert (^C to abort): ", NULL, dotxt, NULL, NULL, utypebw, NULL, NULL, bw->b->o.charmap, 0))
+	if (wmkpw(bw->parent, US "插入 (^C 中斷): ", NULL, dotxt, NULL, NULL, utypebw, NULL, NULL, bw->b->o.charmap, 0))
 		return 0;
 	else
 		return -1;
diff -ruN joe-3.3/uerror.c zh-joe-3.3/uerror.c
--- joe-3.3/uerror.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/uerror.c	Wed Nov  9 20:37:21 2005
@@ -259,9 +259,9 @@
 	n = parserr(b);
 	bw = find_a_good_bw(b);
 	if (n)
-		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "%ld messages found", n);
+		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "發現 %ld ", n);
 	else
-		joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "No messages found");
+		joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "找不到訊息");
 	msgnw(bw->parent, msgbuf);
 	return 0;
 }
@@ -273,9 +273,9 @@
 	freeall();
 	n = parserr(bw->b);
 	if (n)
-		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "%ld messages found", n);
+		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "發現 %ld ", n);
 	else
-		joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "No messages found");
+		joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "找不到訊息");
 	msgnw(bw->parent, msgbuf);
 	return 0;
 }
@@ -342,7 +342,7 @@
 int unxterr(BW *bw)
 {
 	if (errptr->link.next == &errors) {
-		msgnw(bw->parent, US "No more errors");
+		msgnw(bw->parent, US "錯誤顯示完畢");
 		return -1;
 	}
 	errptr = errptr->link.next;
@@ -353,7 +353,7 @@
 int uprverr(BW *bw)
 {
 	if (errptr->link.prev == &errors) {
-		msgnw(bw->parent, US "No more errors");
+		msgnw(bw->parent, US "錯誤顯示完畢");
 		return -1;
 	}
 	errptr = errptr->link.prev;
diff -ruN joe-3.3/ufile.c zh-joe-3.3/ufile.c
--- joe-3.3/ufile.c	Mon Apr 25 21:11:24 2005
+++ zh-joe-3.3/ufile.c	Wed Nov  9 20:37:21 2005
@@ -75,21 +75,21 @@
 	if (bw->b->name && bw->b->name[0]) {
 		s = bw->b->name;
 	} else {
-		s = US "(Unnamed)";
+		s = US "(未命名)";
 	}
 
 	if (name) {
 		if (saved) {
-			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "File %s saved", name);
+			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "檔案： %s 存檔完畢。", name);
 		} else {
-			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "File %s not saved", name);
+			joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "檔案： %s 並未儲存。", name);
 		}
 	} else if (bw->b->changed && bw->b->count == 1) {
-		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "File %s not saved", s);
+		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "檔案： %s 並未儲存。", s);
 	} else if (saved) {
-		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "File %s saved", s);
+		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "檔案： %s 存檔完畢。", s);
 	} else {
-		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "File %s not changed so no update needed", s);
+		joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "檔案 %s 並未改變，所以不需要更新資料。", s);
 	}
 	msgnw(bw->parent, msgbuf);
 
@@ -97,17 +97,17 @@
 		vsrm(exmsg);
 
 	if (bw->b->changed && bw->b->count == 1) {
-		exmsg = vsncpy(NULL, 0, sc("File "));
+		exmsg = vsncpy(NULL, 0, sc("檔案 "));
 		exmsg = vsncpy(sv(exmsg), sz(s));
-		exmsg = vsncpy(sv(exmsg), sc(" not saved."));
+		exmsg = vsncpy(sv(exmsg), sc(" 並未儲存。"));
 	} else if (saved) {
-		exmsg = vsncpy(NULL, 0, sc("File "));
+		exmsg = vsncpy(NULL, 0, sc("檔案 "));
 		exmsg = vsncpy(sv(exmsg), sz(s));
-		exmsg = vsncpy(sv(exmsg), sc(" saved."));
+		exmsg = vsncpy(sv(exmsg), sc(" 存檔完畢。"));
 	} else {
-		exmsg = vsncpy(NULL, 0, sc("File "));
+		exmsg = vsncpy(NULL, 0, sc("檔案 "));
 		exmsg = vsncpy(sv(exmsg), sz(s));
-		exmsg = vsncpy(sv(exmsg), sc(" not changed so no update needed."));
+		exmsg = vsncpy(sv(exmsg), sc(" 並未改變，所以不需要更新資料。"));
 	}
 }
 
@@ -116,11 +116,11 @@
 {
 	if (saved)
 		if (skipped)
-			joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "Some files have not been saved.");
+			joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "有些檔案無法儲存(可能是：重複開啟、權限不足、空間不夠)");
 		else
-			joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "All modified files have been saved.");
+			joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "所有有變動過的檔案都已儲存。");
 	else
-		joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "No modified files, so no updates needed.");
+		joe_snprintf_0((char *)msgbuf, JOE_MSGBUFSIZE, "所有開啟的檔案都未改變，所以不需要更新資料。");
 
 	msgnw(bw->parent, msgbuf);
 
@@ -156,7 +156,7 @@
 
 int usys(BW *bw)
 {
-	if (wmkpw(bw->parent, US "System (^C to abort): ", NULL, dosys, NULL, NULL, NULL, NULL, NULL, bw->b->o.charmap, 1))
+	if (wmkpw(bw->parent, US "System (^C 中斷): ", NULL, dosys, NULL, NULL, NULL, NULL, NULL, bw->b->o.charmap, 1))
 		return 0;
 	else
 		return -1;
@@ -320,7 +320,7 @@
 {
 	int fl;
 	if (c == 'n' || c == 'N') {
-		msgnw(bw->parent, US "Couldn't make backup file... file not saved");
+		msgnw(bw->parent, US "無法產生備份檔... 檔案並未儲存。");
 		if (req->callback) {
 			return req->callback(bw, req, -1, notify);
 		} else {
@@ -332,7 +332,7 @@
 		}
 	}
 	if (c != 'y' && c != 'Y') {
-		if (mkqw(bw->parent, sc("Could not make backup file.  Save anyway (y,n,^C)? "), saver, NULL, req, notify)) {
+		if (mkqw(bw->parent, sc("無法產生備份檔。  無論如何都要儲存 (y,n,^C)? "), saver, NULL, req, notify)) {
 			return 0;
 		} else {
 			rmsavereq(req);
@@ -420,7 +420,7 @@
 				}
 				brm(tmp);
 				if (!ret) {
-					joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "Block written to file %s", req->name);
+					joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "所選取的區塊已存成 %s 檔", req->name);
 					msgnw(bw->parent, msgbuf);
 				}
 				if (lightoff)
@@ -436,7 +436,7 @@
 					ret = -1;
 				}
 				if (!ret) {
-					joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "Block written to file %s", req->name);
+					joe_snprintf_1((char *)msgbuf, JOE_MSGBUFSIZE, "所選取的區塊已存成 %s 檔", req->name);
 					msgnw(bw->parent, msgbuf);
 				}
 				if (lightoff)
@@ -446,7 +446,7 @@
 			}
 		} else {
 			vsrm(req->name);
-			msgnw(bw->parent, US "No block");
+			msgnw(bw->parent, US "沒有標示區塊");
 			return -1;
 		}
 	}
@@ -499,14 +499,14 @@
 				close(f);
 				/* char *msg = "File exists. Overwrite (y,n,^C)? ";
 				   req->message = msg; */
-				req->message = US "File exists. Overwrite (y,n,^C)? ";
+				req->message = US "檔案已經存在。  要覆蓋\舊檔嗎 (y,n,^C)? ";
 				return dosave2(bw, 0, req, notify);
 			}
 		}
 		else {
 			/* We're saving a newer version of the same file */
 			if (check_mod(bw->b)) {
-				req->message = US "File on disk is newer. Overwrite (y,n,^C)? ";
+				req->message = US "磁碟上的檔案比較新喔∼仍要覆蓋嗎 Overwrite (y,n,^C)? ";
 				return dosave2(bw, 0, req, notify);
 			}
 		}
@@ -521,7 +521,7 @@
 {
 	BW *pbw;
 	
-	pbw = wmkpw(bw->parent, US "Name of file to save (^C to abort): ", &filehist, dosave1, US "Names", NULL, cmplt,
+	pbw = wmkpw(bw->parent, US "要儲存的檔案名稱 (^C 中斷): ", &filehist, dosave1, US "Names", NULL, cmplt,
 	            mksavereq(NULL,NULL,NULL,0, 0), NULL, locale_map, bw->b->name ? 1 : 7);
 
 	if (pbw && bw->b->name) {
@@ -551,7 +551,7 @@
 int ublksave(BW *bw)
 {
 	if (markb && markk && markb->b == markk->b && (markk->byte - markb->byte) > 0 && (!square || piscol(markk) > piscol(markb))) {
-		if (wmkpw(bw->parent, US "Name of file to write (^C to abort): ", &filehist, dosave1, US "Names", NULL, cmplt, mksavereq(NULL, NULL, NULL, 0, 1), NULL, locale_map, 3)) {
+		if (wmkpw(bw->parent, US "要儲存的檔案名稱 (^C 中斷): ", &filehist, dosave1, US "Names", NULL, cmplt, mksavereq(NULL, NULL, NULL, 0, 1), NULL, locale_map, 3)) {
 			return 0;
 		} else {
 			return -1;
@@ -653,7 +653,7 @@
 		return ret;
 	} else {
 		/* FIXME: need abort handler to prevent leak */
-		if (mkqw(bw->parent, sc("Load original file from disk (y,n,^C)? "), doedit1, NULL, s, notify))
+		if (mkqw(bw->parent, sc("從磁碟中開啟原本的舊檔案 (y,n,^C)? "), doedit1, NULL, s, notify))
 			return 0;
 		else {
 			vsrm(s);
@@ -687,7 +687,7 @@
 int okrepl(BW *bw)
 {
 	if (bw->b->count == 1 && bw->b->changed) {
-		msgnw(bw->parent, US "Can't replace modified file");
+		msgnw(bw->parent, US "無法取代已更改過的檔案。");
 		return -1;
 	} else {
 		return 0;
@@ -696,7 +696,7 @@
 
 int uedit(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Name of file to edit (^C to abort): ", &filehist, doedit, US "Names", NULL, cmplt, NULL, NULL, locale_map,7)) {
+	if (wmkpw(bw->parent, US "要編輯的檔案名稱 (^C 中斷)): ", &filehist, doedit, US "Names", NULL, cmplt, NULL, NULL, locale_map,7)) {
 		return 0;
 	} else {
 		return -1;
@@ -717,7 +717,7 @@
 
 int uswitch(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Name of buffer to edit (^C to abort): ", &filehist, doswitch, US "Names", NULL, cmplt, NULL, NULL, locale_map,1)) {
+	if (wmkpw(bw->parent, US "要編輯的 buffer 名稱 (^C 中斷): ", &filehist, doswitch, US "Names", NULL, cmplt, NULL, NULL, locale_map,1)) {
 		return 0;
 	} else {
 		return -1;
@@ -773,7 +773,7 @@
 
 int uscratch(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Name of scratch buffer to edit (^C to abort): ", &filehist, doscratch, US "Names", NULL, cmplt, NULL, NULL, locale_map, 1)) {
+	if (wmkpw(bw->parent, US "要編輯的 scratch buffer 名稱 (^C 中斷): ", &filehist, doscratch, US "Names", NULL, cmplt, NULL, NULL, locale_map, 1)) {
 		return 0;
 	} else {
 		return -1;
@@ -878,7 +878,7 @@
 
 int uinsf(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Name of file to insert (^C to abort): ", &filehist, doinsf, US "Names", NULL, cmplt, NULL, NULL, locale_map, 3)) {
+	if (wmkpw(bw->parent, US "要插入的檔名 (^C 中斷): ", &filehist, doinsf, US "Names", NULL, cmplt, NULL, NULL, locale_map, 3)) {
 		return 0;
 	} else {
 		return -1;
@@ -912,7 +912,7 @@
 		/* It changed, it's not a scratch buffer and it's named */
 		return dosave1(bw, vsncpy(NULL, 0, sz(bw->b->name)), mksavereq(exdone,NULL,NULL,0,0), NULL);
 	} else {
-		BW *pbw = wmkpw(bw->parent, US "Name of file to save (^C to abort): ", &filehist,
+		BW *pbw = wmkpw(bw->parent, US "欲儲存的檔案名稱 (^C to abort): ", &filehist,
 		                dosave1, US "Names", NULL, cmplt,
 		                mksavereq(exdone,NULL,NULL,1,0), NULL, locale_map, 1);
 
@@ -946,7 +946,7 @@
 		abortit(bw);
 		return -1;
 	} else if (bw->b->count == 1 && bw->b->changed && !bw->b->scratch) {
-		if (mkqw(bw->parent, sc("Save changes to this file (y,n,^C)? "), nask, NULL, object, notify)) {
+		if (mkqw(bw->parent, sc("要儲存對這檔案的更改嗎 (y,n,^C)? "), nask, NULL, object, notify)) {
 			return 0;
 		} else {
 			return -1;
@@ -1023,7 +1023,7 @@
 		return ukillpid(bw);
 	}
 	if (bw->b->changed && !bw->b->scratch) {
-		if (mkqw(bw->parent, sc("Lose changes to this file (y,n,^C)? "), dolose, NULL, NULL, NULL)) {
+		if (mkqw(bw->parent, sc("放棄對這檔案的更改嗎 (y,n,^C)? "), dolose, NULL, NULL, NULL)) {
 			return 0;
 		} else {
 			return -1;
@@ -1076,7 +1076,7 @@
 			return dosave1(bw, vsncpy(NULL,0,sz(bw->b->name)), req, notify);
 		else {
 			BW *pbw;
-			pbw = wmkpw(bw->parent, US "Name of file to save (^C to abort): ", &filehist, dosave1, US "Names", NULL, cmplt, req, notify, locale_map, 7);
+			pbw = wmkpw(bw->parent, US "欲儲存的檔案名稱 (^C 中斷): ", &filehist, dosave1, US "Names", NULL, cmplt, req, notify, locale_map, 7);
 
 			if (pbw) {
 				return 0;
@@ -1110,7 +1110,7 @@
 		return doquerysave(bw,0,req,notify);
 	} else {
 		unsigned char buf[1024];
-		joe_snprintf_1((char *)buf,1024,"File %s has been modified.  Save it (y,n,^C)? ",bw->b->name ? bw->b->name : US "(Unnamed)" );
+		joe_snprintf_1((char *)buf,1024,"%s 檔已有變動過了，仍然要儲存 (y,n,^C)? ",bw->b->name ? bw->b->name : US "(Unnamed)" );
 		if (mkqw(bw->parent, sz(buf), doquerysave, NULL, req, notify)) {
 			return 0;
 			} else {
diff -ruN joe-3.3/uisrch.c zh-joe-3.3/uisrch.c
--- joe-3.3/uisrch.c	Fri Mar 18 07:45:32 2005
+++ zh-joe-3.3/uisrch.c	Wed Nov  9 20:37:21 2005
@@ -264,7 +264,7 @@
 	isrch->pattern = vsncpy(NULL, 0, NULL, 0);
 	isrch->dir = dir;
 	isrch->quote = 0;
-	isrch->prompt = vsncpy(NULL, 0, sc("I-find: "));
+	isrch->prompt = vsncpy(NULL, 0, sc("即時搜尋: "));
 	isrch->ofst = sLen(isrch->prompt);
 	return itype(bw, -1, isrch, NULL);
 }
diff -ruN joe-3.3/umath.c zh-joe-3.3/umath.c
--- joe-3.3/umath.c	Mon Apr 25 21:11:25 2005
+++ zh-joe-3.3/umath.c	Wed Nov  9 20:37:21 2005
@@ -34,7 +34,7 @@
 static RETSIGTYPE fperr(int unused)
 {
 	if (!merr) {
-		merr = US "Float point exception";
+		merr = US "必須使用浮點數";
 	}
 	REINSTALL_SIGHANDLER(SIGFPE, fperr);
 }
@@ -126,7 +126,7 @@
 				}
 			} else {
 				if (!merr)
-					merr = US "Missing (";
+					merr = US "找不到 (";
 			}
 			c = *ptr;
 		} else if (!en) {
@@ -155,20 +155,20 @@
 			double xsq;
 			int cnt = blksum(&x, &xsq);
 			if (!merr && cnt<=0)
-				merr = US "No numbers in block";
+				merr = US "區塊中沒有數字";
 			v = 0;
 		} else if (!zcmp(s,US "cnt")) {
 			double xsq;
 			int cnt = blksum(&x, &xsq);
 			if (!merr && cnt<=0)
-				merr = US "No numbers in block";
+				merr = US "區塊中沒有數字";
 			v = 0;
 			x = cnt;
 		} else if (!zcmp(s,US "avg")) {
 			double xsq;
 			int cnt = blksum(&x, &xsq);
 			if (!merr && cnt<=0)
-				merr = US "No numbers in block";
+				merr = US "區塊中沒有數字";
 			v = 0;
 			if (cnt)
 				x /= (double)cnt;
@@ -177,7 +177,7 @@
 			double avg;
 			int cnt = blksum(&x, &xsq);
 			if (!merr && cnt<=0)
-				merr = US "No numbers in block";
+				merr = US "區塊中沒有數字";
 			v = 0;
 			if (cnt) {
 				avg = x / (double)cnt;
@@ -192,7 +192,7 @@
 				joe_free(e);
 				ptr = save;
 			} else if (!merr) {
-				merr = US "No block";
+				merr = US "沒有標示區塊k";
 			}
 		} else {
 			v = get(s);
@@ -208,7 +208,7 @@
 			++ptr;
 		else {
 			if (!merr)
-				merr = US "Missing )";
+				merr = US "找不到 )";
 		}
 	} else if (*ptr == '-') {
 		++ptr;
@@ -227,7 +227,7 @@
 			++ptr;
 		else {
 			if (!merr)
-				merr = US "Missing )";
+				merr = US "找不到 )";
 		}
 		if (v && v->func)
 			x = v->func(y);
@@ -345,7 +345,7 @@
 			v->set = 1;
 		} else {
 			if (!merr)
-				merr = US "Left side of = is not an l-value";
+				merr = US "等號\"=\"左邊的值不是一個 L-value";
 		}
 		v = 0;
 		goto loop;
@@ -379,7 +379,7 @@
 					++ptr;
 				}
 			} else if (*ptr) {
-				merr = US "Extra junk after end of expr";
+				merr = US "運算式後有額外無用的運算式";
 			}
 		}
 	}
diff -ruN joe-3.3/undo.c zh-joe-3.3/undo.c
--- joe-3.3/undo.c	Mon Apr 25 21:11:25 2005
+++ zh-joe-3.3/undo.c	Wed Nov  9 20:37:21 2005
@@ -450,7 +450,7 @@
 {
 	bw_unlock(bw);
 	bw->b->changed = 0;
-	msgnw(bw->parent, US "Modified flag cleared");
+	msgnw(bw->parent, US "更改過的標誌已經清除");
 	return 0;
 }
 
@@ -467,7 +467,7 @@
 			unmark(bw);
 		return 0;
 	} else {
-		msgnw(bw->parent, US "No block");
+		msgnw(bw->parent, US "沒有標示區塊");
 		return -1;
 	}
 }
diff -ruN joe-3.3/usearch.c zh-joe-3.3/usearch.c
--- joe-3.3/usearch.c	Mon Apr 25 21:11:25 2005
+++ zh-joe-3.3/usearch.c	Wed Nov  9 20:37:21 2005
@@ -594,9 +594,9 @@
 			joe_snprintf_1((char *)bf1,30,"%s",globalsrch->replacement);
 			if (zlen(globalsrch->replacement)>29)
 				zcat(bf1,US "$");
-			joe_snprintf_1((char *)buf,sizeof(buf),"Replace with (^C to abort) [%s]: ",bf1);
+			joe_snprintf_1((char *)buf,sizeof(buf),"要以什麼取代 (^C 中斷) [%s]: ",bf1);
 		} else
-			zcpy(buf, US "Replace with (^C to abort): ");
+			zcpy(buf, US "要以什麼取代 (^C 中斷): ");
 		if (wmkpw(bw->parent, buf, &replhist, set_replace, srchstr, pfabort, srch_cmplt, srch, notify, bw->b->o.charmap, 0))
 			return 0;
 		else
@@ -611,9 +611,9 @@
 	unsigned char *p;
 
 	if (icase)
-		p = US "case (S)ensitive (R)eplace (B)ackwards Bloc(K) NNN (^C to abort): ";
+		p = US "(S)符合大小寫 (R)取代 (B)往前搜尋 (K)搜尋區塊 (N)符合字串(^C 中斷): ";
 	else
-		p = US "(I)gnore (R)eplace (B)ackwards Bloc(K) NNN (^C to abort): ";
+		p = US "(I)忽略 (R)取代 (B)往前搜尋 (K)搜尋區塊 (N)符合字串(^C 中斷): ";
 
 	vsrm(srch->pattern);
 	if (s[0] || !globalsrch || !pico)
@@ -676,9 +676,9 @@
 		joe_snprintf_1((char *)bf1,30,"%s",globalsrch->pattern);
 		if (zlen(globalsrch->pattern)>29)
 			zcat(bf1,US "$");
-		joe_snprintf_1((char *)buf,sizeof(buf),"Find (^C to abort) [%s]: ",bf1);
+		joe_snprintf_1((char *)buf,sizeof(buf),"找尋字串 (^C 中斷) [%s]: ",bf1);
 	} else
-		zcpy(buf, US "Find (^C to abort): ");
+		zcpy(buf, US "找尋字串 (^C 中斷): ");
 	if (pbw=wmkpw(bw->parent, buf, &findhist, set_pattern, srchstr, pfabort, srch_cmplt, srch, NULL, bw->b->o.charmap, 0)) {
 		if (hint) {
 			binss(pbw->cursor, hint);
@@ -790,7 +790,7 @@
 		nungetc(c);
 		return 0;
 	}
-	if (mkqwnsr(bw->parent, sc("Replace (Y)es (N)o (R)est (B)ackup (^C to abort)?"), dopfrepl, pfsave, srch, notify))
+	if (mkqwnsr(bw->parent, sc("取代 (Y)是 (N)否 (R)全部取代 (B)備份 (^C 中斷)?"), dopfrepl, pfsave, srch, notify))
 		return 0;
 	else
 		return pfsave(bw, srch);
@@ -905,9 +905,9 @@
 	case 1:
 bye:		if (!srch->flg && !srch->rest) {
 			if (srch->valid && srch->block_restrict)
-				msgnw(bw->parent, US "Not found (search restricted to marked block)");
+				msgnw(bw->parent, US "找不到 :( (搜尋範圍限定在所選定的區塊內)");
 			else
-				msgnw(bw->parent, US "Not found");
+				msgnw(bw->parent, US "找不到 :(");
 			ret = -1;
 		}
 		break;
diff -ruN joe-3.3/ushell.c zh-joe-3.3/ushell.c
--- joe-3.3/ushell.c	Mon Apr 25 21:11:25 2005
+++ zh-joe-3.3/ushell.c	Wed Nov  9 20:37:21 2005
@@ -108,7 +108,7 @@
 		*notify = 1;
 	}
 	varm(s);
-	msgnw(bw->parent, "Sorry, no sub-processes in DOS (yet)");
+	msgnw(bw->parent, "對不起!在 MS-DOS 下不能另外再執行子行程!");
 	return -1;
 #else
 	MPX *m;
@@ -117,7 +117,7 @@
 		*notify = 1;
 	}
 	if (bw->b->pid) {
-		msgnw(bw->parent, US "Program already running in this window");
+		msgnw(bw->parent, US "程式已經在這個視窗中執行");
 		varm(s);
 		return -1;
 	}
@@ -125,7 +125,7 @@
 
 	if (!(m = mpxmk(&bw->b->out, name, s, cdata, bw->b, build ? cdone_parse : cdone, bw->b))) {
 		varm(s);
-		msgnw(bw->parent, US "No ptys available");
+		msgnw(bw->parent, US "沒有多餘的 ptys 可供使用");
 		return -1;
 	} else {
 		bw->b->pid = m->pid;
@@ -183,7 +183,7 @@
 
 int urun(BW *bw)
 {
-	if (wmkpw(bw->parent, US "Program to run: ", &runhist, dorun, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
+	if (wmkpw(bw->parent, US "欲執行的程式名稱: ", &runhist, dorun, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
 		return 0;
 	} else {
 		return -1;
@@ -207,7 +207,7 @@
 int ubuild(BW *bw)
 {
 	if (buildhist) {
-		if (bw=wmkpw(bw->parent, US "Build command: ", &buildhist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
+		if (bw=wmkpw(bw->parent, US "編譯指令: ", &buildhist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
 			uuparw(bw);
 			u_goto_eol(bw);
 			bw->cursor->xcol = piscol(bw->cursor);
@@ -216,7 +216,7 @@
 		return -1;
 		}
 	} else {
-		if (wmkpw(bw->parent, US "Enter build command (for example, 'make'): ", &buildhist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
+		if (wmkpw(bw->parent, US "請輸入編譯的指令 (舉例 'make'): ", &buildhist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
 			return 0;
 		} else {
 		return -1;
@@ -229,7 +229,7 @@
 int ugrep(BW *bw)
 {
 	if (grephist) {
-		if (bw=wmkpw(bw->parent, US "Grep command: ", &grephist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
+		if (bw=wmkpw(bw->parent, US "Grep 指令: ", &grephist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
 			uuparw(bw);
 			u_goto_eol(bw);
 			bw->cursor->xcol = piscol(bw->cursor);
@@ -238,7 +238,7 @@
 		return -1;
 		}
 	} else {
-		if (wmkpw(bw->parent, US "Enter grep command (for example, 'grep -n foo *.c'): ", &grephist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
+		if (wmkpw(bw->parent, US "請輸入 grep 指令 (舉例 'grep -n foo *.c'): ", &grephist, dobuild, US "Run", NULL, NULL, NULL, NULL, locale_map, 1)) {
 			return 0;
 		} else {
 		return -1;
@@ -267,7 +267,7 @@
 int ukillpid(BW *bw)
 {
 	if (bw->b->pid) {
-		if (mkqw(bw->parent, sc("Kill program (y,n,^C)?"), pidabort, NULL, NULL, NULL)) {
+		if (mkqw(bw->parent, sc("中斷正在執行的程式 (y,n,^C)?"), pidabort, NULL, NULL, NULL)) {
 			return 0;
 		} else {
 			return -1;
diff -ruN joe-3.3/utag.c zh-joe-3.3/utag.c
--- joe-3.3/utag.c	Mon Apr 25 21:11:25 2005
+++ zh-joe-3.3/utag.c	Wed Nov  9 20:37:21 2005
@@ -41,7 +41,7 @@
 	}
 	f = fopen("tags", "r");
 	if (!f) {
-		msgnw(bw->parent, US "Couldn't open tags file");
+		msgnw(bw->parent, US "無法開啟標籤檔");
 		vsrm(s);
 		vsrm(t);
 		return -1;
@@ -87,7 +87,7 @@
 							dofollows();
 							mid = omid;
 						} else {
-							msgnw(bw->parent, US "Invalid line number");
+							msgnw(bw->parent, US "不正確的行數");
 						}
 					} else {
 						if (buf[y] == '/' || buf[y] == '?') {
@@ -121,7 +121,7 @@
 			}
 		}
 	}
-	msgnw(bw->parent, US "Not found");
+	msgnw(bw->parent, US "找不到");
 	vsrm(s);
 	vsrm(t);
 	fclose(f);
@@ -182,7 +182,7 @@
 {
 	BW *pbw;
 
-	pbw = wmkpw(bw->parent, US "Tag search: ", &taghist, dotag, NULL, NULL, tag_cmplt, NULL, NULL, locale_map, 0);
+	pbw = wmkpw(bw->parent, US "標籤搜尋: ", &taghist, dotag, NULL, NULL, tag_cmplt, NULL, NULL, locale_map, 0);
 	if (pbw && joe_isalnum_(bw->b->o.charmap,brch(bw->cursor))) {
 		P *p = pdup(bw->cursor);
 		P *q = pdup(p);
diff -ruN joe-3.3/vfile.c zh-joe-3.3/vfile.c
--- joe-3.3/vfile.c	Wed Mar  2 23:16:56 2005
+++ zh-joe-3.3/vfile.c	Wed Nov  9 20:37:21 2005
@@ -191,7 +191,7 @@
 				pp->next = vp->next;
 				goto gotit;
 			}
-	write(2, "vfile: out of memory\n", 21);
+	write(2, "vfile: 記憶體不足\n", 21);
 	exit(1);
 
       gotit:
@@ -246,7 +246,7 @@
 	new->name = vsncpy(NULL, 0, sz(name));
 	new->fd = open(name, O_RDWR);
 	if (!new->fd) {
-		fprintf(stderr, "Couldn\'t open file \'%s\'\n", name);
+		fprintf(stderr, "無法開啟檔案 \'%s\'\n", name);
 		joe_free(new);
 		return NULL;
 	}
