Domanda

Ho un sito Web ASP.Net che utilizza un database MySQL per il back-end. Il sito Web è un sistema di e-commerce inglese e stiamo esaminando la possibilità di tradurlo in circa altre cinque lingue (francese, spagnolo, ecc.). Faremo tradurre i traduttori umani per eseguire la traduzione - abbiamo esaminato i servizi automatizzati ma questi non sono abbastanza validi.

Il testo statico sul sito (ad es. titoli, pulsanti ecc.) può essere facilmente pubblicato in più lingue tramite le funzionalità di localizzazione integrate di .Net (file resx ecc.)

La cosa di cui non sono così sicuro su come archiviare e recuperare il contenuto multilingue nel database. Ad esempio, esiste una tabella di prodotti che include questi campi ...

  • productId (int)
  • categoryId (int)
  • titolo (varchar)
  • sommario (varchar)
  • descrizione (testo)
  • caratteristiche (testo)

Il titolo, il riassunto, la descrizione e il testo delle caratteristiche dovrebbero essere disponibili in tutte le diverse lingue.

Ecco le due opzioni che ho escogitato ...

Crea un campo aggiuntivo per ogni lingua Ad esempio, potremmo avere titleEn, titleFr, titleEs ecc per tutte le lingue e ripeterlo per tutte le colonne di testo. Adatteremo quindi il nostro codice per utilizzare il campo appropriato in base alla lingua selezionata. Questo sembra un po 'confuso e porterebbe anche ad alcuni tavoli molto grandi. Inoltre, se volessimo aggiungere altre lingue in futuro, aggiungerebbe ancora più colonne.

Utilizza una tabella di ricerca Potremmo creare una nuova tabella con il seguente formato ...

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

Adatteremmo quindi la nostra tabella dei prodotti in modo da fare riferimento al textId appropriato per il titolo, il riepilogo, la descrizione e le funzionalità anziché tenere il testo memorizzato nella tabella del prodotto. Sembra molto più elegante, ma non riesco a pensare a un modo semplice per estrarre questi dati dal database e sulla pagina senza usare istruzioni SQL complesse. Naturalmente aggiungere nuove lingue in futuro sarebbe molto semplice rispetto alla precedente opzione.

Sarei molto grato per eventuali suggerimenti sul modo migliore per raggiungere questo obiettivo! C'è qualche "best practice" guida là fuori? Qualcuno l'ha mai fatto prima?

È stato utile?

Soluzione

Nel tuo caso, consiglierei di usare due tabelle:

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


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

In questo modo puoi usare:

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

(Join sinistro nel caso in cui non ci siano record per la lingua corrente nella tabella ProductLoc)

Altri suggerimenti

Non è una buona idea solo aggiungere nuove colonne alla tabella esistente. Sarà davvero difficile aggiungere una nuova lingua nella funzione. La tabella di ricerca è molto migliore, ma penso che potresti avere problemi con le prestazioni a causa del numero di record tradotti.

Penso che la soluzione migliore sia avere una tabella condivisa:

products: id, categoryid, 

e stesse tabelle per ogni lingua

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

Sceglierai solo quello condiviso e ti unirai alla tabella con la tua lingua. Il vantaggio è che puoi localizzare anche il prezzo, la categoria, ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top