Каким образом к существующей таблице можно добавить еще одну колонку для мультиязычности и добавить уже текст с переводом?
Условно, у меня имеется таблица, в которой есть колонка DocType. Задача заключается в том, чтобы добавить еще одну колонку для мультиязычности, назвав DocTypeEn, в котором будет перевод. Какой правильный подход можно применить к нему?
Мой вариант заключается в том, чтоб скачать эту таблицу в виде .csv, форматировать в .xlsx, и внутри .xlsx - добавить колонку DocTypeEn.
Но, дальше как быть, не совсем знаю, буду благодарен, если подскажите какой правильный подход выбрать.
Дополнительно:
Для этого в postgres есть SQL-команда ALTER TABLE ... ADD COLUMN ..., описанная в документации, например, тут: https://postgrespro.ru/docs/postgresql/16/sql-alte...
лично мне кажется наиболее удобным в вашем случае очистить всю таблицу, добавить колонку с помощью ALTER TABLE и залить в таблицу данные заново.
Ответы:
Задача заключается в том, чтобы добавить еще одну колонку для мультиязычности, назвав DocTypeEn, в котором будет перевод.
Ага... а потом захочется на немецкий, на китайский... так и будешь поля добавлять?
Классический подход - таблица текстовых литералов
CREATE TABLE translation ( token_id INT, -- идентификатор строки language_id INT, -- идентификатор языка PRIMARY KEY (token_id, language_id), value VARCHAR(100) NULL DEFAULT NULL ); |
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 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; |
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" } |
{ "ru":"Выход", "en":"Quit" }
Но и для такой схемы получение литерала для дефолтного языка при отсутствии перевода - актуально.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос


Для добавления колонки для мультиязычности к существующей таблице в базе данных вы можете выполнить следующие шаги:
1. Создайте новую таблицу, которая будет содержать переводы для каждой строки данных из существующей таблицы. Например, вы можете создать таблицу `translations` с полями `id`, `original_id`, `language_code` и `translated_text`.
2. Добавьте колонку `language_code` к существующей таблице, которая будет хранить информацию о языке для каждой строки данных.
3. Свяжите новую таблицу `translations` с существующей таблицей по полю `original_id`, чтобы каждая строка перевода была связана с соответствующей строкой данных из основной таблицы.
4. Для добавления текста с переводом на определенный язык, вы можете просто добавить запись в таблицу `translations` с указанием `original_id`, `language_code` и `translated_text`.
Пример SQL-запросов для создания новой таблицы и добавления колонки к существующей таблице:
CREATE TABLE translations ( id INT PRIMARY KEY AUTO_INCREMENT, original_id INT, language_code VARCHAR(2), translated_text TEXT ); ALTER TABLE existing_table ADD COLUMN language_code VARCHAR(2);
Пример SQL-запроса для добавления перевода на определенный язык:
INSERT INTO translations (original_id, language_code, translated_text) VALUES (1, 'en', 'Hello World');
Таким образом, вы сможете легко добавить функционал мультиязычности к вашей существующей таблице и хранить переводы для разных языков.