Сохранение текстов на разных языках в базе данных
А как записывать то?
Пример (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 и видит в браузере:
Предпоследняя строчка Последняя строчка
Вариантов имплементации много, что вам больше нравится?
извините, не читал всю ветку, но этого маловато. вопрос не в том, что мне нравится, а чего ожидает заказчик. или он хочет переводы гуголя, или он хочет лично присылать вам переводы, и вы их будете вносить в базу, или ...
А где же XML или Json? И что делать если два человека что то редактируют? И как изменить москва в какой-то неизвестной строке? А если весь файл в память не помещается?
Я безпонятия о чём речь честно говоря. В своём будущем проекте immobilien portal я буду использовать статические JSON и HTML.
Так бы примерно бы делал бы:
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
Я так понимаю некий глобальный ресурс?
-----
Да нет - чисто твой выбор способа хранения.
А как потом редактировать запись в таблице
------
А это тебя сейчас не должно волновать...
Ввел на одном - получил перевод на каждый из заданых языков - пихнул в хранилище...
И это... в базах таблицы бывают и без первичных ключей, и со множествеными полями в качестве уникального ключа...
Извините за вопрос не по теме. Вы обычно сами систему авторизации пользователей (хранение и смена паролей, длину сессий и прочее) разрабатываете, или какие-то готовые модули используете? Деплоите сами, с настройкой сертификатов шифрования и вообще веб-сервера, или тоже что-то готовое используете?
https://medium.com/walkin/database-internationalization-i1...
например. текст - это ещё небольшая проблема
Загнать все тексты и переводы в уникодный txt, сделать zip/7z и в программе просто считывать из архивного файла нужный текст по связке id-страна & id-(текстовое поле).
Доп. плюс - всегда легко и быстро можно отредактировать базу или дополнить ее новыми языками.
Можно даже маленькую программку для управления такой базой "на коленке" написать.
https://medium.com/walkin/database-internationalization-i1...
например. текст - это ещё небольшая проблема
Вот я и предлагал последний вариант изначально. И да - не составной ключ из айдишников языка и переводимой сущности, а простой отдельный суррогатный.
А даты и прочее обычно форматируются из коробки (в правильном фреймворке) по выбранной культуре.
а что мы вообще разрабатываем? с этого бы начать. не определившись с задачей, попытки поскорей начать "имплеменментировать" - суета-сует.
если же исходить из того, что задача полностью определена в заглавии (Сохранение текстов на разных языках в базе данных), то три таблицы напрашиваются:
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)
и еще. в промежности между "приложением" и базой нужен какой-то "локализатор", который будет иметь удобный интерфейс и будет знать, как из запрошенного приложением получить от базы нужный текст. потому что простого "сохнанения текстов на разных языках" обычно оказывается недостаточно.
По предлагаемой схеме тебе надо будет писать два разных метода получения текста - один для оригинального, другой для перевода.
При этом язык оригинального текста - неопределен.
Ворос тут скорее в том, где хранить информацию об языке - вместе с текстом или делать отдельный маппер...
Текущая культура в Дотнете хранится в CultureInfo. Дефолтная - под которой запущено приложение. Если это сайт на сервере - культура на сервере. Надо клиентскую - спрашиваешь в браузере у клиента какая или берёшь из настроек текущей сессии клиента. Кодировки культур имеют известный формат. Из приложения получаешь кодировку и сущность, которую нужно перевести. Далее что там у нас, EntityFramework? Тогда что-то типа
Lang.LangCityTranslations.Where(t => t.LangId == ... && t.CityId == ...).FirstOrDefault()
и далее вытаскиваешь нужное для перевода свойство.