mirror of
https://github.com/lobehub/lobehub
synced 2026-04-21 17:47:27 +00:00
* 🐛 fix: add unsaved changes guard to prevent data loss on navigation Migrate from BrowserRouter to createBrowserRouter (data router API) to enable route-level navigation blocking. Add UnsavedChangesGuard component that uses useBlocker to prevent leaving editor pages with unsaved changes, auto-saving before navigation. Remove legacy renderRoutes/RouteConfig dead code. Fixes LOBE-4973 * 🔧 chore: remove unused ESLint suppressions for welcome.ts Cleaned up eslint-suppressions.json by removing suppressions related to sort-keys-fix and typescript-sort-keys for welcome.ts, as they are no longer needed. Signed-off-by: Innei <tukon479@gmail.com> * ⚡ perf: skip JSON snapshot on selection-only Lexical updates Reintroduce dirtyElements/dirtyLeaves guard before editor.getDocument('json') and deep-equality check, avoiding O(document-size) work on caret/selection updates that do not mutate content. * 🔧 test: update UnsavedChangesGuard tests to use message.destroy instead of message.success Signed-off-by: Innei <tukon479@gmail.com> * fix: dayjs init - Moved dayjs plugin extensions (relativeTime, utc, isToday, isYesterday) to src/initialize.ts for centralized initialization. - Removed redundant extensions from individual components to prevent duplicate calls. - Updated locale loading logic in Locale.tsx to ensure correct dayjs locale handling. This change improves performance by ensuring dayjs plugins are only extended once during application initialization. Signed-off-by: Innei <tukon479@gmail.com> * refactor: update router configuration to use RouteObject type - Changed the type of desktopRoutes from RouteConfig[] to RouteObject[] for better compatibility with react-router-dom. - Removed the RouteConfig interface from the router utility file to streamline the codebase. This refactor enhances the router's integration with the latest routing library standards. Signed-off-by: Innei <tukon479@gmail.com> * feat: enhance Vite configuration and chunk management - Added a function to suppress Vite's default URL print in the server configuration. - Updated chunk file naming strategy in sharedRollupOutput to organize output files into specific directories based on chunk type (i18n, vendor, assets). - Removed redundant dayjs chunk handling logic to streamline the manualChunks function. These changes improve the clarity of the build output and enhance the server's configuration options. Signed-off-by: Innei <tukon479@gmail.com> * ✨ feat: add collapsible error stack with __CI__ default expand - Add Collapse + Highlighter for error stack in Error component - Define __CI__ in Vite (sharedRendererDefine) based on process.env.CI - Add __CI__ to global.d.ts - Add error.stack i18n to all 18 locales Made-with: Cursor * chore: update build:spa:copy script to handle multiple asset directories - Modified the build:spa:copy script in package.json to iterate over multiple directories (assets, i18n, vendor) for both desktop and mobile builds, improving the asset copying process. This change enhances the build process by ensuring all relevant directories are copied correctly. Signed-off-by: Innei <tukon479@gmail.com> * 🐛 fix: mark initialize.ts as sideEffects to prevent tree-shaking sideEffects: false caused Rollup to drop the side-effect-only import of initialize.ts, removing dayjs.extend(relativeTime) and enableMapSet() from the production bundle. --------- Signed-off-by: Innei <tukon479@gmail.com>
158 lines
24 KiB
JSON
158 lines
24 KiB
JSON
{
|
||
"error.backHome": "Вернуться на главную",
|
||
"error.desc": "Попробуйте позже или вернитесь в знакомый мир.",
|
||
"error.retry": "Перезагрузить",
|
||
"error.stack": "Стек ошибок",
|
||
"error.title": "Упс, что-то пошло не так...",
|
||
"fetchError.detail": "Детали ошибки",
|
||
"fetchError.title": "Запрос не выполнен",
|
||
"import.importConfigFile.description": "Причина ошибки: {{reason}}",
|
||
"import.importConfigFile.title": "Не удалось импортировать",
|
||
"import.incompatible.description": "Этот файл был экспортирован из более новой версии. Пожалуйста, обновите приложение до последней версии и повторите импорт.",
|
||
"import.incompatible.title": "Текущая версия приложения не поддерживает импорт этого файла",
|
||
"inviteCode.continue": "Продолжить",
|
||
"inviteCode.currentEmail": "Текущий аккаунт: {{email}}",
|
||
"inviteCode.desc": "Для доступа к LobeHub требуется код приглашения. Пожалуйста, введите действительный код, чтобы продолжить.",
|
||
"inviteCode.friends": "Друзья",
|
||
"inviteCode.joinUsOn": "Присоединяйтесь к нам на",
|
||
"inviteCode.lookingForInvite": "Ищете приглашение?",
|
||
"inviteCode.notYou": "Это не вы?",
|
||
"inviteCode.openingInStages": "открывается поэтапно.",
|
||
"inviteCode.placeholder": "Код или ссылка приглашения",
|
||
"inviteCode.pleaseEnterCode": "Введите код приглашения, чтобы продолжить.",
|
||
"inviteCode.switchAccount": "Сменить аккаунт",
|
||
"inviteCode.title": "Требуется код приглашения",
|
||
"loginRequired.desc": "Вы будете перенаправлены на страницу входа в ближайшее время",
|
||
"loginRequired.title": "Пожалуйста, войдите в систему, чтобы использовать эту функцию",
|
||
"notFound.backHome": "Вернуться на главную",
|
||
"notFound.check": "Проверьте правильность введённого URL.",
|
||
"notFound.desc": "Мы не смогли найти страницу, которую вы ищете.",
|
||
"notFound.title": "Вы попали в неизведанную область?",
|
||
"pluginSettings.desc": "Завершите настройку ниже, чтобы начать использовать этот навык",
|
||
"pluginSettings.title": "Настройки навыка {{name}}",
|
||
"response.400": "Извините, сервер не понимает ваш запрос. Убедитесь, что параметры запроса указаны верно.",
|
||
"response.401": "Извините, сервер отклонил ваш запрос, возможно, из-за недостаточных прав или недействительной аутентификации.",
|
||
"response.403": "Извините, у вас нет доступа к этому ресурсу.",
|
||
"response.404": "Извините, сервер не может найти запрашиваемую страницу или ресурс. Проверьте правильность URL.",
|
||
"response.405": "Извините, сервер не поддерживает используемый вами метод запроса. Убедитесь, что метод запроса корректен.",
|
||
"response.406": "Извините, сервер не может выполнить запрос на основе характеристик запрашиваемого контента.",
|
||
"response.407": "Извините, необходимо пройти аутентификацию прокси перед продолжением запроса.",
|
||
"response.408": "Извините, сервер не дождался запроса. Проверьте подключение к сети и повторите попытку.",
|
||
"response.409": "Извините, запрос не может быть обработан из-за конфликта, возможно, состояние ресурса несовместимо с запросом.",
|
||
"response.410": "Извините, запрашиваемый ресурс был удалён и более недоступен.",
|
||
"response.411": "Извините, сервер не может обработать запрос без указания длины содержимого.",
|
||
"response.412": "Извините, ваш запрос не соответствует условиям сервера и не может быть выполнен.",
|
||
"response.413": "Извините, данные запроса слишком велики для обработки сервером.",
|
||
"response.414": "Извините, URI запроса слишком длинный для обработки сервером.",
|
||
"response.415": "Извините, сервер не может обработать формат медиафайла, прикреплённого к запросу.",
|
||
"response.416": "Извините, сервер не может удовлетворить указанный диапазон запроса.",
|
||
"response.417": "Извините, сервер не может выполнить ваши ожидания.",
|
||
"response.422": "Извините, формат запроса корректен, но из-за семантических ошибок он не может быть обработан.",
|
||
"response.423": "Извините, запрашиваемый ресурс заблокирован.",
|
||
"response.424": "Извините, текущий запрос не может быть выполнен из-за ошибки в предыдущем запросе.",
|
||
"response.426": "Извините, сервер требует обновления клиента до более новой версии протокола.",
|
||
"response.428": "Извините, сервер требует предварительного условия. Убедитесь, что ваш запрос содержит соответствующий заголовок.",
|
||
"response.429": "Извините, вы отправляете слишком много запросов. Пожалуйста, попробуйте позже.",
|
||
"response.431": "Извините, поля заголовка вашего запроса слишком велики для обработки сервером.",
|
||
"response.451": "Извините, сервер отказывается предоставить этот ресурс по юридическим причинам.",
|
||
"response.499": "Извините, ваш запрос был неожиданно прерван во время обработки сервером, возможно, из-за отмены операции или нестабильного соединения. Проверьте сеть и повторите попытку.",
|
||
"response.500": "Извините, на сервере возникли трудности. Пожалуйста, попробуйте позже.",
|
||
"response.501": "Извините, сервер пока не знает, как обработать этот запрос. Убедитесь, что операция корректна.",
|
||
"response.502": "Извините, сервер временно недоступен. Пожалуйста, попробуйте позже.",
|
||
"response.503": "Извините, сервер перегружен или на обслуживании. Пожалуйста, попробуйте позже.",
|
||
"response.504": "Извините, сервер не получил ответ от вышестоящего сервера. Пожалуйста, попробуйте позже.",
|
||
"response.505": "Извините, сервер не поддерживает используемую вами версию HTTP. Обновите и повторите попытку.",
|
||
"response.506": "Извините, возникла проблема с конфигурацией сервера. Обратитесь к администратору.",
|
||
"response.507": "Извините, на сервере недостаточно места для обработки запроса. Пожалуйста, попробуйте позже.",
|
||
"response.509": "Извините, исчерпана пропускная способность сервера. Пожалуйста, попробуйте позже.",
|
||
"response.510": "Извините, сервер не поддерживает запрошенное расширение. Обратитесь к администратору.",
|
||
"response.520": "Извините, на сервере произошла непредвиденная ошибка. Мы работаем над её устранением. Пожалуйста, попробуйте позже.",
|
||
"response.522": "Извините, соединение с сервером прервано по тайм-ауту. Возможно, сеть нестабильна или сервер временно недоступен. Пожалуйста, попробуйте позже.",
|
||
"response.524": "Извините, сервер не дождался ответа. Возможно, ответ был слишком медленным. Пожалуйста, попробуйте позже.",
|
||
"response.AgentRuntimeError": "Ошибка выполнения языковой модели Lobe. Пожалуйста, устраните проблему или повторите попытку, используя информацию ниже.",
|
||
"response.ComfyUIBizError": "Произошла ошибка при запросе к сервису ComfyUI. Пожалуйста, устраните проблему или повторите попытку.",
|
||
"response.ComfyUIEmptyResult": "ComfyUI не сгенерировал изображение. Проверьте конфигурацию модели или повторите попытку.",
|
||
"response.ComfyUIModelError": "Не удалось загрузить модель ComfyUI. Убедитесь, что файл модели существует.",
|
||
"response.ComfyUIServiceUnavailable": "Не удалось подключиться к сервису ComfyUI. Убедитесь, что он работает и URL сервиса указан верно.",
|
||
"response.ComfyUIUploadFailed": "Не удалось загрузить изображение в ComfyUI. Проверьте соединение с сервером или повторите попытку.",
|
||
"response.ComfyUIWorkflowError": "Ошибка выполнения рабочего процесса ComfyUI. Проверьте конфигурацию.",
|
||
"response.ConnectionCheckFailed": "Запрос вернул пустой результат. Убедитесь, что адрес прокси API не заканчивается на `/v1`.",
|
||
"response.CreateMessageError": "Извините, сообщение не удалось отправить. Скопируйте содержимое и попробуйте снова. Сообщение не будет сохранено после обновления страницы.",
|
||
"response.ExceededContextWindow": "Содержимое запроса превышает допустимую длину модели. Уменьшите объём и повторите попытку.",
|
||
"response.FreePlanLimit": "Вы используете бесплатный тариф и не можете воспользоваться этой функцией. Пожалуйста, перейдите на платный тариф.",
|
||
"response.GoogleAIBlockReason.BLOCKLIST": "Ваш запрос содержит запрещённые термины. Пожалуйста, отредактируйте ввод и повторите попытку.",
|
||
"response.GoogleAIBlockReason.IMAGE_SAFETY": "Сгенерированное изображение было заблокировано по соображениям безопасности. Измените запрос.",
|
||
"response.GoogleAIBlockReason.LANGUAGE": "Используемый язык не поддерживается. Попробуйте использовать английский или другой поддерживаемый язык.",
|
||
"response.GoogleAIBlockReason.OTHER": "Контент был заблокирован по неизвестной причине. Попробуйте переформулировать запрос.",
|
||
"response.GoogleAIBlockReason.PROHIBITED_CONTENT": "Ваш запрос может содержать запрещённый контент. Отредактируйте его в соответствии с правилами использования.",
|
||
"response.GoogleAIBlockReason.RECITATION": "Ваш запрос был заблокирован из-за возможных нарушений авторских прав. Используйте оригинальный контент или переформулируйте запрос.",
|
||
"response.GoogleAIBlockReason.SAFETY": "Ваш запрос был заблокирован по соображениям безопасности. Измените его, чтобы избежать потенциально опасного или неприемлемого контента.",
|
||
"response.GoogleAIBlockReason.SPII": "Ваш запрос может содержать конфиденциальную личную информацию. Удалите такие данные и повторите попытку.",
|
||
"response.GoogleAIBlockReason.default": "Контент заблокирован: {{blockReason}}. Пожалуйста, отредактируйте запрос и повторите попытку.",
|
||
"response.InsufficientQuota": "Извините, достигнут лимит по ключу. Проверьте баланс аккаунта или увеличьте квоту ключа.",
|
||
"response.InvalidAccessCode": "Неверный или пустой код доступа. Введите корректный код или добавьте пользовательский API-ключ.",
|
||
"response.InvalidBedrockCredentials": "Ошибка аутентификации Bedrock. Проверьте AccessKeyId/SecretAccessKey и повторите попытку.",
|
||
"response.InvalidComfyUIArgs": "Некорректная конфигурация ComfyUI. Проверьте настройки и повторите попытку.",
|
||
"response.InvalidGithubToken": "Неверный или пустой GitHub Personal Access Token. Проверьте токен и повторите попытку.",
|
||
"response.InvalidOllamaArgs": "Некорректная конфигурация Ollama. Проверьте настройки и повторите попытку.",
|
||
"response.InvalidProviderAPIKey": "Неверный или пустой API-ключ для {{provider}}. Проверьте ключ и повторите попытку.",
|
||
"response.InvalidVertexCredentials": "Ошибка аутентификации Vertex. Проверьте данные и повторите попытку.",
|
||
"response.LocationNotSupportError": "Извините, в вашем регионе эта модель недоступна. Попробуйте использовать другой регион.",
|
||
"response.ModelNotFound": "Извините, модель не найдена. Возможно, она не существует или у вас нет доступа. Попробуйте изменить API-ключ или настройки доступа.",
|
||
"response.NoOpenAIAPIKey": "API-ключ OpenAI не указан. Пожалуйста, добавьте пользовательский ключ.",
|
||
"response.OllamaBizError": "Ошибка при запросе к сервису Ollama. Пожалуйста, устраните проблему или повторите попытку.",
|
||
"response.OllamaServiceUnavailable": "Сервис Ollama недоступен. Убедитесь, что он работает и правильно настроен CORS.",
|
||
"response.PermissionDenied": "Извините, у вас нет доступа к этой функции. Проверьте права доступа ключа.",
|
||
"response.PluginApiNotFound": "Извините, API не найден в манифесте навыка. Проверьте соответствие метода запроса.",
|
||
"response.PluginApiParamsError": "Извините, параметры запроса к навыку некорректны. Проверьте соответствие описанию API.",
|
||
"response.PluginFailToTransformArguments": "Извините, не удалось разобрать аргументы навыка. Попробуйте сгенерировать сообщение заново или использовать более мощную модель с поддержкой Tools Calling.",
|
||
"response.PluginGatewayError": "Извините, произошла ошибка шлюза навыка. Проверьте конфигурацию.",
|
||
"response.PluginManifestInvalid": "Извините, манифест навыка некорректен. Проверьте формат.",
|
||
"response.PluginManifestNotFound": "Извините, файл манифеста навыка (manifest.json) не найден. Проверьте адрес.",
|
||
"response.PluginMarketIndexInvalid": "Извините, индекс навыка некорректен. Проверьте формат файла.",
|
||
"response.PluginMarketIndexNotFound": "Извините, индекс навыка не найден. Проверьте адрес.",
|
||
"response.PluginMetaInvalid": "Извините, метаданные навыка некорректны. Проверьте формат.",
|
||
"response.PluginMetaNotFound": "Извините, навык не найден в индексе. Проверьте конфигурацию.",
|
||
"response.PluginOpenApiInitError": "Извините, не удалось инициализировать OpenAPI-клиент. Проверьте конфигурацию.",
|
||
"response.PluginServerError": "Ошибка при запросе к серверу навыка. Проверьте манифест, конфигурацию или реализацию сервера.",
|
||
"response.PluginSettingsInvalid": "Навык необходимо правильно настроить перед использованием. Проверьте конфигурацию.",
|
||
"response.ProviderBizError": "Ошибка при запросе к сервису {{provider}}. Пожалуйста, устраните проблему или повторите попытку.",
|
||
"response.QuotaLimitReached": "Извините, достигнут лимит токенов или запросов по ключу. Увеличьте квоту или повторите позже.",
|
||
"response.ServerAgentRuntimeError": "Извините, сервис Agent временно недоступен. Повторите попытку позже или свяжитесь с нами по электронной почте.",
|
||
"response.StreamChunkError": "Ошибка при разборе потока сообщений. Убедитесь, что API соответствует спецификации, или обратитесь к провайдеру.",
|
||
"response.SubscriptionKeyMismatch": "Извините, из-за временного сбоя ваша подписка неактивна. Нажмите кнопку ниже для восстановления или свяжитесь с нами по электронной почте.",
|
||
"response.SubscriptionPlanLimit": "Ваши баллы по подписке исчерпаны. Обновите тариф или настройте пользовательский API.",
|
||
"response.SubscriptionPlanLimitUltimate": "Ваши баллы по подписке исчерпаны. Пополните счёт или настройте пользовательский API.",
|
||
"response.SystemTimeNotMatchError": "Извините, системное время не совпадает с сервером. Проверьте настройки времени.",
|
||
"response.UnknownChatFetchError": "Извините, произошла неизвестная ошибка запроса. Проверьте информацию ниже или повторите попытку.",
|
||
"stt.responseError": "Ошибка запроса к сервису. Проверьте настройки или повторите попытку.",
|
||
"supervisor.decisionFailed": "Ведущий группы не может функционировать. Проверьте конфигурацию модели, API-ключа и конечной точки.",
|
||
"testConnectionFailed": "Ошибка тестового соединения: {{error}}",
|
||
"tts.responseError": "Ошибка запроса к сервису. Проверьте настройки или повторите попытку.",
|
||
"unlock.addProxyUrl": "Добавить прокси-URL OpenAI (необязательно)",
|
||
"unlock.apiKey.description": "Введите ваш API-ключ {{name}}, чтобы начать сессию",
|
||
"unlock.apiKey.imageGenerationDescription": "Введите ваш API-ключ {{name}}, чтобы начать генерацию",
|
||
"unlock.apiKey.title": "Использовать пользовательский API-ключ {{name}}",
|
||
"unlock.closeMessage": "Закрыть сообщение",
|
||
"unlock.comfyui.description": "Введите действительные учётные данные {{name}}, чтобы начать генерацию изображений.",
|
||
"unlock.comfyui.modifyBaseUrl": "Изменить URL сервиса ComfyUI",
|
||
"unlock.comfyui.title": "Подтвердите учётные данные {{name}}",
|
||
"unlock.confirm": "Подтвердить и повторить",
|
||
"unlock.goToSettings": "Перейти в настройки",
|
||
"unlock.oauth.description": "Администратор включил единую аутентификацию. Нажмите кнопку ниже, чтобы войти и разблокировать приложение.",
|
||
"unlock.oauth.success": "Вход выполнен успешно",
|
||
"unlock.oauth.title": "Войдите в свой аккаунт",
|
||
"unlock.oauth.welcome": "Добро пожаловать!",
|
||
"unlock.password.description": "Администратор включил шифрование приложения. Введите пароль для разблокировки. Пароль вводится один раз.",
|
||
"unlock.password.placeholder": "Введите пароль",
|
||
"unlock.password.title": "Введите пароль для разблокировки приложения",
|
||
"unlock.tabs.apiKey": "Пользовательский API-ключ",
|
||
"unlock.tabs.password": "Пароль",
|
||
"upload.desc": "Детали: {{detail}}",
|
||
"upload.fileOnlySupportInServerMode": "Текущий режим развертывания не поддерживает загрузку не изображений. Чтобы загрузить файлы формата {{ext}}, переключитесь на серверный режим или используйте сервис {{cloud}}.",
|
||
"upload.networkError": "Проверьте подключение к сети и убедитесь, что CORS настроен правильно для сервиса хранения файлов.",
|
||
"upload.storageLimitExceeded": "Вы достигли лимита хранилища файлов по вашему тарифному плану. Пожалуйста, обновите тариф или удалите неиспользуемые файлы, чтобы освободить место.",
|
||
"upload.title": "Ошибка загрузки файла. Проверьте подключение или повторите попытку позже.",
|
||
"upload.unknownError": "Причина ошибки: {{reason}}",
|
||
"upload.uploadFailed": "Не удалось загрузить файл."
|
||
}
|