Ir para o conteúdo

Website poliglota

Criação de um website poliglota.

<?php

/**
 * @author  Luis Coutinho <Luis@lfscoutinho.net>
 * @date    05/06/2011
 */

session_start();

define('SESS_LING', 'lingua' ); // Chave da $_SESSION que vai conter a língua
define('SESS_LING_DEF', 'pt_PT' );  // Língua por defeito

// Função para mudar a língua
function mudarLingua( $lingua ) {
    $linguas = array( 'pt', 'br', 'fr', 'en', 'us' );

    if( in_array( $lingua, $linguas ) ) {
        switch( $lingua ) {
            case 'pt' :
            case 'br' :
                $lingua = 'pt_PT';
                break;
            case 'fr' :
                $lingua = 'fr_FR';
                break;
            case 'en' :
            case 'us' :
                $lingua = 'en_GB';
                break;
        }
    } else {
        $lingua = SESS_LING_DEF;
    }
    $_SESSION[SESS_LING] = $lingua;
}

// Verifica se o utilizador quer mudar de língua
if( isset( $_GET['ling'] ) ) {
    mudarLingua( $_GET['ling'] );
} elseif( ! isset( $_SESSION[SESS_LING] ) ) {
    $_SESSION[SESS_LING] = SESS_LING_DEF;
}

define('LOCAL', $_SESSION[SESS_LING] . '.UTF-8' );  // Define o local

setlocale( LC_ALL,  LOCAL );            // Define as informações locais
putenv( "LC_ALL="   . LOCAL );          // Necessário em alguns sistemas
putenv( "LANGUAGE=" . LOCAL );          // Necessário em alguns sistemas

textdomain( 'traducao' );               // Define o domínio padrão
bindtextdomain( 'traducao', './linguas' );      // Configura o caminho para um domínio
bind_textdomain_codeset( 'traducao', 'UTF-8' );     // Define a codificação dos caracteres
<?php
    /**
     * @author  Luis Coutinho <Luis@lfscoutinho.net>
     * @date    05/06/2011
     */
    require 'config.php';   // Requer o ficheiro "config.php"
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <meta name="author" content="Luis Coutinho <Luis@lfscoutinho.net>" />
        <title>Website poliglota</title>
    </head>
    <body>
        <p><a href="?ling=pt">PT</a> <a href="?ling=fr">FR</a> <a href="?ling=en">EN</a></p>
        <p><?php echo gettext('Olá mundo!') ?></p>
        <p><?php echo _('Olá mundo!') ?></p>
        <p><?php printf( ngettext( '%d teste', '%d testes', 1 ), 1 ) ?></p>
        <p><?php printf( ngettext( '%d teste', '%d testes', 2 ), 2 ) ?></p>
    </body>
</html>

Informações

Existem várias maneiras de se criar um website poliglota, como por exemplo: utilizando arrays ou constantes. No entanto, na minha opinião, esta é forma mais fácil, simples e elegante, ou seja, a melhor.

Ficheiros de tradução

  1. Fazer download do Poedit
  2. Abrir o Poedit
  3. Clicar em Ficheiro
  4. Clicar em Novo catálogo
  5. Preencher todos os campos
    • Na aba *Dados do projecto?
      • Nos campos Codificação e Codificação do código-fonte escolher UTF-8
      • Nas formas plurais, depende da língua (podem ver neste site a forma plural da língua que querem traduzir)
    • Na aba Pastas
      • No campo *Pasta base? devem indicar a localização da pasta com os ficheiros a serem traduzidos, por exemplo C:/wamp/www/website-poliglota
      • Em baixo, devem carregar no segundo botão (Nova entrada), adicionar um . (ponto-final) e carregar na tecla enter
  6. Clicar em OK
  7. Clicar em Catálogo
  8. Clicar em Actualizar a partir do código-fonte
  9. PUF... MAGIA ! Apareceram as strings a serem traduzidas
  10. Clicar na string a ser traduzida
  11. No fundo do programa, no segundo campo, escrever a tradução e carregar na tecla enter
  12. Clicar em Ficheiro
  13. Clicar em Guardar

Estrutura das pastas/ficheiros

A estrutura das pastas/ficheiros tem de ser a seguinte:

  • config.php
  • index.php
  • linguas
    • en_GB
      • LC_MESSAGES
        • traducao.mo
        • traducao.po
    • fr_FR
      • LC_MESSAGES
        • traducao.mo
        • traducao.po

Atenção

Por vezes, depois de criar/editar os ficheiros de tradução, é possível que não apareçam as novas traduções/correcções. Sinceramente, não sei qual o motivo para isto acontecer, sendo que mesmo limpando a cache e afins, continuam a não aparecer. A solução que conheço para este problema é reiniciar o computador. Contudo, se conheceres outra solução estás à vontade para partilhá-la e o povo agradece.