SIstema Multi-Linguagem

Boa Tarde Galera, bom primeiramente sou novato no Yii e peço a ajuda de vocês.

estou desenvolvendo uma aplicação em Yii que necessita ser multi-linguagem. Porém o banco de dados já está desenhado e os termos de todos os idiomas são estão armazenados em duas tabelas: Uma que lista a linguagem outra que lista os termos relacionados a esta linguagem.

Qual a melhor maneira de fazer um sistema multi-linguagem baseado em banco de dados? Dei uma olhada em toda a documentação relacionada e não conseguí achar nenhum exemplo satisfatório :confused:

desde já agradeço a ajuda.

Postaram recentemente uma wiki explicando como usar o banco de dados para alterar de linguagem.

http://www.yiiframework.com/wiki/210/multilanguage-web-site-controlling-by-get-request-and-database-allowed-languages/

tambem pode usar uma extensão que fiz

http://www.yiiframework.com/extension/translate/

Se tiver alguma duvida de como usar, sinta-se à vontade para perguntar

Newerton, o Yii me retornou o seguinte erro:

Declaration of Controller::beforeAction() should be compatible with that of CController::beforeAction()

o erro acima já corrígí. O método beforeAction estava sobre escrito de forma errada, a maneira correta:

	protected function beforeAction($action){


		Controller::processUrl();


		return true;


	}

agora estou com outros erros. Assim que eu conseguir resolver ( ou não :stuck_out_tongue_winking_eye: ) posto aqui novamente.

Agora todas as páginas estão dando “not found”. Provavelmente é algo haver com o htaccess, pois após as configurações sugeridas pelo newerton o método urlprocessor acrescentou ‘en’ antes da chamada das paginas na url.

Algúme tem alguma luz de como resolver? ;/

Bom conseguí resolver. a url está gerando normalmente com o tipo de linguagem puxando da tabela tbl_languages.

Porém ainda estou confuso em como criar uma tabela com os termos pra cada idioma e setar no yii para ler esta tabela e substituir os termos.

any light? ;[

Bom dia , eu sou novo com o yii e gostava de fazer uma aplicação multi-língua que me sugerem que use ?

Obrigado

Boa Tarde Pedro. Eu fui o autor desse tópico, e extensão recomendada não atendia totalmente minhas necessidades.

Por isso criei uma solução explicarei aqui resumidamente, espero que te ajude:

Crie duas tabelas em seu banco de dados (Caso haja necessidade de mais campos, sinta-se livre)

Primeira Tabela chamada Idiomas, e outra chamada termos.

Estrutura da Tabela Idiomas:




CREATE TABLE IF NOT EXISTS `idiomas` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

  `lang` varchar(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

  `flagpath` varchar(40) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,

  `active` tinyint(1) NOT NULL,

  `main` tinyint(1) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;



Tabela Termos:




CREATE TABLE IF NOT EXISTS `Termos` (

  `id` int(11) NOT NULL AUTO_INCREMENT,

  `rotulo` varchar(60) NOT NULL,

  `conteudo` varchar(155) NOT NULL,

  `id_idiomas` int(11) NOT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;



Crie sua FK para essa tabelas e voilá, estrutura das tabelas prontas. No meu caso acrescentei um campo para armzenar o idioma (id) escolhido pelo meu usuário.

Após isso, criei uma model ( Você pode usar o gii para isso ) para a tabela idiomas. Após isso criei um método dentro desta model para recuperar os termos para o idioma escolhido pelo usuário durante o cadastro:




    public static function Termos(){

    	

    	if(!empty(Yii::app()->user->id)){	


    		$Sets = Yii::app()->db->createCommand(' SELECT id_idiomas FROM Administradores WHERE id = '."'".Yii::app()->user->id."'")->queryRow();

    		$Termos = Yii::app()->db->createCommand(' SELECT * FROM Termos WHERE id_idiomas = ' . $Sets['id_idiomas'] )->queryAll();

    

    	}else{

    	

    	 	

    		$Idiomas = Lang::carregaIdiomas($html=false);

    		

    		if(!empty($Idiomas)){	

    		

    			foreach($Idiomas AS $idioma){

    			

    				if($idioma['main'] == 1){

    				

    					 $idIdioma = $idioma['id'];

    				

    				}

    			

    			}

    		

    			$Termos = Yii::app()->db->createCommand(' SELECT * FROM Termos WHERE id_idiomas = ' . $idIdioma )->queryAll();

    		

    		}

      	

    	}

    	foreach($Termos AS $Termo){

    		

    		

    		$Palavras[$Termo['rotulo']] = $Termo['conteudo']; 

    		

    		

    	}

    	

    	return $Palavras;

    	

    }



Pronto. com está função. seto na configuração ao usuário se logar no sistema, uma session que armazena o dioma padrão (caso o idioma escolhido não exista, é apresentado o padrão).

Esta foi a solução que dei. tomara que sirva de base para você achar sua própria solução para o seu caso. =)

Olá leg0l

Poderia me dizer o porque a extensão não serviu para seu caso ? Assim, posso melhorar ela deixando mais abrangente

Obrigado

Gustavo

Leg0l,

Vou dar uma explicação meio por cima, e que no momento ainda não estou trabalhando com sistema de multi-linguagem.

Usando o wiki que te enviei e a tabela ‘tbl_languages’. Tu pode fazer o seguinte, se até o momento está funcionando deixa assim.

Lendo o wiki vi que o init() do Controller, defini/seta a linguagem que será usada, caso não tenha nenhuma, ela pega a padrão que é onde está no config/main.php.

Se deseja usar o Yii::t(), tu pode fazer assim.


Yii::t('exemplo', 'Clients');

So um pequeno detalhe, vamos pegar por exemplo as linguagens (en e pt_br), você vai precisar criar 1 pasta /messages/pt_br com 1 arquivo que vai se chamar exemplo.php.

exemplo.php (pt_br)

return array (

‘Clients’ => ‘Clientes’,

);

O resto o próprio framework da conta.

Caso eu me equivoquei em alguma explicação me corrija.