Extraire les strings d'une application basée sur Hyla TPL ou sur PHP Lib

Une fois une application crée, une fois un thème réalisé, on est heureux de pouvoir en faire profiter tout le monde. Seulement voilà, tout le monde ne parle pas la même langue que nous. Donc si nous souhaitons distribuer notre thème à plus grande échelle il est évident qu'une internationalisation (i18n ou l10n) du thème sera nécessaire. Les développeurs d'applications web PHP connaissent bien ce problème et il est maintenant courant d'utiliser gettext pour gérer les différentes langues dans une application.

hylatpl.png

py.gif

Ceci dit, une fois le thème crée, ça n'est pas toujours évident d'en extraire le texte pour créer un support gettext qui permet une traduction facile dans plusieurs langues. C'est donc en travaillant sur le Bilboplanet que je me suis confronté à cette difficulté. Mon but était de rendre l'application la plus générique possible : et donc traduisible en fonction des besoins. Extraire les strings de mon application à la main aurait été impossible ... d'autant plus que je modifie souvent mon code et il serait impensable de garder ma liste de traductions à jour. J'avais donc besoin d'un outil automatique.

J'ai donc mis en place un petit script d'extraction de strings automatique pour le moteur de templates Hyla TPL (qui est compatible avec PHP Lib) pour générer les fichiers .po dont j'avais besoin. Le code est disponible ici :

export_tpl-v1.0.py

La fonction à appeler pour lancer la génération du fichier gettext est la fonction "extract_tpl(tpldir)" à laquelle vous devez passer en paramètre le chemin vers votre répertoire de thème. La fonction ira automatiquement chercher le fichier "index.tpl" et suivra les liens internes du type "include" pour que tous les fichiers inclus soient aussi traduits. Le résultat est un fichier .po que vous pouvez ensuite traduire à votre guise :

def extract_tpl(tpldir):
	translate = Translation(tpldir)

	if os.path.isfile(os.path.join(os.path.abspath(tpldir), 'index.tpl')):
		translate.extract_from_tpl('', 'index.tpl')
	else:
		translate.extract_tpl()
	
	potcontent = translate.gettext_code()

	print potcontent

Pour ceux qui n'y connaissent rien en python mais qui souhaiteraient quand même tester ce script. Je vous invite à installer python et ipython chez vous. Puis dans le répertoire dans lequel se trouve le fichier python ci-dessus, faites :

greg@gsat:~/Desktop$ ls export_tpl.py 
export_tpl.py
greg@gsat:~/Desktop$ ipython
Python 2.6.6 (r266:84292, Sep 15 2010, 16:22:56) 
Type "copyright", "credits" or "license" for more information.

IPython 0.10 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

In [1]: from export_tpl import *

In [2]: extract_tpl('/home/greg/Public/bilboplanet/themes/gil-galad/')
Vus : 2244
Publié par theClimber : 28