Si tu a que des langues européennes, ça ne pose pas de problème, tu utilise le charset iso-western partout. Dans ce cas un fichier texte ou un include fait l'affaire. Et encore, même en franco-français tu voit des grands sites faits avec un charset windows faussement déclaré dans la page HTML qui n'affiche pas certains caractères (comme l'apostrophe).
Si tu doit faire cohabiter du russe et du chinois, c'est plus délicat, ça nécessite d'avoir un éditeur capable de changer de charset. La solution de facilité est d'utiliser l'Unicode, avec UTF-8, qui est théoriquement capable d'afficher tous les caractères.
Si tu utilise une BDD, tu va avoir des problèmes avec PHPMyAdmin, tu devra changer le charset à la main dans ton navigateur, en utilisant le menu Affichage->Encodage.
Toutes les solutions ci-dessus fonctionnent à peu près correctement quand tu est seul à entrer des messages dans la base de donnée. Si tu doit faire traduire les messages par quelqu'un d'autre, c'est déjà plus délicat puisque tu doit lui expliquer qu'il faut choisir le bon charset.
Dans la solution avec stockage binaire, tes traducteurs n'ont plus à se soucier de ce détail, et de ton côté ça te facilite la tâche car tu n'est plus obligé de faire correspondre le charset à la fois dans l'HTML et dans la base de donnée. Comme toutes les bases de données ont un stockage binaire, tu peut plus facilement changer de base de donnée ou avoir de multiples bases sans te soucier quelle base supporte quel charset.
À chaque langue traduite, tu as un charset associé, et c'est le navigateur qui se charge d'afficher proprement lorsqu'il rencontre le tag <DOCTYPE>. Le navigateur séléctionne aussi le bon clavier, c'est important pour certaines langues qui supportent à la fois plusieurs dispositions de clavier.
Ça donne une structure qui ressemble à ça:
Table Traductions:
- varchar langue
- varchar nom_message
- blob message
Table Langues:
- varchar langue // par ex. ``fr``
- varchar nom // par ex. ``Français``
- varchar charset
Indexes:
(Traductions.langue)
(Traductions.nom_message)
(Traductions.langue, Traductions.nom_message)
(Langues.langue)
Jointures:
(Langues.langue, Traductions.langue)
requêtes principales:
- Requête pour lister les langues:
SELECT langue, nom, charset FROM Langues;
- Requête pour lister les messages:
SELECT nom_message FROM Traductions WHERE langue='$langue';
- Requête pour extraire un message:
SELECT message FROM Traductions WHERE langue='$langue' AND nom_message='$nom_message';
- Requête pour modifier un message:
UPDATE Traductions set message='".mysql_real_escape_string($message)."' WHERE langue='$langue' AND nom_message='$nom_message';
Structure de la page de modification des messages:
- choisir une langue
- choisir un message
- donner la traduction
- enregistrer