Source for file Ethna_I18N.php
Documentation is available at Ethna_I18N.php
// vim: foldmethod=marker
* @author Masaki Fujimoto <fujimoto@php.net>
* @license http://www.opensource.org/licenses/bsd-license.php The BSD License
* @version $Id: a4970c99c631424c24bc55392c1186a3cb033a02 $
// {{{ mbstring enabled check
* メッセージカタログからロケールに適合するメッセージを取得します。
* Ethna_I18N#get のショートカットです。
* @param string $message メッセージ
* @return string ロケールに適合するメッセージ
$i18n =
& $ctl->getI18N();
return $i18n->get($message);
* @author Masaki Fujimoto <fujimoto@php.net>
/** @var Ethna_Controller コントローラーオブジェクト */
/** @var bool gettextフラグ */
/** @var string プロジェクトのロケールディレクトリ */
/** @var string アプリケーションID */
/** @var string システム側エンコーディング */
/** @var string クライアント側エンコーディング */
/** @var mixed Ethna独自のメッセージカタログ */
/** @var mixed ロガーオブジェクト */
* @param string $locale_dir プロジェクトのロケールディレクトリ
* @param string $appid アプリケーションID
$this->locale_dir =
$locale_dir;
$this->use_gettext =
$config->get('use_gettext') ?
true :
false;
if ($this->use_gettext ===
true
$this->logger->log(LOG_WARNING,
"You specify to use gettext in ${appid}/etc/${appid}-ini.php, "
.
"but gettext extension was not installed !!!"
$this->messages =
false; // not initialized yet.
* タイムゾーンを設定する PHP 5.1.0 以前では
* @param string $timezone タイムゾーン名(e.x Asia/Tokyo)
* @see http://www.php.net/manual/ja/timezones.php
// date.timezone 設定は PHP 5.1.0 以降でのみ
ini_set('date.timezone', $timezone);
* @param string $locale ロケール名(e.x ja_JP, en_US 等)
* (ll_cc の形式。ll = 言語コード cc = 国コード)
* @param string $systemencoding システムエンコーディング名
* @param string $clientencoding クライアントエンコーディング名
* (=テンプレートのエンコーディングと考えてよい)
* @see http://www.gnu.org/software/gettext/manual/html_node/Locale-Names.html
function setLanguage($locale, $systemencoding =
null, $clientencoding =
null)
setlocale(LC_ALL, $locale .
($systemencoding !==
null ?
"." .
$systemencoding :
""));
if ($this->use_gettext) {
$this->systemencoding =
$systemencoding;
$this->clientencoding =
$clientencoding;
if (!$this->use_gettext) {
$this->messages =
$this->_makeEthnaMsgCatalog();
* メッセージカタログからロケールに適合するメッセージを取得する
* @param string $msg メッセージ
* @return string ロケールに適合するメッセージ
if ($this->use_gettext) {
// [appid]/locale/[locale_name]/LC_MESSAGES/[locale].mo から
// 返される。エンコーディング変換はgettext任せである
if ($this->messages ===
false) {
$this->messages =
$this->_makeEthnaMsgCatalog();
// [appid]/locale/[locale_name]/LC_MESSAGES/*.ini から
if (isset
($this->messages[$msg]) &&
!empty($this->messages[$msg])) {
$ret_message =
$this->messages[$msg];
// convert message in case $client_encoding
// @see Ethna_Controller#_getDefaultLanguage
if (strcasecmp($this->clientencoding, 'UTF-8') !==
0) {
* Ethna独自のメッセージカタログを読み込んで生成する
* 1. [appid]/locale/[locale_name]/LC_MESSAGES/*.ini
* 2. Ethnaが吐くメッセージカタログファイル名は ethna_sysmsg.ini とし、
* skel化して ETHNA_HOME/skel/locale/[locale_name]/ethna_sysmsg.ini に置く
* 3. "ethna i18n" コマンドでは、1. のファイルとプロジェクトファイル
* 内の _et('xxxx') を全て走査し、メッセージカタログを作る。gettext を利用
* 4. ethna_sysmsg.ini は単純な ini ファイル形式とし、
* "msgid" = "translation" の形式とする。エンコーディングは一律 UTF-8
* @return array 読み込んだメッセージカタログ。失敗した場合は空の配列
function _makeEthnaMsgCatalog()
// Ethna_I18N#setLanguage を呼び出さず
// このメソッドを呼び出すと、ロケール名が空になる
// その場合は Ethna_Controller の設定を補う
if (empty($this->locale)) {
list
($this->locale, $sys_enc, $cli_enc) =
$this->ctl->getLanguage();
// ロケールディレクトリが存在しない場合は、E_NOTICEを出し、
// デフォルトの skelton ファイルを使う
$msg_dir =
sprintf("%s/%s/LC_MESSAGES", $this->locale_dir, $this->locale);
$this->logger->log(LOG_NOTICE,
"Message directory was not found!! : $msg_dir,"
.
" Use skelton file Instead");
// localeディレクトリ内のファイルを読み込み、parseする
while (($file =
readdir($msg_dh)) !==
false) {
$msg_file =
sprintf("%s/%s", $msg_dir, $file);
* Ethna独自のメッセージカタログをparseする
* @param string メッセージカタログファイル名
* @return array 読み込んだメッセージカタログ。失敗した場合は空の配列
// ファイルフォーマットは ini ファイルライクだが、
// parse_ini_file 関数は使わない。
// キーに含められないキーワードや文字があるため。
// e.x yes, no {}|&~![() 等
// @see http://www.php.net/manual/en/function.parse-ini-file.php
if ($contents ===
false) {
$in_translation_line =
false; // 翻訳行をパース中か否か
$before_is_quote =
false; // 直前の文字がクォート文字(\)か否か
$equal_op =
0; // 等値演算子の数
$is_end =
false; // 終了フラグ
foreach ($contents as $idx =>
$line) {
// ホワイトスペースを除いた上で、それと看做される行も無視する
$ltrimed_line =
ltrim($line);
if ($in_translation_line ==
false
for ($pos =
0; $pos <
$length; $pos++
) {
if ($in_translation_line ==
false &&
$pos ==
0) {
$in_translation_line =
true; // 翻訳行開始
continue 2; // switch 文を抜けるのではなく、
$before_is_quote =
false;
if ($quote ==
1 ||
$quote ==
3) {
$before_is_quote =
false;
$in_translation_line =
false; // 翻訳行終了
} elseif ($equal_op !=
1 ||
$quote !=
4) {
// 終わっているが、valid な翻訳行でない場合
$this->logger->log(LOG_WARNING,
"invalid message catalog in {$file}, line " .
($idx +
1)
$messages[$msgid] =
$msgstr;
$in_translation_line =
false;
$before_is_quote =
false;
Documentation generated on Fri, 11 Nov 2011 03:59:46 +0900 by phpDocumentor 1.4.3