<PostgreSQL Conference 2012> 2012年2月24日(金) 品川AP
カンファレンスチケットは完売いたしました。なおレセプションチケットが若干数残っております。詳しくは上記をクリック。

Chapter 5. 多言語対応

管理者の立場で利用可能な多言語対応機能について説明します。

PostgreSQL は 3 種類の取り上げ方で多言語対応を支援しています。

5.1. ロケールのサポート

ロケールのサポートはアルファベット、並び換え、数字の形式など言語間の文化的嗜好を配慮したあるアプリケーションを対象にします。 PostgreSQL は標準 ISO C と POSIX に類似したサーバのオペレーティングシステム提供の利器であるロケールを使用します。追加情報はお使いのシステムのドキュメントを参照下さい。

5.1.1. 概要

ロケールのサポートはデフォルトで PostgreSQL に組み込まれません。組み込むためには configure スクリプトに --enable-locale オプションを付けます。

$ ./configure --enable-locale

ロケールのサポートはサーバにのみ効果をもたらします。すべてのクライアントはロケールサポートの有る無しにかかわらずサーバと互換性が保たれます。

ユーザーの選択した言語にメッセージを翻訳するには --enable-nls オプションを使用します。このオプションは他のロケールサポートとは独立しています。

ど特定の文化的規則を使用するかの情報は標準の環境変数で決定されます。もしほかのプログラムでローカライズされた振舞がシステムにあるとすれば、たぶんロケールは既に設定されていることでしょう。最も簡単なローカライズ情報の設定は以下のように LANG 変数を使います。

export LANG=sv_SE

この設定はロケールをスウェーデン(SE)で使用されているスウェーデン語(sv)に合わせています。ほかにも en_US(米国英語)や fr_CA(カナダのフランス語)などの設定もできます。ロケールに複数の文字セットが使用可能であれば、 cs_CZ.ISO8859-2 のように記述することができます。お使いのシステムでどのロケールがどういう名前で使えるかはオペレーティングシステムのベンダーがどのようなものを提供しているかと、何がインストールされているかに依存します。

米国の照合規則でスペイン語のメッセージを使用するときなど、時としていくつかのロケールの規則を併用すると便利です。このための環境変数として以下のようなものがあって、特定のカテゴリーについて LANG のデフォルトを上書きします。

LC_COLLATE文字列の並び換え順
LC_CTYPE文字の分類(文字とはどんなもの? 大文字小文字を区別しない?)
LC_MESSAGESメッセージの言語
LC_MONETARY通貨形式
LC_NUMERIC数字の書き方
LC_TIME日付と時刻の書き方

更に LC_ALL 環境変数によってこれらの特殊な変数と LANG 変数を上書きすることができます。

Note: メッセージの言語を設定する目的でローカリゼーションライブラリはすべてのロケール設定を上書きする環境変数 LANGUAGE を見に行きます。嘘だと思うのであればより詳細な情報を得るためお使いのオペレーティングシステムのドキュメント、特に gettext のマニュアルページを参照して下さい。

システムがロケールをサポートしていないように動作させたい場合は、特別なロケールの C、もしくは POSIX を使用するか、ロケールに関連するすべての変数を単に非設定にしてください。

サーバのロケールの動作はどのクライアントの環境にも依存せずサーバが参照できる環境変数で決まります。ですからサーバを稼働させる前にこれらの変数を設定するように注意して下さい。結果としてサーバとクライアントで異なるロケールが設定されているとメッセージはそれらがどこから生じたかよって、異なる言語で表示されます。

LC_COLLATE and LC_CTYPE 変数はインデックスの並び替え順に影響をおよぼします。ですから、これらの変数はどんな特定のデータベースクラスタに対しても固定されていなければなりません。さもないと、テキスト型列上のインデックスは破壊されます。 PostgreSQLinitdb が見れるように LC_COLLATELC_CTYPE の値を記録してこの事が必ず守られるようにします。サーバは起動された時点で自動的にこれらの 2 つの値を採用します。サーバの稼働時にもう一方の LC_ 範疇のみが環境から設定可能です。端的に表現すると、データベースクラスタ内ではたったひとつの照合順序が使用可能で、それは initdb 時に選択されます。

5.1.2. 利点

ロケールのサポートは特に以下の機能に影響を与えます。

  • ORDER BY 問い合わせによる並び替え順

  • 一群の to_char 関数

  • パターン照合の LIKE~ 演算子

PostgreSQL でロケールサポートを使用する際のたったひとつの重大な欠点は実行速度です。ですから、本当に必要なときのみロケールを使用してください。また、C 以外のロケールを使用すると LIKE~ 演算子のインデックス最適化が実行できなくなってしまい、それらの演算子を使用する検索のスピードに大きな違いをもたらします。

5.1.3. 問題点

上記の説明に従って設定を行ったにもかかわらずロケールのサポートが正常に動作しない場合、オペレーティングシステムのロケールサポートが正確にコンフィギュレーションされたか確認してください。指定されたロケールがインストールされて、正常に作動するかの確認は、Perl などを使ってできます。Perl もロケールをサポートしていてもしロケールが壊れていると perl -v で以下のようなメッセージが表示されます。

$ export LC_CTYPE='not_exist'
$ perl -v
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LC_ALL = (unset),
LC_CTYPE = "not_exist",
LANG = (unset)
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

ロケールファイルが正しい場所にあるかの確認を行ってください。保存場所としては、 /usr/lib/locale(Linux、Solaris)、 /usr/share/locale(Linux)、 /usr/lib/nls/loc(DUX 4.0)です。はっきりしない時はロケールのマニュアルページを参照してください。

これだと思っているロケールを PostgreSQL が実際に使用しているか確認します。 LC_COLLATELC_CTYPE の設定は initdb の時点で確定され、再度 initdb を実行しないと変更できません。LC_MESSAGESLC_MONETARY を含む他のロケール設定は postmaster が起動された環境によって決まり、postmaster を単に再起動すれば変更できます。 contrib/pg_controldata ユーティリティプログラムでデータベースの LC_COLLATELC_CTYPE の設定を検証できます。

src/test/locale ディレクトリに PostgreSQL のロケールサポートのテスト一式があります。

サーバのメッセージが異なった言語の場合はエラーメッセージのテキストを構文解析してサーバサイドエラーを処理するクライアントアプリケーションで明らかに問題となります。もしそのようなアプリケーションを作成するのであればこの状況に対処する方法を工夫しなければなりません。組み込み SQL インターフェイスの (ecpg) もこの問題の影響を受けます。今のところ ecpg アプリケーションとインターフェイスをとるサーバはメッセージを英語で送るようにコンフィギュレーションするようにお勧めします。

メッセージ翻訳のカタログのメンテナンスには PostgreSQL に選択した言語を話させてみたいという数多くのボランティアのたゆみのない努力を必要としています。もしあなたの言語が現在使えなかったり完全に翻訳されない場合あなたの助力を感謝します。もし助力いただけるのであれば開発者ガイドを参照するか開発グループのメーリングリストに投稿して下さい。