web-dev-qa-db-fra.com

Comment créer un site Web multilingue

Tout organisme peut-il me dire comment créer un site Web multilingue dynamique en PHP et MySQL? Je n'en ai aucune idée. J'ai cherché sur Google et je n'ai trouvé aucune bonne solution.

Quelqu'un peut-il me fournir un guide étape par étape? Si possible, faites une démo pour un site Web multilingue. Ou veuillez me référer à n'importe quel lien où il explique les détails à ce sujet.

28
user295239

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. Donc...

Réponse longue: Je vais le décomposer du mieux que je peux, mais il n'y a pas de réponse "bonne pour tous" à une question aussi large que la vôtre.

Tout d'abord, les variables de la tâche à accomplir:

  1. Liste des langues: votre site sera-t-il dans un ensemble de langues prédéfini, ou sera-t-il varié/hétérogène? Par exemple, un site peut être entièrement bilingue dans deux langues bien définies (ou, pour mettre un autre exemple, je gère un site anglais/catalan/espagnol); ou différentes sections peuvent être disponibles dans différents ensembles de langues (par exemple, regardez les sites de MS: ils sont pour la plupart homogènes, mais des trucs comme les blogs, les articles de la base de connaissances et certains documents ne sont disponibles que dans un sous-ensemble des langues supposément prises en charge).

  2. Source des traductions: le contenu est-il fourni dans chaque langue pertinente par vous ou un collaborateur? Ou certaines versions sont-elles exécutées via un logiciel de traduction à partir d'une seule langue "de base"? La première approche demande beaucoup de travail supplémentaire pour produire le contenu, mais donne des résultats de meilleure qualité que la seconde.

  3. Langues elles-mêmes: une fois que vous aurez répondu 1) et 2), vous devrez savoir exactement avec quelles langues vous travaillez. Notez que dans le cas où vous incluez des dialectes (ex: anglais américain + anglais britannique ou espagnol espagnol + espagnol espagnol), vous pouvez rencontrer des problèmes de "contenu en double" avec les moteurs de recherche, mais les détails à ce sujet sont trop hors sujet ici (juste mentionner afin que vous soyez conscient des problèmes potentiels).

  4. Visez-vous des langues dans l'abstrait (par exemple, mon site propose les trois langues sans se soucier du tout de l'endroit où se trouve le visiteur: c'est ce que j'ai, alors choisissez ce que vous préférez); ou plutôt cibler différentes régions/pays? Dans le dernier cas, les choses peuvent devenir très complexes, car vous devrez peut-être vous soucier d'autres choses en plus des langues (comme les fuseaux horaires, les devises ou les conventions de format date-heure, pour n'en nommer que certaines), mais vous avez l'avantage de pouvoir utiliser TLD spécifiques à chaque pays.

Une fois que vous avez bien défini ce qui précède, commençons à travailler. Ce sont les tâches les plus importantes que vous devez effectuer:

  1. Détection de la langue: l'approche la plus raisonnable consiste à utiliser un paramètre GET (quelque chose comme? Lang = en-us sur l'URL). En outre, vous pouvez utiliser des cookies et/ou une géolocalisation IP pour revenir en arrière lorsqu'une URL sans argument de langue est demandée. Aussi, si vous en avez les moyens, considérez le sujet de l'embellissement d'URL (qu'est-ce qui semble mieux: example.com/index.php?lang=en-us Ou example.com/en-us/home?). Personnellement, j'aime la puissance que ModRewrite accorde à mon fichier .htaccess, mais cela ne fonctionnera que sur les serveurs Apache.

  2. Gestion du contenu: que vous récupériez du contenu à partir d'une base de données (comme le contenu d'un article), incluez des fichiers (typiques pour le fil d'Ariane, les menus, les en-têtes du site, etc.) ou tout autre moyen, vous aurez besoin d'un moyen de séparer chaque version (langue) du contenu. Voici quelques exemples de la façon dont cela peut être fait:

    • Pour le contenu DB, mon meilleur conseil est de trouver un modèle de dénomination de champ solide et de s'y tenir. Par exemple, j'ajoute _en, _es Ou _ca À tous les champs dépendants de la langue de ma base de données. De cette façon, je peux accéder au bon contenu avec des expressions comme $row["title_$lang"].
    • Pour les fichiers d'inclusion, encore une fois, une convention de dénomination des fichiers est l'approche la plus saine. Dans mon cas, j'ai des noms de fichiers se terminant par .en.php, .ca.htm, Etc. Mes appels include ressemblent alors à include("some-filename.$lang.php).
    • De temps en temps, vous cracherez de petits morceaux de texte directement à partir de votre PHP (par exemple, lors de l'étiquetage des en-têtes d'un tableau). Vous pouvez utiliser un fichier include par langue définissant un tableau de "morceaux" avec les mêmes clés, ou une table de base de données comme Geert l'a suggéré. La première approche prend moins de travail à développer, la seconde devrait prendre moins de travail à maintenir (surtout si vous ne travaillez pas seul).
  3. Choix de la langue: assez essentiel, vous devez fournir à vos utilisateurs un moyen de choisir leur propre langue, autre que de peaufiner les arguments GET sur l'URL elle-même. Pour quelques langues, les "indicateurs" fonctionnent souvent très bien, car ils peuvent être compris même si la page est initialement retombée dans une langue que l'utilisateur ne connaît pas du tout. Pour plus de langues, un menu déroulant semble plus efficace (en termes d'espace d'affichage), mais vous devez vous assurer d'ajouter quelques conseils visuels (c'est-à-dire non textuels). Certains sites vous obligent à choisir une langue en entrant, et n'ont que des liens vers la page d'accueil de chaque langue. Personnellement, mes trois drapeaux ressortent en haut du menu de mon site, chacun pointant vers l'adresse actuelle avec uniquement l'argument de langue changé. Un code comme celui-ci peut très bien fonctionner:


function translatedURI($new_lang) {
    return str_replace("lang=$lang", "lang=$new_lang", "http://" . $_SERVER["HTTP_Host"] . $_SERVER["REQUEST_URI"];
}

  1. Ajustement du CMS: si votre site (ou une partie de celui-ci) utilise une sorte de CMS, un forum de discussion, etc., les choses peuvent devenir assez compliquées. Parlant de ma propre expérience, j'ai un forum phpBB sur mon site divisé en trois catégories principales (une par langue), de telle sorte qu'ils ressemblent à trois forums indépendants (mais les utilisateurs doivent simplement se connecter/s'inscrire sur l'un d'entre eux pour accéder à toutes les langues, car ce ne sont en effet que des catégories de la même carte). Les ajustements que je devais apporter pour que cela fonctionne en douceur menaçaient les derniers restes de raison que je garde encore: S. Pour ces cas, je vous conseille de rechercher les documents et les fonctionnalités de support du logiciel spécifique que vous utilisez.

Eh bien, c'est tout ce que je peux sortir pour l'instant. Je pense que vous devriez en avoir assez pour remonter vos manches et vous mettre au travail. Ensuite, si vous heurtez un mur sur votre chemin, revenez avec des questions spécifiques et je suis convaincu que vous obtiendrez des réponses plus spécifiques.

J'espère que cela t'aides.

71
Edurne Pascual

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, j'utilise un code (abréviation) pour le rechercher. Ainsi, par exemple:

lang  id        message
en    login     Login
en    lostpass  Lost your password?
de    login     Anmelden
de    lostpass  Paswort vergessen?
nl    login     Aanmelden
nl    lostpass  Wachtwoord vergeten?

etc. La recherche des 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 les charger en mémoire lors du chargement de votre script. Les utilisateurs doivent toujours être en mesure de définir la langue de leur choix, ne vous fiez pas aveuglément à l'en-tête de langue défini par le navigateur Web.

7
Geert

Vous pouvez utiliser le langage le plus simple PHP Multi Language Class - LangQuery

Vous pouvez enregistrer vos données de langue dans des fichiers .ini que simplement l'appeler par

include("LangQuery.php");

$L=new LangQuery();

// Write Hello World
echo($L('hello_world'));

// Write Hello World Easier - In-line Echo Feature
// You don't have to write echo. Just add '>'
$L('>hello_world');

// Use in Strings
echo("Hello Universe. {$L('hello_world')} Hello Europe");

// Write my age with parameter
$L(">my_age",25);

// Write my name and age with parameters
$L(">my_name_age","Recep",25);
3
rturkek

Je suis en train de concevoir un tout petit CMS qui doit être multilingue.

L'une des caractéristiques qui me préoccupent le plus est que le client peut spontanément décider d'ajouter ou de supprimer une langue.

Pour cette raison, je ne vise pas la conception en ajoutant des suffixes aux tables de base de données, je ne peux pas (et je ne veux pas) modifier les noms de table ou y accéder en utilisant des noms dinamiques, ni ajouter ou supprimer des champs chaque fois qu'une langue est définie ou supprimée .

Je n'utiliserais pas les fichiers non plus, juste parce que j'aime les bases de données et qu'elles sont faciles à maintenir.

Et enfin, je pense dans deux types de traduction:

  1. Le texte Web.
  2. Le texte du contenu.

Par conséquent, ma conception vise à:

  • languajes Un tableau avec les langues définies.
  • traductions Un seul tableau qui contiendra tous les messages, comme suit:
    • [pk] table_name 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'identifiant de ligne pour l'élément qui sera traduit.
    • [pk] langue la langue dans laquelle le texte est traduit.
    • texte le texte traduit.

Cela signifie que les tables dont les champs auront du contenu dans un scénario à une seule langue, auront désormais leur contenu vide, car il sera toujours dans la table des traductions.

Cela augmentera la complexité des requêtes SQL, mais cela me permettra de développer des outils pour maintenir les traductions de manière simple. De plus, la complexité du sql n'existera qu'une seule fois, juste lors de l'implémentation de la solution. Si cette implémentation est correctement conçue, la maintenance/extensibilité du site ne doit pas être un problème majeur.

Modifier :

Après une conversation avec des amis développeurs, je pense que la solution que j'approche ici a trop de frais sur une seule table.

Une autre approche que j'étudierai désormais est de créer une table supplémentaire pour chaque "table traduisible" comme suit:

  • any_translatable_table: la table qui doit traduire l'un de ses champs
  • any_translatable_table_translations: table dans laquelle les traductions seront stockées.
    • [pk] field_name le nom du champ dont le contenu sera traduit.
    • [pk] row_id l'identifiant de ligne pour l'élément qui sera traduit.
    • [pk] langue la langue dans laquelle le texte est traduit.
    • texte le texte traduit.

Ce schéma hérite des concepts du premier, mais sépare son contenu par tables. Cette solution alternative peut augmenter les performances et isoler les problèmes (comme les problèmes d'indexation).

La table de traduction supplémentaire par "table traduisible" sera créée en même temps que la table d'origine.

Et à propos des requêtes SQL, la complexité est toujours la même: la première approche a besoin du nom de la table pour rechercher dans la table des traductions, mais la seconde ajoute simplement le suffixe "_translations" au nom de la table.

1
JoanComasFdz