2012-05-15 41 views
2

因爲我想在一個很好的方式來處理翻譯做了一個實施的一部分,並走向一個概念,仍然不知道它是否好,我想分享它和將它的優點和缺點與認爲這是一個很好的探索點的人分享。Zend_Translate策略爲一個巨大的成長網站

該體系結構旨在在組件化站點中運行,翻譯源自Actions,Forms,Views,View_Helpers甚至Action_Helpers。

的ideis很簡單:

了Zend_Framework將在從註冊表中的每個組件得到,並會收到__FILE__作爲參數。由於它是在引導程序中用'clear'初始化的,因此只能加載與此調用組件對應的數組文件。當遇到缺失的翻譯時,他們將被記錄到數據庫(以避免重複記錄)和/或被添加到相應的數組文件中,其餘未翻譯的語言(以及創建數組文件)尚未設置。

我的猜測是,使用緩存和專門翻譯我可以忽略設置爲空的翻譯(通過之前添加)而無需再次記錄(顯示在關鍵字中),它會花費一點點費用一個大型的未分頁頁面,然後通過自動化想要爲用戶提供的翻譯過程獲得性能以及可維護性和工作能力。

但之後,我發現我可以構建一個數組,每個組件都有一個缺失的轉換,以便在請求結束時保存,這就是我的問題。

如果你們有這方面的經驗,可以幫助確定什麼是最佳策略?

引導

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__); 

翻譯資源

enter image description here

+0

對不起,我不明白(你的英語很受你的母語的影響,我想),也許試着重新來一遍。 –

回答

0

如果我理解正確,您希望爲每個操作助手/視圖助手/等創建新的適配器。這是IMO錯誤,並且非常無效。我會將翻譯貼到網址上。爲每個地方使用的翻譯製作一個common.php,module.php用於模塊特定,page-name.php用於頁面特定翻譯。然後array_merge將它們放在一起並在Bootstrap中創建一個適配器。然後將其緩存(使用URL作爲緩存鍵) - 在內存中優先使用(= memcached,apc)。這樣你就可以非常有效地從緩存創建翻譯適配器 - 只需加載+反序列化。許多翻譯(針對每個幫手)意味着許多光盤訪問,意味着較低的速度和可擴展性,因爲光盤很快就會成爲瓶頸。