Языковые и языковые проблемы Zend Framework в форме с Zend_Locale, Zend_Translate и Zend_Form

У меня было несколько проблем с Zend_Locale и Zend_Translate, особенно с htmlentities. Но есть пара других странностей.

Во-первых, в документации Zend_Locale говорится:

Zend Framework позволяет использовать язык приложения. Вы просто устанавливаете экземпляр Zend_Locale в реестр с ключом 'Zend_Locale'. Затем этот экземпляр будет использоваться во всех языковых классах Zend Framework.

Похоже, что это не работает с Zend_Translate, я предполагаю, что Zend_Translate не является классом, "осведомленным о локали", странно, что это не так, но нет большой проблемы, я просто должен был установить его явно. Ниже приведена функция initLocale() из моей Bootstrap:

$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 ответ

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

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

Надеюсь, это поможет...

Другие вопросы по тегам