Zend Framework 2 (ZF2) динамический языковой стандарт

Я ищу способ добавить переводы в мое приложение ZF2, используя глобальные переменные в моем URL. Есть ли способ сделать это для всего приложения сразу?

Типичный URL будет выглядеть следующим образом: http://domain.com/en_GB/user/index

Первая часть (en_GB) должна использоваться, чтобы показать правильный перевод.

Кроме того, было бы неплохо, если бы можно было установить эту часть маршрутизатора необязательно. Поэтому, если мне нужно перейти по http://domain.com/user/index (без языковой части) к моему приложению, оно должно автоматически принять языковой стандарт браузера.

Я надеюсь, что я достаточно ясно, если какие-либо дополнения к этому вопросу необходимы, не стесняйтесь спрашивать.

Спасибо заранее

2 ответа

@DrBeza,

Спасибо за ваш ответ. Я не знаю, если это правильный путь, но я создал следующее решение:

в /config/global.php я добавил эту часть

'translator' => array(
        'locale' => 'nl_NL',        
        'translation_file_patterns' => array(
            array(
                'type'     => 'phpArray',
                'base_dir' => __DIR__ . '/../../language',
                'pattern'  => '%s.php',
            ),
        ),
    ),

в /module/[modulename]/config/module.config.php я добавил эту часть, чтобы установить первую часть URL, содержащую локаль

'router' => array(
        'routes' => array(
            'user' => array(
                'options' => array(
                    'route'    => '[/:lang]/user[/:action][/:id]',
                    'constraints' => array(
                        'lang'  => '([a-z]{2})+(_)+([A-Z]{2})',
                    ),
                ),
            ),
        ),
    ),

в /config/local.php я добавил этот код, чтобы получить локаль из URL:

http://domain.com/[locale][module][controller]

$_SERVER['REQUEST_URI_PATH'] = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$segment = explode('/', $_SERVER['REQUEST_URI_PATH']);

И я добавил эту часть для динамической загрузки локали:

return array(
   'translator' => array(
   'locale' => $segment[1],
);

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

Затем создайте событие 'route' в начальной загрузке основного модуля, это событие сработает, как только будет найден маршрут. Вызванная функция обратного вызова будет иметь доступ к объекту RouteMatch через переданное событие, что позволит вам получить доступ к значению 'locale'. Затем вы можете сделать некоторые проверки и установить язык приложения.

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