第8章 I18N と L10N

目次

8.1. キーボード入力
8.1.1. IBus を使うインプットメソッドのサポート
8.1.2. 日本語の例
8.1.3. インプットメソッドを無効化
8.2. ディスプレー出力
8.3. 東アジア不明瞭文字幅文字
8.4. ロケール
8.4.1. 符号化方式の基本
8.4.2. UTF-8 ロケールを使う根拠
8.4.3. ロケールの再設定
8.4.4. "$LANG" 環境変数の値
8.4.5. X Window の下でのみ特定ロケール
8.4.6. ファイル名の符号化方式
8.4.7. 地域化されたメッセージと翻訳された文書
8.4.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 を参照下さい。

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

[警告] 警告

本章は、2013年にリリースされた Debian 7.0 (Wheezy) に基づいているため、内容が陳腐化しつつあります。

Debian システムは keyboard-configurationconsole-setup パッケージを使い多くの国際キーボード配列として機能するように設定できます。

# dpkg-reconfigure keyboard-configuration
# dpkg-reconfigure console-setup

これは "/etc/default/keyboard" と "/etc/default/console-setup" にある Linux コンソールと X Window のキーボード設定の設定パラメーター を更新します。これは Linux コンソールのフォントも設定します。

多くの欧州言語で用いられるアクセント付きの文字を含めた多くの非-ASCII 文字はデッドキーAltGr キーコンポーズキー を使うことでアクセスできます。

アジア言語に関しては次に記す IBus のような、より複雑な インプットメソッドが必要です。

アプリケーションへの多言語入力は次のように処理されます。

キーボード                                                          アプリケーション
   |                                                                                ^
   |                                                                                 |
   +-> Linux カーネル -> インプットメソッド -> Gtk, Qt, or X

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


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

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

  1. 日本語インプットツールパッケージの ibus-anthyim-config 等の推奨 (recommended) されたパッケージとともにインストールします。

  2. ユーザーのシェルから "im-config" を実行して "ibus" をインプットメソッドとして選択します。

  3. "Settings" → "Keyboard" → "Input Sources" → click "+" in "Input Sources" → "Japanese" → "Japanese (anthy)" を選択し "Add" をクリックします。

  4. "Japanese" を選択し "Add" をクリックして文字変換なしの日本語配列キーボードをサポートします。(インプットソースは任意に複数選べます。)

  5. ユーザーアカウントへの再ログイン

  6. "im-config" として設定を確認します。

  7. GUI ツールバーアイコンを右クリックしてインプットソースを設定します。

  8. インプットソース間を、SUPER-SPACE を用いて切り替えます。(SUPER は通常 Windows キーです。)

以下に注意下さい。

  • im-config(8) は実行されるのが root からかどうかによって違った挙動をします。

  • im-config(8) はユーザーからのアクション無しにシステム上で最も好ましいインプットメソッドを有効にします。

  • im-config(8) のための GUI メニューエントリーは乱雑になることを防ぐためにデフォルトでは無効にされています。

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

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

東アジアのロケールでは、箱描画文字やギリシャ文字やキリル文字はあなたが望より広い幅で表示されターミナル出力が揃わなくなるかもしれません(Unicode標準附属書 #11 参照)。

この問題は回避可能です:

  • gnome-terminal: Edit → Preferences → Profiles → Edit → Compatibility → Ambiguous-wide characters → Narrow

  • ncurses: 環境変数を export NCURSES_NO_UTF8_ACS=0 と設定します。

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

環境変数 "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「符号化方式値とその使い方リスト」を参照下さい。

ユニコード 文字セットは実質的に人類が知り得る全ての文字を16進表記で 0 から 10FFFF までのコードポイント範囲で表記できます。そのストレージには最小限 21 ビット必要です。

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 システムを採用したことはこのような符号化方式 (エンコーディング) の問題を実質的に解決しました。

システムが特定のロケールにアクセスするために、ロケールデーターはロケールデーターベースにコンパイルされなければいけません。(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/default/locale" 中のシステム全体のデフォールトのロケール値を設定

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

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

[注記] 注記

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

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

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

[注記] 注記

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

"/etc/pam.d/gdm3" のような 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/default/locale-x" ファイルを作成します。

LANG="ja_JP.UTF-8"

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

LANG="en_US.UTF-8"

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

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

クロスプラットフォームのデーター交換 (「リムーバブルストレージデバイス」参照下さい) のために、特定の符号化方式 (エンコーディング) でファイルシステムをマウントする必要があるかもしれません。例えば、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 等と変更できます。

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

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

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

LANG=it_IT.UTF-8 man <programname>

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

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

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