2009-12-26 7 views
0

Je construis un CMS qui prendra en charge 7 langues/cultures différentes. Pour les images qui ne peuvent pas être modifiées via le CMS, je pense que je vais utiliser différents fichiers de ressources. En ce qui concerne le contenu, je pensais à des bases de données séparées. Si l'utilisateur a besoin de changer la culure actuelle, j'ai une liste déroulante qui stocke la culture choisie dans un cookie, puis je lis le cookie et définissez la culture dans le Application_BeginRequest du global.asax. Comment puis-je utiliser différentes chaînes de connexion pour les différentes cultures? Est-ce que le fichier de ressources va gérer cela aussi? Est-ce même une bonne idée d'avoir plusieurs bases de données? C'est tout une première pour moi et je cherche des indications que quelqu'un peut avoir. Merci! Éditer: Les différentes langues/cultures seront gérées par différents utilisateurs dans le CMS de sorte que le contenu puisse être différent pour une page donnée et pas seulement une traduction.Puis-je avoir quelques conseils sur la mondialisation en .net pour un CMS multilingue?

+0

@Mike Je travaille sur un site CMS qui supporte plus de 60 langues et près d'un million de pages. Chaque version linguistique d'un site est gérée par une organisation différente d'éditeurs et a un contenu, des images et des structures différents. Pour être tout à fait honnête, ce que vous demandez est bien au-delà de la portée de quelques architectes de fauteuil jetant leurs opinions sur ce que devrait être votre structure db. Si vous voulez en discuter longuement, n'hésitez pas à m'envoyer un email à [email protected] –

Répondre

1

D'après ce que vous avez dit, il semble que le contenu de la base de données n'ait pas besoin d'être traduit dans différentes langues, donc vous n'avez probablement pas besoin de bases de données séparées pour gérer cela. S'il existe un contenu de base de données partagé, vous pouvez utiliser une table de traduction, similaire à celle mentionnée par @Xabatcha, bien que je suggère une structure de table plus simple. Quelque chose comme ...

CREATE TABLE TranslatedText 
(
    TextID INT, 
    LanguageID INT, 
    Text NVARCHAR(8000) 
) 

CREATE TABLE Product 
(
    ProductID INT, 
    NameTextID INT, 
    DescriptionTextID INT, 
    Cost MONEY, 
    Weight DECIMAL 
) 

Toute table qui requérait du texte traduit pouvait simplement référencer le TextID. La clé devrait en fait être un composite de TextID et LanguageID. Si vous utilisez SqlServer, vous pouvez créer une fonction de base de données pour obtenir le texte traduit afin que vous n'ayez pas besoin de faire une jointure pour chaque instruction SQL dans laquelle vous devez obtenir la valeur.

0

Je vous déconseille fortement d'avoir une base de données pour chaque langue. Vous pouvez conserver chaque élément translatable dans une table distincte où chaque ligne représente la traduction d'un contenu utilisateur pour une langue donnée.

+0

Merci pour la réponse. Je n'étais pas assez clair dans ma question.Le contenu linguistique/culturel différent sera géré par différents utilisateurs, de sorte que le contenu peut et sera probablement différent non seulement d'une traduction. Conseilleriez-vous encore contre les dbs séparés? – Mike

2

Je serais également contre utiliser des bases de données distinctes pour chaque langue. Ce serait une solution trop compliquée. Ne sachez pas ce que vous voulez enregistrer en db, mais nous utilisons patern comme il y a une table de transaction supplémentaire pour chaque table qui nécessite du texte à traduire. Par exemple.

tblProduct (Id,Cost,Weight) 
tblProductTranslation (Id, IdProduct, Culture, Name, Description) 

Vous pouvez voir que les champs traduits sont déplacés vers la table de traduction.

Ci-dessous est coupé de SQL qui renvoie le produit avec la culture requise. En outre, si la culture n'est pas requise, elle renvoie la valeur par défaut.

SELECT 
en.ID 
,en.ProductCategoryId 
,ISNULL(req.[Name], en.[Name]) AS [Name] 
,ISNULL(req.[Description], en.[Description]) AS [Description] 
,... 
,en.IsActive 
FROM (SELECT * FROM res_vwProducts where culture = @DefaultCulture) en 
LEFT OUTER JOIN (select * from res_vwProducts where culture = @Culture) req on req.ID = en.ID 
WHERE en.ID = @ID 

Je peux imaginer que vous allez faire décharge de code à partir un éditeur HTML en ligne qui peut être légèrement différent. Dans ce cas, je voudrais le rendre simple et ajouter simplement Culture dans la table, comme

tblArticle (Id, Culture, Body, Title,...) 

Espérons que cela aide. Cheers, X.