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 avecZend_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.
Vous devez vous connecter pour publier un commentaire.
Gettext n'est pas trop pratique pour les webapps.
Donc je souhaite parfois que le module PHP n'existerait pas, et la pratique
_()
nom de la fonction de raccourci était à la disposition des utilisateurs des mises en œuvre.(A mon propre gettext.php, qui a travaillé plus fiable.)
Vos options:
Anway, selon quelques rapports de bogues de Windows port de gettext avait quelques défauts avec l'encodage UTF-8. Peut-être que votre version est affectée à nouveau. Donc, essayez
bind_textdomain_codeset('default', 'ISO-8859-1');
pour les débutants. Aussi, il semble préférer les variables d'environnement de Windows IIRC, doncputenv("LC_ALL", "fr_FR");
pourrait fonctionner mieux quesetlocale()
. Surtout réalisable si vous dl(gettext.dll) plus tard.Aussi lui donner une chance avec notamment un jeu de caractères à droite, il y
LANG=en_GB.ISO-8859-1
. (Depuis votre texte source est l'anglais de toute façon, se soucier de le jeu de caractères n'est pas très relavant ici; mais c'est probablement un cas courant où gettext de voyages sur lui-même.) Oh, et, à l'occasion, c'est UTF8 pas en UTF-8; aussi essayer ASCII.Sinon contourner gettext. Votre domaine idée est proche, mais je serais tout simplement utiliser un pré-défini ./locale/subdir pour les langues:
Alors il suffit d'invoquer
bindtextdomain("default", "./lang/{$APP_LANG}/locale")
sans donner gettext à interpréter beaucoup. Il sera toujours regarder vers le haut /C/, mais la bonne localisation du répertoire a été injecté déjà. Mais essayez d'avoir un lien symbolique à partir de l' $LANG à /C/y, de toute façon.Mordre dans la gnu. Donner sur gettext. "PhpWiki" avait une coutume awk script de conversion. Il transforme .les fichiers po dans .tableau php scripts (ouais très oldschool), et utilise un __() à la place. De près. Et plus fiable.
gettext
, vous pouvez tenter d'utiliser l'unité de soins intensifs module pour analyserHTTP_ACCEPT_ENCODING
encore PHP neutres de l'utilité de l'API: stackoverflow.com/q/5788824/175849Ce code ne fonctionne pas parfaitement sur tous les systèmes, parce que tous les systèmes régionaux référentiel + la version de php est différente, entre autres choses.
Si vous voulez consistance que vous devez utiliser quelque chose comme Zend_Translate, qui, si vous installer Zend sur chaque système ( la même version de celui-ci ), ils devraient tous être compatibles les uns avec les autres, car elles utilisent les mêmes données de localisation, la localisation des noms et de la base de code.
Il y a de nombreux bugs avec
setlocale
, c'est juste pas fiable. Voir les commentaires @ http://php.net/manual/en/function.setlocale.phpsetlocale
est vraiment terrible. Est-il un moyen de reprendre la baisse de vote?