All rights reserved. Copyright (C) 2001 by NARITA Tomio.


XmI18N

Supplementary stuff to Internationalize Motif Applications

The latest version: xmi18n-0.0 (2001/06/13)


What is XmI18N?

xmi18nライブラリをMotifアプリケーションにダイナミック・リンクすることによって, 特別な前処理をすること無しに自動的にMotifアプリケーションを日本語化することが可能です(国際化を目指していますが, 発展途上です).

xmi18nの国際化機能はOSのロケールには依存しません. X11とMotifの国際化機能の補助的な役割を果します. (X11R6.4 ならばロケールなしでも動作します. X11R6.3 の場合, FreeBSD 2.x で環境変数LANGを設定する必要がありました)

xmi18nの国際化はダイナミックリンクによるフックを基本としています. まず libc のlocale関連の関数群 (multi-byte, wide-char 変換) をフックし, X11 の Xmb, Xwcレイヤをフック, さらに XtAppInitialize(), XtManageChild()のフックを通じて Fontの設定やXmText, XmTextFieldウィジットのconversion, translationのフックなどを行ないます. XtCreateManagedWidget()などの, XtManageChild()を呼ぶ関数は全てフックされます. (残念ながらXtAppInitialize()で初期化しないプログラムは自動的には国際化されません. それでもxmi18nの初期化ルーチンさえ呼べば, 国際化は可能です).

xmi18nのlocale関連関数はMotifのバグを吸収するだけでなく, Netscapeのバグもある程度吸収することができます. ただしxmi18nだけではNetscapeを完全に日本語化することはできません.

Input Method はデフォルトで kinput2 が使用されますが, Xリソースを設定することにより skkinput も使用できます. なお, skkinput 2.03 には変更が必要です. (Open Motif 2.1.30 + X11R6.4 + NetBSD 1.5, FreeBSD 2.2.8 で確認)

このxmi18nライブラリはアルファテスト版です.


License


Resources


Using kinput2

kinput2-v3以降が必要です. xmi18nライブラリのデフォルトのIMはkinput2です.

Motifアプリケーションをロケールなしで使用する場合, kinput2側のXリソースでデフォルトのCロケールを受けつけられるように設定する必要があります.

	kinput2*locales: C, ja_JP.SJIS, ja_JP.EUC, ja_JP, japanese, japan, ja

Using skkinput

Motifアプリケーションをロケールなしで使用する場合, skkinput側のXリソースでデフォルトのCロケールを受けつけられるように設定する必要があります.
	Skkinput*xim.supportedLocales: C,ja_JP.SJIS,ja_JP.EUC,ja_JP,ja_JP.ujis,japanese,japan,ja,ja_JP.eucJP
	(※スペースを空けないこと)

skkinput と Motif の相性が悪いため, skkinput 2.03を使用するには以下の変更が必要です.
(diffファイル skkinput-2.03.diff)

◎修正: [状況によってskkinputが動作しない問題の対処]
	{MotifがXNClientWindowをattributeに混ぜて送る場合がある}

	imattr.c:
	static ICAttribute icAttributes[] = {
	の中程を修正 (OP_Sを追加)

		  { XNClientWindow, TYPE_WINDOW, OP_C|OP_S|OP_G,
		    setClientWindow, getClientWindow },

◎追加: [inputMethodを指定するとXサーバがCreateWindowや
	ChangeWindowAttributesでBadValueのエラーを吐く問題の対処]
	{MotifがXNFilterEventsをgetしてきた時に答えないとスタック上にある
	不定値の「イベント」をAddEventHandler()してしまう場合がある}

	imattr.c:
	前の方に宣言を追加:

		static int getFilterEvents _Pt_((IMIC *, unsigned int, int, int, char *, int));

	static ICAttribute icAttributes[] = {
	の中程に追加

		  { XNFilterEvents, TYPE_CARD32, OP_G,
		    NULL, getFilterEvents },

	下の方に追加

	/* ARGSUSED */
	static int
	getFilterEvents(icp, id, nest, offset, data, len)
	IMIC *icp;
	unsigned int id;
	int nest;
	int offset;
	char *data;
	int len;
	{
	    IMConnection *conn = icp->im->connection;
	
	    /* We need only Key events */
	    IMPutC16(conn, id);         /* attribute ID */
	    IMPutC16(conn, 4);          /* value length */
	    IMPutC32(conn, KeyPressMask | KeyReleaseMask);
	    return 0;
	}
	
	※ kinput2 にある関数を cut & paste しました.

◎削除:[text上にskkinputの変換窓を残したままでウィンドウを閉じると
	segmentation faultを起す問題の対処]
	{これはまだ原因を追いかけてませんが, これで回避できています}

	imconv.c:
	213行目をコメントアウト:

	  if( icp->state & IC_CONVERTING ){
	#if 0
	    setEventMask( conn, icp->im->id, icp->id, 0L, 0L ) ; 
	#endif
	    detachConverter( icp ) ;

	492行目をコメントアウト:

	    /* Connection が切れたということを教えないといけない。*/
	#if 0
	    setEventMask( conn, icp->im->id, icp->id, 0L, 0L ) ;
	#endif

Japanized Netscape with XmI18N

まずxmi18nは, Open MotifでないMotifをstatic linkするNetscapeを単体で完全に日本語化することはできません. 起動時にX11の日本語ロケールを環境変数LANGに設定してください. しかし, xmi18nは日本語化に伴なうNetscapeのバグを吸収することができるため, 動作の安定した日本語化を行なうことができます.
Script:
	#! /bin/sh
	LANG=ja_JP.EUC;export LANG
	LD_PRELOAD=/usr/local/lib/libxmi18n.so.0.0;export LD_PRELOAD
	exec netscape 2> /dev/null

Netscape Resources:
	Netscape*inputMethod:      	skkinput

	Netscape*useStderrDialog:	False
	Netscape*useStdoutDialog:	False

	Netscape*nsMotifFSBCdeMode:	True

	Netscape*browserGlobalTranslations: #override \n\
		Ctrl g:	xfeDoCommand(stopLoading) \n\
		Ctrl n:	LineDown() \n\
		Ctrl p:	LineUp() \n\
		Ctrl j:	LineDown() \n\
		Ctrl k:	LineUp() \n\
		Ctrl f:	PageDown() \n\
		Ctrl b:	PageUp() \n\
		Ctrl s:	xfeDoCommand(findInObject) \n\
		Ctrl r:	xfeDoCommand(findInObject) \n\
		Ctrl /:	xfeDoCommand(findInObject) \n\

	Netscape*XmLGrid*fontList:\
		-adobe-helvetica-medium-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:,\
		-adobe-helvetica-bold-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:=BOLD,\
		-adobe-times-medium-i-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:=ITALIC

	Netscape*tipLabel.fontList: \
		-adobe-helvetica-medium-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:

	Netscape*bookmarkProps*XmTextField.fontList: \
		-adobe-helvetica-medium-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:

	Netscape*subjectFormW*XmTextField.fontList: \
		-adobe-helvetica-medium-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:

	Netscape*back*fontList: \
		-adobe-helvetica-medium-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:

What is Motif Proxy?

アーカイブに含まれるmotifproxy.cは, HTMLの<INPUT>タグおよび<TEXTAREA>タグで表示される入力エリアの幅を調節するためのWebプロキシーです.

UNIX版のNetscapeでは, <INPUT>タグおよび<TEXTAREA>タグで表示される入力エリアは, MotifのXmTextFieldおよびXmText widgetを使用して表示されますが, 国際化が行なわれている場合, これらのwidgetの幅は使用中のフォントの最大サイズを基準にして指定された桁数の幅が表示されます. このため日本語化を行なった場合には, htmlで指定された桁数の二倍の横幅を持つテキスト欄が表示されてしまいます.

motifproxy.cは, WebプロキシーとなってHTTPの通信を横取りし, HTMLの内部を解析して<INPUT>タグおよび<TEXTAREA>タグの横幅を半分にします. また, 半分にした影響でテキストに勝手に改行が入らないように <TEXTAREA>タグ内のwrap=hard属性を削除します.

使用方法は, まず ``make motifproxy'' を実行して motifproxy を作り, これを自分のマシンで(background processとして)実行します. 次にNetscapeのPreferenceからProxyの設定を行ないます. Manual proxy configurationを選択して, ``HTTP Proxy''の欄に自分のマシン名とPort欄に``8192''と指定して下さい. (Portは自由に変更して構いません. motifproxy.cに埋め込んであります.)

motifproxy.cは,まだ未完成のプログラムです. かなりいい加減な実装をしています. まだdaemonにしていません(backgroundで実行して下さい). 横取りしたHTMLを部分的にしかパースしません. そのため, 誤って目的外の部分を書き替えてしまう可能性があります. 大きなファイルをuploadすると遅いです.


Japanized Mwm with XmI18N

Mwmは XtToolkitInitialize() でXtを初期化するので, xmi18nをリンクしても自動的には国際化されません.

そこでWmInitWs.cでXtAppCreateShell()したシェルに対して, 明示的にxm_i18n_initを呼べばXmI18Nの国際化が可能です:
xm_i18n_init( wmGD.topLevelW );

この場合も環境変数LANGに日本語ロケールを指定してmwmを起動してください. これでNetscapeのタイトルなど日本語を含むタイトルが日本語で表示されます.

    ◎ Xリソース:
	Mwm*client*title*fontList:	\
		-adobe-helvetica-bold-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:
	Mwm*icon*fontList:		\
		-adobe-helvetica-medium-r-normal--12-*-iso8859-1;\
		-*-fixed-medium-r-normal--12-*-jisx0208.1983-0;\
		-*-fixed-medium-r-normal--12-*-jisx0201.1976-0;\
		-*-fixed-medium-r-normal--12-*-jisx0212.1990-0:

    ◎ .xinitrc の中などから起動:
	env LANG=ja_JP.EUC mwm &

Related Links


Back to NRT Homepage NARITA Tomio
email: nrt@web.ad.jp
Homepage: http://www.ff.iij4u.or.jp/~nrt/