Каким образом можно эффективно добавить столбец, содержащий перевод значений из столбца "DocType" на английский язык, и назвать его "DocTypeEn"?
Для добавления новой колонки в таблицу для размещения текста на нескольких языках, вам сначала необходимо выполнить следующие шаги: 1. Создайте новую колонку в вашей таблице с помощью SQL-запроса ALTER TABLE: ``` ALTER TABLE название_таблицы ADD название_новой_колонки VARCHAR(255); ``` 2. Заполните новую колонку текстом на первом языке, например, на русском: ``` UPDATE название_таблицы SET название_новой_колонки = 'Текст на русском'; ``` 3. После этого добавьте еще одну колонку для перевода текста: ``` ALTER TABLE название_таблицы ADD название_новой_колонки_перевод VARCHAR(255); ``` 4. Заполните новую колонку переводом текста: ``` UPDATE название_таблицы SET название_новой_колонки_перевод = 'Text in English'; ``` Теперь у вас в таблице будет две колонки для текста на разных языках. Чтобы эффективно добавить столбец "DocTypeEn" с переводами значений из столбца "DocType" на английский язык, вам потребуется следующий SQL-запрос: ``` ALTER TABLE название_таблицы ADD DocTypeEn VARCHAR(255); UPDATE название_таблицы SET DocTypeEn = CASE WHEN DocType = 'значение1' THEN 'Value1' WHEN DocType = 'значение2' THEN 'Value2' ELSE 'Other Value' END; ``` В данном случае, вам необходимо заменить 'значение1', 'значение2' и 'Other Value' на соответствующие значения из столбца "DocType" и их переводы на английский язык. После выполнения этого запроса, в вашей таблице будет добавлен столбец "DocTypeEn" с переводами значений из столбца "DocType" на английский язык.
Задача заключается в том, чтобы добавить еще одну колонку для мультиязычности, назвав 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" }
Но и для такой схемы получение литерала для дефолтного языка при отсутствии перевода - актуально.