Pregunta

Tengo un sitio web ASP.Net que utiliza una base de datos MySQL para el back-end. El sitio web es un sistema de comercio electrónico en inglés, y estamos considerando la posibilidad de traducirlo a otros cinco idiomas (francés, español, etc.). Obtendremos traductores humanos para realizar la traducción. Hemos analizado los servicios automatizados, pero estos no son lo suficientemente buenos.

El texto estático en el sitio (por ejemplo, encabezados, botones, etc.) se puede publicar fácilmente en varios idiomas a través de las funciones de localización integradas de .Net (archivos resx, etc.).

Lo que no estoy tan seguro es cuál es la mejor manera de almacenar y recuperar el contenido en varios idiomas en la base de datos. Por ejemplo, hay una tabla de productos que incluye estos campos ...

  • productId (int)
  • categoryId (int)
  • título (varchar)
  • resumen (varchar)
  • descripción (texto)
  • características (texto)

El texto del título, resumen, descripción y características debería estar disponible en todos los idiomas.

Estas son las dos opciones que se me ocurrieron ...

Crear campo adicional para cada idioma Por ejemplo, podríamos tener titleEn, titleFr, titleEs, etc. para todos los idiomas, y repetir esto para todas las columnas de texto. Luego, adaptaríamos nuestro código para usar el campo apropiado según el idioma seleccionado. Esto se siente un poco hacky, y también llevaría a algunas mesas muy grandes. Además, si quisiéramos agregar idiomas adicionales en el futuro, tomaría más tiempo agregar aún más columnas.

Usar una tabla de búsqueda Podríamos crear una nueva tabla con el siguiente formato ...

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

Luego, adaptamos nuestra tabla de productos para hacer referencia al Id. de texto apropiado para el título, resumen, descripción y características en lugar de tener el texto almacenado en la tabla de productos. Esto parece mucho más elegante, pero no puedo pensar en una forma simple de obtener estos datos de la base de datos y en la página sin usar sentencias SQL complejas. Por supuesto, agregar nuevos idiomas en el futuro sería muy simple en comparación con la opción anterior.

¡Le agradecería cualquier sugerencia sobre la mejor manera de lograr esto! ¿Hay alguna "mejor práctica"? orientación por ahí? ¿Alguien ha hecho esto antes?

¿Fue útil?

Solución

En su caso, recomendaría usar dos tablas:

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


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

De esta manera puedes usar:

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

(Unir a la izquierda por si no hay registro para el idioma actual en la tabla ProductLoc)

Otros consejos

No es una buena idea solo agregar nuevas columnas a la tabla existente. Será realmente difícil agregar un nuevo idioma en la función. La tabla de búsqueda es mucho mejor, pero creo que puede tener problemas con el rendimiento debido a la cantidad de registros traducidos.

Creo que la mejor solución es tener una tabla compartida:

products: id, categoryid, 

y las mismas tablas para todos los idiomas

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

Simplemente seleccionará del compartido y unirá la tabla con su idioma. La ventaja es que puede localizar incluso el precio, la categoría, ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top