kicaj
kicaj

Reputation: 2968

CakePHP 2.x i18n route

There is some solution for using CakePHP route with params only when are not empty?

Now I code below, but I would like some better:

if(Configure::read('Config.language') !== 'en') { // en is default language
    $language = '/:language';
} else {
    $language = '';
}

Router::connect($language .'/'. __('register', true), array(
    'controller' => 'users',
    'action' => 'register'));

This code works perfectly, but I still must set language in AppHelper by url() method.

In older apps I was always duplicate Router::connect:

Router::connect('/:language/'. __('register', true), array(
    'controller' => 'users',
    'action' => 'register')); // for all languages without default language
Router::connect('/'. __('register', true), array(
    'controller' => 'users',
    'action' => 'register')); // only for default language (en)

Maybe there is simplest solutions?

Upvotes: 0

Views: 1785

Answers (2)

ADmad
ADmad

Reputation: 8100

You need to use 2 routes but add the 'persist' option for your language based routes. Adding 'persist' will avoid having to specify 'language' key each time when generating urls.

// for all languages without default language. 
Router::connect(
    '/:lang/'. __('register', true),
    array(
        'controller' => 'users', 
        'action' => 'register'
    ), 
    array(
        'persist' => array('lang')
    )
);

// only for default language (en)
Router::connect(
    '/'. __('register', true),
    array(
        'controller' => 'users', 
        'action' => 'register'
    )
); 

You might also want to checkout CakeDC's I18n plugin.

Upvotes: 4

kicaj
kicaj

Reputation: 2968

Ok, these things work better, but I still other problem.

I set default language by Configure::write('Config.language'); to en in bootstrap.php

Next i wrote shema for url like this:

Router::connect('/:language/'. __('register', true), array('controller' => 'users', 'action' => 'register'), array('persist' => array('lang')));
Router::connect('/'. __('register', true), array('controller' => 'users', 'action' => 'register')); 

And when users change language by beforeFilter in AppController (set new Config.language) will content from static .po and db worsk perfeclty, but links not translated. Parametr :language works but magic function __() in Router:connect() not works.

Because first loaded is bootstrap.php, next is router.php and last is AppController.php

My question is, how to force router.php to translate links (__())?

Sorry, but still learn english...

Upvotes: 0

Related Questions