<pedrocorreia.net ⁄>
corner
<mySearch ⁄> <mySearch ⁄>

corner
 
corner
<mySnippets order="rand" ⁄> <mySnippets order="rand" ⁄>

corner
 
corner
<myContacts ⁄> <myContacts ⁄>

<email ⁄>


pc@pedrocorreia.net

<windows live messenger ⁄>


pedrojacorreia@hotmail.com

<myCurriculum type="pdf" ⁄>


Download
corner
 
corner
<myBlog show="last" ⁄> <myBlog show="last" ⁄>

corner
 
corner
<myNews show="rand" ⁄> <myNews show="rand" ⁄>

corner
 
corner
<myNews type="cat" ⁄> <myNews type="cat" ⁄>

corner
 
corner
<myQuote order="random" ⁄> <myQuote order="random" ⁄>

corner
 
corner
<myPhoto order="random" ⁄> <myPhoto order="random" ⁄>

<pedrocorreia.net ⁄>
corner
 
corner
<myAdSense ⁄> <myAdSense ⁄>

corner
 
corner
<myVisitorsMap ⁄> <myVisitorsMap ⁄>

corner
 
 

<Um simples sistema de idiomas ⁄ >




clicks: 9609 9609 2008-05-22 2008-05-22 goto mySnippets mySnippets php  Download  Bookmark This Bookmark This



Num mercado cada vez mais global, fazer com que o nosso serviço chegue a um leque maior de pessoas, torna-se muito importante, geralmente a barreira neste caso será a linguistica, podemos ser uma empresa Portuguesa, mas se também um dos nossos publicos alvo se encontrar além-fronteiras, torna-se obviamente importante que essa barreira seja facilmente ultrapassável, como? Bem tornando o nosso site multilingue.

A finalidade deste snippet é tentar exemplificar uma implementação desse sistema, tornar o nosso site facilmente customizável pela linguagem.

Podemos inclusivé detectar o pais pelo IP do visitante e então reencaminhá-lo directamente para a página respectiva ao provável idioma do nosso visitante (por ex. é provável que um visitante com um IP Nipónico, seja Japonês, mas claro que não será uma verdade absoluta, pois poderá ser uma pessoa de outra nacionalidade) mas tal não será exemplificado neste snippet :)



Vamos supor que temos uma BD com várias tabelas e nessas tabelas é armazenado o conteúdo do nosso site, e em cada tabela teremos um número de campos igual ao número de idiomas suportado pela nossa aplicação; a nossa aplicação irá buscar o campo especifico da linguagem selecionada, ou seja, se estiver com o idioma inglês, só o campo da tabela que contém o idioma inglês será lido, e por ai adiante.



Esta será a nossa estrutura SQL de exemplo:

  1. -- Table "dados_linguagem" DDL
  2.  
  3. CREATE TABLE `dados_linguagem` (
  4. `id` tinyint(4) UNSIGNED NOT NULL AUTO_INCREMENT,
  5. `txt_pt` varchar(255) character SET latin1 NOT NULL DEFAULT '',
  6. `txt_en` varchar(255) character SET latin1 NOT NULL DEFAULT '',
  7. `txt_jp` varchar(255) character SET latin1 NOT NULL DEFAULT '',
  8. `txt_fr` varchar(255) character SET latin1 NOT NULL DEFAULT '',
  9. `txt_es` varchar(255) character SET latin1 NOT NULL DEFAULT '',
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  12.  
  13. -- Insert Statment --
  14.  
  15. INSERT INTO dados_linguagem
  16. (id, txt_pt, txt_en, txt_jp, txt_fr, txt_es)
  17. VALUES(
  18. 1,
  19. "O Lorem Ipsum é texto aleatório da indústria tipográfica e de impressão. O Lorem Ipsum tem vindo a ser o texto standard usado por estas indústrias desde o ano de 1500, quando uma misturou os caracteres de um texto para criar um espécime de livro...",
  20. "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book...",
  21. "Domo arigatou gozaimasu! ^_^''",
  22. "Le Lorem Ipsum est simplement du faux texte employé dans la composition et la mise en page avant impression. Le Lorem Ipsum est le faux texte standard de l'imprimerie depuis les années 1500, quand un peintre anonyme assembla ensemble des morceaux de ...",
  23. "Lorem Ipsum es simplemente el texto de relleno de las imprentas y archivos de texto. Lorem Ipsum ha sido el texto de relleno estándar de las industrias desde el año 1500, cuando un impresor (N. del T. persona que se dedica a la imprenta) desconocido..."
  24. );
  25.  
  26.  



Como se pode observar, existem vários campos com o prefixo "txt_", cada uma será um idioma suportado.

- style.css;

  1. *{padding: 0; margin: 0;}
  2.  
  3. body{
  4. font-family: Verdana, Tahoma, Arial, sans-serif;font-size: 62.5%;
  5. color: #000;background: #fff;text-align: justify;margin-top: .5em;
  6. }
  7. div#container{
  8. margin: 0 auto;
  9. width: 40em;
  10. padding: .8em;
  11. border: solid 0.6em #3F4C6B;
  12. overflow: auto;
  13. }
  14. div#flags{
  15. text-align: right;
  16. padding: .4em;
  17. border: solid 0.4em #6BBA70;
  18. float: right;
  19. }
  20.  
  21. span, strong{font-size: 1.1em;color: #D01F3C;}
  22. strong{color: #356AA0 !important; font-weight: 900;}
  23.  
  24. a{text-decoration: none;outline: 0;}
  25.  
  26. img.flag{width: 1.6em; height: 1.1em;border: solid .2em #6BBA70;}
  27. img.selected{border: solid .2em #FF7400 !important;}
  28.  
  29. ul#flags_list{list-style-type: none;}
  30. ul#flags_list li{display: inline;margin: 0 .4em;}
  31.  




- class.Language.php, esta Class irá conter informações sobre o idioma;

  1. <?php
  2. /**
  3. * Class Language
  4. *
  5. * @author pedrocorreia.net
  6. *
  7. */
  8. class Language{
  9. private $_short_description;
  10. private $_description;
  11. private $_flag;
  12.  
  13. /**
  14. * Método construtor
  15. *
  16. * @param String - Breve descrição da linguagem
  17. * @param String - Descrição completa da linguagem
  18. * @param String - Nome da imagem da bandeira
  19. */
  20. public function __construct($short,$full,$flag){
  21. $this->Short($short);
  22. $this->Full($full);
  23. $this->Flag($flag);
  24. }
  25.  
  26. /**
  27. * Getter/ Setter - Breve descrição da linguagem
  28. *
  29. * nota: deverão ser unicamente 2 letras
  30. *
  31. * @param String
  32. * @return String
  33. */
  34. public function Short($value=""){
  35. if($value) $this->_short_description=$value;
  36. else return $this->_short_description;
  37. }
  38.  
  39. /**
  40. * Getter/ Setter - Descrição completa da linguagem
  41. *
  42. * @param String
  43. * @return String
  44. */
  45. public function Full($value=""){
  46. if($value) $this->_description=$value;
  47. else return $this->_description;
  48. }
  49.  
  50. /**
  51. * Getter/ Setter - Nome da imagem da bandeira
  52. *
  53. * @param String
  54. * @return String
  55. */
  56. public function Flag($value=""){
  57. if($value) $this->_flag=$value;
  58. else return $this->_flag;
  59. }
  60.  
  61. }
  62.  
  63.  
  64. ?>



- class.MyLanguage.php, será a class que vai gerir as linguagens e efectuar as operação necessárias para interacção com o utilizador; armazenar a opção escolhida para que possa persistir ao longo da aplicação. Para esta persistência será usado uma cookie para armazenar o idioma selecionado.

  1. <?php
  2. include_once("class.Language.php");
  3.  
  4. /**
  5. * Class que permite gerir a linguagem no site
  6. *
  7. * @author pedrocorreia.net
  8. */
  9. class MyLanguage{
  10.  
  11. private $_cur_lang;
  12. private $_arr_langs;
  13. private $_ck_lang="my_current_language";
  14. private static $_instance;
  15.  
  16. public static $DefaultLang="pt";
  17.  
  18. public static $PT="pt";
  19. public static $JP="jp";
  20. public static $EN="en";
  21. public static $FR="fr";
  22. public static $ES="es";
  23.  
  24. /**
  25. * Método construtor
  26. *
  27. * @param String [Optional] $lang
  28. */
  29. public function __construct($lang="") {
  30.  
  31. //Singleton Pattern
  32. if(!self::$_instance) self::$_instance=$this;
  33. else return ;
  34.  
  35. //criar linguagens disponiveis
  36. $this->_arr_langs=array();
  37. $this->_arr_langs[self::$PT]=new Language(self::$PT,"Português","pt.png");
  38. $this->_arr_langs[self::$JP]=new Language(self::$JP,"Japanese","jp.png");
  39. $this->_arr_langs[self::$EN]=new Language(self::$EN,"English","en.png");
  40. $this->_arr_langs[self::$FR]=new Language(self::$FR,"Français","fr.png");
  41. $this->_arr_langs[self::$ES]=new Language(self::$ES,"Español","es.png");
  42.  
  43. //guardar a linguagem, caso tenha sido passada essa informação
  44. if($lang) {$this->SetLanguage($lang);}
  45. //caso contrário, tentar obter a linguagem já existente
  46. else{$this->_SetCurLanguage();}
  47. }
  48.  
  49. /**
  50. * Atribuir linguagem.
  51. *
  52. * Caso a linguagem atribuida não seja válida,
  53. * será atribuida a linguagem por omissão
  54. *
  55. * @param String $lang
  56. */
  57. public function SetLanguage($lang){
  58. if($this->IsValid($lang)) $this->_cur_lang=$lang;
  59. else $this->_cur_lang=self::$DefaultLang;
  60.  
  61. $this->_SaveLanguage();
  62. }
  63.  
  64. /**
  65. * Obter linguagem
  66. *
  67. * @return Language
  68. */
  69. public function Language(){return $this->_arr_langs[$this->_cur_lang];}
  70.  
  71. /**
  72. * Verificar se a linguagem é válida
  73. *
  74. * @param String $lang
  75. * @return Boolean
  76. */
  77. public function IsValid($lang){return array_key_exists($lang,$this->_arr_langs);}
  78.  
  79. /**
  80. * Método privado
  81. *
  82. * Ler e atribuir informação sobre a linguagem selecionada (cookie)
  83. */
  84. private function _SetCurLanguage(){$this->SetLanguage($_COOKIE[$this->_ck_lang]);}
  85.  
  86. /**
  87. * Método privado
  88. *
  89. * Guardar numa cookie a informação sobre a linguagem corrente
  90. *
  91. */
  92. private function _SaveLanguage(){
  93. if(!$this->_cur_lang) throw new Exception("LANG_NOT_DEFINED");
  94. setcookie($this->_ck_lang,$this->_cur_lang,strtotime("+128 week"));
  95. }
  96.  
  97. /**
  98. * Obter bandeiras com respectivos links
  99. *
  100. * nota: o url será sempre mantido
  101. *
  102. * @return String
  103. */
  104. public function GetFlags(){
  105. $query_string=$_SERVER['QUERY_STRING'];
  106. if($query_string) {
  107. $query_string="?$query_string";
  108. //remover da query_string os set_lang, caso existam
  109. $query_string=$this->_remove_querystring_var($query_string,"set_lang");
  110. $query_string=str_replace("&","&amp;",$query_string);
  111. }
  112. $query_string_separator=($query_string)?"&amp;":"?";
  113.  
  114. foreach ($this->_arr_langs as $key=>$lang){
  115. $img_class=($key==$this->_cur_lang)?"selected":"";
  116. $img_title=" alt='{$lang->Full()}' title='{$lang->Full()}' ";
  117. $img="<img class='flag $img_class' src='images/{$lang->Flag()}' $img_title />";
  118.  
  119. $link_flag="<a href='{$query_string}{$query_string_separator}set_lang=$key'>$img</a>";
  120.  
  121. $str.="<li>$link_flag</li>";
  122. }
  123.  
  124. return "<div id='flags'><ul id='flags_list'>$str</ul></div>";
  125. }
  126.  
  127. /**
  128. * Método privado
  129. *
  130. * Remover variável da query string
  131. *
  132. * Adaptado do seguinte url: http://www.ilovejackdaniels.com/php/querystring-functions/
  133. *
  134. * @param String $url
  135. * @param String $key
  136. * @return String
  137. */
  138. private function _remove_querystring_var($url, $key) {
  139. $url = preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&');
  140. $url = substr($url, 0, -1);
  141. return ($url);
  142. }
  143. }
  144.  
  145. ?>








- generate_dummy_info.php, são funções auxiliares que vão buscar a informação à BD, chamava só a especial atenção para a instrução sql ($iSQL);

  1. <?php
  2. function GenerateDummyInfo($lang){
  3. $db=connectDB();
  4.  
  5. $iSQL="select id, txt_$lang from dados_linguagem where id='1' ";
  6. $sql=mysql_query($iSQL) or die(mysql_error());
  7. $myrow=mysql_fetch_assoc($sql);
  8. mysql_close($db);
  9.  
  10. return $myrow["txt_$lang"];
  11.  
  12. }
  13.  
  14. function connectDB(){
  15. $db=mysql_connect("localhost","root","");
  16. mysql_select_db("test",$db);
  17.  
  18. return $db;
  19. }
  20. ?>




- ProcessRequests.php, neste ficheiro que irá inicializado o objecto e atribuido a linguagem, caso exista um pedido para tal;

  1. <?php
  2. include_once("Class/class.MyLanguage.php");
  3.  
  4. //criar objecto
  5. $my_language=new MyLanguage();
  6.  
  7. $set_lang=$_REQUEST["set_lang"];
  8.  
  9. //especificar nova linguagem, caso tenha sido especificado
  10. if($set_lang){
  11. $my_language->SetLanguage($set_lang);
  12. }
  13.  
  14. ?>




- index.php, last but not the least ...

  1. <?php
  2. include_once("ProcessRequests.php");
  3. include_once("generate_dummy_info.php");
  4. ?>
  5. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  6. <html xmlns="http://www.w3.org/1999/xhtml">
  7. <head>
  8. <title>MyLanguage</title>
  9. <link href="css/style.css" rel="stylesheet" type="text/css" />
  10. </head>
  11. <body>
  12. <div id="container">
  13. <?php
  14. echo $my_language->GetFlags();
  15. echo "<span>Linguagem Selecionada:</span> <strong>{$my_language->Language()->Full()}</strong>";
  16. echo "<br/>";
  17. echo "<span>Abreviatura:</span> <strong>{$my_language->Language()->Short()}</strong>";
  18. echo "<br/><br/>";
  19. echo GenerateDummyInfo($my_language->Language()->Short());
  20. echo "<br/><br/>";
  21. echo "<span>QueryString=</span>\"<strong>".htmlentities($_SERVER['QUERY_STRING'])."</strong>\"";
  22. ?>
  23. </div>
  24. </body>
  25. </html>




Aqui fica uma breve demonstração:
















Qualquer erro/ dúvida é só dizer!









clicks: 9609 9609 2008-05-22 2008-05-22 goto mySnippets mySnippets php  Download  Bookmark This Bookmark This