I was just doing this. Have a look at Jason Chow's p28n article if you
haven't already. It's not perfectly complete (it wasn't for me) but
it's a great start. Here's some of what I've recently done with it.
http://bakery.cakephp.org/articles/view/p28n-the-top-to-bottom-persistent-internationalization-tutorial
class P28nController extends AppController {
var $name = 'P28n';
var $uses = array();
var $components = array('P28n');
function change($lang = null) {
$this->P28n->change($lang);
$this->redirect($this->referer(null, true));
}
function shuntRequest() {
$this->P28n->change($this->params['lang']);
$args = func_get_args();
$this->redirect('/' . implode('/', $args));
}
}
My routes.php includes the following:
Router::connect('/lang/*', array('controller' => 'p28n', 'action' => 'change'));
Router::connect('/en/*', array(
'controller' => 'p28n',
'action' => 'shuntRequest',
'lang' => 'en'
));
Router::connect('/fr/*', array(
'controller' => 'p28n',
'action' => 'shuntRequest',
'lang' => 'fr'
));
Router::connect('/es/*', array(
'controller' => 'p28n',
'action' => 'shuntRequest',
'lang' => 'es'
));
I could also collapse the last 3 into:
Router::connect('/:lang/*', array(
'controller' => 'p28n',
'action' => 'shuntRequest',
'lang' => '[a-z]{2}'
));
So, any two-character leader to a URL would be treated as a language code.
The P28NController passes the $lang to the P28NComponent, which tells
the rest of your app what language to be using, then redirects to the
rest of the URL.
Or, if the URL is like "/lang/en" it will just change the lang in the
session and redirect back to the current page.
class P28nComponent extends Object
{
var $components = array('Session', 'Cookie');
var $controller;
function startup(&$controller)
{
$this->controller = $controller;
if (!$this->Session->check('Config.language'))
{
$this->change(($this->Cookie->read('lang') ?
$this->Cookie->read('lang') : DEFAULT_LANGUAGE));
}
}
function init(&$controller)
{
$this->controller = $controller;
}
function change($lang = null)
{
if (!empty($lang))
{
$this->Session->write('Config.language', $lang);
$this->Cookie->write('lang', $lang, false, '+350 day');
}
}
}
Make sure to specify a default language in bootstrap.php:
define('DEFAULT_LANGUAGE', 'en');
My app requires access to the two-letter code in various places
because I have database tables like:
CREATE TABLE regions (
id serial NOT NULL PRIMARY KEY,
name_en VARCHAR(24) NOT NULL,
name_fr VARCHAR(24) NOT NULL,
name_es VARCHAR(24) NOT NULL
);
I'm also using the i18n tables but the above format is all legacy
stuff that works well enough for me (and I don't forsee adding any
other languages to the site).
Some of my AppController:
class AppController extends Controller
{
var $components = array('p28n', 'Session');
var $lang;
function __construct()
{
parent::__construct();
$this->setLang(DEFAULT_LANGUAGE);
}
function beforeFilter()
{
$this->setLang($this->Session->read('Config.language'));
}
/**
* make language code available to all controllers and views
*/
function setLang($lang)
{
$this->lang = $lang;
$this->set('lang', $lang);
}
function appendLang($str)
{
return $str . $this->lang;
}
}
So, now I can do things like:
$this->Member->Region->displayField = $this->appendLang('name_');
$this->set('regions', $this->Member->Region->find('list'));
And my regions are ready for a select list in the correct language.
Now, if you want to have URLs in different laguages, like:
/artists/...
/artistes/...
/artistas/...
I'm very interested in what you come up with. My current plan is to
create routes for all of them and I can't say I'm pleased at the
prospect. I think I'll need to do something like:
Router::connect('/:artists/:display/:artist_slug', array('controller'
=> 'artists', 'action' => 'display'),
array(
'artists' => '[artists|artistes|artistas]',
'display' => '[display|montrez|mostrar]',
'artist_slug' => '[-_a-zA-Z]+'
)
);
But I only just got all of the other stuff figured out last night and
so haven't tried this route yet. If there's a better way, I'm all
ears.
On Tue, Mar 25, 2008 at 4:47 AM, Jacob <[EMAIL PROTECTED]> wrote:
>
> Hello all,
>
> I need a multi language site with cakephp. Ok, this topic is discuss
> commonly. But I need a friendly-url solution, something's like:
>http://mywebsite.com/lang/controller/v