xbright’s world

« Wikipédia est une œuvre du seigneur jesus, qui es-tu pour contredire ses actes ? » ~ fluo★

Programmation et bidouillages

Des petites bidouilles marrantes ou des bouts de code, enfin, des broutilles pour justifier que je passe pas ma vie à jouer à Enemy Territory ! Python roulaise, PHP roulaise.

Fil des billets - Fil des commentaires

 

Internationaliser votre application PHP avec gettext

Développer une application, c'est bien. La distribuer où l'utiliser, c'est mieux. Cependant, tout le monde ne parle pas votre langue, d'où l'intérêt de l'internationaliser (et paf, une introduction toute pourrie \o/). Dans ce billet, je vous présenterai donc comment j'utilise gettext dans CodingTeam, afin de traduire l'application.

Traduire une application se fait généralement à l'aide d'outils dédiés comme gettext. Vous écrivez votre code en mettant tous vos textes traduisibles d'une certaine manière et il va aller les chercher pour en faire un fichier modèle (pot), qui servira ensuite à générer des fichiers de langue (po).
En PHP et comme dans beaucoup d'autres langages, il y a déjà quelque chose de tout préparé, ce qui permet de l'utiliser directement, sans rien installer d'autre.

Ma façon d'utiliser gettext est inspirée de la lecture de bon nombre d'articles sur le net. En gros, j'utilise ce code pour charger gettext :
setlocale(LC_ALL, $lang.'.UTF-8');

bindtextdomain('nomdedomaine', 'i18n');
textdomain('nomdedomaine');
bind_textdomain_codeset('nomdedomaine', 'UTF-8');

Dans cet exemple, $lang doit valoir quelque chose comme en_GB ou fr_FR et nomdedomaine devrait être le nom de votre application.
Dans le répertoire i18n, il devrait se trouver un dossier fr_FR contenant un autre dossier LC_MESSAGES qui accueillera le binaire produit par gettext (mo).

De même, on peut faire en sorte que la langue soit enregistrée par l'utilisateur, donnée dans l'URL, lue depuis l'en-tête adéquate... Voilà une manière assez rapide^Wmoche et ne respectant pas les spécifications, de se baser sur la langue du navigateur :
$langlist = array('fr' => 'fr_FR', 'en' => 'en_GB');
$accept_language = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);

foreach ($accept_language as $value)
{
    $choice = mb_substr($value, 0, 2);

    if (array_key_exists($choice, $langlist))
    {
           $lang = $langlist[$choice];
            break;
    }

}

if (empty($lang))
    $lang = 'en_GB';

À noter qu'il n'y a pas besoin de générer de .po/.mo pour la langue dans laquelle vous écrivez vos textes au sein de votre application vu qu'ils sont chargés par défaut si gettext n'arrive pas à trouver les traductions qui vont bien.

Pour créer le modèle, j'utilise ce script, qui est bien sûr adaptable. Dès que j'ai créé le .pot, je peux lancer cet autre script qui va me créer le fichier de traduction pour la langue que je désire. Une fois que j'ai traduit toutes les chaines, il me reste à lancer ce dernier script pour générer le binaire !

C'est là qu'on arrive au point relativement intéressant de ce billet (l'avant-ici a des airs de déjà-vu). J'ai toujours utilisé la fonction _() ou gettext() couplée à sprintf() afin de remplacer des éléments par d'autres. Exemple, si je veux traduire « Toto a mangé 4 bananes », j'écris : sprintf(_('Toto a mangé %d bananes'), 4); jusqu'au jour où je me suis rendu compte que si je voulais insérer plusieurs éléments dans la chaine tout en les nommant (afin de pouvoir changer leur ordre), j'allais au devant d'une syntaxe affreuse, repoussante, typiquement-php, à jeter par la fenêtre : sprintf(_('Le %2$s achète %1$d bananes.'), 42, 'monsieur'); !
%2$s, %1$s ! Mais qui est allé pondre cette horreur ?

Nostalgique de la façon bien plus propre de remplacer des occurrences dans des chaines en Python, j'ai donc écrit cette fonction, que je vous partage. Et j'espère qu'elle vous sera utile. En tout cas, c'est bien plus facile de ne pas se tromper, le traducteur a en face de lui quelque chose qui a une signification et ça ne fait pas tâche.
/**
* Translate a string and add arguments
*
* Gets the translated string from gettext and add arguments in it with
* the Python way instead of the *ugly* PHP way (sprintf).
*
* @param $str
* The string to be translated.
* @param $args
* All arguments to be added.
* @return
* The translated and formatted string.
*/
function i18n($str, $args=array())
{
// Get the translated string
$str = gettext($str);

// Add arguments to the string if exist
if (count($args) > 0)
// Fetching all arguments
foreach ($args as $key => $value)
{
// Decimal value
if (is_numeric($value))
$type = 'd';
// String value
elseif (is_string($value))
$type = 's';

// Replace
$str = str_replace('%('.$key.')'.$type, $value, $str);
}

// Return the translated string with arguments
return $str;
}

Publié le dimanche 8 juin 2008, 22:54 par xbright | 5 commentaires
Tags : php Planet
 

Code Bar : nouvelle édition du bar virtuel \o/

Comme Omega l'a anoncé il y a quelques jours, le Code Bar va de nouveau avoir lieu sur le salon programmation@chat.jabberfr.org du samedi 26 avril au dimanche 27 avril 2008, de 12 heures UTC à 12 heures UTC (ça donne 14 heures à Paris et 16 heures dans des contrées plus accueillantes).



Pour ceux qui ne connaissent pas le principe de cette rencontre virtuelle, une page de wiki a été mise en place : http://trac.last-exile.org/code_bar/. Le but est donc de se rencontrer sur le salon Jabber francophone dédié à la programmation, de découvrir des (nouvelles ?) choses via les cours d'Emacs Lisp ou de Haskell et de travailler ensemble sur des petits projets libres. Cette fois ci, sont retenus un moteur de MUD sous forme de composant Jabber, un RandomChat (un truc séduisant pour que les djeunz pensent faire des rencontres anonymes tout en parlant à leur voisin, satyre et pervers sexuel à ses heures perdues) ainsi qu'un certain Zadolbator (un composant Jabber qui envoie des notifications et qui, accessoirement, possède un nom imprononçable).

De toute évidence, ce Code Bar est encore très axé sur les technologies liées à Jabber, on rappelle que le projet phare de la première édition du Code Bar était Gajim (et non pas CodingTeam, malheureusement ;'(). On remarque aussi que 2 projets sur 3 sont aussi des projets en Python, alors que le composant-au-nom-bizarre, lui, est en Ruby.
Et, si les fans de Jabber se sentaient encore un peu lésés, il y a aura même Nÿco qui vantera la contribution sur le wiki de JabberFR.org (rien n'est encore sûr) !

Bien entendu, vous n'êtes pas obligé de venir pour faire le tour de la pendule, il n'y a pas vraiment d'obligations à ce niveau (même si d'un point de vue organisationnel, notamment pour les cours - qui auront lieux à des heures fixes, c'est mieux d'arriver plutot tôt que tard). Si vous n'avez pas encore de client Jabber, installez-en un.
Pour ceux qui n'ont pas de compte Jabber, il existe aussi une interface web pour se connecter au salon : http://chat.jabberfr.org/muckl_int/index.php?room=programmation !

Le programme pour ce prochain Code Bar est donc bien rempli et n'attends plus que les patcheurs/codeurs fous que vous êtes et qui n'attendent qu'un peu de projets exotiques pour vous lancer. Alors, à samedi \o_
Publié le samedi 19 avril 2008, 23:01 par xbright | aucun commentaire
Tags : logiciel libre Planet Python
 

Mon petit compte rendu de ce premier Code Bar.

Depuis hier après midi jusqu'à aujourd'hui, se tenait la première édition du Code Bar sur Jabber !

Tout comme l'avait préparé les organisateurs Omega et Elghinn sur le salon programmation@chat.jabberfr.org. Cette soirée (nuit ?) s'est donc déroulée dans la bonne humeur et a été productive.


Voilà un log de tous les commit effectués sur le SVN de l'occasion (deux projets étaient proposés pour cette première édition : Gajim et CodingTeam). Il y en a eu plus d'une cinquantaine, pour - au mieux de la soirée - une vingtaine de connectés au salon, dont seulement 7 avaient un accès en écriture au dépôt SVN.


Concernant Gajim, les principaux développements ont été l'amélioration du support de PEP, des travaux divers sur le trunk où encore - j'y ai un peu participé - sur une branche à part nommée chat2muc : pour transformer un chat normal en salon de discussion, XEP-0045). Bien entendu, nous n'avons pas terminé cette intégration, et nous la continuons sur le salon gajim-chat2muc@conference.codingteam.net !

CodingTeam a bénéficié de l'aide de quelques uns aussi via le dépôt mis en place pour l'occasion sur le serveur de Elghinn.
Ainsi, l'intégration Jabber dans la forge a été travaillée et j'ai synchronisé le travail effectué avec le trunk officiel !

Historiques des salons :

Merci donc à tous les participants pour le coup de pouce aux projets ;-)
Publié le dimanche 3 juin 2007, 07:39 par xbright | 3 commentaires
Tags : codingteam Jabber php Planet Python
 

Une soirée coding ouverte à tous !

Le samedi 2 juin, sera organisé une soirée coding sur Jabber !

En effet, sur le salon programmation@chat.jabberfr.org l'après midi et la soirée (voire la nuit, plutôt) seront consacrées à la programmation.

La tête d'affiche pour cette première édition : Gajim ! Ainsi, le principal objectif est la correction de bug ainsi que l'implémentation de nouvelles fonctionnalités dans Gajim. D'ailleurs, le développeur principal, Asterix, sera présent ce soir !

Voici les objectifs que l'on peut trouver sur le wiki :


Pour ceux qui n'aiment pas Python, ou qui n'aiment pas Gajim, d'autres projets pourront être abordés ce soir là, comme indiqué sur le wiki :

Intégrer Jabber dans CodingTeam (forge codée en PHP)

Donc, si l'envie vous en prend, vous pourrez même donner un petit coup de main à CodingTeam :-)
Le Roi de la pluie en parle !
Publié le mercredi 23 mai 2007, 18:16 par xbright | 3 commentaires
Tags : Jabber Planet
 

Compter les utilisateurs connectés et enregistrés avec ejabberd

Eh bien, voilà un billet un peu technique, ça manquait !


La problématique est la suivante : on a installé un serveur Jabber ejabberd (au passage, c'est une grossière erreur, ce serveur est en ERLANG, et j'me rend compte après coup que j'y suis allergique) sans se prendre la tête. Donc, ce ejabberd a décidé d'utiliser la base de données mnesia (un truc inconnu qui est un pote à ERLANG, justement).

Alors, je vous laisse chercher longtemps pour faire une requette PHP là dedans...


Heureusement, je suis tombé sur un truc formidable, tout à l'heure : mod_ctlextra, en faisant une n-ième recherche sur leur site officiel.

Bref, ce module ajoute pleins de fonctions inutiles, dont :

stats registeredusers number of registered users
stats onlineusers number of logged users

De plus, l'installation a été très simple sur lanoiraude :

On commence par se placer dans un répertoire qui servira pour récupérer la copie courante de ce module.

svn co https://svn.process-one.net/ejabberd-modules
Ensuite, on va dans le répertoire de ce module :
cd ejabberd-modules/mod_ctlextra/trunk

On va construire le bidule :

./build.sh
Ensuite, dans le dossier ebin, on tombe sur le fichier intéressant mod_ctlextra.beam  ! On le met dans /var/lib/ejabberd et il n'y a plus qu'à ajouter ça au ejabberd.cfg :
  {mod_ctlextra, []},
(Oui, Jérémy, cette syntaxe de malade, c'est du ERLANG !)

Et voilà, il ne nous reste plus qu'à redémarrer le serveur pour bénéficier de ces nouvelles commandes ultra pratiques !
Ensuite, un petit peu de Python, un petit tour dans crontab et on obtient ça : stat.txt ! _o/
Publié le dimanche 20 mai 2007, 15:16 par xbright | 7 commentaires
Tags : Jabber Planet
 

Créer des fils RSS avec mise en cache

Publié le vendredi 6 avril 2007, 14:19 par xbright | 4 commentaires
Tags : php Planet rss web 2.0
 

Créer des dépôts facilement sur un serveur SVN

Publié le mercredi 21 mars 2007, 13:14 par xbright | 6 commentaires
Tags : Planet Python Subversion