У меня было несколько проблем с Zend_Locale и Zend_Translate, особенно с htmlentities. Но есть пара других странностей.
Во-первых, в документации Zend_Locale говорится:
Zend Framework позволяет использовать язык приложения. Вы
просто установите экземпляр Zend_Locale в реестр с ключом
'Zend_Locale. Тогда этот экземпляр будет использоваться во всех локал
классы Zend Framework
Похоже, что это не работает с Zend_Translate, я предполагаю, что Zend_Translate не является классом, ориентированным на локали, странно, что это не так, но нет большой проблемы, я просто должен был установить его явно. Ниже приведена функция initLocale () из моей начальной загрузки:
$session = new Zend_Session_Namespace();
// only if locale is explicitly set by user:
if(isset($_GET['locale']) && !empty($_GET['locale'])) {
$session->locale = $_GET['locale'];
}
$locale = isset($session->locale) ? $session->locale : 'auto';
try {
$zendLocale = new Zend_Locale($locale);
} catch (Zend_Locale_Exception $e) {
$zendLocale = new Zend_Locale('en_CA');
}
Zend_Registry::set('Zend_Locale', $zendLocale);
require_once(APPLICATION_PATH . '/languages/translation.php');
$translate = new Zend_Translate(array(
'adapter' => 'array',
'content' => $english,
'locale' => 'en'
));
$translate->addTranslation(array(
'content' => $french,
'locale' => 'fr'
));
$translate->setLocale($zendLocale->toString());
Zend_Registry::set('translate', $translate);
Как вы можете видеть здесь, я использую адаптер массива для Zend_Translate. Мои массивы определены в translation.php.
Аналогично Zend_Locale в документации к Zend_Form (http://framework.zend.com/manual/en/zend.form.i18n.html) говорит, что самый простой способ добавить переводы в Zend_Form - это установить объект Zend_Translate в реестре с ключом 'Zend_Translate' - легко, настроить это и любой из метки форм, сообщения об ошибках и т. д., имеющие соответствующий перевод в массивах, будут переведены автоматически. Проблема в том, что мои французские переводы имеют много ошибок. Я могу ошибаться, но я полагаю, что метод setLabel Zend_Form экранирует текст, поэтому мой сущности конвертируются дважды. Я попытался удалить все сущности из переводов, но это полностью не сработало и выдает пустой вывод.
У кого-нибудь есть идеи? Трудности в переводе кажутся насущной необходимостью, верно?
В настоящее время я не делаю этого автоматически, но я добавил в форму промежуточную функцию, которая выполняет следующие действия (где $ this -> _ translate - объект Zend_Translate):
private function getTranslation($str) {
return html_entity_decode($this->_translate->_($str), ENT_COMPAT, 'UTF-8');
}
Но это далеко не идеально, так как я должен обернуть все setLabel и errorMessage в этот первый, что-то вроде пропуска точки языкового стандарта и классов перевода Zend.