Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

I18Nv2による日時と通貨・数値の表記国際化

PEARライブラリ活用 (2)

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/04/02 14:00

本稿では、PEAR::I18Nv2を用いて、日時と通貨・数値の表記を国際化・地域化する方法を紹介します。閲覧者のロケールごとに表示言語を切り替える、「国際化」対応のWebアプリケーションをPHPで作成するのに役立ちます。

目次

はじめに

 ネットサーフィンをしていると、海外のサイトにも関わらず、ページが日本語で表示されることがあります。そのサイトが日本語のページしか持っていないということは多分ありません。閲覧者が日本人だと推測して、日本語のページを返しているのです。

 静的なWebページの場合には、日本語のページと英語のページといった具合に、対応したい言語ごとに別々のページを用意して、何らかの方法で表示するページを切り替えます。

 動的なページの場合に同じ方法を採るのは現実的ではありません。日本語のWebアプリケーション(以下、Webアプリ)と、英語のWebアプリを別々に開発するのはとても面倒です。そこで、ロケール(言語や地域)に依存する部分だけを置き換えられるようにWebアプリを開発することになります。このことをWebアプリの「国際化」と言います。英語ではinternationalizationですが、長いのでI18Nと書かれるのがふつうです。国際化されたソフトウェアを、実際に特定のロケールで使えるようにすることを「地域化」(localization, L10N)と言います。

 本稿では、PEAR::I18Nv2を用いて、日時と通貨・数値の表記を国際化・地域化する方法を紹介します。

編注
 「I18N」「L10N」は、それぞれ最初と最後の文字、および省略した間の文字数を表しています。

対象読者

  • 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日

 このようにコードに書式をそのまま書いてしまうと、日本語にしか対応できなくなってしまいます。これでは国際化になりません。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 矢吹 太朗(ヤブキ タロウ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2012年2月時点での登録メンバは37名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:PEARライブラリ活用

もっと読む

おすすめ記事

All contents copyright © 2006-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5