因为我正在思考以一种好的方式来处理翻译,所以我做了部分实施,并走向了一个仍然不知道它是否好的概念,我想与某人分享它并了解它的优点和缺点认为这是一个值得探索的好点。
该架构旨在在组件化站点中工作,并具有来自 Actions、Forms、Views、View_Helpers 甚至 Action_Helpers 的翻译。
想法很简单:
Zend_Translate 将从每个组件的注册表中获取,并将接收
__FILE__
作为参数。由于它是在引导程序上使用“clear”初始化的,因此可以仅加载与此调用组件相对应的数组文件。当遇到缺失的翻译时,它们将被记录到数据库中(以避免日志重复)和/或添加到剩余未翻译语言的相应数组文件中(以及创建数组文件),并在其所在位置为空值尚未设定。
我的猜测是,使用缓存和专门化翻译,我可以忽略设置为 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__);
翻译资源
如果我理解正确的话,你想为每个动作助手/视图助手/等创建新的适配器。在我看来这是错误的并且非常无效。我会将翻译粘贴到 URL 上。为到处使用的翻译创建一个 common.php,为特定于模块的翻译创建一个 module.php,为特定于页面的翻译创建一个 page-name.php。然后
array_merge
将它们组合在一起并在 Bootstrap 中创建一个适配器。然后将其缓存(使用 URL 作为缓存键)某处 - 最好是在内存中(=memcached、apc)。这样您就可以非常有效地从缓存创建转换适配器 - 仅加载+反序列化。许多翻译(对于每个助手)意味着许多磁盘访问,意味着较低的速度和可扩展性,因为磁盘很快就会成为瓶颈。