【问题标题】:Zend_Translate & Zend_Cache standaloneZend_Translate 和 Zend_Cache 独立
【发布时间】:2012-05-02 13:36:17
【问题描述】:

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

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

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

现在,按照Zend_Translate 的文档,我将相同的$cache 对象设置为我的Zend_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 是否在图片中添加任何内容,或者我可以像我一样只加载所有翻译吗?

谢谢!

【问题讨论】:

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


    【解决方案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 创建的.

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 请对投反对票的原因发表评论。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2016-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多