MCAsite 0 Denunciar post Postado Setembro 23, 2011 Pessoal estou metendo a mao na massa tentando adaptar um sistema simples multilinguagem em mysql, mas não estou conseguindo fazer funcionar a funcao. Minha Base Mysql: -- -- Estrutura da tabela `idiomas` -- CREATE TABLE IF NOT EXISTS `idiomas` ( `textKey` varchar(50) NOT NULL, `textValue_pt` text NOT NULL, `textValue_es` text NOT NULL, `textValue_it` text NOT NULL, `lastUpdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`textKey`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Extraindo dados da tabela `idiomas` -- INSERT INTO `idiomas` (`textKey`, `textValue_pt`, `textValue_es`, `textValue_it`, `lastUpdate`) VALUES ('article', 'O texto em portugues', 'O texto em espanhol', 'O texto em italiano', '2011-09-20 17:27:30'); Arquivo index.php p/ buscar o idioma no BD <?php //crio uma sessao session_start(); if ($_GET["idioma"]) { $_SESSION["idioma"]=$_GET["idioma"]; } elseif (!$_SESSION["idioma"]) { $_SESSION["idioma"]="pt"; } //conecto ao bd $hostname = "localhost"; $database = "sitetranslation"; $username = "root"; $password = "vertrigo"; $conec = mysql_connect($hostname, $username, $password) or die(mysql_error()); $bd = mysql_select_db($database, $conec); //busco o idioma da sessao $SESSAO = ($_SESSION["idioma"]); //funcao para buscar os textos no idioma da sessao function getText($textKey) { $strQuery = mysql_query("SELECT textValue_$SESSAO FROM idiomas WHERE textKey='$textKey'"); $myrow = mysql_fetch_array($strQuery); return $myrow["textValue_$SESSAO"]; } echo "<p><a href='index.php?idioma=pt'>Portugues</a></p>"; echo "<p><a href='index.php?idioma=es'>Espanhol</a></p>"; echo "<p><a href='index.php?idioma=it'>Italiano</a></p>"; //envia p/ a funcao o registro a busca o idioma e retorna o texto echo getText("article"); ?> Tentei mas ta dando o seguinte erro: Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\Program Files\VertrigoServ\www\Traducoes\getLanguage\index.php on line 25 Experimentei retirar a function, e ai a busca funciona perfeitamente Mas, quero fazer a function getText () (ou outra forma se alguem souber) para que a busca me mostre a linha buscada no meu BD referente ao idioma da sessao, ou seja, nos echo irei informar: me mostra o texto do BD na linha article o campo textValue. Entao a ideia é inserir no BD todos os textos um em cada linha. No exemplo inseri no BD apenas o "article" mas irei inserir mais linhas. Se alguém estiver disposto em ajudar, desde já agradeço muito Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Setembro 24, 2011 Faz assim .. $strQuery = mysql_query("SELECT textValue_$SESSAO FROM idiomas WHERE textKey='$textKey'") or die( mysql_error() ) ; Tive uma idéia meio maluca aqui, afinal .. só fiz pra mandar pra você, veja se interessa .. sua tabela está muito esquisita, eu digo, se você precisar de mais linguagens, você tem que alterar os campos, então, vamos mudar isso aí !, eu fiz dessa forma Assim você pode ter várias linguagens, apenas registrando o nome e a abreviação. Então, temos a outra tabela, 'words' Aqui que está a mágica do negócio, você tem o id da linguagem, e o id da palavra, esse id da palavra, é a tradução para uma das palavras cadastradas com esse mesmo ID, mas ai é que tá, com um pouco de lógica, você fica sabendo qual é a linguagem de X palavra, então vamos lá <?php /** * Copyright (C) 2011-2012 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * @filesource Translate.php * @license General Public License * @package Translator * @version 1.0.0 * @copyright (C)2011 - 2012 */ class Translator { /** * Armazena um objeto que permite o acesso * e a execução de querys no banco de dados * @var MySQLi Object() */ static private $db; /** * Recupera / Cria uma nova instância do MySQLi * @return MySQLi Object() */ public function __construct(){ if( ( $this->getMySQLi() ) ) $this->db = new MySQLi( 'localhost' , 'root' , 'senha' , 'nome do banco de dados' ); return $this->getMySQLi(); } /** * Recupera uma instância do MySQLi * @return MySQLi Object() */ public function getMySQLi(){ return ( Object ) $this->db; } /** * Traduz uma string * @param String $word * @param String $to * @return Array|Bolean */ public function translate( $word , $to ) { $query = $this->getMySQLi()->prepare( ' SELECT `w`.`word`, `languages`.`language`, `languages`.`abbreviation` FROM `words` LEFT JOIN `words` AS `w` ON `words`.`idWord` = `w`.`idWord` RIGHT JOIN `languages` ON `w`.idLang = `languages`.`idLang` WHERE `words`.`word` LIKE ? AND `abbreviation` = ?' ); $query->bind_param( 'ss' , $word , $to ); $query->execute(); $query->bind_result( $word , $language , $abbreviation ); $query->store_result(); if( $query->num_rows() ){ while( $query->fetch() ) { $Translate[] = Array( $word , $language , $abbreviation ); } return $Translate; } else { return false; } } /** * Recupera todas as linguagens no banco de dados * @return Array */ public function getLanguages(){ $query = $this->getMySQLi()->query( 'SELECT * FROM `languages`' ); while( $data = $query->fetch_assoc() ) { $dados[] = $data; } return $dados; } } Tenho o objeto acima, então, basta utilizar o translate que ele vai fazer todo o serviço pra você, veja um exemplo. <?php $Translator = new Translator(); print_r( $Translator->translate( 'fish' , 'pt_BR' ) ); print_r( $Translator->translate( 'mão', 'en_US' ) ); Saída: Array ( [0] => Array ( [0] => Peixe [1] => Português [2] => pt_BR ) ) Array ( [0] => Array ( [0] => Hand [1] => English [2] => en_US ) ) Assim, você pode ter inúmeras traduções para uma linguagem em uma palavra .. não é fácil !?!?!? O outro método 'getLanguages' recupera a lista de linguagens disponíveis, não da palavra, mas generalizado. Exemplo: <?php $Translator = new Translator(); print_r( $Translator->getLanguages() ); Saída: Array ( [0] => Array ( [idLang] => 1 [language] => Português [abbreviation] => pt_BR ) [1] => Array ( [idLang] => 2 [language] => English [abbreviation] => en_US ) ) Então, segue o dump sql das tabelas. -- -- Estrutura da tabela `languages` -- DROP TABLE IF EXISTS `languages`; CREATE TABLE IF NOT EXISTS `languages` ( `idLang` int(11) NOT NULL AUTO_INCREMENT, `language` varchar(18) NOT NULL, `abbreviation` char(5) DEFAULT NULL, PRIMARY KEY (`idLang`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; -- -- Extraindo dados da tabela `languages` -- INSERT INTO `languages` (`idLang`, `language`, `abbreviation`) VALUES (1, 'Português', 'pt_BR'), (2, 'English', 'en_US'); -- -------------------------------------------------------- -- -- Estrutura da tabela `words` -- DROP TABLE IF EXISTS `words`; CREATE TABLE IF NOT EXISTS `words` ( `idLang` int(11) DEFAULT NULL, `idWord` int(11) NOT NULL, `word` varchar(48) NOT NULL, KEY `idWord` (`idWord`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Extraindo dados da tabela `words` -- INSERT INTO `words` (`idLang`, `idWord`, `word`) VALUES (1, 1, 'Peixe'), (2, 1, 'Fish'), (2, 2, 'Hand'), (1, 2, 'Mão'); ;) Compartilhar este post Link para o post Compartilhar em outros sites
MCAsite 0 Denunciar post Postado Setembro 26, 2011 Valeu pela ajuda. Gostei do codigo, que por sinal ficou bem complexo. Fiz em apenas uma tabela, pois nao ha a intensao de fazer em + idiomas, mas de qualquer forma irei usar seu codigo, vai que o cara daki 1 ano me pede + 1 idioma ai to ferrado. Com seu codigo facilita muito. Compartilhar este post Link para o post Compartilhar em outros sites
Andrey Knupp Vital 136 Denunciar post Postado Setembro 26, 2011 Essa é a idéia, nunca sabemos quando vamos ter que fazer uma alteração no sistema, já que podemos fazer dessa forma, na qual possibilita várias linguagens ou uma nova linguagem há ser adicionada a qualquer momento, fica melhor assim, até mesmo porque, está bem eficiente desta forma, dê uma estudada no código e na SQL que você rapidinho vai entender a lógica aplicada. Abraços. ;) Compartilhar este post Link para o post Compartilhar em outros sites
Ph3i 0 Denunciar post Postado Maio 31, 2015 Andrey... Esse seu código ficou muito top e é muito próximo ao que eu estou precisando. Você poderia me tirar uma dúvida? dentro da página que eu quero traduzir a palavra fisch, por exemplo, como eu tenho que escrever em PHP para imprimir a palavra peixe e não o Arrey? <p><?php print_r($Translator->translate('fish','pt_BR')); ?></p> A saída é o arrey Array ( [0] => Array ( [0] => Peixe [1] => Portugues [2] => pt_BR ) ) e eu preciso que saia apenas a palavra peixe Peixe Realmente não sei como fazer, estudei a lógica mas não consigo entender. Se puder me ajuda serei grato. Compartilhar este post Link para o post Compartilhar em outros sites