はじめに
ネットサーフィンをしていると、海外のサイトにも関わらず、ページが日本語で表示されることがあります。そのサイトが日本語のページしか持っていないということは多分ありません。閲覧者が日本人だと推測して、日本語のページを返しているのです。
静的なWebページの場合には、日本語のページと英語のページといった具合に、対応したい言語ごとに別々のページを用意して、何らかの方法で表示するページを切り替えます。
動的なページの場合に同じ方法を採るのは現実的ではありません。日本語のWebアプリケーション(以下、Webアプリ)と、英語のWebアプリを別々に開発するのはとても面倒です。そこで、ロケール(言語や地域)に依存する部分だけを置き換えられるようにWebアプリを開発することになります。このことをWebアプリの「国際化」と言います。英語ではinternationalizationですが、長いのでI18Nと書かれるのがふつうです。国際化されたソフトウェアを、実際に特定のロケールで使えるようにすることを「地域化」(localization, L10N)と言います。
本稿では、PEAR::I18Nv2を用いて、日時と通貨・数値の表記を国際化・地域化する方法を紹介します。
対象読者
- PHPの基本的な使い方を知っている方
- PEARのパッケージを管理できる方
- PHPのWebアプリを国際化したい方
- Unicodeについての基本的な知識がある方
必要な環境
PHPにPEAR::I18Nv2をインストールしてある必要があります。筆者は、XAMPP 1.6.6 for Windowsに収録されているPHP 5.2.5に、I18Nv2 0.11.4をインストールしました。
準備
Webブラウザで言語を切り替える方法を確認してください。Firefoxの場合は、[ツール]-[オプション]を選択し、[詳細]の[一般]タブにある[言語設定]ボタンで言語の優先順位を設定できます。PrefBarというアドオンをインストールすれば、ツールバーで言語を設定できるようになります。
Webアプリケーションサーバは、ブラウザの言語設定をリクエストヘッダ(Accept-Languageヘッダ)を通じて知ることができます。言語を日本語・英語/米国に設定して次のようなコードを実行すれば、「ja,en-us;q=0.5」と表示されます(ヘッダの内容は、FirefoxならLive HTTP Headersというアドオンで確認することもできます)。
$headers = getallheaders(); echo $headers['Accept-Language']; //ja,en-us;q=0.5
これから実行するコードはすべてUTF-8で処理することにします。
mb_internal_encoding('UTF-8')
国際化された組み込み関数
組み込み関数の中にも国際化されたものがあります(『PHPにおける日付と時刻の混乱』を参照)。ただし、先に紹介したリクエストヘッダを読んでいるわけではないので、まずロケールを設定してから使わなければなりません。
//日本語の場合 setlocale(LC_ALL,'Japanese_Japan'); //Windows以外ではsetlocale(LC_ALL,'ja_JP'); echo strftime('%c'); //2008/02/18 16:41:02 //英語/米国 setlocale(LC_ALL,'English_United States'); //Windows以外ではsetlocale(LC_ALL,'en_US') echo strftime('%c'); //2/18/2008 4:42:11 PM
「2008年02月18日」のように表示したい場合はどうすれば良いでしょうか。マニュアルのstrftimeの項を参考に、次のように書式を指定すれば実現できます(「%Y年%I月%d日」だとうまくいかないので文字参照を使いました。「月」はU+6708です)。
echo strftime('%Y年%m月%d日') //2008年02月18日
このようにコードに書式をそのまま書いてしまうと、日本語にしか対応できなくなってしまいます。これでは国際化になりません。