第8章 I18N と L10N

# 第8章 I18N と L10N

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

- 国際化 (I18N): ソフトが複数のロケール (地域) を扱えるようにします。

- 地域化 (L10N): 特定のロケール (地域) を扱えるようにします。

| ヒント
M17N、I18N、L10N に対応する英語の multilingualization、internationalization、localization の中の "m" と "n"、"i" と "n"、"l" と "n" の間には 17、18、10 の文字があります。詳細は、国際化と地域化 を参照下さい。

## 8.1. ロケール

国際化をサポートするプログラムの挙動は、ローカル化をサポートする環境変数 "`$LANG`" を使って設定されます。`libc` ライブラリーによるロカール依存機能の実際のサポートには、`locales` か `locales-all` パッケージをインストールする必要があります。`locales` パッケージは適切に初期化する必要があります。

`locales` と `locales-all` パッケージのいずれもインストールされない場合、ロカール機能のサポートは失われ、システムは US 英語のメッセージ使い、データーを ASCII として取り扱います。この挙動は "`$LANG`" が "`LANG=`" か "`LANG=C`" か "`LANG=POSIX`" と設定されたのと同様です。

GNOME や KDE 等の現代的なソフトは多言語化されています。UTF-8 データーを扱えるようにすることで国際化され、`gettext`(1) インフラで翻訳されたメッセージを提供することで地域化されています。翻訳されたメッセージは別の地域化パッケージとして供給されているかもしれません。

現行の Debian デスクトップ GUI システムは普通 GUI 環境下のロカールを "`LANG=xx_YY.UTF-8`" と設定します。ここで、"`xx`" は ISO 639 言語コード で "`YY`" は ISO 3166 国コード です。これらの値はデスクトップ設定 GUI ダイアログで設定されプログラムの挙動を変えます。「"`$LANG`" 変数」を参照下さい

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

テキストデータの最も単純な表現は ASCII で、英語には十分で 127 未満の文字 (7 ビットで表現可能) を使います。

プレーンな英語のテキストですら非 ASCII 文字を含んでいるかもしれません。例えば微妙に曲がった左右のクォテーションマークは ASCII 内では利用できません。

    “double quoted text” is not "double quoted ASCII"
    ‘single quoted text’ is not 'single quoted ASCII'

より多くの文字をサポートするために、多くの言語をサポートする多数の文字集合とエンコーディング体系が使用されてきました (表11.2「符号化方式値とその使い方リスト」 を参照下さい)。

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

テキスト エンコーディング システム UTF-8 は、ASCII データー処理システムとほぼ互換な賢明な 8 ビット データー ストリームにユニコード コードポイントを当てはめます。これが UTF-8 を現代的な好ましい選択肢にします。UTF はユニコード変換フォーマット (Unicode Transformation Format) の意味です。 ASCII プレーンテキスト データーが UTF-8 データーに変換されるとき、最初の ASCII データーと全く同じ内容とサイズです。UTF-8 ロケールを採用することで失いものはありません。

UTF-8 ロカールの下の互換アプリケーションプログラムを使うと、必要なフォントとインプットメソッドが導入され有効化されていれば、いかなる外国語のテキストデーターの表示や編集ができます。例えば、"`LANG=fr_FR.UTF-8`" ロケールの下で、`gedit`(1) (GNOME デスクトップ用のテキストエディター) は、メニューをフランス語で表示しながら中国語の文字の表示や編集ができます。

| ヒント
新標準の "`en_US.UTF-8`" ロケールと旧標準の "`C`"/"`POSIX`" ロケールは標準アメリカ英語のメッセージを使いますが、ソート順などでわずかに違います。古い "`C`" ロケールの挙動を保守する際に、ASCII 文字を扱うだけでなく、UTF-8 でエンコードされた全ての文字を優雅に扱いたい場合は、非標準の "`C.UTF-8`" ロケールを Debian で使います。

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

### 8.1.2. ロケールの再設定

システムが特定のロケールにアクセスできるように、ロケールデータをロケールデータベースからコンパイルする必要が有ります。

`locales` パッケージには、事前にコンパイルしたロケールデーターは同梱されていません。以下のようにして設定する必要があります:

    # dpkg-reconfigure locales

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

1. バイナリー形式にコンパイルしたい全ての必要なロケールデーターを選択します。(少なくとも１つの UTF-8 ロケールが含めて下さい)

2. PAM (「PAM と NSS」を参照下さい) によって使われるように "`/etc/default/locale`" を作成しシステム全体のデフォールトのロケール値を設定。

"`/etc/default/locale`" 中に設定されたシステム全体のデフォルトロケール値は GUI アプリケーション用の GUI 設定によりオーバーライドされるかもしれません。

| 注記
実際に使われる符号化方式は "`/usr/share/i18n/SUPPORTED`" を確認することで識別できます。だから、"`en_US`" は"`ISO-8859-1`" 符号化方式を使います。

`locales-all` パッケージには、全てのロケールデーター用に事前にコンパイルしたロケールデーターが同梱されています。"`/etc/default/locale`" を作成しないので、`locales` パッケージもまだインストール必要があるかもしれません。

| ヒント
いくつかの Debian 派生のディストリビューションの `locales` パッケージには、事前にコンパイルしたロケールデーターが同梱されています。そのようなシステム環境を Debian 上で再現するには `locales` と `locales-all` パッケージの両方をインストールする必要があります。

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

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

| 注記
GNOME のような現代的なデスクトップ環境の下では、デスクトップアイコンを右クリックし "Drive" タブをクリックし "Setting" を開くようにクリックし "Mount options:" に"utf8" を入力すれば、ホットプラグできる USB フラッシュドライブを自動マウントする時のマウントオプションを設定できます。次回この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.1.4. 地域化されたメッセージと翻訳された文書

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

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

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

    LANG=it_IT.UTF-8 man programname

GNU gettext は `$LANGUAGE` 環境変数を使って翻訳言語の優先順位をつけるようにできます。例えば:

     $ export LANGUAGE="pt:pt_BR:es:it:fr"

詳しくは、`info gettext` を参照して "The LANGUAGE variable" セクションを読んで下さい。

### 8.1.5. ロケールの効果

`sort`(1) や `ls`(1) での並べ替え順はロケールの影響を受けます。`LANG=en_US.UTF-8` をエクスポートすると辞書順 `A->a->B->b...->Z->z` で並べ替えられ、一方 `LANG=C.UTF-8` をエクスポートすると ASCII バイナーリー順 `A->B->...->Z->a->b...` で並べ替えられます。

`ls`(1) の日付形式はロケールに影響されます。literal>" の日付形式は違います (「時間と日付のカスタム化表示」を参照下さい)。

`date`(1) の日付形式はロケールに影響されます。例えば以下です:

     $ unset LC_ALL
     $ LANG=en_US.UTF-8 date
    Thu Dec 24 08:30:00 PM JST 2023
     $ LANG=en_GB.UTF-8 date
    Thu 24 Dec 20:30:10 JST 2023
     $ LANG=es_ES.UTF-8 date
    jue 24 dic 2023 20:30:20 JST
     $ LC_TIME=en_DK.UTF-8 date
    2023-12-24T20:30:30 JST

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

"`$LANG`" 環境変数の各詳細機能は、"`$LC_*`" 変数の設定でオーバーライドされます。これらの環境変数は更に "`$LC_ALL`" 変数の設定でオーバーライドされます。詳細は `locale`(7) マンページを参照下さい。複雑な設定をするよほどの理由がない限り、これらは使わずただ "`$LANG`" 変数だけを UTF-8 ロカールの 1 つに設定して使いましょう。

## 8.2. キーボード入力

### 8.2.1. Linux コンソールと X Window 用のキーボード インプット

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

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

Linux コンソールや X Window システムでは、これは "`/etc/default/keyboard`" と "`/etc/default/console-setup`" 内の設定パラメーターを更新します。これは Linux コンソールのフォントも設定します。多くの欧州言語で用いられるアクセント付き文字を含めた多くの非 ASCII 文字は デッドキーや AltGr キーやコンポーズキーを用い提供されます。

### 8.2.2. Wayland 向けのキーボード入力

Wayland 上の GNOME デスクトップシステムでは、「Linux コンソールと X Window 用のキーボード インプット」は非英語の欧州言語をサポートできません。IBus がアジア言語のみならず欧州言語もサポートします。GNOME デスクトップ環境のパッケージ依存関係が "`gnome-shell`" 経由で "`ibus`" を推薦します。"`ibus`" のコードは `setxkbmap` と XKB オプション機能を統合するように更新されています。多言語キーボード入力には "GNOME Settings" か "GNOME Tweaks" から `ibus` を設定する必要があります。

| 注記
もし ibus がアクティブな場合、たとえ古典的 X 上のデスクトップ環境下でも、あなたの `setxkbmap` による古典的 X キーボード設定は `ibus` によってオーバーライドされるかもしれません。`im-config` を使ってインプットメソッドを "None" と設定すると、インストールされた `ibus` は無効化できます。詳細は、キーボードに関する Debian Wiki を参照下さい。

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

GNOME デスクトップ環境が "`gnome-shell`" 経由で "`ibus`" を推薦するので、"`ibus`" はインプットメソッドの良い選択肢です。

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

    Keyboard                                       Application
       |                                                 ^
       |                                                 |
       +-> Linux kernel ->  Input method (ibus)  -> Gtk, Qt, X, Wayland
                              +-- Engine--+

IBus とそのエンジンパッケージのリストは以下の通りです。

表8.1 IBusとエンジンパッケージのリスト

パッケージ | ポプコン | サイズ | サポートされたロケール
--- | --- | --- | ---
ibus | V:217, I:264 | 1874 | dbus を用いるインプットメソッドのフレームワーク
ibus-mozc | V:2, I:3 | 980 | 日本語
ibus-anthy | V:0, I:1 | 8867 | , ,
ibus-skk | V:0, I:0 | 243 | , ,
ibus-kkc | V:0, I:0 | 211 | , ,
ibus-libpinyin | V:1, I:4 | 2769 | 中国語 (zh_CN 用)
ibus-chewing | V:0, I:0 | 288 | , , (zh_TW 用)
ibus-libzhuyin | I:0 | 41009 | , , (zh_TW 用)
ibus-rime | V:0, I:0 | 78 | , , (zh_CN/zh_TW 用)
ibus-cangjie | V:0, I:0 | 235 | , , (zh_HK 用)
ibus-hangul | V:0, I:2 | 264 | 韓国語
ibus-libthai | I:0 | 84 | タイ語
ibus-table-thai | I:0 | 59 | タイ語
ibus-unikey | V:0, I:0 | 286 | ベトナム語
ibus-keyman | V:0, I:0 | 191 | 多言語: 2000 語以上のための Keyman エンジン
ibus-table | V:0, I:1 | 2271 | IBus 用のテーブルエンジン
ibus-m17n | V:0, I:1 | 448 | 多言語: インド系言語、アラビア語、他
plasma-widgets-addons | V:68, I:113 | 5132 | キーボード インジケーターを含む Plasma 5 用の追加ウイジェット

| 注記
中国語にとっては、"`fcitx5`" が代替のインプットメソッドフレームワークかもしれません。Emacs 愛好家にとっては、"`uim`" が代替かもしれません。いずれの場合でも、`im-config` で追加の手動設定が必要かもしれません。いくつかの古く古典的な "`kinput2`" のような インプットメソッド が Debian レポジトリー中に依然として存在するかもしれませんが、現代的な環境ではお薦めできません。

### 8.2.4. 日本語の例

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

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

2. アクティベートされていない場合は "Settings" → "Keyboard" → "Input Sources" → click "`+`" in "Input Sources" → "Japanese" → "Japanese mozc (or anthy)" を選択し "Add" をクリックします。

3. インプットソースはいくつ選んでも構いません。

4. ユーザーアカウントに再ログインします。

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

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

| ヒント
シフト`2` が `"` (ダブルクォーテーションマーク)の刻印のある物理的な日本語キーボードでアルファベットのみのキーボード環境にアクセスするには、上記の手順で "Japanese" を選びます。シフト`2` が `@` (アットマーク)の刻印のある物理的な US 英語キーボードを "Japanese mozc (もしくは anthy)" を使うと日本語が入力できます。

- `im-config`(8) のための GUI メニューエントリーは "Input method" です。

- あるいは、ユーザのシェルから "`im-config`" を実行します。

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

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

## 8.3. ディスプレー出力

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

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

## 8.4. 東アジア不明瞭文字幅文字

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

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

- `gnome-terminal`: Preferences → Profiles → Profile name → Compatibility → Ambiguous-wide characters → Narrow

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

第7章 GUI システム |  | 第9章 システムに関するティップ