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

Ссылка скопирована
1 ответ

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

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

Мой вариант заключается в том, чтоб скачать эту таблицу в виде .csv, форматировать в .xlsx, и внутри .xlsx - добавить колонку DocTypeEn.

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

Но, дальше как быть, не совсем знаю, буду благодарен, если подскажите какой правильный подход выбрать.

Дополнительно:

Для этого в postgres есть SQL-команда ALTER TABLE ... ADD COLUMN ..., описанная в документации, например, тут: https://postgrespro.ru/docs/postgresql/16/sql-alte...

  • Но также нужно добавить сами переводы сразу же, через sql-script alter table add column - стоит ли так реализовывать?
  • laravel_creative_3103, ALTER TABLE меняет только описание таблицы. данные следует добавлять соответствующими командами: COPY, INSERT или UPDATE. в вашем случае, коль речь идёт об уже имеющихся строках, остаётся либо UPDATE (но мне непонятно, по каким ключевым полям его производить в вашем случае и есть ли вообще таковые в вашей таблице), либо очистка таблицы и её наполнение с нуля с помощью COPY или INSERT.
    лично мне кажется наиболее удобным в вашем случае очистить всю таблицу, добавить колонку с помощью 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
    Андрей PHP Ответ

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

    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);

    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');

    INSERT INTO translations (original_id, language_code, translated_text) VALUES (1, 'en', 'Hello World');

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

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно