CakePHP - как перевести текущий URL после смены языка и перезагрузки таблицы маршрутизации - PullRequest
5 голосов
/ 01 августа 2011

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

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

Короче говоря: у нас был случайный действительный URL-адрес торта на одном языке, и нам пришлось перевести его на соответствующий URL-адрес на другом языке.

Моя таблица маршрутизации:

if( 'en' == Configure::read('Config.language') ) {
    Router::connect('/help',   array('controller' => 'pages', 'action' => 'display', 'help') );
} else {
    Router::connect('/pomoc',   array('controller' => 'pages', 'action' => 'display', 'help') );
}

Язык, изменяющий действие:

function lang($lang) {

    // getting previous url table
    $url = $this->referer();
    $url = Router::parse($url);

    // changing language
    if( in_array($lang, Configure::read('Languages.valid') ) ) {
        $this->Session->write('Language', $lang);
        Configure::write('Config.language', $lang);
    }

    // saving base params
    $requestInfo = array(Router::getParams(), Router::getPaths());
    // reload routing table
    Router::reload();
    include(CONFIGS.'routes.php');
    // restore base params
    Router::setRequestInfo($requestInfo);

    // fix for 'pass' params
    if(!empty($url['pass']) && is_array($url['pass'])) {
        $url = array_merge($url, $url['pass']);
        unset($url['pass']);
    }
    $this->redirect($url);
}

О ключе 'pass' в таблице URL:

/pages/display/help

после Router ::parse (), параметр извлекается:

pass => array(
    0 => 'help'
)

и более поздние возвращаемые значения из Router :: url () выглядят так:

/pages/display/pass:Array

, поэтому я должен исправить это, объединив 'передать значение со всем массивом и удалить ключ

Ответы [ 2 ]

0 голосов
/ 10 марта 2014

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

В маршрутах .php p1 определяет статическую страницу (одинаковую для всех языков), может быть любая строкауникальным образом идентифицирующим страницу.

Router::connect('/:language/p1/:translation',   array(
    'controller' => 'pages',
    'action' => 'display',
    'help',
    'options' => array('language' => '[a-zA-Z]{2}')
) );

По вашему мнению,

$this->Html->link('Click me', array(
    'language'    => Configure::read('Config.language'),
    'controller'  => 'pages',
    'action'      => 'display',
    'help',
    'translation' => __('help') // could be any string in fact
));

сгенерирует ссылку на /en/p1/help на английском языке, иначе на /xx/p1/pomoc.

Injectionlanguage параметр в каждую ссылку можно сделать в AppHelper::url() вместо предоставления его в каждом случае ссылки.

Если вы хотите перенаправить в контроллере:

$this->redirect(array(
    'language'    => Configure::read('Config.language'),
    'controller'  => 'pages',
    'action'      => 'display',
    'help',
    'translation' => __('help')
));
0 голосов
/ 01 августа 2011

У меня есть мой route.php, как это

Configure::write('Config.language', $_SESSION['lang']);
Router::connect(__('/help',true),   array('controller' => 'pages', 'action' => 'display', 'help') );

, поэтому я использую __() для перевода URL. Он ищет перевод в po-файлах. И в вашей функции lang() после изменения сеанса на текущий язык все, что вам нужно сделать, это:

$this->redirect(__('/help'));

Надеюсь, это поможет

...