"ContentCacheSlidingExpirationByDay":"Скользящий срок действия кэша контента по дням",
"MaxDaysForCaching":"Максимальное количество дней для кэширования",
"Enabled":"Включено",
"Menu:NugetPackagesContentCache":"NuGet-кэш",
"NugetPackagesContentCache":"Кэш контента NuGet",
"SlidingExpritionByDayInfo":"Получает или задает время, в течение которого запись кэша может быть неактивной (например, недоступной), прежде чем она будет удалена. ",
"MaxDaysForCachingInfo":"Получает или задает абсолютное время истечения срока действия относительно текущего момента.",
"CurrentEstimatedSizeInfo":"Указывает приблизительную сумму размера содержимого всех пакетов NuGet, находящихся в настоящее время в кеше памяти.",
"CurrentEntryCountInfo":"Указывает количество экземпляров, находящихся в настоящее время в кэше памяти.",
"TotalHitsInfo":"Указывает общее количество промахов кэша. ",
"TotalMissesInfo":"Указывает общее количество попаданий в кэш. ",
"Permission:VersionHistory":"История версий",
"Caches":"Тайники",
"VersionHistories":"История версий",
"Version":"Версия",
"PublishDate":"Дата публикации",
"IsStableVersion":"Стабильная версия",
"IsActive":"Активный",
"NewVersion":"Новая версия",
"VersionHistoryDeletionConfirmationMessage":"Вы уверены, что хотите удалить эту версию?",
"Volo.AbpIo.Domain:010004":"Достигнуто максимальное количество участников!",
"Volo.AbpIo.Domain:010005":"Достигнуто максимальное количество владельцев!",
"Volo.AbpIo.Domain:010006":"Этот пользователь уже является владельцем в этой организации!",
"Volo.AbpIo.Domain:010006":"Этот пользователь уже является владельцем этой организации!",
"Volo.AbpIo.Domain:010007":"Этот пользователь уже является разработчиком в этой организации!",
"Volo.AbpIo.Domain:010008":"Разрешенное количество разработчиков не может быть меньше текущего количества разработчиков!",
"Volo.AbpIo.Domain:010009":"Допустимое количество разработчиков не может быть меньше 0!",
"Volo.AbpIo.Domain:010010":"Превышено максимальное количество MAC-адресов!",
"Volo.AbpIo.Domain:010009":"Разрешенное количество разработчиков не может быть меньше 0!",
"Volo.AbpIo.Domain:010010":"Превышено максимальное количество Mac-адресов!",
"Volo.AbpIo.Domain:010011":"Персональная лицензия не может иметь более 1 разработчика!",
"Volo.AbpIo.Domain:010012":"Лицензия не может быть продлена через месяц после истечения срока действия лицензии!",
"Volo.AbpIo.Domain:020001":"Не удалось удалить этот пакет NPM, поскольку пакеты Nuget \"{NugetPackages}\" зависят от этого пакета.",
"Volo.AbpIo.Domain:020002":"Не удалось удалить этот пакет NPM, потому что модули \"{Modules}\" используют этот пакет.",
"Volo.AbpIo.Domain:020003":"Не удалось удалить этот пакет NPM, поскольку модули \"{Modules}\" используют этот пакет, а пакеты Nuget \"{NugetPackages}\" зависят от этого пакета.",
"Volo.AbpIo.Domain:020004":"Не удалось удалить этот пакет Nuget, потому что модули \"{Modules}\" используют этот пакет.",
"Volo.AbpIo.Domain:020002":"Не удалось удалить этот пакет NPM, поскольку этот пакет используют модули «{Modules}».",
"Volo.AbpIo.Domain:020003":"Не удалось удалить этот пакет NPM, поскольку модули «{Modules}» используют этот пакет, а пакеты Nuget «{NugetPackages}» зависят от этого пакета.",
"Volo.AbpIo.Domain:020004":"Не удалось удалить этот пакет Nuget, поскольку этот пакет используют модули «{Modules}».",
"Volo.AbpIo.Domain:030000":"Вы уже завершили пробный период.",
"Volo.AbpIo.Domain:030001":"Это название организации уже существует.",
"Volo.AbpIo.Domain:030002":"После активации вы не сможете переключить пробную лицензию в статус «запрошено»!",
"Volo.AbpIo.Domain:030003":"Нет такого статуса!",
"Volo.AbpIo.Domain:030004":"Статус не удалось изменить из-за непредвиденной ошибки!",
"Volo.AbpIo.Domain:030005":"Даты начала и окончания могут быть обновлены, когда пробная лицензия находится в статусе «активировано»!",
"Volo.AbpIo.Domain:030006":"Дата окончания должна быть больше даты начала!",
"Volo.AbpIo.Domain:030007":"Эта пробная лицензия уже активирована!",
"Volo.AbpIo.Domain:030008":"Дату покупки можно установить только при статусе -куплено-!",
"Volo.AbpIo.Domain:030009":"Пользователь не найден!",
"Volo.AbpIo.Domain:030010":"Чтобы приобрести пробную лицензию, вам сначала необходимо активировать пробную лицензию!",
"Volo.AbpIo.Domain:030011":"Вы не можете удалить пробную лицензию после ее приобретения!",
"Volo.AbpIo.Domain:030012":"Пользователь имеет право иметь только 1 бесплатный пробный период. ",
"Volo.AbpIo.Domain:030013":"Пользователь с активной лицензией не может запустить пробную лицензию.",
"Volo.AbpIo.Domain:040000":"Телеметрия уже существует!.",
"Volo.AbpIo.Domain:070000":"Название организации может содержать только латинские буквы, цифры, точки и дефисы!",
"Volo.AbpIo.Domain:070001":"Название компании может содержать только латинские буквы, цифры, точки, пробелы и дефисы!",
"WantToLearn?":"Хотеть учиться?",
"ReadyToGetStarted?":"Готовы начать?",
"JoinOurCommunity":"Присоединяйтесь к нашему сообществу",
"GetStartedUpper":"НАЧАТЬ",
"ForkMeOnGitHub":"Разветвите меня на GitHub",
"ForkMeOnGitHub":"Раскошелитесь на GitHub",
"Features":"Функции",
"GetStarted":"Начать",
"Documents":"Документы",
@ -26,19 +43,198 @@
"ContributionGuide":"Руководство по вкладу",
"Blog":"Блог",
"Commercial":"Коммерческий",
"MyAccount":"Мой аккаунт",
"MyAccount":"Мой счет",
"Permission:License":"Лицензия",
"Permission:UserInfo":"Информация о пользователе",
"SeeDocuments":"См. Документы",
"SeeDocuments":"См. документы",
"Samples":"Образцы",
"Framework":"Фреймворк",
"Support":"Служба поддержки",
"Framework":"Рамки",
"Support":"Поддерживать",
"FreeDDDBook":"Бесплатная электронная книга DDD",
"New":"Новый",
"Volo.AbpIo.Domain:020005":"Год продления лицензии не может быть меньше {MinExtendLicenseYear} лет и больше {MaxExtendLicenseYear} лет.",
"TrialLicensePeriodHasExpired":"Срок действия вашей пробной лицензии истек {0} дней назад.",
"TrialLicensePeriodWillExpire":"Срок действия вашей пробной лицензии истечет через {0} дн.",
"TrialLicensePeriodExpireToday":"Срок действия вашей пробной лицензии истекает сегодня.",
"PurchaseNow":"Купить сейчас!"
"Volo.AbpIo.Domain:020005":"Год продления лицензии не может быть меньше {MinExtendLicenseYear} лет и больше {MaxExtendLicenseYear} лет. ",
"TrialLicensePeriodHasExpired":"Срок действия пробной лицензии истек {0} дн. назад.",
"TrialLicensePeriodWillExpire":"Срок действия пробной лицензии истечет через {0} дн.",
"TrialLicensePeriodExpireToday":"Срок действия пробной лицензии истекает сегодня.",
"PurchaseNow":"Купить сейчас!",
"LatestReleaseLogs":"Журналы последних выпусков",
"RoadMap":"Дорожная карта",
"FAQ":"Часто задаваемые вопросы",
"SourceCode":"Исходный код",
"SeeAllPosts":"Посмотреть все публикации",
"Contribute":"Способствовать",
"LiveDemo":"Живая демонстрация",
"GetLicense":"Получить лицензию",
"OpenSource":"Открытый источник",
"WebApplication":"Веб приложение",
"MeetTheABP":"Знакомьтесь: ABP",
"CompleteWebDevelopment":"Полная веб-разработка",
"Platform":"Платформа",
"ABPDescription":"Платформа с открытым исходным кодом для разработки веб-приложений для ASP.NET Core. ",
"StrongInfrastructure":"Сильная инфраструктура",
"CompleteArchitecture":"Полная архитектура",
"DeveloperFocused":"Ориентирован на разработчиков",
"ShareYourExperiences":"Поделитесь своим опытом использования ABP Framework",
"LatestPosts":"Последние посты",
"LatestVideos":"Последние видео",
"Views":"Взгляды",
"LearnLatestNewsAboutABPFramework":"Получайте информацию о событиях в ABP, таких как новые выпуски, бесплатные источники, публикации и многое другое.",
"DeveloperTools":"Инструменты разработчика",
"StartupTemplates":"Шаблоны запуска",
"ApplicationModules":"Прикладные модули",
"UI":"пользовательский интерфейс",
"Themes":"Темы",
"Premium":"Премиум",
"PrivacyPolicy":"политика конфиденциальности",
"TermsAndConditions":"Условия",
"WouldLikeToReceiveMarketingMaterials":"Я хотел бы получать маркетинговые материалы, такие как предложения по продуктам",
"JoinOurMarketingNewsletter":"Подпишитесь на нашу маркетинговую рассылку",
"FreeDDDEBook":"Бесплатная электронная книга DDD",
"AdditionalServices":"Дополнительные услуги",
"Learn":"Учиться",
"AccountOverview":"Обзор учетной записи",
"MyOrganizations":"Мои организации",
"MySupportQuestions":"Мои вопросы о поддержке",
"MyProfile":"Мой профайл",
"Logout":"Выйти",
"Home":"Дом",
"Posts":"Сообщения",
"Videos":"Видео",
"JoinTheABPCommunity":"Присоединяйтесь к сообществу ABP",
"SubmitYourPost":"Отправьте свое сообщение",
"Modules":"Модули",
"Tools":"Инструменты",
"Pricing":"Цены",
"ChangeLogs":"Журналы изменений",
"SubscribeToNewsletter":"Подписаться на рассылку",
"SubscribeToNewsletterDescription":"Получайте информацию о событиях в ABP, таких как новые выпуски, бесплатные источники, публикации и многое другое.",
"EmailAddress":"Адрес электронной почты",
"Subscribe":"Подписаться",
"WelcomeToABP":"Добро пожаловать в ABP",
"EULA":"Лицензионное соглашение",
"ABPCommercialIntroductionMessage":"Готовые модули приложений, расширенные шаблоны запуска, инструменты быстрой разработки приложений, профессиональные темы пользовательского интерфейса и премиум-поддержка.",
"MasteringAbpFrameworkEBook":"Освоение структуры ABP",
"MasteringTheABPFrameworkExplanation":"Эта книга, написанная создателем ABP Framework, поможет вам получить полное представление об этой платформе и современных методах разработки веб-приложений.",
"Speakers":"Динамики",
"PreviousEvents":"Предыдущие события",
"WatchTheEvent":"Посмотреть событие",
"RegisterNow":"Зарегистрироваться",
"ThereIsNoEvent":"Нет никакого события.",
"Events":"События",
"Volo.AbpIo.Domain:080000":"Уже есть купленный товар с названием \"{Name}\"",
"CookieConsent_Explanation_1":"Мы используем файлы cookie, чтобы вам было удобнее пользоваться нашим сайтом.",
"CookieConsent_Explanation_2":"Если вы продолжаете просматривать, вы соглашаетесь с нашими <a href=\"@Url.Page(\"/Privacy\")\">Политика конфиденциальности и политика использования файлов cookie.</a>.",
"Error_Page_400_Title":"Возникла проблема с обслуживанием запрошенной страницы.",
"Error_Page_400_Description_1":"Обычно это означает, что при обработке вашего запроса произошла непредвиденная ошибка.",
"Error_Page_400_Description_2":"Если проблема не устранена, свяжитесь с нами по адресу <a href=\"mailto:info@abp.io\">info@abp.io</a> и мы поможем вам продолжить путь.",
"GoToHomepage":"Вернуться на домашнюю страницу",
"Error_Page_404_Title":"Страница не найдена!",
"Error_Page_404_Description_1":"Это не та веб-страница, которую вы ищете.",
"Error_Page_500_Title":"Похоже, что-то пошло не так!",
"Error_Page_500_Description_1":"Мы отслеживаем эти ошибки автоматически, но если проблема не устранена, не стесняйтесь <br /> связаться с нами. ",
"Error_Page_500_Description_2":"Свяжитесь с нами по адресу <a href=\"mailto:info@abp.io\" target=\"_blank\">info@abp.io</a>.",
"AbpDescription":"ABP - это открытый фреймворк приложений, ориентированный на разработку веб-приложений на базе AspNet Core. Не повторяйте себя, сосредоточьтесь на своем бизнес-коде.",
"AbpDefinition":"Блог ABP по разработке .NET, кроссплатформенные шаблоны приложений ASP.NET, новости, связанные с ABP и многое другое..."
"IndexPageHeroSection":"<span class=\"first-line\">A complete</span><span class=\"second-line\"> web development platform</span><span class=\"third-line\">built-on <img src=\"{0}\" width=\"110\" class=\"ml-1\" /> framework</span>",
"AbpCommercialShortDescription":"ABP Commercial provides pre-built application modules, rapid application development tooling, professional UI themes, premium support and more.",
"LiveDemo":"Live Demo",
"LiveDemoLead":"<a href=\"{0}\">{1}</a> using your ABP account, <a href=\"{2}\">{3}</a> to abp.io.<br/>Or fill the form below to create a live demo now",
"LiveDemoLead":"<a href=\"{0}\">{1}</a> using your ABP account, <a href=\"{2}\">{3}</a> to abp.io <br/> or fill the form below to create a live demo now",
"ThereIsAlreadyAnAccountWithTheGivenEmailAddress":"There is already an account with the given email address: <b>{0}</b><br/> You can login with your account to proceed.",
"GetLicence":"Get a License",
"Application":"Application",
@ -998,10 +998,10 @@
"CreatingAnEmptySolution":"Creating an Empty Solution",
"THEPROBLEM":"THE PROBLEM",
"CreatingAnEmptySolution_THEPROBLEM_Description":"Even creating an almost-empty solution is challenging;",
"CreatingAnEmptySolution_THEPROBLEM_Description2":"How do you organize your codebase across projects?",
"CreatingAnEmptySolution_THEPROBLEM_Description2":"How do you organize your code-base across projects?",
"CreatingAnEmptySolution_THEPROBLEM_Description3":"What are the layers and how do they interact?",
"CreatingAnEmptySolution_THEPROBLEM_Description4":"How do you integrate to 3rd-party library and systems?",
"CreatingAnEmptySolution_THEPROBLEM_Description5":"How to set up the automated tests?",
"CreatingAnEmptySolution_THEPROBLEM_Description4":"How do you integrate to 3rd-party libraries?",
"CreatingAnEmptySolution_THEPROBLEM_Description5":"How to set up automated tests?",
"ABPSOLUTION":"ABP SOLUTION",
"CreatingAnEmptySolution_ABPSOLUTION_Description":"ABP provides a well-architected, layered and production-ready <a href=\"https://docs.abp.io/en/abp/latest/Startup-Templates/Application\" target=\"_blank\">startup solution</a> based on the <a href=\"https://docs.abp.io/en/abp/latest/Domain-Driven-Design\" target=\"_blank\">Domain Driven Design</a> principles. The solution also includes a pre-configured unit and integration <a href=\"https://docs.abp.io/en/abp/latest/Testing\" target=\"_blank\">test</a> projects for each layer.",
"RafflesInfo":"<br>This is the raffle page dedicated to show our appreciation towards you for being an active Community Member. We do <a target=\"_blank\" class=\"fw-6 \" href=\"https://community.abp.io/events\">ABP Community Talks</a> <a target=\"_blank\" class=\"fw-6\" href=\"https://abp.io/conference/2023\">,ABP .NET Conference</a>, attend or sponsor to the .NET-related events in which we give away some gifts. <br><br>You can follow this page to see the upcoming raffles, attend them, or see previous raffles we draw including the winners. <br><br>Thank you for being an active member! See you in the upcoming raffles.",
"RafflesInfo":"<br>This is the raffle page dedicated to show our appreciation towards you for being an active Community Member. We do <a class=\"fw-6 \" href=\"https://community.abp.io/events\">ABP Community Talks</a> <a target=\"_blank\" class=\"fw-6\" href=\"https://abp.io/conference/2023\">,ABP .NET Conference</a>, attend or sponsor to the .NET-related events in which we give away some gifts. <br><br>You can follow this page to see the upcoming raffles, attend them, or see previous raffles we draw including the winners. <br><br>Thank you for being an active member! See you in the upcoming raffles.",
"RafflesInfoTitle":"ABP Community <span class=\"gradient-community\">Raffles</span>"
"ContributeAbpCommunity":"Внесите свой вклад в сообщество ABP",
"SubmitYourPost":"Отправьте свой пост",
"ContributionGuide":"Руководство по вкладу",
"BugReport":"Сообщение об ошибке",
"SeeAllPosts":"Просмотреть все сообщения",
"WelcomeToABPCommunity!":"Добро пожаловать в сообщество ABP!",
"MyProfile":"Мой профайл",
"MyOrganizations":"Мои организации",
"BugReport":"Отчет об ошибке",
"SeeAllPosts":"Посмотреть все публикации",
"WelcomeToABP":"Добро пожаловать в АБП",
"EmailNotValid":"Пожалуйста, введите действительный адрес электронной почты.",
"FeatureRequest":"Запрос функции",
"CreatePostTitleInfo":"Название сообщения, которое будет отображаться в списке сообщений.",
"CreatePostSummaryInfo":"Краткое изложение сообщения, которое будет отображаться в списке сообщений.",
"CreatePostCoverInfo":"Для создания эффектной статьи добавьте фото на обложке. Загрузите изображения с соотношением сторон 16: 9 для наилучшего просмотра. Максимальный размер файла: 1 МБ.",
"ThisExtensionIsNotAllowed":"Это расширение не разрешено.",
"TheFileIsTooLarge":"Файл слишком большой.",
"GoToThePost":"Перейти к статье",
"Contribute":"Делать вклад",
"GoToTheVideo":"Перейти к видео",
"OverallProgress":"Общий прогресс",
"Done":"Выполнено",
"Open":"Открытым",
"Closed":"Закрыто",
"LatestQuestionOnThe":"Последний вопрос по",
"RecentQuestionFrom":"Недавний вопрос от {0}",
"Stackoverflow":"Переполнение стека",
"Votes":"голосов",
"Answer":"Отвечать",
@ -91,6 +91,8 @@
"AllPostRequests":"Просмотреть все запросы статей",
"SubscribeToTheNewsletter":"Подпишитесь на рассылку новостей",
"NewsletterEmailDefinition":"Получайте информацию о событиях в ABP, например о новых выпусках, бесплатных источниках, статьях и многом другом.",
"ArticleRequestsDescription":"Хотите увидеть здесь конкретный контент? ",
"JoinOurPostNewsletter":"Подпишитесь на нашу новостную рассылку статей",
@ -143,6 +145,119 @@
"Volo.AbpIo.Domain:060001":"Исходный URL (\"{PostUrl}\") не является URL-адресом Github",
"Volo.AbpIo.Domain:060002":"Контент статьи недоступен на ресурсе Github (\"{PostUrl}\").",
"Volo.AbpIo.Domain:060003":"Контент статьи не найден!",
"IConsentToMedium":"Я даю согласие на публикацию этого поста на https://medium.com/volosoft."
"SeeMore":"Узнать больше",
"JoinTheABPCommunity":"Присоединяйтесь к сообществу АБП",
"ABPCommunityTalks":"Обсуждения сообщества ABP",
"LiveDemo":"Живая демонстрация",
"GetLicense":"Получить лицензию",
"GetStarted":"Начать",
"SourceCode":"Исходный код",
"LeaveComment":"Оставьте комментарий",
"ShowMore":"Показать больше",
"NoPublishedPostsYet":"Опубликованных постов пока нет.",
"Name":"Имя",
"Surname":"Фамилия",
"WebSite":"Веб-сайт",
"FullURL":"Полный URL-адрес",
"JobTitle":"Должность",
"Prev":"Предыдущий",
"Previous":"Предыдущий",
"Next":"Следующий",
"Share":"Делиться",
"SortBy":"Сортировать по",
"NoPublishedEventsYet":"Опубликованных событий пока нет.",
"SubscribeYoutubeChannel":"Подпишитесь на канал Youtube",
"Enum:EventType:0":"Переговоры",
"MemberNotPublishedPostYet":"Этот участник еще не опубликовал ни одного сообщения.",
"TimeAgo":"{0} назад",
"Discord_Page_JoinCommunityMessage":"Присоединяйтесь к сообществу ABP Discord",
"Discord_Page_Announce":"Мы рады анонсировать Discord-сервер сообщества ABP!",
"Discord_Page_Description_1":"Сообщество ABP росло с первого дня. ",
"Discord_Page_Description_2":"Сервер Discord сообщества ABP — это место, где вы можете продемонстрировать свои творения с использованием ABP Framework, поделиться советами, которые вам помогли, узнать последние новости и объявления об ABP Framework, просто пообщаться с членами сообщества для обмена идеями и весело провести время!",
"Discord_Page_Description_3":"Этот сервер Discord сообщества ABP является официальным, и основная команда ABP присутствует на сервере для мониторинга.",
"Discord_Page_JoinToServer":"Присоединяйтесь к Discord-серверу ABP",
"Events_Page_MetaTitle":"Мероприятия сообщества ABP",
"Events_Page_MetaDescription":"Живые выступления, проводимые командой ABP, представляют собой случайные сеансы, наполненные контентом сообщества, демонстрациями и вопросами.",
"UpcomingCommunityTalkEventDescription":"Живые выступления, проводимые командой ABP, представляют собой случайные сеансы, наполненные контентом сообщества, демонстрациями и вопросами.",
"UpcomingConferenceEventDescription":"Конференция ABP .NET — это виртуальное мероприятие, на котором сообщество разработчиков .NET может собраться вместе и послушать доклады о мире .NET, общих практиках разработки программного обеспечения и ABP Framework с открытым исходным кодом.",
"LastOneYear":"Последний 1 год",
"AllTimes":"Все время",
"TopContributors":"Лучшие участники",
"{0}Posts":"{0} сообщений",
"LATESTPOSTS":"ПОСЛЕДНИЕ ЗАПИСИ",
"NoContributorsFound":"Соавторы не найдены!",
"LatestPost":"Последний пост",
"MEMBERSINCE{0}":"УЧАСТНИК С {0}",
"CopyLink":"Копировать ссылку",
"ShareOnTwitter":"Поделиться в Твиттере",
"ShareOnLinkedIn":"Поделиться в LinkedIn",
"MoreFrom{0}":"Еще от {0}",
"SeeAllFrom{0}":"Посмотреть все из {0}",
"MostWatched":"Самые просматриваемые",
"Articles({0})":"Статьи ({0})",
"Videos({0})":"Видео ({0})",
"LatestArticles":"Последние статьи",
"RaffleHeader":"Привет, участник сообщества ABP!",
"RafflesInfo":"<br>Эта страница розыгрыша посвящена тому, чтобы выразить нашу признательность вам за то, что вы являетесь активным членом сообщества. <a target=\"_blank\" class=\"fw-6 \" href=\"https://community.abp.io/events\">Обсуждения сообщества ABP</a> <a target=\"_blank\" class=\"fw-6\" href=\"https://abp.io/conference/2023\">,Конференция ABP .NET</a>, посещать или спонсировать мероприятия, связанные с .NET, на которых мы раздаем подарки. <br><br>Вы можете подписаться на эту страницу, чтобы увидеть предстоящие розыгрыши, посетить их или просмотреть предыдущие розыгрыши, которые мы проводим, включая победителей. <br><br>Спасибо за активное участие! ",
"MasteringAbpFrameworkEBookDescription":"Эта книга поможет вам получить полное представление о инфраструктуре и современных методах разработки веб-приложений.",
"DependencyInjectionByConventions":"Dependency Injection by Conventions",
"ABPCLIExplanation":"ABP CLI (Command Line Interface) is a command line tool to automate some common operations for ABP based solutions.",
"ModularityExplanation":"ABP provides a complete infrastructure to build your own application modules that may have entities, services, database integration, APIs, UI components and so on..",//TODO:strong"your own application modules",-
"ModularityExplanation":"ABP provides a complete infrastructure to build your own application modules that may have entities, services, database integration, APIs, UI components and so on..",
"MultiTenancyExplanation":"ABP framework doesn't only support developing multi-tenant applications, but also makes your code mostly unaware of the multi-tenancy.",
"MultiTenancyExplanation2":"Can automatically determine the current tenant, isolate data of different tenants from each other.",
"MultiTenancyExplanation3":"Supports single database, database per tenant and hybrid approaches.",
"GetYourFreeEBook":"Получите ваш <span class=\"gradient-framework d-block\">Бесплатная электронная книга DDD </span>",
"EverythingYouNeedToKnow":"Все, что Вам нужно знать.",
"PreOrderNow":"Предварительный заказ сейчас",
"UITheming":"Темы пользовательского интерфейса",
"UIThemingExplanation":"Создавайте повторно используемые темы и макеты пользовательского интерфейса или используйте одну из готовых тем пользовательского интерфейса.",
"DataFilteringExplanation2":"Автоматически фильтруйте запросы к базе данных, чтобы легко реализовать такие шаблоны, как обратимое удаление и многопользовательское использование.",
"NeedHelp":"Нужна помощь?",
"GiveYourProjectAName":"Дайте своему проекту имя",
"CreateYourProjectNow":"Создайте свой проект сейчас",
"OrderOn":"Закажите {0}",
"DownloadFreeDDDBook":"Скачать бесплатную книгу DDD",
"WhatIsABPFramework":"Что такое структура ABP?",
"TenantDatabase":"База данных арендаторов {0}",
"SharedDatabase":"Общая база данных",
"ConnectionResolver":"Резолвер соединений",
"TenantBasedDataFilter":"Фильтр данных на основе арендаторов",
"ApplicationCode":"Код приложения",
"TenantResolution":"Резолюция арендатора",
"TenantUser":"Арендатор {0} Пользователь",
"CardTitle":"Название карты",
"View":"Вид",
"Model":"Модель",
"Email":"Электронная почта",
"Password":"Пароль",
"Address":"Адрес",
"Gender":"Пол",
"Male":"Мужской",
"Female":"Женский",
"Submit":"Представлять на рассмотрение",
"Unspecified":"Неопределенные",
"StaticFileMiddleware":"Промежуточное ПО для статических файлов",
"RazorViewEngine":"Механизм просмотра Razor",
"PhysicalFiles":"Физические файлы (wwwroot)",
"EmbeddedFiles":"Встроенные файлы (DLL)",
"DynamicFiles":"Динамические файлы (память)",
"BuildSolutionsWithAbp":"Создавайте удобные в обслуживании решения .NET, следуя передовым практикам разработки программного обеспечения с использованием ABP.",
"MasteringAbpFramework_Book_Key_Features_Description_1":"Создавайте надежные, удобные в обслуживании, модульные и масштабируемые программные решения с помощью ABP Framework.",
"MasteringAbpFramework_Book_Key_Features_Description_2":"Узнайте, как реализовать принципы SOLID и предметно-ориентированное проектирование в ваших веб-приложениях.",
"MasteringAbpFramework_Book_Key_Features_Description_3":"Узнайте, как ABP Framework ускоряет цикл разработки за счет автоматизации повторяющихся задач.",
"MasteringAbpFramework_Book_Description_Details_1":"ABP Framework — это полная инфраструктура для создания современных веб-приложений с помощью следующего программного обеспечения.\n ",
"MasteringAbpFramework_Book_Description_Details_2":"Эта книга, написанная создателем ABP Framework, поможет вам получить полное представление о\n ",
"MasteringAbpFramework_Book_Description_Details_3":"К концу этой книги вы сможете создать полноценное веб-решение, которое легко разрабатывать.\n ",
"MasteringAbpFramework_Book_WhatYouWillLearn":"Что вы узнаете",
"MasteringAbpFramework_Book_What_You_Will_Learn_1":"Настройте среду разработки и начните работу с ABP Framework.",
"MasteringAbpFramework_Book_What_You_Will_Learn_2":"Работайте с Entity Framework Core и MongoDB для разработки уровня доступа к данным.",
"MasteringAbpFramework_Book_What_You_Will_Learn_3":"Поймите сквозные проблемы и то, как ABP автоматизирует повторяющиеся задачи.",
"MasteringAbpFramework_Book_What_You_Will_Learn_4":"Освойте реализацию предметно-ориентированного проектирования с помощью ABP Framework.",
"MasteringAbpFramework_Book_What_You_Will_Learn_5":"Создавайте страницы и компоненты пользовательского интерфейса с помощью ASP.NET Core MVC (Razor Pages) и Blazor.",
"MasteringAbpFramework_Book_What_You_Will_Learn_6":"Работайте с мультитенантностью для создания модульных веб-приложений.",
"MasteringAbpFramework_Book_What_You_Will_Learn_7":"Понимайте модульность и создавайте повторно используемые модули приложений.",
"MasteringAbpFramework_Book_What_You_Will_Learn_8":"Написание модульных, интеграционных и UI-тестов с использованием ABP Framework.",
"MasteringAbpFramework_Book_WhoIsThisBookFor":"Для кого эта книга",
"MasteringAbpFramework_Book_WhoIsThisBookFor_Description":"Эта книга предназначена для веб-разработчиков, которые хотят изучить архитектуру программного обеспечения и лучшие практики создания\n ",
"MicroserviceBookPracticalGuide":"Эта книга представляет собой справочное руководство по разработке и управлению приложениями на основе микросервисов с использованием ABP Framework. <strong>Пример справочного приложения микросервиса .NET</strong>: eShopOnContainers и обсуждает подходы к проектированию архитектуры и реализации с использованием ABP Framework. ",
"IntroducingTheSolution":"Представляем решение eShopOnAbp",
"RunningTheSolution":"Запуск решения",
"UnderstandingTheAuthenticationSystem":"Понимание системы аутентификации",
"BuildingMicroserviceSolutionsShortDescription":"Эта книга представляет собой справочное руководство по разработке и управлению приложениями на основе микросервисов с использованием ABP Framework.",
"InstallAbpCliMessage":"Установите ABP CLI в терминале командной строки, если вы еще не установили его раньше:",
"Terminal":"Терминал",
"Copy":"Копировать",
"RunTheFollowingCommand":"Запустите следующую команду в терминале командной строки:",
"ChangeSolutionOptionsBelow":"Вы можете изменить варианты решения ниже.",
"SingleLayerApplicationExplanation2":"Рекомендуется для создания приложения с более простой и понятной архитектурой.",
"ApplicationModule":"Приложение <br>Модуль",
"SeeTheScreenshot":"Смотрите скриншот",
"ApplicationModuleExplanation1":"Создает многократно используемое, полностью многоуровневое решение модуля приложения.",
"ApplicationModuleExplanation2":"Вы можете использовать эту опцию для создания модулей для вашего модульного приложения.",
"Expert_":"Эксперт",
"Partner_":"партнерство",
"WebSite":"Веб-сайт",
"Expert_Year":"Год экспертизы",
"CompanyInfo":"информация о компании",
"Date":"Дата",
"WhoWeAre_Partner":"Кто мы",
"WhoWeAre_Expert":"Обо мне",
"CreateSolutionFolder":"Создать папку решения",
"CreateSolutionFolderOption":"Указывает, будет ли проект находиться в новой папке в выходной папке или непосредственно в выходной папке."
"CreateSolutionFolderOption":"Указывает, будет ли проект находиться в новой папке в выходной папке или непосредственно в выходной папке.",
"BooksPageTitle":"Книги АБП",
"PackageDetailPage_NuGetPackageInstallationOptions":"Есть три способа установки <code>{0}</code> Пакет NuGet в ваш проект",
"PackageDetailPage_InstallingWithABPCLI":"1. Установка с помощью ABP CLI",
"PackageDetailPage_InstallingWithABPCLIDescription1":"Если вы не установили <a href=\"https://docs.abp.io/en/abp/latest/CLI\">Интерфейс командной строки ABP</a>сначала установите, выполнив следующую команду в терминале командной строки",
"PackageDetailPage_InstallingWithABPCLIDescription2":"После установки ABP CLI откройте терминал командной строки в папке проекта (<code>.csproj</code> файл), вы хотите его установить, и выполните следующую команду",
"PackageDetailPage_InstallingWithABPCLIDescription3":"Это добавит <code>{0}</code> ссылка на пакет вашего проекта и <code>{1}</code> зависимость от вашего класса модуля.",
"PackageDetailPage_ManualInstallation":"2. Установка с помощью Dotnet CLI",
"PackageDetailPage_ManualInstallationDescription1":"Добавлять <code>{0}</code> Ссылка на пакет NuGet для вашего проекта с использованием вашей IDE или выполнением следующей команды",
"PackageDetailPage_ManualInstallationDescription2":"Затем добавьте <code>{0}</code> зависимость от вашего <a href=\"https://docs.abp.io/en/abp/latest/Module-Development-Basics\">класс модуля</a> как показано в следующем примере",
"PackageDetailPage_SeeDocumentation":"<a href=\"{0}\">См. документацию</a> чтобы узнать, как использовать этот пакет в ваших приложениях.",
"PackageDetailPage_InstallingUsingPMC":"3. Установка с помощью консоли диспетчера пакетов",
"PackageDetailPage_InstallingUsingPMCDescription1":"Открой <strong>Консоль диспетчера пакетов</strong> в Visual Studio (Инструменты -> Диспетчер пакетов Nuget -> Консоль диспетчера пакетов) и выполните следующую команду",
"CoolestCompaniesUseABPFramework":"Самые крутые компании используют <span class=\"fw-bold\">Структура ABP</span>",
"Index_Page_Testimonial_1":"ABP Framework — это не просто инструмент, а катализатор, который ускорил мой рост как разработчика. ",
"Index_Page_Testimonial_2":"ABP Framework — это не только платформа, но и руководство по разработке/управлению проектами, поскольку оно обеспечивает обучение DDD, GenericRepository, DI, Microservice и Modularity. ",
"VideosLoginAndRegisterMessage":"Чтобы иметь возможность смотреть видео, вам необходимо войти в систему.",
Both overloads work exactly the same. So, you can use the second one if you don't know the module class type on development time and you (somehow) calculate it on runtime.
If you create one of the methods above, ABP creates an internal service collection (`IServiceCollection`) and an internal service provider (`IServiceProvider`) to setup the [dependency injection](Dependency-Injection.md) system internally. Notice that we've used the `application.ServiceProvider` property in the *Installing a Framework Package* section to resolve the `IEmailSender` service from the dependency injection system.
If you use one of the methods above, ABP creates an internal service collection (`IServiceCollection`) and an internal service provider (`IServiceProvider`) to setup the [dependency injection](Dependency-Injection.md) system internally. Notice that we've used the `application.ServiceProvider` property in the *Installing a Framework Package* section to resolve the `IEmailSender` service from the dependency injection system.
The next overload gets an `IServiceCollection` parameter from you to allow you to setup the dependency injection system yourself, or integrate to another framework (like ASP.NET Core) that also sets up the dependency injection system internally.
@ -269,6 +269,21 @@ public class MyService : ITransientDependency
}
````
#### IInjectPropertiesService
You can use the `IInjectPropertiesService` service to inject properties of an object. Generally, it is a service outside of DI, such as manually created services.
````C#
var injectPropertiesService = serviceProvider.GetRequiredService<IInjectPropertiesService>();
var instance = new TestService();
// Set any properties on instance that can be resolved by IServiceProvider.
You may want to resolve a service directly from ``IServiceProvider``. In that case, you can inject `IServiceProvider` into your class and use the ``GetService`` or the `GetRequiredService` method as shown below:
@ -138,8 +138,8 @@ if (book1.EntityEquals(book2)) //Check equality
ABP does not force you to use aggregate roots, you can in fact use the `Entity` class as defined before. However, if you want to implement the [Domain Driven Design](Domain-Driven-Design.md) and want to create aggregate root classes, there are some best practices you may want to consider:
* An aggregate root is responsible to preserve it's own integrity. This is also true for all entities, but aggregate root has responsibility for it's sub entities too. So, the aggregate root must always be in a valid state.
* An aggregate root can be referenced by it's Id. Do not reference it by it's navigation property.
* An aggregate root is responsible for preserving its own integrity. This is also true for all entities, but the aggregate root has responsibility for its sub-entities too. So, the aggregate root must always be in a valid state.
* An aggregate root can be referenced by its `Id`. Do not reference it by its navigation property.
* An aggregate root is treated as a single unit. It's retrieved and updated as a single unit. It's generally considered as a transaction boundary.
* Work with sub-entities over the aggregate root- do not modify them independently.
@ -241,7 +241,7 @@ While this example may not implement all the best practices of an aggregate root
* `Order` has a public constructor that takes **minimal requirements** to construct an `Order` instance. So, it's not possible to create an order without an id and reference number. The **protected/private** constructor is only necessary to **deserialize** the object while reading from a data source.
* `OrderLine` constructor is internal, so it is only allowed to be created by the domain layer. It's used inside of the `Order.AddProduct` method.
* `Order.AddProduct` implements the business rule to add a product to an order.
* All properties have `protected` setters. This is to prevent the entity from arbitrary changes from outside of the entity. For example, it would be dangerous to set `TotalItemCount` without adding a new product to the order. It's value is maintained by the `AddProduct` method.
* All properties have `protected` setters. This is to prevent the entity from arbitrary changes from outside of the entity. For example, it would be dangerous to set `TotalItemCount` without adding a new product to the order. Its value is maintained by the `AddProduct` method.
ABP Framework does not force you to apply any DDD rule or patterns. However, it tries to make it possible and easier when you do want to apply them. The documentation also follows the same principle.
The 5.0 release of OpenIddict is a major release that introduces breaking changes.
Check this blog [Introducing native applications, per-client token lifetimes and client assertions support in OpenIddict 5.0 preview1](https://kevinchalet.com/2023/10/20/introducing-native-applications-per-client-token-lifetimes-and-client-assertions-support-in-openiddict-5-0-preview1/) for the new features introduced in OpenIddict 5.0.
I will show the changes you need to make to do the migration.
> Please backup your database before doing the migration.
## OpenIddictApplication changes
1. The `Type(string)` of the `OpenIddictApplication` has been renamed to `ClientType(string)`.
2. The `ApplicationType(string)` has been added to the `OpenIddictApplication` entity.
3. The `JsonWebKeySet(string)` has been added to the `OpenIddictApplication` entity.
4. The `Settings(string)` has been added to the `OpenIddictApplication` entity.
1. The `Type(string)` of the `OpenIddictApplicationModel` has been renamed to `ClientType(string)`.
2. The `ApplicationType(string)` has been added to the `OpenIddictApplicationModel` entity.
3. The `JsonWebKeySet`([JsonWebKeySet](https://learn.microsoft.com/en-us/dotnet/api/microsoft.identitymodel.tokens.jsonwebkeyset)) has been added to the `OpenIddictApplicationModel` entity.
4. The `Settings(string)` has been added to the `OpenIddictApplicationModel` entity.
## OpenIddictApplicationDescriptor changes
You have to change the `Type` to `ClientType` when creating a new `AbpApplicationDescriptor` or `OpenIddictApplicationDescriptor`.
````csharp
var application = new AbpApplicationDescriptor {
ClientId = name,
- Type = type,
+ ClientType = type,
ClientSecret = secret,
ConsentType = consentType,
DisplayName = displayName,
````
## OpenIddict Pro module UI changes
You can change the `ApplicationType` when creating/editing a OpenIddict's application, also set time life of the tokens for each application.
@ -170,7 +170,7 @@ If your entity is a soft-delete entity, you can use the `HardDeleteAsync` method
Some features (like soft-delete, multi-tenancy and audit logging) won't work, so use this method carefully when you need it. Use the `DeleteAsync` method if you need to these features.
> Currently only [EF Core supports it](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#basic-executedelete-examples), For the ORMs doesn't support direct delete, we will fallback to the existing `DeleteAsync` method.
> Currently only [EF Core supports it](https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-7.0/whatsnew#basic-executedelete-examples), For the ORMs that don't support direct delete, we will fallback to the existing `DeleteAsync` method.
Note: You should remove the old theme styles from "angular.json" if you are switching from "ThemeBasic" or "Lepton."
Look at the [Theme Configurations](../../UI/Angular/Theme-Configurations) list of styles. Depending on your theme, you can alter your styles in angular.json.
- Finally, remove `ThemeBasicModule` from `app.module.ts`, and import the related modules in `app.module.ts`
Sidebar menus have been used as a **directory for Related Pages** to a **Service** offering, **Navigation** items to a **specific service** or topic and even just as **Links** the user may be interested in.
@ -161,7 +162,7 @@ Sidebar menus have been used as a **directory for Related Pages** to a **Service
///...
this.replaceableComponents.add({
component: YourNewSidebarComponent,
key: eThemeLeptonXComponents.Sidebar,
key: eThemeLeptonXComponents.Navbar,
});
///...
```
@ -262,10 +263,9 @@ The Mobile User-Profile component key is `eThemeLeptonXComponents.MobileUserProf
import { IdentityUserDto } from '@abp/ng.identity/proxy';
import { ToolbarAction, ToolbarActionList } from '@abp/ng.theme.shared/extensions';
import { ToolbarAction, ToolbarActionList } from '@abp/ng.components/extensible';
const logUserNames = new ToolbarAction<IdentityUserDto[]>({
text: 'Click Me!',
@ -94,7 +94,7 @@ We need to have a component before we can pass it to the toolbar action contribu
// src/app/click-me-button.component.ts
import { IdentityUserDto } from '@abp/ng.identity/proxy';
import { ActionData, EXTENSIONS_ACTION_DATA } from '@abp/ng.theme.shared/extensions';
import { ActionData, EXTENSIONS_ACTION_DATA } from '@abp/ng.components/extensible';
import { Component, Inject } from '@angular/core';
@Component({
@ -116,7 +116,7 @@ export class ClickMeButtonComponent {
Here, `EXTENSIONS_ACTION_DATA` token provides us the context from the page toolbar. Therefore, we are able to reach the page data via `record`, which is an array of users, i.e. `IdentityUserDto[]`.
> We could also import `EXTENSIONS_ACTION_CALLBACK` from **@abp/ng.theme.shared/extensions** package, which is a higher order function that triggers the predefined `action` when called. It passes `ActionData` as the first parameter, so you do not have to pass it explicitly. In other words, `EXTENSIONS_ACTION_CALLBACK` can be called without any parameters and it will not fail.
> We could also import `EXTENSIONS_ACTION_CALLBACK` from **@abp/ng.components/extensible** package, which is a higher order function that triggers the predefined `action` when called. It passes `ActionData` as the first parameter, so you do not have to pass it explicitly. In other words, `EXTENSIONS_ACTION_CALLBACK` can be called without any parameters and it will not fail.
### Step 2. Create Toolbar Action Contributors
@ -130,7 +130,7 @@ import {
IdentityToolbarActionContributors
} from '@abp/ng.identity';
import { IdentityUserDto } from '@abp/ng.identity/proxy';
import { ToolbarActionList, ToolbarComponent } from '@abp/ng.theme.shared/extensions';
import { ToolbarActionList, ToolbarComponent } from '@abp/ng.components/extensible';
import { ClickMeButtonComponent } from './click-me-button.component';
const logUserNames = new ToolbarComponent<IdentityUserDto[]>({
This documentation describes how the navigation elements are sorted and how to change this default behaviour.
When you want to add the `Navigation Element` you can use the `RoutesService`. For more details, see the [document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu#how-to-add-a-navigation-element).
However, in this documentation, we will talk more about how to sort the navigation elements with the `order` attribute from the `Routes Service`.
This documentation describes how the navigation elements are sorted and how to change this default behaviour.
- When you want to add the `Navigation Element` you can use the `RoutesService`. For more details, see the [document](https://docs.abp.io/en/abp/latest/UI/Angular/Modifying-the-Menu#how-to-add-a-navigation-element).
- However, in this documentation, we will talk more about how to sort the navigation elements.
### Order Property
- This parameter is optional and is used for sorting purposes.
- If you define this property it will be sorted by the default sorting function.
- You can edit this function.
**Default Compare Function;**
``compare-func.token.ts``
- Normally, you are able to sort your routes with this property. But you can customize our default sorting algorithm.
## Default Sorting algorithm
- To see our default sorting algorithm [click](https://github.com/abpframework/abp/blob/dev/npm/ng-packs/packages/core/src/lib/tokens/compare-func.token.ts) here.
**What does this function do?**
- if the order property is defined, then it will be sorted by the order value.
- if both of the navigation elements have the same order value then it will be sorted by the name.
- If the order property is not defined, it will be the last element and the unordered navs will be sorted by name.
# How to Customize
**`in app.module.ts`**
```ts
export const SORT_COMPARE_FUNC = new InjectionToken<0|1|-1>('SORT_COMPARE_FUNC');
ABP Framework Blazor UI is based on the [Blazorise](https://blazorise.com/docs) and does not have a built-in form validation infrastructure. However, you can use the [Blazorise validation infrastructure](https://blazorise.com/docs/components/validation) to validate your forms.
## Sample
_The example is provided by official Blazorise documentation._
```html
<ValidationValidator="ValidationRule.IsNotEmpty">
<TextEditPlaceholder="Enter name">
<Feedback>
<ValidationNone>Please enter the name.</ValidationNone>
<ValidationSuccess>Name is good.</ValidationSuccess>
"DefaultErrorMessage403":"You are not authorized!",
"DefaultErrorMessage403Detail":"You are not allowed to perform this operation!",
"DefaultErrorMessage404":"Resource not found!",
"DefaultErrorMessage404Detail":"The resource requested could not found on the server!",
"DefaultErrorMessage404Detail":"The resource requested could not be found on the server!",
"EntityNotFoundErrorMessage":"There is no entity {0} with id = {1}!",
"AbpDbConcurrencyErrorMessage":"The data you have submitted has already changed by another user/client. Please discard the changes you've done and try from the beginning.",
AbpAspNetCoreSignalRTestModule.UseConfiguredEndpointsException.Message.ShouldBe($"The hub type {typeof(RegularHubClass12).FullName} is already registered with route pattern {HubRouteAttribute.GetRoutePattern(typeof(RegularHubClass12))}");