ASP.Net / MySQL: перевод контента на несколько языков - PullRequest
3 голосов
/ 17 сентября 2009

У меня есть веб-сайт ASP.Net, который использует базу данных MySQL для внутренней части. Веб-сайт представляет собой систему электронной коммерции на английском языке, и мы рассматриваем возможность перевода его примерно на пять других языков (французский, испанский и т. Д.). Мы будем привлекать переводчиков-людей для выполнения перевода - мы рассмотрели автоматизированные службы, но они недостаточно хороши.

Статический текст на сайте (например, заголовки, кнопки и т. Д.) Можно легко обслуживать на нескольких языках с помощью встроенных в .Net функций локализации (файлы resx и т. Д.).

В том-то и дело, что я не очень уверен в том, как лучше хранить и извлекать многоязычный контент в базе данных. Например, есть таблица продуктов, которая включает эти поля ...

  • productId (int)
  • categoryId (int)
  • title (varchar)
  • резюме (varchar)
  • описание (текст)
  • функции (текст)

Текст заголовка, резюме, описания и функций должен быть доступен на всех языках.

Вот два варианта, которые я придумала ...

Создать дополнительное поле для каждого языка Например, мы могли бы использовать titleEn, titleFr, titleEs и т. Д. Для всех языков и повторить это для всех текстовых столбцов. Затем мы адаптируем наш код для использования соответствующего поля в зависимости от выбранного языка. Это кажется немного хакерским, а также привело бы к очень большим столам. Кроме того, если мы хотим добавить дополнительные языки в будущем, добавление еще большего числа столбцов займет много времени.

Использование справочной таблицы Мы могли бы создать новую таблицу в следующем формате ...

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

Затем мы адаптировали бы нашу таблицу продуктов для ссылки на соответствующий textId для заголовка, резюме, описания и функций вместо того, чтобы текст сохранялся в таблице продуктов. Это кажется гораздо более элегантным, но я не могу придумать простой способ вывести эти данные из базы данных на страницу без использования сложных операторов SQL. Конечно, добавление новых языков в будущем будет очень простым по сравнению с предыдущим вариантом.

Буду очень признателен за любые предложения о наилучшем способе достижения этой цели! Есть ли какое-нибудь руководство по «лучшей практике»? Кто-нибудь делал это раньше?

Ответы [ 2 ]

4 голосов
/ 17 сентября 2009

В вашем случае я бы рекомендовал использовать две таблицы:

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


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

Таким образом, вы можете использовать:

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

(Соединение влево на случай, если в таблице ProductLoc нет записи для текущего языка)

2 голосов
/ 17 сентября 2009

Не стоит добавлять новые столбцы в существующую таблицу. Будет очень сложно добавить новый язык в функцию. Таблица поиска намного лучше, но я думаю, что у вас могут быть проблемы с производительностью из-за количества переведенных записей.

Я думаю, что лучшее решение - иметь общую таблицу:

products: id, categoryid, 

и одинаковые таблицы для каждого языка

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

Вы просто выберете один из них и присоединитесь к таблице с вашим языком. Преимущество в том, что вы можете локализовать даже цену, категорию, ...

...