PHP国際化プログラミング
gettextを使った国際化

PHPはgettextのメッセージ管理をサポートしているので、ユーザーロケールに基づいて、ラベルやメッセージのテキストを切り替えることができます。

以下は、World Wide NaviのPHPの文字列外部化のサンプルを使った、基本的なgettextのステップです。
  1. ローカライズする文字列をgettext関数に配置

    ローカライズしたい文字列をgettext関数(殆どの場合、'_()')内に配置します。
    これらの文字列は、各外部リソースファイルによってローカライズ(翻訳)されます。

    echo "Hello from PHP!"; -> echo _("Hello from PHP!");
    

  2. 初期化コードを記述

    ユーザーロケール(言語と地域)を適用し、リソースの名前とパスをgettextの仕組みに教えます。

    index.php (または他のphp)
    
    <?php require_once($_SERVER["DOCUMENT_ROOT"].'/gettext/wwnaviRs/' . 'wwnavi.gettext.php');?>
    // ロケールの設定およびgettextの読み込みのための初期化コードの実行
    ...
    echo _("Hello from PHP!");
    ...
    
    wwnavi.gettext.php // 初期化コード
    
    require_once('wwnaviLang.php');
    // 後に使う、言語と地域の配列
    
    $header = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
    // 言語情報を持った、ユーザーのHTTPヘッダーの取得
    
    $lang='';
    // HTTPヘッダーからロケールを解析
    // ロケールの表現は、各Webブラウザによって異なりますが('en'、'en-us'、'en_US'...)、
    // setlocaleの引数は、'language_REGION'である必要があります。
    if(strpos($header, ',')>0) {
        $hds = explode(',', $header);
        $lang = $hds[0];
        $lang = str_replace('-', '_', $lang);
        if(strpos($lang, '_')>0) {
            $ls = explode('_', $lang);        
            if(count($ls)>1) $lang = $ls[0] . '_' . strtoupper($ls[1]);        
        }else if(!empty($wwnaviLang[$lang])) {
            $lang .= '_' . $wwnaviLang[$lang]; 
            // 言語コード(例: 'en')のみの場合、地域コード(例: 'US')を、 
            // 予め定義された配列から追加します。setlocaleは、完全なロケール名を必要とするからです。
        }
    }
    //echo $lang . '
    '; //putenv("LC_ALL=$lang"); setlocale(LC_ALL, $lang); // $langは少なくとも、言語と地域(例:"en_US")である必要があります。 $domain = 'wwnaviBundle'; // gettextのリソース名とパスを教えます。 bindtextdomain($domain, dirname(__FILE__)); textdomain($domain); bind_textdomain_codeset($domain, 'UTF-8');
    wwnaviLang.php // 予め定義された、言語とデフォルトの地域のコードの配列
    
    $wwnaviLang = array(
    ...
    'de'=>'DE',
    'en'=>'US',
    'es'=>'ES',
    'et'=>'EE',
    'eu'=>'ES',
    'fa'=>'IR',
    'fi'=>'FI',
    'fo'=>'FO',
    'fr'=>'FR',
    ...
    'ja'=>'JP',
    ...
    

  3. gettextのマスターテンプレートリソース(.POT)の作成

    msgidとmsgstrのペアを持つ、マスターリソース(.pot)を、リソースパスの下に作成する必要があります。
    xgettextコマンドは、'_()'文字列をスキャンし、potファイルを作成するのに便利です。

    YOUR_DOCUMENT_ROOT/gettext/wwnaviRs/(*1)
     ... wwnaviBundle.pot(*1)
    
    *1)上記コードで指定されたものと同じディレクトリ
    
    wwnaviBundle.pot
    ...
    
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2012-03-05 17:32+0900\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    
    #: /...../examples/php/gettext/index.php:10
    msgid "Hello from PHP!"
    msgstr ""
    
    #: /...../examples/php/gettext/index.php:13
    msgid "This is a DIV text."
    msgstr ""
    ...
    
    #: /root/wwnavi/workspace/examples/php/gettext/sub/sub2/sub2.php:31
    #, php-format
    msgid "My local time is %c!"
    msgstr ""
    
    
    xgettext -j -L php  -k"_" --from-code=UTF-8 -o /..../examples/php/gettext/wwnaviRs/wwnaviBundle.pot  \ 
       /..../examples/php/gettext/index.php
    
    

  4. .POTを各言語リソース(.PO)にローカライズ

    マスターテンプレートを、対象ロケールのディレクトリ(LOCALE(例:'ja_JP')/LC_MESSAGES)に、.poファイルとしてコピーし、msgstrを翻訳します。

    日本語への翻訳の場合
    
    YOUR_DOCUMENT_ROOT/gettext/wwnaviRs/ja_JP/LC_MESSAGES
     ... wwnaviBundle.po
    
    
    ja_JP/LC_MESSAGES/wwnaviBundle.po
    ...
    
    #, fuzzy
    msgid ""
    msgstr ""
    "Project-Id-Version: PACKAGE VERSION\n"
    "Report-Msgid-Bugs-To: \n"
    "POT-Creation-Date: 2012-03-05 17:32+0900\n"
    "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    "Language-Team: LANGUAGE <LL@li.org>\n"
    "MIME-Version: 1.0\n"
    "Content-Type: text/plain; charset=UTF-8\n"
    "Content-Transfer-Encoding: 8bit\n"
    
    #: /...../examples/php/gettext/index.php:10
    msgid "Hello from PHP!"
    msgstr "PHPからこんにちは!"
    
    #: /...../examples/php/gettext/index.php:13
    msgid "This is a DIV text."
    msgstr "これはDIVのテキストです。"
    ...
    
    #: /root/wwnavi/workspace/examples/php/gettext/sub/sub2/sub2.php:31
    #, php-format
    msgid "My local time is %c!"
    msgstr "わたしの現地時間は%cです!"
    
    
    ***注意: '%c'のようなフォーマット文字を修正(翻訳)してはいけません。

  5. .POを.MO(リソースバイナリ)にコンパイル

    msgfmtコマンドを実行し、リソースバイナリ(.mo)を対象ロケールディレクトリに作成します。

    msgfmt -o wwnaviBundle.mo wwnaviBundle.po
    
    
    これで、ブラウザの言語設定を変更しながら、英語と日本語のメッセージを切り替えられるようになります。

これらの処理は、World Wide Navi内のPHPの文字列外部化のサンプルで確認できます。

POT/POのローカリゼーションのプロセスは、ローカリゼーションツールSisulizerを使うことで、より簡単に効果的になります。

国際化プログラミングトップへ


Copyright (C) 2012 Kokusaika JP, Inc.
本ドキュメントを無断で転載および引用することを禁じます。