Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

MCAsite

Criando sistema Multilinguagem PHP / MYSQL

Recommended Posts

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

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

6d55dac536dd4828ae8cf7b.png

 

Assim você pode ter várias linguagens, apenas registrando o nome e a abreviação.

Então, temos a outra tabela, 'words'

baf4f1ab19494b7898d5b35.png

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

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.