Ricardo uma vez alguém estava falando sobre isso aqui no grupo. Eu salvei aqui no meu evernote e talvez te ajude um pouco.
Pessoalmente nunca precisei fazer nada com idiomas. Isso é apenas um copy/past do sue foi falado na época e agora nem sei qual a origem…
Agradecimentos ao autor desconhecido. kkk…
" Vou dar uma ajudinha pra trabalhar com linguagem, vou postar só meu ponto de vista.
Eu particularmente, eu crio 1 tabela que vai se chamar idiomas/linguagem. Nela você cadastra o ID, Nome da Linguagem, ISO(pt-br,en,es).
E para cada módulo você relaciona com o ID da Linguagem. Assim fica mais flexivel para remover ou adicionar nova linguagem.
Ae em cada módulo você adiciona um <select> que será o relacionamento para a linguagem.
Primeira coisa, cria as três bandeiras ou os três links:
<?php echo CHtml::link('Português', url('index/language', array('language' => 'pt_br'))); ?>
<?php echo CHtml::link('Inglês', url('index/language', array('language' => 'en'))); ?>
<?php echo CHtml::link('Espanhol', url('index/language', array('language' => 'es'))); ?>
Feito isso, define a linguagem padrão do projeto no config/main.php
return array(
[...]
'language' => 'pt_br',
'sourceLanguage' => 'pt_br',
[...]
);
Agora aqui segue o IndexController ou SiteController:
class IndexController extends Controller {
public function actionLanguage($language) {
if (isset($language) && !empty($language)) {
Yii::app()->language = $language;
Yii::app()->session['_language'] = Yii::app()->language;
} else if (isset(Yii::app()->session['_linguagem'])) {
Yii::app()->session->destroy();
}
$this->redirect(array('index'));
}
}
O ISO que foi criado na tabela de idioma/linguagem, serve para definir qual linguagem usar, assim o Yii acessa as pasta corretas que ficarão em /protected/message/(pt_br|en|es)/app.php.
Ai tem texto fixos no site, você usa o Yii::t('app', 'Título'), e nos demais arquivos, você cria um array com as chaves(key) em Português, e os valores traduzido para o idioma. Como feito no post acima.
Se você tiver usando a função init() nos Controller, e capaz de você perder a sessão, ou se você ta querendo usar o setLocale() para traduzir dias de semana, meses das funções PHP, tem a solução.
Primeiro a função que será usada, você pode criar um Helper desta função.
function setLocalidade($lang){
if($lang == 'pt_br'){
setlocale(LC_ALL, "pt_BR", "ptb");
} else if($lang == 'es'){
setlocale(LC_ALL, "esp", "pt");
} else if($lang == 'en'){
setlocale(LC_ALL, "en", "us");
}
}
Caos você esteja perdendo a seção quando está acessando outro controller:
/protected/components/Controller.php
public function init() {
if (isset($_GET['language']) && !empty($_GET['language'])) {
Yii::app()->language = $_GET['language'];
Yii::app()->session['_language'] = Yii::app()->language;
} else if (isset(Yii::app()->session['_language']) && !empty(Yii::app()->session['_language'])){
Yii::app()->language = Yii::app()->session['_language'];
} else if (empty(Yii::app()->session['_language']) && is_null(Yii::app()->session['_language'])){
Yii::app()->session['_language'] = Yii::app()->language;
}
setLocalidade(Yii::app()->language);
}
Observação que o colega Vinicius Bertoldi indicou, que no primeiro acesso você sugere que o cliente escolha o idioma, e ao invés de salva em sessão, você pode salvar me cookies, quando o cliente retornar novamente, já vai está na linguagem correta, mais deixa os links para outros idioma dando opção para ele mudar.
Se não fico muito claro, bota pra rodar, posta o erro e os problemas. "