第8章 I18N と L10N

目次

8.1. キーボード入力
8.1.1. IBus を使うインプットメソッドのサポート
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

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

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

Debian システムための多言語入力の設定は、im-config パッケージとともに IBus ファミリーのパッケージを使うことで簡素化されました。IBus パッケージのリストは次です。

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

パッケージ ポプコン サイズ サポートされたロケール
ibus * V:0.2, I:0.2 4220 dbus を用いるインプットメソッドのフレームワーク
ibus-anthy * V:0.04, I:0.10 684 日本語
ibus-skk * V:0.00, I:0.03 404 , ,
ibus-pinyin * V:0.06, I:0.09 1184 中国語 (zh_CN 用)
ibus-chewing * V:0.01, I:0.02 252 , , (zh_TW 用)
ibus-hangul * V:0.01, I:0.03 216 韓国語
ibus-table * V:0.05, I:0.10 680 IBus 用のテーブルエンジン
ibus-table-thai * I:0.00 156 160 タイ語
ibus-unikey * V:0.00, I:0.00 316 ベトナム語
ibus-m17n * V:0.02, I:0.05 180 多言語: インド系言語、アラビア語、他

kinput2 法や他のロケール依存のアジアの古典的インプットメソッドはまだありますが、現代的な UTF-8 の X 環境下ではお勧めできません。SCIMuim ツールチェインは現代的な UTF-8 の X 環境下での国際インプットメソッドの少し古いアプローチです。

8.1.2. 日本語の例

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

  1. 日本語インプットツールパッケージの ibus-anthyim-config 等の推奨 (recommended) されたパッケージとともにインストールします。
  2. ユーザーのシェルから "im-config" を実行して "ibus" を選択します。
  3. "System" → "Preferences" → "IBus Preferences" → "Input Method" → "Select an input method" → "Japanese" → "Anthy" を選択し "Add" をクリックします。
  4. ユーザーアカウントへの再ログイン
  5. "im-config" として設定を確認します。
  6. GUI ツールバーを右クリックしてインプットメソッドとモードを設定します。(インプットメソッドのメニュー選択肢を減らす事ができます)
  7. CTRL-SPACE によって IBus インプットメソッドを起動します。

以下に注意下さい。

  • im-config(8) は実行されるのが root からかどうかによって違った挙動をします。
  • im-config(8) はユーザーからのアクション無しにシステム上で最も好ましいインプットメソッドを有効にします。
  • im-config(8) のための GUI メニューエントリーは乱雑になることを防ぐためにデフォルトでは無効にされています。

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" と表示されます。スプレッドシートプログラムでこの違いに出会うかもしれません。