У меня есть сайт в zend framework. Теперь я делаю сайт на нескольких языках. Для этого мне нужно изменить URL.
Например, если sitename - www.example.com, то я хочу сделать это как
www.example.com/ch
www.example.com/fr
Там может быть какая-то работа, чтобы вы могли попросить меня создать имя папки ch и поместить в нее копию кода. Но для этого мне приходится управлять несколькими папками при обновлении файлов на сервере.
Каков наилучший или правильный способ сделать это?
Мой код маршрута
public function _initRouter() {
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$routes = array(
'page' => new Zend_Controller_Router_Route('page/:slug', array('controller' => 'staticpage', 'action' => 'page', 'slug' => ''))
);
$router->addRoutes($routes);
}
благодаря
Вы должны добавить язык в качестве параметра в свой маршрут (ы). Вот пример: http://devzone.zend.com/1765/chaining-language-with-default-route/
Вам нужна функция для выбора пользователем языка и языка по умолчанию, который используется, если пользователь только начинает с example.com.
Вы можете получить текущий браузер и заголовок заголовка из HTTP-запроса пользователей.
Взгляните на Zend_Locale и Zend_Translate.
Вы можете использовать что-то вроде $ locale = new Zend_Locale ("браузер"); для обнаружения языка браузера пользователей.
Затем посмотрите, доступен ли Zend_Translate или ваш движок перевода, и установите его в файл cookie или сеанс, чтобы сохранить дату.
Если пользователь затем перейдет на какой-либо сайт смены языка, например example.com/?language=en, вы можете установить локаль на основе выбора пользователя и перепроверять, если это возможно в ваших переводах.
Если нет, вернитесь к исходному языку по умолчанию и представите страницу с ошибкой или что-то в этом роде.
Если вы хотите, чтобы ваши URL-адреса Zend_Router были зависимыми от языка, что может быть плохим выбором из-за скопирования, обратных ссылок или сообщений на ваших страницах, вам нужно добавить что-то перед каждым маршрутом.
В моих Приложениях я использую что-то вроде следующего в моем основном файле bootstrap.php. Я отрезал некоторые части, чтобы это было просто.
protected function _initTranslate() {
$session = new Zend_Session_Namespace("globals");
// Get current registry
$registry = Zend_Registry::getInstance();
/**
* Set application wide source string language
* i.e. $this->translate('Hallo ich bin ein deutscher String!');
*/
if(!$session->current_language) {
try {
$locale = new Zend_Locale('browser'); //detect browser language
}
catch (Zend_Locale_Exception $e) {
//FIXME: get from db or application.ini
$locale = new Zend_Locale('en_GB'); //use the default language
}
}
else {
$locale = new Zend_Locale($session->current_language);
}
$translate = new Zend_Translate(
array(
'adapter' => 'array',
'content' => realpath(APPLICATION_PATH . '/../data/i18n/'),
'locale' => $locale,
'scan' => Zend_Translate::LOCALE_DIRECTORY,
'reload' => false,
'disableNotices' => true, //dont get exception if language is not available
'logUntranslated' => false //log untranslated values
)
);
if(!$translate->isAvailable($locale->getLanguage())) {
$locale = new Zend_Locale('en_GB'); //default
}
$translate->setLocale($locale);
$session->current_language = $locale->getLanguage();
//Set validation messages
Zend_Validate_Abstract::setDefaultTranslator($translate);
//Max lenght of Zend_Form Error Messages (truncated with ... ending)
Zend_Validate::setMessageLength(100);
//Zend_Form Validation messages get translated into the user language
Zend_Form::setDefaultTranslator($translate);
/**
* Both of these registry keys are magical and makes do automagical things.
*/
$registry->set('Zend_Locale', $locale);
$registry->set('Zend_Translate', $translate);
return $translate;
}
Это для настройки перевода по умолчанию для каждого посетителя.
Чтобы установить язык пользователя в зависимости от некоторых параметров HTTP, я решил создать плагин, который будет запускаться по каждому запросу, посмотреть, установлен ли параметр глобального языка (key = _language) и попробовать установить новый язык.
Затем я перенаправляю пользователя на новый маршрут, в зависимости от его выбора.
Итак, если пользователь нажмет на ссылку для английского языка (example.com/de/test/123?_language=en), он будет перенаправлен на example.com/en/test/123.
class Application_Plugin_Translate extends Core_Controller_Plugin_Abstract {
public function preDispatch(Zend_Controller_Request_Abstract $request) {
$frontController = Zend_Controller_Front::getInstance();
// Get the registry object (global vars)
$registry = Zend_Registry::getInstance();
// Get our translate object from registry (set in bootstrap)
$translate = $registry->get('Zend_Translate');
// Get our locale object from registry (set in bootstrap)
$locale = $registry->get('Zend_Locale');
// Create Session block and save the current_language
$session = new Zend_Session_Namespace('globals');
//get the current language param from request object ($_REQUEST)
$language = $request->getParam('_language',$session->current_language);
// see if a language file is available for translate (scan auto)
if($translate->isAvailable($language)) {
//update global locale
$locale = $registry->get('Zend_Locale');
$locale->setLocale($language);
$registry->set('Zend_Locale', $locale);
//update global translate
$translate = $registry->get('Zend_Translate');
$translate->setLocale($locale);
$registry->set('Zend_Translate', $translate);
//language changed
if($language!=$session->current_language) {
//update session
$session->current_language = $language;
$redirector = new Zend_Controller_Action_Helper_Redirector;
$redirector->gotoRouteAndExit(array());
}
}
else {
$request->setParam('_language', '');
unset($session->current_language);
$redirector = new Zend_Controller_Action_Helper_Redirector;
$redirector->gotoRouteAndExit(array());
}
}
}
И, наконец, чтобы подготовить свой маршрутизатор к новым языковым маршрутам, вам необходимо настроить базовый язык и связать маршруты на другом языке.
public function _initRouter() {
$frontController = Zend_Controller_Front::getInstance();
$router = $frontController->getRouter();
$languageRoute = new Zend_Controller_Router_Route(
':language',
array(
'language' => "de"
),
array('language' => '[a-z]{2}')
);
$defaultRoute = new Zend_Controller_Router_Route(
':@controller/:@action/*',
array(
'module' => 'default',
'controller' => 'index',
'action' => 'index'
)
);
$router->addRoute(
'default',
$defaultRoute
);
$languageDefaultRoute = $languageRoute->chain($defaultRoute);
$router->addRoute(
'language',
$languageDefaultRoute
);
}
Удачи вам в вашем проекте, надеюсь, что это поможет вам и другим!