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'. Затем вы можете сделать некоторые проверки и установить язык приложения.