Вопрос

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

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

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

  • Идентификатор продукта (int)
  • Идентификатор категории (int)
  • название (varchar)
  • краткое содержание (varchar)
  • описание (текст)
  • особенности (текст)

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

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

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

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

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

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

Я был бы очень благодарен за любые предложения о наилучшем способе достижения этой цели!Существует ли какое-либо руководство по "наилучшей практике"?Кто-нибудь делал это раньше?

Это было полезно?

Решение

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

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 нет записи для текущего языка)

Другие советы

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

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

products: id, categoryid, 

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top