Salut.
Je me posais la question pour les sites ayant plusieurs langues, quel méthode est la plus adaptée ?
Enfin niveau base de données, on a pas trop le choix (un champ par langue) mais au niveau du site lui même (des éléments non gérés par la base de données (la structure du site quoi).
En cours c'était bien souvent des if($lang=='fr') alors bienvenue, elseif($lang=='en') alors Welcome etc etc.
Mais perso, ça devient assez vite brouillon je trouve, et puis surtout peu efficace dans le cas où une nouvelle langue ferai son apparition (cas que je rencontrerai à mon avis très probablement), il faudrait reparcourir tout le code pour rajouter les if nécessaires, pas très convivial...
Bref, donc c'est plus une question de facilité qu'un problème en soi, ceci dit assez chiant quand on tombe dessus (oui bon, nouveauté, on a ajouté 10 langues... xD).
Merci d'avance. ![]()
Tu crées un fichier par langue qui contient des variables $langue['bienvenue'] = 'bienvenue'; sur le ficher fr etc ... et tu inclus le fichier qui correspond à la langue, quand tu as besoin d'un nouveau fichier tu traduit chaque variable ( pas leur nom
) et tu modifies l'endroit ou tu appelles le fichier selon la langue ![]()
Fichier de la langue FR
http://wall.deblan.fr/x12da/php/1/
Code ou j'appelle le fichier
http://wall.deblan.fr/x12db/php/1/
J'utilise le sous domaine du pays, pour déterminer la langue, mais tu adaptes bien entendu, à un cookie par exemple ![]()
"Enfin niveau base de données, on a pas trop le choix", il y a d'autres solution ^^ Duplication de table, duplication d'entrées, un champ/langue, etc.
Effectivement, cette solution marche du tonnerre (plus besoin de modifier 36000 trucs, juste un fichier à traduire c'est bien plus simple) ! ^^
Par contre je me retrouve avec un autre petit soucis concernant les langues, je m'explique;
Je suis en train de créer un site qui permet de partager ses créations graphiques ou musicales, et voulant toucher un peu de monde je me suis dit que ça serait pas mal de faire au moins une version anglaise.
Bref, le changement s'effectue d'un simple clic sur un lien.
Mon URL est construite de la manière suivante:
?p=presentation&lang=fr
présentation et fr étant tout les 2 contenus dans des variables.
En gros quand je change de page le code est:
?p=<?php echo $page; ?>&lang=fr (ou en selon le lien)
Le soucis, j'y viens; je suis sur un page où j'ai actuellement d'autres variables d'url indispensable au bon fonctionnement de la page, et là ça coince: je renvois à la bonne page mais bien entendu sans les variables d'url (en gros par exemple l'id du membre à afficher).
Je me suis dit, c'est rien on va prendre les variables d'url avec. Léger soucis, lang=fr, c'est une variable d'url, et elle est renvoyée avec le reste, si bien qu'après 2-3 changement de langue je me retrouve avec:
?p=membre&id=1&lang=fr&lang=en&lang=en&lang=fr&lan
g=en...
Bref vraiment pas cool non plus.
Donc voilà si quelqu'un à une solution pour ce petit problème, ça serait très sympa de sa part. ^^ (et déso pour le pavé...)
J'ai trouvé une solution un peu radicale mais bon, je n'ai pour le moment pas trouvé mieux.
http://wall.deblan.fr/x1389/php/1/
Dites moi si je fais erreur ou pas (ça marche mais y a surement un moyen d'avoir un truc moins conséquent).
http://wall.deblan.fr/x1390/php/1/
http://bordel.deblan.fr/html5/lien.php
Il me semble que ton code va poser un problème (du moins dans mon cas puisque je suis obligé de passer par $_SERVER['REQUEST_URI'] et que la variable lang sera prise dedans, donc le lien ne bougera pas).
Attention, je ne dis pas qu'il est faux loin de là il n'y a pas d'erreurs de code, juste que ça ne s'appliquera pas à ce cas précis ou alors j'ai loupé quelque chose).
Ça peut marcher sur un menu je pense mais ici il s'agit de lien dont l'adresse change à toutes les pages (en gros: "l'adresse de la page courante" (Y COMPRIS les variables URL, chose que j'avais complétement loupé, d'où le soucis).
Bref, j'ai beau retourné le problème dans tout les sens je vois pas d'autre solutions (en fait en gros ce que je fais, c'est juste lui envoyer l'adresse courante, en lui coupant la variable lang, façon à ce qu'elle ne se répète pas à chaque changement).
M'enfin ça marche, je vais pas trop me plaindre. xP
Hey, petit remontage de topic parce que mon soucis correspond au topic (et pis c'est le mien !
).
Alors voilà, j'ai en tête de me faire un petit CMS perso modulable (en bref on a une application qui permettrait via formulaire de créer facilement un nouveau "module", et celui ci apparaît comme une application sur tablette tactile).
Bref ce qui m'amène ici c'est un problème récurrent, vous l'aurez deviné la gestion des langues.
Je parle bien ici du contenu dynamique, ce que l'utilisateur final ajoutera par lui même (et qui peut être donc tout et n'importe quoi).
Comme dit plus haut jusqu'à présent j'utilisais la méthode connue du TitreFR, TitreEN, TitreNL. Ça marche oui, mais voilà le client X veut étendre son activité et exporte un peu partout, bref il a besoin que son site soit, en plus de anglais et du français, en espagnol, italien, russe, coréen (soyons fou), portugais etc. Et avec ce système là on se retrouve à devoir faire joujou avec tout les champs nécessitant d'être traduit, bref pas cool du tout.
Ce que je cherche c'est donc plutôt un système où l'ajout de langue ne me poserait pas de soucis.
Duplication de table, je trouve ça pas vraiment super propre.
Duplication d'entrée ça me parait déjà plus correct mais alors comment savoir que la news 1234 (fre), la 68862 (eng), et la 237 (dut) sont en fait la même news ? (ça pourrait fonctionner mais il faudrait une table supplémentaire pour faire la liaison).
Autre solution mais là aussi je la trouve pas géniale: Intégrer des "délimiteurs" dans le champ pour déterminer la langue, exemple dans le champ Title on aurait:
<fre>
Bonjour !
</fre>
<eng>
Welcome !
</eng>
Ici une ligne suffira donc, cependant ça posera certain soucis sur le tri etc, et la taille des champs sera proportionnelle au nombre de langues (donc on oublie quasiment le varchar puisque 255 caractères seront insuffisants).
Bref pas moyen de trouver une solution convenable, or la façon dont ça sera développé dépendra quand même en grosse partie de ce choix là (et encore une fois, si possible je veux que l'ajout d'une langue ne soit pas un soucis, c'est bien là le problème sinon j'irai au plus simple).
Donc si vous avez une idée, ça serait vraiment sympa. ^^
L'idée quand on veut s'attaquer à la gestion des langues de manière propre et extensible, quand son site prend de l'ampleur, c'est d'utiliser getText, natif à PHP.
Manuel/Doc sur php.net : http://php.net/manual/fr/book.gettext.php
Tuto site du zero : http://www.siteduzero.com/tutoriel-3-74650-un-site-multilingue-avec-gettext.html
Tuto video : http://www.grafikart.fr/tutoriels/php/internationaliser-site-gettext-104
Sauf que ce n'est pas ce que je veux, ça doit être effectivement très bien pour tout ce qui est statique or ici c'est bel et bien le contenu de la base de données qui est concerné, pas les Bienvenue machin etc, pour ça y aura pas de soucis (contenu qui n'existe pas encore, vu que le client va taper 1, 10, 100, 10000 news à sa guise si il veut et que ces news doivent pour toutes avoir la possibilités d'être traduites en X langues MAIS à charge du client)).
Pas conne l'idée vuqty. ^^
Voici ce qu'on utilise au boulot :
- pour des éléments d'interface (donc pas de bd) : fichier xml/lang (un genre de gettext). Note pour Slash_Snakepit : gettext n'est pas productif et il est ultra casse couilles à utiliser à la longue.
- pour les éléments de base de données, le principe est le suivant : mettons que je traite ici des actualités d'un site. On aura un id, une categorie_id, un titre, un chapô, un contenu. Dans les éléments que je viens de citer, seuls le titre, le chapô et le contenu ont besoin d'être traduits. Pour ce faire, j'ai une table "actualite" qui contient l'id, la categorie_id. Ensuite j'ai une table "actualite_i18n" (i18n = internationalisation) qui contient : actualite_id, culture (fr, en, de, etc), titre, chapô, contenu.
Quand on édite une actualité, on a d'abord les informations indépendantes de la langues puis un onglet/langue pour le reste.
Au final, tu vas avoir une entrée/actu dans "actualite", et une entrée/langue pour les traductions.
deepblue
C'est bien l'idée que j'avais au départ et qui me semble la meilleure pour mon cas.
Par contre simple question peut être conne mais c'est une question d'ergonomie plutôt, tu as par exemple un article avec une photo qui peut être jointe, la photo tu la mettrais dans la table _i18n ou plutôt dans la table principale ? (en fait je pensais utiliser comme tu dis cette table principale pour les infos tel que la date de création, modification, l'auteur, savoir si la publication est active ou non etc).
La question que tu dois te poser est : est-ce que l'image peut être différente suivant la langue ? Si oui : table i18n, sinon table classique.
Mea culpa, j'avais pas bien saisi le besoin !