Языковые и языковые проблемы Zend Framework в форме с Zend_Locale, Zend_Translate и Zend_Form - PullRequest
1 голос
/ 11 августа 2011

У меня было несколько проблем с 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.

1 Ответ

0 голосов
/ 18 августа 2011

Я также использовал Zend_Translate вместе с адаптером массива, чтобы установить метки формы.Мне не нужно было кодировать какой-либо символ в виде сущностей HTML.Насколько я знаю, достаточно закодировать их как UTF-8.Итак, обертка, которую вы упоминаете, не обязательна.

Я просто добавляю Zend_Translate в реестр (с ключом 'Zend_Translate', иначе он не будет работать), передавая ключи перевода в setLabel) напрямую, и это работает.

Надеюсь, что помогает ...

...