ASP.Net / MySQL :Перевод контента на несколько языков
-
08-07-2019 - |
Вопрос
У меня есть 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, ...
Вы просто выберете из общей таблицы и присоединитесь к ней на вашем языке.Преимущество в том, что вы можете локализовать даже цену, категорию, ...