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

Каким образом можно эффективно добавить столбец, содержащий перевод значений из столбца "DocType" на английский язык, и назвать его "DocTypeEn"?
  • 1 апреля 2024 г. 4:39
Ответы на вопрос 2
Для добавления новой колонки в таблицу для размещения текста на нескольких языках, вам сначала необходимо выполнить следующие шаги:

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" на английский язык.
<blockquote>Задача заключается в том, чтобы добавить еще одну колонку для мультиязычности, назвав DocTypeEn, в котором будет перевод. </blockquote> <br/> <br/> Ага... а потом захочется на немецкий, на китайский... так и будешь поля добавлять? <br/> <br/> Классический подход - таблица текстовых литералов <br/> <br/> <pre><code class="sql">CREATE TABLE translation (
    token_id INT,      -- идентификатор строки
    language_id INT,   -- идентификатор языка
    PRIMARY KEY (token_id, language_id),
    value VARCHAR(100) NULL DEFAULT NULL
    );</code></pre> <br/> <br/> Соответственно зная номер строки, который нужен, и язык, получаем значение <br/> <pre><code class="sql">SELECT value
FROM translation
JOIN language USING (language_id)
WHERE token_id = @token_id
  AND language_name = @language_name;</code></pre> <br/> Впрочем, обычное состояние - это когда не все строки переведены. Тогда используется <br/> <pre><code class="sql">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;</code></pre> <br/> То есть для литералов. имеющих перевод, возвращаются именно они, а для ещё не имеющих - значение на языке по умолчанию. <br/> <br/> ============ <br/> <br/> С другой стороны, вывод сообщений на экран - это интерактивное взаимодействие, где начхать на производительность. А коли так, то сообщения можно хранить в одном поле в виде JSON объекта, типа <br/> <pre><code>{
    "ru":"Выход",
    "en":"Quit"
}</code></pre> <br/> Но и для такой схемы получение литерала для дефолтного языка при отсутствии перевода - актуально.
Похожие вопросы