PHP/Gettext Problèmes

Je me souviens de l'exécution de certains tests il y a quelques mois avec gettext et le code suivant a parfaitement fonctionné:

putenv('LANG=l33t');
putenv('LANGUAGE=l33t');
putenv('LC_MESSAGES=l33t');

if (defined('LC_MESSAGES')) //available if PHP was compiled with libintl
{
    setlocale(LC_MESSAGES, 'l33t');
}

else
{
    setlocale(LC_ALL, 'l33t');
}

bindtextdomain('default', './locale'); //./locale/l33t/LC_MESSAGES/default.mo
bind_textdomain_codeset('default', 'UTF-8');
textdomain('default');

echo _('Hello World!'); //h3110 w0r1d!

Cela a fonctionné parfaitement (sous Windows XP et CentOS si je me souviens bien), ce qui était bien car je pouvais utiliser arbitraire "locales", sans avoir à se soucier si elles ont été installées sur le système ou non. Cependant, cela ne semble pas fonctionner, je me demande pourquoi...


Red Hat + PHP 5.2.11:

Je suis capable de faire un aller retour à partir de diverses localités et les traductions afficher correctement tant que le setlocale() appel ne retourne pas false (si les paramètres régionaux est disponible/installé sur le système).

Ce n'est pas parfait (ce serait génial si je pouvais juste point de gettext pour n'importe quel répertoire de traduction sans avoir à tester l'existence de la locale), mais c'est acceptable. Je vais exécuter des tests un peu plus tard.

Windows 7 + PHP 5.3.1 (XAMPP):

setlocale() renvoie toujours false (même lors de l'utilisation de LC_ALL au lieu de LC_MESSAGES), à moins que j'utilise Windows valide paramètres régionaux tels que eng, deu ou ptg - dans ce cas, les paramètres régionaux semble correctement, mais les traductions ne comprends toujours pas. Je ne peux pas tester pour l'instant parce que j'ai des centaines d'onglets ouverts, mais je pense que le premier appel à ce script donne la traduction correcte (redémarrage d'Apache ne suffit pas).

Je ne sais pas si c'est lié à l' PHP Bug #49349. Je vais le tester c'est un couple d'heures.


Est-il possible d'utiliser l'extension gettext (pas pur PHP implémentations comme php-gettext ou la Zend Traduire Adaptateur) de manière fiable à travers différents systèmes d'exploitation (éventuellement avec personnalisé locales comme l33t)?

Aussi, est-il absolument nécessaire d'utiliser setlocale(LC_ALL, ...)? Je voudrais préférez quitter la TIME, NUMERIC et MONETARY (spécialement) paramètres régionaux intacte (par défaut POSIX locale).


J'ai eu une idée... Serait-il possible d'appeler setlocale() avec un très commun de paramètres régionaux (comme C, POSIX ou en_US) et de spécifier la langue via le domaine? Quelque chose comme ceci:

/lang/C/LC_MESSAGES/domain.pt.mo
/lang/C/LC_MESSAGES/domain.de.mo
/lang/C/LC_MESSAGES/domain.en.mo
/lang/C/LC_MESSAGES/domain2.pt.mo
/lang/C/LC_MESSAGES/domain2.de.mo
/lang/C/LC_MESSAGES/domain2.en.mo

Serait-ce de travailler sur *nix et Windows plataforms sans problèmes?

  • Question similaire: stackoverflow.com/questions/1870320/...
  • C'est pourquoi je branlant la haine gettext. Il serait si facile, si pas de cette horreur, horrible, inutile de chaos. Curieux de voir si quelque chose arrive.
  • Pour ce que ça vaut, je suis en utilisant Zend_Locale - il peut traiter des fichiers gettext, trop.
  • Ouais, je me demande ce que des solutions fiables étaient disponibles avant ZF. Utilisez-vous Zend_Locale seul ou en combinaison avec Zend_Translate?
  • désolé, je voulais dire Zend_Translate ici. Ouais, c'est ce que j'utilise.
  • voir aussi stackoverflow.com/questions/1620670/... cette question m'a fait utiliser Zend.
  • J'ai lu chaque question unique sur DONC en ce qui concerne PHP et Gettext, c'est pourquoi j'ai eu tellement de nombreux onglets ouverts - en fait, j'ai même répondu à votre question (il travaillait alors!). Cette question a été très peu de points de vue, je vais sans doute attendre encore 2 jours et de commencer une prime. Je crois toujours qu'il doit y avoir un moyen fiable d'utiliser le natif de l'extension gettext, après tout il a été livré avec PHP depuis la version 4.2.0, longtemps avant ZF et même le cadre hype... C'est une honte que nous avons à dépend de l'endroit, il serait tellement plus facile si nous pouvions dire gettext: "les traductions sont ici, utilisez em".
  • vrai. C'est une simple tâche assez. Intéressé pour voir ce qui arrive!
  • J'ai juste eu une idée folle: setlocale(LC_ALL, 'C'); bindtextdomain('default', './locale/l33t/C');, je me demande si ça va marcher.
  • Axel: j'ai bien aimé votre idée folle. J'ai essayé et il fonctionne, MAIS pas sur Windows multithread PHP. Encore une fois, bindtextdomain() est un processus de large et se casse encore le moteur de traduction. Belle tentative. Nous avons besoin d'un moyen de remplacer les paramètres régionaux par PHP exemple, ou un simple paramètre pour remplacer les paramètres régionaux dans la bibliothèque gettext.
  • Awww... Quelqu'un devrait faire un jeu de paramètres régionaux indépendants version de gettext, mis en œuvre comme extension PHP.

InformationsquelleAutor Alix Axel | 2010-08-03