@laravel_creative_3103

Каким образом к существующей таблице можно добавить еще одну колонку для мультиязычности и добавить уже текст с переводом?

Условно, у меня имеется таблица, в которой есть колонка DocType. Задача заключается в том, чтобы добавить еще одну колонку для мультиязычности, назвав DocTypeEn, в котором будет перевод. Какой правильный подход можно применить к нему?
660a3744c8562927018384.png
Мой вариант заключается в том, чтоб скачать эту таблицу в виде .csv, форматировать в .xlsx, и внутри .xlsx - добавить колонку DocTypeEn.
660a3a46c936b893099722.png
Но, дальше как быть, не совсем знаю, буду благодарен, если подскажите какой правильный подход выбрать.
  • Вопрос задан
  • 60 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Akina
Сетевой и системный админ, SQL-программист.
Задача заключается в том, чтобы добавить еще одну колонку для мультиязычности, назвав DocTypeEn, в котором будет перевод.


Ага... а потом захочется на немецкий, на китайский... так и будешь поля добавлять?

Классический подход - таблица текстовых литералов

CREATE TABLE translation (
    token_id INT,      -- идентификатор строки
    language_id INT,   -- идентификатор языка
    PRIMARY KEY (token_id, language_id),
    value VARCHAR(100) NULL DEFAULT NULL
    );


Соответственно зная номер строки, который нужен, и язык, получаем значение
SELECT value
FROM translation
JOIN language USING (language_id)
WHERE token_id = @token_id
  AND language_name = @language_name;

Впрочем, обычное состояние - это когда не все строки переведены. Тогда используется
SELECT COALESCE((
    SELECT value
    FROM translation
    JOIN language USING (language_id)
    WHERE token_id = @token_id
      AND language_name = @language_name;
    ), (
    SELECT value
    FROM translation
    JOIN language USING (language_id)
    WHERE token_id = @token_id
      AND language_name = @default_language_name;
    )) value;

То есть для литералов. имеющих перевод, возвращаются именно они, а для ещё не имеющих - значение на языке по умолчанию.

============

С другой стороны, вывод сообщений на экран - это интерактивное взаимодействие, где начхать на производительность. А коли так, то сообщения можно хранить в одном поле в виде JSON объекта, типа
{
    "ru":"Выход",
    "en":"Quit"
}

Но и для такой схемы получение литерала для дефолтного языка при отсутствии перевода - актуально.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы