ソフトウェア国際化ツールWorld Wide Navi(ワールドワイドナビ)の国際化プログラミング参考情報から、PHPの国際化の抜粋その2です。
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[]; $lang = str_replace("-", "_", $lang); if(strpos($lang, "_")>0) { $ls = explode("_", $lang); if(count($ls)>1) $lang = $ls[] . "_" . strtoupper($ls[]); }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.poja_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を使うことで、より簡単に効果的になります。
最近のコメント