Zend translate URL и переключатель языка - PullRequest
0 голосов
/ 21 января 2012

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

Т.е.: en/user/login становится fr/utilisateur/connexion, и оба URL-адреса переходят на один и тот же controller / action.

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

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

Français
English
Italiano
etc.

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

Для языков, на которых есть 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-адреса используется языковой стандарт, определенный для всего приложения.

EDIT

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

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

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

1 Ответ

1 голос
/ 26 января 2012

Надеюсь, это поможет в новом выпуске.

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

Просто быстрое предостережение о том, что я не написал код ниже, оно было взято из примера приложения, собранного ребятами из 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);
} 

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

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

и

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

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

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

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

Приветствия

Дейв

...