Comment faire un site Web multilingue - Stack Overflow
Réponse courte: il n'y a pas de réponse courte, car il y a beaucoup de variables à considérer, et beaucoup de travail à faire. Alors.
Réponse longue: Je vais le décomposer et que je peux, mais il n'y a pas un « bon pour tous » réponse à une question aussi large que le vôtre.
Tout d'abord, les variables de la tâche à accomplir:
source de traductions: est contenu fourni dans chaque langue concernée par vous ou un collaborateur? Ou sont certaines versions passent par un logiciel de traduction à partir d'une seule langue « de base »? La première approche prend beaucoup de travail supplémentaire pour produire le contenu, mais donne des résultats de qualité supérieure à la seconde.
Une fois que vous avez ci-dessus bien définie, nous allons commencer à travailler. Ce sont, vous aurez besoin de faire gérer les tâches les plus importantes:
Détection de la langue: l'approche la plus raisonnable est d'utiliser un paramètre GET (quelque chose comme lang = fr-nous sur l'URL?). En outre, vous pouvez utiliser un cookie et / ou IP géolocalisation pour se replier quand est demandé une URL sans argument de la langue. , Si vous avez les moyens, les examiner la question de l'URL beautification (ce qui ressemble mieux: example.com/index.php?lang=en-us ou example.com/en-us/home?). Personnellement, j'aime les subventions ModRewrite de puissance à mon fichier .htaccess, mais travaille uniquement sur des serveurs fonctionnant sous Apache.
- Pour le contenu DB, mon meilleur conseil est de trouver un certain modèle d'attribution de noms de domaine solide et de s'y tenir. Par exemple, je joins _en. _es. ou _ca à tous les domaines dépendant de la langue de mon DB. De cette façon, je peux accéder au contenu à droite avec des expressions comme $ row [ « Title_ $ lang »].
- Pour inclure des fichiers, encore une fois une convention de nommage des fichiers est l'approche plus saine. Dans mon cas, j'ai les noms de fichiers se terminant par .en.php. ca.htm. etc. Mes appels comprennent ressembleraient alors inclure ( «certains nom de fichier. lang.php de $).
- De temps en temps, vous serez en petits morceaux crachez de texte directement à partir de votre code PHP (par exemple, lors de l'étiquetage des rubriques d'une table). Vous pouvez utiliser un fichier inclus par la définition d'une langue « morceaux » tableau avec les mêmes touches, ou une table de DB comme Geert suggéré. L'ancienne approche prend moins de travail pour développer, ce dernier devrait prendre moins de travail pour maintenir (surtout si vous ne travaillez pas seul).
Eh bien, c'est tout ce que je peux venir avec pour l'instant. Je pense que vous devriez avoir assez pour tirer vers le haut vos manches et se mettre au travail. Ensuite, si vous frappez un mur sur votre chemin, revenir avec des questions précises et je suis sûr que vous obtiendrez des réponses plus spécifiques.
J'espère que cela t'aides.
La solution que j'utilise toujours est de créer une table de base de données, avec tous les messages possibles. Pour chaque message utiliser un code (abréviation) pour le rechercher. Ainsi, par exemple:
etc. Vous cherchez les traductions est généralement assez rapide en utilisant une requête MySQL, mais vous pouvez également placer tous les messages dans un tableau et le charger en mémoire lorsque vos charges de script. Les utilisateurs doivent toujours être en mesure de définir la langue qu'ils préfèrent, ne vous fiez pas aveuglément sur l'en-tête de la langue définie par le navigateur Web.
Que faire si une chaîne avec ID « title » doit être différent sur chaque page? Ajouter une colonne « file » à la DB. Puis, sur chaque page, exécutez SELECT * FROM. OÙ file = 'filename.php'. Boucle à travers chaque ligne de résultat, puis ajouter les traductions constantes ou un tableau ou cependant vous langues de manipulation. Cela arrêtera aussi le « potentiel de SQL 100+ lookups ». - Luke Sheppard 8 septembre '16 à 12h21
Je conçois maintenant un CMS très petit qui doit être multilangue.
Pour cette raison, je ne visais pas la conception à ajouter des extensions aux tables de base de données, je ne peux pas (et veux pas) de modifier les noms de table ou y accéder en utilisant des noms Dinamic, ni ajouter ou de supprimer des champs à chaque fois qu'une langue est définie ou retirée .
Je ne voudrais pas utiliser les fichiers non plus, juste parce que j'aime les bases de données et ils sont faciles à mantenir.
Et enfin, je pense que dans deux types de traduction:
Par conséquent, ma conception vise à:
- languajes Une table avec les langues définies.
- Traductions Une seule table qui aura tous les messages, comme suit:
- [Pk] nom_table le nom de la table dont le contenu sera traduit.
- [Pk] field_name le nom du champ dont le contenu sera traduit.
- [Pk] row_id l'identificateur de ligne de l'élément qui sera traduit.
- [Pk] langue la langue que le texte est traduit.
- texte le texte traduit.
Cela signifie que les tables les champs auront contenu dans un scénario unique de langue, auront maintenant son vide de contenu, car il sera toujours dans la table des traductions.
Une autre approche que je vais étudier à partir de maintenant est la création d'une table supplémentaire pour chaque « tableau traduisible » comme suit:
- any_translatable_table: Le tableau qui a besoin de traduire l'un de ses champs
- any_translatable_table_translations: La table où les traductions seront stockées.
- [Pk] field_name le nom du champ dont le contenu sera traduit.
- [Pk] row_id l'identificateur de ligne de l'élément qui sera traduit.
- [Pk] langue la langue que le texte est traduit.
- texte le texte traduit.
La table de traduction supplémentaire par « tableau traduisible » sera créé en même temps que l'original.
Et sur les querys sql, la complexité est toujours le même: La première approche au nom de la table a besoin du nom de la table pour rechercher dans la table des traductions, mais le second ajoute que le suffixe « _translations ».