Skip to content

Linux Attitude

Le libre est un état d'esprit

Archive

Tag: Bibliothèque

Niveau :      
Résumé : logs apache en php

Un petit article pour tous ceux qui ont un site sur sur un hébergement mutualisé et qui n'ont pas accès aux logs apache. C'est assez gênant, on est limité dans le choix des outils de statistiques. On a quelques outils purement php peu efficaces, ou des outils web externes qui stockent les données pour vous (mais à qui appartiennent-elles ?).

Pour permettre d'utiliser les outils courants (awstats, awffull, webalizer ...), j'ai écrit un petit script php qui génère des logs au format apache. Il y a plusieurs inconvénients, tout d'abord, on ne loggue que les appels au php, pas les images, ni les binaires ... D'autre part, le code s'exécute nécessairement avant la fin du code lui-même. Donc il y a certaines informations dont on ne dispose pas, comme la taille totale générée, le code de retour ou des éléments des en-têtes renvoyés.

Ce script s'utilise très simplement, il suffit d'inclure le fichier et éventuellement de préciser le format à utiliser et le nom du fichier de log. En pratique l'entrée de log se fera à la fin de l'exécution du php, ce qui permet de mesurer le temps d'exécution. Le logformat s'écrit exactement sous la même forme que celui d'apache, les informations inconnues seront simplement remplacées par un '-' . Notez aussi que le %r (ligne contenant la requête intégrale) est généré à partir des informations disponibles.

A mettre dans votre code php :

$alog_logFormat = "%h %l %u %t \"%r\" %>s %b"; // optionnel
$alog_logFile   = "/tmp/access.log"; // optionnel
include_once("ApacheLog.php");

Attention, le nom du fichier est relatif au script appelant.

Vous trouverez le fichier en pièce attachée à cet article.

Niveau :      
Résumé : setlocale ; xgettext ; gettextize

Maintenant vous savez utiliser gettext. Allons un peu plus loin. Vous avez internationalisé votre application et commencé à la traduire. Mais vous voudriez aussi l'installer et la rendre utilisable par tous facilement.

Pour cela il faut choisir la bonne locale en fonction de l'utilisateur. La solution retenue dépendra du type d'application.

Locale web

Si c'est une application web, basez vous sur la langue du navigateur, fournie pendant la négociation http ou la lange du serveur par défaut.

<?php
// locale par defaut (du serveur)
$locale = getenv('LANG');

// locale préférée du client
if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) )
{
        $languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
        $language = preg_replace( "/^([^,;]*?)[,;].*$/","$1", $languages );

        if ( $language != "" )
        {
                $locale = $language;
                $locale .= "_";
                // c'est un peu pauvre comme choix du pays et c'est pas garanti que ca marche
                // si vous avez une bonne idée n'hesitez pas
                $locale .= strtoupper($language);
                if ( $charset == "utf8" || $charset == "utf-8" )
                {
                        $locale .= "UTF-8";
                }
        }
}

setlocale(LC_ALL, $locale);
?>

Notez qu'ici on modifie LC_ALL qui impacte tous les éléments de locale (date, monnaie ...). Si vous ne voulez modifier que la locale liée à la traduction utilisez LC_MESSAGES à la place.

Locale locale

Si votre application est un programme local, basez vous sur la locale du système grâce aux variables d'environnement. Pour cela, il suffit d'appeler simplement setlocale :

/* code C, transposable aisément :-) */
setlocale( "LC_ALL", "");

Attention, quel que soit le langage, setlocale doit être appelée avant vos appels à bindtext et textdomain.

Industrialisation

Pour installer vos traductions sur un système unix, mettez les dans /usr/share/locale/fr/LC_MESSAGES.

Il vous faudra aussi maintenir vos traductions, pour cela vous devrez utiliser régulièrement xgettext pour extraire vos chaînes mises à jour. De plus à force de traduire, vous verrez que ce n'est pas toujours drôle de repérer les dernières modifications ou de faire des recherches avec un éditeur de texte normal. C'est pourquoi il vous faudra apprendre à utiliser un outil comme poedit pour éditer les fichiers .po

Niveau :      
Résumé : gettext

Connaissez vous la différence entre internationalisation et localisation (i18n et l10n) ? Hé bien il s'agit tout simplement de deux parties du même processus.

L'internationalisation c'est le fait de développer votre code pour qu'il supporte n'importe quelle locale. Par locale on entend la plupart du temps la langue, mais il ne faut pas oublier qu'il y a quelques autres particularités comme l'heure, la monnaie, l'affichage des dates ...

La localisation, c'est le fait de définir les propriétés locales du logiciel. Contrairement à l'internationalisation, ce n'est pas particulièrement un travail de développeur de s'occuper de la localisation. Il s'agit la plupart du temps de traduire du texte (l'heure et la monnaie étant en général fixe et donc déjà localisées).

Gettext est une bibliothèque pour vous faciliter l'internationalisation et la localisation du texte dans vos programmes. Elle a été pensée pour être utilisée dans du code existant aussi bien que dans du nouveau code. Le principe est de conserver les messages originaux dans le code (en anglais de préférence) et d'externaliser les versions localisées de ces messages dans d'autres fichiers.

Comment l'utiliser ?

La fonction principale de gettext est ... gettext. On lui passe en paramètre une chaîne de caractères et elle retourne la chaîne de caractères traduite correspondante.

Son action est simple, elle connaît la locale en cours, et en fonction de cette locale elle va chercher dans un fichier de texte localisé la chaîne de caractère correspondant à la chaîne en VO qu'on vient de lui passer. Si elle la trouve c'est gagné, sinon elle retourne la VO. Par conséquent, toutes les chaînes non traduites dans un logiciel fonctionnent, elles sont juste en VO.

Commençons par un exemple en php. En php, comme dans la plupart des autres langages, la fonction gettext() existe aussi sous le nom de _(), bien plus rapide à écrire et aussi plus lisible.


continue reading...