私は良い方法で翻訳を処理することを考えているので、実装の一部を行い、それが良いかどうかまだわからないコンセプトに向かって進んでいるので、それを共有して、考える人と長所と短所を得たいと思います探索するのに適したポイントです。
このアーキテクチャは、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__);
翻訳リソース