2011-03-30 3 views
0

J'ai développé un site web il y a plus d'un an. Le contenu était/est en deux langues et maintenant je dois construire une base de données axée sur la mise à jour/système d'insertion de données pour eux inserte des nouvelles, des événements, etc. est la meilleure approche pour créer des tables comme ceci:Comment structurer une base de données pour un site web multilingue simple (PHP MySQL)?

news_id   int(10) unsigned PK 
lang_id   int(2) 
status   tinyint(1) 
title   varchar(255) 
title_en  varchar(255) 
title_es  varchar(255) 
content   text 
content_en  text 
content_es  text 
date_inserted datetime 
date_modified datetime 
type   varchar(45) 
atach   text 

puis créez une table pour les langues

+0

IMO: Mieux vaut conserver 1 table. – drudge

+1

Avez-vous des exigences spécifiques qui ne peuvent pas être satisfaites par un CMS mature comme Drupal? – Emyr

+0

Le site n'a pas été créé à l'aide d'un CMS, je devrais presque reconstruire le site pour l'adapter au CMS. – tenshimsm

Répondre

3

Vous ne devez vous soucier que d'une langue pour une demande particulière. Bien que vous ne puissiez sélectionner que la langue requise par la demande de page, il n'est toujours pas recommandé d'organiser votre contenu de cette manière.

Ce que vous devez faire est d'utiliser les paramètres régionaux et fournir des valeurs par défaut pour un contenu. Parce que même si vous pensez que vous créerez toujours deux versions d'un contenu, dans un monde moins que parfait, cela n'arrive pas toujours. Donc, vous devez d'abord créer votre modèle pour refléter cette relation. Par conséquent, vous devez d'abord créer votre modèle. Pour la simplicité, je vais simplement me référer à cela comme content. Mais vous pourriez bien sûr avoir votre contenu pour n'importe quoi.

`content` (The Table) 
id 
status 
title 
content 
dataCreated 
dateModified 
owner 

`contentTranslations` (The Table) 
id 
contentId (FK) 
locale 
title 
content 
dateCreated 
dateModified 

Maintenant, vous avez juste besoin d'un moyen de connaître les paramètres régionaux que l'utilisateur souhaite utiliser. Je préfère utiliser Zend_Locale pour gérer tous mes paramètres régionaux, et Zend_Translate pour short key => value translations. (Ceci n'est pas approprié pour les longues traductions de contenu). Lorsque vous connaissez les paramètres régionaux que vous souhaitez utiliser, tout ce que vous devez faire est d'effectuer votre requête pour sélectionner avec une jointure.

La beauté

La beauté de tout cela cependant, est que si vous ne l'avez pas créé votre contenu pour une version particulière, vous pouvez toujours défaut et rouler sur votre langue de base que l'original article/contenu a été écrit en.

SELECT c.id, c.status, c.title, c.content 
FROM content as c 
LEFT JOIN contentTranslations as t 
ON c.id = t.contentId 
WHERE c.id = 21231 AND t.locale = X 
+0

Merci pour la réponse. Je vais essayer, mais je n'ai pas l'expérience de l'utilisation des bases de données et je n'ai pas encore travaillé avec Foreign Keys. – tenshimsm

+0

Donc, pour utiliser, je vais devoir créer un double INSERT pour remplir les tables et il ne fonctionnera qu'avec les PROCEDURES (c'est ce que je voulais dire "... pas expérimenté dans l'utilisation des bases de données ..." – tenshimsm

1

tout dans une Keeping base de données est le chemin à parcourir si vous allez seulement avoir deux langues et si la quantité de champs spécifiques de langue n'est pas élevé. Mais à long terme, il pourrait être préférable de le diviser en deux bases de données, l'une contenant les données qui ne dépendent pas de la langue, l'autre pour les traductions. Cela vous permettra d'ajouter facilement d'autres langues à l'avenir

base de données « NOUVELLES »:

news_id   int(10) 
status   tinyint(1) 
date_inserted datetime 
date_modified datetime 
type   varchar(45) 
atach   text 

« TRADUCTIONS » base de données:

translation_id int(10) 
news_id   int(10) 
lang_id   int(2) 
title   varchar(255) 
content   text 

MAIS, cela pourrait aussi être lente dans certaines circonstances . Je ne sais pas combien de trafic ce site obtient. Btw: depuis que je peux voir le type est un varchar (45) je suppose que cela pourrait aussi être lié à la langue?

+0

la réponse.Au fond, le site n'aura que deux langues, mais soyez préparé est la meilleure chose à faire :) Le varchar (45) est en fait pour le titre de la section où le contenu va et dépend de la langue et l'a changé en section. – tenshimsm

Questions connexes