Chapter 2. コラム

日本語で動かないソフトウエアをゴニョゴニョする

使いたいソフトウエアが日本語で動かない場合に、私が場当たり的に試す方法を御紹介します [1]。 以下の方法は本当に場当たり的なもので、本来必要な漢字コード変換などが含まれていないため、実用的には利用できません。 あくまで参考にとどめ、利用は自分のリスクで行って下さい。 本気で動かそうという興味のある方は,japanese/{epic4,ircII,slirc,xchat}で利用されているパッチを参照して下さい。

Tcl/Tkの場合

実行ファイルがスクリプトの場合とバイナリの場合で、以下のように違う対応をする必要が有ります。

スクリプトファイルの場合

とりあえず、そのportsをインストールしてしまいます(make install)。 which コマンド名等として実行ファイルを探します。 実行ファイルがTcl/Tkのスクリプトファイルの場合、先頭を眺めて

#!/usr/local/bin/wish8.2
	    
exec wish8.2
	    
などとなっている所を
#!/usr/local/bin/wish8.0jp
	    
exec wish8.0jp
	    
などのようにjapanese/tk80wishに置き換えます。 Tk8.2で新たに加わった機能を使っていない場合、これで日本語の入力も表示も可能になります。

Zirconはこの方法で日本語での利用が可能ですが、インストーラでwishを指定できるのでこちらを使う方が楽でしょう。 tkircは残念ながら8.0より後で導入された機能を利用しているため、この方法ではうまく動きません。

バイナリの場合

実行ファイルがバイナリの場合、C言語などからTkなどの関数を利用していますので、リンクするライブラリなどを変更する必要があります。 私はportsをmakeしてしまった後でports/category/foo/work/foo.../に移動し、Makefileを更新する方法をとっています。 Makefileの中のtk82などとなっている部分をtk80jpに、tcl82などとなっている部分をtcl80jpに変更します。 更に、include関係も修正が必要なため、tk8.2,tcl8.2をそれぞれtk8.0jp,tcl8.0jpなどと変更します [2]

具体例としてirc/quircをやってみます。 ディレクトリirc/quirc/work/quirc-0.9.79/Makefileで以上の置き換えを行った結果がFigure 2-1です。 今回の場合、tcltk.hの中のincludeファイル名の書き直しも必要でした。

この作業で日本語の入力と他のサーバへの転送はうまく行くのですが、他のサーバからの日本語混じりの通信は全く表示されません。 これは、本文で書いたようにJISで流すことになっているメッセージが、クライアント側ではEUCで表示する必要があるためで、漢字コード変換を実装してあげる必要があります。

Figure 2-1. quircの無理矢理日本語化作業

(a)Makefileの変更
--- Makefile.org	Tue Dec 26 00:13:44 2000
+++ Makefile	Tue Dec 26 00:14:49 2000
@@ -61,14 +61,14 @@
 POST_UNINSTALL = :
 CC = cc
 CXX = c++
-LDFLAGS = -L/usr/local/lib/tk8.2 -L/usr/local/lib/tcl8.2  -L/usr/local/lib -L. -L.. -L/usr/home/take60/lib
+LDFLAGS = -L/usr/local/lib/tk8.0jp -L/usr/local/lib/tcl8.0jp  -L/usr/local/lib -L. -L.. -L/usr/home/take60/lib
 MAKEINFO = makeinfo
 PACKAGE = quirc
 RPMREL = 1
-TCL_HEADER = tcl8.2/tcl.h
-TK_HEADER = tk8.2/tk.h
+TCL_HEADER = tcl8.0jp/tcl.h
+TK_HEADER = tk8.0jp/tk.h
 VERSION = 0.9.79
-WISH = /usr/local/bin/wish8.2
+WISH = /usr/local/bin/wish8.0jp
 
 SUBDIRS = data
 
@@ -120,8 +120,8 @@
 
 
 DEFS = -DHAVE_CONFIG_H -I. -I$(srcdir) -I.
-CPPFLAGS = -I/usr/local/include/tk8.2 -I/usr/local/include/tcl8.2  -I/usr/local/include
-LIBS = -ltk82 -ltcl82 -lX11 -lm   -lSM -lICE  -L/usr/X11R6/lib 
+CPPFLAGS = -I/usr/local/include/tk8.0jp -I/usr/local/include/tcl8.0jp  -I/usr/local/include
+LIBS = -ltk80jp -ltcl80jp -lX11 -lm   -lSM -lICE  -L/usr/X11R6/lib 
 X_CFLAGS =  -I/usr/X11R6/include
 X_LIBS =  -L/usr/X11R6/lib
 X_EXTRA_LIBS = 

 (b)tcltk.hの変更
--- tcltk.h.org	Tue Dec 26 00:18:26 2000
+++ tcltk.h	Tue Dec 26 00:15:21 2000
@@ -3,8 +3,8 @@
 #ifndef HEADER_TCLTK
 #define HEADER_TCLTK
 
-#include "tcl8.2/tcl.h"
-#include "tk8.2/tk.h"
+#include "tcl8.0jp/tcl.h"
+#include "tk8.0jp/tk.h"
 
 extern Tcl_Interp* TT_Interp;
 extern char *TT_Temp;
	    

Gtkの場合

Gtkの場合、GICQ の日本語化を参考にすると以下のようなステップが必要になります。

  1. gtk_init()関数の前に、gtk_set_locale()を呼び出す。 これでLANGなどの環境変数を適切に設定することで漢字の変換と入力は可能になります。

  2. 表示フォントの設定のためにgtk_rc_parse()を挿入する。

  3. フォントを内部で読み込んでいる場合、gtk_font_load()gtk_fontset_load()に置き換える。 更に日本語フォントを指定してあげる。

ここでは、irc/olircを例に取ります。 変更はFigure 2-2のとおりです。 main.cでは1,2を行っています。 ここでは、設定ファイルrcは簡単のためハードコーディングしています。 windows.cへの変更は、画面表示部分でフォントの変更を行わせないようにしています。 この変更で通信結果などを表示するウインドウでは日本語の表示がされますが、メッセージやコマンド入力用のところではまだ表示されません。 また、他のクライアントからの日本語は化けて表示される状態であり、ここでも漢字変換の実装が必要になります。

Figure 2-2. olircのirc/olirc/work/olirc-0.0.37/src/中のファイルへの変更

(a)main.cへのdiff
--- main.c.org	Mon Dec 25 22:09:23 2000
+++ main.c	Tue Dec 26 00:52:38 2000
@@ -86,6 +86,11 @@
--- main.c.org	Mon Dec 25 22:09:23 2000
+++ main.c	Tue Dec 26 00:52:38 2000
@@ -86,6 +86,11 @@
 		#endif
 	}
 
+	/* Locale setting */
+
+	gtk_set_locale();
+	gtk_rc_parse("/usr/home/take60/.olirc/gtkrc");
+
 	/* Gtk initialization */
 
 	gtk_init(&argc, &argv);

(b)windows.cへのdiff
--- windows.c.org	Tue Dec 26 00:58:46 2000
+++ windows.c	Tue Dec 26 01:10:34 2000
@@ -878,6 +878,7 @@
 
 void VW_load_fonts(Virtual_Window *vw)
 {
+	return;
 	if (!vw) return;
 	vw->font_entry = gdk_font_load(prefs_get_gchar(PT_FONT_ENTRY, &(vw->pmask)));
 	vw->font_normal = gdk_font_load(prefs_get_gchar(PT_FONT_NORMAL, &(vw->pmask)));

(c)/usr/home/take60/.olirc/gtkrcへ追加
style "default"
{
    fontset = "-adobe-helvetica-medium-r-normal--*-140-*-*-*-*-*-*,-misc-fixed-medium-r-normal--14-130-*-*-*-*-*"
}
	  

もう一つ、こちらはほとんどうまくいってませんがyagIRCの場合です。 yagIRCでは、irc/yagirc/work/yagirc-0.66.1/src/gui.c中でフォントがハードコーディングされています。 これを変更したのがFigure 2-3です。 ここではnormalフォントへの変更しか行っていませんが、他のフォントも同じように変更可能です。 これでよそからのメッセージはちゃんと表示されますが、もともと挙動不審なのであまり使えるものにはなっていません。

Figure 2-3. yagIRCでのgui.cへの変更

--- gui.c.org	Tue Dec 26 08:43:13 2000
+++ gui.c	Tue Dec 26 08:43:29 2000
@@ -1496,7 +1496,7 @@
         gui_write_config();
     }
 
-    font_normal = gdk_font_load("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*");
+    font_normal = gdk_fontset_load("-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,-misc-fixed-medium-r-normal--14-130-*-*-*-*-*");
     font_bold = gdk_font_load("-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*");
     font_italic = gdk_font_load("-adobe-helvetica-medium-o-normal--*-120-*-*-*-*-*-*");
     font_bolditalic = gdk_font_load("-adobe-helvetica-bold-o-normal--*-120-*-*-*-*-*-*");
	  

Notes

[1]

誰か、こういうTipsをまとめて書いて下さらないでしょうかねぇ…

[2]

場合によってはconfigureのオプション指定をした方が早いです。