diff -ruN joe.orig/.joerc joe/.joerc
--- joe.orig/.joerc	Sat Mar 10 06:28:31 2001
+++ joe/.joerc	Sat Mar 10 06:28:48 2001
@@ -25,7 +25,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
 
@@ -102,7 +102,7 @@
   \f  Blink
 
 -lmsg \i%k%T%W%I%X %n %m%R %M
--rmsg  %S Row %r Col %c %t  Ctrl-K H for help
+-rmsg  %S 行數 %r 列數 %c %t  Ctrl-K H 線上輔助
 
  SECOND SECTION: File name dependant local option settings:
 
@@ -178,73 +178,75 @@
  Use \f to turn on/off flash
 
 {Basic
-\i   Help Screen    turn off with ^KH    more help with ESC . (^[.)              \i
-\i \i\uCURSOR\u           \uGO TO\u            \uBLOCK\u      \uDELETE\u   \uMISC\u         \uEXIT\u      \i \i
-\i \i^B left ^F right ^U  prev. screen ^KB begin  ^D char. ^KJ reformat ^KX save  \i \i
-\i \i^P up   ^N down  ^V  next screen  ^KK end    ^Y line  ^T  options  ^C  abort \i \i
-\i \i^Z previous word ^A  beg. of line ^KM move   ^W >word ^R  refresh  ^KZ shell \i \i
-\i \i^X next word     ^E  end of line  ^KC copy   ^O word< ^@  insert   \uFILE\u      \i \i
-\i \i\uSEARCH\u           ^KU top of file  ^KW file   ^J >line \uSPELL\u        ^KE edit  \i \i
-\i \i^KF find text    ^KV end of file  ^KY delete ^_ undo  ^[N word     ^KR insert\i \i
-\i \i^L  find next    ^KL to line No.  ^K/ filter ^^ redo  ^[L file     ^KD save  \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     ESC . 開啟更多輔助視窗 (^[.)            \i
+\i \i\u游  標\u           \u移 動\u            \u區 塊\u      \u刪  除\u   \u雜項\u         \u離開\u      \i \i
+\i \i^B 往左 ^F 往右  ^U  上一個視窗   ^KB 起始  ^D 字元   ^KJ 重新排列 ^KX 存檔  \i \i
+\i \i^P 往上 ^N 往下  ^V  下一個視窗   ^KK 結束  ^Y 整行   ^T  設定選項 ^C  放棄  \i \i
+\i \i^Z 前一個字      ^A  單行的最前面 ^KM 移動  ^W >單字  ^R  螢幕更新 ^KZ SHELL \i \i
+\i \i^X 下一個字      ^E  單行的最後面 ^KC 拷貝  ^O 單字<  ^@  插入空白 \u檔案\u      \i \i
+\i \i\u搜  尋\u           ^KU 檔案最前面   ^KW 存檔  ^J >行尾  \u拼  字\u       ^KE 編輯  \i \i
+\i \i^KF 搜尋字串     ^KV 檔案最後面   ^KY 刪除  ^_ 復原   ^[N 字       ^KR 插入  \i \i
+\i \i^L  下一字串     ^KL 跳往第幾行   ^K/ 過濾  ^^ 不復原 ^[L 檔案     ^KD 存檔  \i \i
 }
 
 {Windows
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i^KO Split the window in half           ^KE Load file into window             \i \i
-\i \i^KG Make current window bigger         ^KT Make current window smaller       \i \i
-\i \i^KN Go to the window below             ^KP Go to the window above            \i \i
-\i \i^C  Eliminate the current window       ^KI Show all windows / Show one window\i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i^KO 分割視窗為二                       ^KE 載入檔案進入游標所在視窗          \i \i
+\i \i^KG 放大游標所在視窗                   ^KT 縮小游標所在視窗                  \i \i
+\i \i^KN 跳往下一個視窗                     ^KP 跳往前一個視窗                    \i \i
+\i \i^C  消除游標所在視窗                   ^KI 顯示所有視窗 / 顯示游標所在視窗   \i \i
 }
 
 {Advanced
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i\uMACROS\u         \uMISC\u            \uSCROLL\u    \uSHELL\u       \uGOTO\u       \uI-SEARCH\u     \i \i
-\i \i^K[ 0-9 Record ^K SPACE status ^[W Up    ^K' Window  ^[B To ^KB ^[R Backwards\i \i
-\i \i^K]     Stop   ^K\\ Repeat      ^[Z Down  ^[! Command ^[K To ^KK ^[S Forwards \i \i
-\i \i^K 0-9  Play   ^[M Math        ^K< Left  \uQUOTE\u       \uDELETE\u     \uBOOKMARKS\u    \i \i
-\i \i^K?     Query  ^KA Center line ^K> Right `  Ctrl-    ^[Y yank   ^[ 0-9 Goto  \i \i
-\i \i^[D     Dump   ^[H Message               ^\\ Meta-    ^[O line<  ^[^[   Set   \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i\u巨  集\u       \u雜項\u         \u捲  軸\u   \uSHELL\u         \u移動\u            \u即時搜尋\u    \i \i
+\i \i^K[ 0-9 記錄 ^K SPACE 狀態^[W 往上 ^K' 視窗模式  ^[B 移往 ^KB 處 ^[R 往後搜尋\i \i
+\i \i^K]     停止 ^K\\ 重覆命令 ^[Z 往下 ^[! 命令模式  ^[K 移往 ^KK 處 ^[S 往前搜尋\i \i
+\i \i^K 0-9  啟動 ^[M 數學     ^K< 往左 \u引  用\u        \u刪  除\u          \u書  籤\u      \i \i
+\i \i^K?     查詢 ^KA 中間對齊 ^K> 往右 `  控制字元   ^[Y 下拉一行    ^[ 0-9 移動 \i \i
+\i \i^[D     傾倒 ^[H 訊息              ^\\ Meta-      ^[O 刪前面一行  ^[^[   設定 \i \i
 }
 
 {Programs
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i\uGOTO\u                 \uINDENT\u   \uCOMPILING\u                                      \i \i
-\i \i^G  Matching ( [ {   ^K, less ^[C Compile and parse errors                   \i \i
-\i \i^K- Previous place   ^K. more ^[E Parse errors                               \i \i
-\i \i^K= Next place                ^[= To next error                              \i \i
-\i \i^K; Tags file search          ^[- To prev. error                             \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i\u移動\u                     \u分  割\u     \u編  譯\u                                   \i \i
+\i \i^G  成對搜尋 ( [ {   ^K, 區塊左移   ^[C 編譯並列出錯誤                       \i \i
+\i \i^K- 前一個游標位置   ^K. 區塊右移   ^[E 列出錯誤                             \i \i
+\i \i^K= 下一個游標位置                  ^[= 跳至下一個錯誤                       \i \i
+\i \i^K; 標籤檔搜尋                      ^[- 回到上一個錯誤                       \i \i
 }
 
 {Search
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \iSpecial search sequences:                                                    \i \i
-\i \i    \\^  \\$  matches beg./end of line     \\?     match any single char        \i \i
-\i \i    \\<  \\>  matches beg./end of word     \\*     match 0 or more chars        \i \i
-\i \i    \\c     matches balanced C expression \\\\     matches a \\                  \i \i
-\i \i    \\[..]  matches one of a set          \\n     matches a newline            \i \i
-\i \i    \\+     matches 0 or more of the character which follows the \\+           \i \i
-\i \iSpecial replace sequences:                                                   \i \i
-\i \i    \\&     replaced with text which matched search string                    \i \i
-\i \i    \\0 - 9 replaced with text which matched Nth \\*, \\?, \\c, \\+, or \\[..]     \i \i
-\i \i    \\\\     replaced with \\               \\n     replaced with newline        \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i\u特殊搜尋條件\u                                                                 \i \i
+\i \i    \\^  \\$  位於行首/尾的符合字串        \\?     代替任何一個字元             \i \i
+\i \i    \\<  \\>  位於字首/尾的符合字串        \\*     代替任意字元                 \i \i
+\i \i    \\c      符合 C 語言格式的表示示字串   \\\\     找尋 \"\\"\"                   \i \i
+\i \i    \\[..]   符合所指定集合中的任一字串    \\n     代表一個換行符號            \i \i
+\i \i    \\+      符合一個或是多個以上附加於 \"+\" 號後面指定條件的字串              \i \i
+\i \i\u特殊取代條件\u                                                                 \i \i
+\i \i    \\&     直接以替代字元取代找尋到的字串(不加詢問)                          \i \i
+\i \i    \\0 - 9 直接以替代字元取代第 n 個字串  \\*, \\?, \\c, \\+, or \\[..]           \i \i
+\i \i    \\\\     以 \"\\\"來取代                \\n     以換行符號來取代               \i \i
 }
 
 {Names
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i Hit TAB at file name prompts to generate menu of file names                 \i \i
-\i \i Or use up/down keys to access history of previously entered names           \i \i
-\i \i Special file names:                                                         \i \i
-\i \i      !command                 Pipe in/out of a shell command                \i \i
-\i \i      >>filename               Append to a file                              \i \i
-\i \i      -                        Read/Write to/from standard I/O               \i \i
-\i \i      filename,START,SIZE      Read/Write a part of a file/device            \i \i
-\i \i          Give START/SIZE in decimal (255), octal (0377) or hex (0xFF)       \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i 在輸入檔案名稱的提示視窗中,按下 TAB 鍵可以產生一個您目前所在目錄下的所有   \i \i
+\i \i 檔案名字的列表,或是使用上下鍵來使用以前用過的檔案名稱.                     \i \i
+\i \i 特殊的檔案名稱:                                                            \i \i
+\i \i      !command                 引入一個 shell 底下的命令                     \i \i
+\i \i      >>filename               把現有檔息附加到另一檔案中                    \i \i
+\i \i      -                        從標準的 I/O 設備中讀入/寫出                  \i \i
+\i \i      filename,START,SIZE      從一個檔案/設備中讀入/寫出部份資料            \i \i
+\i \i 給定檔案開始的位置/檔案大小 以十進位(255), 八位位(0377), 十六進進(0xFF)     \i \i
 }
 
 {Joe
-\i   Help Screen    turn off with ^KH    prev. screen ^[,                        \i
-\i \i Send bug reports to: Joe Allen (jhallen@world.std.com)                      \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     ^[, 前一頁輔助視窗                      \i
+\i \i [***JOE 2.8 中文版***] [** 中文化:國立交通大學 應用數學系 86級 賴有得 **]  \i \i
+\i \i 有任何問題請 email 至 u8222034@cc.nctu.edu.tw 或 u8222034@math.nctu.edu.tw  \i \i
+\i \i 英文版有任何問題請 Send bug reports to: Joe Allen (jhallen@world.std.com)   \i \i
 }
 
  FOURTH SECTION: Key bindings:
@@ -309,6 +311,7 @@
 :windows		Bindings common to all windows
 type		^@ TO �		Type a character
 abort		^C		Abort window
+abort           .k4
 abort		^K Q
 abort		^K ^Q
 abort		^K q
@@ -433,7 +436,7 @@
  Standard JOE user interface
 
 quote8		^\		Enter Meta chars
-quote		`		Enter Ctrl chars
+quote		.k;		Enter Ctrl chars
 
 backs		^?		Backspace
 backs		^H
diff -ruN joe.orig/.rjoerc joe/.rjoerc
--- joe.orig/.rjoerc	Sat Mar 10 06:28:31 2001
+++ joe/.rjoerc	Sat Mar 10 06:28:48 2001
@@ -25,7 +25,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
 
@@ -413,7 +413,7 @@
  Standard JOE user interface
 
 quote8		^\		Enter Meta chars
-quote		`		Enter Ctrl chars
+quote		.k;		Enter Ctrl chars
 
 backs		^?		Backspace
 backs		^H
diff -ruN joe.orig/b.c joe/b.c
--- joe.orig/b.c	Sat Mar 10 06:28:31 2001
+++ joe/b.c	Sat Mar 10 06:28:48 2001
@@ -48,11 +48,11 @@
 
 char *msgs[]=
  { 
- "Error writing file",
- "Error opening file",
- "Error seeking file",
- "Error reading file",
- "New File"
+ "寫入檔案錯誤",
+ "開啟檔案錯誤",
+ "尋找檔案錯鋘",
+ "讀入檔案錯誤",
+ "新檔"
  };
 
 /* Get size of gap (amount of free space) */
@@ -1998,8 +1998,8 @@
  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);
-   else fprintf(f,"\n*** File \'(Unnamed)\'\n");
+   if(b->name) fprintf(f,"*** 檔名: \'%s\' ***\n",b->name);
+   else fprintf(f,"*** 檔名: \'(未命名)\' ***\n");
    fflush(f);
    bsavefd(b->bof,fileno(f),b->eof->byte);
    }
diff -ruN joe.orig/bw.c joe/bw.c
--- joe.orig/bw.c	Sat Mar 10 06:28:31 2001
+++ joe/bw.c	Sat Mar 10 06:28:48 2001
@@ -755,11 +755,11 @@
 static char buf[80];
 unsigned c=brc(bw->cursor);
 if(c==MAXINT)
- sprintf(buf,"** Line %ld  Col %ld  Offset %ld(0x%lx) **",
+ sprintf(buf,"** 行數 %ld 列數 %ld 檔案大小 %ld(0x%lx) **",
          bw->cursor->line+1,piscol(bw->cursor)+1,bw->cursor->byte,
          bw->cursor->byte);
 else
- sprintf(buf,"** Line %ld  Col %ld  Offset %ld(0x%lx)  Ascii %d(0%o/0x%X) **",
+ sprintf(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,255&c,255&c,255&c);
 msgnw(bw,buf);
diff -ruN joe.orig/cmd.c joe/cmd.c
--- joe.orig/cmd.c	Sat Mar 10 06:28:31 2001
+++ joe/cmd.c	Sat Mar 10 06:28:48 2001
@@ -197,7 +197,7 @@
  if((maint->curwin->watom->what&TYPETW) && bw->b->rdonly &&
     (cmd->flag&EMOD))
   {
-  msgnw(bw,"Read only");
+  msgnw(bw,"唯讀");
   if(beep) ttputc(7);
   goto skip;
   }
@@ -387,7 +387,7 @@
  int ret= -1;
  CMD *cmd=findcmd(s);
  if(!cmd)
-  msgnw(bw,"No such command");
+  msgnw(bw,"沒有這個命令");
  else
   {
   mac=mkmacro(MAXINT,0,0,cmd);
diff -ruN joe.orig/joerc joe/joerc
--- joe.orig/joerc	Sat Mar 10 06:28:31 2001
+++ joe/joerc	Sat Mar 10 06:28:48 2001
@@ -25,7 +25,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
 
@@ -102,7 +102,7 @@
   \f  Blink
 
 -lmsg \i%k%T%W%I%X %n %m%R %M
--rmsg  %S Row %r Col %c %t  Ctrl-K H for help
+-rmsg  %S 行數 %r 列數 %c %t  Ctrl-K H 線上輔助
 
  SECOND SECTION: File name dependant local option settings:
 
@@ -178,73 +178,75 @@
  Use \f to turn on/off flash
 
 {Basic
-\i   Help Screen    turn off with ^KH    more help with ESC . (^[.)              \i
-\i \i\uCURSOR\u           \uGO TO\u            \uBLOCK\u      \uDELETE\u   \uMISC\u         \uEXIT\u      \i \i
-\i \i^B left ^F right ^U  prev. screen ^KB begin  ^D char. ^KJ reformat ^KX save  \i \i
-\i \i^P up   ^N down  ^V  next screen  ^KK end    ^Y line  ^T  options  ^C  abort \i \i
-\i \i^Z previous word ^A  beg. of line ^KM move   ^W >word ^R  refresh  ^KZ shell \i \i
-\i \i^X next word     ^E  end of line  ^KC copy   ^O word< ^@  insert   \uFILE\u      \i \i
-\i \i\uSEARCH\u           ^KU top of file  ^KW file   ^J >line \uSPELL\u        ^KE edit  \i \i
-\i \i^KF find text    ^KV end of file  ^KY delete ^_ undo  ^[N word     ^KR insert\i \i
-\i \i^L  find next    ^KL to line No.  ^K/ filter ^^ redo  ^[L file     ^KD save  \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     ESC . 開啟更多輔助視窗 (^[.)            \i
+\i \i\u游  標\u           \u移 動\u            \u區 塊\u      \u刪  除\u   \u雜項\u         \u離開\u      \i \i
+\i \i^B 往左 ^F 往右  ^U  上一個視窗   ^KB 起始  ^D 字元   ^KJ 重新排列 ^KX 存檔  \i \i
+\i \i^P 往上 ^N 往下  ^V  下一個視窗   ^KK 結束  ^Y 整行   ^T  設定選項 ^C  放棄  \i \i
+\i \i^Z 前一個字      ^A  單行的最前面 ^KM 移動  ^W >單字  ^R  螢幕更新 ^KZ SHELL \i \i
+\i \i^X 下一個字      ^E  單行的最後面 ^KC 拷貝  ^O 單字<  ^@  插入空白 \u檔案\u      \i \i
+\i \i\u搜  尋\u           ^KU 檔案最前面   ^KW 存檔  ^J >行尾  \u拼  字\u       ^KE 編輯  \i \i
+\i \i^KF 搜尋字串     ^KV 檔案最後面   ^KY 刪除  ^_ 復原   ^[N 字       ^KR 插入  \i \i
+\i \i^L  下一字串     ^KL 跳往第幾行   ^K/ 過濾  ^^ 不復原 ^[L 檔案     ^KD 存檔  \i \i
 }
 
 {Windows
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i^KO Split the window in half           ^KE Load file into window             \i \i
-\i \i^KG Make current window bigger         ^KT Make current window smaller       \i \i
-\i \i^KN Go to the window below             ^KP Go to the window above            \i \i
-\i \i^C  Eliminate the current window       ^KI Show all windows / Show one window\i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i^KO 分割視窗為二                       ^KE 載入檔案進入游標所在視窗          \i \i
+\i \i^KG 放大游標所在視窗                   ^KT 縮小游標所在視窗                  \i \i
+\i \i^KN 跳往下一個視窗                     ^KP 跳往前一個視窗                    \i \i
+\i \i^C  消除游標所在視窗                   ^KI 顯示所有視窗 / 顯示游標所在視窗   \i \i
 }
 
 {Advanced
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i\uMACROS\u         \uMISC\u            \uSCROLL\u    \uSHELL\u       \uGOTO\u       \uI-SEARCH\u     \i \i
-\i \i^K[ 0-9 Record ^K SPACE status ^[W Up    ^K' Window  ^[B To ^KB ^[R Backwards\i \i
-\i \i^K]     Stop   ^K\\ Repeat      ^[Z Down  ^[! Command ^[K To ^KK ^[S Forwards \i \i
-\i \i^K 0-9  Play   ^[M Math        ^K< Left  \uQUOTE\u       \uDELETE\u     \uBOOKMARKS\u    \i \i
-\i \i^K?     Query  ^KA Center line ^K> Right `  Ctrl-    ^[Y yank   ^[ 0-9 Goto  \i \i
-\i \i^[D     Dump   ^[H Message               ^\\ Meta-    ^[O line<  ^[^[   Set   \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i\u巨  集\u       \u雜項\u         \u捲  軸\u   \uSHELL\u         \u移動\u            \u即時搜尋\u    \i \i
+\i \i^K[ 0-9 記錄 ^K SPACE 狀態^[W 往上 ^K' 視窗模式  ^[B 移往 ^KB 處 ^[R 往後搜尋\i \i
+\i \i^K]     停止 ^K\\ 重覆命令 ^[Z 往下 ^[! 命令模式  ^[K 移往 ^KK 處 ^[S 往前搜尋\i \i
+\i \i^K 0-9  啟動 ^[M 數學     ^K< 往左 \u引  用\u        \u刪  除\u          \u書  籤\u      \i \i
+\i \i^K?     查詢 ^KA 中間對齊 ^K> 往右 `  控制字元   ^[Y 下拉一行    ^[ 0-9 移動 \i \i
+\i \i^[D     傾倒 ^[H 訊息              ^\\ Meta-      ^[O 刪前面一行  ^[^[   設定 \i \i
 }
 
 {Programs
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i\uGOTO\u                 \uINDENT\u   \uCOMPILING\u                                      \i \i
-\i \i^G  Matching ( [ {   ^K, less ^[C Compile and parse errors                   \i \i
-\i \i^K- Previous place   ^K. more ^[E Parse errors                               \i \i
-\i \i^K= Next place                ^[= To next error                              \i \i
-\i \i^K; Tags file search          ^[- To prev. error                             \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i\u移動\u                     \u分  割\u     \u編  譯\u                                   \i \i
+\i \i^G  成對搜尋 ( [ {   ^K, 區塊左移   ^[C 編譯並列出錯誤                       \i \i
+\i \i^K- 前一個游標位置   ^K. 區塊右移   ^[E 列出錯誤                             \i \i
+\i \i^K= 下一個游標位置                  ^[= 跳至下一個錯誤                       \i \i
+\i \i^K; 標籤檔搜尋                      ^[- 回到上一個錯誤                       \i \i
 }
 
 {Search
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \iSpecial search sequences:                                                    \i \i
-\i \i    \\^  \\$  matches beg./end of line     \\?     match any single char        \i \i
-\i \i    \\<  \\>  matches beg./end of word     \\*     match 0 or more chars        \i \i
-\i \i    \\c     matches balanced C expression \\\\     matches a \\                  \i \i
-\i \i    \\[..]  matches one of a set          \\n     matches a newline            \i \i
-\i \i    \\+     matches 0 or more of the character which follows the \\+           \i \i
-\i \iSpecial replace sequences:                                                   \i \i
-\i \i    \\&     replaced with text which matched search string                    \i \i
-\i \i    \\0 - 9 replaced with text which matched Nth \\*, \\?, \\c, \\+, or \\[..]     \i \i
-\i \i    \\\\     replaced with \\               \\n     replaced with newline        \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i\u特殊搜尋條件\u                                                                 \i \i
+\i \i    \\^  \\$  位於行首/尾的符合字串        \\?     代替任何一個字元             \i \i
+\i \i    \\<  \\>  位於字首/尾的符合字串        \\*     代替任意字元                 \i \i
+\i \i    \\c      符合 C 語言格式的表示示字串   \\\\     找尋 \"\\"\"                   \i \i
+\i \i    \\[..]   符合所指定集合中的任一字串    \\n     代表一個換行符號            \i \i
+\i \i    \\+      符合一個或是多個以上附加於 \"+\" 號後面指定條件的字串              \i \i
+\i \i\u特殊取代條件\u                                                                 \i \i
+\i \i    \\&     直接以替代字元取代找尋到的字串(不加詢問)                          \i \i
+\i \i    \\0 - 9 直接以替代字元取代第 n 個字串  \\*, \\?, \\c, \\+, or \\[..]           \i \i
+\i \i    \\\\     以 \"\\\"來取代                \\n     以換行符號來取代               \i \i
 }
 
 {Names
-\i   Help Screen    turn off with ^KH    prev. screen ^[,    next screen ^[.     \i
-\i \i Hit TAB at file name prompts to generate menu of file names                 \i \i
-\i \i Or use up/down keys to access history of previously entered names           \i \i
-\i \i Special file names:                                                         \i \i
-\i \i      !command                 Pipe in/out of a shell command                \i \i
-\i \i      >>filename               Append to a file                              \i \i
-\i \i      -                        Read/Write to/from standard I/O               \i \i
-\i \i      filename,START,SIZE      Read/Write a part of a file/device            \i \i
-\i \i          Give START/SIZE in decimal (255), octal (0377) or hex (0xFF)       \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     前一頁輔助視窗 ^[,  下一頁輔助視窗 ^[.  \i
+\i \i 在輸入檔案名稱的提示視窗中,按下 TAB 鍵可以產生一個您目前所在目錄下的所有   \i \i
+\i \i 檔案名字的列表,或是使用上下鍵來使用以前用過的檔案名稱.                     \i \i
+\i \i 特殊的檔案名稱:                                                            \i \i
+\i \i      !command                 引入一個 shell 底下的命令                     \i \i
+\i \i      >>filename               把現有檔息附加到另一檔案中                    \i \i
+\i \i      -                        從標準的 I/O 設備中讀入/寫出                  \i \i
+\i \i      filename,START,SIZE      從一個檔案/設備中讀入/寫出部份資料            \i \i
+\i \i 給定檔案開始的位置/檔案大小 以十進位(255), 八位位(0377), 十六進進(0xFF)     \i \i
 }
 
 {Joe
-\i   Help Screen    turn off with ^KH    prev. screen ^[,                        \i
-\i \i Send bug reports to: Joe Allen (jhallen@world.std.com)                      \i \i
+\i   線上輔助視窗   ^KH 關閉輔助視窗     ^[, 前一頁輔助視窗                      \i
+\i \i [***JOE 2.8 中文版***] [** 中文化:國立交通大學 應用數學系 86級 賴有得 **]  \i \i
+\i \i 有任何問題請 email 至 u8222034@cc.nctu.edu.tw 或 u8222034@math.nctu.edu.tw  \i \i
+\i \i 英文版有任何問題請 Send bug reports to: Joe Allen (jhallen@world.std.com)   \i \i
 }
 
  FOURTH SECTION: Key bindings:
@@ -309,6 +311,7 @@
 :windows		Bindings common to all windows
 type		^@ TO �		Type a character
 abort		^C		Abort window
+abort           .k4
 abort		^K Q
 abort		^K ^Q
 abort		^K q
@@ -433,7 +436,7 @@
  Standard JOE user interface
 
 quote8		^\		Enter Meta chars
-quote		`		Enter Ctrl chars
+quote		.k;		Enter Ctrl chars
 
 backs		^?		Backspace
 backs		^H
diff -ruN joe.orig/macro.c joe/macro.c
--- joe.orig/macro.c	Sat Mar 10 06:28:31 2001
+++ joe/macro.c	Sat Mar 10 06:28:49 2001
@@ -460,7 +460,7 @@
  {
  if(c>='0' && c<='9') return dorecord(bw,c,NULL,NULL);
  else
-  if(mkqw(bw,sc("Macro to record (0-9 or ^C to abort): "),dorecord,NULL,NULL,NULL)) return 0;
+  if(mkqw(bw,sc("記錄巨集 (0-9 或 ^C 中斷): "),dorecord,NULL,NULL,NULL)) return 0;
   else return -1;
  }
 
@@ -531,7 +531,7 @@
  {
  if(c>='0' && c<='9') return doplay(bw,c,NULL,NULL);
  else
-  if(mkqwna(bw,sc("Play-"),doplay,NULL,NULL,NULL)) return 0;
+  if(mkqwna(bw,sc("執行-"),doplay,NULL,NULL,NULL)) return 0;
   else return -1;
  }
 
@@ -557,7 +557,7 @@
 BW *bw;
  {
  if(wmkpw(bw,
-          "No. times to repeat next command (^C to abort): ",
+          "下一個指令重覆的次數 (^C 中斷): ",
           NULL,doarg,NULL,NULL,utypebw,NULL,NULL)) return 0;
  else return -1;
  }
@@ -591,7 +591,7 @@
   if(notify) *notify=1;
   return 0;
   }
- sprintf(msgbuf,"Repeat %s%d",negarg?"-":"",unaarg);
+ sprintf(msgbuf,"重覆 %s%d",negarg?"-":"",unaarg);
  if(mkqwna(bw,sz(msgbuf),douarg,NULL,NULL,notify)) return 0;
  else return -1;
  }
@@ -603,6 +603,6 @@
  negarg=0;
  if(c>='0' && c<='9' || c=='-') return douarg(bw,c,NULL,NULL);
  else
-  if(mkqwna(bw,sc("Repeat"),douarg,NULL,NULL,NULL)) return 0;
+  if(mkqwna(bw,sc("重覆"),douarg,NULL,NULL,NULL)) return 0;
   else return -1;
  }
diff -ruN joe.orig/main.c joe/main.c
--- joe.orig/main.c	Sat Mar 10 06:28:31 2001
+++ joe/main.c	Sat Mar 10 06:29:43 2001
@@ -197,7 +197,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
@@ -211,7 +211,7 @@
  if(c==1)
   {
   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') goto donerc;
@@ -226,7 +226,7 @@
  if(c==1)
   {
   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') goto donerc;
@@ -261,7 +261,7 @@
   if(c==1)
    {
    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') goto donerc;
@@ -277,7 +277,7 @@
  if(c==1)
   {
   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') goto donerc;
@@ -285,7 +285,7 @@
 
 #endif
 
- fprintf(stderr,"Couldn't open '%s'\n",s);
+ fprintf(stderr,"無法開啟 '%s'\n",s);
  return 1;
 
  donerc:
@@ -295,7 +295,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]); break;
+     case 0: fprintf(stderr,"不知明的選項 '%s'\n",argv[c]); break;
      case 1: break;
      case 2: ++c; break;
      }
diff -ruN joe.orig/menu.c joe/menu.c
--- joe.orig/menu.c	Sat Mar 10 06:28:31 2001
+++ joe/menu.c	Sat Mar 10 06:28:49 2001
@@ -41,9 +41,15 @@
  for(x=0;x!=m->perline && m->list[x+m->top];++x)
   {
   int atr,z;
-  if(x+m->top==m->cursor) atr=INVERSE;
-  else atr=0;
+  atr = 0 ;
+/*  
+  if(x+m->top==m->cursor) 
+     atr= 0 ;
+  else 
+     atr=0;
+*/
   if(col==m->w) break;
+ 
   for(z=0;m->list[x+m->top][z];++z)
    {
    if(col==m->w) break;
diff -ruN joe.orig/rc.c joe/rc.c
--- joe.orig/rc.c	Sat Mar 10 06:28:32 2001
+++ joe/rc.c	Sat Mar 10 06:28:49 2001
@@ -54,14 +54,14 @@
 
 OPTIONS fdefault=
  { 0, 0, 0, 0, 76, 0, 0, 8, ' ', 1, "main", "\\i%n %m %M",
-   " %S Ctrl-K H for help", 0, 0, 0, 0, 1, 0, 0, 0, 0 };
+   " %S Ctrl-K H 線上輔助", 0, 0, 0, 0, 1, 0, 0, 0, 0 };
 #else
 OPTIONS pdefault=
  { 0, 0, 0, 0, 76, 0, 0, 8, ' ', 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 
 OPTIONS fdefault=
  { 0, 0, 0, 0, 76, 0, 0, 8, ' ', 1, "main", "\\i%n %m %M",
-   " %S Ctrl-K H for help", 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+   " %S Ctrl-K H 線上輔助", 0, 0, 0, 0, 0, 0, 0, 0, 0 };
 #endif
 
 void setopt(n,name)
@@ -106,49 +106,49 @@
  } glopts[]=
  {
   {"overwrite", 4, 0, (char *)&fdefault.overtype,
-   "Overtype mode",
-   "Insert mode",
-   "T Overtype "},
+   "覆寫模式",
+   "插入模式",
+   "T [***輸入設定***] "},
 
   {"autoindent", 4, 0, (char *)&fdefault.autoindent,
-   "Autoindent enabled",
-   "Autindent disabled",
-   "I Autoindent "},
+   "自動縮排 [開啟]",
+   "自動縮排 [關閉]",
+   "I [***縮排設定***] "},
 
   {"wordwrap", 4, 0, (char *)&fdefault.wordwrap,
-   "Wordwrap enabled",
-   "Wordwrap disabled",
-   "Word wrap "},
+   "自動換行 [開啟]",
+   "自動換行 [關閉]",
+   "* [***換行設定***] "},
 
   {"tab", 5, 0, (char *)&fdefault.tab,
-   "Tab width (%d): ",
+   "Tab 寬度 (%d): ",
    0,
-   "D Tab width ",0,1,64},
+   "D [**TAB 鍵寬度**] ",0,1,64},
 
   {"lmargin", 7, 0, (char *)&fdefault.lmargin,
-   "Left margin (%d): ",
+   "設定左邊界 (%d): ",
    0,
-   "Left margin ",0,0,63},
+   "L [**設定左邊界**] ",0,0,63},
 
   {"rmargin", 7, 0, (char *)&fdefault.rmargin,
-   "Right margin (%d): ",
-   0,
-   "Right margin ",0,7,255},
+   "設定右邊界 (%d): ",
+   0,	
+   "* [**設定右邊界**] ",0,7,255},
 
   {"square", 0, &square, 0,
-   "Rectangle mode",
-   "Text-stream mode",
-   "X Rectangle mode " },
+   "矩形模式 Rectangle mode",
+   "文字串模式",
+   "X [*區塊設定模式*] " },
 
   {"indentc", 5, 0, (char *)&fdefault.indentc,
-   "Indent char %d (SPACE=32, TAB=9, ^C to abort): ",
+   "設定縮格字元 %d (SPACE=32, TAB=9, ^C 中斷): ",
    0,
-   " Indent char ",0,0,255},
+   "* [*設定縮格字元*] ",0,0,255},
 
   {"istep", 5, 0, (char *)&fdefault.istep,
-   "Indent step %d (^C to abort): ",
+   "設定縮格步驟 %d (^C 中斷): ",
    0,
-   " Indent step ",0,1,64},
+   "* [*設定縮格步驟*] ",0,1,64},
 
   {"french", 4, 0, (char *)&fdefault.french,
    "One space after periods for paragraph reformat",
@@ -156,90 +156,90 @@
    " french spacing "},
 
   {"spaces", 4, 0, (char *)&fdefault.spaces,
-   "Inserting spaces when tab key is hit",
-   "Inserting tabs when tab key is hit",
-   " no tabs "},
+   "設定按下 [TAB] 後插入 [空白] 字元 ",
+   "設定按下 [TAB] 後插入 [TAB ] 字元 ",
+   "* [TAB 鍵代表字元] "},
 
   {"mid", 0, &mid, 0,
-   "Cursor will be recentered on scrolls",
-   "Cursor will not be recentered on scroll",
-   "Center on scroll " },
+   "螢幕捲動後游標自動向中間對齊功\能 [開啟]",
+   "螢幕捲動後游標自動向中間對齊功\能 [關閉]",
+   "* [*游標向中對齊*] " },
 
   {"crlf", 4, 0, (char *)&fdefault.crlf,
-   "CR-LF is line terminator",
-   "LF is line terminator",
-   "Z CR-LF (MS-DOS) "},
+   "行的結尾是 CR-LF",
+   "行的結尾是 LF",
+   "Z [*行尾字元設定*] "},
 
   {"linums", 4, 0, (char *)&fdefault.linums,
-   "Line numbers enabled",
-   "Line numbers disabled",
-   "N Line numbers "},
+   "顯示行數功\能 [開啟] Line numbers enabled",
+   "顯示行數功\能 [關閉] Line numbers disabled",
+   "N [***行數設定***] "},
 
   {"marking", 0, &marking, 0,
-   "Anchored block marking on",
-   "Anchored block marking off",
-   "Marking " },
+   "反白區塊隨游標移動功\能 [開啟]",
+   "反白區塊隨游標移動功\能 [關閉]",
+   "* [*區塊反白設定*] " },
 
   {"asis", 0, &dspasis, 0,
-   "Characters above 127 shown as-is",
-   "Characters above 127 shown in inverse",
-   "Meta chars as-is "
+   "顯示 ASCII 127 以上的字元",
+   "以相反方式來顯示 ASCII 127 以上的字元",
+   "* [*中文顯示方式*] "
     },
 
   {"force", 0, &force, 0,
-   "Last line forced to have NL when file saved",
-   "Last line not forces to have NL",
-   "Force last NL " },
+   "存檔後,自動加上一行空白行功\能 [開啟]",
+   "存檔後,自動加上一行空白行功\能 [關閉]",
+   "* [*存檔新行設定*] " },
 
   {"nobackups", 0, &nobackups, 0,
-   "Backup files will not be made",
-   "Backup files will be made",
-   " Disable backups " },
+   "自動產生備份檔功\能 [開啟]",
+   "自動產生備份檔功\能 [關閉]",
+   "* [**備份檔設定**] " },
 
   {"lightoff", 0, &lightoff, 0,
-   "Highlighting turned off after block operations",
-   "Highlighting not turned off after block operations",
-   "Auto unmark " },
+   "使用區塊功\能後,自動關閉高亮度區塊功\能 [關閉]",
+   "使用區塊功\能後,自動關閉高亮度區塊功\能 [開啟]",
+   "* [*區塊亮度設定*] " },
 
   {"exask", 0, &exask, 0,
-   "Prompt for filename in save & exit command",
-   "Don't prompt for filename in save & exit command",
-   "Exit ask "},
+   "存檔並離開時是否詢問檔名功\能 [開啟]",
+   "存檔並離開時是否詢問檔名功\能 [關閉]",
+   "* [*離開存檔詢問*] "},
 
   {"beep", 0, &beep, 0,
-   "Warning bell enabled", 
-   "Warning bell disabled",
-   "Beeps " },
+   "錯誤時發出\"嗶\"的聲音功\能 [開啟]", 
+   "錯誤時發出\"嗶\"的聲音功\能 [關閉]",
+   "* [*錯誤聲響設定*] " },
 
   {"nosta", 0, &staen, 0,
-   "Top-most status line disabled",
-   "Top-most status line enabled",
-   " Disable status line " },
+   "開啟最上面的狀態列功\能[關閉]",
+   "開啟最上面的狀態列功\能[開啟]",
+   "* [**狀態列開關**] " },
 
   {"keepup", 0, &keepup, 0,
-   "Status line updated constantly",
-   "Status line updated once/sec",
-   " Fast status line " },
+   "狀態列固定時間更新資料一次",
+   "狀態列每秒更新資料一次",
+   "* [狀態列資料更新] " },
 
   {"pg", 1, &pgamnt, 0,
-   "Lines to keep for PgUp/PgDn or -1 for 1/2 window (%d): ",
+   "按下 [PgUp]/[PgDn] 時所保留的行數 或 -1(保留半個視窗) (%d): ",
    0,
-   " No. PgUp/PgDn lines ", 0, -1, 64 },
+   "* [PaUp/PaDn 行數]", 0, -1, 64 },
 
   {"csmode", 0, &csmode, 0,
-   "Start search after a search repeats previous search",
-   "Start search always starts a new search",
-   "Continued search " },
+   "按下 CTRL + F 以前面所輸入的字串開始搜尋",
+   "按下 CTRL + F 都以新的字串進行搜尋",
+   "* [*搜尋字元設定*] " },
 
   {"rdonly", 4, 0, (char *)&fdefault.readonly,
-   "Read only",
-   "Full editing",
-   "O Read only "},
+   "唯讀模式",
+   "可編輯模式",
+   "O [*唯讀模式設定*] "},
 
   {"backpath", 2, (int *)&backpath, 0,
-   "Backup files stored in (%s): ",
+   "備份檔儲存路徑 (%s): ",
    0,
-   "Path to backup files " },
+   "* [*備份檔案路徑*] " },
 
   {"nonotice", 0, &nonotice, 0,
    0, 0, 0 },
@@ -455,20 +455,20 @@
    v=calc(bw,s);
    if(merr) msgnw(bw,merr), ret= -1;
    else if(v>=glopts[x].low && v<=glopts[x].high) *glopts[x].set=v;
-   else msgnw(bw,"Value out of range"), ret= -1;
+   else msgnw(bw,"數值超過範圍"), ret= -1;
    break;
   case 2: if(s[0]) *(char **)glopts[x].set=zdup(s); break;
   case 5:
    v=calc(bw,s);
    if(merr) msgnw(bw,merr), ret= -1;
    else if(v>=glopts[x].low && v<=glopts[x].high) *(int *)((char *)&bw->o+glopts[x].ofst)=v;
-   else msgnw(bw,"Value out of range"), ret= -1;
+   else msgnw(bw,"數值超過範圍"), ret= -1;
    break;
   case 7:
    v=calc(bw,s)-1.0;
    if(merr) msgnw(bw,merr), ret= -1;
    else if(v>=glopts[x].low && v<=glopts[x].high) *(int *)((char *)&bw->o+glopts[x].ofst)=v;
-   else msgnw(bw,"Value out of range"), ret= -1;
+   else msgnw(bw,"數值超過範圍"), ret= -1;
    break;
   }
  vsrm(s);
@@ -567,7 +567,7 @@
   s[x]=(char *)malloc(40);
   switch(glopts[x].type)
    {
-   case 0: sprintf(s[x],"%s%s",glopts[x].menu,*glopts[x].set?"ON":"OFF");
+   case 0: sprintf(s[x],"%s%s",glopts[x].menu,*glopts[x].set?"開":"關");
    break;
    
    case 1: sprintf(s[x],"%s%d",glopts[x].menu,*glopts[x].set);
@@ -576,7 +576,7 @@
    case 2: zcpy(s[x],glopts[x].menu);
    break;
 
-   case 4: sprintf(s[x],"%s%s",glopts[x].menu,*(int *)((char *)&bw->o+glopts[x].ofst)?"ON":"OFF");
+   case 4: sprintf(s[x],"%s%s",glopts[x].menu,*(int *)((char *)&bw->o+glopts[x].ofst)?"開":"關");
    break;
    
    case 5: sprintf(s[x],"%s%d",glopts[x].menu,*(int *)((char *)&bw->o+glopts[x].ofst));
@@ -619,7 +619,7 @@
  
  if(!fd) return -1;		/* Return if we couldn't open the rc file */
  
- fprintf(stderr,"Processing '%s'...",name); fflush(stderr);
+ fprintf(stderr,"定義檔 '%s' 處理中..... ",name); fflush(stderr);
  
  while(++line, fgets(buf,1024,fd))
   switch(buf[0])
@@ -655,7 +655,7 @@
     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;
@@ -677,7 +677,7 @@
     if(++line, !fgets(buf,256,fd))
      {
      err=1;
-     fprintf(stderr,"\n%s %d: End of joerc file occured before end of help text",name,line);
+     fprintf(stderr,"\n%s %d: 因為 help 的內容不正常的結束故結束 joerc 的讀入",name,line);
      break;
      }
     if(buf[0]=='}')
@@ -724,13 +724,13 @@
        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,"inherit"))
@@ -743,13 +743,13 @@
        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,"include"))
       {
@@ -761,7 +761,7 @@
        switch(procrc(buf+x))
         {
         case 1: err=1; break;
-        case -1: fprintf(stderr,"\n%s %d: Couldn't open %s",name,line,buf+x);
+        case -1: fprintf(stderr,"\n%s %d: 無法開啟 %s",name,line,buf+x);
                  err=1; break;
         }
        context=0;
@@ -770,7 +770,7 @@
       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,"delete"))
@@ -786,13 +786,13 @@
       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=getcontext(buf+1);
     else
      {
      err=1;
-     fprintf(stderr,"\n%s %d: Invalid context name",name,line);
+     fprintf(stderr,"\n%s %d: 不合法的文章名稱",name,line);
      }
     }
    break;
@@ -804,7 +804,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;
      }
 
@@ -814,7 +814,7 @@
     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)
@@ -832,7 +832,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;
      }
     }
@@ -841,8 +841,8 @@
  fclose(fd);			/* Close rc file */
 
  /* Print proper ending string */
- if(err) fprintf(stderr,"\ndone\n");
- else fprintf(stderr,"done\n");
+ if(err) fprintf(stderr,"\n完成\n");
+ else fprintf(stderr,"完成\n");
 
  return err;			/* 0 for success, 1 for syntax error */
  }
diff -ruN joe.orig/rjoerc joe/rjoerc
--- joe.orig/rjoerc	Sat Mar 10 06:28:32 2001
+++ joe/rjoerc	Sat Mar 10 06:28:49 2001
@@ -25,7 +25,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
 
@@ -413,7 +413,7 @@
  Standard JOE user interface
 
 quote8		^\		Enter Meta chars
-quote		`		Enter Ctrl chars
+quote		.k;		Enter Ctrl chars
 
 backs		^?		Backspace
 backs		^H
diff -ruN joe.orig/tab.c joe/tab.c
--- joe.orig/tab.c	Sat Mar 10 06:28:32 2001
+++ joe/tab.c	Sat Mar 10 06:28:49 2001
@@ -202,7 +202,7 @@
   tab->pattern=vsncpy(NULL,0,sc("*"));
   if(treload(m,0))
    {
-   msgnw(m,"Couldn't read directory ");
+   msgnw(m,"無法讀取目錄");
    vsrm(tab->pattern); tab->pattern=orgpattern;
    vsrm(tab->path); tab->path=orgpath;
    return -1;
@@ -245,7 +245,7 @@
 
  if(treload(m,1))
   {
-  msgnw(m,"Couldn't read directory ");
+  msgnw(m,"無法讀取目錄");
   vsrm(tab->pattern); tab->pattern=orgpattern;
   vsrm(tab->path); tab->path=orgpath;
   return -1;
diff -ruN joe.orig/termcap.c joe/termcap.c
--- joe.orig/termcap.c	Sat Mar 10 06:28:32 2001
+++ joe/termcap.c	Sat Mar 10 06:28:50 2001
@@ -215,7 +215,7 @@
  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;
@@ -233,7 +233,7 @@
  fstat(fileno(f),&buf);
  fstat(fileno(f1),&buf1);
  if(buf.st_mtime>buf1.st_mtime) idx=findidx(f,name);
- else fprintf(stderr,"%s is out of date\n",idxname);
+ else fprintf(stderr,"%s 資料毀損\n",idxname);
  fclose(f);
  }
 vsrm(idxname);
diff -ruN joe.orig/tty.c joe/tty.c
--- joe.orig/tty.c	Sat Mar 10 06:28:32 2001
+++ joe/tty.c	Sat Mar 10 06:28:50 2001
@@ -354,7 +354,7 @@
                (!(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
@@ -686,7 +686,7 @@
   if(cmd) execl(s,s,"-c",cmd,NULL);
   else
    {
-   fprintf(stderr,"You are at the command shell.  Type 'exit' to return\n");
+   fprintf(stderr,"你在命命列的狀態下. 鍵入 'exit' 返回\n");
    execl(s,s,NULL);
    }
   _exit(0);
@@ -700,7 +700,7 @@
 #ifdef SIGTSTP
  omode=ttymode;
  ttclsn();
- fprintf(stderr,"You have suspended the program.  Type 'fg' to return\n");
+ fprintf(stderr,"你已經暫停的這個 JOE 這個程式. 鍵入 'fg' 可以返回JOE\n");
  kill(0,SIGTSTP);
  if(ackkbd!= -1)
   kill(kbdpid,SIGCONT);
diff -ruN joe.orig/tw.c joe/tw.c
--- joe.orig/tw.c	Sat Mar 10 06:28:32 2001
+++ joe/tw.c	Sat Mar 10 06:28:50 2001
@@ -139,17 +139,17 @@
     break;
 
     case 'n':
-    stalin=vsncpy(sv(stalin),sz(bw->b->name?bw->b->name:"Unnamed"));
+    stalin=vsncpy(sv(stalin),sz(bw->b->name?bw->b->name:"未命名"));
     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 '*':
@@ -238,7 +238,7 @@
     case 'M':
     if(recmac)
      {
-     sprintf(buf,"(Macro %d recording...)",recmac->n);
+     sprintf(buf,"(巨集 %d 記錄中...)",recmac->n);
      stalin=vsncpy(sv(stalin),sz(buf));
      }
     break;
@@ -437,7 +437,7 @@
  }
 if(bw->pid) return ukillpid(bw);
 if(bw->b->changed && bw->b->count==1)
- if(mkqw(bw,sc("Lose changes to this file (y,n,^C)? "),naborttw,NULL,NULL,NULL)) return 0;
+ if(mkqw(bw,sc("放棄對這個檔案的更改 (y,n,^C)? "),naborttw,NULL,NULL,NULL)) return 0;
  else return -1;
 else return naborttw(bw,'y',NULL,NULL);
 }
@@ -497,7 +497,7 @@
    {
    if(((BW *)t->curwin->main->object)->pid)
     {
-    msgnw(t->curwin->main->object,"Process running in this window");
+    msgnw(t->curwin->main->object,"視窗中正有程式執行中");
     return -1;
     }
    utw0(t->curwin->main->object), yn=1;
diff -ruN joe.orig/ublock.c joe/ublock.c
--- joe.orig/ublock.c	Sat Mar 10 06:28:32 2001
+++ joe/ublock.c	Sat Mar 10 06:28:50 2001
@@ -345,7 +345,7 @@
    bdel(markb,markk);
   if(lightoff) unmark(bw);
   }
- else { msgnw(bw,"No block"); return -1; }
+ else { msgnw(bw,"沒有選定區塊"); return -1; }
  return 0;
  }
 
@@ -383,7 +383,7 @@
  {
  if(markv(1))
   {
-  if(markb->b->rdonly) { msgnw(bw,"Read only"); return -1; }
+  if(markb->b->rdonly) { msgnw(bw,"唯讀"); return -1; }
   if(square)
    {
    long height=markk->line-markb->line+1;
@@ -435,7 +435,7 @@
    return 0;
    }
   }
- msgnw(bw,"No block");
+ msgnw(bw,"沒有選定區塊");
  return -1;
  }
 
@@ -478,7 +478,7 @@
    updall();
    return 0;
    }
- else { msgnw(bw,"No block"); return -1; }
+ else { msgnw(bw,"沒有選定區塊"); return -1; }
  }
 
 /* Write highlighted block to a file */
@@ -515,7 +515,7 @@
  else
   {
   vsrm(s);
-  msgnw(bw,"No block");
+  msgnw(bw,"沒有選定區塊");
   return -1;
   }
  }
@@ -717,7 +717,7 @@
    updall();
    return 0;
    }
-  else { msgnw(bw,"No block"); return -1; }
+  else { msgnw(bw,"沒有選定區塊"); return -1; }
  else
   {
   int ret=0;
@@ -748,7 +748,7 @@
     markb->b==bw->b && markk->b==bw->b && markb->byte==markk->byte) goto ok;
  if(!markv(1))
   {
-  msgnw(bw,"No block");
+  msgnw(bw,"沒有選定區塊");
   return -1;
   }
  ok:
@@ -867,25 +867,25 @@
 BW *bw;
  {
 #ifdef __MSDOS__
- msgnw(bw,"Sorry, no sub-processes in DOS (yet)");
+ msgnw(bw,"對不起!在 DOS 下還沒有其它的行程在執行!");
  return -1;
 #else
  switch(checkmark(bw))
   {
   case 0:
   if(wmkpw(bw,
-           "Command to filter block through (^C to abort): ",
+           "用來過濾區塊的命令名稱 (^C 中斷): ",
            &filthist,dofilt,NULL,NULL,utypebw,NULL,NULL)) return 0;
   else return -1;
 
   case 1:
   if(wmkpw(bw,
-           "Command to filter file through (^C to abort): ",
+           "輸入用來過濾區塊的命令名稱 (^C 中斷): ",
            &filthist,dofilt,NULL,NULL,utypebw,NULL,NULL)) return 0;
   else return -1;
 
   case 2:
-  msgnw(bw,"No block");
+  msgnw(bw,"沒有選定區塊");
   return -1;
   }
 #endif
diff -ruN joe.orig/uedit.c joe/uedit.c
--- joe.orig/uedit.c	Sat Mar 10 06:28:32 2001
+++ joe/uedit.c	Sat Mar 10 06:28:50 2001
@@ -447,7 +447,7 @@
  else
   {
   if(merr) msgnw(bw,merr);
-  else msgnw(bw,"Invalid line number");
+  else msgnw(bw,"不合法的行數");
   return -1;
   }
  }
@@ -455,7 +455,7 @@
 int uline(bw)
 BW *bw;
  {
- if(wmkpw(bw,"Go to line (^C to abort): ",&linehist,doline,NULL,NULL,NULL,NULL,NULL)) return 0;
+ if(wmkpw(bw,"跳到第幾行 (^C 中斷): ",&linehist,doline,NULL,NULL,NULL,NULL,NULL)) return 0;
  else return -1;
  }
 
@@ -482,7 +482,7 @@
  else
   {
   if(merr) msgnw(bw,merr);
-  else msgnw(bw,"Invalid column number");
+  else msgnw(bw,"不合法的列數");
   return -1;
   }
  }
@@ -490,7 +490,7 @@
 int ucol(bw)
 BW *bw;
  {
- if(wmkpw(bw,"Go to column (^C to abort): ",&colhist,docol,NULL,NULL,NULL,NULL,NULL)) return 0;
+ if(wmkpw(bw,"跳到第幾列 (^C 中斷): ",&colhist,docol,NULL,NULL,NULL,NULL,NULL)) return 0;
  else return -1;
  }
 
@@ -517,7 +517,7 @@
  else
   {
   if(merr) msgnw(bw,merr);
-  else msgnw(bw,"Invalid byte number");
+  else msgnw(bw," 不合法的位元數");
   return -1;
   }
  }
@@ -525,7 +525,7 @@
 int ubyte(bw)
 BW *bw;
  {
- if(wmkpw(bw,"Go to byte (^C to abort): ",&bytehist,dobyte,NULL,NULL,NULL,NULL,NULL)) return 0;
+ if(wmkpw(bw,"跳到第幾位元 (^C 中斷): ",&bytehist,dobyte,NULL,NULL,NULL,NULL,NULL)) return 0;
  else return -1;
  }
 
@@ -891,7 +891,7 @@
  {
  quotestate=0;
  if(mkqwna(bw,
-           sc("Ctrl- (or 0-9 for dec. ascii, x for hex, or o for octal)"),doquote,NULL,NULL,NULL)) return 0;
+           sc("Ctrl- ( asci0-9 十進位, x 十六進位, o 八進位)"),doquote,NULL,NULL,NULL)) return 0;
  else return -1;
  }
 
@@ -1011,7 +1011,7 @@
   {
   pdupown(bw->cursor,bw->b->marks+c-'0');
   poffline(bw->b->marks[c-'0']);
-  sprintf(msgbuf,"Mark %d set",c-'0');
+  sprintf(msgbuf,"設定第 %d 標記",c-'0');
   msgnw(bw,msgbuf);
   return 0;
   }
@@ -1027,7 +1027,7 @@
  {
  if(c>='0' && c<='9') return dosetmark(bw,c,NULL,NULL);
  else
-  if(mkqwna(bw,sc("Set mark (0-9):"),dosetmark,NULL,NULL,NULL)) return 0;
+  if(mkqwna(bw,sc("設定標記 (0-9):"),dosetmark,NULL,NULL,NULL)) return 0;
   else return -1;
  }
 
@@ -1048,7 +1048,7 @@
    }
   else
    {
-   sprintf(msgbuf,"Mark %d not set",c-'0');
+   sprintf(msgbuf,"標記 %d 沒有設定完成",c-'0');
    msgnw(bw,msgbuf);
    return -1;
    }
@@ -1064,7 +1064,7 @@
  {
  if(c>='0' && c<='9') return dogomark(bw,c,NULL,NULL);
  else
-  if(mkqwna(bw,sc("Goto bookmark (0-9):"),dogomark,NULL,NULL,NULL)) return 0;
+  if(mkqwna(bw,sc("跳到第幾書籤 (0-9):"),dogomark,NULL,NULL,NULL)) return 0;
   else return -1;
  }
 
@@ -1090,7 +1090,7 @@
  else { while((c=pgetc(q))!=MAXINT) if(c==k) break; }
  if(c==MAXINT)
   {
-  msgnw(bw,"Not found");
+  msgnw(bw,"未發現");
   prm(q);
   return -1;
   }
@@ -1139,7 +1139,7 @@
 int umsg(b)
 BASE *b;
  {
- if(wmkpw(b,"Msg (^C to abort): ",NULL,domsg,NULL,NULL,NULL,NULL,NULL)) return 0;
+ if(wmkpw(b,"訊息 (^C 中斷): ",NULL,domsg,NULL,NULL,NULL,NULL,NULL)) return 0;
  else return -1;
  }
 
@@ -1161,6 +1161,6 @@
 int utxt(bw)
 BASE *bw;
  {
- if(wmkpw(bw,"Insert (^C to abort): ",NULL,dotxt,NULL,NULL,utypebw,NULL,NULL)) return 0;
+ if(wmkpw(bw,"插入 (^C 中斷): ",NULL,dotxt,NULL,NULL,utypebw,NULL,NULL)) return 0;
  else return -1;
  }
diff -ruN joe.orig/uerror.c joe/uerror.c
--- joe.orig/uerror.c	Sat Mar 10 06:28:32 2001
+++ joe/uerror.c	Sat Mar 10 06:28:50 2001
@@ -175,7 +175,7 @@
  {
  errbuf=bw->b;
  freeall();
- sprintf(msgbuf,"Parsed %ld lines",parserr(bw->b));
+ sprintf(msgbuf,"顯示第 %ld 行",parserr(bw->b));
  msgnw(bw,msgbuf);
  return 0;
  }
@@ -186,7 +186,7 @@
  int omid;
  if(errptr->link.next==&errors)
   {
-  msgnw(bw,"No more errors");
+  msgnw(bw,"錯誤顯示完畢");
   return -1;
   }
  errptr=errptr->link.next;
@@ -211,7 +211,7 @@
  int omid;
  if(errptr->link.prev==&errors)
   {
-  msgnw(bw,"No more errors");
+  msgnw(bw,"錯誤顯示完畢");
   return -1;
   }
  errptr=errptr->link.prev;
diff -ruN joe.orig/ufile.c joe/ufile.c
--- joe.orig/ufile.c	Sat Mar 10 06:28:32 2001
+++ joe/ufile.c	Sat Mar 10 06:28:51 2001
@@ -66,40 +66,40 @@
  {
  char *s;
  if(bw->b->name && bw->b->name[0]) s=bw->b->name;
- else s="(Unnamed)";
+ else s="(未命名)";
 
  if(name)
   if(saved)
-   sprintf(msgbuf,"File %s saved",name);
+   sprintf(msgbuf,"檔案: %s 存檔完畢.",name);
   else
-   sprintf(msgbuf,"File %s not saved",name);
+   sprintf(msgbuf,"檔案: %s 並未儲存.",name);
  else
   if(bw->b->changed && bw->b->count==1)
-   sprintf(msgbuf,"File %s not saved",s);
+   sprintf(msgbuf,"檔案: %s 存檔完畢.",s);
   else if(saved)
-   sprintf(msgbuf,"File %s saved",s);
+   sprintf(msgbuf,"檔案: %s 已經儲存.",s);
   else
-   sprintf(msgbuf,"File %s not changed so no update needed",s);
+   sprintf(msgbuf,"檔案 %s 並未改變所以不需要更新資料.",s);
  msgnw(bw,msgbuf);
 
  if(!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(" 並未改變所以不需要更新資料."));
    }
  }
 
@@ -113,7 +113,7 @@
     (!square || piscol(markk)>piscol(markb)))
   {
   if(wmkpw(bw,
-           "Name of file to write (^C to abort): ",&filehist,dowrite,"Names",NULL,cmplt,NULL,NULL)) return 0;
+           "欲寫入的檔案名稱 (^C 中斷): ",&filehist,dowrite,"Names",NULL,cmplt,NULL,NULL)) return 0;
   else return -1;
   }
  else return usave(bw);
@@ -255,12 +255,12 @@
   vsrm(req->name);
   free(req);
   if(notify) *notify=1;
-  msgnw(bw,"Couldn't make backup file... file not saved");
+  msgnw(bw,"無法產生備份檔 ... 檔案並未儲存.");
   if(callback) return callback(bw,-1);
   else return -1;
   }
  if(c!='y' && c!='Y')
-  if(mkqw(bw,sc("Could not make backup file.  Save anyway (y,n,^C)? "),saver,NULL,req,notify))
+  if(mkqw(bw,sc("無法產生備份檔.  無論如何都要儲存 (y,n,^C)? "),saver,NULL,req,notify))
    return 0;
   else
    {
@@ -321,7 +321,7 @@
   return -1;
   }
  else
-  if(mkqw(bw,sc("File exists.  Overwrite (y,n,^C)? "),dosave2,NULL,s,notify)) return 0;
+  if(mkqw(bw,sc("檔案已經存在.  覆蓋\過去 (y,n,^C)? "),dosave2,NULL,s,notify)) return 0;
   else return -1;
  }
 
@@ -348,7 +348,7 @@
 BW *bw;
  {
  BW *pbw=wmkpw(bw,
-                "Name of file to save (^C to abort): ",&filehist,dosave1,"Names",NULL,cmplt,NULL,NULL);
+                "欲儲存的檔案名稱 (^C 中斷): ",&filehist,dosave1,"Names",NULL,cmplt,NULL,NULL);
  if(pbw && bw->b->name)
   {
   binss(pbw->cursor,bw->b->name);
@@ -375,7 +375,7 @@
  if(notify) *notify=1;
  if(bw->pid)
   {
-  msgnw(bw,"Process running in this window");
+  msgnw(bw,"視窗中有程式正在執行中");
   return -1;
   }
  b=bfind(s);
@@ -415,7 +415,7 @@
  {
  if(bw->b->count==1 && bw->b->changed)
   {
-  msgnw(bw,"Can't replace modified file");
+  msgnw(bw,"無法取代已更改過的檔案.");
   return -1;
   }
  else return 0;
@@ -424,7 +424,7 @@
 int uedit(bw)
 BW *bw;
  {
- if(wmkpw(bw,"Name of file to edit (^C to abort): ",&filehist,doedit,"Names",NULL,cmplt,NULL,NULL)) return 0;
+ if(wmkpw(bw,"欲編輯的檔案名稱 (^C 中斷): ",&filehist,doedit,"Names",NULL,cmplt,NULL,NULL)) return 0;
  else return -1;
  }
 
@@ -444,7 +444,7 @@
  if(notify) *notify=1;
  if(bw->pid)
   {
-  msgnw(bw,"Process running in this window");
+  msgnw(bw,"視窗中有程式正在執行中");
   return -1;
   }
  b=bfind(s);
@@ -478,7 +478,7 @@
  B *b;
  if(bw->pid)
   {
-  msgnw(bw,"Process running in this window");
+  msgnw(bw,"視窗中有程式正在執行中");
   return -1;
   }
  b=bnext();
@@ -502,7 +502,7 @@
  B *b;
  if(bw->pid)
   {
-  msgnw(bw,"Process running in this window");
+  msgnw(bw,"視窗中有程式正在執行中");
   return -1;
   }
  b=bprev();
@@ -522,7 +522,7 @@
 BW *bw;
  {
  if(wmkpw(bw,
-           "Name of file to insert (^C to abort): ",&filehist,doinsf,"Names",NULL,cmplt,NULL,NULL)) return 0;
+           "欲插入的檔案名稱 (^C 中斷): ",&filehist,doinsf,"Names",NULL,cmplt,NULL,NULL)) return 0;
  else return -1;
  }
 
@@ -581,7 +581,7 @@
  else
   {
   BW *pbw=wmkpw(bw,
-                "Name of file to save (^C to abort): ",&filehist,doex,"Names",NULL,cmplt,NULL,NULL);
+                "欲儲存的檔案名稱 (^C 中斷): ",&filehist,doex,"Names",NULL,cmplt,NULL,NULL);
   if(pbw && bw->b->name)
    {
    binss(pbw->cursor,bw->b->name);
@@ -605,7 +605,7 @@
   else
    {
    BW *pbw=wmkpw(bw,
-                 "Name of file to save (^C to abort): ",&filehist,dosave1,"Names",NULL,cmplt,object,notify);
+                 "欲儲存的檔案名稱 (^C 中斷): ",&filehist,dosave1,"Names",NULL,cmplt,object,notify);
    if(pbw) return 0;
    else return -1;
    }
@@ -618,7 +618,7 @@
  else
   if(bw->b->count==1 && bw->b->changed)
    {
-   if(mkqw(bw,sc("Save changes to this file (y,n,^C)? "),nask,NULL,object,notify)) return 0;
+   if(mkqw(bw,sc("要儲存對這檔案的更改嗎 (y,n,^C)? "),nask,NULL,object,notify)) return 0;
    else return -1;
    }
   else
@@ -644,7 +644,7 @@
  if(c=='y' || c=='Y')
   {
   BW *pbw=wmkpw(bw,
-                "Name of file to save (^C to abort): ",&filehist,dosave1,"Names",NULL,cmplt,object,notify);
+                "欲儲存的檔案名稱 (^C 中斷): ",&filehist,dosave1,"Names",NULL,cmplt,object,notify);
   if(pbw) return 0;
   else return -1;
   }
@@ -657,7 +657,7 @@
  else
   if(bw->b->count==1 && bw->b->changed)
    {
-   if(mkqw(bw,sc("Save changes to this file (y,n,^C)? "),nask,NULL,object,notify)) return 0;
+   if(mkqw(bw,sc("要儲存對這檔案的更改嗎 (y,n,^C)? "),nask,NULL,object,notify)) return 0;
    else return -1;
    }
   else
@@ -700,7 +700,7 @@
  msgnw(bw,NULL);
  if(bw->pid) return ukillpid(bw);
  if(bw->b->count==1 && bw->b->changed)
-  if(mkqw(bw,sc("Lose changes to this file (y,n,^C)? "),dolose,NULL,NULL,NULL)) return 0;
+  if(mkqw(bw,sc("放棄對這檔案的更改嗎 (y,n,^C)? "),dolose,NULL,NULL,NULL)) return 0;
   else return -1;
  else return dolose(bw,'y',NULL,NULL);
  }
diff -ruN joe.orig/uisrch.c joe/uisrch.c
--- joe.orig/uisrch.c	Sat Mar 10 06:28:32 2001
+++ joe/uisrch.c	Sat Mar 10 06:28:51 2001
@@ -138,7 +138,7 @@
  {
  struct isrch *isrch=(struct isrch *)malloc(sizeof(struct isrch));
  izque(IREC,link,&isrch->irecs);
- isrch->pattern=vsncpy(NULL,0,sc("I-find: "));
+ isrch->pattern=vsncpy(NULL,0,sc("即時搜尋:"));
  isrch->ofst=sLen(isrch->pattern);
  isrch->dir=dir;
  isrch->quote=0;
diff -ruN joe.orig/umath.c joe/umath.c
--- joe.orig/umath.c	Sat Mar 10 06:28:33 2001
+++ joe/umath.c	Sat Mar 10 06:28:51 2001
@@ -13,7 +13,7 @@
 
 void fperr()
  {
- if(!merr) merr="Float point exception";
+ if(!merr) merr="必須使用浮點數";
  signal(SIGFPE,fperr);
  }
 
@@ -67,7 +67,7 @@
   ++ptr;
   x=expr(0,&v);
   if(*ptr==')') ++ptr;
-  else { if(!merr) merr="Missing )"; }
+  else { if(!merr) merr="找不到 )"; }
   }
  else if(*ptr=='-')
   {
@@ -105,7 +105,7 @@
   ++ptr;
   x=expr(2,&dumb);
   if(v) v->val=x, v->set=1;
-  else { if(!merr) merr="Left side of = is not an l-value"; }
+  else { if(!merr) merr="等號\"=\"左邊的值不是一個 L-value"; }
   goto loop;
   }
  *rtv=v;
@@ -138,7 +138,7 @@
    while(*ptr==' ' || *ptr=='\t') ++ptr;
    if(*ptr) goto up;
    }
-  else if(*ptr) merr="Extra junk after end of expr";
+  else if(*ptr) merr="運算式後有額外無用的運算式";
   }
  return result;
  }
diff -ruN joe.orig/undo.c joe/undo.c
--- joe.orig/undo.c	Sat Mar 10 06:28:33 2001
+++ joe/undo.c	Sat Mar 10 06:28:51 2001
@@ -465,7 +465,7 @@
 BW *bw;
  {
  bw->b->changed=0;
- msgnw(bw,"Modified flag cleared");
+ msgnw(bw,"更改過的旗標已經清除");
  return 0;
  }
 
@@ -482,7 +482,7 @@
   }
  else
   {
-  msgnw(bw,"No block");
+  msgnw(bw,"沒有標示區塊");
   return -1;
   }
  }
diff -ruN joe.orig/usearch.c joe/usearch.c
--- joe.orig/usearch.c	Sat Mar 10 06:28:33 2001
+++ joe/usearch.c	Sat Mar 10 06:28:51 2001
@@ -300,7 +300,7 @@
  if(srch->replace)
   {
   if(wmkpw(bw,
-           "Replace with (^C to abort): ",&replhist,set_replace,srchstr,pfabort,utypebw,srch,notify))
+           "更以什麼取代 (^C 中斷): ",&replhist,set_replace,srchstr,pfabort,utypebw,srch,notify))
    return 0;
   else return -1;
   }
@@ -316,7 +316,7 @@
  BW *pbw;
  vsrm(srch->pattern); srch->pattern=s;
  if(pbw=wmkpw(bw,
-          "(I)gnore (R)eplace (B)ackwards Bloc(K) NNN (^C to abort): ",
+	"(I)忽略(R)取代(B)往前搜尋(K)搜尋區塊(N)符合字串(^C 中斷):",
           NULL,set_options,srchstr,pfabort,utypebw,srch,notify))
   {
   char buf[10];
@@ -360,7 +360,7 @@
   }
  srch=setmark(mksrch(NULL,NULL,0,back,-1,repl,0));
  srch->addr=bw->cursor->byte;
- if(wmkpw(bw,"Find (^C to abort): ",&findhist,set_pattern,srchstr,pfabort,utypebw,srch,NULL))
+ if(wmkpw(bw,"找尋字串 (^C 中斷): ",&findhist,set_pattern,srchstr,pfabort,utypebw,srch,NULL))
   return 0;
  else
   {
@@ -394,7 +394,7 @@
 SRCH *srch;
  {
  P *q;
- if(bw->b->rdonly) { msgnw(bw,"Read only"); return -1; }
+ if(bw->b->rdonly) { msgnw(bw,"唯讀"); return -1; }
  if(markk) markk->end=1;
  if(srch->markk) srch->markk->end=1;
  q=pdup(bw->cursor);
@@ -469,7 +469,7 @@
   nungetc(c);
   return 0;
   }
- if(mkqwnsr(bw,sc("Replace (Y)es (N)o (R)est (B)ackup (^C to abort)?"),dopfrepl,pfsave,srch,notify))
+ if(mkqwnsr(bw,sc("取代 (Y)是 (N)否 (R)全部取代 (B)備份 (^C 中斷)?"),dopfrepl,pfsave,srch,notify))
   return 0;
  else return pfsave(bw,srch);
  }
@@ -582,8 +582,8 @@
   bye: if(!srch->flg && !srch->rest)
    {
    if(srch->valid && srch->restrict)
-    msgnw(bw,"Not found (search restricted to marked block)");
-   else msgnw(bw,"Not found");
+    msgnw(bw,"未發現 (搜尋區域限定在選定區塊中)");
+   else msgnw(bw,"未發現");
    ret= -1;
    }
   break;
diff -ruN joe.orig/ushell.c joe/ushell.c
--- joe.orig/ushell.c	Sat Mar 10 06:28:33 2001
+++ joe/ushell.c	Sat Mar 10 06:28:51 2001
@@ -39,14 +39,14 @@
  close(bw->out); bw->out= -1;
  if(piseof(bw->cursor))
   {
-  binss(bw->cursor,"** Program finished **\n");
+  binss(bw->cursor,"** 程式執行完畢 **\n");
   peof(bw->cursor);
   bw->cursor->xcol=piscol(bw->cursor);
   }
  else
   {
   P *q=pdup(bw->b->eof);
-  binss(q,"** Program finished **\n");
+  binss(q,"** 程式執行完畢 **\n");
   prm(q);
   }
  }
@@ -95,14 +95,14 @@
 #ifdef __MSDOS__
  if(notify) *notify=1;
  varm(s);
- msgnw(bw,"Sorry, no sub-processes in DOS (yet)");
+ msgnw(bw,"對不起! 並沒有其它的程式在 DOS 下執行");
  return -1;
 #else
  MPX *m;
  if(notify) *notify=1;
  if(bw->pid && orphan)
   {
-  msgnw(bw,"Program already running in this window");
+  msgnw(bw,"程式已經在這個視窗中執行");
   varm(s);
   return -1;
   }
@@ -115,7 +115,7 @@
  if(!(m=mpxmk(&bw->out,name,s,cdata,bw,cdone,bw)))
   {
   varm(s);
-  msgnw(bw,"No ptys available");
+  msgnw(bw,"沒有多餘的視窗可用");
   return -1;
   }
  else bw->pid= m->pid;
@@ -156,7 +156,7 @@
 int urun(bw)
 BW *bw;
  {
- if(wmkpw(bw,"Program to run: ",&runhist,dorun,"Run",NULL,NULL,NULL,NULL))
+ if(wmkpw(bw,"欲執行的程式名稱: ",&runhist,dorun,"Run",NULL,NULL,NULL,NULL))
   return 0;
  else return -1;
  }
@@ -179,7 +179,7 @@
  {
  if(bw->pid)
   {
-  if(mkqw(bw,sc("Kill program (y,n,^C)?"),pidabort,NULL,NULL,NULL)) return 0;
+  if(mkqw(bw,sc("中斷正在執行的程式 (y,n,^C)?"),pidabort,NULL,NULL,NULL)) return 0;
   else return -1;
   }
  else return 0;
diff -ruN joe.orig/utag.c joe/utag.c
--- joe.orig/utag.c	Sat Mar 10 06:28:33 2001
+++ joe/utag.c	Sat Mar 10 06:28:51 2001
@@ -49,7 +49,7 @@
  f=fopen("tags","r");
  if(!f)
   {
-  msgnw(bw,"Couldn't open tags file");
+  msgnw(bw,"無法開啟標籤檔");
   vsrm(s);
   vsrm(t);
   return -1;
@@ -94,7 +94,7 @@
        dofollows();
        mid=omid;
        }
-      else msgnw(bw,"Invalid line number");
+      else msgnw(bw,"不合法的行數");
       }
      else
       {
@@ -131,7 +131,7 @@
     }
    }
   }
- msgnw(bw,"Not found");
+ msgnw(bw,"未發現");
  vsrm(s);
  vsrm(t);
  fclose(f);
@@ -144,7 +144,7 @@
 BW *bw;
  {
  BW *pbw;
- pbw=wmkpw(bw,"Tag search: ",&taghist,dotag,NULL,NULL,cmplt,NULL,NULL);
+ pbw=wmkpw(bw,"標籤搜尋: ",&taghist,dotag,NULL,NULL,cmplt,NULL,NULL);
  if(pbw && crest(brc(bw->cursor)))
   {
   P *p=pdup(bw->cursor);
diff -ruN joe.orig/vfile.c joe/vfile.c
--- joe.orig/vfile.c	Sat Mar 10 06:28:33 2001
+++ joe/vfile.c	Sat Mar 10 06:28:52 2001
@@ -202,7 +202,7 @@
    pp->next=vp->next;
    goto gotit;
    }
-write(2,"vfile: out of memory\n",21);
+write(2,"vfile: 記憶體不足\n",21);
 exit(1);
 
 gotit:
@@ -259,7 +259,7 @@
 new->fd=open(name,O_RDWR);
 if(!new->fd)
  {
- fprintf(stderr,"Couldn\'t open file \'%s\'\n",name);
+ fprintf(stderr,"無法開啟檔案 \'%s\'\n",name);
  free(new);
  return 0;
  }