本章では、管理者の立場から見た、利用可能な多言語対応機能について説明します。 PostgreSQLでは、2つの手法を用いた多言語対応をサポートします。
ロケール固有の照合順序、数字の書式、翻訳されたメッセージなどを提供するためオペレーティングシステムのロケールの機能を使います。
すべての種類の言語によるテキストの格納のサポート、および、クライアントサーバ間の文字セットの翻訳を提供するため、PostgreSQLで定義された、マルチバイト文字セットを含む、多くの文字セットを提供します。
ロケールのサポートはアルファベット、並び換え、数字の書式など文化的嗜好を配慮したあるアプリケーションを対象にします。 PostgreSQL は、サーバのオペレーティングシステムが提供する、標準 ISO C と POSIX のロケール機能を使用します。 これ以上の情報についてはお使いのシステムのドキュメントを参照下さい。
ロケールのサポートは、initdb を使用してデータベースクラスタを作成するとき自動的に初期化されます。 initdb は、デフォルトでその実行環境のロケール設定にしたがってデータベースクラスタを初期化します。 そのため、システムがデータベースクラスタで使用したいロケールを使用するようにすでに設定してある場合は何も行う必要はありません。 違うロケールを使用したい場合(またはシステムのロケール設定が不明な場合)は、initdb の --locale オプションで、希望のロケールを指定することができます。 以下に例を示します。
initdb --locale=sv_SE
この例の設定はロケールをスウェーデン(SE)で使用されているスウェーデン語(sv)に合わせています。 ほかにも en_US(米国英語)や fr_CA(カナダのフランス語)などの設定もできます。 ロケールに複数の文字セットが使用可能であれば、cs_CZ.ISO8859-2 のように記述することができます。 お使いのシステムでどのロケールがどういう名前で使えるかはオペレーティングシステムのベンダがどのようなものを提供しているかと、何がインストールされているかに依存します。 (ほとんどのシステムでは、locale -aというコマンドで利用可能なロケールの一覧を入手することができます。)
英語の照合規則でスペイン語のメッセージを使用するときなど、時として複数のロケールの規則を併用すると便利です。 これをサポートするために、ロケールには以下のような多言語対応規則の特定の箇所だけを管理する一連のサブカテゴリがあります。
LC_COLLATE | 文字列の並び換え順 |
LC_CTYPE | 文字の分類(文字とはどんなもの?大文字小文字を区別しない?) |
LC_MESSAGES | メッセージの言語 |
LC_MONETARY | 通貨書式 |
LC_NUMERIC | 数字の書式 |
LC_TIME | 日付と時刻の書式 |
システムがロケールをサポートしていないように動作させたい場合は、特別なロケールの C、もしくは POSIX を使用してください。
一部のロケールカテゴリでは、その値をデータベースクラスタの存続時間に対して固定しなければならないものがあります。 つまり、initdb の実行後はこれらの値を変更できなくなります。 LC_COLLATE と LC_CTYPE がこのカテゴリに入ります。 これらはインデックスの並び替え順に影響をおよぼすため、固定されていなければなりません。 さもないと、テキスト型列上のインデックスは破壊されます。 PostgreSQL は initdb が検知した LC_COLLATE と LC_CTYPE の値を記録して、この固定が必ず守られるようにします。 サーバは起動された時点で自動的にこれらの 2 つの値を採用します。
その他のロケールカテゴリは、サーバ実行中いつでも、ロケールカテゴリと同じ名前の実行時設定変数を設定することで、希望値に変更することができます。 (詳細は 項16.4 を参照してください。) initdb で選択されたデフォルトは、実際のところ、サーバの起動時にデフォルトとして動作するように postgresql.conf 設定ファイルに書き込まれるだけです。 この代入文を postgresql.conf から削除すると、サーバは実行環境の設定をそのまま使用します。
サーバのロケールの動作はどのクライアントの環境にも依存せず、サーバが参照できる環境変数で決まります。 ですからサーバを稼動させる前に正しいロケール設定を行うように注意してください。 結果としてサーバとクライアントで異なるロケールが設定されているとメッセージはそれらがどこから生じたかによって、異なる言語で表示されます。
注意: 実行環境のロケールをそのまま使用するということは、ほとんどのオペレーションシステムでは次のような意味をもちます。 指定されたロケールカテゴリ (たとえば照合) について、設定するものが見つかるまで、以下の環境変数がこの順番で調べられます。LC_ALL、LC_COLLATE (個別のカテゴリに対応する変数)、LANG。 これらのいずれの環境変数も設定されない場合に、ロケールはデフォルトで C に設定されます。
メッセージの言語を設定する目的で、メッセージ多言語化ライブラリの中にはすべてのロケール設定を上書きする環境変数 LANGUAGE を検索するものがあります。 嘘だと思うのであればより詳細な情報を得るためお使いのオペレーティングシステムの文書、特に gettext の文書を参照して下さい。
ユーザの選択した言語にメッセージを翻訳できるようにするためには NLSを構築時に有効にする必要があります。 このオプションは他のロケールサポートとは独立しています。
ロケールのサポートは以下の機能に影響を与えます。
CやPOSIX以外で、PostgreSQL でロケールを使用する際の欠点は実行速度です。 ロケールは文字の扱いを遅くし、さらにLIKEで通常のインデックスが使用されなくなります。この理由から、本当に必要なときのみロケールを使用してください。
上記の説明に従って設定を行ったにもかかわらずロケールのサポートが正常に動作しない場合、オペレーティングシステムのロケールサポートが正確に設定されているか確認してください。 指定されたロケールがインストールされているかどうか確認するために、オペレーティングシステムが提供していれば、locale -aコマンドを使用をすることができます。
PostgreSQLが想定しているロケールを実際に使用しているかどうかを確認してください。 LC_COLLATE と LC_CTYPE の設定はinitdb 時に決定され、initdb を再実行しない限り変更することはできません。 LC_MESSAGESやLC_MONETARYなど他のロケール設定はサーバ起動時の環境変数によって初めに決定されますが、その場で変更することができます。 SHOWコマンドを使用して、使用中のロケール設定を確認することができます。
ソース配布物のsrc/test/localeディレクトリには、PostgreSQLのロケールサポート用の試験一式があります。
エラーメッセージ内のテキストを解析してサーバ側のエラーを扱っているクライアントアプリケーションでは、サーバのメッセージが異なる言語で記載されると、明らかに問題になります。 こうしたアプリケーションの作者には、エラーコードスキーマで代替させることを推奨します。
メッセージ翻訳のカタログのメンテナンスには PostgreSQL に選択した言語を話させてみたいという数多くのボランティアのたゆみのない努力を必要としています。 もしあなたの言語が現在使えなかったり完全に翻訳されてない場合、あなたの助力をよろしくお願いします。 もし助力いただけるのであれば、第44章を参照するか開発グループのメーリングリストに投稿してください。