Tweet
|
ローカライズしたい文字列をgettext関数(殆どの場合、'_()')内に配置します。
これらの文字列は、各外部リソースファイルによってローカライズ(翻訳)されます。
echo "Hello from PHP!"; -> echo _("Hello from PHP!");
ユーザーロケール(言語と地域)を適用し、リソースの名前とパスを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', ...
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
マスターテンプレートを、対象ロケールのディレクトリ(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'のようなフォーマット文字を修正(翻訳)してはいけません。
msgfmtコマンドを実行し、リソースバイナリ(.mo)を対象ロケールディレクトリに作成します。
msgfmt -o wwnaviBundle.mo wwnaviBundle.po
これで、ブラウザの言語設定を変更しながら、英語と日本語のメッセージを切り替えられるようになります。