diff -urN kdenetwork-2.2.1.orig/kmail/Makefile.am kdenetwork-2.2.1/kmail/Makefile.am
--- kdenetwork-2.2.1.orig/kmail/Makefile.am	Sat Sep 22 19:17:03 2001
+++ kdenetwork-2.2.1/kmail/Makefile.am	Sat Sep 22 19:18:30 2001
@@ -1,7 +1,7 @@
 KDE_CXXFLAGS = $(USE_RTTI)
 
 SUBDIRS = . about pics
-INCLUDES = -I$(top_srcdir)/libkdenetwork -I$(top_srcdir)/mimelib $(all_includes)
+INCLUDES = -I$(top_srcdir)/libkdenetwork -I$(top_srcdir)/mimelib $(all_includes) -DHONYAKU
 LDADD	= $(LIB_KHTML) ../libkdenetwork/libkdenetwork.la -lkspell ../mimelib/libmimelib.la $(LIB_KAB)
 
 bin_PROGRAMS = kmail
diff -urN kdenetwork-2.2.1.orig/kmail/honyaku.c kdenetwork-2.2.1/kmail/honyaku.c
--- kdenetwork-2.2.1.orig/kmail/honyaku.c	Thu Jan  1 09:00:00 1970
+++ kdenetwork-2.2.1/kmail/honyaku.c	Sat Sep 22 19:18:30 2001
@@ -0,0 +1,475 @@
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <netdb.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#define MAXHOSTNAMELENGTH 256
+
+int OpenStreamSocket( unsigned short pnum,int socktype,char *hostin)
+/*
+int OpenStreamSocket( pnum,socktype,hostin)
+unsigned short pnum;
+int socktype;
+char *hostin;
+*/
+{
+   struct sockaddr_in sockin;
+   struct hostent *hent;
+   int sk;
+   char *host;
+
+   host = (char *)malloc(MAXHOSTNAMELENGTH);
+
+   if(strlen(hostin))
+    strcpy(host,hostin);
+   else
+    if(gethostname(host,MAXHOSTNAMELENGTH))
+       return(-1);
+   if( ! (hent=gethostbyname(host)) )
+       return(-1);
+
+   if( -1 == (sk = socket(AF_INET,socktype,0)))
+       return(-1);
+
+   sockin.sin_family=AF_INET;
+   sockin.sin_addr.s_addr = *(unsigned long *)hent->h_addr;
+   sockin.sin_port = htons(pnum);
+
+   if( connect( sk ,(struct sockaddr *)&sockin
+                      ,sizeof(struct sockaddr_in) ) )   
+       return(-1);
+   free(host);
+   return(sk);
+}
+typedef unsigned char Uchar;
+typedef Uchar HCmd;
+typedef unsigned int  Uint;
+typedef int HRes;
+#define EndStrCnt 1
+#define HPORT 2744 /* honyaku socket port */
+#define HCdb(a) {0x00,0xf0,0x00,a}
+#define HCdbTrans(a) {0x00,0x00,0x00,a}
+HCmd Ej[]= HCdbTrans(1);
+HCmd Je[]= HCdbTrans(2);
+HCmd Para0[] = HCdbTrans(0);
+HCmd ProtVer[]={0x00,0x00,0xe0,0x01};
+HCmd PortBegin[]={0xaa,0xbb,0xcc,0xdd};
+HCmd EgInit[]=HCdb(0x01);
+HCmd EgEnd[] =HCdb(0x02);
+HCmd EgTranslateOne[] =HCdb(0x04);
+HCmd EgGetEquiv[] =HCdb(0x07);
+HCmd EgGetWord[] =HCdb(0x08);
+HCmd EgSetWord[] =HCdb(0x09);
+HCmd TrnsDivideSentence[]=HCdb(0x1b);
+HCmd EgSetMode[]=HCdb(0x11);
+HCmd EgSetDictName[]=HCdb(0x13);
+HCmd TrnsGetStatus[]=HCdb(0x1a);
+HCmd EgClearCache[]=HCdb(0x14);
+HCmd EgSetTimeout[]=HCdb(0x1c);
+HCmd EndStr[]={0x00};
+
+typedef union {
+ unsigned int ui;
+ Uchar uc[4];
+} U4;
+typedef union {
+ Uint ui[3];
+ struct { Uchar uc1[4],uc2[4],uc3[4]; } uc ;
+} R3;
+typedef union {
+ Uint ui[4];
+ struct { Uchar uc1[4],uc2[4],uc3[4],uc4[4]; } uc ;
+} R4;
+typedef struct {
+  FILE *in;
+  FILE *out;
+} HServ;
+Uint reverse4( Uint i )
+/* Uint reverse4( i )
+Uint i; */
+{
+  U4 u,u1;
+  u.ui=i;
+  u1.uc[3]=u.uc[0]; u1.uc[2]=u.uc[1];
+  u1.uc[1]=u.uc[2]; u1.uc[0]=u.uc[3];
+  return(u1.ui);
+}
+HRes eg_init(HServ *serv, HCmd *trans , char *user )
+/*
+HRes eg_init(serv, trans , user )
+HServ *serv;
+HCmd *trans;
+char *user;
+*/
+{
+/*    4bytes  + 4bytes    + 4bytes + 4bytes + 4bytes  + StringLength
+    PortBegin + CmdLength + Eginit + Trans  + ProtVer + UserName
+                          |     CmdLength                                | */
+   R3 r; Uint cnt;
+   fwrite(PortBegin,1,4,serv->in);
+   cnt = reverse4(4+4+4+strlen(user)+EndStrCnt);
+   fwrite(&cnt,1,4,serv->in);
+   fwrite(EgInit,1,4,serv->in);
+   fwrite(trans,1,4,serv->in);
+   fwrite(ProtVer,1,4,serv->in);
+   fwrite(user,1,strlen(user),serv->in);
+   fwrite(EndStr,1,1,serv->in);
+   fflush(serv->in);
+
+   fread(&r.ui,3,4,serv->out);
+   fflush(serv->out);
+   return(r.ui[2]);
+}
+HRes eg_end(HServ *serv, HCmd *trans)
+{
+/*  PortBegin(4) + CmdLength(4) + Egend(4) + Trans(4)
+   CmdLength = EgEnd + Trans */
+  R3 r; Uint cnt;
+  fwrite(PortBegin,1,4,serv->in);
+  cnt = reverse4(8);
+  fwrite(&cnt,1,4,serv->in);
+  fwrite(EgEnd,1,4,serv->in);
+  fwrite(trans,1,4,serv->in);
+  fflush(serv->in);
+
+  fread(&r.ui,3,4,serv->out);
+  fflush(serv->out);
+  return(r.ui[2]);
+}
+HRes eg_setmode(HServ *serv,HCmd *trans, char *mode)
+{
+  R3 r; Uint cnt;
+  fwrite(PortBegin,1,4,serv->in);
+  cnt = reverse4(8 + strlen(mode)+EndStrCnt);
+  fwrite(&cnt,1,4,serv->in);
+  fwrite(EgSetMode,1,4,serv->in);
+  fwrite(trans,1,4,serv->in); 
+  fwrite(mode,1,strlen(mode),serv->in);
+  fwrite(EndStr,1,1,serv->in); 
+  fflush(serv->in);
+
+  fread(&r.ui,3,4,serv->out);
+  fflush(serv->out);
+  return(r.ui[2]);
+}
+HRes eg_clear_cache(HServ *serv,HCmd *trans)
+{
+   R3 r; Uint cnt;
+   fwrite(PortBegin,1,4,serv->in);
+   cnt = reverse4(8);
+   fwrite(&cnt,1,4,serv->in);
+   fwrite(EgClearCache,1,4,serv->in);
+   fwrite(trans,1,4,serv->in);
+   fflush(serv->in);
+ 
+   fread(&r.ui,3,4,serv->out);
+   fflush(serv->out);
+   return(r.ui[2]); 
+}
+HRes eg_set_timeout(HServ *serv,HCmd *trans,Uint ltout,Uint htout)
+{
+   R3 r; Uint cnt;
+   fwrite(PortBegin,1,4,serv->in);
+   cnt = reverse4(16);
+   fwrite(&cnt,1,4,serv->in);
+   fwrite(EgSetTimeout,1,4,serv->in);
+   fwrite(trans,1,4,serv->in);
+   cnt = reverse4(ltout);
+   fwrite(&cnt,1,4,serv->in);
+   cnt = reverse4(htout);
+   fwrite(&cnt,1,4,serv->in);
+   fflush(serv->in);
+ 
+   fread(&r.ui,3,4,serv->out);
+   fflush(serv->out);
+   return(r.ui[2]); 
+}
+typedef struct {
+  Uchar kind[2];
+  Uchar id[2];
+  char name[256];
+} EG_DICNAME_T;
+HRes eg_setdictname(HServ *serv,HCmd *trans, char *user)
+{
+  EG_DICNAME_T ldic,sdic,cdic; /* learn ,system ,computer dictionary */
+  U4 *u4array; R3 r; Uint i,lc;
+  fwrite(PortBegin,1,4,serv->in);
+  memset(ldic.name,0,256); memset(sdic.name,0,256); memset(cdic.name,0,256);
+  sdic.kind[0]=0; sdic.kind[1]=0; /* system dictionary */
+  sdic.id[0]='S'; sdic.id[1]='S'; sprintf(sdic.name , "");
+  cdic.kind[0]=0; cdic.kind[1]=3; /* computer dictionary */
+  cdic.id[0]='C'; cdic.id[1]='C'; sprintf(cdic.name,"computer");
+  ldic.kind[0]=0; ldic.kind[1]=4; /* learn dictionary */
+  ldic.id[0]='L'; ldic.id[1]='L'; sprintf(ldic.name,"%s",user);
+
+  i = reverse4(20+(4+strlen(sdic.name)+1)+(4+strlen(cdic.name)+1)+
+                                               (4+strlen(ldic.name)+1));
+  fwrite(&i,1,4,serv->in);
+  fwrite(EgSetDictName,1,4,serv->in);
+  fwrite(trans,1,4,serv->in);
+  i = reverse4(1); /* using computer dictionary */
+  fwrite(&i,1,4,serv->in);
+  i = reverse4(1); /* using learn dictionary */
+  fwrite(&i,1,4,serv->in);
+  i = reverse4(3); /* Number of dictionary */
+  fwrite(&i,1,4,serv->in);
+
+  fwrite(&sdic,1,4,serv->in);
+  fwrite(sdic.name,1,strlen(sdic.name)+1,serv->in);
+
+  fwrite(&cdic,1,4,serv->in);
+  fwrite(cdic.name,1,strlen(cdic.name)+1,serv->in);
+
+  fwrite(&ldic,1,4,serv->in);
+  fwrite(ldic.name,1,strlen(ldic.name)+1,serv->in);
+
+  fflush(serv->in);
+  
+  fread(&r.ui,3,4,serv->out);
+  if( r.ui[2] )
+   return( r.ui[2] );
+  lc = reverse4(r.ui[1])-4;
+  u4array = (U4 *)malloc(lc);
+  fread(u4array,lc/4,4,serv->out);
+  fflush(serv->out);
+  for( i = 0 ; i < lc/4 ; ++i)
+  {
+ printf("u4array[%d][%d]\n",i,reverse4(u4array[i].ui));
+    if( reverse4(u4array[i].ui) == 99 )
+    {
+       free(u4array);
+       return(-1); /* can not open system,computer,learn dictionary */
+    }
+  }
+  free(u4array);
+  return(0);
+}
+char *eg_translate_one(HServ *serv,HCmd *trans,char *text)
+{
+  R3 r; Uint rlen; char *ibuf;
+  fwrite(PortBegin,1,4,serv->in);
+  rlen = reverse4(6*4 + strlen(text)+EndStrCnt);
+  fwrite(&rlen,1,4,serv->in);
+  fwrite(EgTranslateOne,1,4,serv->in);
+  fwrite(trans,1,4,serv->in);
+  fwrite(Para0,1,4,serv->in);
+  rlen = reverse4(1024*2);
+  fwrite(&rlen,1,4,serv->in);
+  fwrite(Para0,1,4,serv->in);
+  fwrite(Para0,1,4,serv->in);
+  fwrite(text,sizeof(char),strlen(text),serv->in);
+  fwrite(EndStr,1,1,serv->in);
+  fflush(serv->in);
+  fread(&r.ui,4,3,serv->out);
+  if( r.ui[2] )
+    return((char *)NULL);
+  rlen = reverse4(r.ui[1])-4;
+  ibuf = (char *)malloc(rlen);
+  fread(ibuf,sizeof(char),rlen,serv->out);
+  fflush(serv->out);
+//  printf("[%s]\n",ibuf+2);
+  return(ibuf);
+}
+#define TRANS_BUF_CNT 100
+typedef struct {
+ Uint linecnt;
+ char *ib[TRANS_BUF_CNT];
+ char *ob[TRANS_BUF_CNT];
+} Trans_Cdb;
+
+HRes Honyaku_trans(HServ *serv,HCmd *trans,Trans_Cdb *tc,char *text)
+{ /* PortBegin(4) + Cmdlength(xx) + TrnsDivideSentence(4) +
+                         Trans(4) + info_char(4) + TextLength(strlen(text) */
+  R4 r; Uint rlen; char *ibuf;
+  char *nc,*ic;
+  fwrite(PortBegin,1,4,serv->in);
+  rlen = reverse4(3*4+strlen(text)+EndStrCnt);
+  fwrite(&rlen,1,4,serv->in);
+  fwrite(TrnsDivideSentence,1,4,serv->in);
+  fwrite(trans,1,4,serv->in);
+  rlen = reverse4(0); /* infomation characters */
+  fwrite(&rlen,1,4,serv->in);
+// printf("[%s][%d]\n",text,strlen(text));
+  fwrite(text,sizeof(char),strlen(text),serv->in);
+  fwrite(EndStr,1,1,serv->in);
+  fflush(serv->in);
+
+  fread(&r.ui,4,4,serv->out);
+  /*r.ui[0]=0xaabbccdd, r.ui[1]=result length, r.ui[2]=result, r.ui[3]=number of strings*/
+  rlen  = reverse4(r.ui[1]) - 4*2;
+  if( r.ui[2] )
+    return(r.ui[2]);
+  tc->linecnt = reverse4(r.ui[3]);
+  if( tc->linecnt > TRANS_BUF_CNT-1) /* translation buffer over flow */
+    return(-1);
+// printf("[%d][%d]\n",tc->linecnt,rlen);
+  ibuf = (char *)malloc(rlen);
+  fread(ibuf,1,rlen,serv->out);
+  fflush(serv->out);
+// printf("[%s][%d]\n",ibuf,strlen(ibuf));
+  tc->ib[0]=NULL;
+  for( rlen = 0 ,nc = ibuf ; rlen < tc->linecnt ; ++rlen)
+  {
+     ic = strchr(nc,'\n');
+     if(ic)
+     {
+       tc->ib[rlen]=nc;
+       *ic='\0';
+       nc = ic+1;
+     }
+     else
+       nc = ic;
+  }
+
+  for( rlen = 0 ; rlen < tc->linecnt ; ++rlen )
+  {
+//     printf("[%d][%s]\n",rlen,tc->ib[rlen]);
+     nc = eg_translate_one(serv,trans,tc->ib[rlen]);
+     if( nc )
+       tc->ob[rlen]=nc;
+     else
+       return(-1);
+  }
+  return(0);
+}
+void show_honyaku(Trans_Cdb *tc)
+{
+   Uint i;
+   for( i = 0 ; i < tc->linecnt ; ++i )
+   {
+       printf("[E]%s\n",tc->ib[i]);
+       printf("[J]%s\n",tc->ob[i]+2);
+   } 
+}
+void honyaku_end(Trans_Cdb *tc)
+{
+   Uint i;
+   if( tc->ib[0] )
+   {
+     free(tc->ib[0]);
+   }
+   for(i=0; i < tc->linecnt; ++i)
+   {
+     if( tc->ob[i] )
+       free(tc->ob[i]);
+   }
+}
+int OpenHonyakuServer(void)
+{
+   int fd,portnum;
+   char *host,*pn;
+   if( !(host = getenv("HONYAKUSERVER")) )
+   {
+     host=(char *)&"localhost"[0];
+   }
+   if( !(pn=getenv("HONYAKUPORT")) )
+   {
+     portnum = HPORT;
+   }
+   else
+   {
+     portnum = atoi(pn);
+   }
+   fprintf(stderr,"Honyaku Server[%s] Port[%d]\n",host,portnum);
+ 
+   if( (fd = OpenStreamSocket( portnum , SOCK_STREAM , host )) == -1 )
+   {
+     fprintf(stderr,"Can not connect Honyaku Server\n");
+     return(0);
+   } 
+   return(fd);
+}
+#ifndef HONYAKU
+/* #define HTEST */
+#ifdef HTEST
+main()
+{
+   int fd; char *user;
+   HServ serv;
+   Trans_Cdb tc;
+   char ibuf[1024];
+
+#if 1
+   if( !(fd = OpenHonyakuServer()) )
+   {
+     fprintf(stderr,"Can not connect Honyaku Server\n");
+     exit(1); 
+   }
+   if( !(user = getenv("HONYAKUUSER")) )
+     user = getenv("LOGNAME");
+   fprintf(stderr,"Honyaku User[%s]\n",user);
+   serv.in = fdopen(fd,"wb");
+   serv.out = fdopen(fd,"rb");
+
+// Translate from English to Japanese
+   printf("init[%d]\n",eg_init(&serv,Ej,user));
+   printf("mode[%d]\n",eg_setmode(&serv,Ej,"DKW"));
+//   printf("[%d]\n",eg_setmode(&serv,Ej,"KW"));
+   printf("dicname[%d]\n",eg_setdictname(&serv,Ej,user));
+   if( 1 ) /* EJ mode only */
+     printf("clearcache[%d]\n",eg_clear_cache(&serv,Ej)); 
+   printf("timeout[%d]\n",eg_set_timeout(&serv,Ej,60,60)); 
+   printf("Honyaku[%d]\n",Honyaku_trans(&serv,Ej,&tc,
+                         "This is a pen. Is this an apple ?"));
+   show_honyaku(&tc);
+   printf("Honyaku[%d]\n",Honyaku_trans(&serv,Ej,&tc,
+                "I like playing baseball. Have you ever been to London ?"));
+   show_honyaku(&tc);
+   printf("Honyaku[%d]\n",Honyaku_trans(&serv,Ej,&tc,
+                "This is an apple that bought at the shop yesterday."));
+   show_honyaku(&tc);
+
+   honyaku_end(&tc);
+   printf("end[%d]\n",eg_end(&serv,Ej));
+
+// Translate from Japanese to English
+   printf("init[%d]\n",eg_init(&serv,Je,user));
+   printf("[%d]\n",eg_setmode(&serv,Je,"10110:I:it"));
+   printf("dicname[%d]\n",eg_setdictname(&serv,Je,user));
+   printf("timeout[%d]\n",eg_set_timeout(&serv,Je,60,60));
+   printf("Honyaku[%d]\n",Honyaku_trans(&serv,Je,&tc,
+                         "これは、ペンですか？。はい、ペンです。"));
+   show_honyaku(&tc);
+   printf("Honyaku[%d]\n",Honyaku_trans(&serv,Je,&tc,
+     "私は、野球をするのが好きです。このリンゴは、昨日八百屋で買いました。"));
+   show_honyaku(&tc);
+
+   honyaku_end(&tc);
+   printf("end[%d]\n",eg_end(&serv,Je));
+
+   fclose(serv.in);fclose(serv.out);close(fd);
+#else
+  while( gets(ibuf) )
+  {
+    if( ibuf[0]=='#')
+       break;
+   if( !(fd = OpenHonyakuServer()) )
+   {   
+     fprintf(stderr,"Can not connect Honyaku Server\n");
+     exit(1);
+   }
+   if( !(user = getenv("HONYAKUUSER")) )
+     user = getenv("LOGNAME");
+   fprintf(stderr,"Honyaku User[%s]\n",user);
+   serv.in = fdopen(fd,"wb");
+   serv.out = fdopen(fd,"rb");
+
+   printf("init[%d]\n",eg_init(&serv,Ej,user));
+   printf("mode[%d]\n",eg_setmode(&serv,Ej,"DKW"));
+   printf("dicname[%d]\n",eg_setdictname(&serv,Ej,user));
+   printf("clearcache[%d]\n",eg_clear_cache(&serv,Ej));
+   printf("timeout[%d]\n",eg_set_timeout(&serv,Ej,60,60));
+   printf("Honyaku[%d]\n",Honyaku_trans(&serv,Ej,&tc,ibuf ));
+   show_honyaku(&tc);
+   honyaku_end(&tc);
+   printf("end[%d]\n",eg_end(&serv,Ej));
+   fclose(serv.in);fclose(serv.out);close(fd);
+  }
+#endif
+}
+#endif /* HTEST */
+#endif /* HONYAKU */
diff -urN kdenetwork-2.2.1.orig/kmail/honyaku1.cpp kdenetwork-2.2.1/kmail/honyaku1.cpp
--- kdenetwork-2.2.1.orig/kmail/honyaku1.cpp	Thu Jan  1 09:00:00 1970
+++ kdenetwork-2.2.1/kmail/honyaku1.cpp	Sat Sep 22 19:18:31 2001
@@ -0,0 +1,172 @@
+#ifdef HONYAKU
+#include "honyaku.c" 
+// Translate from English to Japanese for using Honyaku-tamashii.
+void KMMainWin::TransMsg(int dir_trans)
+{
+  QString ttext,temp;
+  QMultiLineEdit *edt;
+  int fdd;
+  Uint i;
+  HServ serv;
+  Trans_Cdb tc;
+  char *user;Uchar *ej_je;
+ 
+  if( dir_trans )
+    ej_je = Ej;
+  else
+    ej_je = Je;
+  ttext = mMsgView->copyText();
+//  printf("asu-kmain[%s]\n",ttext.local8Bit().data());
+  if( ttext.isEmpty() )
+  {
+     KMessageBox::sorry( this, i18n("Please Select Text Messages") );
+     return;
+  }
+
+  edt = new QMultiLineEdit;
+  edt->setCursorPosition(0, 0);
+  edt->insertLine("--- Original Copy ---");
+  edt->insertLine(ttext);
+  edt->insertLine("---------------------\n");
+//   edt->setReadOnly(TRUE);
+
+  if( ! (fdd = OpenHonyakuServer()) )
+  {
+     KMessageBox::sorry( this, i18n("Cannot connect Honyaku Server") );
+     return;
+  }
+  if( !(user = getenv("HONYAKUUSER")) )
+    user = getenv("LOGNAME");
+  fprintf(stderr,"Honyaku User[%s]\n",user);
+  serv.in  = fdopen(fdd,"wb");
+  serv.out = fdopen(fdd,"rb");
+  if( eg_init(&serv,ej_je,user) )
+  {
+     KMessageBox::sorry( this, i18n("Honyaku init error") );
+     fclose(serv.in); fclose(serv.out);
+#ifdef HONYAKU
+     ::close(fdd);
+#else
+     close(fdd);
+#endif
+     return;
+  }
+  if( dir_trans )
+  {
+     i=eg_setmode(&serv,Ej,(char *)"DKW");
+  }
+  else
+  {
+     i=eg_setmode(&serv,Je,(char *)"10110:I:it");
+  }
+  if( i )
+  {
+     KMessageBox::sorry( this, i18n("Honyaku setmode error") );
+     eg_end(&serv,ej_je);
+     fclose(serv.in);fclose(serv.out);
+#ifdef HONYAKU
+     ::close(fdd);
+#else
+     close(fdd);
+#endif
+      return;
+  }
+  if( eg_setdictname(&serv,ej_je,user) )
+  {
+     KMessageBox::sorry( this, i18n("Honyaku setdict error") );
+     eg_end(&serv,ej_je);
+     fclose(serv.in);fclose(serv.out);
+#ifdef HONYAKU
+     ::close(fdd);
+#else
+     close(fdd);
+#endif
+     return;
+  }
+  if( dir_trans )
+  {  // Only E to J
+     if( eg_clear_cache(&serv,Ej) )
+     {
+        KMessageBox::sorry( this, i18n("Honyaku clear cache error") );
+        eg_end(&serv,Ej);
+        fclose(serv.in);fclose(serv.out);
+#ifdef HONYAKU
+        ::close(fdd);
+#else
+        close(fdd);
+#endif
+        return;
+     }
+  }
+  if( eg_set_timeout(&serv,ej_je,60,60) )
+  {
+     KMessageBox::sorry( this, i18n("Honyaku time out error") );
+     eg_end(&serv,ej_je);
+     fclose(serv.in);fclose(serv.out);
+#ifdef HONYAKU
+     ::close(fdd);
+#else
+     close(fdd);
+#endif
+     return;
+  }
+  if( Honyaku_trans(&serv,ej_je,&tc,(char *)ttext.local8Bit().data()) )
+  {
+     KMessageBox::sorry( this, i18n("Honyaku error") );
+     honyaku_end(&tc);
+     eg_end(&serv,ej_je);
+     fclose(serv.in);fclose(serv.out);
+#ifdef HONYAKU
+     ::close(fdd);
+#else
+     close(fdd);
+#endif
+     return;
+  }
+
+  show_honyaku(&tc);
+
+  for( i =0 ; i < tc.linecnt ; ++i )
+  {
+     if( dir_trans )
+        temp = "[E] ";
+     else
+        temp = "[J] ";
+     temp += QString::fromLocal8Bit(tc.ib[i]) ;
+     edt->insertLine(temp);
+     if( dir_trans )
+        temp = "[J] ";
+     else
+        temp = "[E] ";
+     temp += QString::fromLocal8Bit(tc.ob[i]+2) + "\n";
+     edt->insertLine(temp);
+  }
+
+  honyaku_end(&tc);
+  eg_end(&serv,ej_je);
+  fclose(serv.in);fclose(serv.out);
+#ifdef HONYAKU
+     ::close(fdd);
+#else
+     close(fdd);
+#endif
+
+  edt->resize(KApplication::desktop()->width()/2,
+              2*KApplication::desktop()->height()/3);
+//  At Begininng
+//  edt->setCursorPosition(0, 0);
+//  At Ending
+  edt->setCursorPosition(edt->numLines(),0);
+  edt->show();
+}
+// Translate from English to Japanese for using Honyaku-tamashii.
+void KMMainWin::slotTransMsgEj()
+{
+   TransMsg(1);
+}
+// Translate from Japanese to English for using Honyaku-tamashii.
+void KMMainWin::slotTransMsgJe()
+{
+   TransMsg(0);
+}
+#endif
diff -urN kdenetwork-2.2.1.orig/kmail/kmmainwin.cpp kdenetwork-2.2.1/kmail/kmmainwin.cpp
--- kdenetwork-2.2.1.orig/kmail/kmmainwin.cpp	Sat Sep 22 19:17:06 2001
+++ kdenetwork-2.2.1/kmail/kmmainwin.cpp	Sat Sep 22 19:18:31 2001
@@ -1559,6 +1559,19 @@
   mMsgView->slotUrlOpen( mUrlCurrent, KParts::URLArgs() );
 }
 
+#ifdef HONYAKU
+#include "honyaku1.cpp"
+#else // dummy
+void KMMainWin::slotTransMsgEj()
+{
+}
+void KMMainWin::slotTransMsgJe()
+{
+}
+void KMMainWin::TransMsg(int dir_trans)
+{
+}
+#endif
 
 //-----------------------------------------------------------------------------
 void KMMainWin::slotMsgPopup(const KURL &aUrl, const QPoint& aPoint)
@@ -1632,6 +1645,36 @@
            saveAsAction->plug(menu);
            menu->insertSeparator();
            deleteAction->plug(menu);
+#ifdef HONYAKU
+  int fd;
+  if( (fd = OpenHonyakuServer()) )
+  {
+     char *user; Uchar *ej_je = Ej; HServ serv;
+     if( !(user = getenv("HONYAKUUSER")) )
+       user = getenv("LOGNAME");
+     fprintf(stderr,"Honyaku User[%s]\n",user);
+     serv.in  = fdopen(fd,"wb");
+     serv.out = fdopen(fd,"rb");
+     if( eg_init(&serv,ej_je,user) )
+     {
+        KMessageBox::sorry( this, i18n("Honyaku init error") );
+        fclose(serv.in); fclose(serv.out);
+        ::close(fd);
+        return;
+     }
+     eg_end(&serv,ej_je);
+     fclose(serv.in);fclose(serv.out);
+     ::close(fd);
+
+    menu->insertSeparator();
+    menu->insertItem(i18n("Translate E to J"), this,
+                     SLOT(slotTransMsgEj()));
+#if 0
+    menu->insertItem(i18n("Translate J to E"), this,
+                     SLOT(slotTransMsgJe()));
+#endif
+  }
+#endif
            menu->popup(aPoint, 0);
       }
   }
diff -urN kdenetwork-2.2.1.orig/kmail/kmmainwin.h kdenetwork-2.2.1/kmail/kmmainwin.h
--- kdenetwork-2.2.1.orig/kmail/kmmainwin.h	Sat Sep 22 19:17:06 2001
+++ kdenetwork-2.2.1/kmail/kmmainwin.h	Sat Sep 22 19:18:31 2001
@@ -201,6 +201,11 @@
   /** Open URL in mUrlCurrent using Kfm. */
   void slotUrlOpen();
 
+  /** Translation from English to Japanese for using Honyaku-tamashii */
+  void slotTransMsgEj();
+  void slotTransMsgJe();
+  void TransMsg(int dir_trans);
+
   /** Copy URL in mUrlCurrent to clipboard. Removes "mailto:" at
       beginning of URL before copying. */
   void slotUrlCopy();
