i18n avec arguments : extension pour CodeIgniter

Dans CodeIgniter, il est possible de réaliser un fichier de traduction et d’y faire appel dans les vues.

Des articles sur le web donnent des pistes : [Google]

Par contre, pour ajouter des arguments à la chaine de texte à traduire, ça se corse. Comme en java, j’aimerai avoir le texte « Vous avez 5 messages dont 2 non lus ». La chaine de base serait « Vous avez {arg1} messages dont {arg2} non lus » et les 2 arguments seraient « 5″ et « 2″.

Voici comment procéder avec CodeIgniter v2.1.0 :

  1. Créez un fichier « /application/core/MY_Lang.php » :
    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    
    class MY_Lang extends CI_Lang{
    
        public function __construct() {
            parent::__construct();
        }
    
        /**
         * Fetch a single line of text from the language array. Takes variable number
         * of arguments and supports wildcards in the form of '%1', '%2', etc.
         * Overloaded function.
         *
         * @access public
         * @return mixed false if not found or the language string
         */
        public function line(){
            //get the arguments passed to the function
            $args = func_get_args();
    
            //count the number of arguments
            $c = count($args);
    
            //if one or more arguments, perform the necessary processing
            if ($c) {
                //first argument should be the actual language line key
                //so remove it from the array (pop from front)
                $line = array_shift($args);
    
                //check to make sure the key is valid and load the line
                $line = ($line == '' OR ! isset($this->language[$line])) ? $line : $this->language[$line];
    
                //if the line exists and more function arguments remain
                //perform wildcard replacements
                if ($line && $args) {
                    $i = 1;
                    foreach ($args as $arg)
                    {
                        $line = preg_replace('/\%'.$i.'/', $arg, $line);
                        $i++;
                    }
                }
            } else {
                //if no arguments given, no language line available
                $line = false;
            }
    
            return $line;
        }
    
    }
    
    ?>
  2. Utilisez vos arguments dans le fichier de traduction de cette façon :
    <?php
    $lang['list.evenements.title'] = "Liste des evènements pour %1";
    ?>
  3. Passez par la nouvelle classe pour traduire vos libellés avec les arguments :
    <?= $this->lang->line('list.evenements.title', $month.'/'.$year) ?>

Dernière modification : si la traduction n’est pas retrouvée, afficher le premier paramètre.

Intégration du GanttCalendar

Suite à l’article sur le GanttCalendar, j’ai intégré ce plugin jquery dans une application web en PHP : « ExoPlanet ».

Intégration dans une application

Le plugin est tout à fait fonctionnel. Les évènements sont présentés sur 1 mois, le Gantt au dessus et la liste des évènements sous forme de tableau en dessous.

Le plugin a été intégré en quelques heures ; le paramétrage a été le plus long.

Time Counted Dev : Design & deploy

J’ai un peu de temps pour faire un déploiement complet d’une application en partant du début, avec l’outil qui génère du code PHP.

  • 18h40 : j’ai lancé Eclipse, je vérifie que mon serveur web et MySQL sont toujours en marche : http://localhost/phpmyadmin/index.php
  • 18h41 : je vais sur http://jc.specs.free.fr/ pour designer les entités de mon application (je choisis specs v2 car il est le plus abouti)
  • 18h44 : je crée l’application « Biblo-BD » : une bibliothèque d’albums de BD
  • 18h45 : en attentant que Free.fr réponde, je configure le projet sous Eclipse :
    • vue PHP : projet / nouveau « bibloBD »
    • je reprend le ZIP du template d’application (: fichiers de CodeIgniter, vue de connexion, helper pour les dates SQL et JS+CSS sympatiques) et je décompresse tout ca dans mon répertoire eclipse
    • F5 sous Eclipse pour tout mettre à jour
    • 18h51 : je configure la base de données depuis le fichier « application/config/database » : $db['default']['database'] = « bibliobd »;
  • 18h53 : je repasse dans specs v2 pour définir les entités. Cette étape peut être relativement longue, surtout s’il y a beaucoup d’entités…
  • 19h07 : 4 entités sont créées (plutôt simple, avec des dépendances entre elles) :
    • Album (id, ref externe, dessinateur, scénariste, genre)
    • Auteur (id, nom, prénom, nationalité)
    • Genre (id, libellé)
    • Utilisateur (id, login, mot de passe) — juste pour se connecter…
  • 19h09 : je crée la base de données en local avec phpMyAdmin : « bibliobd » (avec tous les paramètres par défaut)
  • 19h10 : je génère le XML des entités (fichiers à télécharger), en créant un répertoire « sources » et j’y colle les 4 fichiers (+ un F5 dans Eclipse)
  • 19h12 : je jette un oeil sur les fichiers XML et je vérifie que la coloration du formatage XML est propre
  • 19h13 : je configure le générateur : j’ouvre le fichier « theme.cfg » pour changer quelques valeurs :
    • « theme=InternetDreams » : ce sera le thème visuel de l’application
    • « outDirFor_Classes=/home/julien/workspace/biblioBD/application/ » : le répertoire de destination des fichiers générés
    • « database=bibliobd »
    • « generate=all » : génère tous les types de fichiers
  • 19h16 : je lance la commande qui génère les fichiers :
    ./generate.py ../biblioBD/sources/*.xml
  • 19h19 : je fais un F5 dans Eclipse : je contrôle les fichiers générés
  • 19h20 : j’ouvre les fichiers SQL générés et je colle les ordres SQL de création de tables dans phpMyAdmin. Puis je lance les ordres de contraintes de clé étrangères.
  • 19h25 : je vais configurer le serveur web : /etc/apache2/conf.d/bilbiobd.conf
  • 19h29 : redémarrage d’apache
  • 19h30 : tentative de connexion : http://localhost/bibliobd/
  • 19h30 : configuration de la connexion web : fichier « application/config/config.php »
  • 19h32 : modification du contrôle d’accès : « application/controllers/welcome.php » (: faire en sorte qu’on arrive sur la page qui liste les BD). Par défaut, avec le compte « admin/admin », on se connecte.
  • 19h44 : navigation dans le code pour voir si tout est en place
  • 19h45 : utilisation de l’application pour créer des entités et voir si elles sont répercutées dans les autres écrans (saisie de l’URL directement)
  • 19h46 : modification des liens du menu par défaut afin de proposer des liens sur la gestion des entités : « application/helpers/views_helper.php », fonction « htmlNavigation »
  • 19h50 : contrôle des pages

Il reste à définir les règles spécifiques à chaque cas et la gestion des utilisateurs.

Résultat : 1h10 pour mettre en ligne une application de gestion complète, avec les liens entre les entités.

 

Optimisations possibles :

  • générer automatiquement le menu (opération complexe — la mise à jour manuelle est plus rapide)