Localisation d'un soft: Solutions techniques

Suite a une discussion plus ou moins enflammee sur un autre thread, je voulais continuer en MP avec nic mais je me suis dit que ca pouvait servir a tout le monde.

Le probleme de la localisation est general a tous les langage, d’ou mon post sur segfault et pas sur webdev, puisqu’on pourrait parler de TOUS les langages.

Le monde open source utilise generalement gettext (PHP et C) qui a l’avantage (a mon sens) de fournir au programmeur ce qui va etre affiche a l’utilisateur: En lisant le code, on sait ce qui va etre affiche, ou au moins le sens avec une vrai phrase.

Dans l’autre thread, nic* (souvient plus du nombre :P) parlait d’une solution XML, c’est a dire que chaque sortie ecran a un identifiant et on a alors dans le code que des « affiche(125,lang) » pour tous les affichages. Il faut donc sans cesse regarder le fichier de traduction pour savoir a quoi ca correspond.
Et moi perso, je trouve ca contraignant.
Ah, dans ce que j’ai eu a utiliser comme systeme de localisation XML, il faut savoir que l’integralite du site etait stocke dans un fichier xml, ca faisait donc des milliers de lignes de texte a parcourir a chaque fois.

Voila deux methodes de localisation, et elles ont de gros defauts (toutes les deux, meme si je trouve gettext pratique pour le programmeur) : Quelle sont les votres?

LoneWolf
Allez, faites peter les techniques :stuck_out_tongue:

Personnelement, je bosse sur un projet perso avec assez peu de texte, donc c’est sans hesiter que j’utiliserai du XML.

Apres ça correspond un peu aussi aux limitations du projet meme qui est en Flash et aussi à la quantité assez restreinte de texte ( et aussi par gout perso )

Bah en php je fais comme beaucoup d’autres (dont le gars d’IPB) qui consiste a creer un gros array dans un fichier :

[code]<?php
$lang = array (

// Time
’posted’ => ‘Posté le $date à $time’,

// Comments
’comments_disabled’ => ‘Commentaires désactivés’,
‘same_name_as_member’ => ‘Il n’est pas autorisé de poster utilisant le pseudo d’un membre sans se logger.’,
‘quote’ => ‘Citer’,
‘said’ => ’ a dit :’,
[…]
)
?>[/code]

Apres je require le bon fichier et j’accede a mes chaines via $lang[‘son_nom’]. Ce n’est clairement pas la solution la plus rapide de la terre, mais cela a le merite de marcher sur tous les serveurs et d’etre relativement lisible.

Je fais comme unreal, quand je met pas les trucs en dur dans le code.

[code]$xml = simplexml_load_file(’./languages/’.$user->GetLanguage().’.xml’);

echo $xml->banner;

echo $xml->accueil->welcome;

etc, etc, …[/code]

Je suis d’accord avec Asarnil, je trouve que c’est la solution la plus élégante. Ou alors stocker le tout en base, qui est une solution encore plus élégante ^^

Sur notre projet (C# asp.net, VisualStudio), on a un fichier de ressources par page Web et par langue.
Tous les labels d’une page sont repertoriés dans une seule ressource.
Bref on a une tripoté de fichiers de ressources.

Par contre je plussoie LoneWolf, même dans un petit fichier, c’est assez lourd de devoir faire une recherche sur l’ID du label que je veux afficher, même si le fichier ne contient que tres peu de données. De plus le code deviens assez illisible et c’est assez souvent que l’on se retrouve comme un C… devant l’écran : “Mais c’est quoi ce label de MER…”. S’en suit la recherche du fichier de ressources (tous dans un même repertoires les fichiers de ressources c’est plus marrant), et enfin la recherche du label. Alors oui on peut faire l’effort de mieux nommer les variables, mais sur un texte de 10 lignes c’est plus compliqué.

J’attends avec impatience la suite de ce topic, pour trouver la methode ultime.

ZeP
Gentleman Start Your engine

[quote name=‘BodySplash’ date=’ 30 Jun 2005, 18:11’]Je suis d’accord avec Asarnil, je trouve que c’est la solution la plus élégante. Ou alors stocker le tout en base, qui est une solution encore plus élégante ^^
[right][post=“373352”]<{POST_SNAPBACK}>[/post][/right][/quote]

+1, ici une application de catalogue voyages, tout le contenu texte est en base MySQL…

[quote name=‹ Timebomb › date=’ 1 Jul 2005, 13:18’]+1, ici une application de catalogue voyages, tout le contenu texte est en base MySQL…
[right][post=« 373592 »]<{POST_SNAPBACK}>[/post][/right][/quote]
C’est juste la solution la plus lente de la terre… (en plus avec mysql… j’espere que t’as pas trop d’utilisateur :stuck_out_tongue: )

LoneWolf
Ouais ben y a pas tellement de vrai solution hein, bougez vous! :stuck_out_tongue:

La meilleure solution pour internationaliser un texte c’est de… le mettre en anglais. :stuck_out_tongue: Na.

Personnellement, je me contente d’utiliser le système déjà intégré à asp.net. :stuck_out_tongue:

Une solution de localisation en stockant les ressources quelque part. Peu importe le support choisi, ce qui importe, à mon avis, dès que l’on se soucie des perfs, c’est de mettre en place un système de cache qui évite la lecture d’un fichier ou d’une table pour 150 affichages sur la même page d’une chaine localisée. :stuck_out_tongue:

Passé ce problème, je pense que toutes les solutions se valent. Ce qui importe plus c’est de voir ce que l’on permet de localiser. Changer par exemple l’orientation du texte dans les champs input si par exemple la personne écrit de droite à gauche, ou modifier une image suivant la langue, etc. S’il est facile de rendre une chaine de caractères localisable, ca devient puissant lorsqu’un fichier css le devient lui aussi.

[quote name=‹ LoneWolf › date=’ 1 Jul 2005, 14:27’]C’est juste la solution la plus lente de la terre… (en plus avec mysql… j’espere que t’as pas trop d’utilisateur  :stuck_out_tongue: )

LoneWolf
Ouais ben y a pas tellement de vrai solution hein, bougez vous!  :stuck_out_tongue:
[right][post=« 373595 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Beuh… MySQL, lent? :stuck_out_tongue:
Ca tourne à peu près bien sur un site en production (bon, ya rarement plus de 30 clients connectés en même temps, mais sinon on augmente le nombre de serveurs :P) mais le gros avantage c’est surtout l’édition via le backoffice par des personnes non qualifiées…

[quote name=‹ LoneWolf › date=’ 1 Jul 2005, 13:27’]C’est juste la solution la plus lente de la terre… (en plus avec mysql… j’espere que t’as pas trop d’utilisateur :stuck_out_tongue: )

LoneWolf
Ouais ben y a pas tellement de vrai solution hein, bougez vous! :stuck_out_tongue:
[right][post=« 373595 »]<{POST_SNAPBACK}>[/post][/right][/quote]

C’est vrai que c’est bien connu que des opérations sur fichiers sont bien plus rapides que des opérations en base.

EDIT: ok j’exagère, je comprend ce que tu veux dire, mais je ne vais pas rentrer dans les détails d’implémentation. Globalement, je préfére une approche stockage en base et batch de génération de pages html à chaque changements.

[quote name=‘BodySplash’ date=’ 1 Jul 2005, 14:51’]C’est vrai que c’est bien connu que des opérations sur fichiers sont bien plus rapides que des opérations en base.

EDIT: ok j’exagère, je comprend ce que tu veux dire, mais je ne vais pas rentrer dans les détails d’implémentation. Globalement, je préfére une approche stockage en base et batch de génération de pages html à chaque changements.
[right][post=“373631”]<{POST_SNAPBACK}>[/post][/right][/quote]
Ben c’est a voir, mais de ce que je sais des BDD, le plus long, c’est la connexion a la base. Apres, ca depend (de l’API, de la base, tout ca) mais je pense qu’un acces fichier et plus rapide qu’un acces base. C’est a tester en XML par contre, DOM etant assez gourmand.

LoneWolf
osons les benchmarks.

[quote name=‘LoneWolf’ date=’ 1 Jul 2005, 15:04’]Ben c’est a voir, mais de ce que je sais des BDD, le plus long, c’est la connexion a la base. Apres, ca depend (de l’API, de la base, tout ca) mais je pense qu’un acces fichier et plus rapide qu’un acces base. C’est a tester en XML par contre, DOM etant assez gourmand.

LoneWolf
osons les benchmarks.
[right][post=“373637”]<{POST_SNAPBACK}>[/post][/right][/quote]
Bah c’est pour ça que quand c’est possible, j’aime bien faire des batch pour générer des fichiers en “semi-statique”, comme ça on garde l’avantage d’un sgbd sans le problème de temps de connexion.

Ceci dit, pour limiter les problèmes de temps de connexion, la plupart des drivers maintenant fournissent un système de pools qui optimisent tout ça. D’alleurs ça améliore aussi le problème du nombre de connexions max.

EDIT: pour revenir au xml, dans l’ensemble ça reste assez puissant, d’autant plus qu’il est possible d’indexer le contenu des fichiers via la dtd.

gettext à ma préférence.
Même si c’est une solution dont la donfiguration et la mise en oeuvre pose des problèmes en php, c’est éprouvé, et les outils de gestion pour les modifications des fichiers de localisation sont pratiques.
Et autre point important, ca gère le charset, et les pluriels.
Et c’est la seule solution que je connaisse qui fait cela.
Le reste, (array, xml ou base), tout au moins en php, c’est de la bidouille qui devient ingérable sur de gros projet ou alors lorsqu’il y a plusieurs personnes pour faire une même localisation. Testé, et pas approuvé du tout.

A+

[quote name=‘azazel’ date=’ 1 Jul 2005, 15:52’]gettext à ma préférence.
Même si c’est une solution dont la donfiguration et la mise en oeuvre pose des problèmes en php, c’est éprouvé, et les outils de gestion pour les modifications des fichiers de localisation sont pratiques.
Et autre point important, ca gère le charset, et les pluriels.
Et c’est la seule solution que je connaisse qui fait cela.
Le reste, (array, xml ou base), tout au moins en php, c’est de la bidouille qui devient ingérable sur de gros projet ou alors lorsqu’il y a plusieurs personnes pour faire une même localisation. Testé, et pas approuvé du tout.

A+
[right][post=“373662”]<{POST_SNAPBACK}>[/post][/right][/quote]
Trop pas d’accord non plus, l’approche base n’est pas de la bidouille quand c’est bien pensé et c’est très loin d’être ingérable. La gestion de proj ça existe pas pour des prunes.

En PHP, je fais des fichiers lang-french.php, lang-english.php, etc, qui contiennent des choses de ce genre:

define (_HELLO, “Hello”) ; pour lang-english.php et
define (_HELLO, “Bonjour”) ; pour lang-french.php par exemple.
Généralement je vais d’abord tout définir dans lang-english.php, ainsi il n’y a plus qu’à traduire et créer les fichiers de langue qu’on désire.
Ensuite, dans le code, je fais par exemple

echo _HELLO." “.$username.”\n" ;

Avec chargement du bon fichier de langue avant, en se basant sur celui demandé par l’utilisateur

[quote name=‘BodySplash’ date=’ 1 Jul 2005, 15:57’]Trop pas d’accord non plus, l’approche base n’est pas de la bidouille quand c’est bien pensé et c’est très loin d’être ingérable. La gestion de proj ça existe pas pour des prunes.
[right][post=“373666”]<{POST_SNAPBACK}>[/post][/right][/quote]

Ben comme dit lonewolf, tu te retrouves avec une polymegachié de tag qui ne réprésente pas correctement le texte de départ.
Donc pour rechercher, modifier, mettre à jour, merger, bonjour, gestion de projet ou non.
Sans parler du problème des pluriels.

En plus, une localisation pour un site web statique, c’est pas la même chose que pour un site dynamique.
Pour du statique, du multiview au niveau de apache, avec une politique de lien bien pensée suffit largement.
Pas besoin de gettext ou de base.
Pour du dynamique, c’est plus la même chose.

A+

[quote name=‘ColdFire’ date=’ 1 Jul 2005, 16:05’]En PHP, je fais des fichiers lang-french.php, lang-english.php, etc, qui contiennent des choses de ce genre:

define (_HELLO, “Hello”) ; pour lang-english.php et
define (_HELLO, “Bonjour”) ; pour lang-french.php par exemple.
Généralement je vais d’abord tout définir dans lang-english.php, ainsi il n’y a plus qu’à traduire et créer les fichiers de langue qu’on désire.
Ensuite, dans le code, je fais par exemple

echo _HELLO." “.$username.”\n" ;

Avec chargement du bon fichier de langue avant, en se basant sur celui demandé par l’utilisateur
[right][post=“373673”]<{POST_SNAPBACK}>[/post][/right][/quote]

Pas de gestion de pluriel avec cette solution.
Et en plus, les define en PHP, c’est leeeeennenennnnnnnttttt comme un jour sans fin.
Pour un fichier de config, je veux bien.
Pour faire une localisation…
Pas glop.

Il y aussi la solution de Qt en open-source.

A+ FCH