Internationaliser scripts php : un outil ?

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 :stuck_out_tongue: c’est pour passer plusieurs centaines de ko de code dans cette appli « moulinette » (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 ?

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 :stuck_out_tongue:

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? :stuck_out_tongue:

[quote name=‹ LoneWolf › 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?  :stuck_out_tongue:
[right][post=« 321681 »]<{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 ?

[quote name=‹ Clams › 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 :stuck_out_tongue:
[right][post=« 321679 »]<{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 :stuck_out_tongue:

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).

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.

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…)

[quote name=‹ GloP › 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=« 322302 »]<{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 :wink:
D’ailleurs, ca me botterait bien un petit stage chez MS cet été…

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.

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

Petit exemple bidouillé en quelques minutes (sachant que je n’ai jamais regardé ça avant en plus).

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

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

A+

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. :stuck_out_tongue: (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 :stuck_out_tongue: ] )

pas mal ton script unreal !
Glop > oui on sais, en asp.net, ça va trop bien pour le multi langage :stuck_out_tongue:

On peux le faire en XML non ?