Xunta de Galicia
Ferramentas persoais


Powered by MediaWiki

Como usar gettext con PHP

Internacionalización usando PHP e GetText

Se vostede é un desenvolvedor web que programa usando PHP (desde un pequeno aplicativos até aplicativos e/ou portais corporativos que teñen milleiros de visitas) igual se decatou de que moitas veces necesita que os seus programas poidan ser traducidos a distintos idiomas. O problema que ten non é un problema de tradución/localización (L10n), é un problema de internacionalización (i18n).

A tradución só implica unha simple versión de cadeas do código, e pódese facer dunha maneira un pouco traballosa buscando as cadeas traducíbeis por todo o código. Este método adoita producir erros (web a medio traducir e/ou mal traducida) e por riba non se pode reaproveitar a tradución. A internacionalización define unha estratexia para construír webs e aplicativos que se poden traducir facilmente a outros idiomas. Este é o obxectivo principal deste artigo...

Gettext

No software libre existe un moi bo conxunto de utilidades para producir aplicativos internacionalizábeis chamado GetText. Desenvolvido principalmente para aplicativos feitos en C e C++; pero tamén moi sinxelo de usar noutro tipo de aplicacións, como PHP. GetText probabelmente estará instalado no seu computador. Para iso non ten máis que probar desde unha liña de comandos a executar o seguinte comando "gettext":

fjrial@pcfjrial:~$ gettext
gettext: faltan argumentos

Se o resultado fose outro, só tería que instalar gettext usando o seu xestor de paquetes preferido ou mesmo baixándoo de ftp://ftp.gnu.org/pub/gnu/gettext

Internacionalizando os seus scripts de PHP

Para usar GetText nos seus scripts de PHP terá que modificalos todos, no entanto, isto só o terá que facer unha vez. As modificacións non son difíciles de facer e probabelmente poida construír unha ferramenta que o axude a automatizar este proceso dunha maneira sinxela. De todos os xeitos para internacionalizar o seu código só terá que substituír todas as cadeas de texto co seguinte:

print(_("Hello world"));

Si, ten que usar esta rara función "_" (underscore), que é un alias para usar as funcións "gettext". Unha vez se afaga a escribir isto, e sexa consciente das vantaxes que ten, verá que moi pronto escribirá todas as súas cadeas coa función "_".

Extraer as cadeas do código

GetText prové unha utilidade chamada "xgettext" para extraer todas as cadeas de texto dos seus scripts. As cadeas resultantes gardaranse nun ficheiro "po".

O comando para extraer as cadeas é o seguinte:

$xgettext -a src/*.php

O ficheiro ".po" terá a seguinte aparencia:

# SOME DESCRIPTIVE TITLE. 
# Copyright (C) YEAR Free Software Foundation, Inc. 
# FIRST AUTHOR , YEAR. 
# 
#, fuzzy 
msgid "" 
msgstr "" 
"Project-Id-Version: PACKAGE VERSION\n" 
"POT-Creation-Date: 2000-12-08 19:15-0300\n" 
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 
"Last-Translator: FULL NAME \n" 
"Language-Team: LANGUAGE \n" 
"MIME-Version: 1.0\n" 
"Content-Type: text/plain; charset=CHARSET\n" 
"Content-Transfer-Encoding: ENCODING\n" 

#: proba.php:12 
msgid "Hello world" 
msgstr "" 

Este ficheiro .po será o que teña que entregar aos tradutores para que escriban entre as comiñas de msgstr a tradución correspondente á entrada msgid. Pode engadir comentarios a cada liña de tradución usando o carácter #. Desta maneira, o tradutor poderá ter máis información de contexto para traducir dunha maneira máis axeitada a cadea orixinal. Por exemplo:

#: proba.php:12
#Esta cadea amósase ao comezo do script
msgid "Hello world"
msgstr ""

Unha vez que os seus tradutores traduzan o ficheiro .po (un ou varios ficheiros .po), é o momento de usalos desde o código PHP.

Producindo un ficheiro .mo

Ten que producir un ficheiro .mo para usar gettext. Este ficheiro .mo obtense usando o comando "msgfmt" sobre cada ficheiro .po:

$msgfmt ficheiro.po -o ficheiro.mo

Configurando os cartafoles

A mellor maneira de usar GetText é crear un cartafol chamado "locale" nalgún cartafol do código fonte do seu proxecto. Entón, dentro dese cartafol, crear un subcartafol para cada idioma, e, dentro de cada idioma, outro cartafol chamado LC_MESSAGES, onde terá que poñer os ficheiros .po e .mo para o idioma correspondente. Por exemplo:

/src
/locale/gl/LC_MESSAGES/messages.mo
_______________________messages.po
es/LC_MESSAGES/messages.po
_______________________messages.mo

Unha vez configurado o seu proxecto, para arrincar o seu proxecto no idioma desexado so terá que engadir o seguinte código ao seu script principal:


//Establecer que o idioma sexa o galego
putenv ("LC_ALL=gl");

//Especificar a localización dos ficheiros de tradución
bindtextdomain ("messages", "./locale");

//Estabelece o dominio para as buscas de gettext
textdomain ("messages");

A liña máis importante é "putenv("LC_ALL=gl")" que o que fai é indicar que ficheiro de traducións usará para o aplicativo. De querer establecer outro idioma diferente, tan só ten que cambiar a liña así:

putenv ("LC_ALL=es");

E desta maneira o aplicativo funcionará en español.

Conclusión

GetText é unha boa maneira de estandarizar a capacidade de internacionalización dos seus scripts de PHP. Desta maneira, terá que modificar o código PHP unha soa vez, e posteriormente engadir a dispoñibilidade doutros idiomas cunha simple modificación. Ademais as súas traducións poderán ser reutilizadas como bases de datos para outra traducións (usando ferramentas como lokalize, kbabel, poedit, ...)

Outras ligazóns

Fonte orixinal da nova: http://zez.org/article/articleview/42/