Добавьте языковой параметр в URL в Zend Framework

0

У меня есть сайт в 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);

    }

благодаря

Теги:
zend-framework

2 ответа

0

Вы должны добавить язык в качестве параметра в свой маршрут (ы). Вот пример: http://devzone.zend.com/1765/chaining-language-with-default-route/

  • 0
    Спасибо, я увидел предоставленную вами ссылку, но я не использую языковые маршруты, потому что я управляю языком с помощью cookie, мне просто нужно изменить URL. Можете ли вы дать мне больше помощи.
  • 0
    ... управление языком с помощью ... что?
Показать ещё 3 комментария
-2

Вам нужна функция для выбора пользователем языка и языка по умолчанию, который используется, если пользователь только начинает с 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
    );
}

Удачи вам в вашем проекте, надеюсь, что это поможет вам и другим!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню