第8章 I18NとL10N

目次

8.1. キーボード入力
8.1.1. SCIMを使うインプットメソッドのサポート
8.1.2. 日本語の例
8.1.3. インプットメソッドを無効化
8.2. ディスプレー出力
8.3. ロケール
8.3.1. 符号化方式の基本
8.3.2. UTF-8ロケールを使う根拠
8.3.3. ロケールの再設定
8.3.4. "$LANG"環境変数の値
8.3.5. X Windowの下でのみ特定ロケール
8.3.6. ファイル名の符号化方式
8.3.7. 地域化されたメッセージと翻訳された文書
8.3.8. ロケールの効果

アプリケーションソフトの多言語化(M17N)とかネイティブ言語サポートは2段階で行います。

[ティップ] ティップ

M17N、I18N、L10Nに対応する英語のmultilingualization、internationalization、localizationの中の"m"と"n"、"i"と"n"、"l"と"n"の間には17、18、10の文字があります。

GNOMEやKDE等の現代的なソフトは多言語化されています。UTF-8データーを扱えるようにすることで国際化され、gettext(1)インフラで翻訳されたメッセージを提供することで地域化されています。翻訳されたメッセージは別の地域化パッケージとして供給されているかもしれません。該当する環境変数を適切なロケールに設定することだけで翻訳されたメッセージが選ばれます。

最も簡単なテキストデーターの表現法はASCIIです。これは英語では十分で(7ビットで表現できる)127文字以下しか使いません。国際化サポートのためにより多くの文字をサポートするために多くの文字の符号化(エンコーディング)システムが発明されています。現代的かつ賢明な符号化システムは、人類が知っている事実上全ての文字が扱えるUTF-8です(「符号化方式の基本」参照)。

詳細はIntroduction to i18nを参照下さい。

国際化ハードウエアーサポートは地域化した設定データーを使って実現されています。

8.1. キーボード入力

Debianシステムは多くのキーボード配列で機能するように設定できます。

表8.1 キーボード再設定方法のリスト

環境 コマンド
Linuxコンソール dpkg-reconfigure --priority=low console-data
X Window dpkg-reconfigure --priority=low xserver-xorg

こうすることでデッドキー機能付きで多くの欧州言語に関してアクセント付き文字のキーボード入力をサポートするようにします。アジア言語に関しては次に記すSCIMのようなより複雑なインプットメソッドが必要です。

8.1.1. SCIMを使うインプットメソッドのサポート

Debianシステムための多言語入力の設定は、im-switchパッケージとともにスマート共通インプットメソッド(SCIM)ファミリーのパッケージを使うことで簡素化されました。SCIMパッケージのリストは次です。

表8.2 SCIMを用いるインプットメソッドサポートのリスト

パッケージ ポプコン サイズ サポートされたロケール
scim-anthy * V:0.2, I:0.6 2996 日本語
scim-canna * V:0.07, I:0.3 376 , ,
scim-skk * V:0.05, I:0.2 1060 , ,
scim-prime * V:0.04, I:0.2 912 , ,
scim-tables-ja * I:0.5 380 , , (実用性無し)
scim-tables-zh * I:0.7 11676 中国語(zh_*用)
scim-pinyin * V:0.3, I:0.7 5324 , , (zh_CN用)
scim-chewing * V:0.13, I:0.4 264 , , (zh_TW用)
scim-hangul * V:0.04, I:0.08 288 韓国語
scim-tables-ko * I:0.08 472 , ,
scim-thai * V:0.01, I:0.04 140 タイ
scim-m17n * V:0.06, I:0.13 92 多言語: インド系言語、アラビア語、他
scim-tables-additional * I:0.17 336 , ,
scim-uim * V:0.06, I:0.2 140 , ,

kinput2法や他のロケール依存のアジアの古典的インプットメソッドはまだありますが、現代的なUTF-8のX環境下ではお勧めできません。現代的なUTF-8のX環境下でのインプットメソッドの代替アプローチとしては、非X環境下でも実行できるuimツールチェインがあります。

8.1.2. 日本語の例

日本語インプットメソッドを英語環境 ("en_US.UTF-8")下で起動すると非常に便利です。SCIMを使ってこの環境をどう実現したかを以下に記します。

  1. 日本語インプットツールパッケージのscim-anthyim-switch等の推奨(recommended)されたパッケージとともにインストールします。
  2. ユーザーのシェルから"im-switch -c"を実行して"scim"を選択します。
  3. ユーザーアカウントへの再ログイン
  4. "im-switch -l"として設定を確認します。
  5. GUIツールバーを右クリックしてインプットメソッドとモードを設定します。(インプットメソッドのメニュー選択肢を減らす事ができます)
  6. CTRL-SPACEによってSCIMインプットメソッドを起動します。
[注記] 注記

non-CJKかつnon-en_USのロケールの下でSCIMを起動するには、 "~/.scim/global"か"/etc/scim/global"ファイルにUTF-8中のそれらのロケールを次のように追加しなければいけません。

/SupportedUnicodeLocales = en_US.UTF-8,en_GB.UTF_8,fr_FR.UTF-8

以下に注意下さい。

  • im-switch(8)は実行されるのがrootからかどうかによって違った挙動をします。
  • im-switchによって起動されるインプットメソッドはロケールに依存します。
  • 新しい("$GTK_IM_MODULE"とか"$QT_IM_MODULE"の設定による)immoduleメカニズムを使うと、unstableではライブラリー移行の期間に不安定性に会うかもしれません。

設定の詳細は、"/usr/share/doc/im-switch/README.Debian.gz"か"/usr/share/doc/scim/README.Debian.gz"か"/usr/share/doc/uim/README.Debian.gz"を参照下さい。要点をここに記します。

8.1.3. インプットメソッドを無効化

XIMを経由せずに入力したい場合には、プログラムを起動する際に"$XMODIFIERS"の値を"none"と設定します。もしemacs(1)上で日本語入力インフラeggを使う場合にはこれが当てはまるかもしれません。シェルから、次を実行します。

$ XMODIFIERS=none emacs

Debianメニューによって実行されるコマンドを調整するには、"/usr/share/doc/menu/html"に記された方法にしたがって"/etc/menu/"中にカスタム化した設定を置きます。

8.2. ディスプレー出力

Linuxコンソールは限定された文字しか表示できません。(非Xコンソール上で非ヨーロッパ言語を表示するにはjfbterm(1)のような特別なターミナルプログラムを使う必要があります。)

X Windowは必要なフォントデーターがあればUTF-8中の全ての文字を表示できます。(オリジナルフォントデーターで使われた符号化方式はX Windowシステムが面倒を見るのでユーザーからは直接見えません。)

8.3. ロケール

以下ではgdm(1)から起動されたX Window環境下で実行されるアプリケーションのためのロケールに焦点を当てます。

8.3.1. 符号化方式の基本

環境変数"LANG=xx_YY.ZZZZ"は、ロケールを言語コード"xx"と国コード"yy"と符号化方式(エンコーディング)"ZZZZ"に設定します(「"$LANG"変数」参照)。

現在のDebianシステムは通常ロケールを"LANG=xx_YY.UTF-8"と設定します。これはUnicode文字セットとともにUTF-8符号化方式を使用します。このUTF-8符号化システムはマルチバイトコードシステムでコードポイントを上手に使います。ASCIIデーターは、7ビットのコード域のみで構成されてい、1文字1バイトのみからなる常に有効なUTF-8データーです。

以前のDebianシステムはロケールを"LANG=C"か"LANG=xx_YY"(".UTF-8"は無しで)設定していました。

  • ASCII文字セットが"LANG=C"か"LANG=POSIX"の場合に使われます。
  • 伝統的なUnixでの符号化方式が"LANG=xx_YY"の場合に使われます。

"LANG=xx_YY"の場合に実際に使われる符号化方式は"/usr/share/i18n/SUPPORTED"を確認することで識別できます。例えば、"en_US"は"ISO-8859-1"符号化方式を使い、"fr_FR@euro"は"ISO-8859-15"符号化方式を使います。

[ティップ] ティップ

符号化方式の値の意味に関しては、表11.2「符号化方式値とその使い方リスト」を参照下さい。

8.3.2. UTF-8ロケールを使う根拠

UTF-8符号化方式はI18Nのための現代的で気の利いた符号化方式で、Unicode文字である人類が知る実質的に全ての文字を表せます。UTFとはUnicode変換フォーマット(Unicode Transformation Format: UTF)方式のことです。

私は例えば"LANG=en_US.UTF-8"というUTF-8ロケールをあなたのデスクトップで使うことをお薦めします。ロケールの最初の部分がアプリケーションが提示するメッセージを決めます。例えば、"LANG=fr_FR.UTF-8"ロケールの下のgedit(1) (GNOMEデスクトップのテキストエディター)は、必要なフォントとインプットメソッドがインストールされていれば、メニューをフランス語で提示しながら中国語の文字データーを表示し編集できます。

ロケールを"$LANG"環境変数のみを用いて設定する事をお薦めします。UTF-8ロケールの下で"LC_*"変数(locale(1)参照)の複雑な組み合わせ設定する意味はあまり無いと考えます。

プレーンな英語のテキストですら非ASCII文字を含んでいるかもしれません、例えば左右のクオーテーションマークはASCIIの中にはありません。

“double quoted text”
‘single quoted text’

ASCIIのプレーンテキストをUTF-8のテキストに変換した時には、オリジナルのASCIIのテキストとまったく同じ内容とサイズとなります。ですから、UTF-8ロケールを採用して何ら失うものはありません。

一部のプログラムはI18Nをサポートした後でより多くのメモリーを消費するようになります。それらのプログラムは、実行速度最適化のために内部的にUTF-32(UCS4)でUnicodeのサポートをコードされていて、選ばれたロケールに無関係にそれぞれのASCII文字データー毎に4バイトを消費するからです。ここでも、UTF-8ロケールを使ったからといって何も失うわけではありません。

ベンダー固有の旧式非UTF-8の符号化システムは、多くの国でグラフィック文字のような一部文字に関して仔細だが困惑する相違がありがちでした。現代的なOSがUTF-8システムを採用したことはこのような符号化方式(エンコーディング)の問題を実質的に解決しました。

8.3.3. ロケールの再設定

システムが特定のロケールにアクセスするために、ロケールデーターはロケールデーターベースにコンパイルされなければいけません。(locales-allパッケージをインストールしない限り、Debianシステムは全てのロケールを事前にコンパイルして提供されません。)コンパイルすることができようにサポートされているロケールの全リストは"/usr/share/i18n/SUPPORTED"中にリストされています。このファイルは全ての適切なロケール名をリストします。次のようにすると全ての既にバイナリー形式にコンパイルされ使えるUTF-8ロケールがリストされます。

$ locale -a | grep utf8

次のコマンド実行をするとlocalesパッケージが再設定されます。

# dpkg-reconfigure locales

このプロセスは3段階あります。

  1. 使えるロケールのリストを更新
  2. それをバイナリー形式にコンパイル
  3. PAM (「PAM と NSS」参照)によって使われるように"/etc/defaults/locale"中のシステム全体のデフォールトのロケール値を設定

使えるロケールには、"en_US.UTF-8"と"UTF-8"付きの全ての関心のある言語が含まれているべきです。

米国英語での推奨のデフォールトロケールは"en_US.UTF-8"です。他の言語では"UTF-8"付きのロケールを選ぶようにして下さい。これらの設定の内のいずれを使おうとも、いかなる国際化文字でも扱えます。

[注記] 注記

ロケールを"C"に設定すると、メッセージは米国英語になりますが、ASCII文字しか扱えなくなります。

8.3.4. "$LANG"環境変数の値

"$LANG"環境変数の値は多くのアプリケーションによって設定や変更されます。

  • Linuxコンソールプログラムに関しては、login(1)のPAM機構によって初期設定
  • 全てのXプログラムに関しては、ディスプレーマネージャーのPAM機構によって初期設定
  • リモートコンソールプログラムに関しては、ssh(1)のPAM機構によって初期設定
  • 全てのXプログラムに関しては、gdm(1)のような一部ディスプレーマネージャーによって変更
  • 全てのXプログラムに関しては、 "~/.xsessionrc"を経由するXセッションの起動コードによって変更(lennyの機能)
  • 全てのコンソールプログラムに関しては、 "~/.bashrc"等のシェルの起動コードによって変更
[ティップ] ティップ

互換性を最大限に考えると、システムワイドのデフォールトロケールを"en_US.UTF-8"と設定するのが賢明です。

8.3.5. X Windowの下でのみ特定ロケール

PAMのカスタム化(「PAM と NSS」参照)を使えば、システムワイドのデフォールトロケールに関わらず、特定のロケールをX Windowの下だけで選ぶ事ができます。

この環境は安定度を確保したままあなたに最良のデスクトップ経験を提供します。X Windowシステムが機能していないときでも読めるメッセージを表示する機能する文字ターミナルに常にアクセス出きます。中国語や日本語や韓国語のように非ローマ文字を使う言語では、これは非常に重要です。

[注記] 注記

Xセッションマネージャーパッケージが改良されれば別の方法が使えるようになるかもしれませんが、ロケールの一般的かつ基本的なロケールの設定方法として以下をお読み下さい。gdm(1)に関して、メニューからXセッションのロケールを選べることは承知しています。

"/etc/pam.d/gdm"のようなPAM設定ファイル中で言語の環境変数を定義する場所は次の行が定義します。

auth    required        pam_env.so read_env=1 envfile=/etc/default/locale

これを次のように変更します。

auth    required        pam_env.so read_env=1 envfile=/etc/default/locale-x

日本語の場合、"-rw-r--r-- 1 root root"パーミッションで次のように"/etc/defaults/locale-gdm"ファイルを作成します。

LANG="ja_JP.UTF-8"

他のプログラムのためにデフォールトの"/etc/defaults/locale"ファイルは次のように元のままにします。

LANG="en_US.UTF-8"

これはロケールをカスタム化する最も一般的なテクニックで、gdm(1)自身のメニュー選択ダイアローグを地域化します。

この場合の代策として、"~/.xsessionrc"ファイル使って簡単にロケールを変更してもいいです。

8.3.6. ファイル名の符号化方式

クロスプラットフォームのデーター交換(「リムーバブルストレージデバイス」参照)のために、特定の符号化方式(エンコーディング)でファイルシステムをマウントする必要があるかもしれません。例えば、vfatファイルシステムに関してmount(8)はオプション無しの場合CP437とみなします。ファイル名にUTF-8とかCP932を使うためには明示的にマウントオプションを提供する必要があります。

[注記] 注記

GNOMEのような現代的なデスクトップ環境の下では、デスクトップアイコンを右クリックし"Drive"タブをクリックし"Setting"を開くようにクリックし"Mount options:"に"utf8"を入力すれば、ホットプラグできるUSBメモリーを自動マウントする時のマウントオプションを設定できます。このメモリースティックを次にマウントする機会にはUTF-8でのマウントが有効です。

[注記] 注記

もしシステムをアップグレードしたり旧式非UTF-8システムからディスクを移動したりする場合には、非ASCII文字のファイル名はISO-8859-1とかeucJP等の歴史的な今はお薦めできない符号化方式で符号化をしているかもしれません。テキスト変換ツールの助力を得て、ファイル名をUTF-8に変換します。「テキストデーター変換ツール」を参照下さい。

Sambaは新規クライアント(Windows NT、200x、XP)にはUnicodeを使いますが、旧式クライアント(DOS、Windows 9x/Me)にはCP850をデフォールトで使います。この旧式クライアントへのデフォールトは"/etc/samba/smb.conf"ファイル中の"dos charset"を使って例えば日本語ならCP932等と変更できます。

8.3.7. 地域化されたメッセージと翻訳された文書

Debianシステム中で表示されるエラーメッセージや標準のプログラムの出力やメニューやマニュアルページ等のテキストメッセージや文書の多くに翻訳があります。ほとんどの翻訳行為のバックエンドツールとしてGNU gettext(1)コマンドツールチェインが使われています。

"Tasks" → "Localization"の下のaptitude(8)リストは地域化されたメッセージをアプリケーションに追加したり翻訳された文書を提供する有用なバイナリーパッケージの徹底的なリストを提供します。

例えば、manpages-<LANG>パッケージをインストールするとマンページで地域化したメッセージに使えるようになります。<programname>に関するイタリア語のマンページを"/usr/share/man/it/"から読むには、次を実行します。

LANG=it_IT.UTF-8 man <programname>

8.3.8. ロケールの効果

sort(1)を使う際のソートオーダー(並べ替え順序)はロケールの言語選択に影響されます。スペイン語と英語のロケールでは異なる並べ替えが違います。

ls(1)の日付フォーマットはロケールに影響されます。"LANG=C ls -l"と"LANG=en_US.UTF-8"の日付フォーマットは違います(「時間と日付のカスタム化表示」参照)。

数字の区切り方はロケール毎に異なります。例えば、英語のロケールでは一千一百一点一は"1,000.1"と表示されますが、ドイツ語のロケールでは"1.000,1"と表示されます。スプレッドシートプログラムでこの違いに出会うかもしれません。