Zend_Translate& Zend_Cache独立

时间:2012-05-02 13:36:17

标签: php zend-framework zend-translate zend-cache

我正在尝试在PHP项目中添加Zend_Translate,使用Zend组件作为独立库。

我已经使用以下方法为多个项目使用缓存:

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

现在,按照Zend_Translate的文档,我使用$cacheZend_Translate对象设置为setCache,然后才真正创建对象:

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 个答案:

答案 0 :(得分: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");

好的,您已准备好使用Zend_Cache。内部的Zend_Translate实例将涵盖所有缓存。

问题#3 。 addTranslation()只是添加新的翻译源,你可以将它们传递给构造函数(你的情况)。

尝试在将缓存传递给Zend_Translate之前为缓存设置“cache_id_prefix”,这将帮助您确定问题是否出现在代码“...”中的某个位置,或者在每个页面加载时创建的新缓存由Zend Translate创建

答案 1 :(得分:-1)

如果我没记错的话,Zend_Translate中的Zend_Cache用法有点用词不当。我认为它的作用是通过设置翻译器的选项来减少目录扫描和语言环境设置,而不是翻译字符串本身的结果。