【问题标题】:Zend_Translate Strategy for a huge grown web siteZend_Translate 大型网站的翻译策略
【发布时间】:2012-05-22 13:45:08
【问题描述】:

因为我正在考虑一种处理翻译的好方法,所以我完成了部分实现,并朝着一个仍然不知道它是否好的概念前进,我想分享它并了解它的优缺点认为这是一个很好的探索点的人。

该架构适用于组件化站点,其翻译来自 Actions、Forms、Views、View_Helpers 甚至 Action_Helpers。

想法很简单:

Zend_Translate 将从每个组件的注册表中获取,并将接收__FILE__ 作为参数。由于它是在引导程序上使用“清除”初始化的,因此可以仅加载与此调用组件相对应的数组文件。当缺少翻译时,它们将被记录到数据库中(以避免日志重复)和/或被添加到剩余未翻译语言中的相应数组文件中(以及创建数组文件),其中它的值为空尚未设置。

我的猜测是,使用缓存和专门的翻译我可以忽略设置为 null 的翻译(通过之前的添加)而不再次记录它(仅显示键)它会在第一次调用大的未翻译页面,然后通过希望为用户提供的翻译过程的自动化获得性能以及可维护性和工作能力。

但在那之后,我发现我可以构建一个数组,其中包含每个组件中缺少的翻译,以便在请求端保存,这就是我的问题。

你们有没有这方面的经验可以帮助确定什么是最好的策略?

引导

protected function _initLocale() {
    $translateSession = new Zend_Session_Namespace('translate');
    $locale = isset($translateSession->locale) ? $translateSession->locale : 'auto';
    try {
        $zendLocale  = new Zend_Locale($locale);
    } catch (Zend_Locale_Exception $e) {
        $zendLocale = new Zend_Locale('en_US');
    }   
    Zend_Registry::set('Zend_Locale', $zendLocale);
    $translate = new Engine_Translate('customarray', array('clear'));
    $logger = Engine_Logger::getLogger();
    $translate->setOptions( array('log2db' => $logger ,'log' => $logger,  'logPriority' => Zend_Log::ALERT, 'logUntranslated' => true));
    Zend_Registry::set('Zend_Translate', $translate);
}

简单的库

function getAvailableTranslationLanguages() {
    return array("pt_BR"=>"Português","en_US"=>"Inglês");
}

function setTranslationLanguage($code) {
    $translateSession = new Zend_Session_Namespace('translate');
    $translateSession->locale = $code;
}

function getTranslator($file) {
    $relative = str_replace(APPLICATION_PATH, '', $file);
    $code = Zend_Registry::get('Zend_Locale');
    $path = APPLICATION_PATH . '\\lang\\' . $code . $relative;
    $translator = Zend_Registry::get('Zend_Translate');
    try {
        $translator->addTranslation($path, $code);
    } catch (Exception $e) {
        createTranslationFile($path);
    }
    return $translator;
}

function createTranslationFile($path) {
    if(!file_exists(dirname($path)))
        mkdir(dirname($path), 0777, true);
    $file = fopen($path, 'w');
    if($file) {
        $stringData = "<?php\n  return array(\n );";
        fwrite($file, $stringData);
        fclose($file);
    } else {
        $logger = Engine_Logger::getLogger();
        $logger->info(Engine_Logger::get_string('ERRO ao abrir arquivo de tradução: ' . $path));
    }   
}

用途

class App_Views_Helpers_Loginbox extends Zend_View_Helper_Abstract
{
    public function loginbox() {
        $translate = getTranslator(__FILE__);

翻译资源

【问题讨论】:

  • 对不起,我不明白(我猜你的英语很大程度上受你的母语影响),也许试着改写一下。

标签: zend-framework scalability zend-translate


【解决方案1】:

如果我理解正确,您想为每个动作助手/视图助手/等创建新的适配器。这是 IMO 错误并且非常无效。我会将翻译粘贴到 URL 上。为到处使用的翻译制作一个 common.php,为特定于模块的翻译制作一个 module.php,为特定于页面的翻译制作一个 page-name.php。然后array_merge他们一起在Bootstrap中创建一个适配器。然后在某处缓存它(使用 URL 作为缓存键) - 最好在内存中(=memcached,apc)。这样你就可以非常有效地从缓存中创建翻译适配器——只加载+反序列化。许多翻译(对于每个助手)意味着许多磁盘访问,意味着较低的速度和可扩展性,因为磁盘很快就会成为瓶颈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多