Question

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 étudions la possibilité de le traduire dans environ cinq autres langues (français, espagnol, etc.). Nous aurons recours à des traducteurs humains pour effectuer la traduction - nous avons examiné les services automatisés, mais ceux-ci ne sont pas suffisants.

Le texte statique sur le site (par exemple, les en-têtes, les boutons, etc.) peut facilement être diffusé en plusieurs langues via les fonctions de localisation intégrées de .Net (fichiers resx, etc.).

Ce que je ne sais pas trop, c’est la meilleure façon de stocker et de récupérer le contenu multilingue de la base de données. Par exemple, il existe une table de produits contenant ces champs ...

  • productId (int)
  • categoryId (int)
  • titre (varchar)
  • résumé (varchar)
  • description (texte)
  • fonctionnalités (texte)

Le titre, le résumé, la description et les caractéristiques devraient être disponibles dans toutes les langues.

Voici les deux options que j'ai proposées ...

Créer un champ supplémentaire pour chaque langue Par exemple, nous pourrions avoir titleEn, titleFr, titleEs, etc. pour toutes les langues et le répéter pour toutes les colonnes de texte. Nous adapterions ensuite notre code pour utiliser le champ approprié en fonction de la langue sélectionnée. Cela semble un peu hacky, et conduirait également à de très grandes tables. De plus, si nous voulions ajouter d'autres langues à l'avenir, ajouter encore plus de colonnes prendrait beaucoup de temps.

Utiliser une table de recherche Nous pourrions créer une nouvelle table au format suivant ...

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

Nous avons ensuite adapté notre table de produits pour référencer le textId approprié pour le titre, le résumé, la description et les fonctionnalités au lieu d’avoir le texte stocké dans la table de produits. Cela semble beaucoup plus élégant, mais je ne trouve pas de solution simple pour extraire ces données de la base de données et les placer sur la page sans utiliser d'instructions SQL complexes. Bien sûr, ajouter de nouvelles langues dans le futur serait très simple comparé à l’option précédente.

Je serais très reconnaissant de vos suggestions sur la meilleure façon d’y parvenir! Existe-t-il des "meilleures pratiques"? des conseils là-bas? Quelqu'un l'a-t-il déjà fait auparavant?

Était-ce utile?

La solution

Dans votre cas, je vous recommande d'utiliser deux tableaux:

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

(Jointure à gauche au cas où il n'y aurait pas d'enregistrement pour la langue en cours dans la table ProductLoc)

Autres conseils

Ce n’est pas une bonne idée que d’ajouter de nouvelles colonnes à la table existante. Il sera vraiment difficile d’ajouter une nouvelle langue à la fonctionnalité. La table de correspondance est bien meilleure, mais je pense que vous pouvez avoir des problèmes de performances à cause du nombre d’enregistrements traduits.

Je pense que la meilleure solution consiste à 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 ne ferez que choisir parmi celles partagées et rejoindre la table avec votre langue. L’avantage, c’est que vous pouvez localiser même le prix, la catégorie, ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top