Sem dor de cabeça: Arquivos de localização
Posted by Dirceu | Filed under localizacao, traducao, php, arquivo-po
Trabalhar com novas ferramentas, aceitando qualquer desafio não importando a tecnologia utilizada (leia-se linguagem de programação, framework ou sistema operacional) é motivador. A busca pelo "sempre novo" nos ensina paradigmas diferentes, soluções novas e ainda mantém distante aquele tédio que acaba surgindo quando você já tem certa experiência em alguma tecnologia (afinal, quase tudo por aqui se resume a "cadastros e mais cadastros").
Que o caminho do aprendizado é duro (haha) todos nós sabemos, porém as vezes ele te cobra muito mais do que devia. Isso depende principalmente da quantidade de informação disponível sobre o assunto e sobre os problemas específicos que você está enfrentando.
Para evitar suicídios ou dores de cabeça que possam ser causados pela "falta de experiência" é que vou relatar aqui os problemas que tive essa semana para fazer uma simples tradução em uma interface em PHP. Alias, quem sabe essa de relatar os problemas no aprendizado vira habito e começo fazer artigos "For Dummies" (ok, dummie não - inexperiente) né?
Pule direto para as dicas matadoras ou
Enjoy (geeks only - ao contrário leia bem as referências, principalmente ao Wikipédia)
Lenga Lenga, você ainda pode pular direto para as dicas matadoras
Tudo para mim sobre esse asunto começou quando chegou a tarefa de traduzir algumas partes de uma interface de webmail. Não saio por ai falando inglês, mas me viro bem na leitura e razoável na escrita. Como eram frases curtas e comuns em interfaces esse não seria o problema. Como a tarefa de localizar algo dentro de um projeto também não é complicada, não importava saber exatamente estavam essas frases. E é ai que comecei a me enganar.
Logo que encontrei as frases a serem traduzidas me dei de cara com o principal mas não único problema: a interface (que na verdade é o software de webmail Squirrelmail guarda as traduções em arquivos separados.
Após uma pequena lembrança sobre isso (por ter utilizado tanto nesse blog, quando em um wiki) resolvi pesquisar como alterar esses arquivos.
Rapidamente eu já sabia que na verdade se tratavam de arquivos do projeto de internacionalização do GNU - gettext - e então procurei algum editor para Windows (obviamente eu não estava na minha maquina e lá só existem maquinas rodando Windows) e encontrei o poEdit. Abri o programa tentei editar e nada feito, nele não há como adicionar uma nova tradução "na mão".
Para entender melhor a inexistência da opção para adicionar nova tradução, vamos entender como o gettext funciona:
- O programador deve substituir no código as entradas diretas de strings, como "Representação de string" por _("Representação de string"). Isso identificara que ali deverá ser traduzido.
- Então o programador deve executar um programa que irá gerar um arquivo para tradução de todo o código de um projeto.
- Após a tradução deve ser executado um comando que irá compilar a tradução de forma que ela possa ser executada com maior velocidade.
Como eu não podia, não queria e nem sabia como gerar o arquivo inteiro de tradução novamente (por já ter a maior parte traduzida) eu precisava de uma forma de adicionar algumas frases e palavras facilmente. Abri então o arquivo (.po) no Notepad++ e inclui manualmente as frases. Até então sem saber da parte de compilar esse arquivo, coloquei no ar e fui testar - logicamente sem sucesso.
Em mais uma busca encontrei que o poEdit gerava esse arquivo compilado (.mo), assim como a ferramenta original gettext que é padrão em ambiente GNU. Abri então o .po no programa e ao salvar realmente ele compilou a tradução, ótimo! Ao colocar no ar o problema não se resolveu, desgraça!
*Mexe no arquivo, sobe, baixa outra versão, sobe, muda codificação, altera direto no código e esquece o arquivo externo, pensa melhor e faz a coisa certa: continua quebrando a cabeça mas faz a coisa certa*
Após um longo tempo revendo código, mudando e voltando atrás na idéia de traduzir tudo ali no código mesmo a coisa começou dar certo: algumas partes eram traduzidas assim como eu queria, mas outras ainda não.
O primeiro passo para a solução foi baixar o GNU para Windows e usar a ferramenta original para compilar o arquivo .mo, isso pelo menos evitava alguns erros que o poEdit acusava no arquivo e as modificações que ele fazia sem meu consentimento (principalmente na questão de pluralização).
O segundo foi perceber que para que as novas traduções sejam exibidas na interface é necessário que o servidor seja reiniciado, no caso era o Apache. Como provavelmente por se tratar de um webmail de uma grande companhia da cidade - e com muitos acessos - o servidor carrega várias instâncias do Apache e a cada requisição uma das instâncias retorna a página, as vezes vinha a página traduzida e as vezes não. Isso no começo foi um problema, depois era só questão de dar alguns reloads.
A terceira e a que demorou mais, foi perceber o motivo de que em alguns lugares as frases eram traduzidas e em outros não: plugins.
Dentro dos programas que utilização localização por arquivos é possível definir escopos de atuação de certo arquivo, assim por exemplo um plugins vem com seu próprio arquivo de localização e no código do mesmo é definido a mudança de escopo.
O problema é que os plugins em questão não vinham com tradução nenhuma, e havia uma dificuldade minha para entender que eu poderia (e deveria) ter feito a tradução dentro do escopo.
Porém eu encontrei uma solução que na hora me caiu bem: fiz a tradução dos plugins no arquivo de localização global mesmo, e encontrei como retirava a mudança de escopo que era o grande problema e que provocava confusões, que no caso do SquirrelMail é feito pelo código (PHP):sq_change_text_domain('squirrelmail');
ou em casos genéricos:bindtextdomain("myPHPApp", "./locale");
textdomain("myPHPApp");
Onde "./locale" que é o escopo (ou pasta onde estão os arquivos de localização)
Enfim, se livrando da dor de cabeça:
- Prefira sempre manter as traduções em arquivo.
- Fuja do poEdit, o pacote GnuWin32 permite rodar a ferramenta gettext mesmo em Windows. Para gerar o arquivo .mo a partir de um .po utilize o seguinte comando dentro do promot (cmd) sem esquecer do caminho do arquivo completo:
msgfmt minha_traducao.po -o minha_traducao.mo - Reinicie o Apache (ou seu servidor), caso isso não seja possível manualmente, tente sobrecarregar o servidor com vários refreshes seguidos - segure o dedo no F5 - isso pode fazer com que ele crie novas instâncias.
- Preste atenção se algum plugin ou qualquer pedaço de código está mudando o escopo da localização. Isso provavelmente está ocorrendo se na tradução está um termo traduzido que a aplicação não traduz no meio de outros que ela traduz.
Caso isso não resolva seu problema, levante e tome um ar, beba uma agua e pense em algum assunto totalmente diferente do seu problema. Normalmente a solução vem sozinha em sua cabeça, mesmo após você ter procurado ele por horas. Não esquente a cabeça.
E caso isso aqui te ajudou, me dê um link, um comentário ou uma twittada :)
Previous Post Next Post