English page

ウィンドウマネージャーの国際化


タイトルやアイコン名などに日本語などが使えるように、 さまざまなウィンドウマネージャーに改良を加えています。

方針

まず、大きな方針が以下のふたつです。まず第一に、 成果は正式版に提供する、ということです。 正式版とは別の日本語版を作ることは、しません。 第二の方針が、ユーザーが必要とするのはロケールの設定のみにする、 ということです。個別の設定を必要とするような設計は、しません。 以下で、その方針について説明します。

方針1: 正式版への提供

まず、前者について。 正式版とは別の「日本語パッチ」や「日本語版」 を作るという方針で行われた作業やその成果が、 多数あります。この方法の利点として、

といったことが挙げられます。しかし、この方法だと、 といった欠点が生じます。

私は、「日本語版」をこれから先ずっとメンテナンスして「正式版」 を追いかけていくだけの時間が将来にわたって確保できるという 自信がないですし、また、世界のフリーソフトウェア開発者たちの間で 国際化の問題が広く認知されるようになるべきだと思うので、 私の作業の成果はすべて「正式版」の開発者に送るという方針をとる ことにしました。

さて、「正式版」に取り込んでもらうためには、 ある程度以上の品質が必要となります。

まず、日本語のために、他の言語を犠牲にしてはなりません。 私の作業の大部分は、X11 の関数のうち、XFontStruct 関連のもの [例: XLoadQueryFont(), XDrawString()] を、XFontSet 関連のもの [例: XCreateFontSet(), XmbDrawString()] で置き換えるという作業で占められています。しかし、XFontSet 関連関数は、OS (あるいは X Window System) がロケール機能を持ち、 ユーザーが LC_CTYPE ロケールを正しく設定している、 ということを前提にしています。ロケールが設定されていないとき、 つまり、デフォルトの動作は (たいていの場合) ASCII となります。 8 ビットの文字コードを使用している人々の多くは、 ロケールを正しく設定せずに使っていますし、 ロケールということを知らない人すらたくさんいます。 ウィンドウマネージャーの開発者でさえ、 XFontSet 関連の関数はマルチバイト言語専用であり、 8 ビットクリーンでない、と考えている人がいます。

そこで、OS や X Window System がロケール機能を持たない場合にも コンパイルできるようにしました。また、 ロケール機能ありでコンパイルする場合でも、 ユーザーがロケールを設定していないときは XFontStruct 関連関数を使うようにしました。 「ロケールの設定をしないユーザーのほうが悪いんだ」 という考えかたもできますし、むしろそっちのほうが正論かもしれません。 しかし、受け入れられなければ元も子もありません。 というわけで、ここは譲歩しました。

また、なにかにつけてついて回るのが、「英語」です。 正式版の開発者との議論も英語、ドキュメントを書くのも英語 (日本語ドキュメントを用意してもいいですが、英語ドキュメントは必須です)、 ソース中に書き込むコメントも英語。それに、 日本語ローマ字表記の変数名も使ってはいけません。 これについては、飛び込んだら何とかなるものです。

方針2: 個別設定を必要としない

本屋に行って、Free UNIX のコーナーに行ってみましょう。 そうすると、日本語環境の構築に関する本がいくつか並んでいます。 しかし、私の意見では、 そんな本が必要であるという状況は間違った状況であり、 改善されなければなりません。

このような状況はなぜ生じているのでしょうか。それは、 日本語環境を構築するにはいろんな設定を行う必要があるからです。 1 箇所で済むのなら、本など必要ありません。では、 なぜいろんな設定が必要となるのでしょうか。その一因は、 個別のソフトウェアごとに日本語にまつわる設定をしなければ ならないことにあります。

理想的には、どこか 1 箇所で「日本語」と指定すれば、全ての ソフトウェアが日本語が正しく扱えるような状態になるべきです。

ウィンドウマネージャーに関していえば、XFontSet モードの指定と、フォントの指定がこれに該当します。 XFontSet モード (←→ XFontStruct モード) の指定は、 すでに説明したとおり、ロケールの設定が正しくなされていれば XFontSet モードにする、という方針にしました。 ロケールの先頭2文字が ja、ko、zh のどれかなら XFontSet モードにする、という方針も考えられます (実際、 私が手を加える以前の Sawfish がそうでした)。しかし、 将来広く使われるであろう UTF-8 もマルチバイトなので、 XFontSet モードが必要になります。それに、 ロケール名称から判断する方法は一般性に欠けます。

フォントの指定方法が曲者です。 ウィンドウマネージャーの重要な目的のひとつに、 画面を美しく飾りつける、ということがあります。従って、 フォントが選択できるというのは重要なことです。しかし、 ウィンドウマネージャーのデフォルト設定として世界中の 言語のためのフォントを列挙して指定するのは現実的ではありません。それに、 「テーマ」をサポートするウィンドウマネージャーが多数ありますが、 世界中の「テーマ」作者がこのような問題について熟知している、 といった状態が将来やってくるということはちょっとありえなさそうです。

そこで、英語 (latin-1) フォントだけが指定されている状況でも、 現在のロケールで必要とされるフォントが全て利用できるようにする、 という方向で解決策を考えるべきです。

しかし、指定したスタイルの英語 (latin-1) フォントに対応する日本語フォントは存在しない場合があります。 というか、まず存在しません。しかし、似たスタイルのフォントがない からといって表示しないというのは本末転倒なので、 とにかく表示したい内容が表示されるようにしなければなりません。

私がとった方法は、2 種類あります。まず単純な方法は、 XCreateFontSet() に与えるフォント名の最後に「,*」 を加えるというものです。この方法だと、デザインについては 全く無視されますが、何らかのフォントがインストールされていれば、 とりあえず正しく表示できます。もうひとつは、 指定したフォントにできるだけ近いフォントを探すというものです。 ただし、そのアルゴリズムをどう設計するかというのが難問で、 どう味付けするか、問題です。これは、開発者の腕の見せどころ、 というよりは、開発者の主観の問題になってしまいます。

IceWM

私が手を加えたとき、すでに IceWM は XFontSet を使った国際化機能を持っていました。しかし、これを有効にするには、 設定ファイル中で MultiByte というオプションを ON にする必要がありました。 (一時期、デフォルトが MultiByte ON のときがありました)。

私は、MultiByte オプションが不要になるようにしました。 また、フォント指定文字列の最後に「,*」を追加するようにしました。

その後、指定したフォントにできるだけ近いフォントを探す関数を 作ったのですが、これはまだ取り入れられていません。

Sawfish

Sawfish も、XFontSet を使った国際化機能を持っていました。 これは、ロケール文字列の先頭2文字が ja、ko、zh のいずれかなら FontSet モードが有効になるように作られていました。

Sawfish の開発者は国際化について深く考えてくれていて、 私がロケールが正しく設定されていれば XFontSet モードが有効になるようにすべきだ、 と言ってパッチを送った際、いろいろとテストしてくれて、 おかげで XFontSet 判別法をかなり改良することができました。 つまり、

というものです。

Sawfish には、似たフォントを探すアルゴリズムが取り入れられています。

TWM

TWM は XFree86 の配布物の一部であり、 なにかと模範とされる立場にあるので、 それが国際化していないというのは、非常にまずいことだと考えました。

TWM は、XFree86 の一部ですので、XFontSet が使えない (コンパイルできない) という状況は考える必要がありません。 しかし、XFontSet モードと XFontStruct モードの区別はあります。 TWM はシンプルであるべきだと思ったので、 似たフォントを探すアルゴリズムはあえて導入しませんでした。 また、設定ファイル読み込みルーチンが 8 ビットクリーンでなかったので、 それも改良しました。

XFree86 4.0.2 から、私のパッチが採用される予定です。

CTWM

CTWM は、すでに XFontSet を使った国際化がなされていました。 しかし、XFontSet を使うか XFontStruct を使うかは、 コンパイル時に決まってしまいます。

そこで、まず、XCreateFontSet() の引数に「,*」を追加するパッチを送り、 それは次バージョンで導入するという返事をもらいました。 その後、XFontSet と XFontStruct を実行時に自動で切り替えられるようにしたパッチを送りましが、 こちらについてはまだ返事をもらっていません。

Blackbox

これは、私がいじりだした時には XFontSet を使った国際化がなされていませんでした。そこで、 My Linux 日本語化計画を参考に XFontSet ラッパーを作り、 それを開発者に送ったところ、 ちょうど同時進行で国際化が進んでいたところでした。 ただし、XFontSet モードの自動選択は、 私のアイディアが採用されました。

Blackbox は見た目の美しさが重要っぽいので、 似たフォントを探すアルゴリズムを取り込んでもらいました。

Window Maker

これは、いろいろと難しそうです。 というのは、ウィンドウマネージャー本体とヴィジェットとが分離されて いるからです。XFontSet モードの判断はどこで行うべきか、とか、 両者の連携も考えないといけないです。 それから、1 バイト = 1 文字との仮定に基いて文字列操作を行っている 部分が何か所かあります。


Tomohiro KUBOTA <debian at tmail dot plala dot or dot jp>