Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Сохранение текстов на разных языках в базе данных

2187  1 2 3 4 5 6 все
AlexNek патриот13.11.21 13:02
AlexNek
NEW 13.11.21 13:02 

Есть какая то база, в ней ней есть таблицы с полями текста, допустим название города. База отображается через приложение которое имеет выбор языка отображения. Хотя бы нем. и англ.

Выбрал пользователь en показываем Cologne, выбрал de, показываем Köln.

Типа так: https://en.wikipedia.org/wiki/Cologne ,только данные вводит администратор и разных таблиц будет много.

Вариантов имплементации много, что вам больше нравится?

#1 
AlexNek патриот13.11.21 13:03
AlexNek
NEW 13.11.21 13:03 
в ответ AlexNek 13.11.21 13:02, Последний раз изменено 13.11.21 19:57 (AlexNek)

Предложенные варианты:

1. Использовать динамический перевод от гугла.

2. Упаковать в одно поле все языки

3. Использовать паралельные языковые таблицы, где только перевод полей, для каждой таблицы

4. Использовать дополнительное поле для каждого языка в одной таблице CityId, CityNameEn, CityNameRu, CityNameDe, ZIP

5. Глобальное хранилище переводов - "id-язык-перевод" + кэш

#2 
Срыв покровов патриот13.11.21 13:05
NEW 13.11.21 13:05 
в ответ AlexNek 13.11.21 13:02

а вопрос-то в чем?

#3 
AlexNek патриот13.11.21 13:10
AlexNek
NEW 13.11.21 13:10 
в ответ Срыв покровов 13.11.21 13:05

Ваш вариант решения.

#4 
uscheswoi_82 старожил13.11.21 13:37
NEW 13.11.21 13:37 
в ответ AlexNek 13.11.21 13:10, Последний раз изменено 13.11.21 13:42 (uscheswoi_82)
Ваш вариант решения.

Так?

Таблица City:

CityID, LangID, Description


Таблицая Language:

LangID, Description


Дальше:

SELECT c.Description FROM City AS c INNER JOIN Language AS l ON c.LangID l.LangID WHERE LangID = .. AND CityID = ...


Например:

Language:

LangID Dscription

1 Русский

2 English


City:

CItyID LangID Description

1 1 Москва

1 2 Moscow


SELECT c.Description FROM City AS c INNER JOIN Language AS l ON c.LangID l.LangID WHERE LangID=1 AND CityID=1

Результат:

Description

Москва


SELECT c.Description FROM City AS c INNER JOIN Language AS l ON c.LangID l.LangID WHERE LangID=2 AND CityID=1

Результат:

Description

Moscow

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#5 
AlexNek патриот13.11.21 14:04
AlexNek
NEW 13.11.21 14:04 
в ответ uscheswoi_82 13.11.21 13:37

Ну а теперь представим что у нас хотя бы две таблицы: города и улицы.

Добили Москва и Садовая и сказали что эта улица в Москве для ru.

Что делаем для других языков? Подобных таблиц и связей довольно много.


#6 
alex445 старожил13.11.21 14:09
NEW 13.11.21 14:09 
в ответ AlexNek 13.11.21 14:04, Последний раз изменено 13.11.21 14:13 (alex445)

Сохраняйте название в таблице связей. Отношение * to *.


LangId

LangName


CityId

CityName (например, английское название, или можно вообще выкинуть это поле, т.к. оно будет в таблице связей)


Таблица связей

CityId

LangId

CityName

#7 
Murr патриот13.11.21 14:24
Murr
NEW 13.11.21 14:24 
в ответ AlexNek 13.11.21 14:04

Что делаем для других языков?

-----

Пишем, укзывая язык.

Еще нужен "язык по умолчанию" - то, что подставится если нет записи на нужном языке.


Подобных таблиц и связей довольно много.

-----

И?

Работы - да, много...


Если хочешь вариант - делаешь ресурсные дллки под языки и работаешь с ними в ручном режиме...

Меньше работы не будет.

#8 
uscheswoi_82 старожил13.11.21 14:28
13.11.21 14:28 
в ответ AlexNek 13.11.21 14:04
Добили Москва и Садовая и сказали что эта улица в Москве для ru.Что делаем для других языков?

Когда я делал портал по недвижимости, то я в каждую таблицу вставлял поле langid. Если у вас не App и не десктопное приложение, а веб приложение, то можно заставить гугл переводить - см. https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/translate. Если поле "улица" не используется для поиска, то ИМХО можно использовать шаблон, использовать разделительные знаки типа |, или сериализовать даже целый объект.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#9 
uscheswoi_82 старожил13.11.21 14:37
NEW 13.11.21 14:37 
в ответ uscheswoi_82 13.11.21 14:28, Последний раз изменено 13.11.21 14:43 (uscheswoi_82)

Пример как использовать разделительные знаки типа |:

Садовая|Sadovaya|Sadowaia, а дальше сплитуете см - https://docs.microsoft.com/ru-ru/dotnet/api/system.string.split?view=net-5.0


Пример как сериализовать целый объект:

[Serializable]
class Street {
  public Int32 StreetID { get; set; }
  public String Description { get; set; }
  public Street(Int32 StreetID, String Description) {
    this.StreetID = StreetID;
    this.Description = Description;
  }
}

Street s = new Street(1, "Садовая|Sadovaya|Sadowaia");

Дальше читатет тут https://www.c-sharpcorner.com/UploadFile/a5470d/using-xml-serialization-with-C-Sharp-and-sql-server/


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#10 
alex445 старожил13.11.21 15:11
NEW 13.11.21 15:11 
в ответ uscheswoi_82 13.11.21 14:37, Последний раз изменено 13.11.21 15:17 (alex445)
Пример как использовать разделительные знаки типа |:

Садовая|Sadovaya|Sadowaia, а дальше сплитуете

Я про то же спрашивал недавно, когда говорил, как организовать мультилокальность в ресурсных файлах. Сплитить одну строку условными разделителями, писать одну запись несколько раз с разными языками (CityNameEn, CityNameDe, CityNameRu), заводить полноценные отдельные файлы под каждую локаль. Остановился на полноценных отдельных файлах, т.к. оптимальное решение между сильно зажатым вариантом с разделителями (уже не расширишь никак на добавочные требования или поля) и слишком гибким (и сложным) вариантом типа полноценной БД.


У ТС вариантов нет - только БД. На один язык приходится много городов. Один город может быть назван на многих языках. Название конкретного города на конкретном языке - уникальная запись. Вывод - для этого больше подойдёт поле в junction table между таблицами города и языка. И так для каждой связи "сущность - язык": "улица - язык", "город - язык" и т.д.

#11 
AlexNek патриот13.11.21 16:03
AlexNek
NEW 13.11.21 16:03 
в ответ alex445 13.11.21 14:09

Ну так это для одной таблицы, а хотя бы для двух и больше? На каждую свою языковую копию делать? И все текстовые поля туда?

#12 
AlexNek патриот13.11.21 16:05
AlexNek
NEW 13.11.21 16:05 
в ответ Murr 13.11.21 14:24
Пишем, указывая язык.

Куда? и где будет перевод?


делаешь ресурсные дллки под языки

Каким образом из данных в базе получать постоянно длл-ки?

#13 
alex445 старожил13.11.21 16:08
NEW 13.11.21 16:08 
в ответ AlexNek 13.11.21 16:03, Последний раз изменено 13.11.21 16:16 (alex445)
Ну так это для одной таблицы, а хотя бы для двух и больше? На каждую свою языковую копию делать? И все текстовые поля туда?

Не понял. Приведите пример. Я написал выше такой вариант. Дополню ещё полями и второй таблицей, чтобы было понятнее:


LangId

LangName


CityId

ZIP

Population


CityId

LangId

CityName

AnotherLocalizedCityData


StreetId

FoundationYear

Lang


StreetId

LangId

StreetName

AnotherLocalizedStreetData


Сколько сущностей требуют мультилокальность, столько и таблиц связей. В пределе можно вообще отказаться от отдельной таблицы городов или улиц, если известно, что в них только данные, требующие мультилокальность - т.е. данных типа почтового кода или населения нет. Но обычно это заранее неизвестно или таки такие данные есть, поэтому более гибко будет всё равно завести по отдельной таблице.

#14 
AlexNek патриот13.11.21 16:09
AlexNek
NEW 13.11.21 16:09 
в ответ uscheswoi_82 13.11.21 14:28
то можно заставить гугл переводить

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

#15 
AlexNek патриот13.11.21 16:11
AlexNek
NEW 13.11.21 16:11 
в ответ alex445 13.11.21 15:11
Один город может быть назван на многих языках

город и улица были взяты в качестве понятного примера

#16 
alex445 старожил13.11.21 16:13
NEW 13.11.21 16:13 
в ответ AlexNek 13.11.21 16:11, Последний раз изменено 13.11.21 16:13 (alex445)

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

#17 
AlexNek патриот13.11.21 16:15
AlexNek
NEW 13.11.21 16:15 
в ответ uscheswoi_82 13.11.21 14:37
использовать разделительные знаки

Редактирование выливается в приятный сюрприз

#18 
BSDLamer Хвостатый Carpal Tunnel13.11.21 16:15
BSDLamer
NEW 13.11.21 16:15 
в ответ AlexNek 13.11.21 16:09
И еще непонятно как быть с большим количество запросов?

если это веб, то можно подумать об использовании CDN

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#19 
alex445 старожил13.11.21 16:21
NEW 13.11.21 16:21 
в ответ AlexNek 13.11.21 16:03, Последний раз изменено 13.11.21 16:22 (alex445)
Ну так это для одной таблицы, а хотя бы для двух и больше? На каждую свою языковую копию делать? И все текстовые поля туда?

Именно так. Следующий уровень упрощения - вместо таблиц с локализацией делать поля с локализацией


CityId

CityNameEn

CityNameRu

CityNameDe

ZIP

Population


Минус - при добавлении новой локали нужно обновить приложение (обычно требуется обновление ORM). В варианте с отдельными заранее созданными таблицами связей - не нужно.

#20 
1 2 3 4 5 6 все