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

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

2187  1 2 3 4 5 6 все
AlexNek патриот13.11.21 13:02
AlexNek
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
NEW 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 
AlexNek патриот13.11.21 16:30
AlexNek
NEW 13.11.21 16:30 
в ответ alex445 13.11.21 16:08

Ну именно так как и и сказал

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

Примерно так. Только связь между городом (улицей) и таблицей связей 1-*.

#22 
AlexNek патриот13.11.21 16:39
AlexNek
NEW 13.11.21 16:39 
в ответ alex445 13.11.21 16:13
какую на самом деле задачу решаете.

Есть/проектируется какая то база данных, ну например, поставщики товаров с адресами и товарами.

Таблиц и связей достаточно, уж точно больше десяти.


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

Интересно обсудить варианты решения, найти + и -.

#23 
AlexNek патриот13.11.21 16:43
AlexNek
NEW 13.11.21 16:43 
в ответ BSDLamer 13.11.21 16:15
можно подумать об использовании CDN
Ну это уже другая проблема, но не думаю что гугл переводчик будет справляться с большим потоком переводов
#24 
alex445 старожил13.11.21 16:43
NEW 13.11.21 16:43 
в ответ alex445 13.11.21 16:32, Последний раз изменено 13.11.21 16:45 (alex445)
Примерно так. Только связь между городом (улицей) и таблицей связей 1-*.

Или, если я правильно понимаю, если в таблице связей ключ будет составной (из двух айдишников - города и языка, например), то связь между городом и таблицей связей можно сделать 1-1?

#25 
alex445 старожил13.11.21 16:44
NEW 13.11.21 16:44 
в ответ AlexNek 13.11.21 16:39

Есть/проектируется какая то база данных, ну например, поставщики товаров с адресами и товарами.

Таблиц и связей достаточно, уж точно больше десяти.


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

Интересно обсудить варианты решения, найти + и -.

Т.е. задача идентична городам и улицам. Решение предлагается то же.

#26 
AlexNek патриот13.11.21 16:50
AlexNek
NEW 13.11.21 16:50 
в ответ alex445 13.11.21 16:44
Т.е. задача идентична городам и улицам

Исключая того, что городов и улиц в базе может не быть вообще.

И не обязательно база реляционная и не обязательно только одна спок

#27 
alex445 старожил13.11.21 16:52
NEW 13.11.21 16:52 
в ответ AlexNek 13.11.21 16:30

По-моему, лучше всё же добавить в таблицу связей отдельный суррогатный ключ, и сделать связи City 1 - * CityLang * - 1 Lang. Но я в базах данных не настолько силён. Как там будет обрабатываться составной ключ, если удалить или обновить, скажем, запись в таблице языков. Одни говорят, что это медленнее, чем когда есть отдельный простой суррогатный ключ для записи, а не составной из айдишников связанных записей. Другие говорят, что дополнительный суррогатный ключ не нужен. Хотя его наличие ничего особо не усложняет и места силно не занимает.

#28 
alex445 старожил13.11.21 16:58
NEW 13.11.21 16:58 
в ответ AlexNek 13.11.21 16:50

Исключая того, что городов и улиц в базе может не быть вообще.

И не обязательно база реляционная и не обязательно только одна

Я не очень понимаю "нереляционная база данных". Это та, в которой нет связей между таблицами на уровне модели БД - т.е. вы их просто не заводите? Или это та, где сами данные не связаны по сути? Если данные всё же связаны по сути, а вы им связи в БД не делаете, то значит, вы должны их всё равно связать где-то в другом месте.


Как предлагал Мурр, вы можете локализованные данные хранить хоть в ДЛЛках, хоть в ресурсных файлах (как у меня). Но всё равно где-то должны будете прописать, что этот файл относится к такой-то локали и в нём лежит строка, хранящая имя города, например. Т.е. в той же БД создать таблицу, где всё это указать. Т.е. не вижу смысла выходить за рамки относительной БД, если отношения между сущностями в реальном мире так и так есть. Разве что кто-то раньше уже написал всё это именно в нереляционном стиле, а теперь нужно прикрутить локализацию. Ну значит, придётся городить реляционный костыль, покрывая нереляционные данные.

#29 
BSDLamer Хвостатый Carpal Tunnel13.11.21 17:24
BSDLamer
NEW 13.11.21 17:24 
в ответ AlexNek 13.11.21 16:43

CDN нужен чтоб бросать уже переведенный ресурс в кэш и этим самым разгрузить бэкенд

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#30 
MrSanders коренной житель13.11.21 18:56
NEW 13.11.21 18:56 
в ответ AlexNek 13.11.21 16:50

Исключая того, что городов и улиц в базе может не быть вообще.

И не обязательно база реляционная и не обязательно только одна спок

Крысота. Сначала спросить как решить проблему постройки велосипеда, а потом жаловаться что найденное решение не работает для строительства нефтеналивного причала.

Что надо-то? id-язык-перевод куда-то запихни. Хошь ресурсы, хошь РБД, хошь NoSQL, хошь через REST доступ к данным в CDN делай. Но ни в коем разе не записи для каждого языка "City_EN, City_DE" или лепить несколько переводов в одну запись "Köln|Cologne".

#31 
alex445 старожил13.11.21 18:59
NEW 13.11.21 18:59 
в ответ MrSanders 13.11.21 18:56, Последний раз изменено 13.11.21 19:00 (alex445)
Но ни в коем разе не записи для каждого языка "City_EN, City_DE" или лепить несколько переводов в одну запись "Köln|Cologne".

Почему? Очень быстрое и простое решение. Может, там большего и не требуется.


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

#32 
MrSanders коренной житель13.11.21 19:27
NEW 13.11.21 19:27 
в ответ alex445 13.11.21 18:59
Почему? Очень быстрое и простое решение. Может, там большего и не требуется.

Такое решение вообще существовать не должно. Только в скриптике, написанном за 15 минут и через 2 дня забытом.

Медленное, хрупкое, плохо скалируется.

то уверен, что подобные бы превалировали с большим отрывом.

Не сомневаюсь. "95% людей - идиоты"

#33 
AlexNek патриот13.11.21 19:54
AlexNek
NEW 13.11.21 19:54 
в ответ MrSanders 13.11.21 18:56
а потом жаловаться

Нормальный концепт должен это пережить.


id-язык-перевод куда-то запихни

ну так предложений уже сколько было.

Я так понимаю некий глобальный ресурс? А как потом редактировать запись в таблице, через посредника?

#34 
uscheswoi_82 старожил13.11.21 20:16
NEW 13.11.21 20:16 
в ответ AlexNek 13.11.21 16:09
И с задержкой перевода, страницу ведь можно показать только после полного перевода всего что там есть.

Вообще база данных нужна в основном для поиска. Я бы перевод хранил бы в XML или в JSON формате. Когда буду делать один проект, всё будет храниться в формате HTML или в формате JSON.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#35 
alex445 старожил13.11.21 20:37
NEW 13.11.21 20:37 
в ответ uscheswoi_82 13.11.21 20:16

Если не писать дурацких запросов с условиями, где вытаскиваются длинные строковые поля, что-то там сравнивается, сплитится, мерджится, а тупо по айдишникам и связям, то всё будет работать быстро и чётко. А всякие интероперабилити с подгрузом ДЛЛек, открытием файлов, чтением их и прочая муть сожрёт всю производительность. Толкай всё в БД и не думай, если объёмы не сверхбольшие.

#36 
AlexNek патриот13.11.21 20:44
AlexNek
NEW 13.11.21 20:44 
в ответ uscheswoi_82 13.11.21 20:16
Я бы перевод хранил бы в XML

И как он интересно тута попадёт?

#37 
MrSanders коренной житель13.11.21 21:04
NEW 13.11.21 21:04 
в ответ AlexNek 13.11.21 19:54
Я так понимаю некий глобальный ресурс? А как потом редактировать запись в таблице, через посредника?

Да кто ж тебя знает. Куда надо. Что ты делаешь-то? Может тебе надо десктопное приложение, способное работать в оффлайне. Тогда отдельная ДБ и доступ к онлайн ресурсам слегка затруднён. А может клиент-сервер? Тогда ДБ хорошее решение. А может веб-приложение доступное по всему миру? CDN в руки. Редактировать часто будем? Да - скорее БД. Нет - скорее CDN/ресурсы. Объём данных? Большой - БД/CDN. Маленький - ресурсы. Крохотный - да хоть в код влепи.

#38 
AlexNek патриот13.11.21 21:41
AlexNek
NEW 13.11.21 21:41 
в ответ MrSanders 13.11.21 21:04
Может тебе надо десктопное приложение,

Десктоп видимо уже не попадется...

#39 
uscheswoi_82 старожил13.11.21 21:48
NEW 13.11.21 21:48 
в ответ AlexNek 13.11.21 20:44
И как он интересно тута попадёт?

Так-же как и в БД. Только XML это устаревший вариант, сейчас модно JSON. Пример:

index.html:

<!DOCTYPE html>
<head>
<title>Test</title>
<script>
  var lang = 'ru';
  window.onload = () => {
    fetch('demo.json').then(response => response.json()).then(data => { 
      let json_items = JSON.parse(JSON.stringify(data)); 
      let el = document.getElementById('city');
      for(let index=0; index<json_items.cities.length; index++) {
        let new_el = document.createElement('option');
        new_el.setAttribute('value', json_items.cities[index].id);
        new_el.innerHTML = json_items.cities[index][lang];
        el.appendChild(new_el);
      }
    });
  }
</script>
</head>
<body>
  <select id="city">
  </select>
</body>


demo.json:

{"cities":
  [
  {"id":1, "ru":"Moskva", "de":"Moskau", "en": "Moscow"},
  {"id":2, "ru":"Keln", "de":"Köln", "en":"Cologn"}
  ]
}


Результат см. https://i.ibb.co/LQkd6QJ/json-demos-result-min.jpg


Вообще если использовать NOSQL то проблема решается в два счёта. См.:

https://i.ibb.co/Kyz0zG5/mongo0-min.jpg

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#40 
AlexNek патриот13.11.21 22:11
AlexNek
NEW 13.11.21 22:11 
в ответ uscheswoi_82 13.11.21 21:48
Пример

немного странновато, клиент читает локальный файл.

А как записывать то? Да и еще с другого компа? И любое изменение заставляет переписывать/перечитывать весь файл полностью

#41 
uscheswoi_82 старожил13.11.21 22:22
NEW 13.11.21 22:22 
в ответ AlexNek 13.11.21 22:11, Последний раз изменено 13.11.21 22:24 (uscheswoi_82)
А как записывать то?

Пример (Backend):

using System;
using System.IO;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            File.AppendAllText("testappend.html", "Предпоследняя строчка
\n");
            File.AppendAllText("testappend.html", "Последняя строчка
\n");
        }
    }
}


немного странновато, клиент читает локальный файл.

Обращается http:///.../testappend.html и видит в браузере:

Предпоследняя строчка Последняя строчка
Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#42 
AlexNek патриот13.11.21 22:38
AlexNek
NEW 13.11.21 22:38 
в ответ uscheswoi_82 13.11.21 22:22

А где же XML или Json? И что делать если два человека что то редактируют? И как изменить москва в какой-то неизвестной строке? А если весь файл в память не помещается?

#43 
BSDLamer Хвостатый Carpal Tunnel13.11.21 22:49
BSDLamer
NEW 13.11.21 22:49 
в ответ AlexNek 13.11.21 22:38

не имея полностью сформулированой задачи, все что мы тут можем делать это cargo cult software engineering

0001, 0010, 0011, 0100, 0101, вышел зайчег погулядь
#44 
  max2_2000 завсегдатай13.11.21 22:57
NEW 13.11.21 22:57 
в ответ AlexNek 13.11.21 13:02
Вариантов имплементации много, что вам больше нравится?

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

#45 
uscheswoi_82 старожил13.11.21 23:50
NEW 13.11.21 23:50 
в ответ AlexNek 13.11.21 22:38
А где же XML или Json? И что делать если два человека что то редактируют? И как изменить москва в какой-то неизвестной строке? А если весь файл в память не помещается?

Я безпонятия о чём речь честно говоря. В своём будущем проекте immobilien portal я буду использовать статические JSON и HTML.


Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#46 
uscheswoi_82 старожил14.11.21 01:45
NEW 14.11.21 01:45 
в ответ uscheswoi_82 13.11.21 23:50, Последний раз изменено 14.11.21 02:17 (uscheswoi_82)

Так бы примерно бы делал бы:


using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

namespace Backend {
    class Program {
        private static String Replace(String strTemplate, Dictionary<String, String> dicData) {
            StringBuilder stbData = new StringBuilder(strTemplate);
            foreach (KeyValuePair<String, String> item in dicData)
                stbData.Replace(item.Key, item.Value);

            return stbData.ToString(); 
        }


        private static void Generate(String strTemplateFile, String strTemplateExpose, 
            Dictionary<String, String> dicExposeItems, Dictionary<String, String> dicTemplateItems, String strOutput) {
            String strPath_expose = Directory.GetCurrentDirectory() + strTemplateExpose;
            String strPath_template = Directory.GetCurrentDirectory() + strTemplateFile;
            String strPath_output_html = Directory.GetCurrentDirectory() + strOutput;
            String strBuffer = File.ReadAllText(strPath_expose, Encoding.UTF8);
            String strBuffer2 = File.ReadAllText(strPath_template, Encoding.UTF8);
            dicTemplateItems.Remove("{content}");
            dicTemplateItems.Add("{content}", Replace(strBuffer, dicExposeItems));


            File.WriteAllText(strPath_output_html, Replace(strBuffer2, dicTemplateItems),
            Encoding.UTF8);
        }


        static void Main(string[] args) {
            String strLang = "en-us";
            String strNow = DateTime.Now.ToString();


            Dictionary<String, String> dicExposeItems = new Dictionary<string, string>();
            dicExposeItems.Add("{InseratID}", "1");
            dicExposeItems.Add("{CreateDate}", strNow);
            dicExposeItems.Add("{Title}", "House, 3 rooms");
            dicExposeItems.Add("{CntRooms}", "3");
            dicExposeItems.Add("{Description}", "House, 3 rooms");
            dicExposeItems.Add("{Square}", "70");


            Dictionary<String, String> dicTemplateItems = new Dictionary<string, string>();
            dicTemplateItems.Add("{lang}", "en");
            dicTemplateItems.Add("{title}", "House, 3 rooms");
            Generate(String.Format(@"\template.{0}.xml", strLang), String.Format(@"\expose.{0}.xml", strLang), 
            dicExposeItems, dicTemplateItems, String.Format(@"\demo.{0}.html", strLang));


            strLang = "ru-ru";
            dicTemplateItems.Remove("{lang}");
            dicTemplateItems.Add("{lang}", strLang.Substring(0, 2));
            Generate(String.Format(@"\template.{0}.xml", strLang), String.Format(@"\expose.{0}.xml", strLang), 
            dicExposeItems, dicTemplateItems, String.Format(@"\demo.{0}.html", strLang));


            strLang = "de-de";
            dicTemplateItems.Remove("{lang}");
            dicTemplateItems.Add("{lang}", strLang.Substring(0, 2));
            Generate(String.Format(@"\template.{0}.xml", strLang), String.Format(@"\expose.{0}.xml", strLang), 
            dicExposeItems, dicTemplateItems, String.Format(@"\demo.{0}.html", strLang));
        }
    }
}


Результат см.:https://i.ibb.co/Z1stvX4/r-min.jpg

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#47 
Murr патриот14.11.21 01:48
Murr
NEW 14.11.21 01:48 
в ответ AlexNek 13.11.21 16:05

Куда?

------

Да туда же - в таблицу - языковый ключ же .в наличии.

Ну или извратный вариант - делаешь базы по количеству языков.


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

-----

ВСе, больше не наливаем... смущ

#48 
Murr патриот14.11.21 01:52
Murr
NEW 14.11.21 01:52 
в ответ AlexNek 13.11.21 16:43

не думаю что гугл переводчик будет справляться

------

КЕШИРуй в своей базе.

ТОЛьКО не забудь глюки транслятора фихать...

#49 
Murr патриот14.11.21 02:03
Murr
NEW 14.11.21 02:03 
в ответ AlexNek 13.11.21 19:54

Я так понимаю некий глобальный ресурс?

-----

Да нет - чисто твой выбор способа хранения.


А как потом редактировать запись в таблице

------

А это тебя сейчас не должно волновать...

Ввел на одном - получил перевод на каждый из заданых языков - пихнул в хранилище...

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

#50 
alex445 старожил14.11.21 08:46
NEW 14.11.21 08:46 
в ответ uscheswoi_82 13.11.21 21:48
demo.json:

С таким же успехом можно и в ресурсах проекта хранить, типа ResourceDictionary в Дотнете. Или вам нужно обязательно ещё сериализовать и передать по сети?

#51 
alex445 старожил14.11.21 08:47
NEW 14.11.21 08:47 
в ответ AlexNek 13.11.21 22:38
А где же XML или Json? И что делать если два человека что то редактируют? И как изменить москва в какой-то неизвестной строке? А если весь файл в память не помещается?

Семь бед - БД ответ.

#52 
alex445 старожил14.11.21 10:31
NEW 14.11.21 10:31 
в ответ uscheswoi_82 13.11.21 23:50

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

#53 
uscheswoi_82 старожил14.11.21 14:04
NEW 14.11.21 14:04 
в ответ alex445 14.11.21 10:31

И сам делал, и пытался готовую систему авторизации использовать -допустим как во фреймворке Kohana. Сам каптчу делал.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#54 
schizo коренной житель14.11.21 14:14
schizo
NEW 14.11.21 14:14 
в ответ AlexNek 13.11.21 13:02

https://medium.com/walkin/database-internationalization-i1...


например. текст - это ещё небольшая проблема

Храни Вас Г-дь!
#55 
virtax старожил14.11.21 14:41
virtax
NEW 14.11.21 14:41 
в ответ AlexNek 13.11.21 13:02

Загнать все тексты и переводы в уникодный txt, сделать zip/7z и в программе просто считывать из архивного файла нужный текст по связке id-страна & id-(текстовое поле).

Доп. плюс - всегда легко и быстро можно отредактировать базу или дополнить ее новыми языками.

Можно даже маленькую программку для управления такой базой "на коленке" написать.

#56 
alex445 старожил14.11.21 15:16
NEW 14.11.21 15:16 
в ответ schizo 14.11.21 14:14, Последний раз изменено 14.11.21 15:17 (alex445)
https://medium.com/walkin/database-internationalization-i1...


например. текст - это ещё небольшая проблема

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


А даты и прочее обычно форматируются из коробки (в правильном фреймворке) по выбранной культуре.

#57 
  max2_2000 завсегдатай14.11.21 17:35
NEW 14.11.21 17:35 
в ответ AlexNek 13.11.21 13:02, Последний раз изменено 14.11.21 18:24 (max2_2000)

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

если же исходить из того, что задача полностью определена в заглавии (Сохранение текстов на разных языках в базе данных), то три таблицы напрашиваются:


create table language (id int(11) not null, language varchar(20) not null, symbol varchar(10));

create table text (id int(11) not null, text text not null);

create table translation (id int(11) not null, text_id int(11), lang_id int(11), translation text)


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

#58 
Murr патриот14.11.21 18:54
Murr
NEW 14.11.21 18:54 
в ответ max2_2000 14.11.21 17:35

По предлагаемой схеме тебе надо будет писать два разных метода получения текста - один для оригинального, другой для перевода.

При этом язык оригинального текста - неопределен.


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

#59 
alex445 старожил14.11.21 19:23
NEW 14.11.21 19:23 
в ответ Murr 14.11.21 18:54, Последний раз изменено 14.11.21 19:26 (alex445)

Текущая культура в Дотнете хранится в CultureInfo. Дефолтная - под которой запущено приложение. Если это сайт на сервере - культура на сервере. Надо клиентскую - спрашиваешь в браузере у клиента какая или берёшь из настроек текущей сессии клиента. Кодировки культур имеют известный формат. Из приложения получаешь кодировку и сущность, которую нужно перевести. Далее что там у нас, EntityFramework? Тогда что-то типа


Lang.LangCityTranslations.Where(t => t.LangId == ... && t.CityId == ...).FirstOrDefault()


и далее вытаскиваешь нужное для перевода свойство.

#60 
  max2_2000 завсегдатай14.11.21 20:21
NEW 14.11.21 20:21 
в ответ Murr 14.11.21 18:54
По предлагаемой схеме тебе надо будет писать два разных метода получения текста - один для оригинального, другой для перевода.

нет никакого "оригинального", если вы его искусственно не создали. просто текст-ключ. например, "жопа". выдаем запрос таблице text получить id слова жопа, таблице language - запрос на id языка XY, и уже с этими двумя идями обращаемся в таблицу translate за текстом "жопа" на нужном языке.

При этом язык оригинального текста - неопределен.

что такое "оригинальный текст"?

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

ну да, это - самый главный вопрос... подумайте, как решить, может, что придумаете ...

#61 
  max2_2000 завсегдатай14.11.21 20:22
NEW 14.11.21 20:22 
в ответ alex445 14.11.21 19:23
Текущая культура в Дотнете хранится в CultureInfo.

откуда появился дотнет и прочее? кто сказал, что здесь вообще присутствует дотнет или иное? вопрос: как сохранить тексты на разных языках в базе данных. "остальное - от лукавого" (с)

#62 
Murr патриот14.11.21 22:57
Murr
NEW 14.11.21 22:57 
в ответ max2_2000 14.11.21 20:21

просто текст-ключ.

-----

Заметь - это не Я написал.

При этом Я как-то не увидел на каком языке текст...


обращаемся в таблицу translate

-----

Что именно требует обращаться в эту таблицу?

Каков будет результат для заданого исходного с языком "русский"?


что такое "оригинальный текст"?

-----

Нннннну скажем что это текст для которого нет информации об языке.


подумайте, как решить

-----

Пару варианнннтов Я когда-то делал...

#63 
alex445 старожил14.11.21 23:42
NEW 14.11.21 23:42 
в ответ max2_2000 14.11.21 20:22, Последний раз изменено 14.11.21 23:55 (alex445)

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

#64 
alex445 старожил14.11.21 23:54
NEW 14.11.21 23:54 
в ответ Murr 14.11.21 22:57, Последний раз изменено 14.11.21 23:56 (alex445)

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


Я последние свои проекты - пару сайтов и WPF-приложение - сделал все с поддержкой локализации. И сейчас игру на Юнити делаю по тому же шаблону. Только я не в БД всё запихал, а в словари ресурсов, но суть от этого не меняется.

#65 
alex445 старожил27.11.21 20:02
NEW 27.11.21 20:02 
в ответ alex445 14.11.21 23:54, Последний раз изменено 27.11.21 20:47 (alex445)

Всплыл недостаток сохранения локализованных данных в файлах resx. resx генерит в выходную директорию папки с названиями локалей и в каждой DLL с одним и тем же именем. Если я хочу импортировать эти DLL в, скажем, Юнити, то возникает ошибка - туда можно импортировать только одну DLL с тем же именем, при этом неважно, что они в разных директориях находятся. Придётся либо отказаться от хранения локалей, как это требуется для resx, либо придумать своё хранилище.


Самый простой вариант обойти это - отказаться от схемы "отдельный файл на локаль" и встроить обозначение локали в имя ресурса - типа "PersonName_en_US". А вытаскиваться ресурс через символы подстановки - типа


resourceManager.GetString($"PersonName_{locale}");


Но если ресурсы уже сохранены с прежней схемой, то куча работы по переписыванию - ручному или программному. Ну и теперь ломается схема работы с локалями самого класса ResourceManager.


Ещё как вариант - создать по сборке на каждую локаль и передавать в конструктор ResourceManager сборку текущей выбранной локали. Проблема только в том, что придётся отдельный проект для каждой такой локали делать, чтобы каждый проект свою DLL выпускал.

#66 
Murr патриот27.11.21 23:49
Murr
NEW 27.11.21 23:49 
в ответ alex445 27.11.21 20:02

Из вышенаписанного на сделать вывод, что... мыши кололись и продолжали жрать кактус...

Блин, есть СТАНДАРТНОЕ решение для локализуемых ресурсов, но ознакомится и применять мешает установка что все нужное уже изучено...спок

#67 
alex445 старожил28.11.21 01:19
NEW 28.11.21 01:19 
в ответ Murr 27.11.21 23:49

Какое стандартное?

#68 
Murr патриот28.11.21 01:42
Murr
NEW 28.11.21 01:42 
в ответ alex445 28.11.21 01:19

Читай в МСДНе.

#69 
alex445 старожил28.11.21 02:02
NEW 28.11.21 02:02 
в ответ Murr 28.11.21 01:42, Последний раз изменено 28.11.21 02:04 (alex445)

В МСДНе везде про resx файлы говорится и класс ResourceManager

Globalize and localize .NET applications | Microsoft Docs


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

#70 
Murr патриот28.11.21 02:14
Murr
NEW 28.11.21 02:14 
в ответ alex445 28.11.21 02:02

Указанное - менее 1% от того что надо знать по локализации.

Начать рекомендую с типов ресурсов - тогда будет понятнее как пользуются ресурсные дллки.

#71 
alex445 старожил28.11.21 03:06
NEW 28.11.21 03:06 
в ответ Murr 28.11.21 02:14, Последний раз изменено 28.11.21 03:07 (alex445)

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


Я импортирую в Юнити ДЛЛки. Юнити пишет, что не должно быть ДЛЛек с одним именем, неважно, как они раскиданы по директориям - Юнити нашёл в разных директориях одинаковые по имени ДЛЛки и не даёт их импортировать. Всё. Диапазон решений - либо одна ДЛЛ, либо много с разными именами, либо вообще другой подход, типа текстовых файлов (txt, xml, json, etc.).

#72 
Murr патриот28.11.21 04:37
Murr
NEW 28.11.21 04:37 
в ответ alex445 28.11.21 03:06

...изучение...

-----

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

Вот Я тебя и отсылаю к документации - читать, разбираться и получать навык эффективной работы с доками.

Ты либо научишься учится, либо будет как сейчас.


А задачи - задачи надо решать быстро.

А для возможности решать быстро - надо дохрена и больше знать.

Ну а чтобы знать - надо ... учится. Много и постоянно.

Тут - без вариантов.


Не дает их импортировать

-----

А должен?

Читай доку на предмет типов ресурсов.

Потом будешь изучать как управлять (если стандарта не хватит) загрузкой и что надо для связывания ресов.

#73 
alex445 старожил28.11.21 09:58
NEW 28.11.21 09:58 
в ответ Murr 28.11.21 04:37

Такие общие советы вообще не нужны. Делай хорошо и не делай плохо, учись и не неучись - это не советы.

#74 
alex445 старожил28.11.21 10:13
NEW 28.11.21 10:13 
в ответ alex445 28.11.21 09:58

Эй, кто мне минусы лепит? Лучше ответ дайте. ))

#75 
Murr патриот28.11.21 13:49
Murr
NEW 28.11.21 13:49 
в ответ alex445 28.11.21 09:58

...не нужны...

-----

Ну учить то Я тебя никогда не брался...

Так что либо сам научишься... либо будешь особенным...

#76 
Murr патриот28.11.21 14:03
Murr
NEW 28.11.21 14:03 
в ответ alex445 28.11.21 10:13

ответ дайте.

-----

А если не дадут то и решения не будет?

А всего-то - надо изучить организацию и использование ресурсов.


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

#77 
alex445 старожил28.11.21 16:37
NEW 28.11.21 16:37 
в ответ Murr 28.11.21 14:03, Последний раз изменено 28.11.21 16:47 (alex445)
А если не дадут то и решения не будет?
А всего-то - надо изучить организацию и использование ресурсов.


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

Если ответа не будет, то придётся самому изучать или что-то своё лепить. Но ответ всё это дело ускорит.


Всё они локализуют. Локализации нет в игрушках в Стиме, в магазинах приложений, или в нормальных программах, типа того же Фотошопа?


Не вопрос - не будет задачи, не буду локализовать. У меня на прежних работах никто не требовал локализации - достаточно было русского. Я сам на сайте и потом в WPF себе прикрутил. А с Юнити старый простой подход по МСДНовскому букварю не сработал - нужны танцы с бубном и копошения в кишках, как там эти ресурсы хранятся-деплоятся-обрабатываются.

#78 
Murr патриот28.11.21 16:50
Murr
NEW 28.11.21 16:50 
в ответ alex445 28.11.21 16:37

достаточно было русского.

-----

А америкосам - достаточно американской версии английского.

И то, что в мире есть другие языки для многих мамерикосов - тайна за семью печатями.


Вот простой пример.

Винда 7. Обычные региональные настройки.

Мне нужны одновременно - американская клава, русская клава и... формат даты dd/mm/yyyy.


или что-то свое лепить.

-----

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

#79 
alex445 старожил28.11.21 20:42
NEW 28.11.21 20:42 
в ответ Murr 28.11.21 16:50

Прочитал тут всё

Create satellite assemblies for .NET apps | Microsoft Docs

Package and deploy resources in .NET Apps | Microsoft Docs

Resources in .NET apps | Microsoft Docs


Херня и вода - для моего вопроса ответа не дают. Единственный намёк - затолкать эти сборки-сателлиты (как раз те, что содержат сокмиленные ресурсы для локали) в глобальный кеш сборок, но там могут быть проблемы с доступом из Юнити. Да и на разных системах это в разных местах находится - Винда, Андроид и прочее. В моём случае лучше, когда всё в папке приложения лежит.


Сейчас видится такое решение - создать по проекту для каждой локали, дать сборкам разные имена (например, поместить в название имя локали), чтобы Юнити не ругался при импорте, загружать при старте приложения ту сборку, чья локаль выбрана.

#80 
uscheswoi_82 старожил29.11.21 05:30
NEW 29.11.21 05:30 
в ответ alex445 28.11.21 10:13
Эй, кто мне минусы лепит? Лучше ответ дайте. ))

А там ведь платно вроде бы, не? Если платно, то сомневаюсь что кто-то зареган из этого форума там. Ну это всегда так, сплошные хейтеры и тролли. Влепил кто-то дизлайк, и спрятался.

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#81 
alex445 старожил29.11.21 08:57
NEW 29.11.21 08:57 
в ответ uscheswoi_82 29.11.21 05:30, Последний раз изменено 29.11.21 08:58 (alex445)

На SO платно? Не знаю, как сейчас, а 7-9 лет назад всё бесплатно было. Да и недавно на их других сайтах из Stackexchange регался - бесплатно.

#82 
alex445 старожил29.11.21 09:33
NEW 29.11.21 09:33 
в ответ alex445 29.11.21 08:57

Короче, в Юнити сделано всё так, чтобы максимально усложнить тебе жизнь при использовании чего-то не из Юнити. Поэтому ставишь тамошний плагин по локализации или покупаешь чего-то в ихнем магазине плагинов и не выё... Юнити, похоже, больше зарабатывает на продаже всяких штук в своём магазине для разработчиков, чем на просто лицензиях своего движка, поэтому всё, что стороннее и не из стора - максимально затруднено для интеграции.

#83 
alex445 старожил30.11.21 12:14
NEW 30.11.21 12:14 
в ответ AlexNek 13.11.21 13:02

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

#84 
AlexNek патриот02.12.21 12:52
AlexNek
NEW 02.12.21 12:52 
в ответ alex445 30.11.21 12:14
Так как вы решили делать-то?

Это было ка бы "научное исследование". До конкретной имплементации пока еще далеко.

Хорошего решения всё равно нет. Или медленно или неудобно

#85 
alex445 старожил02.12.21 14:10
NEW 02.12.21 14:10 
в ответ AlexNek 02.12.21 12:52

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

#86 
AlexNek патриот02.12.21 21:52
AlexNek
NEW 02.12.21 21:52 
в ответ alex445 02.12.21 14:10
В самом универсальном решении всего одна таблица связей добавляется,

Скорость не подсчитывали?

#87 
alex445 старожил02.12.21 23:36
NEW 02.12.21 23:36 
в ответ AlexNek 02.12.21 21:52, Последний раз изменено 02.12.21 23:37 (alex445)

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

#88 
Murr патриот03.12.21 00:05
Murr
NEW 03.12.21 00:05 
в ответ alex445 02.12.21 23:36

Для скорости лучше

-----

Ты бы по базам что-нибудь почитал, что ли...

#89 
alex445 старожил03.12.21 00:33
NEW 03.12.21 00:33 
в ответ Murr 03.12.21 00:05

Две таблицы


T1

id

name


T2

id

nameEn

nameRu

nameDe


Есть вариант сделать мультиязычность быстрее, чем во второй таблице?

#90 
Murr патриот03.12.21 00:42
Murr
NEW 03.12.21 00:42 
в ответ alex445 03.12.21 00:33

Конечно есть! Причем - больше одного варианта.

Но чтобы понимать что надо делать - надо изучать базы чутка глубже, чем написание селектов...

И, можешь смеятся, надо будет освоить работу с файлами... в том числе - с большими (больше размера памяти) файлами... об чем тебе давалась элементарная задачка. смущ

#91 
uscheswoi_82 старожил03.12.21 07:58
NEW 03.12.21 07:58 
в ответ alex445 03.12.21 00:33

Тут что-то написали https://stackoverflow.com/questions/537204/localisation-i18n-of-database-data-in-linq-to-sql

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#92 
alex445 старожил03.12.21 08:39
NEW 03.12.21 08:39 
в ответ Murr 03.12.21 00:42, Последний раз изменено 03.12.21 08:48 (alex445)
Конечно есть! Причем - больше одного варианта.
Но чтобы понимать что надо делать - надо изучать базы чутка глубже, чем написание селектов...
И, можешь смеятся, надо будет освоить работу с файлами... в том числе - с большими (больше размера памяти) файлами... об чем тебе давалась элементарная задачка.

Размера какой памяти? БД и не держит все таблицы в оперативке. Или вам нужна локализация многих текстов размерами в гигабайты каждый?


А если задача не стоит делать всегда и обязательно рекордные БД (ну не все тут Гуглы или обрабатывают миллиарды записей), то таблицы связей и локализованные поля начинают работать? Ведь конкретное решение зависит от задачи:


1) вас устраивает тупой говнокод - даже с ним ничего не тормозит;

2) вас устраивает простое следование простым примерам из букварей;

3) вас устраивает просто хорошо написанная БД в стандартной СУБД;

4) вы делаете какие-то хаки-доработки для стандартной СУБД и экспериментируете со схемами БД;

5) вас уже не устраивает стандартная БД и хаки-доработки не помогают, вы делаете свою БД, заточенную под ваши задачи.


Ваши советы почти всегда из разряда не ниже 4. Тогда как подавляющее число задач решается способами 1-3.


И вы не могли бы почаще давать конкретные советы, как и что именно тут и здесь можно сделать, а не общие, типа почитай этот толмуд, пройди этот курс?

#93 
Программист коренной житель03.12.21 09:06
NEW 03.12.21 09:06 
в ответ alex445 03.12.21 00:33, Последний раз изменено 03.12.21 09:08 (Программист)
Есть вариант сделать мультиязычность быстрее, чем во второй таблице?

А зачем тут 2 таблицы :)


Я бы сделал так:

T_En

id

text


T_Ru

id

text


T_De

id

text

Собственно говоря, лет 15 тому назад мы так и сделали.

Логика менеджера была простая как мычание :

1) Взять строку из T_xx

2) Если строки нет, то взять строку из T_En

3) Если строки нет, то вернуть id

А для того, чтобы сразу было видно, прошла ли эта строка через менеджер, в дебаг моде к каждой строке добавлялся префикс '###'.


Все просто и понятно. При этом сразу видно какие строки берутся из БД, а какие хардкодед. И всегда можно легко найти строки без перевода.

#94 
alex445 старожил03.12.21 10:25
NEW 03.12.21 10:25 
в ответ Программист 03.12.21 09:06, Последний раз изменено 03.12.21 10:53 (alex445)
А зачем тут 2 таблицы :)

Я привел пример двух таблиц - без локализации и с. И в какой будет производительность больше и насколько? В смысле, что так ли уж критично использовать какой-то особенный подход с изъё...вом в архитектуре или подключением обычных файлов с диска?

#95 
MrSanders коренной житель03.12.21 10:51
NEW 03.12.21 10:51 
в ответ Программист 03.12.21 09:06
Я бы сделал так:

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

Потому что менеджер явно на стороне приложения. А значит на поиск перевода тратит новый запрос. А раундтрип у запроса раз в ... 10? больше стоимости джойна вроде

SELECT а.*, c.text as CITY_LOC FROM ADDRESS a JOIN I18_TEXT c ON a.CITY_NAME_ID = c.ID AND c.LANG = "en" WHERE ....

#96 
alex445 старожил03.12.21 10:56
NEW 03.12.21 10:56 
в ответ Программист 03.12.21 09:06, Последний раз изменено 03.12.21 10:56 (alex445)
Я бы сделал так:

Вы просто храните все локализованные тексты в таблицах по одной на язык. А подключаете их как? Типа такого?


T_Item

id description - id from T_En


Как выбор таблицы с нужной локалью происходит?

#97 
uscheswoi_82 старожил03.12.21 12:14
NEW 03.12.21 12:14 
в ответ alex445 03.12.21 10:56

НП.

Наверное нужно применять LINQ, там можно разную магию делать, насчёт СУБД в память, есть In Memory DB - https://docs.microsoft.com/ru-ru/sql/relational-databases/in-memory-database?view=sql-server-ver15

Если я кому-то отвечаю, это не значит что я ему симпатизирую, каждый остаётся при своём мнение
#98 
Murr патриот03.12.21 12:58
Murr
NEW 03.12.21 12:58 
в ответ alex445 03.12.21 08:39

И вы не могли бы почаще давать конкретные советы

-----

Тебе снова сказать про фрагментированность твоих знаний?

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


почитай этот толмуд, пройди этот курс?

-----

А что делать, если ты сам не учишься? Учить-то за тебя никто не будет...

Похоже, что и тебя учить тоже никто не будет.


из разряда не ниже 4.

-----

Вообще-то - чистая 3.

Только чтобы это понять надо знать чутка больше чем написание селекта. Не на много, но все же больше.

#99 
Murr патриот03.12.21 13:07
Murr
NEW 03.12.21 13:07 
в ответ Программист 03.12.21 09:06

лет 15 тому назад мы так и сделали

-----

Угу... А во что выльется добавление еще одного языка?


Я бы сделал так

-----

Ну а Я бы почитал про партиционирование...


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

Murr патриот03.12.21 13:16
Murr
NEW 03.12.21 13:16 
в ответ MrSanders 03.12.21 10:51

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

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

Хотя... из линк-то-скл нужного добиться будет сложно...

Программист коренной житель03.12.21 13:29
NEW 03.12.21 13:29 
в ответ MrSanders 03.12.21 10:51
Добавлять новый язык будет не так просто.

Зависит от реализации. Установив правила имен таблиц, новый язык можно добавлять путем добавления соответствующей таблицы в БД :)


Потому что менеджер явно на стороне приложения.

Менеджер просто генерит запрос: $"SELECT * FROM Translation_{cultureInfo.TwoLetterISOLanguageName} WHERE Id = {id}"

Если хочется, то можно сразу джойнить английскую (дефолтную) строку.


Программист коренной житель03.12.21 13:35
NEW 03.12.21 13:35 
в ответ Murr 03.12.21 13:07
Угу... А во что выльется добавление еще одного языка?

В добавление еще одной таблицы. Даже код менеджера не надо править :)


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

Мы это все делали на SQLite.

Murr патриот03.12.21 14:26
Murr
NEW 03.12.21 14:26 
в ответ Программист 03.12.21 13:35

В добавление еще одной таблицы.

-----

Ээээ... как бы это помягче сказать...


на SQLite

-----

... предоставляемые возможности определяют.

Но это не означает что решение можно брать за образец.

AlexNek патриот04.12.21 11:38
AlexNek
NEW 04.12.21 11:38 
в ответ Программист 03.12.21 09:06
А зачем тут 2 таблицы

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

1 2 3 4 5 6 все