2009-09-17 10 views
3

J'ai un site web ASP.Net qui utilise une base de données MySQL pour le back-end. Le site Web est un système de commerce électronique en anglais, et nous examinons la possibilité de le traduire en cinq autres langues (français, espagnol, etc.). Nous ferons appel à des traducteurs humains pour effectuer la traduction - nous avons examiné les services automatisés, mais ceux-ci ne sont pas suffisants.ASP.Net/MySQL: Traduire le contenu en plusieurs langues

Le texte statique sur le site (par exemple, en-têtes, boutons, etc.) peut facilement être servi en plusieurs langues via les fonctions de localisation intégrées de .Net (fichiers resx, etc.). La chose que je ne suis pas si sûr de la meilleure façon de stocker et de récupérer le contenu multilingue dans la base de données. Par exemple, il y a une table de produits qui inclut ces champs ...

  • productId (int)
  • categoryId (int)
  • titre (varchar)
  • résumé (varchar)
  • Description (texte)
  • caractéristiques (texte)

Le titre, le résumé, la description et dispose tex Il faudrait qu'il soit disponible dans toutes les langues.

Voici les deux options que je suis venu avec ...

Créer champ supplémentaire pour chaque langue Par exemple, nous pourrions avoir titleEn, titleFr, titleEs etc pour toutes les langues, et répétez ceci pour toutes les colonnes de texte. Nous adapterons ensuite notre code pour utiliser le champ approprié en fonction de la langue sélectionnée. Cela semble un peu hacky, et conduirait aussi à de très grandes tables. En outre, si nous voulions ajouter d'autres langues à l'avenir, il serait fastidieux d'ajouter encore plus de colonnes.

Utilisez une table de recherche Nous pourrions créer une nouvelle table avec le format suivant ...

textId | languageId | content 
------------------------------- 
10  | EN   | Car 
10  | FR   | Voiture 
10  | ES   | Coche 
11  | EN   | Bike 
11  | FR   | Vélo 

Nous avions adaptons notre table de produits pour faire référence à la textID appropriée pour le titre, le résumé, Description et fonctionnalités au lieu d'avoir le texte stocké dans la table des produits. Cela semble beaucoup plus élégant, mais je ne peux pas penser à un moyen simple d'extraire ces données de la base de données et sur la page sans utiliser d'instructions SQL complexes. Bien sûr, l'ajout de nouvelles langues à l'avenir serait très simple par rapport à l'option précédente.

Je serais très reconnaissant pour toutes les suggestions sur la meilleure façon d'y parvenir! Existe-t-il des conseils sur les «meilleures pratiques»? Est-ce que quelqu'un a déjà fait ça?

Répondre

4

Dans votre cas, je vous conseille d'utiliser deux tables:

Product 
------------------------------- 
ProductID | Price | Stock 
------------------------------- 
10   | 10  | 15 


ProductLoc 
----------------------------------------------- 
ProductID | Lang | Name  | Description 
----------------------------------------------- 
10  | EN | Bike  | Excellent Bike 
10  | ES | Bicicleta | Excelente bici 

De cette façon, vous pouvez utiliser:

SELECT * FROM 
Product LEFT JOIN ProductLoc ON Product.ProductID = ProductLoc.ProductID 
           AND ProductLoc.Lang = @CurrentLang 

(Joindre à gauche juste au cas où il n'y a pas d'enregistrement pour la lang courante dans la table ProductLoc)

+0

Excellente idée, je pense que cela fonctionnera bien. Merci beaucoup pour votre réponse. – philwilks

2

Ce n'est pas une bonne idée d'ajouter de nouvelles colonnes à une table existante. Il sera vraiment difficile d'ajouter une nouvelle langue dans la fonctionnalité. La table de recherche est beaucoup mieux mais je pense que vous pouvez avoir un problème de performance, car le nombre d'enregistrements traduits.

Je pense que la meilleure solution est d'avoir une table partagée:

products: id, categoryid, 

et les mêmes tables pour toutes les langues

products_en, products_de: product_id (fk), title, price, description, ... 

Vous sélectionnez simplement le partage d'un et se joindre à la table avec votre langue. L'avantage est que vous pouvez localiser même le prix, catégorie, ...

+0

Je ne sais pas si c'est bien mieux que d'ajouter des colonnes supplémentaires? Avec environ 20 tables qui auraient besoin d'être traduites, cela passerait à environ 120 tables avec cinq langues. – philwilks

+0

Merci pour la suggestion cependant, je ne suis pas ingrat, je suis juste sûr que cela ne peut pas être la meilleure solution. – philwilks

+0

C'est bon. Je pense qu'il n'y a pas de «meilleure solution». Tout a des avantages/inconvénients. Ici vous aurez de meilleures performances que la solution de recherche. La solution de recherche est bonne si vous avez besoin de plus de colonnes à la table et vous n'aurez pas beaucoup d'enregistrements. Le nombre de tables n'est pas un problème et vous pouvez avoir un skript qui ajoutera une nouvelle colonne à chaque table. Si vous avez 20 colonnes tranlatable et 1m reccords, la recherche sera lente. Mais il n'y a rien de mal à l'utiliser. –

Questions connexes