# Internationaliser scripts php : un outil ?

**URL:** <https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796>\
**Category:** Dev\
**Created:** [Janvier 12, 2005, 6:00 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796 "2005-01-12T18:00:44Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![silicium](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/silicium/32/148763_2.png) [@silicium](https://forum.geekzone.fr/u/silicium)\
**Post date:** [Janvier 12, 2005, 6:00 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/1 "2005-01-12T18:00:44Z")

</div>

lu all !

je cherche une application pouvant extraire automatiquement des chaines de textes de fichiers sources. dans mon cas présent, du php. l’appli balaye des fichiers, extrait des chaines, les copie dans un fichier dictionnaire, et remplace dans les sources originales les chaines par des codes identifiants qui vont bien. j’ai cherché un paquet d’heures mais je vois pas.

pour du code source java, eclipse faisait ca bien. mais impossible de réitérer pour du php 😛 c’est pour passer plusieurs centaines de ko de code dans cette appli «&nbsp;moulinette&nbsp;» (alors à la main je me fais seppuku).

après hop, je traduis mon appli (GPL) dans différentes langues (anglais en priorité).

je me refuse à utiliser gettext, qui est très restrictive (obligation d’installation/configuration sur tous les serveurs utilisant l’application).

des liens ? des noms ? un paquet de chips ?

---

<div class="post-metadata">

**Author:** ![Clams](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/clams/32/145_2.png) [@Clams](https://forum.geekzone.fr/u/Clams)\
**Post date:** [Janvier 12, 2005, 6:25 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/2 "2005-01-12T18:25:41Z")

</div>

Pour ce genre de manip j’aurais tendance à dire que rien ne vaut un bon script perl.  
Pour le paquet de chips, je le garde, c’est des Vico, j’adore 😛

---

<div class="post-metadata">

**Author:** ![LoneWolf](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/lonewolf/32/125515_2.png) [@LoneWolf](https://forum.geekzone.fr/u/LoneWolf)\
**Post date:** [Janvier 12, 2005, 6:35 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/3 "2005-01-12T18:35:58Z")

</div>

> [@](#):
>
> je me refuse à utiliser gettext, qui est très restrictive (obligation d’installation/configuration sur tous les serveurs utilisant l’application).

ouais. Comment reinventer la roue quoi. gettext est peut etre contraignant a l’installation mais une fois installe, c’est la meilleure solution que je connaisse.

C’est pas un hasard si gettext est utilise dans la majorite des logiciels open source, que ce soit en C, C++ et PHP.

LoneWolf  
Pourquoi faire simple quand on peut faire complique? 😛

---

<div class="post-metadata">

**Author:** ![silicium](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/silicium/32/148763_2.png) [@silicium](https://forum.geekzone.fr/u/silicium)\
**Post date:** [Janvier 12, 2005, 8:13 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/4 "2005-01-12T20:13:27Z")

</div>

[quote name=‹&nbsp;LoneWolf&nbsp;› date=’ 12 Jan 2005, 19:35’]ouais. Comment reinventer la roue quoi. gettext est peut etre contraignant a l’installation mais une fois installe, c’est la meilleure solution que je connaisse.

C’est pas un hasard si gettext est utilise dans la majorite des logiciels open source, que ce soit en C, C++ et PHP.

LoneWolf  
Pourquoi faire simple quand on peut faire complique?&nbsp; 😛  
[right][post=«&nbsp;321681&nbsp;»]\<{POST\_SNAPBACK}\>[/post][/right][/quote]  
je l’ai déjà dit, je refuse gettext. pas pour moi. mais parce mon appli est libre, téléchargée et utilisée par d’autres personnes. et même si moi je peux jouer avec gettext, eux doivent alors aussi l’avoir sur leur serveur web. et ceux qui sont en serveur mutualisé (la majorité) peuvent pas demander ce genre d’appli à leur hébergeur (mutualisé, tu fais avec ce qu’on te donne, c’est-à-dire du standard pas trop poussé). donc souci de compatibilité. utiliser gettext, ce serait me tirer une balle dans le pied, des gens qui utilisent mon appli, devraient y renoncer…tu saisis lonewolf, pas bon le choix.

un autre outil que gettext ?

---

<div class="post-metadata">

**Author:** ![silicium](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/silicium/32/148763_2.png) [@silicium](https://forum.geekzone.fr/u/silicium)\
**Post date:** [Janvier 12, 2005, 8:15 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/5 "2005-01-12T20:15:08Z")

</div>

[quote name=‹&nbsp;Clams&nbsp;› date=’ 12 Jan 2005, 19:25’]Pour ce genre de manip j’aurais tendance à dire que rien ne vaut un bon script perl.  
Pour le paquet de chips, je le garde, c’est des Vico, j’adore 😛  
[right][post=«&nbsp;321679&nbsp;»]\<{POST\_SNAPBACK}\>[/post][/right][/quote]  
j’ai pas trop envie de me coder mon outil…mais je vais y arriver si je trouve rien qui me va. perl, pas connaître, po grave, je ferais un parseur en php 😛

---

<div class="post-metadata">

**Author:** ![girafologue](https://forum.geekzone.fr/letter_avatar_proxy/v4/letter/g/e47774/32.png) [@girafologue](https://forum.geekzone.fr/u/girafologue)\
**Post date:** [Janvier 14, 2005, 8:47 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/6 "2005-01-14T08:47:46Z")

</div>

Entre nous, quand je code en PHP, toutes mes chaines de caractères sont dans un fichier à part que j’include selon la langue voulu.  
par exemple pour le fichier index.php, je place les strings anglaises dans le fichier index\_english.str, et au début du fichier index.php je fais un include(“index\_”.$lang.".str");  
la variable $lang tu la stocke ou tu veux (fichier de config, db etc…)  
Cela permet par exemple de laisser à l’utilisateur le choix de la langue dans laquelle il veut voire s’afficher le site.  
Cela permet aussi une traduction beaucoup plus facile.  
Le seul inconvénient, c’est qu’il faut que tout le texte affiché dans tes pages soit dans des variables et du coup tu dois mettre des echo partout (et ton appli consomme un peu plus de mémoire).

---

<div class="post-metadata">

**Author:** ![silicium](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/silicium/32/148763_2.png) [@silicium](https://forum.geekzone.fr/u/silicium)\
**Post date:** [Janvier 14, 2005, 10:22 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/7 "2005-01-14T10:22:17Z")

</div>

girafologue : quand je parlais de coder mon outil, j’avais évidemment prévu de faire un dictionnaire avec chargement en fonction de la config de l’utilisateur. ce que je cherche c un outil pour extraire mes chaines de mes scripts pour éviter le plus gros des manips à la main.

sinon pour mon dictionnaire, j’ai prévu une fonction traduire($id) qui charge un code chaine d’un fichier langue (LANG en constante). sachant que derrière (dans traduire()) je fais un printf($chaine, $arg), histoire que chaque dictionnaire local puisse reformater la chaine avec les arguments en fonction de la langue. car les francais/anglais/autres n’ont pas le meme ordre des jour/mois dans une date par exemple.

---

<div class="post-metadata">

**Author:** ![GloP](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/glop/32/128237_2.png) [@GloP](https://forum.geekzone.fr/u/GloP)\
**Post date:** [Janvier 14, 2005, 10:28 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/8 "2005-01-14T10:28:41Z")

</div>

C’est bien le probleme… la localisation va bien plus loin qu’un simple remplacement de chaine.  
Les tri par ordre alphabetique est aussi fondamentalement different dans certaines locales. La maniere de grouper les chiffres, les ponctuation pour . et , les symboles monetaires, les comparaisons de chaines, les dates (ordre et autre). Il faut voir aussi qu’il faut supporter UTF pour une vrai localisation dans toutes les langues, voire supporter les “surrogate character” (avec les plan additionels A et B ) et un layout de droite a gauche pour les langues telle que l’arabe ou certaines langues orientales, etc,etc. Tu devrais faire attention de bien prendre en compte tous ces parametres selon tes besoins et ce que tu desires faire…

Pour ca qu’un vrai framework qui supporte une vrai notion de locale incorporant tous ces concepts en standard c’est loin d’etre un detail quand tu veux faire une vrai appli internationale…

(gni… je me suis retenu de faire de la pub…)

---

<div class="post-metadata">

**Author:** ![girafologue](https://forum.geekzone.fr/letter_avatar_proxy/v4/letter/g/e47774/32.png) [@girafologue](https://forum.geekzone.fr/u/girafologue)\
**Post date:** [Janvier 14, 2005, 11:05 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/9 "2005-01-14T11:05:27Z")

</div>

[quote name=‹&nbsp;GloP&nbsp;› date=’ 14 Jan 2005, 11:28’]Pour ca qu’un vrai framework qui supporte une vrai notion de locale incorporant tous ces concepts en standard c’est loin d’etre un detail quand tu veux faire une vrai appli internationale…

(gni… je me suis retenu de faire de la pub…)  
[right][post=«&nbsp;322302&nbsp;»]\<{POST\_SNAPBACK}\>[/post][/right][/quote]

Allez avoue que t’as failli rajouter .net derrière… mdr  
T’inquiete moi aussi je suis un .Net Fanboy 😉  
D’ailleurs, ca me botterait bien un petit stage chez MS cet été…

---

<div class="post-metadata">

**Author:** ![silicium](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/silicium/32/148763_2.png) [@silicium](https://forum.geekzone.fr/u/silicium)\
**Post date:** [Janvier 14, 2005, 12:00 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/10 "2005-01-14T12:00:25Z")

</div>

> [@](#):
>
> (gni… je me suis retenu de faire de la pub…)

oh oui ca s’est senti :P"

ce que tu expliques est très intéressant. toutefois, mon appli est un outil libre que je ne souhaite pas (encore) traduire dans toutes les langues du monde, donc je me passerais de fonctionnalités évoluées (utf, droite vers gauche, etc). du moment que tout le formatage passe bien en anglais avec un seul fichier de traductions, pareil pour le français, ca m’ira. je fais pas SPIP 2 ou je ne sais qel CMS pensé à fond multi linguisme.

---

<div class="post-metadata">

**Author:** ![unrealdtc](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/unrealdtc/32/41_2.png) [@unrealdtc](https://forum.geekzone.fr/u/unrealdtc)\
**Post date:** [Janvier 14, 2005, 2:49 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/11 "2005-01-14T14:49:09Z")

</div>

Pour les trucs arabes, je n’en sais rien (je parle pas arabe et je n’ai pas de locale arabe sur mon serveur 😛 ). Pour le reste, c’est relativement facile en php.

Petit [exemple](http://home.coolguys.org/temp/locale_test.php) bidouillé en quelques minutes (sachant que je n’ai jamais regardé ça avant en plus).

---

<div class="post-metadata">

**Author:** ![fch](https://forum.geekzone.fr/letter_avatar_proxy/v4/letter/f/6a8cbe/32.png) [@fch](https://forum.geekzone.fr/u/fch)\
**Post date:** [Janvier 14, 2005, 2:49 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/12 "2005-01-14T14:49:14Z")

</div>

Sans compter la gestion des pluriels, et de langue bien sympa qui gère le pluriel en fonction d’intervalle 😛

Si tu gère pas, tu te retrouve à faire des trucs bien naze genre : vous avez 1 message(s).

L’i18n, c’est la grosse merde a gérer dans les applications dynamiques.  
En php, gettext est la meilleure solution (ca gère les pluriels, l’encodage, ca parse les fichiers tout seul pour en extraire les chaînes, etc).

Cependant, à ma connaissance, il ne gère pas les formats monétaires, et évidement n’a absolument aucune incidence sur les critères de trie de données extraites d’une base. Faut utiliser les fonctions de localisation de la base, pour cela.

Autre problème, la langue à utiliser doit être initialisée avec un setenv() bien pourri.  
Ce qui veut dire que dans certaine configuration de php (CGI/module + un ou deux autre paramêtre du monde de l’ombre que je n’ai pas réussis à cerner), si deux clients font une requete en même temps, l’un pour de l’anglais, l’autre pour du russe, les deux se retrouverons avec une page soit anglais, soit russe. Pas glop du tout.

Solution : écrire en php l’extension gettext de php, comme cela, plus besoin de faire du setenv.

En gros, faut une fonction pour parser le fichier qui correspond à la langue du client et qui charge le resultat dans un tableau, une fonction pour extraire de ce tableau les chaines au singulier, et une autre pour extraire les chaines au pluriel.  
Et chance, le format des fichiers gettext est ouvert, et pas trop compliqué (faut utilise pack() pour parser le binaire, mais ca se fait relativement facilement).

Comme cela, on garde les outils de gettext pour extraire les chaines du source et gérer les traductions, et au niveau php, on a tout ce qui faut indépendament de l’extension gettext.

Voir ici pour un parser :  
[Parser gettext .po](http://drupal.kollm.org/tmp/drupal-phpdoc/locale_8inc.html#a5)

A+

---

<div class="post-metadata">

**Author:** ![unrealdtc](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/unrealdtc/32/41_2.png) [@unrealdtc](https://forum.geekzone.fr/u/unrealdtc)\
**Post date:** [Janvier 14, 2005, 3:27 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/13 "2005-01-14T15:27:12Z")

</div>

Juste pour preciser un truc : avec gettext faut que la localisation souhaitee soit effectivement installee sur le serveur. Genre, si on veut utiliser de\_DE alors qu’il n’y a que en\_US, en\_GB et fr\_FR sur le serveur, c’est mort. 😛 (et il va sans dire que pour utiliser gettext, il faut que php ait ete compile avec support gettext [ce qui est generalement le cas, ou alors l’admin est vraiment un gros looser 😛] )

---

<div class="post-metadata">

**Author:** ![fser](https://forum.geekzone.fr/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fser](https://forum.geekzone.fr/u/fser)\
**Post date:** [Janvier 15, 2005, 10:16 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/14 "2005-01-15T10:16:34Z")

</div>

pas mal ton script unreal !  
Glop \> oui on sais, en [asp.net](http://asp.net), ça va trop bien pour le multi langage 😛

---

<div class="post-metadata">

**Author:** ![avavrin](https://forum.geekzone.fr/user_avatar/forum.geekzone.fr/avavrin/32/125679_2.png) [@avavrin](https://forum.geekzone.fr/u/avavrin)\
**Post date:** [Janvier 16, 2005, 12:54 UTC](https://forum.geekzone.fr/t/internationaliser-scripts-php-un-outil/20796/15 "2005-01-16T00:54:34Z")

</div>

On peux le faire en XML non ?
