(特にDebianとは限らないが)i18nについて世界のdeveloperに
たいして言わなければいけない時に忘れてはいけないポイント
http://kmuto.jp/d/?date=20040406#c01 より
ポイント
- メニューやメッセージの翻訳よりもずっと重要なことが
ある。たとえば、メニューやメッセージが自国語で表示
されるけれども自国語の文章を扱えないワープロと、
メニューやメッセージは英語で表示されるけれども
自国語の文章を扱えるワープロだったら、どっちのほうが
*まし*か。
- 翻訳には gettext などの枠組みがあるので、技術的には
難しいことはなく、あとは人海戦術の問題だが、「自国語
の文章を扱えるワープロ」を実現するには「これさえ
やればいい」という枠組みは存在せず、ケースバイケース。
それを紹介する。
- 方針としては、世の中にはどんなエンコーディングや
言語があるかをあるていど知っておき、それと矛盾する
ようなコーディングをしない。
- 言語の種類:
- CJK (キーボードよりはるかに多数の文字を使う、全角文字を使う)。
- 日本語、中国語 (単語のあいだに空白を使わない)。
- アラビア語、ヘブライ語 (bidi)
- タイ語 etc (結合文字)
- インド諸語 etc (もっと複雑な処理が必要)
- エンコーディングの種類
- いろいろあるけど、Linux では GNU Libc が内部コード
として UCS-4 を採用しているので、ぜんぶ Unicode
に変換してしまってから内部処理すればよいので
とくに知る必要はない。
- gettext message catalogは Content-Type に正しくcharsetを指定しておけば
gettext(3)がlocaleの情報に応じてencodingを変換してくれる。
- 以上の言語とエンコーディングに関する知識に基づき、
実際のコーディングを考える。
たとえば:
- ロケールに従った動作をする。そうしないのはバグ。
- I/Oには `locale charmap` (nl_langinfo(CODESET)) で
示されるエンコーディングを使うこと。
(ロケールに従う、というのと同じこと)。
- cursesを使う場合はncurses5ではなくncursesw5を使うべき。
- X上のソフトウェアであれば、国際化された
ツールキットを使う。Gtk+ や Qt は OK。ターミナル
上のソフトウェアであれば、文字表示はターミナルに
おまかせでよい。が、ncurses よりも ncursesw を
使う。
- Xでは、一部の言語しかカバーしないようなフォントを
デフォルトに指定しない。
- 文字数、バイト数、カラム数を区別すること。
たとえば strlen() はバイト数は分かるけど文字数は
分からない。カラム数を求めるには wcwidth() や
wcswidth() を使う。
- 文字列処理は、何らかの内部コードに変換してから行うのがよい。
内部コードは何でも良いが、iconv() を使って Unicode に変換するか、
または、mbstowcs() を使って「ワイド文字」に変換するのが良い。
- キーボードから自国語が入力できることは必須である。
ターミナル上のソフトウェアなら、ターミナルが
入力機能を提供してくれると期待してよい。X上なら、
Gtk+2などのモダンなツールキットならツールキット側が
面倒を見てくれるがそうでない場合は厄介。
- エディタ等のアプリケーションでは、可能であれば、入出力ファイルのencodingを指定できるようにするべきである。
- gettextする場合でもどの文字列をどのタイミングでgettextすべきかを考えるべき。そもそも翻訳すべきでない文字列もたくさんある。
- 現在gettextしてようとしまいと,ソースに書いてある文字のencodingには,latin-1などを利用することは好ましくない.(例 latin-1で「°C」とか)
- LC_CTYPEなど特定のlocale設定を変更するのはトラブルの元である。
- ユーザのlocale設定に影響されては困る場合(shell scriptとか)、LC_ALL=C でユーザのlocale設定をオーバーライドすればよい。textutil系やgrep,sed,awkなどもlocale依存する振舞いがあるので目的を考えてどのlocaleで動かすべきか考えること。
- 文字の順序はよく考えること。US-ASCIIとUTF-8ではUS-ASCIIの範囲内でもwcscoll()での文字の順序は違う。正規表現でのcharacter rangeとかにも注意。
- i18n, m17n, l10nってどうやったら綺麗に説明できるだろう?
各論 (application, domain specific)
- XML
- XML(特にコンフィグレーション等)をファイルに書き出すときにencodingをISO-8859-1にせずutf-8を利用すること。できればencodingを指定できれば望ましい。
最終更新 : 2004/10/13 15:15:33 JST