mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-09-07 01:56:53 +00:00
♻️ refactor(channels): rebuild channel create/edit drawer with modular sections and improved form UX
Restructure the default-theme channel create/edit experience to align with classic frontend behavior, modern form UX patterns, and the project's Base UI design system. Channel editor architecture: - Split the monolithic channel mutate drawer into focused section components (basic, API access, auth, models, advanced) with shared drawer layout primitives - Extract submission, toast handling, and react-query cache invalidation into `useChannelMutateForm` - Add a dedicated loading skeleton for channel detail fetch during edit mode - Remove the top-level configuration summary block per UX feedback Form validation and data handling: - Strengthen `channel-form` Zod schema with JSON, model mapping, status code mapping, Codex credential, and Vertex AI key refinements - Move type-specific conditional validation into `superRefine` - Normalize base URL formatting and tighten model mapping value validation Model mapping editor: - Add Visual/JSON tabbed editing with inline JSON and duplicate-key feedback - Improve accessibility for icon-only actions and add model suggestion datalists MultiSelect component: - Replace the custom cmdk-based implementation with Base UI Combobox chips - Align focus, border, ring, disabled, and invalid states with standard Input styling via `ComboboxChips` - Preserve existing API (`options`, `selected`, `onChange`, `allowCreate`, `createLabel`) for all current callers - Support inline custom value creation, comma/newline batch input, searchable options, portal-based dropdown positioning, and chip removal Models & groups UX: - Integrate manual custom model entry directly into the model MultiSelect - Remove the separate manual model input/button block - Keep selected-model count and existing model-mapping guardrail behavior i18n: - Add and sync translation keys for new editor sections, validation messages, model mapping UI, and MultiSelect empty/create labels across en, zh, fr, ja, ru, and vi - Remove obsolete keys tied to the deprecated summary and manual model entry UI Affected areas: - `web/default/src/features/channels/components/drawers/` - `web/default/src/features/channels/hooks/use-channel-mutate-form.ts` - `web/default/src/features/channels/lib/channel-form.ts` - `web/default/src/features/channels/lib/model-mapping-validation.ts` - `web/default/src/features/channels/components/model-mapping-editor.tsx` - `web/default/src/components/multi-select.tsx` - `web/default/src/i18n/locales/*.json`
This commit is contained in:
Vendored
+34
-13
@@ -37,7 +37,6 @@
|
||||
"{{count}} IP(s)": "{{count}} IP",
|
||||
"{{count}} log entries removed.": "Удалено {{count}} записей журнала.",
|
||||
"{{count}} minutes ago": "{{count}} минут назад",
|
||||
"{{count}} model(s)": "{{count}} модел(ей)",
|
||||
"{{count}} models": "моделей: {{count}}",
|
||||
"{{count}} months ago": "{{count}} месяцев назад",
|
||||
"{{count}} override": "{{count}} переопределений",
|
||||
@@ -135,6 +134,7 @@
|
||||
"Actual Model": "Фактическая модель",
|
||||
"Actual Model:": "Фактическая модель:",
|
||||
"Add": "Добавить",
|
||||
"Add \"{{value}}\"": "Добавить \"{{value}}\"",
|
||||
"Add {{title}}": "Добавить {{title}}",
|
||||
"Add a group identifier to the auto assignment list.": "Добавить идентификатор группы в список автоматического назначения.",
|
||||
"Add a new API key by providing necessary info.": "Добавьте новый API-ключ, предоставив необходимую информацию.",
|
||||
@@ -152,7 +152,7 @@
|
||||
"Add condition": "Добавить условие",
|
||||
"Add Condition": "Добавить условие",
|
||||
"Add credits": "Добавить средства",
|
||||
"Add custom model(s), comma-separated": "Добавить пользовательскую модель(и), через запятую",
|
||||
"Add custom model \"{{value}}\"": "Добавить пользовательскую модель «{{value}}»",
|
||||
"Add discount tier": "Добавить уровень скидки",
|
||||
"Add each model or tag you want to include.": "Добавьте каждую модель или тег, который хотите включить.",
|
||||
"Add FAQ": "Добавить вопрос-ответ",
|
||||
@@ -164,6 +164,7 @@
|
||||
"Add group rules": "Добавить правила группы",
|
||||
"Add Mapping": "Добавить сопоставление",
|
||||
"Add method": "Добавить метод",
|
||||
"Add missing models": "Добавить отсутствующие модели",
|
||||
"Add Mode": "Добавить режим",
|
||||
"Add model": "Добавить модель",
|
||||
"Add Model": "Добавить модель",
|
||||
@@ -192,7 +193,6 @@
|
||||
"Add User": "Добавить пользователя",
|
||||
"Add user group": "Добавить группу пользователей",
|
||||
"Add your API keys, set up channels and configure access permissions": "Добавьте ваши API-ключи, настройте каналы и права доступа",
|
||||
"Added {{count}} custom model(s)": "Добавлено {{count}} пользовательских моделей",
|
||||
"Added {{count}} model(s)": "Добавлено {{count}} моделей",
|
||||
"Added successfully": "Успешно добавлено",
|
||||
"Additional Conditions": "Дополнительные условия",
|
||||
@@ -201,8 +201,8 @@
|
||||
"Additional Limit": "Доп. лимит",
|
||||
"Additional Limits": "Дополнительные лимиты",
|
||||
"Additional metered capability": "Дополнительная зарезервированная ёмкость (metered)",
|
||||
"Adjust Quota": "Изменить квоту",
|
||||
"Adjust filters, then search to refresh the logs.": "Настройте фильтры, затем выполните поиск, чтобы обновить журналы.",
|
||||
"Adjust Quota": "Изменить квоту",
|
||||
"Adjust response formatting, prompt behavior, proxy, and upstream automation.": "Настройте форматирование ответов, поведение промпта, прокси и автоматизацию upstream.",
|
||||
"Adjust the appearance and layout to suit your preferences.": "Настройте внешний вид и макет в соответствии с вашими предпочтениями.",
|
||||
"Admin": "Администратор",
|
||||
@@ -424,6 +424,11 @@
|
||||
"Audio Tokens": "Аудио токены",
|
||||
"Auth configured": "Аутентификация настроена",
|
||||
"Auth Style": "Стиль аутентификации",
|
||||
"auth.resetPasswordConfirm.backToLogin": "Вернуться ко входу",
|
||||
"auth.resetPasswordConfirm.confirm": "Подтвердить сброс пароля",
|
||||
"auth.resetPasswordConfirm.description": "Подтвердите запрос на сброс, чтобы создать новый пароль.",
|
||||
"auth.resetPasswordConfirm.retry": "Повторить ({{seconds}}с)",
|
||||
"auth.resetPasswordConfirm.success": "Ваш пароль успешно сброшен",
|
||||
"Authentication": "Аутентификация",
|
||||
"Authenticator code": "Код аутентификатора",
|
||||
"Authorization Endpoint": "Конечная точка авторизации",
|
||||
@@ -502,6 +507,7 @@
|
||||
"Base Price": "Базовая цена",
|
||||
"Base rate limit windows for this account.": "Окна базовых лимитов для этого аккаунта.",
|
||||
"Base URL": "Адрес API",
|
||||
"Base URL is required for this channel type": "Для этого типа канала требуется Base URL",
|
||||
"Base URL of your Uptime Kuma instance": "Базовый URL вашего экземпляра Uptime Kuma",
|
||||
"Basic Authentication": "Базовая аутентификация",
|
||||
"Basic Configuration": "Базовая конфигурация",
|
||||
@@ -759,8 +765,10 @@
|
||||
"Codex": "Codex",
|
||||
"Codex Account & Usage": "Аккаунт и использование Codex",
|
||||
"Codex Authorization": "Авторизация Codex",
|
||||
"Codex channels do not support batch creation": "Каналы Codex не поддерживают пакетное создание",
|
||||
"Codex channels use an OAuth JSON credential as the key.": "Каналы Codex используют учётные данные OAuth в формате JSON в качестве ключа.",
|
||||
"Codex CLI Header Passthrough": "Проброс заголовков Codex CLI",
|
||||
"Codex credential must be a JSON object with access_token and account_id": "Учетные данные Codex должны быть JSON-объектом с access_token и account_id",
|
||||
"Cohere": "Cohere",
|
||||
"Collapse": "Свернуть",
|
||||
"Collapse All": "Свернуть все",
|
||||
@@ -867,8 +875,6 @@
|
||||
"Confirm New Password": "Подтвердить новый пароль",
|
||||
"Confirm password": "Подтвердить пароль",
|
||||
"Confirm Payment": "Подтвердить оплату",
|
||||
"auth.resetPasswordConfirm.confirm": "Подтвердить сброс пароля",
|
||||
"auth.resetPasswordConfirm.description": "Подтвердите запрос на сброс, чтобы создать новый пароль.",
|
||||
"Confirm Selection": "Подтвердить выбор",
|
||||
"Confirm settings and finish setup": "Подтвердите настройки и завершите установку",
|
||||
"confirm that I bear legal responsibility arising from deployment": "подтверждаю, что несу юридическую ответственность, возникающую из развертывания",
|
||||
@@ -999,6 +1005,7 @@
|
||||
"Create, revoke, and audit API tokens.": "Создать, отозвать и аудитировать токены API.",
|
||||
"Created": "Создано",
|
||||
"Created At": "Дата создания",
|
||||
"Creates a Pancake product in the saved store using this plan’s title and price. Requires Waffo Pancake to be fully configured in Payment settings first.": "Создает продукт Pancake в сохраненном магазине с названием и ценой этого плана. Сначала необходимо полностью настроить Waffo Pancake в настройках платежей.",
|
||||
"Creating...": "Создание...",
|
||||
"Creation failed": "Создание не удалось",
|
||||
"Credential generated": "Учётные данные созданы",
|
||||
@@ -1122,6 +1129,7 @@
|
||||
"Delete invalid redemption codes": "Удалить недействительные коды активации",
|
||||
"Delete Invalid Redemption Codes?": "Удалить недействительные коды активации?",
|
||||
"Delete logs": "Удалить логи",
|
||||
"Delete mapping": "Удалить сопоставление",
|
||||
"Delete Model": "Удалить модель",
|
||||
"Delete Models?": "Удалить модели?",
|
||||
"Delete Provider": "Удалить провайдер",
|
||||
@@ -1249,6 +1257,8 @@
|
||||
"Drawing task records": "Записи задач рисования",
|
||||
"Duplicate": "Дублировать",
|
||||
"Duplicate group names: {{names}}": "Повторяющиеся имена групп: {{names}}",
|
||||
"Duplicate source model mappings are not allowed": "Повторяющиеся сопоставления исходных моделей не допускаются",
|
||||
"Duplicate source model(s): {{models}}": "Повторяющиеся исходные модели: {{models}}",
|
||||
"Duration": "Длительность",
|
||||
"Duration (hours)": "Длительность (часы)",
|
||||
"Duration Settings": "Настройки срока действия",
|
||||
@@ -2177,6 +2187,7 @@
|
||||
"Load template...": "Загрузить шаблон...",
|
||||
"Loader": "Загрузчик",
|
||||
"Loading": "Загрузка",
|
||||
"Loading channel details": "Загрузка сведений о канале",
|
||||
"Loading configuration": "Загрузка конфигурации",
|
||||
"Loading content settings...": "Загрузка настроек контента...",
|
||||
"Loading current models...": "Загрузка текущих моделей...",
|
||||
@@ -2293,7 +2304,6 @@
|
||||
"Minimum:": "Минимум:",
|
||||
"Minor blips in the last 30 days": "Небольшие сбои за последние 30 дней",
|
||||
"Mint a fresh pair below — or pick an existing one further down. Click Save when ready.": "Создайте новую пару ниже или выберите существующую дальше. Когда будете готовы, нажмите Сохранить.",
|
||||
"Creates a Pancake product in the saved store using this plan’s title and price. Requires Waffo Pancake to be fully configured in Payment settings first.": "Создает продукт Pancake в сохраненном магазине с названием и ценой этого плана. Сначала необходимо полностью настроить Waffo Pancake в настройках платежей.",
|
||||
"Minute": "Минута",
|
||||
"minutes": "минут",
|
||||
"Missing code": "Код отсутствует",
|
||||
@@ -2324,7 +2334,9 @@
|
||||
"Model Mapping": "Сопоставление моделей",
|
||||
"Model Mapping (JSON)": "Сопоставление моделей (JSON)",
|
||||
"Model Mapping must be a JSON object like": "Сопоставление моделей должно быть JSON-объектом, например",
|
||||
"Model mapping must be a JSON object with string values": "Сопоставление моделей должно быть JSON-объектом со строковыми значениями",
|
||||
"Model mapping must be valid JSON": "Сопоставление моделей должно быть допустимым JSON",
|
||||
"Model mapping values must be strings": "Значения сопоставления моделей должны быть строками",
|
||||
"Model name": "Имя модели",
|
||||
"Model Name": "Название модели",
|
||||
"Model Name *": "Имя модели *",
|
||||
@@ -2333,8 +2345,8 @@
|
||||
"Model not found": "Модель не найдена",
|
||||
"Model performance metrics": "Метрики производительности моделей",
|
||||
"Model Price": "Цена модели",
|
||||
"Model Price Not Configured": "Цена модели не настроена",
|
||||
"Model price is not configured. Please complete model pricing in settings.": "Цена модели не настроена. Заполните тарификацию модели в настройках.",
|
||||
"Model Price Not Configured": "Цена модели не настроена",
|
||||
"Model prices": "Цены моделей",
|
||||
"Model prices reset successfully": "Цены моделей успешно сброшены",
|
||||
"Model Pricing": "Тарификация моделей",
|
||||
@@ -2532,6 +2544,7 @@
|
||||
"No Logs Found": "Логи не найдены",
|
||||
"No mappings configured. Click \"Add Row\" to get started.": "Нет настроенных сопоставлений. Нажмите \"Добавить строку\", чтобы начать.",
|
||||
"No matches found": "Совпадений не найдено",
|
||||
"No matching items": "Нет подходящих элементов",
|
||||
"No matching results": "Нет совпадений",
|
||||
"No matching rules": "Нет совпадающих правил",
|
||||
"No messages yet": "Сообщений пока нет",
|
||||
@@ -2950,6 +2963,7 @@
|
||||
"Please upload key file(s)": "Загрузите ключевой файл(ы)",
|
||||
"Please wait a moment before trying again.": "Пожалуйста, подождите немного и попробуйте снова.",
|
||||
"Please wait a moment, human check is initializing...": "Пожалуйста, подождите немного, инициализация проверки человеком...",
|
||||
"Please wait before editing to avoid overwriting saved values.": "Дождитесь загрузки перед редактированием, чтобы не перезаписать сохраненные значения.",
|
||||
"Policy JSON": "JSON политики",
|
||||
"Polling": "Опрос",
|
||||
"Polling mode requires Redis and memory cache, otherwise performance will be significantly degraded": "Режим опроса требует Redis и кэш памяти, в противном случае производительность будет значительно снижена",
|
||||
@@ -2983,6 +2997,7 @@
|
||||
"Prepend to Start": "Добавить в начало",
|
||||
"Prepend value to array / string / object start": "Добавить значение в начало массива / строки / объекта",
|
||||
"Preserve the original field when applying this rule": "Сохранять исходное поле при применении этого правила",
|
||||
"Preset groups": "Предустановленные группы",
|
||||
"Preset recharge amounts (JSON array)": "Предустановленные суммы пополнения (массив JSON)",
|
||||
"Preset recharge amounts displayed to users": "Предустановленные суммы пополнения, отображаемые пользователям",
|
||||
"Preset Template": "Предустановленный шаблон",
|
||||
@@ -3098,6 +3113,7 @@
|
||||
"Querying...": "Выполняется запрос...",
|
||||
"Question": "Вопрос",
|
||||
"Queued": "В очереди",
|
||||
"Quick actions": "Быстрые действия",
|
||||
"Quick insert common payment methods": "Быстрая вставка распространенных способов оплаты",
|
||||
"Quick Range": "Быстрый диапазон",
|
||||
"Quick Setup from Preset": "Быстрая настройка из предустановки",
|
||||
@@ -3219,6 +3235,7 @@
|
||||
"Remaining:": "Осталось:",
|
||||
"Remark": "Примечания",
|
||||
"Remove": "Удалить",
|
||||
"Remove {{value}}": "Удалить {{value}}",
|
||||
"Remove ${{amount}}": "Удалить ${{amount}}",
|
||||
"Remove all log entries created before the selected timestamp.": "Удалить все записи журнала, созданные до выбранной отметки времени.",
|
||||
"Remove attachment": "Удалить вложение",
|
||||
@@ -3226,6 +3243,7 @@
|
||||
"Remove Duplicates": "Удалить дубликаты",
|
||||
"Remove filter": "Удалить фильтр",
|
||||
"Remove functionResponse.id field": "Удалить поле functionResponse.id",
|
||||
"Remove mapped targets": "Удалить сопоставленные цели",
|
||||
"Remove Models": "Удалить модели",
|
||||
"Remove Passkey": "Отвязать Passkey",
|
||||
"Remove Passkey?": "Удалить ключ доступа?",
|
||||
@@ -3329,7 +3347,6 @@
|
||||
"Retain last N files": "Хранить последние N файлов",
|
||||
"Retention days": "Дней хранения",
|
||||
"Retry": "Повторить попытку",
|
||||
"auth.resetPasswordConfirm.retry": "Повторить ({{seconds}}с)",
|
||||
"Retry Chain": "Цепочка повторов",
|
||||
"Retry Suggestion": "Рекомендация по повтору",
|
||||
"Retry Times": "Количество повторных попыток",
|
||||
@@ -3339,7 +3356,6 @@
|
||||
"Return Error": "Вернуть ошибку",
|
||||
"Return per-token log probabilities": "Возвращать логарифмические вероятности по токенам",
|
||||
"Return to dashboard": "Вернуться на панель управления",
|
||||
"auth.resetPasswordConfirm.backToLogin": "Вернуться ко входу",
|
||||
"Return vector embeddings for inputs": "Возвращать векторные эмбеддинги для входных данных",
|
||||
"Reveal API key": "Показать API ключ",
|
||||
"Reveal key": "Показать ключ",
|
||||
@@ -3491,7 +3507,6 @@
|
||||
"Select all (filtered)": "& Выбрать все отфильтрованные",
|
||||
"Select all models": "Выбрать все модели",
|
||||
"Select All Visible": "Выбрать все видимые",
|
||||
"Select model {{model}}": "Выбрать модель {{model}}",
|
||||
"Select an operation mode and enter the amount": "Выберите режим операции и введите сумму",
|
||||
"Select announcement type": "Выбрать тип объявления",
|
||||
"Select at least one field to overwrite.": "Выберите хотя бы одно поле для перезаписи.",
|
||||
@@ -3518,6 +3533,7 @@
|
||||
"Select layout style": "Выбрать стиль макета",
|
||||
"Select locations": "Выбрать локации",
|
||||
"Select Model": "Выбрать модель",
|
||||
"Select model {{model}}": "Выбрать модель {{model}}",
|
||||
"Select models (empty for allow all)": "Выбрать модели (пусто для разрешения всех)",
|
||||
"Select models and apply to channel models list.": "Выберите модели и примените к списку моделей каналов.",
|
||||
"Select models or add custom ones": "Выбрать модели или добавить пользовательские",
|
||||
@@ -3547,6 +3563,7 @@
|
||||
"Select vendor": "Выбрать поставщика",
|
||||
"Selectable groups": "Выбираемые группы",
|
||||
"selected": "выбрано",
|
||||
"Selected {{count}}": "Выбрано: {{count}}",
|
||||
"selected channel(s). Leave empty to remove tag.": "выбранный канал(ы). Оставьте пустым, чтобы удалить тег.",
|
||||
"Selected conflicts were overwritten successfully.": "Выбранные конфликты успешно перезаписаны.",
|
||||
"Selected when creating a token and used as the default billing group for API calls.": "Выбирается при создании токена и используется как группа тарификации по умолчанию для вызовов API.",
|
||||
@@ -3690,6 +3707,7 @@
|
||||
"Status & Sync": "Статус и синхронизация",
|
||||
"Status Code": "Код статуса",
|
||||
"Status Code Mapping": "Сопоставление кодов состояния",
|
||||
"Status code mapping must use valid HTTP status codes": "Сопоставление кодов состояния должно использовать допустимые HTTP-коды",
|
||||
"Status Page Slug": "Slug страницы статуса",
|
||||
"Status short": "Стат.",
|
||||
"Status:": "Статус:",
|
||||
@@ -3897,6 +3915,7 @@
|
||||
"This action will permanently remove 2FA protection from your account.": "Это действие безвозвратно удалит защиту 2FA из вашей учетной записи.",
|
||||
"This channel is not an Ollama channel.": "Этот канал не является каналом Ollama.",
|
||||
"This channel type does not support fetching models": "Этот тип канала не поддерживает получение моделей",
|
||||
"This channel type requires additional configuration": "Для этого типа канала требуется дополнительная конфигурация",
|
||||
"This confirmation unlocks payment, redemption code, subscription plan, and invitation reward features. Please read the statements carefully.": "Это подтверждение разблокирует функции платежей, кодов пополнения, планов подписки и наград за приглашения. Внимательно прочитайте заявления.",
|
||||
"This controls model request rate limiting. Web/API route throttling is configured by environment variables and may still return 429.": "Этот параметр управляет ограничением частоты запросов к моделям. Ограничение маршрутов Web/API настраивается переменными окружения и всё ещё может возвращать 429.",
|
||||
"This data may be unreliable, use with caution": "Эти данные могут быть ненадежными, используйте с осторожностью",
|
||||
@@ -4215,6 +4234,7 @@
|
||||
"Use external tools to extend capabilities": "Использовать внешние инструменты для расширения возможностей",
|
||||
"Use our unified OpenAI-compatible endpoint in your applications": "Используйте наш единый OpenAI-совместимый эндпоинт в ваших приложениях",
|
||||
"Use Passkey to sign in without entering your password.": "Используйте ключ доступа для входа без ввода пароля.",
|
||||
"Use presets or upstream discovery to populate the model list faster.": "Используйте пресеты или обнаружение upstream, чтобы быстрее заполнить список моделей.",
|
||||
"Use secure connection when sending emails": "Использовать безопасное соединение при отправке электронных писем",
|
||||
"Use sidebar shortcut": "Использовать ярлык боковой панели",
|
||||
"Use the full-width table to scan prices, then select a row to edit it here.": "Просмотрите цены в таблице, затем выберите строку для редактирования здесь.",
|
||||
@@ -4302,8 +4322,10 @@
|
||||
"Verifying credentials and pulling stores from your Pancake account...": "Проверяем учетные данные и загружаем магазины из вашего аккаунта Pancake...",
|
||||
"Version Overrides": "Переопределения версий",
|
||||
"Vertex AI": "Vertex AI",
|
||||
"Vertex AI API Key mode does not support batch creation": "Режим API Key Vertex AI не поддерживает пакетное создание",
|
||||
"Vertex AI does not support functionResponse.id. Enable this to remove the field automatically.": "Vertex AI не поддерживает functionResponse.id. Включите, чтобы автоматически удалить это поле.",
|
||||
"Vertex AI Key Format": "Формат ключа Vertex AI",
|
||||
"Vertex AI service account key must be valid JSON": "Ключ сервисного аккаунта Vertex AI должен быть допустимым JSON",
|
||||
"Video": "Видео",
|
||||
"Video length in seconds": "Длительность видео в секундах",
|
||||
"Video Remix": "Ремикс видео",
|
||||
@@ -4334,7 +4356,7 @@
|
||||
"Visit Settings → General and adjust quota options...": "Перейдите в Настройки → Общие и настройте параметры квоты...",
|
||||
"Visitors must authenticate before accessing the pricing directory.": "Посетители должны пройти аутентификацию перед доступом к каталогу цен.",
|
||||
"Visitors must authenticate before accessing the rankings page.": "Посетители должны пройти аутентификацию перед доступом к странице рейтингов.",
|
||||
"Visual": "Визуальный",
|
||||
"Visual": "Визуально",
|
||||
"Visual edit": "Визуальное редактирование",
|
||||
"Visual editor": "Визуальный редактор",
|
||||
"Visual Editor": "Визуальный редактор",
|
||||
@@ -4466,7 +4488,6 @@
|
||||
"Your GitHub OAuth Client ID": "Ваш ID клиента GitHub OAuth",
|
||||
"Your GitHub OAuth Client Secret": "Ваш секрет клиента GitHub OAuth",
|
||||
"Your new backup codes are ready": "Ваши новые резервные коды готовы",
|
||||
"auth.resetPasswordConfirm.success": "Ваш пароль успешно сброшен",
|
||||
"Your Referral Link": "Ваша реферальная ссылка",
|
||||
"Your setup guide is collapsed so usage stays in focus.": "Руководство свернуто, чтобы основные показатели оставались в фокусе.",
|
||||
"Your system access token for API authentication. Keep it secure and don't share it with others.": "Ваш системный токен доступа для аутентификации API. Храните его в безопасности и не делитесь им с другими.",
|
||||
|
||||
Reference in New Issue
Block a user