Forum Programmation.php Gettext change de langue

Posté par  (site web personnel) .
Étiquettes :
0
9
fév.
2007
Hello à tous,
voilà je fais un petit site sur lequel je veux mettre une internationalisation en français, anglais et néerlandais.

j'ai donc tout au début de mon code quelque chose du style :


$language='en_US';
$this->language=$language;
$language.='.utf8';
putenv("LANG=$language");
setlocale(LC_ALL, $language);
$domain = $this->language;
bindtextdomain($domain,'/var/www/site/locale');
textdomain($domain);


et j'ai dans mon arborescence un dossier

/locale
|------en_US
|-----LC_MESSAGES
|----en_US.po
|----en_US.mo
|------fr_Fr
|-----LC_MESSAGES
|----fr_FR.po
|----fr_FR.mo
....


puis dans mon code j'ai des truc comme


echo _('Envoyer');


et ça marche... mais seulement de temps en temps. je m'explique :
il arrive quand rechargeant une page ou en visitant le site, php change de locale comme ça paf parce qu'il l'a décidé.

je sais pas comment faire fonctionner cette chose à tous les coup :)
Help :D

merci

ps: je suis sous ubuntu edgy eft donc bien sur en UTF8
  • # Oups

    Posté par  (site web personnel) . Évalué à 1.

    oups j'ai oublier de donner mes locales :


    bmaron@marcel:/var/www/site/locale$ locale -a
    C
    en_AU.utf8
    en_BW.utf8
    en_CA.utf8
    en_DK.utf8
    en_GB.utf8
    en_HK.utf8
    en_IE.utf8
    en_IN
    en_NZ.utf8
    en_PH.utf8
    en_SG.utf8
    en_US
    en_US.utf8
    en_ZA.utf8
    en_ZW.utf8
    fr_BE.utf8
    fr_CA.utf8
    fr_CH.utf8
    fr_FR.utf8
    fr_LU.utf8
    nl_BE.utf8
    nl_NL.utf8
    POSIX


    • [^] # Re: Oups

      Posté par  (site web personnel) . Évalué à 3.

      Si tu utilise du modèle objet (et que tu fais pas de la vrai vrai localisation, juste en,fr,nl), pourquoi ne par faire un peu plus simple ?

      define('LANG_DEFAULT', 'fr');

      A ta classe tu ajoute :
      public $locale = array();
      public $lang = LANG_DEFAULT;

      Au constructeur tu ajoute une fonction qui récupère le meilleur choix de langue en fonction des langues du navigateurs.

      Et une fonction getText($text) comme ça :
      //Generate md5 of text
      $md5 = md5($text);
      //Check if result is already on cache
      if (!empty($this->locale[$md5]))
          //Return cache value
          return $this->locale[$md5];
      //The request
      $req = 'SELECT `tranlated` '.
      'FROM `machin_locale` '.
      'WHERE `lang` = \''.$this->lang.'\' '.
      'AND `key` = \''.$this->db->escape($text).'\' '.
      'LIMIT 0,1;';
      //Get the result
      $res = $this->db->getOne($req);
      //Check if error happen
      if (PEAR::isError($res))
      {
          //Trigger the notice (don't translate that message, else you will get infinite loop!)
          trigger_error($res->getMessage(), E_USER_NOTICE);
          //Return
          return;
      }

      //Check if $res is empty
      if (empty($res))
      {
          //Trigger the notice (don't translate that message, else you will get infinite loop!)
          trigger_error('Localized text in lang: '.$this->lang.' for: \''.$text.'\' is not avaible', E_USER_NOTICE);
          //Return not localized text
          return $text;
      }
      //Else
      else
      {
          //Store in cache
          $this->locale[$md5] = $res;
          //Return localized text
          return $res;
      }

      Bon après je suis sans ressources, alors pour un don de quelques euros je te passe la classe complète et l'explication qui va avec de pourquoi j'ai laissé tomber le système de traduction gettext.
  • # locale de la thread apache

    Posté par  . Évalué à 2.

    Ça me rappelle un probleme que j'ai eu il y a assez longtemps...
    Si je me souviens bien, ça vient de trois choses:
    - on ne peut faire un bindtextdomain() / textdomain() qu'une seule fois dans un processus/thread (le 2eme n'a aucun effet)
    - il s'applique au processus C qui l'heberge, à savoir la thread/processus Apache au dessus
    - Apache a un pool de threads qu'il réutilise pour plusieurs pages, au bout d'un certain temps il les tue et en recrée.

    Donc, la première page chargée va établir une bonne fois pour toute la localisation de la thread Apache correspondante; les autres pages qui seront gérée par cette thread garderont la localisation, même si elles en voulaient une autre.

    Le problème c'est que je ne me souveniens pas de la solution que j'avais trouvé à l'époque... peut-être changer la conf d'apache pour que chaque sous-process meurt apres chaque page fournie ?...
    • [^] # Re: locale de la thread apache

      Posté par  . Évalué à 3.

      Finalement c'est plutot setlocale(), voir le gros warning sur http://fr2.php.net/setlocale qui décrit le probleme: un setlocale dans une thread apache va changer la locale du process et donc de toutes les autres threads.
      Il doit y avoir une config Apache qui permette d'avoir des pools de vrais process forkés au lieu d'avoir des threads, pour que personne ne se marche sur les pieds.
      • [^] # Re: locale de la thread apache

        Posté par  . Évalué à 1.

        il me semble que tu peux localiser directement dans la conf d'apapche mais il va alors se baser sur l'adresse ip du visiteur

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.