2008-08-26 10 views
3

J'ai besoin de stocker des produits pour une solution de commerce électronique dans une base de données. Chaque produit doit avoir des informations descriptives, telles que le nom, la description, etc.Architecture de la globalisation

J'ai besoin de n'importe quel produit pour être localisé dans x nombre de langues.

Ce que je l'ai fait jusqu'à présent, est de faire une colonne qui doit être localisée et nvarchar(MAX) puis-je stocker une chaîne XML comme ceci:

<cultures> 
    <culture code="en-us">Super fast laptop</culture> 
    <culture code="da-dk">Super hurtig bærbar</culture> 
</cultures> 

Et quand je le charger à partir de la base de données, en mes objets de logique métier, j'analyse la chaîne XML en Dictionary<string, string> où la clé est le code de culture/langue.

Alors, quand je veux afficher le nom d'un produit, je fais ceci:

lblName.Text = product.Name["en-us"]; 

Quelqu'un at-il une meilleure solution?

Répondre

2

Vous devez conserver la langue actuelle quelque part (dans un singleton, par exemple) et dans la propriété product.Name utiliser le paramètre de langue pour obtenir la chaîne correcte. De cette façon, vous n'avez qu'à écrire le code spécifique à la langue une fois pour chaque domaine plutôt que de penser aux langues partout où le champ est utilisé.

Par exemple, en supposant que votre singleton est défini dans la classe Localizer qui stocke un ENUM correspondant à la langue actuelle:

public class Product 
{ 
    private idType id; 
    public string Name 
    { 
    get 
    { 
     return Localizer.Instance.GetLocalString(id, "Name"); 
    } 
    } 
} 

Où GetLocalString ressemble:

public string GetLocalString(idType objectId, string fieldName) 
    { 
    switch (_currentLanguage) 
    { 
     case Language.English: 
     // db access code to retrieve your string, may need to include the table 
     // the object is in (e.g. "Products" "Orders" etc.) 
     db.GetValue(objectId, fieldName, "en-us"); 
     break; 
    } 
    } 
1

La série de webcasts MVC Storefront de Rob Conery a a video on this issue (il arrive à la base de données vers 5:30). Il stocke une liste de cultures, puis dispose d'une table Product pour les données non localisées et d'une table ProductCultureDetail pour le texte localisé.

+0

Bonne idée de laisser "Culture" dans le nom de la table afin de distinguer le contenu de la table en tant que données localisées plutôt que quelque chose d'autre. – y0mbo

1

fichiers de ressources

+0

Meilleure solution, pire réponse :) – Ropstah

0

Ceci est essentiellement le approche que nous avons pris avec Microsoft Commerce Server 2002. Oui, les vues indexées aideront vos performances.