2

私は良い方法で翻訳を処理することを考えているので、実装の一部を行い、それが良いかどうかまだわからないコンセプトに向かって進んでいるので、それを共有して、考える人と長所と短所を得たいと思います探索するのに適したポイントです。

このアーキテクチャは、Actions、Forms、Views、View_Helpers、さらには Action_Helpers からの翻訳を含むコンポーネント化されたサイトで機能することを意図しています。

アイデアは簡単です:

Zend_Translate は、すべてのコンポーネントでレジストリから取得し、パラメータとして受け取り__FILE__ます。ブートストラップで 'clear' で初期化されているため、この呼び出しコンポーネントに対応する配列ファイルだけをロードできます。欠落している翻訳については、(ログの重複を避けるために) データベースに記録されるか、残りの翻訳されていない言語の対応する配列ファイルに追加されます (配列ファイルが作成されます)。まだ設定されていません。

私の推測では、キャッシュを使用して Translate を特殊化すると、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__);

翻訳リソース

ここに画像の説明を入力

4

1 に答える 1

0

私の理解が正しければ、アクション ヘルパー/ビュー ヘルパーなどごとに新しいアダプターを作成する必要があります。これは IMO の誤りであり、非常に効果的ではありません。翻訳を URL に貼り付けます。どこでも使用される翻訳用の common.php、モジュール固有のモジュール用の module.php、およびページ固有の翻訳用の page-name.php を作成します。次にarray_merge、それらをまとめて、Bootstrap で 1 つのアダプターを作成します。次に、(URL をキャッシュ キーとして使用して) どこかにキャッシュします - できればメモリ (=memcached, apc) にキャッシュします。そうすれば、キャッシュから変換アダプターを非常に効果的に作成できます-ロード+シリアル化解除のみです。多くの変換 (各ヘルパーの) は、多くのディスク アクセスを意味し、ディスクがすぐにボトルネックになるため、速度とスケーラビリティが低下します。

于 2012-05-18T21:24:07.080 に答える