Zend переводит URL и переключатель языка

Мне удалось сделать мой URL-адрес i18n совместимым с помощью Zend_Controller_Router.

То есть: en/user/login становится fr/utilisateur/connexion, и оба URL ведут к одному и тому же controller/action.

Проблема, с которой я столкнулся, заключается в следующем

У меня есть переключатель языка, который отображается следующим образом:

Français
English
Italiano
etc.

Текущий активный язык не имеет тега anchor, но все остальные имеют.

Для языков, на которых есть anchor, я создаю URL-адрес и хочу, чтобы они были переведены на их конкретные языки.

В настоящее время, если я нахожусь в French, все URL-адреса строятся на французском языке, даже если я устанавливаю ключ @local в качестве параметра в помощнике просмотра URL (tried "@locale" => 'en', "@locale" => new Zend_Locale('en'))

en/utilisateur/connexion
it/utilisateur/connexion

вместо

en/user/login
it/utente/collegamento

потому что локаль, используемая при построении URL-адреса, определяется для всего приложения.

ИЗМЕНИТЬ

Я копнул немного глубже в своей проблеме и обнаружил, что только текущая локаль добавляет загруженные ресурсы, что означает, что я не могу получить маршрут на правильном языке, чтобы маршрут был построен на правильном языке.

Моя новая проблема: как мне загрузить ресурсы для перевода на несколько языков?

(Я планирую внедрить кеш в далеком будущем (ближе к выпуску), так что я могу добиться лучшей производительности)


person JF Dion    schedule 20.01.2012    source источник
comment
Это странно. Я делаю то же самое, и это работает. Вы указываете маршрут?   -  person Aurelio De Rosa    schedule 23.01.2012
comment
@Aurelio De Rosa: да, я указываю маршрут, который будет использоваться. Обновленный вопрос, чтобы указать проблему, которую я получаю сейчас   -  person JF Dion    schedule 23.01.2012


Ответы (1)


Надеюсь, это поможет с новой проблемой.

"Моя новая проблема: как загрузить ресурсы для перевода на несколько языков?"

Небольшое предупреждение: я не писал приведенный ниже код, он был взят из примера приложения, созданного ребятами из Zend, однако его разбивка может помочь.

Их подход к примеру приложения заключался в использовании CSV-файла, содержащего переводы, и использовании вашего конфигурационного файла (по умолчанию в новом проекте — application.ini), чтобы указать путь ко всем вашим языковым ресурсам перевода.

нравится:

;; Languages
language.file.en = APPLICATION_PATH "/../language/en/translate.csv"
language.file.fr = APPLICATION_PATH "/../language/fr/translate.csv"
language.file.de = APPLICATION_PATH "/../language/de/translate.csv"
language.file.es = APPLICATION_PATH "/../language/es/translate.csv"
language.name.zz = Language
language.name.en = English
language.name.fr = Français
language.name.de = Deutsche
language.name.es = Español

И в каждом CSV-файле, если вы используете для его создания что-то вроде Excel или Open Office, столбец A будет исходным языком, а столбец B — переводом.

В качестве примера, когда английский язык является исходным языком и требуется испанский перевод:

A       B
login   entrar
logout  salir

Вы можете сделать это для всех слов/фраз, которые хотите перевести. Если перевод не найден, используется исходное слово по умолчанию.

Начальная загрузка вашего основного приложения может иметь что-то вроде этого:

protected function _initLanguage()
{
    $options = $this->getOptions();
    Zend_Registry::set('language',$options['language']);
    $langSess = new Zend_Session_Namespace('language');
    if (!isset($langSess->translate)) {
        $translate = new Zend_Translate('csv', $options['language']['file']['en']);
        $langSess->translate = $translate;
    }
    if (!isset($langSess->locale)) {
        $langSess->locale = 'en';
    }
    Zend_Locale::setDefault($langSess->locale);
} 

Поскольку объект перевода хранится в сеансе, вы можете использовать его в любом из ваших представлений и т. д., используя что-то вроде:

$langSess = new Zend_Session_Namespace('language');
$translate = $langSess->translate;

и:

<a href="/user/login"> <?php echo $translate->_('login') ?> </a>

где вы хотите, чтобы что-то было переведено при выборе альтернативного языка. В приведенном выше примере слово login будет отображаться при выборе английского языка и entrar при выборе испанского языка.

В Zend_Translate есть гораздо больше возможностей, чем это, и несколько способов его реализации, поэтому я ни в коем случае не говорю, что это лучший способ.

Если это поможет или если я могу дать вам больше информации, дайте мне знать.

Ваше здоровье,

Дэйв

person dkcwd    schedule 26.01.2012
comment
Привет, Джефф, надеюсь, ты в порядке. У вас все заработало и помогло ли это вам? Всего наилучшего, Дэйв :-D - person dkcwd; 10.02.2012