前回に引き続き、今回もPHP 6と国際化対応の話をしましょう。
ソフトウェアの「国際化」といった場合、各国の言語で使用される「文字」を正しく扱うための「UNICODEサポート」は、もちろん最重要の課題といえるでしょう。
しかし、お国柄で異なるのは、なにも「文字」だけではありません。例えば「通貨」は、国(もしくは特定の経済圏)によって「ドル」だったり「ユーロ」だったり、「元」だったり「円」だったりします。「日付」も、日本では「2008/11/20」のように「年/月/日」で表記するのが普通ですが、アメリカでは「Nov. 20, 2008」や「11. 20, 2008」のように「月. 日, 年」で表記することも多いようです。
さらにややこしいことに、ヨーロッパでは「20/11/2008」のように「日/月/年」となります。同じ英語の国でも、アメリカとイギリスでは日付の月と日の順序を逆に表記しているわけですね(但し、筆者は海外生活をしたことがありませんので、実際にどうなのかはよく知りません^^;)。
他にも、「メートル」と「インチ」といった長さの単位、「キロ」「グラム」「ポンド」「オンス」「匁」といった重さの単位も国によって異なります。また、日本国内だけでも「あいうえお順」「いろは順」があるように、データを並び替える際の順序も様々です。数値の表現形式も、ドイツのように「小数点」が「. (ドット)」ではなく「, (カンマ)」になる国もあります。
このようにソフトウェアの「国際化」というのは、その国の文字だけ表示できればよいという単純なものではなく、それぞれの国や地域の人々が長年に渡って育んできた「文化」や「慣習」を取り入れ、どこの国の人でも違和感なく使える仕組みを作らねばならないという、非常に厄介なテーマなわけです。
こういったややこしい問題の解決手段が、いわゆる「ロケール」の機能になります。PHP 6で標準搭載になる国際化ライブラリ「ICU」は、UNICODE処理のための機能以外にロケールを扱うための機能も持っており、PHP 6のロケール対応も、このICUの機能をラッピングする形で提供されることになります。
今のところ、PHP 6のロケール対応については情報がまだそれほど多くありませんが、拡張モジュールの形では、ICUラッパー「国際化(Intl)エクステンション」が既にPHPには用意されています。このエクステンションを導入することで、PHP 5でもICUの以下の機能を活用できるようになります。
Locale: 「ロケール識別子」を扱う機能です。ICUでは、ロケール識別子としてRFC 4646で提案されている言語タグを使用します。言語タグの正確な仕様についてはRFCをきちんと理解しなければいけませんが、基本的には「言語-地域」のように「言語」「地域」といったサブタグをハイフンで連結して並べたものと考えればよいでしょう。日本語で地域が日本なら「ja-JP」英語でアメリカなら「en-US」といった具合です
Collator: ロケールに応じた並び順を決めるための文字列比較の機能です
Number Formatter: ロケールに応じた書式で、数値や通貨を表示したり解釈したりするための機能です
IntlDateFormatter: ロケールに応じた書式で、日付時刻を表示したり解釈したりするための機能です
Message Formatter: ロケールに応じて、数値や日付を含むメッセージを柔軟に翻訳できるようにするための機能です
Normalizer: 保存形式を統一しておくなどの目的から、文字列をあらかじめ定められた統一形式に「正規化」する機能です
昨今、筆者のところでも、開発したアプリケーションに対してクライアントから「英語版がほしい」「中国でも展開したい」といった要望を出されるケースが増えてきています。ロケールの機能を上手く使いこなせば、あらかじめこういった要望が出ることを想定した開発もできますし、それによって必要工数・コストが激増するといった心配もありません。
国際的な活躍を目指すPHPプログラマには、これから特に注目していてもらいたい機能のひとつと言えるでしょう。