Yii / Multi Language: Model & View

83 views
Skip to first unread message

Ricardo

unread,
Sep 5, 2013, 12:09:50 AM9/5/13
to yii-framew...@googlegroups.com

Olá Pessoal,

Quais são as melhores práticas para estruturar o banco de dados em multi idiomas?
Estou perdido, por onde devo começar? Alguém conhece alguns link?

Fazer tradução internas dos textos não é problema,
O que eu não sei é, como vou fazer o save, update, delete de cada idioma.. Exemplo: A notícia XY terá apenas inglês.. e a outra somente português.. e maioria dos casos inglês e português.. Porém a categoria terá: inglês e português obrigatoriamente... Sabendo disso, como vou lidar com a estrutura do banco? Qual seria a melhor prática no model?.. E depois como farei as view? (como será o processo de validação??.. e outros desafios que terei..)


Wayre Avelar

unread,
Sep 5, 2013, 4:52:50 AM9/5/13
to yii-framew...@googlegroups.com
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.     "





 W a y r e    A v e l a r
 way...@gmail.com / Tel. (11) 97546-6012








--
YFB - Yii Framework Brasil
04/2011: Anexos de até 250kb foram autorizados pelos membros da lista. Use com moderação.
---
You received this message because you are subscribed to the Google Groups "YFB - Yii Framework Brasil" group.
To unsubscribe from this group and stop receiving emails from it, send an email to yii-framework-br...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/yii-framework-brasil/6f38deb6-2e96-4acd-b19b-f725edad9b80%40googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Ricardo

unread,
Sep 6, 2013, 8:22:36 PM9/6/13
to yii-framew...@googlegroups.com
Obrigado, está me ajudando muito.
Assim que tiver o aplicativo pronto, vou postar como fiz.
Reply all
Reply to author
Forward
0 new messages