[RESOLU] mettre un intranet en plusieurs langues

jikaill
Invité n'ayant pas de compte PHPfrance

13 oct. 2015, 22:40

Bonjour à tous, pourriez-vous m'aider?

Voilà je vais reprendre un intranet dans mon entreprise afin de l'améliorer et les utilisateurs voudrai que je le fasse multilingue anglais français, j'aimerai vous demander le site n'a pas étai conçu à la base pour accueillir le multilingue combien de temps cela prendrai pour faire cela d'après vous? et quels méthodes utilisées vous pour faire cela? j'ai cru comprendre que cela ce fait avec les variable de session mais je me demandai si cela demande beaucoup de transformation dans le code de l'intranet merci à vous .

Mammouth du PHP | 737 Messages

13 oct. 2015, 23:07

Salut,

Concernant ton intranet actuel, c'est quel genre de sites ? site full php, cms wordpress ? Connexion avec une bdd ?

Mega
;)
Dyslexics are teople poo

jikaill
Invité n'ayant pas de compte PHPfrance

14 oct. 2015, 13:57

Merci de votre réponse, c'est fait entierement en php et il y a une base oracle.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10467 Messages

14 oct. 2015, 14:57

Bonjour,

Il y a plusieurs choses à prendre en considération pour internationaliser une application (ou ton intranet) si tu n'utilises pas un framework proposant nativement cette option :

- La session va effectivement te servir à véhiculer la langue d'affichage demandée par l'utilisateur (donc déjà il faut une page de profil/préférence dans laquelle il va pouvoir choisir sa langue et toi la stocker en session, et éventuellement en base ou en cookie pour pouvoir la retrouver la prochaine fois qu'il se connecte).

- Il faut ensuite gérer les libellés statiques. Ce sont tous les textes de champs, liens, boutons, etc. qui sont présents en dur dans tes pages php. La solution simple, remplacer ces textes par des variables php (en général on utilise des tableaux) et inclure un fichier de langue avec les valeurs correspondant à la langue sélectionnée :
<?php
/* fr.php - textes en français */
$messages['hello'] = 'Bonjour';
$messages['signup'] = 'Inscrivez-vous';
?>
<?php
/* en.php - textes en anglais */
$messages['hello'] = 'Hello';
$messages['signup'] = 'Sign up';
?>
Il suffit ensuite de charger le script approprié en fonction de la langue sélectionnée
<?php
    require('en.php');
    echo $messages['hello'];
    echo $messages['signup'];
?>
C'est simple, mais ça ne répond pas nécessairement à tous les besoins. Par exemple la gestion dynamique des pluriels : "1 élément", "2 éléments". Ca oblige à avoir deux entrées dans le tableau et savoir laquelle des deux utiliser en fonction du nombre que l'on va afficher avant (on pourrait faire " 1 élément(s) ", mais c'est une solution de fainéant, pis c'est quand même assez moche ;)). Et je ne vous parle pas de la gestions des pluriels en polonais (si le coeur vous en dit de chercher...)

Autre solution, utiliser GetText. C'est devenu une référence en matière de gestion des traductions (ça doit avoir 20 ans au moins). Moins évident à mettre en oeuvre, le principe est assez similaire puisque l'on va remplacer les libellés statiques par des appels de fonction php et créer un fichier message.po par langue qui sera ensuite compilé pour une exécution plus rapide. L'avantage c'est qu'il existe certains outils comme POEdit pour parser tes fichiers php et lister tous les éléments à traduire (identifier de nouveaux libellés, les libellés désuets, ...). Reste plus qu'à faire traduire le fichier dans les langues souhaitées et les réinjecter.

- Il faut maintenant gérer les libellés dynamiques. Ceux sont ceux présent dans la base de données. C'est à dire prévoir pour les utilisateurs qui alimentent la base de pouvoir saisir des versions traduites. Donc pouvoir saisir un même élément en plusieurs langues, généralement identifier les éléments non traduits ou modifiés dans une langue pour qu'ils passent dessus, retrouver le texte d'origine s'il n'existe pas dans la langue demandée, etc.
Cela fait donc évoluer la structure de la base de données pour pouvoir gérer de nouvelles langues, ainsi que les scripts php pour les alimenter.

- Enfin des librairies php comme Intl vont également permettre d'affiner la gestion de l’internationalisation (qui ne consiste pas seulement à "traduire" des libellés). En fonction de la langue, il faut également adapter le format des nombres (séparateur de millier et de décimal différent), des dates (jjmmyyyy ou mmjjyyyy), des devises (avant ou après le montant), ...

Bref, c'est loin d'être simple à mettre en oeuvre surtout si l'intranet est volumineux, il y a pas mal de travail derrière. Le mieux est peut être de mettre en oeuvre un framework gérant les traductions (Zend, Symfony, F3, ...) dans la mesure du possible et de récupérer ce qui est récupérable de l'intranet actuel.

Tout va dépendre du besoin et il n'est pas utile de tout chambouler si les utilisateurs veulent juste des libellés en anglais sans se soucier de savoir s'il y a des (s) aux pluriels :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

jikaill
Invité n'ayant pas de compte PHPfrance

16 oct. 2015, 09:24

Super merci pour les explications.