国際化を示す internationalization という単語は、i と n という文字の間に 18 文字が存在するため、国際化は i18n という略語で表されることがよくあります。国際化の意味にはさまざまな定義がありますが、本書において国際化とは、世界中の市場の要件に対応できるような汎用的で柔軟なプログラムを作成することを意味します。
国際化の一環として製品をローカライズ可能にすることがあります。これにより、アプリケーションのユーザーインタフェース (UI) は、アプリケーションのソースコードを最小限に変更するだけで変換できるようになります。
たとえば、次のようにコード化された C プログラムのメッセージテキストについて考えてみます。
/* This is not internationalized code */ printf("This message needs internationalization.");
このメッセージを、gettext コマンドを使用してメッセージカタログに外在化する場合は、次のように記述します。
/* This is internationalized code */ printf("%s", gettext("This message is now internationalized."));
国際化のもう 1 つの重要な部分は、ソースコードを変更せずに異なるロケールに属するデータが処理可能になることです。
たとえば、文字列の配列をソートする場合を考えます。国際化が行われない場合、ソースコードは次のようになります。
/* This is not internationalized code, since strcmp() compares byte values, producing an invalid sort order */ if (strcmp((const char *)string[q], (const char *)string[p]) > 0) { temp = string[q]; string[q] = string[p]; string[p] = temp; }
このソートのメソッドは、英語のロケールで文字列を処理する場合のみ機能します。ただし、異なるロケールの文字を処理するコードでは、ロケールに依存した関数を使用する必要があります。ロケールに依存した関数を使用すると、ソートのメソッドは次のように作成されます。
/* This is internationalized code, since strcoll() uses locale information to determine sort order */ if (strcoll((const char *)string[q], (const char *)string[p]) > 0) { temp = string[q]; string[q] = string[p]; string[p] = temp; }