0

Zend_TranslateZend コンポーネントをスタンドアロン ライブラリとして使用して、PHP プロジェクトを追加しようとしています。

次の方法を使用して、すでにいくつかのアイテムにキャッシュを使用しています。

$cache = Zend_Cache::factory( ...
if (!($obj = $cache->load('OBJ')))
{
  $obj = ...
  $cache->save($obj);
}

のドキュメントに従って、実際にオブジェクトを作成する前に、Zend_Translate同じ$cacheオブジェクトを myに設定します。Zend_TranslatesetCache

Zend_Translate::setCache($cache);
$translate = new Zend_Translate(
  array(
    'adapter' => 'gettext',
    'content' => 'languages',
     null,
     array('scan' => Zend_Translate::LOCALE_FILENAME)
  )
);

そのため、ここでは、全体Zend_Translateをキャッシュに入れるという通常の方法から離れています。現時点での全体的な結果は次のとおりです。

// 1.php

ob_start();
session_start();

$cache = Zend_Cache::factory( ...
if (!($obj = $cache->load('OBJ')))
{
  $obj = ...
  $cache->save($obj);
}

Zend_Translate::setCache($cache);
$translate = new Zend_Translate(
  array(
    'adapter' => 'gettext',
    'content' => 'languages',
    null,
    array('scan' => Zend_Translate::LOCALE_FILENAME)
  )
);

echo $translate->_("Hello, I'm the first script");

// end 1.php

// 2.php

ob_start();
session_start();

$cache = Zend_Cache::factory( ...
if (!($obj = $cache->load('OBJ')))
{
  $obj = ...
  $cache->save($obj);
}

Zend_Translate::setCache($cache);
$translate = new Zend_Translate(
  array(
    'adapter' => 'gettext',
    'content' => 'languages',
    null,
    array('scan' => Zend_Translate::LOCALE_FILENAME)
  )
);

echo $translate->_("Hello, I'm the second script");

// end 2.php

ページをロードするたびにキャッシュファイルが作成されることがわかっているため、このアプローチは機能しません。

不思議なんだけど:

  1. Zend_Cache::factoryすべてのページで呼び出す必要があると仮定するのは正しいですか?
  2. このスタンドアロンの状況で翻訳をキャッシュで動作させるにはどうすればよいですか?
  3. についての質問Zend_Translate:addTranslation写真に何か追加できますか、それとも私のようにすべての翻訳をロードできますか?

ありがとうございました!

4

2 に答える 2

1

質問 #1 はい。ページをロードするたびに Zend_Cache::factory を呼び出す必要があります。しかし、すでに Zend_Cache を使用している場合は、Zend_Translate の新しいインスタンスを作成する代わりに、必要に応じてそれを再利用できます。

質問#2。Zend Translate + Zend Cache をスタンドアロン コンポーネントとして使用することに違いはありません。このような小さなスクリプトでスタンドアロン コンポーネントとして使用する方法を次に示します。

// Init application
define('APP_PATH',      realpath(dirname(__FILE__)));
define('APP_DATA',  APP_PATH . '/lang');
define('APP_CACHE',     APP_PATH . '/tmp');

require_once 'Zend/Translate.php';
require_once 'Zend/Cache.php';

// initialize cache
$cache = Zend_Cache::factory(
      'Core'
        , 'File'
        , array(
              'caching'     => true
            , 'lifetime'    => 900
            , 'automatic_serialization' => true
            , 'automatic_cleaning_factor'   => 20
            , 'cache_id_prefix'             => 'Translate'
            )
        , array(
              'hashed_directory_level' => 0
            , 'cache_dir'   => APP_CACHE
        )
    );

// Setup translation object
Zend_Translate::setCache($cache);
$translate = new Zend_Translate('tmx', APP_DATA . '/general.tmx');

echo $translate->_("Hello, I'm the second script");

OK、Zend_Cache を使用する準備が整いました。すべてのキャッシュは Zend_Translate インスタンス自体によって内部的にカバーされます。

質問#3。addTranslation() は新しい翻訳ソースを追加するだけで、代わりにコンストラクターに渡すことができます(あなたの場合)。

キャッシュを Zend_Translate に渡す前に「cache_id_prefix」を設定してみてください。これにより、コードのどこかで問題が発生したかどうかを判断するのに役立ちます。

于 2012-05-03T13:29:43.143 に答える
-1

私の記憶が正しければ、Zend_Translate での Zend_Cache の使用法は少し間違った呼び名です。翻訳文字列自体の結果ではなく、Translator のオプションを設定することで、ディレクトリのスキャンとロケールの設定を減らすことができると思います。

于 2012-05-02T15:28:39.117 に答える