gettext et fonction personnelle

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : gettext et fonction personnelle

Re: gettext et fonction personnelle

par jojolapine » 27 juil. 2010, 15:54

Ah! je ne connaissais pas! merci beaucoup je vais voir ce que je peux en faire ;)

Re: gettext et fonction personnelle

par mojorisin » 27 juil. 2010, 15:46

Essais avec cette fonction alors :
<?php
function tr(){
    $args = func_get_args();
    $sentence = array_shift($args);

    return vsprintf(_($sentence), $args);
}

echo tr('test %s sur %s essais',1,2);
?>

Re: gettext et fonction personnelle

par jojolapine » 27 juil. 2010, 11:08

Bonjour à tous,

Alors après plusieurs tests, voici les résultats...
Tout d'abord les fonctions utilisées:
<?php
function t1($text){

    // récupération du nombre d'argument
    $numargs = func_num_args();

    // si un seul argument
    // simple retour de la traduction
    if($numargs == 1){

        return _($text);
    }
    // sinon on utilise sprintf
    else {
        $args = func_get_args();

        $args[0]=_($args[0]);

        return call_user_func_array('sprintf',$args);
    }
}


/*
t1('youpi');
t1('1:%s 2:%s','foo','bar');
*/



function t2($text, Array $params = array()){

    $text = _($text);
    if(!empty($params)){

      $keys = array_keys($params);
      $search = array();

      foreach ($keys as $element) {
        $search[] = '{' . $element . '}';
      }

      $text = str_replace($search,$params,$text);
    }

    return $text;
}

/*
t2('blablabla');
t2('Bonjour {username}, you are {adjectif}',array('username'=>'paul','adjectif'=>'beautiful'));
*/
Et le fichier de test:
<?php
// bench sur les méthodes!

  $nb_iterations = 10000;

  echo '<h1>Méthode sprintf + _()</h1><div style="height:100px;overflow:auto">';

  $start = microtime(true);

  for($i = 0; $i < $nb_iterations;$i++){

    echo sprintf(_("Bienvenue %s!"),'Paul');
    echo _("Youpla Boum!");
    echo sprintf(_("You are so %s!"),'beautiful');
    echo sprintf(_("Lorem Elsass ipsum réchime Pfourtz !
    quam. %s Mauris auctor, nullam tristique bissame eleifend %s commodo libero.
    lotto-owe dolor messti de Bischheim chambon porta elit geht's schneck
    Christkindelsmärik Verdammi %s yeuh. dignissim gravida semper Chulia
    Roberstau non kougelhopf hop ante geïz wurscht ac sagittis ornare
    rhoncus sit hopla hopla sed tellus mollis Huguette mamsell vulputate
    gewurztraminer Gal. amet munster Heineken Salu %s bissame dui schnaps
    blottkopf, amet varius morbi ftomi! placerat lacus leo quam, in,
    Wurschtsalad kartoffelsalad risus, ch'ai bredele aliquam Hans
    leverwurscht merci %s vielmols ornare Gal ! Chulien condimentum nüdle
    knepfle %s vielmols, habitant Coopé de Truchtersheim Oberschaeffolsheim
    salu jetz gehts los libero, hopla purus Carola Strasbourg %s Salut
    bisamme météor rucksack %s id, gal Spätzle leo consectetur libero,
    picon bière so adipiscing tellus hoplageiss non s'guelt amet,
    sed rossbolla schpeck Racing. baeckeoffe Kabinetpapier turpis,
    suspendisse tchao %s bissame und turpis wie Richard Schirmeck
    Pellentesque barapli hopla sit kuglopf Miss Dahlias Yo dû.
    ullamcorper %s knack elementum et sit senectus eget pellentesque
    flammekueche Morbi id ac Oberschaeffolsheim mänele DNA, ."),
    1,2,3,4,5,6,7,8,9,10);
  }
  $end = microtime(true);
  echo '</div><hr />';
  $time_1 = $end - $start;

  echo '<h1>Méthode t1</h1><div style="height:100px;overflow:auto">';

  $start = microtime(true);

  for($i = 0; $i < $nb_iterations;$i++){

    echo t1("Bienvenue %s!",'Paul');
    echo t1("Youpla Boum!");
    echo t1("You are so %s!",'beautiful');
    echo t1("Lorem Elsass ipsum réchime Pfourtz !
    quam. %s Mauris auctor, nullam tristique bissame eleifend %s commodo libero.
    lotto-owe dolor messti de Bischheim chambon porta elit geht's schneck
    Christkindelsmärik Verdammi %s yeuh. dignissim gravida semper Chulia
    Roberstau non kougelhopf hop ante geïz wurscht ac sagittis ornare
    rhoncus sit hopla hopla sed tellus mollis Huguette mamsell vulputate
    gewurztraminer Gal. amet munster Heineken Salu %s bissame dui schnaps
    blottkopf, amet varius morbi ftomi! placerat lacus leo quam, in,
    Wurschtsalad kartoffelsalad risus, ch'ai bredele aliquam Hans
    leverwurscht merci %s vielmols ornare Gal ! Chulien condimentum nüdle
    knepfle %s vielmols, habitant Coopé de Truchtersheim Oberschaeffolsheim
    salu jetz gehts los libero, hopla purus Carola Strasbourg %s Salut
    bisamme météor rucksack %s id, gal Spätzle leo consectetur libero,
    picon bière so adipiscing tellus hoplageiss non s'guelt amet,
    sed rossbolla schpeck Racing. baeckeoffe Kabinetpapier turpis,
    suspendisse tchao %s bissame und turpis wie Richard Schirmeck
    Pellentesque barapli hopla sit kuglopf Miss Dahlias Yo dû.
    ullamcorper %s knack elementum et sit senectus eget pellentesque
    flammekueche Morbi id ac Oberschaeffolsheim mänele DNA, .",
    1,2,3,4,5,6,7,8,9,10);
  }
  $end = microtime(true);
  echo '</div><hr />';
  $time_2 = $end - $start;

  echo '<h1>Méthode t2</h1><div style="height:100px;overflow:auto">';

  $start = microtime(true);

  for($i = 0; $i < $nb_iterations;$i++){

    echo t2("Bienvenue {username}!",array('username'=>'Paul'));
    echo t2("Youpla Boum!");
    echo t2("You are so {adj}!",array('adj'=>'beautiful'));
    echo t2("Lorem Elsass ipsum réchime Pfourtz !
    quam. {1} Mauris auctor, nullam tristique bissame eleifend {2} commodo libero.
    lotto-owe dolor messti de Bischheim chambon porta elit geht's schneck
    Christkindelsmärik Verdammi {3} yeuh. dignissim gravida semper Chulia
    Roberstau non kougelhopf hop ante geïz wurscht ac sagittis ornare
    rhoncus sit hopla hopla sed tellus mollis Huguette mamsell vulputate
    gewurztraminer Gal. amet munster Heineken Salu {4} bissame dui schnaps
    blottkopf, amet varius morbi ftomi! placerat lacus leo quam, in,
    Wurschtsalad kartoffelsalad risus, ch'ai bredele aliquam Hans
    leverwurscht merci {5} vielmols ornare Gal ! Chulien condimentum nüdle
    knepfle {6} vielmols, habitant Coopé de Truchtersheim Oberschaeffolsheim
    salu jetz gehts los libero, hopla purus Carola Strasbourg {7} Salut
    bisamme météor rucksack {8} id, gal Spätzle leo consectetur libero,
    picon bière so adipiscing tellus hoplageiss non s'guelt amet,
    sed rossbolla schpeck Racing. baeckeoffe Kabinetpapier turpis,
    suspendisse tchao {9} bissame und turpis wie Richard Schirmeck
    Pellentesque barapli hopla sit kuglopf Miss Dahlias Yo dû.
    ullamcorper {10} knack elementum et sit senectus eget pellentesque
    flammekueche Morbi id ac Oberschaeffolsheim mänele DNA, .",
    array('1'=>1,'2'=>2,'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9,'10'=>10));
  }
  $end = microtime(true);
  echo '</div><hr />';
  $time_3 = $end - $start;

  echo  '<p>Nb itérations: '.$nb_iterations.'<br />sprintf() + _() : '.$time_1.
        '<br />t1() : '.$time_2.
        '<br />t2() : '.$time_3.'</p>';
Les résultats:

Code : Tout sélectionner

Nb itérations: 10 sprintf() + _() : 0,00078296661377 t1() : 0,00163102149963 t2() : 0,00156879425049 Nb itérations: 100 sprintf() + _() : 0,0076539516449 t1() : 0,0168409347534 t2() : 0,0158441066742 Nb itérations: 1000 sprintf() + _() : 0,0772478580475 t1() : 0,165311098099 t2() : 0,157105922699 Nb itérations: 10000 sprintf() + _() : 0,798131942749 t1() : 1,6633169651 t2() : 1,55909395218
Comme vous pouvez le constater, j'ai utiliser trois courts textes avec peut de variables à insérer ou pas du tout.
Et un texte un peu plus conséquent avec 10 variables à insérer...

Les résultats sont bien sûr en faveur de la première méthode qui n'utilise aucune surcouche... mais je l'écarte pour cause d'illisibilité!
Je pensais que la deuxième méthode passerait devant, mais en fait l'utilisation de call_user_func_array() semble lui porter préjudice... Si vous avez une idée de comment combiner l'appel à sprintf() et l'utilisation du nombre d'argument variable (fun_get_args), sans passer par cette dernière, je suis preneur!

Au final, en terme d'utilisabilité, il serait peut-être judicieux de combiner la première et la deuxième méthode, afin d'être plus souple... mais les performances vont peut-être en pâtir...

Votre avis?

Re: gettext et fonction personnelle

par jojolapine » 27 juil. 2010, 09:44

Parce que c'est à mon gout illisible dans un code source! :)
(je suis en train de faire des benchs, je devrais avoir des résultats dans la matinée!)

Re: gettext et fonction personnelle

par mojorisin » 27 juil. 2010, 09:28

Pourquoi ne pas utiliser la fonction sprintf conjointement avec gettext ?
sprintf(_('%d message'), $number);

gettext et fonction personnelle

par jojolapine » 26 juil. 2010, 12:00

Bonjour à tous,

Je vais devoir passer une application sous gettext pour l'internationalisation...
Seulement le principal défaut de la fonction gettext() (ou _()) c'est l'impossibilité de passer des arguments à la manière de printf()...
Donc si vous avez déjà utilisé gettext vous avez surement fait votre propre petite fonction?
Je voudrais votre avis sur les deux propositions ci-dessous, en terme d'une part de performances, et d'autres de lisibilité dans le code...
<?php


function t1($text){

    // récupération du nombre d'argument
    $numargs = func_num_args();

    // si un seul argument
    // simple retour de la traduction
    if($numargs == 1){
        
        return _($text);
    }
    // sinon on utilise sprintf
    else {
        $args = func_get_args();

        $args[0]=_($args[0]);

        return call_user_func_array('sprintf',$args);
    }
}


t1('youpi');
t1('1:%s 2:%s','foo','bar');



function t2($text, Array $params = array()){

    $text = _($text);
    
    if(!empty($args)){
        
      foreach (array_keys($params) as $element) {
        $search[] = '{' . $element . '}';
      }

      $text = str_replace($search,$params,$text);
    }

    return $text;
}

t2('blablabla');
t2('Bonjour {username}, you are {adjectif}',array('username'=>'paul','adjectif'=>'beautiful'));

Merci d'avance!
Et n'hésitez pas à montrer vos petites surcouches à vous!