PHP / MySql et les tables

Fermé
Utilisateur anonyme - 17 août 2001 à 17:09
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 - 22 août 2001 à 17:51
Bonjour,

Je commence le php (depuis le temps que je le dis, je vais bientot y arriver) :))

Je voudrais faire un site en Anglais, Français et Espagnol et pouvoir ajouter de nouvelle langue plus tard.

Je ne sais pas si je dois creer un champ dans ma table qui indique la langue ou si je dois creer autant de table que de langue ??

P.S.: je tiens absoluement a traduire moi-même mes pages (sans utiliser les traducteurs automatiques).

Merci d'avances pour vos avis et conseils :))

ZIG1

5 réponses

c'est un peu complexe

il faudrait etudier le pb sur le papier

un option un table de pointage qui definit la langue et la page et qui pointe sur une autre table pour affichier la bonne page avec ses traductions

un peu complexe a mettre en oeuvre

ca te permettra d'avoir des pages dynamiques

salut
0
Bobinours Messages postés 2898 Date d'inscription jeudi 26 avril 2001 Statut Membre Dernière intervention 21 mars 2013 504
20 août 2001 à 05:18
Bien entendu, les deux choix sont possibles et discutables... Pour ma part, et par simplicité et clarté, j'opterais pour faire une table par langue. Ceci sera avantageux si tu n'as pas besoin de faire sans cesse des relations entre les langues. Sinon tu pourras toujours faire des jointures...

-= Bobinours =-
0
Utilisateur anonyme
21 août 2001 à 11:59
j'ai 19 table, si je fais une table par langue, j'obtiendrais 19*nb table.

je n'ai strictement aucune idée de la faisabilité ou des moyen a mettre en oeuvre ...

au mieux vaux PHP3 ou PHP4 ??
0
Bobinours Messages postés 2898 Date d'inscription jeudi 26 avril 2001 Statut Membre Dernière intervention 21 mars 2013 504
22 août 2001 à 02:42
Dans ce cas, je ferais carrement 1 base de données par Pays :

FR:
- table 1
- table 2
...
- table 19

UK:
- table 1
- table 2
...
- table 19

...


PHP4 est mieux que PHP3, plus rapide et de nouvelles fonctionnalités ont été ajoutées (comme les sessions). Mais pour ton cas je ne sais pas si ça a une importance...

-= Bobinours =-

-= Bobinours =-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PhP Messages postés 1767 Date d'inscription lundi 11 décembre 2000 Statut Membre Dernière intervention 23 décembre 2009 606
22 août 2001 à 17:51
Salut ZIG1

Pour ce qui est des tables PHP n'intervient pas : alors PHP3 ou PHP4 c'est juste une question de provider. Renseigne toi auprès de
lui pour savoir quelle version il supporte.
Quant aux différences entres les 2 versions ... aucune idée mais je suppose que pour les
cdes liées à MySql il n'y a rien de bien nouveau.

Par contre le module MySql livré avec la version PHP4 est peu être plus évolué.


Pour la structure même de ta base c'est à toi de bien penser la chose...

Chaque élément à traduire ne doit figurer que sous la forme d'une clé (ID_LANGUE pa ex) et ce dans tous les champs de ttes tes tables que tu en ais 1 ou 19 peu importe. Du moins c'est comme çà
que je procéderais.


Voici un ex : la gestion d'un petit menu FRANCAIS ou ANGLAIS

Tu noteras que le table MENU ne comporte aucun libellé "en clair" !
Juste une clé vers la ou les tables des langues.

1) Cas avec une seule table pour toutes les langues

Table : MENU
+-----------------+
|ID_MENU|ID_LANGUE|
+-------+---------+
| 0001 | 00001 |
| 0001 | 00003 |
| 0001 | 00005 |
| 0001 | 00002 |
| 0001 | 00004 |
+-----------------+

Table : LANGUE
+---------------------------------+
|ID_LANGUE|TXT_GB |TXT_FR |
+---------+-----------+-----------+
| 00001 |OPEN |OUVRIR |
| 00002 |CLOSE |FERMER |
| 00003 |SEARCH |RECHERCHER |
| 00004 |QUIT |QUITTER |
| 00005 |FILE |FICHIER |
+---------------------------------+


SQL pour menu en FRANCAIS :

select MENU.*, LANGUE.TXT_FR as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE

Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OUVRIR |
| 0001 | 00003 |RECHERCHER|
| 0001 | 00005 |FICHIER |
| 0001 | 00002 |FERMER |
| 0001 | 00004 |QUITTER |
+----------------------------+


SQL pour menu en ANGLAIS :

select MENU.*, LANGUE.TXT_GB as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE

Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OPEN |
| 0001 | 00003 |SEARCH |
| 0001 | 00005 |FILE |
| 0001 | 00002 |CLOSE |
| 0001 | 00004 |QUIT |
+----------------------------+


L'utilisation de l'alias 'LIBELLE' pour le texte au lieu du nom du champ te permet
de toujours faire référence dans ton code PHP à la même variable LIBELLE et ce qlque soit
la langue.

Tu noteras que les 2 tables résultantes des jointures ont bien la même structure !

En plus si tu donnes un nom bien précis au champ de chaque langue comme ici "TXT_"+Code_pays
alors tu peux n'avoir qu'une seule requête grâce à PHP

Ex de code PHP :

$code_pays="FR";
$sql="select MENU.*, LANGUE.TXT_".$code_pays." as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE";

etc ...




1-1) Variante du cas 1 : une seule table des langues :

Table : LANGUE
+-----------------------------+
|ID_LANGUE|ID_PAYS|TXT |
+---------+-------+-----------+
| 00001 | FR |OUVRIR |
| 00002 | FR |FERMER |
| 00003 | FR |RECHERCHER |
| 00004 | FR |QUITTER |
| 00005 | FR |FICHIER |
| 00001 | GB |OPEN |
| 00002 | GB |CLOSE |
| 00003 | GB |SEARCH |
| 00004 | GB |QUIT |
| 00005 | GB |FILE |
+-----------------------------+

ou encore ...

Table : LANGUE
+----------------------+
|ID_LANGUE |TXT |
+----------+-----------+
| 00001FR |OUVRIR |
| 00002FR |FERMER |
| 00003FR |RECHERCHER |
| 00004FR |QUITTER |
| 00005FR |FICHIER |
| 00001GB |OPEN |
| 00002GB |CLOSE |
| 00003GB |SEARCH |
| 00004GB |QUIT |
| 00005GB |FILE |
+----------------------+


Mais dans ce cas un nbr de ligne est plus important est testé lors des jointures.




2) Cas avec une table par langue :

Table : MENU
+-----------------+
|ID_MENU|ID_LANGUE|
+-------+---------+
| 0001 | 00001 |
| 0001 | 00003 |
| 0001 | 00005 |
| 0001 | 00002 |
| 0001 | 00004 |
+-----------------+



Table : LANGUE_GB
+---------------------+
|ID_LANGUE|TXT |
+---------+-----------+
| 00001 |OPEN |
| 00001 |CLOSE |
| 00001 |SEARCH |
| 00001 |QUIT |
| 00001 |FILE |
+---------------------+

Table : LANGUE_FR
+---------------------+
|ID_LANGUE|TXT |
+---------+-----------+
| 00001 |OUVRIR |
| 00001 |FERMER |
| 00001 |RECHERCHER |
| 00001 |QUITTER |
| 00001 |FICHIER |
+---------------------+

SQL pour menu en FRANCAIS :

select MENU.*, LANGUE_FR.TXT as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE_FR.ID_LANGUE

Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OUVRIR |
| 0001 | 00003 |RECHERCHER|
| 0001 | 00005 |FICHIER |
| 0001 | 00002 |FERMER |
| 0001 | 00004 |QUITTER |
+----------------------------+

SQL pour menu en ANGLAIS :

select MENU.*, LANGUE_GB.TXT as LIBELLE
from MENU inner join LANGUE on MENU.ID_LANGUE=LANGUE.ID_LANGUE

Résultat de la jointure :
+----------------------------+
|ID_MENU|ID_LANGUE|LIBELLE |
+-------+---------+----------+
| 0001 | 00001 |OPEN |
| 0001 | 00003 |SEARCH |
| 0001 | 00005 |FILE |
| 0001 | 00002 |CLOSE |
| 0001 | 00004 |QUIT |
+----------------------------+


Ex de code PHP générique :

$code_pays="FR";
$sql="select MENU.*, LANGUE_".$code_pays.".TXT as LIBELLE
from MENU inner join LANGUE_".$code_pays." on MENU.ID_LANGUE=LANGUE_".$code_pays.".ID_LANGUE";


Dans un cas c'est le nom du champ qui est variable, dans l'autre le nom de la table.





Cas n° 1 : une table des langues


Avantages :
- on ne met à jour qu'un seul enregistrement pour toutes les langues.
- on peut comparer facilement les traductions (de moins tq le texte à traduire est court !)
dans toutes les langues en utilisant simplement PhpMyAdmin
- pas de risque d'oublier une langue : au pire le champ est à blanc
- 1 seule table à gérer
- le code PHP est un peu plus simple

Inconvenients :
- la taille de la table peut augmenter très vite


Cas n°2 : une table par langue

Avantages :
- peut-être une meilleur visibilité
- tables "réduites"

Inconvénients :
- il faut penser à mettre à jour chaque table en même temps.
- il faut que les clés (ici ID_LANGUE) coïncident entres les tables.


Personnellement je pencherais volontier pour le cas n°1 du début. :)

@+
Philippe


PS : fait un copier-coller du msg dans notepad pour avoir un alignement correct
0