diff --git a/frontend/scripts/check-i18n-parity.mjs b/frontend/scripts/check-i18n-parity.mjs
index dd7acf207..3b5566217 100644
--- a/frontend/scripts/check-i18n-parity.mjs
+++ b/frontend/scripts/check-i18n-parity.mjs
@@ -382,6 +382,18 @@ const TR_COGNATES = [
'{{filament}} @ {{temp}}°C', // drying badge: filament code + universal °C
];
+const RU_COGNATES = [
+ 'MakerWorld: {{designer}}',
+ 'email',
+ '{{printer}}: {{error}}',
+ 'Bambu Cloud',
+ 'Orca Cloud',
+ '{{name}} — {{stage}} ({{percent}}%) — {{elapsed}}',
+ 'EC984C,#6CD4BC,A66EB9,D87694',
+ '({{count}}/8)',
+ '(25%, 50%, 75%)',
+];
+
const IDENTICAL_TO_EN_ALLOWED = {
de: new Set(DE_COGNATES),
fr: new Set(FR_COGNATES),
@@ -393,6 +405,7 @@ const IDENTICAL_TO_EN_ALLOWED = {
'zh-CN': new Set(ZH_CN_COGNATES),
'zh-TW': new Set(ZH_TW_COGNATES),
tr: new Set(TR_COGNATES),
+ ru: new Set(RU_COGNATES),
};
// Pure comparison logic, exported so tests can verify each failure mode
diff --git a/frontend/src/i18n/index.ts b/frontend/src/i18n/index.ts
index d5f2c0cba..1a47ee6f8 100644
--- a/frontend/src/i18n/index.ts
+++ b/frontend/src/i18n/index.ts
@@ -14,6 +14,7 @@ import ptBR from './locales/pt-BR';
import zhCN from './locales/zh-CN';
import zhTW from './locales/zh-TW';
import tr from './locales/tr';
+import ru from './locales/ru';
const resources = {
en: { translation: en },
@@ -27,9 +28,10 @@ const resources = {
'zh-CN': { translation: zhCN },
'zh-TW': { translation: zhTW },
tr: { translation: tr },
+ ru: { translation: ru },
};
-const SUPPORTED_LNGS = ['en', 'de', 'es', 'fr', 'ja', 'it', 'ko', 'pt-BR', 'tr', 'zh-CN', 'zh-TW'];
+const SUPPORTED_LNGS = ['en', 'de', 'es', 'fr', 'ja', 'it', 'ko', 'pt-BR', 'ru', 'tr', 'zh-CN', 'zh-TW'];
const APPLIANCE_CONSUMED_KEY = 'bambuddy_appliance_locale_consumed';
i18n
@@ -107,4 +109,5 @@ export const availableLanguages = [
{ code: 'zh-CN', name: 'Chinese (Simplified)', nativeName: '简体中文' },
{ code: 'zh-TW', name: 'Chinese (Traditional)', nativeName: '繁體中文' },
{ code: 'tr', name: 'Turkish', nativeName: 'Türkçe' },
+ { code: 'ru', name: 'Russian', nativeName: 'Русский' },
];
diff --git a/frontend/src/i18n/locales/ru.ts b/frontend/src/i18n/locales/ru.ts
new file mode 100644
index 000000000..1956cafa9
--- /dev/null
+++ b/frontend/src/i18n/locales/ru.ts
@@ -0,0 +1,6471 @@
+export default {
+ nav: {
+ printers: "Принтеры",
+ archives: "Архив",
+ queue: "Очередь печати",
+ stats: "Статистика",
+ profiles: "Профили",
+ maintenance: "Обслуживание",
+ projects: "Проекты",
+ inventory: "Филамент",
+ files: "Файловый менеджер",
+ makerworld: "MakerWorld",
+ notifications: "Уведомления",
+ settings: "Настройки",
+ system: "Система",
+ collapseSidebar: "Свернуть боковую панель",
+ expandSidebar: "Развернуть боковую панель",
+ update: "Обновить",
+ updateAvailable: "Доступно обновление: v{{version}}",
+ updateAvailableBanner: "Доступна версия {{version}}!",
+ viewUpdate: "Посмотреть обновление",
+ viewOnGithub: "Открыть на GitHub",
+ keyboardShortcuts: "Горячие клавиши (?)",
+ switchToLight: "Включить светлую тему",
+ switchToDark: "Включить тёмную тему",
+ switchToSystem: "Использовать системную тему",
+ smartSwitches: "Умные выключатели",
+ logout: "Выйти",
+ installApp: "Установить приложение",
+ installAppSuccess: "Bambuddy установлен",
+ },
+ common: {
+ save: "Сохранить",
+ saving: "Сохранение...",
+ cancel: "Отмена",
+ delete: "Удалить",
+ edit: "Изменить",
+ add: "Добавить",
+ close: "Закрыть",
+ confirm: "Подтвердить",
+ loading: "Загрузка...",
+ error: "Ошибка",
+ errorLoading: "Не удалось загрузить данные",
+ retry: "Повторить",
+ success: "Готово",
+ warning: "Предупреждение",
+ enabled: "Включено",
+ disabled: "Отключено",
+ yes: "Да",
+ no: "Нет",
+ on: "Вкл.",
+ off: "Выкл.",
+ all: "Все",
+ none: "Нет",
+ search: "Поиск",
+ filter: "Фильтр",
+ sort: "Сортировка",
+ refresh: "Обновить",
+ download: "Скачать",
+ upload: "Загрузить",
+ uploading: "Загрузка...",
+ uploadFailed: "Ошибка загрузки",
+ actions: "Действия",
+ status: "Состояние",
+ name: "Название",
+ description: "Описание",
+ date: "Дата",
+ time: "Время",
+ hours: "часов",
+ minutes: "минут",
+ seconds: "секунд",
+ days: "дней",
+ enable: "Включить",
+ disable: "Отключить",
+ permissions: "Разрешения",
+ noPrinters: "Принтеры не настроены",
+ noData: "Нет данных",
+ linkNotFound: "Ссылка не найдена",
+ required: "Обязательно",
+ optional: "Необязательно",
+ dismiss: "Закрыть",
+ apply: "Применить",
+ reset: "Сбросить",
+ export: "Экспорт",
+ import: "Импорт",
+ clear: "Очистить",
+ selectAll: "Выбрать все",
+ deselectAll: "Снять выделение",
+ noChange: "— Без изменений —",
+ unchanged: "Без изменений",
+ unassigned: "Не назначено",
+ unknown: "Неизвестно",
+ unknownError: "Неизвестная ошибка",
+ today: "Сегодня",
+ tomorrow: "Завтра",
+ asap: "Как можно скорее",
+ overdue: "Просрочено",
+ now: "Сейчас",
+ collapse: "Свернуть",
+ expand: "Развернуть",
+ previous: "Назад",
+ next: "Далее",
+ viewArchive: "Открыть архив",
+ viewInFileManager: "Открыть в файловом менеджере",
+ addedBy: "Добавил: {{username}}",
+ prints: "печатей",
+ more: "ещё +{{count}}",
+ ascending: "По возрастанию",
+ descending: "По убыванию",
+ back: "Назад",
+ copy: "Копировать",
+ copied: "Скопировано!",
+ printer: "Принтер",
+ remove: "Удалить",
+ type: "Тип",
+ print: "Печать",
+ rename: "Переименовать",
+ move: "Переместить",
+ create: "Создать",
+ duplicate: "Дублировать",
+ left: "Левый",
+ right: "Правый",
+ },
+ printers: {
+ title: "Принтеры",
+ addPrinter: "Добавить принтер",
+ addPreflight: {
+ checking: "Проверка подключения...",
+ warning: "Некоторые проверки подключения не пройдены. Принтер может отображаться как отключённый. Проверьте результаты ниже, исправьте возможные проблемы или сохраните настройки как есть.",
+ back: "Назад",
+ saveAnyway: "Всё равно сохранить",
+ },
+ editPrinter: "Изменить принтер",
+ deletePrinter: "Удалить принтер",
+ printerName: "Название принтера",
+ serialNumber: "Серийный номер",
+ ipAddress: "IP-адрес / имя хоста",
+ accessCode: "Код доступа",
+ model: "Модель",
+ nozzleCount: "Количество сопел",
+ autoArchive: "Автоматически архивировать",
+ status: {
+ available: "Доступен",
+ idle: "Ожидает",
+ printing: "Печать",
+ paused: "Приостановлен",
+ offline: "Не в сети",
+ problem: "Проблема",
+ error: "Ошибка",
+ finished: "Завершено",
+ unknown: "Неизвестно",
+ },
+ temperatures: {
+ nozzle: "Сопло",
+ bed: "Стол",
+ chamber: "Камера",
+ },
+ heaterHistory: {
+ title: "История нагрева",
+ openLabel: "Открыть историю нагрева",
+ nozzle: "Сопло",
+ nozzle2: "Сопло 2",
+ bed: "Стол",
+ chamber: "Камера",
+ error: "Не удалось загрузить историю",
+ empty: "Данные пока не записывались",
+ },
+ progress: "Выполнено {{percent}}%",
+ timeRemaining: "Осталось {{time}}",
+ deleteConfirm: "Удалить принтер «{{name}}»?",
+ maintenanceOk: "Обслуживание в норме",
+ maintenanceWarning: "{{count}} предупреждение",
+ maintenanceWarning_plural: "{{count}} предупреждений",
+ maintenanceDue: "Требуется: {{count}}",
+ maintenanceDue_plural: "Требуется: {{count}}",
+ sort: {
+ name: "Название",
+ status: "Состояние",
+ model: "Модель",
+ location: "Расположение",
+ eta: "Время завершения",
+ ascending: "По возрастанию",
+ descending: "По убыванию",
+ },
+ cardSize: {
+ small: "Маленькие карточки",
+ medium: "Средние карточки",
+ large: "Большие карточки",
+ extraLarge: "Очень большие карточки",
+ },
+ pageView: {
+ openCamWallPage: "Открыть стену камер как отдельную страницу",
+ cards: "Карточки",
+ camWall: "Стена камер",
+ },
+ camWall: {
+ page: {
+ tokenRejected: "Эта ссылка на стену камер больше недействительна. Возможно, срок действия токена истёк или он был отозван.",
+ loadFailed: "Не удалось загрузить принтеры.",
+ },
+ noPrinters: "Нет принтеров для отображения",
+ noSignal: "Нет сигнала",
+ live: "Онлайн",
+ snap: "Снимок",
+ off: "Выкл.",
+ summary: "Онлайн: {{live}}, снимки: {{snap}}, всего: {{total}}",
+ layer: "Слой {{cur}}/{{total}}",
+ timeLeft: "Осталось {{time}}",
+ statusMode: {
+ off: "Выкл.",
+ compact: "Компактный",
+ full: "Полный",
+ },
+ settings: {
+ title: "Настройки стены камер",
+ maxLive: "Максимум онлайн-трансляций",
+ maxLiveHint: "Сколько камер одновременно показывать в реальном времени. Остальные будут обновляться снимками.",
+ snapshotInterval: "Интервал снимков, с",
+ snapshotIntervalHint: "Как часто обновлять снимки камер без онлайн-трансляции.",
+ statusOverlay: "Наложение состояния",
+ statusOverlayHint: "Компактный режим: только состояние. Полный: прогресс, слой и оставшееся время.",
+ },
+ },
+ hideOffline: "Скрыть принтеры не в сети",
+ nextAvailable: "Ближайший доступный",
+ powerOn: "Включить питание",
+ offlinePrintersWithPlugs: "Принтеры не в сети с умными розетками",
+ noPrintersConfigured: "Принтеры пока не настроены",
+ search: "Поиск принтеров...",
+ noSearchResults: "Нет принтеров, соответствующих поиску или фильтрам",
+ filter: {
+ allStatuses: "Все состояния",
+ allLocations: "Все расположения",
+ },
+ toolbar: {
+ filters: "Фильтры",
+ view: "Вид",
+ actions: "Действия",
+ },
+ readyToPrint: "Готов к печати",
+ external: "Внешняя подача",
+ extL: "Внешняя, левое",
+ extR: "Внешняя, правое",
+ deleteArchives: "Удалить архивы печати",
+ noLabel: "Без метки",
+ printPreview: "Предпросмотр печати",
+ width: "Ширина",
+ height: "Высота",
+ noObjectsFound: "Объекты не найдены",
+ objectsLoadedOnPrintStart: "Объекты загрузятся после начала печати",
+ willBeSkipped: "Будет пропущен",
+ name: "Название",
+ serialCannotBeChanged: "Серийный номер нельзя изменить",
+ locationHelp: "Используется для группировки принтеров и фильтрации заданий в очереди",
+ wifiSignal: {
+ veryWeak: "Очень слабый",
+ weak: "Слабый",
+ fair: "Средний",
+ good: "Хороший",
+ excellent: "Отличный",
+ },
+ maintenanceUpToDate: "Обслуживание выполнено — нажмите для просмотра",
+ maintenance: {
+ title: "На обслуживании",
+ subtitle: "Принтер приостановлен: подключение отключено, задания из очереди не назначаются, уведомления не отправляются.",
+ pillLabel: "Обслуживание",
+ exitButton: "Завершить обслуживание",
+ menuEnter: "Перевести в режим обслуживания",
+ menuExit: "Выйти из режима обслуживания",
+ toastEntered: "Принтер {{name}} переведён в режим обслуживания",
+ toastExited: "Принтер {{name}} снова в работе",
+ confirmMidPrintTitle: "Перевести в режим обслуживания во время печати?",
+ confirmMidPrintMessage: "Принтер {{name}} сейчас печатает. Режим обслуживания отключит MQTT, отслеживание прогресса и уведомление о завершении этого задания. Продолжить?",
+ editFieldLabel: "Режим обслуживания",
+ editFieldHelp: "Отключает для принтера MQTT, назначение заданий из очереди и уведомления. Используйте при ремонте, параллельных установках Bambuddy или временной приостановке.",
+ },
+ chamberLightOn: "Включить подсветку камеры",
+ chamberLightOff: "Выключить подсветку камеры",
+ files: "Файлы",
+ browseFiles: "Открыть файлы принтера",
+ autoOffAfterPrint: "Автовыключение после печати",
+ autoOffExecuted: "Автовыключение выполнено — включите принтер для сброса состояния",
+ hmsErrors: "Ошибки HMS",
+ viewHmsErrors: "Показать ошибки HMS: {{count}}",
+ resume: "Продолжить",
+ pause: "Пауза",
+ stop: "Стоп",
+ camera: "Камера",
+ skipObject: "Пропустить объект",
+ reconnect: "Переподключить",
+ forceRefresh: "Принудительно обновить",
+ forceRefreshSuccess: "Запрошено обновление данных",
+ mqttDebug: "Отладка MQTT",
+ printerInformation: "Информация о принтере",
+ copyToClipboard: "Копировать",
+ copied: "Скопировано!",
+ state: "Состояние",
+ wifiSignalLabel: "Сигнал Wi‑Fi",
+ developerMode: "Режим разработчика",
+ enabled: "Включён",
+ disabled: "Отключён",
+ addedOn: "Добавлен",
+ sdCard: "SD-карта",
+ inserted: "Установлена",
+ notInserted: "Не установлена",
+ totalPrintHours: "Часов печати",
+ activeNozzle: "Активное сопло: {{nozzle}}",
+ nozzleRack: "Держатель сопел",
+ nozzleDocked: "В держателе",
+ nozzleMounted: "Установлено",
+ nozzleActive: "Активно",
+ nozzleIdle: "Ожидание",
+ nozzleDiameter: "Диаметр",
+ nozzleType: "Тип",
+ nozzleStatus: "Состояние",
+ nozzleFilament: "Филамент",
+ nozzleWear: "Износ",
+ nozzleMaxTemp: "Макс. температура",
+ nozzleSerial: "Серийный номер",
+ nozzleHardenedSteel: "Закалённая сталь",
+ nozzleStainlessSteel: "Нержавеющая сталь",
+ nozzleTungstenCarbide: "Карбид вольфрама",
+ nozzleFlow: "Производительность",
+ nozzleHighFlow: "Высокопоточное",
+ nozzleStandardFlow: "Стандартное",
+ firmwareUpdate: "Обновление прошивки",
+ firmwareInstructions: "На сенсорном экране принтера откройте",
+ firmwareNav: "Перейдите в раздел",
+ settings: "Настройки",
+ firmware: "Прошивка",
+ discoverPrinters: "Найти принтеры",
+ searching: "Поиск...",
+ manualEntry: "Добавить вручную",
+ addFromCloud: "Добавить из облака",
+ toast: {
+ printerDeleted: "Принтер удалён",
+ missingSpoolAssignment: "На принтере {{printer}} началась печать. Не назначены катушки для слотов: {{slots}}",
+ printerAdded: "Принтер добавлен",
+ printerUpdated: "Настройки принтера обновлены",
+ failedToDelete: "Не удалось удалить принтер",
+ failedToAdd: "Не удалось добавить принтер",
+ connectionFailedNotAdded: "Не удалось подключиться к принтеру. Проверьте IP-адрес, серийный номер и код доступа, а также убедитесь, что включён режим «Только локальная сеть». Принтер не добавлен.",
+ failedToUpdate: "Не удалось обновить настройки принтера",
+ commandSent: "Команда отправлена",
+ failedToSendCommand: "Не удалось отправить команду",
+ turnedOn: "Питание {{name}} включено",
+ failedToPowerOn: "Не удалось включить {{name}}",
+ scriptTriggered: "Сценарий запущен",
+ printStopped: "Печать остановлена",
+ printPaused: "Печать приостановлена",
+ printResumed: "Печать продолжена",
+ referenceDeleted: "Эталон удалён",
+ detectionAreaSaved: "Область обнаружения сохранена",
+ failedToRunScript: "Не удалось запустить сценарий",
+ failedToStopPrint: "Не удалось остановить печать",
+ failedToPausePrint: "Не удалось приостановить печать",
+ failedToResumePrint: "Не удалось продолжить печать",
+ failedToControlChamberLight: "Не удалось изменить состояние подсветки камеры",
+ failedToSetSpeed: "Не удалось изменить скорость печати",
+ failedToUpdateSetting: "Не удалось изменить настройку",
+ failedToSkipObjects: "Не удалось пропустить объекты",
+ failedToRereadRfid: "Не удалось повторно считать RFID",
+ failedToCheckPlate: "Не удалось проверить пластину",
+ failedToUpdateLabel: "Не удалось обновить метку",
+ failedToDeleteReference: "Не удалось удалить эталон",
+ failedToSaveDetectionArea: "Не удалось сохранить область обнаружения",
+ plateCheckEnabled: "Проверка пластины включена",
+ plateCheckDisabled: "Проверка пластины отключена",
+ calibrationSaved: "Калибровка сохранена",
+ calibrationFailed: "Не удалось выполнить калибровку",
+ rfidRereadInitiated: "Запущено повторное считывание RFID",
+ loadInitiated: "Загрузка филамента…",
+ unloadInitiated: "Выгрузка филамента…",
+ failedToLoad: "Не удалось загрузить филамент",
+ failedToUnload: "Не удалось выгрузить филамент",
+ },
+ connection: {
+ connected: "Подключён",
+ offline: "Не в сети",
+ },
+ plateStatus: {
+ markCleared: "Отметить пластину как очищенную",
+ cleared: "Пластина очищена",
+ notCleared: "Пластина не очищена",
+ inUse: "Пластина используется",
+ },
+ queue: {
+ inQueue: "В очереди: {{count}} задание",
+ inQueue_plural: "В очереди: {{count}} заданий",
+ },
+ controls: "Управление",
+ rfid: {
+ reread: "Повторно считать RFID",
+ },
+ ams: {
+ load: "Загрузить",
+ unload: "Выгрузить",
+ },
+ bedJog: {
+ limitWarning: "При ручном перемещении ограничения хода не контролируются: из-за ошибки прошивки Bambu программные концевики игнорируются для удалённых команд. Перемещайте осторожно, чтобы избежать столкновения.",
+ title: "Ручное перемещение",
+ bed: "Стол",
+ step: "Шаг (мм)",
+ up: "Поднять стол",
+ down: "Опустить стол",
+ disabledWhilePrinting: "Недоступно во время печати",
+ notHomedTitle: "Принтер не выполнил парковку по осям",
+ notHomedMessage: "После последней печати принтер не выполнял Home. Сначала запустите автоматическую парковку для безопасного позиционирования (парковка печатающей головы и поиск нуля по X, Y и Z) либо продолжите перемещение — программные концевики будут отключены.",
+ homeZ: "Автопарковка",
+ moveAnyway: "Всё равно переместить",
+ homingStarted: "Выполняется автопарковка…",
+ },
+ permission: {
+ noAdd: "У вас нет разрешения на добавление принтеров",
+ noEdit: "У вас нет разрешения на изменение принтеров",
+ noDelete: "У вас нет разрешения на удаление принтеров",
+ noControl: "У вас нет разрешения на управление принтерами",
+ noFiles: "У вас нет разрешения на доступ к файлам принтера",
+ noAmsRfid: "У вас нет разрешения на повторное считывание RFID AMS",
+ noSmartPlugControl: "У вас нет разрешения на управление умными розетками",
+ noCamera: "У вас нет разрешения на просмотр камер",
+ },
+ modal: {
+ addTitle: "Добавить принтер",
+ editTitle: "Изменить принтер",
+ myPrinter: "Мой принтер",
+ selectModel: "Выберите модель…",
+ locationGroup: "Расположение / группа (необязательно)",
+ locationPlaceholder: "например: Мастерская, Офис, Подвал",
+ autoArchiveLabel: "Автоматически архивировать завершённые печати",
+ fromPrinterSettings: "Из настроек принтера",
+ modelOptional: "Модель (необязательно)",
+ saveChanges: "Сохранить изменения",
+ },
+ skipObjects: {
+ tooltip: "Пропустить объекты",
+ onlyWhilePrinting: "Пропуск объектов доступен только во время печати",
+ requiresMultiple: "Для пропуска требуется не менее двух объектов",
+ title: "Пропустить объекты",
+ matchIdsInfo: "Сопоставьте идентификаторы с экраном принтера",
+ printerShowsIds: "На экране принтера отображаются идентификаторы объектов на пластине",
+ skipSelected: "Пропустить выбранные",
+ skipping: "Пропуск…",
+ noObjectsSelected: "Объекты не выбраны",
+ selectObjectsToSkip: "Выберите объекты, которые нужно исключить из текущей печати",
+ skipped: "пропущен",
+ objectsSkipped: "Объекты пропущены",
+ activeCount: "Активно: {{count}}",
+ waitForLayer: "Пропуск объектов доступен со второго слоя (сейчас слой {{layer}})",
+ skip: "Пропустить",
+ confirmTitle: "Пропустить объект?",
+ confirmMessage: "Пропустить объект «{{name}}»? Это действие нельзя отменить.",
+ },
+ confirm: {
+ deleteTitle: "Удалить принтер",
+ deleteMessage: "Удалить принтер «{{name}}»? Все параметры подключения будут удалены.",
+ deleteArchivesNote: "Вся история печати этого принтера будет удалена безвозвратно.",
+ keepArchivesNote: "История печати сохранится, но больше не будет связана с этим принтером.",
+ stopTitle: "Остановить печать",
+ stopMessage: "Остановить текущую печать на принтере «{{name}}»? Задание будет отменено.",
+ stopButton: "Остановить печать",
+ pauseTitle: "Приостановить печать",
+ pauseMessage: "Приостановить текущую печать на принтере «{{name}}»?",
+ pauseButton: "Приостановить печать",
+ resumeTitle: "Продолжить печать",
+ resumeMessage: "Продолжить печать на принтере «{{name}}»?",
+ resumeButton: "Продолжить печать",
+ powerOnTitle: "Включить принтер",
+ powerOnMessage: "Включить питание принтера «{{name}}»?",
+ powerOnButton: "Включить питание",
+ powerOffTitle: "Выключить принтер",
+ powerOffMessage: "Выключить питание принтера «{{name}}»?",
+ powerOffWarning: "ВНИМАНИЕ: принтер «{{name}}» сейчас печатает. Выключение питания прервёт печать и может повредить принтер. Продолжить?",
+ powerOffButton: "Выключить питание",
+ haToggleTitle: "Переключить «{{name}}»",
+ haToggleMessage: "Переключить сущность Home Assistant {{entity}}? Если она сейчас включена, питание может отключиться.",
+ haToggleWarning: "ВНИМАНИЕ: принтер «{{name}}» сейчас печатает. Переключение {{entity}} может отключить питание и прервать печать. Продолжить?",
+ haToggleButton: "Переключить",
+ },
+ bulk: {
+ select: "Выбрать",
+ selectAll: "Выбрать все",
+ selectByLocation: "Выбрать по расположению",
+ selected: "Выбрано: {{count}}",
+ actions: {
+ stop: "Стоп",
+ pause: "Пауза",
+ resume: "Продолжить",
+ clearPlate: "Освободить стол",
+ clearHMS: "Очистить уведомления",
+ },
+ confirm: {
+ stopTitle: "Остановить печати: {{count}}",
+ stopMessage: "Активные печати на {{count}} принтерах будут отменены. Это действие нельзя отменить.",
+ stopButton: "Остановить все",
+ pauseTitle: "Приостановить печати: {{count}}",
+ pauseMessage: "Активные печати на {{count}} принтерах будут приостановлены.",
+ pauseButton: "Приостановить все",
+ clearPlateTitle: "Освободить столы: {{count}}",
+ clearPlateMessage: "Столы на {{count}} принтерах будут отмечены как свободные; после этого могут запуститься задания из очереди.",
+ clearPlateButton: "Освободить все",
+ },
+ success: "Действие «{{action}}» выполнено на {{count}} принтерах",
+ partial: "Успешно: {{succeeded}}, с ошибкой: {{failed}}",
+ noneApplicable: "Ни один из выбранных принтеров не находится в подходящем состоянии",
+ selectByState: "Выбрать по состоянию",
+ },
+ discovery: {
+ title: "Поиск принтеров",
+ searching: "Поиск…",
+ scanning: "Сканирование…",
+ scanProgress: "Сканирование: {{scanned}}/{{total}}",
+ foundPrinters: "Найдено принтеров: {{count}}",
+ noPrintersFound: "Принтеры не найдены",
+ noPrintersFoundSubnet: "В указанной подсети принтеры не найдены.",
+ noPrintersFoundNetwork: "Принтеры в сети не найдены.",
+ allConfigured: "Все найденные принтеры уже настроены.",
+ alreadyAdded: "Уже добавлен",
+ select: "Выбрать",
+ manualEntry: "Добавить вручную",
+ addFromCloud: "Добавить из облака",
+ subnetToScan: "Подсеть для сканирования",
+ dockerNote: "Обнаружен Docker. Укажите подсеть принтера в формате CIDR. В docker-compose.yml требуется network_mode: host.",
+ scanSubnet: "Сканировать подсеть",
+ discoverNetwork: "Найти принтеры в сети",
+ scanningSubnet: "Поиск принтеров Bambu в подсети…",
+ scanningNetwork: "Сканирование сети…",
+ serialRequired: "Требуется серийный номер",
+ unknown: "Неизвестно",
+ failedToStart: "Не удалось запустить поиск",
+ customSubnetOption: "Другая подсеть…",
+ customSubnetLabel: "Другая подсеть (CIDR)",
+ customSubnetNote: "Используйте другую подсеть, если принтер находится в иной сети. Порты FTP (990) и MQTT (8883) должны быть доступны через маршрутизатор.",
+ },
+ drying: {
+ start: "Начать сушку",
+ stop: "Остановить сушку",
+ temperature: "Температура",
+ duration: "Продолжительность",
+ hours: "ч",
+ timeRemaining: "осталось {{time}}",
+ active: "Сушка",
+ targetSummary: "{{filament}} при {{temp}} °C",
+ notSupported: "Сушка не поддерживается",
+ powerRequired: "Подключите адаптер питания AMS, чтобы включить сушку",
+ startingDrying: "Запуск сушки...",
+ toastCommandSent: "Команда сушки отправлена",
+ toastStopped: "Сушка остановлена",
+ toastNotStarted: "Принтер принял команду, но AMS не начал сушку. Убедитесь, что адаптер питания AMS подключён, а принтер не занят.",
+ screenOnly: "На этом принтере управлять сушкой AMS можно только с экрана самого принтера (ограничение Bambu)",
+ stoppingDrying: "Остановка сушки...",
+ rotateTray: "Вращать катушку во время сушки",
+ rotateUnavailableReason: "Недоступно: слот этого AMS сейчас подаёт филамент в печатающую головку. Катушка зафиксирована подающей трубкой и не может вращаться. Сначала выгрузите филамент.",
+ },
+ amsBackup: {
+ titleOn: "Резервный филамент AMS включён. Нажмите, чтобы отключить.",
+ titleOff: "Резервный филамент AMS выключен. Нажмите, чтобы включить.",
+ titleUnknown: "Состояние резервного филамента AMS недоступно для этого принтера.",
+ toastEnabled: "Резервный филамент AMS включён",
+ toastDisabled: "Резервный филамент AMS отключён",
+ modalTitle: "Резервный филамент AMS",
+ modalHelp: "Когда активный слот опустеет, принтер по очереди использует подходящие слоты с тем же профилем и цветом в указанном порядке.",
+ modalNoSlots: "Филамент не загружен.",
+ modalNoPairs: "Резервных пар нет: ни у двух слотов не совпадают профиль филамента и цвет.",
+ extruderRightShort: "П",
+ extruderLeftShort: "Л",
+ stateOn: "Включено",
+ stateOff: "Отключено",
+ stateUnknown: "Не поддерживается этим принтером",
+ },
+ activeJobSlot: {
+ title: "Этот слот используется как филамент {{n}} в текущей печати",
+ ariaLabel: "Слот {{n}} текущей печати",
+ },
+ expectedSlot: {
+ title: "Принтер ожидает филамент в этом слоте",
+ ariaLabel: "Ожидаемый слот филамента {{n}}",
+ label: "{{ams}} · Слот {{slot}}",
+ external: "Внешняя катушка",
+ },
+ filaments: "Филаменты",
+ openCameraOverlay: "Открыть камеру поверх интерфейса",
+ openCameraWindow: "Открыть камеру в новом окне",
+ firmwareUpdateAvailable: "Доступно обновление прошивки: {{current}} → {{latest}}",
+ firmwareUpToDate: "Прошивка {{version}} — актуальная версия",
+ firmwareUpdateButton: "Обновить",
+ plateDetection: {
+ noPermission: "У вас нет прав на изменение настроек принтера",
+ enabledClick: "Проверка пластины включена — нажмите, чтобы отключить",
+ disabledClick: "Проверка пластины отключена — нажмите, чтобы включить",
+ manageCalibration: "Управление калибровкой проверки пластины",
+ calibrationRequired: "Требуется калибровка",
+ calibrationInstructions: "Убедитесь, что печатная пластина полностью пустая, затем нажмите «Калибровать».",
+ calibrationDescription: "При калибровке сохраняется эталонное изображение пустой пластины. При последующих проверках система сравнивает снимок с эталоном и обнаруживает посторонние объекты.",
+ calibrationTip: "Совет: можно сохранить до 5 калибровок для разных пластин. При проверке система автоматически выберет наиболее подходящий эталон.",
+ plateEmpty: "Пластина выглядит пустой",
+ objectsDetected: "На пластине обнаружены объекты",
+ confidence: "Уверенность",
+ difference: "Различие",
+ analysisPreview: "Предпросмотр анализа:",
+ analysisLegend: "Зелёная рамка — область обнаружения, красная заливка — отличия от калибровочного снимка",
+ savedReferences: "Сохранённые эталоны ({{count}}/{{max}})",
+ deleteReference: "Удалить эталон",
+ labelPlaceholder: "Метка...",
+ clickToEdit: "{{label}} — нажмите для изменения",
+ clickToAddLabel: "Нажмите, чтобы добавить метку",
+ },
+ speed: {
+ title: "Скорость печати",
+ silent: "Тихий (50%)",
+ standard: "Стандартный (100%)",
+ sport: "Спортивный (124%)",
+ ludicrous: "Безумный (166%)",
+ },
+ airduct: {
+ title: "Режим воздуховода",
+ cooling: "Охлаждение",
+ heating: "Нагрев",
+ },
+ noSdCard: "Нет SD-карты",
+ door: {
+ open: "Открыта",
+ closed: "Закрыта",
+ },
+ fans: {
+ partCooling: "Вентилятор обдува модели",
+ auxiliary: "Дополнительный вентилятор",
+ chamber: "Вентилятор камеры",
+ },
+ clickToViewHmsErrors: "Нажмите, чтобы посмотреть ошибки HMS",
+ estimatedCompletion: "Расчётное время завершения",
+ plateNumber: "Пластина {{number}}",
+ slotOptions: "Параметры слота",
+ amsPopup: {
+ friendlyName: "Имя AMS",
+ friendlyNamePlaceholder: "Например, левый AMS",
+ serialNumber: "Серийный номер",
+ firmwareVersion: "Прошивка",
+ save: "Сохранить",
+ clear: "Очистить",
+ noEditPermission: "У вас нет прав на переименование модулей AMS",
+ },
+ firmwareModal: {
+ title: "Обновление прошивки",
+ titleUpToDate: "Сведения о прошивке",
+ currentVersion: "Текущая:",
+ latestVersion: "Последняя:",
+ releaseNotes: "Примечания к выпуску",
+ checkingPrereqs: "Проверка условий...",
+ sdCardReady: "SD-карта готова. Нажмите ниже, чтобы загрузить прошивку.",
+ uploadedSuccess: "Прошивка загружена на SD-карту!",
+ applyInstructions: "Чтобы установить обновление на принтер:",
+ step1: "На экране принтера откройте Настройки",
+ step2: "Перейдите в раздел Прошивка",
+ step3: "Выберите Обновить с SD-карты",
+ step4: "Обновление займёт 10–20 минут",
+ done: "Готово",
+ starting: "Запуск...",
+ uploadFirmware: "Загрузить прошивку",
+ uploadFailed: "Не удалось начать загрузку: {{error}}",
+ uploadedToast: "Прошивка загружена. Запустите обновление с экрана принтера.",
+ availableVersions: "Доступные версии",
+ usable: "Доступна",
+ unavailable: "Недоступна",
+ installed: "Установлена",
+ newerBadge: "новее",
+ olderBadge: "старее",
+ currentBadge: "текущая",
+ },
+ accessCodePlaceholder: "Оставьте пустым, чтобы сохранить текущий",
+ roi: {
+ title: "Область обнаружения (ROI)",
+ xStart: "Начало X",
+ yStart: "Начало Y",
+ width: "Ширина",
+ height: "Высота",
+ instruction: "Настройте область обнаружения так, чтобы она охватывала печатную пластину. Зелёная рамка в предпросмотре показывает текущую область.",
+ },
+ developerModeWarning: "Режим LAN для разработчиков не включён на: {{names}}. Некоторые функции могут не работать.",
+ howToEnable: "Как включить",
+ incompatibleFile: "Файл подготовлен для {{slicedFor}}, а выбранный принтер — {{printerModel}}",
+ dropNotPrintable: "Для печати подходят только файлы .gcode и .gcode.3mf",
+ dropToPrint: "Перетащите файл для печати",
+ cannotPrint: "Принтер занят",
+ },
+ archives: {
+ title: "Архив печати",
+ no3mfBanner: {
+ title: "Некоторые последние задания сохранены без миниатюр",
+ body: "Слайсер не оставил файл .gcode.3mf на SD-карте принтера, поэтому Bambuddy не смог получить миниатюру и метаданные слайсера. Обычно это происходит, если в слайсере отключена настройка «Сохранять отправленные файлы во внешнем хранилище» (вкладка «Устройство» в Bambu Studio / OrcaSlicer).",
+ docsLink: "См. шаг 4 установки",
+ dismissLabel: "Закрыть это уведомление",
+ },
+ searchPlaceholder: "Поиск в архиве...",
+ filterByPrinter: "Фильтр по принтеру",
+ filterByStatus: "Фильтр по состоянию",
+ sortBy: "Сортировать по",
+ sortNewest: "Сначала новые",
+ sortOldest: "Сначала старые",
+ sortName: "Названию",
+ sortDuration: "Длительности",
+ sortLargest: "Сначала большие",
+ sortSmallest: "Сначала маленькие",
+ sortSize: "Размеру",
+ noArchives: "Архивы не найдены",
+ noArchivesSearch: "По вашему запросу ничего не найдено",
+ originalPrintNotVisible: "Исходная печать не отображается — попробуйте сбросить фильтры",
+ noArchivesYet: "Архив пока пуст",
+ prints: "печатей",
+ pagination: {
+ showing: "Показано",
+ to: "–",
+ of: "из",
+ show: "Показывать",
+ page: "Страница",
+ all: "Все",
+ },
+ loadingArchives: "Загрузка архива...",
+ releaseToUpload: "Отпустите файлы для загрузки",
+ showAll: "Показать все",
+ showFavoritesOnly: "Только избранное",
+ gridView: "Плитка",
+ listView: "Список",
+ calendarView: "Календарь",
+ logView: "Журнал печати",
+ manageTags: "Управление тегами",
+ showFailedPrints: "Показывать неудачные печати",
+ hideFailedPrints: "Скрывать неудачные печати",
+ hideDuplicates: "Скрывать дубликаты",
+ viewOriginalPrint: "Открыть исходную печать №{{id}}",
+ printTime: "Время печати",
+ filamentUsed: "Израсходовано филамента",
+ cost: "Стоимость",
+ preview: "Предпросмотр",
+ deleteArchive: "Удалить запись из архива",
+ deleteConfirm: "Удалить эту запись из архива?",
+ favorite: "В избранное",
+ unfavorite: "Удалить из избранного",
+ viewDetails: "Подробнее",
+ status: {
+ completed: "Завершено",
+ failed: "Ошибка",
+ stopped: "Остановлено",
+ },
+ toast: {
+ source3mfAttached: "Исходный 3MF прикреплён: {{filename}}",
+ failedUploadSource3mf: "Не удалось загрузить исходный 3MF",
+ source3mfRemoved: "Исходный 3MF удалён",
+ failedRemoveSource3mf: "Не удалось удалить исходный 3MF",
+ f3dAttached: "F3D прикреплён: {{filename}}",
+ failedUploadF3d: "Не удалось загрузить F3D",
+ f3dRemoved: "F3D удалён",
+ failedRemoveF3d: "Не удалось удалить F3D",
+ timelapseAttached: "Таймлапс прикреплён: {{filename}}",
+ timelapseAlreadyAttached: "Таймлапс уже прикреплён",
+ noMatchingTimelapse: "Подходящий таймлапс не найден",
+ failedScanTimelapse: "Не удалось найти таймлапс",
+ failedAttachTimelapse: "Не удалось прикрепить таймлапс",
+ timelapseRemoved: "Таймлапс удалён",
+ failedRemoveTimelapse: "Не удалось удалить таймлапс",
+ timelapseUploaded: "Таймлапс загружен: {{filename}}",
+ failedUploadTimelapse: "Не удалось загрузить таймлапс",
+ archiveDeleted: "Запись удалена из архива",
+ failedDeleteArchive: "Не удалось удалить запись из архива",
+ addedToFavorites: "Добавлено в избранное",
+ removedFromFavorites: "Удалено из избранного",
+ projectUpdated: "Проект обновлён",
+ failedUpdateProject: "Не удалось обновить проект",
+ linkCopied: "Ссылка скопирована",
+ failedCopyLink: "Не удалось скопировать ссылку",
+ photoDeleted: "Фотография удалена",
+ failedDeletePhoto: "Не удалось удалить фотографию",
+ failedDeleteArchives: "Не удалось удалить записи из архива",
+ failedUpdateFavorites: "Не удалось обновить избранное",
+ exportDownloaded: "Экспортированный файл скачан",
+ exportFailed: "Ошибка экспорта",
+ },
+ menu: {
+ print: "Печать",
+ openInBambuStudio: "Открыть в слайсере",
+ slice: "Нарезать",
+ externalLink: "Внешняя ссылка",
+ viewOnMakerWorld: "Открыть на MakerWorld",
+ preview3d: "3D-просмотр",
+ viewTimelapse: "Посмотреть таймлапс",
+ scanForTimelapse: "Найти таймлапс",
+ uploadTimelapse: "Загрузить таймлапс",
+ removeTimelapse: "Удалить таймлапс",
+ downloadSource3mf: "Скачать исходный 3MF",
+ uploadSource3mf: "Загрузить исходный 3MF",
+ replaceSource3mf: "Заменить исходный 3MF",
+ removeSource3mf: "Удалить исходный 3MF",
+ uploadF3d: "Загрузить F3D",
+ replaceF3d: "Заменить F3D",
+ downloadF3d: "Скачать F3D",
+ removeF3d: "Удалить F3D",
+ download: "Скачать",
+ copyDownloadLink: "Скопировать ссылку для скачивания",
+ qrCode: "QR-код",
+ viewPhotos: "Посмотреть фотографии",
+ viewPhotosCount: "Фотографии ({{count}})",
+ projectPage: "Страница проекта",
+ addToFavorites: "Добавить в избранное",
+ removeFromFavorites: "Удалить из избранного",
+ edit: "Изменить",
+ printLog: "Журнал печати",
+ goToProject: "Открыть проект: {{name}}",
+ addToProject: "Добавить в проект",
+ removeFromProject: "Удалить из проекта",
+ loading: "Загрузка...",
+ noProjectsAvailable: "Нет доступных проектов",
+ searchProjects: "Поиск проектов…",
+ select: "Выбрать",
+ deselect: "Снять выделение",
+ delete: "Удалить",
+ },
+ permission: {
+ noReprint: "У вас нет разрешения на повторную печать этой записи",
+ noAddToQueue: "У вас нет разрешения на добавление в очередь",
+ noUpdateArchives: "У вас нет разрешения на изменение архива",
+ noUploadFiles: "У вас нет разрешения на загрузку файлов",
+ noDownload: "У вас нет разрешения на скачивание файлов из архива",
+ noCopyLink: "У вас нет разрешения на копирование ссылок для скачивания",
+ noDelete: "У вас нет разрешения на удаление этой записи",
+ noEdit: "У вас нет разрешения на изменение этой записи",
+ noCreate: "У вас нет разрешения на создание записей в архиве",
+ },
+ platePicker: {
+ title: "Выберите пластину для предпросмотра",
+ hint: "В этой записи несколько пластин. Выберите пластину, которую нужно открыть в просмотрщике G-code.",
+ plateLabel: "Пластина {{index}}",
+ objectCount: "{{count}} объект",
+ objectCount_plural: "{{count}} объектов",
+ noGcode: "В этой записи нет нарезанного G-code для предпросмотра. Сначала откройте файл в Bambu Studio и выполните нарезку.",
+ },
+ card: {
+ previousPlate: "Предыдущая пластина",
+ nextPlate: "Следующая пластина",
+ plateNumber: "Пластина {{index}}",
+ moreOptions: "Щёлкните правой кнопкой для дополнительных действий",
+ addToFavorites: "Добавить в избранное",
+ removeFromFavorites: "Удалить из избранного",
+ cancelled: "отменено",
+ failed: "ошибка",
+ duplicate: "дубликат",
+ duplicateTitle: "Эта модель уже печаталась",
+ openSource3mf: "Открыть исходный 3MF в Bambu Studio (щёлкните правой кнопкой для дополнительных действий)",
+ downloadF3d: "Скачать файл проекта Fusion 360",
+ viewTimelapse: "Посмотреть таймлапс",
+ viewPhoto: "Посмотреть фотографию",
+ viewPhotos: "Посмотреть фотографии: {{count}}",
+ openFolder: "Открыть папку: {{name}}",
+ slicedFile: "Нарезанный файл — готов к печати",
+ sourceFile: "Только исходный файл — сопоставление AMS недоступно",
+ gcode: "G-CODE",
+ source: "ИСХОДНИК",
+ project: "Проект: {{name}}",
+ runsBadge: "Печатей: {{count}}",
+ runsBadgeTitle: "Всего печатей: {{count}}, успешных: {{successful}}, неудачных: {{failed}}. Нажмите, чтобы открыть полный журнал.",
+ estimated: "Расчётное время: {{time}}",
+ actual: "Фактическое время: {{time}}",
+ accuracy: "Точность оценки: {{percent}}%",
+ filament: "{{weight}} г",
+ layer: "{{count}} слой",
+ layers: "{{count}} слоёв",
+ object: "{{count}} объект",
+ objects: "{{count}} объектов",
+ slicedFor: "Нарезано для {{model}}",
+ uploadedBy: "Загрузил",
+ noPermissionReprint: "У вас нет разрешения на повторную печать",
+ noFileForReprint: "Файл 3MF недоступен: при сохранении задания не удалось скачать его с принтера",
+ noPermissionEdit: "У вас нет разрешения на изменение архива",
+ noPermissionDelete: "У вас нет разрешения на удаление записей из архива",
+ openInBambuStudio: "Открыть в слайсере",
+ openInBambuStudioToSlice: "Открыть в слайсере для нарезки",
+ slice: "Нарезать",
+ externalLink: "Внешняя ссылка",
+ makerWorld: "MakerWorld: {{designer}}",
+ viewProject: "Открыть проект",
+ noExternalLink: "Внешняя ссылка не указана",
+ preview3d: "3D-просмотр",
+ download: "Скачать",
+ edit: "Изменить",
+ delete: "Удалить",
+ },
+ runLog: {
+ title: "Журнал печати",
+ modalTitle: "Журнал печати — {{name}}",
+ modalTitleFallback: "эта запись",
+ empty: "Для этой записи пока нет событий печати.",
+ col: {
+ date: "Дата",
+ status: "Состояние",
+ duration: "Длительность",
+ filament: "Филамент",
+ cost: "Стоимость",
+ },
+ status: {
+ completed: "Завершено",
+ failed: "Ошибка",
+ cancelled: "Отменено",
+ stopped: "Остановлено",
+ skipped: "Пропущено",
+ printing: "Печать",
+ },
+ },
+ modal: {
+ deleteArchive: "Удаление записи из архива",
+ deleteConfirm: "Удалить «{{name}}»? Это действие нельзя отменить.",
+ deleteButton: "Удалить",
+ deletePurgeStats: "Также исключить эту печать из краткой статистики: филамент, время, стоимость и энергия",
+ deleteQueueItemsWarning: "Также будут удалены связанные элементы очереди: {{count}}.",
+ deleteBlockedByPrinting: "Удаление невозможно: сейчас печатаются связанные элементы очереди ({{count}}). Сначала остановите печать.",
+ removeSource3mf: "Удаление исходного 3MF",
+ removeSource3mfConfirm: "Удалить исходный файл 3MF из «{{name}}»? Исходный проект слайсера будет удалён.",
+ removeButton: "Удалить",
+ removeF3d: "Удаление F3D",
+ removeF3dConfirm: "Удалить файл проекта Fusion 360 из «{{name}}»?",
+ removeTimelapse: "Удаление таймлапса",
+ removeTimelapseConfirm: "Удалить видео таймлапса из «{{name}}»?",
+ timelapse: "{{name}} — таймлапс",
+ selectTimelapse: "Выбор таймлапса",
+ selectTimelapseDesc: "Автоматически найти совпадение не удалось. Выберите таймлапс для этой печати:",
+ deleteArchives: "Удаление записей из архива",
+ deleteArchivesConfirm: "Удалить записи из архива ({{count}})? Это действие нельзя отменить.",
+ deleteCount: "Удалить: {{count}}",
+ },
+ page: {
+ title: "Архив",
+ printsCount: "Показано {{filtered}} из {{total}} печатей",
+ dropFilesHere: "Перетащите сюда файлы .3mf",
+ releaseToUpload: "Отпустите файлы для загрузки",
+ only3mfSupported: "Поддерживаются только файлы .3mf",
+ close: "Закрыть",
+ selected: "Выбрано: {{count}}",
+ selectAll: "Выбрать все",
+ tags: "Теги",
+ project: "Проект",
+ favorite: "Избранное",
+ delete: "Удалить",
+ toggledFavorites: "Избранное изменено для записей: {{count}}",
+ failedUpdateFavorites: "Не удалось обновить избранное",
+ archivesDeleted: "Удалено записей: {{count}}",
+ failedDeleteArchives: "Не удалось удалить записи из архива",
+ photoDeleted: "Фотография удалена",
+ failedDeletePhoto: "Не удалось удалить фотографию",
+ },
+ list: {
+ name: "Название",
+ printer: "Принтер",
+ date: "Дата",
+ size: "Размер",
+ actions: "Действия",
+ hasTimelapse: "Есть таймлапс",
+ },
+ log: {
+ date: "Дата",
+ printName: "Название печати",
+ printer: "Принтер",
+ user: "Пользователь",
+ status: "Состояние",
+ duration: "Длительность",
+ filament: "Филамент",
+ allPrinters: "Все принтеры",
+ allUsers: "Все пользователи",
+ allStatuses: "Все состояния",
+ cancelled: "Отменено",
+ skipped: "Пропущено",
+ dateFrom: "С",
+ dateTo: "По",
+ noEntries: "Записи журнала не найдены",
+ showing: "Показано {{count}} из {{total}} записей",
+ rowsPerPage: "Строк",
+ page: "Страница",
+ prev: "Назад",
+ next: "Далее",
+ clearLog: "Очистить журнал",
+ clearLogTitle: "Очистка журнала печати",
+ clearLogConfirm: "Все записи журнала печати будут удалены без возможности восстановления. Архив и очередь не изменятся. Продолжить?",
+ clearLogButton: "Очистить всё",
+ cleared: "Удалено записей журнала: {{count}}",
+ clearFailed: "Не удалось очистить журнал печати",
+ deleteEntryTitle: "Удаление записи журнала",
+ deleteEntryConfirm: "Запись будет удалена из журнала, а её вклад в расход филамента, время и стоимость исчезнет из краткой статистики. Связанная запись архива, если она существует, не изменится. Это действие нельзя отменить.",
+ entryDeleted: "Запись журнала удалена",
+ entryDeleteFailed: "Не удалось удалить запись журнала",
+ editEntryTitle: "Изменение записи журнала",
+ editEntryDescription: "Укажите результат этой печати. Виджет анализа отказов группирует данные по этим значениям, поэтому изменения сразу отразятся в статистике.",
+ entryUpdated: "Запись журнала обновлена",
+ entryUpdateFailed: "Не удалось обновить запись журнала",
+ statuses: {
+ completed: "Завершено",
+ failed: "Ошибка",
+ stopped: "Остановлено",
+ cancelled: "Отменено",
+ skipped: "Пропущено",
+ },
+ },
+ },
+ dispatchToast: {
+ untitled: "Задание печати",
+ startingPrints: "Запуск печати",
+ progressSummary: "Завершено: {{complete}}/{{total}} • Обрабатывается: {{processing}}",
+ expandDetails: "Показать подробности отправки",
+ collapseDetails: "Скрыть подробности отправки",
+ awaitingPrinter: "Ожидание принтера…",
+ status: {
+ processing: "Обработка",
+ completed: "Завершено",
+ failed: "Ошибка",
+ },
+ failed: {
+ generic: "Не удалось отправить задание",
+ upload_failed: "Не удалось загрузить файл на принтер",
+ start_command_failed: "Принтер отклонил команду запуска",
+ },
+ dismiss: "Закрыть",
+ },
+ pipelineRuns: {
+ title: "Запуски конвейеров",
+ loading: "Загрузка…",
+ empty: "Конвейеры ещё не запускались.",
+ filter: {
+ pipeline: "Конвейер",
+ status: "Состояние",
+ target: "Назначение",
+ all: "Все",
+ allPipelines: "Все конвейеры",
+ allStatus: "Все состояния",
+ allTargets: "Все назначения",
+ clear: "Сбросить фильтры",
+ noMatches: "Нет запусков, соответствующих выбранным фильтрам.",
+ },
+ totalCount_one: "{{n}} запуск",
+ totalCount_other: "{{n}} запусков",
+ copies: "Копий: {{n}}",
+ failedCount: "Ошибок: {{n}}",
+ copyN: "Копия {{n}}",
+ retryFailed: "Повторить неудачные",
+ retryOf: "повтор запуска №{{n}}",
+ pagination: "{{start}}–{{end}} из {{total}}",
+ cancelledByUser: "Отменено пользователем",
+ toast: {
+ cancelled: "Запуск отменён",
+ cancelFailed: "Не удалось отменить запуск",
+ retryStarted: "Повторный запуск начат",
+ retryFailed: "Повторный запуск не удался",
+ cleared: "Удалено запусков: {{n}}",
+ clearFailed: "Не удалось очистить журнал",
+ },
+ clearLog: "Очистить журнал",
+ clearConfirmTitle: "Очистить журнал?",
+ clearConfirmBody: "Удалить все завершённые, неудачные, отменённые и частично неудачные запуски конвейеров? Выполняющиеся запуски сохранятся. Это действие нельзя отменить.",
+ clearConfirmAction: "Очистить",
+ jobStatus: {
+ pending: "ожидание",
+ awaiting_printer: "ожидание принтера",
+ queued: "в очереди",
+ printing: "печать",
+ completed: "завершено",
+ failed: "ошибка",
+ cancelled: "отменено",
+ },
+ },
+ queue: {
+ title: "Очередь печати",
+ subtitle: "Планирование и управление заданиями печати",
+ filamentShort: {
+ rowBadge: "Для назначенной катушки недостаточно филамента",
+ rowTooltip: "Планировщик отметил это задание. Нажмите «Запустить», чтобы увидеть нехватку по каждому слоту и решить, печатать ли всё равно.",
+ confirmTitle: "Недостаточно филамента",
+ confirmIntro: "Назначенной катушки недостаточно как минимум для одного слота. Всё равно запустить печать?",
+ lineItem: "Слот {{slot}}: требуется {{required}} г, осталось {{remaining}} г",
+ unknown: "неизвестно",
+ printAnyway: "Всё равно печатать",
+ },
+ editQueueItem: "Изменить задание в очереди",
+ selectAllPlates: "Выбрать все пластины ({{count}})",
+ deselectAll: "Снять выделение",
+ printQueued: "Задание добавлено в очередь",
+ printQueuedWillStartWhenIdle: "Запустится, когда принтер освободится",
+ itemsQueued: "Добавлено в очередь: {{count}}",
+ sending: "Отправка...",
+ sendingProgress: "Отправка {{current}} из {{total}}...",
+ adding: "Добавление...",
+ addingProgress: "Добавление {{current}} из {{total}}...",
+ savingProgress: "Сохранение {{current}} из {{total}}...",
+ clearQueue: "Очистить очередь",
+ clearHistory: "Очистить историю",
+ emptyQueue: "Очередь пуста",
+ position: "Позиция",
+ scheduledTime: "Запланированное время",
+ moveUp: "Переместить вверх",
+ moveDown: "Переместить вниз",
+ startNow: "Запустить сейчас",
+ printingInProgress: "Идёт печать...",
+ viewArchive: "Открыть архив",
+ viewInFileManager: "Открыть в файловом менеджере",
+ itemCount: "{{count}} задание",
+ itemCount_plural: "{{count}} заданий",
+ dragToReorder: "Перетащите для изменения порядка (только задания «как можно скорее»)",
+ reorderHint: "Позиция влияет только на задания «как можно скорее». Запланированные задания запускаются в указанное время.",
+ sjf: {
+ label: "SJF",
+ tooltip: "Shortest Job First — планировщик отдаёт приоритет более коротким заданиям",
+ },
+ addedBy: "Добавил: {{name}}",
+ nextInQueue: "Следующее в очереди",
+ clearPlateSuccess: "Пластина очищена — можно запускать следующую печать",
+ plateNumber: "Пластина {{index}}",
+ quantity: "Количество",
+ quantityHint: "Будет создано заданий: {{count}}",
+ activeBatches: "Активные партии",
+ batchProgress: "Выполнено {{completed}} из {{total}}",
+ cancelBatch: "Отменить оставшиеся",
+ batchCancelled: "Оставшиеся задания партии отменены",
+ cancelBatchConfirmTitle: "Отменить партию",
+ cancelBatchConfirmMessage: "Отменить все оставшиеся задания этой партии?",
+ batch: {
+ defaultName: "Партия",
+ label: "{{count}} задание",
+ label_plural: "{{count}} заданий",
+ pendingCount: "Ожидает: {{count}}",
+ pendingCount_plural: "Ожидают: {{count}}",
+ expand: "Развернуть партию",
+ collapse: "Свернуть партию",
+ groupAsBatch: "Объединить в партию…",
+ groupAsBatchDescription: "Объединить выбранные задания ({{count}}) в одну сворачиваемую партию.",
+ nameLabel: "Название партии",
+ namePlaceholder: "Например: подарки к пятнице",
+ create: "Создать партию",
+ ungroup: "Разгруппировать",
+ ungroupConfirmTitle: "Разгруппировать партию?",
+ ungroupConfirmMessage: "Задания останутся в очереди, но больше не будут объединены в одну группу.",
+ dragGroup: "Перетащить группу",
+ },
+ tabs: {
+ queue: "Очередь",
+ history: "История",
+ timeline: "Временная шкала",
+ pipelines: "Конвейеры",
+ },
+ layout: {
+ flatList: "Список",
+ byPrinter: "По принтерам",
+ groupByPrinter: "Группировать по принтерам",
+ },
+ history: {
+ emptyTitle: "История пока пуста",
+ emptyDescription: "Здесь появятся завершённые, отменённые и неудачные задания.",
+ },
+ dragGhost: {
+ multiCount: "{{count}} заданий",
+ batch: "{{name}} ({{count}} копия)",
+ batch_plural: "{{name}} ({{count}} копий)",
+ },
+ sections: {
+ currentlyPrinting: "Сейчас печатается",
+ queued: "В очереди",
+ history: "История",
+ },
+ status: {
+ pending: "Ожидает",
+ waiting: "Ожидание",
+ printing: "Печать",
+ paused: "Приостановлено",
+ completed: "Завершено",
+ failed: "Ошибка",
+ skipped: "Пропущено",
+ cancelled: "Отменено",
+ },
+ summary: {
+ printing: "Печатается",
+ queued: "В очереди",
+ totalTime: "Общее время очереди",
+ totalWeight: "Общий вес очереди",
+ history: "История",
+ },
+ filter: {
+ allPrinters: "Все принтеры",
+ unassigned: "Не назначено",
+ allStatus: "Все состояния",
+ allLocations: "Все расположения",
+ any: "Любое",
+ },
+ sort: {
+ byPosition: "По позиции",
+ byName: "По названию",
+ byPrinter: "По принтеру",
+ bySchedule: "По времени запуска",
+ byDate: "По дате",
+ ascendingOldest: "По возрастанию (сначала старые)",
+ descendingNewest: "По убыванию (сначала новые)",
+ },
+ badges: {
+ staged: "Подготовлено",
+ requiresPrevious: "Требуется успешное предыдущее задание",
+ autoPowerOff: "Автоотключение питания",
+ gcodeInjection: "G-code",
+ },
+ empty: {
+ title: "Нет запланированных заданий",
+ description: "Запланируйте печать на странице архива через пункт «Запланировать» в контекстном меню либо перетащите сюда файлы.",
+ },
+ time: {
+ asap: "Как можно скорее",
+ overdue: "Просрочено",
+ now: "Сейчас",
+ lessThanMinute: "Меньше чем через минуту",
+ inMinutes: "Через {{count}} мин",
+ inHours: "Через {{count}} ч",
+ },
+ actions: {
+ startPrint: "Запустить печать",
+ stopPrint: "Остановить печать",
+ requeue: "Вернуть в очередь",
+ },
+ bulkEdit: {
+ title: "Изменить {{count}} задание",
+ title_plural: "Изменить задания: {{count}}",
+ description: "К выбранным заданиям будут применены только изменённые параметры.",
+ printer: "Принтер",
+ noChange: "— Без изменений —",
+ queueOptions: "Параметры очереди",
+ staged: "Подготовлено (ручной запуск)",
+ autoPowerOff: "Отключить питание после печати",
+ requirePrevious: "Требовать успешного завершения предыдущего задания",
+ printOptions: "Параметры печати",
+ bedLevelling: "Калибровка стола",
+ flowCalibration: "Калибровка потока",
+ vibrationCalibration: "Калибровка вибраций",
+ layerInspection: "Проверка первого слоя",
+ timelapse: "Таймлапс",
+ useAms: "Использовать AMS",
+ nozzleOffsetCali: "Калибровка смещения сопел",
+ applyChanges: "Применить изменения",
+ selectAll: "Выбрать все",
+ deselectAll: "Снять выделение",
+ selected: "Выбрано: {{count}}",
+ editSelected: "Изменить выбранные",
+ cancelSelected: "Отменить выбранные",
+ },
+ confirm: {
+ cancelTitle: "Отменить запланированную печать",
+ cancelMessage: "Отменить задание «{{name}}»?",
+ stopTitle: "Остановить печать",
+ stopMessage: "Остановить текущую печать «{{name}}»? Задание на принтере будет отменено.",
+ removeTitle: "Удалить из истории",
+ removeMessage: "Удалить «{{name}}» из истории очереди?",
+ clearHistoryTitle: "Очистить историю",
+ clearHistoryMessage: "Удалить все записи из истории ({{count}})?",
+ cancelButton: "Отменить печать",
+ stopButton: "Остановить печать",
+ thisPrint: "эту печать",
+ thisItem: "это задание",
+ },
+ toast: {
+ cancelled: "Задание отменено",
+ cancelFailed: "Не удалось отменить задание",
+ removed: "Задание удалено",
+ removeFailed: "Не удалось удалить задание",
+ stopped: "Печать остановлена",
+ stopFailed: "Не удалось остановить печать",
+ released: "Задание передано в очередь",
+ startFailed: "Не удалось запустить печать",
+ reorderFailed: "Не удалось изменить порядок очереди",
+ historyCleared: "Удалено записей истории: {{count}}",
+ clearHistoryFailed: "Не удалось очистить историю",
+ updateFailed: "Не удалось обновить задания",
+ bulkCancelled: "Отменено заданий: {{count}}",
+ bulkCancelFailed: "Не удалось отменить задания",
+ batchCreated: "Партия «{{name}}» создана",
+ batchCreateFailed: "Не удалось создать партию",
+ batchUngrouped: "Разгруппировано заданий: {{count}}",
+ batchUngroupFailed: "Не удалось разгруппировать партию",
+ resumedAfterFailure: "Очередь возобновлена — восстановлено заданий: {{restored}}",
+ resumeAfterFailureFailed: "Не удалось возобновить очередь",
+ },
+ resumeAfterFailure: {
+ banner: "Очередь принтера {{printer}} заблокирована из-за ошибки предыдущей печати — пропущено заданий: {{count}}",
+ bannerHint: "Устраните проблему с принтером, затем возобновите очередь, чтобы вернуть пропущенные задания и снять блокировку.",
+ button: "Возобновить после ошибки",
+ confirmTitle: "Возобновить очередь после ошибки?",
+ confirmMessage: "Вернуть пропущенные задания ({{count}}) для принтера {{printer}} в состояние ожидания и снять блокировку. Перед продолжением убедитесь, что принтер готов.",
+ },
+ timeline: {
+ listView: "Список",
+ timelineView: "Временная шкала",
+ unassigned: "Не назначено",
+ noData: "На этот день печать не запланирована",
+ nothingCommitted: "В этом интервале нет заданий с фиксированным временем. Подготовленные и ожидающие задания, а также задания «как можно скорее» на свободных принтерах не показываются — задайте время запуска или выпустите подготовленное задание в очередь.",
+ allDoneBy: "Расчётное завершение всех заданий: {{time}}",
+ staged: "Подготовлено",
+ filterAll: "Показать все",
+ filterPrinting: "Печатается",
+ filterQueued: "В очереди",
+ time: {
+ anyMoment: "в любой момент",
+ minutesLeft: "осталось {{minutes}} мин",
+ hoursLeft: "осталось {{hours}} ч",
+ hoursMinutesLeft: "осталось {{hours}} ч {{minutes}} мин",
+ },
+ day: {
+ previous: "Предыдущий день",
+ next: "Следующий день",
+ today: "Сегодня",
+ },
+ window: {
+ back12h: "Назад на 12 часов",
+ forward12h: "Вперёд на 12 часов",
+ now: "Сейчас",
+ },
+ printerColumnHeader: "Принтер",
+ },
+ permissions: {
+ noStopPrint: "У вас нет разрешения останавливать печать",
+ noStartPrint: "У вас нет разрешения запускать печать",
+ noEdit: "У вас нет разрешения изменять это задание",
+ noCancel: "У вас нет разрешения отменять это задание",
+ noRequeue: "У вас нет разрешения возвращать задания в очередь",
+ noRemove: "У вас нет разрешения удалять это задание",
+ noClearHistory: "У вас нет разрешения очищать историю",
+ noEditItems: "У вас нет разрешения изменять задания очереди",
+ noCancelItems: "У вас нет разрешения отменять задания очереди",
+ },
+ },
+ stats: {
+ title: "Статистика",
+ subtitle: "Перетаскивайте виджеты для изменения порядка. Нажмите значок глаза, чтобы скрыть виджет.",
+ overview: "Обзор",
+ totalPrints: "Всего печатей",
+ successRate: "Успешность",
+ totalPrintTime: "Общее время печати",
+ printTime: "Время печати",
+ totalFilament: "Всего использовано филамента",
+ filamentUsed: "Использовано филамента",
+ filamentCost: "Стоимость филамента",
+ totalCost: "Общая стоимость",
+ energyUsed: "Потреблено энергии",
+ energyCost: "Стоимость энергии",
+ energyWarmingUpTooltip: "Учёт энергии ещё накапливает почасовые снимки. Итоги за выбранный период станут точными, когда появится хотя бы один снимок до начала этого периода. Первые значения могут быть занижены.",
+ averagePrintTime: "Среднее время печати",
+ printsPerDay: "Печатей в день",
+ byPrinter: "По принтерам",
+ printsByPrinter: "Печати по принтерам",
+ byMaterial: "По материалам",
+ byMonth: "По месяцам",
+ last7Days: "Последние 7 дней",
+ last30Days: "Последние 30 дней",
+ last90Days: "Последние 90 дней",
+ allTime: "За всё время",
+ quickStats: "Краткая статистика",
+ printActivity: "Активность печати",
+ filamentTypes: "Типы филамента",
+ filamentTrends: "Расход филамента",
+ failureAnalysis: "Анализ неудач",
+ timeAccuracy: "Точность оценки времени",
+ successful: "Успешно:",
+ failed: "Неудачно:",
+ cancelled: "Отменено:",
+ perfectEstimate: "100% — точное совпадение с оценкой",
+ noTimeAccuracyData: "Данных о точности оценки времени пока нет",
+ noFilamentData: "Нет данных о филаменте",
+ noPrinterData: "Нет данных о принтерах",
+ noPrintData: "Нет данных о печати",
+ noPrintDataLast30Days: "За последние 30 дней данных о печати нет",
+ failureReasons: "Причины неудач",
+ topFailureReasons: "Основные причины неудач",
+ failedPrintsCount: "Неудачных печатей: {{failed}} из {{total}}",
+ lastWeekRate: "За прошлую неделю: {{rate}}%",
+ resetLayout: "Сбросить расположение",
+ recalculateCosts: "Пересчитать стоимость",
+ recalculateCostsHint: "Пересчитать стоимость всех архивных заданий по текущим ценам филамента",
+ exportStats: "Экспорт статистики",
+ exportAsCsv: "Экспорт в CSV",
+ exportAsExcel: "Экспорт в Excel",
+ hiddenCount: "Скрыто: {{count}}",
+ exportDownloaded: "Файл экспорта скачан",
+ exportFailed: "Не удалось экспортировать данные",
+ layoutReset: "Расположение сброшено",
+ recalculatedCosts: "Пересчитана стоимость архивов: {{count}}",
+ recalculateFailed: "Не удалось пересчитать стоимость",
+ loadingStats: "Загрузка статистики...",
+ noPermissionResetLayout: "У вас нет разрешения сбрасывать расположение",
+ noPermissionRecalculate: "У вас нет разрешения пересчитывать стоимость",
+ noPrintDataInRange: "В выбранном периоде нет данных о печати",
+ periodFilament: "Филамент за период",
+ periodCost: "Стоимость за период",
+ avgPerPrint: "В среднем на печать",
+ usageOverTime: "Расход по времени",
+ filamentByWeight: "По весу",
+ printDuration: "Продолжительность печати",
+ printerUtilization: "Загрузка принтеров",
+ filamentSuccess: "Успешность по материалам",
+ printHabits: "Характер печати",
+ printTimeOfDay: "Время суток",
+ colorDistribution: "Распределение по цветам",
+ noColorData: "Нет данных о цветах",
+ records: "Рекорды",
+ longestPrint: "Самая долгая печать",
+ heaviestPrint: "Самая тяжёлая печать",
+ mostExpensivePrint: "Самая дорогая печать",
+ busiestDay: "Самый загруженный день",
+ successStreak: "Серия успешных печатей",
+ streakPrint: "успешная печать подряд",
+ streakPrints: "{{count}} успешных печатей подряд",
+ printerStats: "Статистика принтеров",
+ hours: "часов",
+ avgPrints: "В среднем печатей",
+ noArchiveData: "Нет данных о печати",
+ filamentByTime: "По времени",
+ avgWeight: "Средний вес",
+ avgTime: "Среднее время",
+ filamentByPrints: "По количеству печатей",
+ timeframe: {
+ today: "Сегодня",
+ "this-week": "Эта неделя",
+ "this-month": "Этот месяц",
+ "last-7": "Последние 7 дней",
+ "last-30": "Последние 30 дней",
+ "last-90": "Последние 90 дней",
+ "this-year": "Этот год",
+ "all-time": "За всё время",
+ custom: "Произвольный период",
+ from: "С",
+ to: "По",
+ },
+ allUsers: "Все пользователи",
+ noUser: "Без пользователя (система)",
+ filterByUser: "Фильтр по пользователю",
+ },
+ maintenance: {
+ title: "Обслуживание",
+ overview: "Обзор",
+ allOk: "Всё обслуживание выполнено вовремя",
+ dueCount: "Требуется выполнить: {{count}}",
+ dueCount_plural: "Требуется выполнить: {{count}}",
+ warningCount: "Предупреждений: {{count}}",
+ warningCount_plural: "Предупреждений: {{count}}",
+ totalPrintTime: "Общее время печати",
+ nextMaintenance: "Следующее обслуживание",
+ nothingDue: "Пока ничего не требуется",
+ tasks: "Задачи",
+ lastPerformed: "Последнее выполнение",
+ interval: "Интервал",
+ hoursRemaining: "Осталось {{hours}} ч",
+ hoursOverdue: "Просрочено на {{hours}} ч",
+ markDone: "Отметить выполненным",
+ performMaintenance: "Выполнить обслуживание",
+ history: "История",
+ noHistory: "История обслуживания пуста",
+ editPrintHours: "Изменить часы печати",
+ currentHours: "Текущие часы",
+ statusTab: "Состояние",
+ settingsTab: "Настройки",
+ overdueCount: "Просрочено: {{count}}",
+ dueSoonCount: "Скоро потребуется: {{count}}",
+ dueSoon: "Скоро потребуется",
+ allGood: "Всё в порядке",
+ overdueBy: "Просрочено на {{duration}}",
+ dueIn: "Через {{duration}}",
+ timeLeft: "Осталось {{duration}}",
+ day: "1 день",
+ days: "{{count}} дней",
+ week: "1 неделя",
+ weeks: "{{count}} недель",
+ month: "1 месяц",
+ months: "{{count}} месяцев",
+ year: "1 год",
+ maintenanceTypes: "Виды обслуживания",
+ maintenanceTypesDescription: "Системные и пользовательские задачи обслуживания",
+ addCustomType: "Добавить пользовательскую задачу",
+ restoreDefaults: "Восстановить стандартные задачи",
+ intervalType: "Тип интервала",
+ intervalValue: "Интервал ({{type}})",
+ icon: "Значок",
+ documentationLink: "Ссылка на документацию (необязательно)",
+ assignToPrinters: "Назначить принтерам",
+ selectAtLeastOnePrinter: "Выберите хотя бы один принтер",
+ addType: "Добавить вид",
+ custom: "Пользовательский",
+ printHours: "Часы печати",
+ calendarDays: "Календарные дни",
+ exampleName: "Например: заменить HEPA-фильтр",
+ viewDocumentation: "Открыть документацию",
+ timeBasedInterval: "Интервал по времени",
+ intervalOverrides: "Переопределение интервалов",
+ intervalOverridesDescription: "Настройка отдельных интервалов для конкретных принтеров",
+ assignedToPrinters: "Назначено принтерам:",
+ noPrintersAssigned: "Не назначено ни одному принтеру",
+ addPrinterShort: "Добавить:",
+ printersAssignedClick: "Назначено принтерам: {{count}} — нажмите для управления",
+ removeFromPrinter: "Убрать с этого принтера",
+ types: {
+ lubricateCarbonRods: "Смазать карбоновые валы",
+ lubricateRails: "Смазать линейные направляющие",
+ cleanNozzle: "Очистить сопло/хотэнд",
+ checkBelts: "Проверить натяжение ремней",
+ cleanBuildPlate: "Очистить печатную пластину",
+ checkExtruder: "Проверить шестерни экструдера",
+ checkCooling: "Проверить вентиляторы охлаждения",
+ generalInspection: "Общий осмотр",
+ cleanCarbonRods: "Очистить карбоновые валы",
+ lubricateSteelRods: "Смазать стальные валы",
+ cleanSteelRods: "Очистить стальные валы",
+ cleanLinearRails: "Очистить линейные направляющие",
+ checkPtfeTube: "Проверить PTFE-трубку",
+ replaceHepaFilter: "Заменить HEPA-фильтр",
+ replaceCarbonFilter: "Заменить угольный фильтр",
+ lubricateLeftNozzleRail: "Смазать направляющую левого сопла",
+ },
+ maintenanceComplete: "Обслуживание отмечено выполненным",
+ typeUpdated: "Вид обслуживания обновлён",
+ typeDeleted: "Вид обслуживания удалён",
+ defaultsRestored: "Восстановлено стандартных задач: {{count}}",
+ printHoursUpdated: "Часы печати обновлены",
+ printerAssigned: "Принтер назначен",
+ printerRemoved: "Принтер удалён из назначения",
+ deleteTypeConfirm: "Удалить «{{name}}»?",
+ deleteSystemTypeTitle: "Удалить стандартную задачу обслуживания?",
+ deleteSystemTypeMessage: "Удалить стандартную задачу обслуживания «{{name}}»?",
+ noPermissionUpdate: "У вас нет разрешения обновлять задачи обслуживания",
+ noPermissionPerform: "У вас нет разрешения отмечать обслуживание выполненным",
+ noPermissionEditTypes: "У вас нет разрешения изменять виды обслуживания",
+ noPermissionDeleteTypes: "У вас нет разрешения удалять виды обслуживания",
+ noPermissionEditHours: "У вас нет разрешения изменять часы печати",
+ noPermissionRemovePrinter: "У вас нет разрешения удалять назначения принтеров",
+ noPermissionAssignPrinter: "У вас нет разрешения назначать принтеры",
+ noPermissionEditIntervals: "У вас нет разрешения изменять интервалы",
+ configureSettings: "Настроить виды обслуживания и интервалы",
+ },
+ settings: {
+ title: "Настройки",
+ general: "Общие",
+ tabs: {
+ general: "Общие",
+ smartPlugs: "Умные розетки",
+ notifications: "Уведомления",
+ queue: "Рабочий процесс",
+ queueDispatch: "Очередь и отправка",
+ queuePipelines: "Конвейеры",
+ filament: "Филамент",
+ network: "Сеть",
+ apiKeys: "Ключи API",
+ virtualPrinter: "Виртуальный принтер",
+ spoolbuddy: "SpoolBuddy",
+ failureDetection: "Обнаружение сбоев",
+ users: "Аутентификация",
+ backup: "Резервное копирование",
+ emailAuth: "Аутентификация по email",
+ ldap: "LDAP",
+ twoFa: "Двухфакторная аутентификация",
+ oidc: "SSO / OIDC",
+ security: "Безопасность",
+ },
+ spoolbuddy: {
+ infoTitle: "Устройства SpoolBuddy",
+ infoBody: "Киоски SpoolBuddy регистрируются автоматически по сигналам активности. Удалите регистрацию устройства, если оно больше не используется или после сбоя демона остался устаревший дубликат.",
+ duplicatesTitle: "Зарегистрировано устройств: {{count}}",
+ duplicatesBody: "Интерфейс киоска использует только первое зарегистрированное устройство. Если один из экземпляров — устаревший дубликат после сбоя, удалите его регистрацию: работающее устройство зарегистрируется снова при следующем сигнале активности.",
+ empty: "Устройства SpoolBuddy пока не зарегистрированы.",
+ online: "В сети",
+ offline: "Не в сети",
+ unregister: "Удалить регистрацию",
+ unregisterSuccess: "Регистрация устройства удалена",
+ unregisterError: "Не удалось удалить регистрацию устройства",
+ confirmTitle: "Удалить регистрацию устройства SpoolBuddy?",
+ confirmBody: "Устройство «{{hostname}}» ({{deviceId}}) будет удалено из базы данных. Если оно работает, то зарегистрируется снова при следующем сигнале активности.",
+ ipAddress: "IP-адрес",
+ firmware: "Прошивка",
+ lastSeen: "Последняя активность",
+ daemonUptime: "Время работы демона",
+ systemUptime: "Время работы системы",
+ never: "никогда",
+ nfc: "NFC",
+ scale: "Весы",
+ cpuTemp: "Температура ЦП",
+ cpuLoad: "Загрузка ЦП",
+ memory: "Память",
+ disk: "Диск",
+ update: "Обновить",
+ updateConfirmTitle: "Обновить демон SpoolBuddy?",
+ updateConfirmBody: "Запустить обновление ПО на «{{hostname}}»? После установки обновления демон будет перезапущен.",
+ restartBrowser: "Перезапустить браузер",
+ restartBrowserConfirmTitle: "Перезапустить браузер киоска?",
+ restartBrowserConfirmBody: "Перезапустить браузер киоска на «{{hostname}}»? Экран ненадолго погаснет.",
+ restartDaemon: "Перезапустить демон",
+ restartDaemonConfirmTitle: "Перезапустить демон SpoolBuddy?",
+ restartDaemonConfirmBody: "Перезапустить демон SpoolBuddy на «{{hostname}}»? Устройство на несколько секунд пропадёт из сети.",
+ reboot: "Перезагрузить",
+ rebootConfirmTitle: "Перезагрузить устройство?",
+ rebootConfirmBody: "Перезагрузить «{{hostname}}»? Устройство будет недоступно около минуты.",
+ shutdown: "Выключить",
+ shutdownConfirmTitle: "Выключить устройство?",
+ shutdownConfirmBody: "Выключить «{{hostname}}»? Для повторного включения потребуется физический доступ.",
+ commandConfirm: "Подтвердить",
+ commandQueued: "Команда поставлена в очередь",
+ commandError: "Не удалось отправить команду",
+ },
+ ldap: {
+ title: "Аутентификация LDAP",
+ enabledDesc: "Аутентификация LDAP включена",
+ disabledDesc: "Аутентификация LDAP отключена",
+ disabledHint: "Настройте и сохраните параметры LDAP ниже, затем включите аутентификацию.",
+ enabled: "Аутентификация LDAP включена",
+ disabled: "Аутентификация LDAP отключена",
+ feature1: "Пользователи могут входить с учётными данными LDAP",
+ feature2: "Локальная учётная запись администратора остаётся резервным способом входа",
+ feature3: "При входе группы LDAP сопоставляются с группами Bambuddy",
+ serverConfig: "Настройка сервера LDAP",
+ serverUrl: "Адрес сервера",
+ serverUrlHint: "Используйте ldaps:// для SSL либо ldap:// с StartTLS",
+ security: "Безопасность",
+ securityHint: "StartTLS переводит обычное соединение на TLS. LDAPS использует TLS с самого начала.",
+ bindDn: "Bind DN (служебная учётная запись)",
+ bindPassword: "Пароль Bind",
+ searchBase: "Базовый DN поиска",
+ userFilter: "Фильтр поиска пользователей",
+ userFilterHint: "{username} заменяется именем пользователя при входе. Для OpenLDAP используйте (uid={username}).",
+ advanced: "Дополнительно",
+ autoProvision: "Автоматически создавать пользователей",
+ autoProvisionHint: "Автоматически создавать учётную запись Bambuddy при первом входе через LDAP",
+ defaultGroup: "Группа по умолчанию",
+ defaultGroupNone: "— Нет (без резервной группы) —",
+ defaultGroupHint: "Резервная группа для пользователя LDAP, который успешно вошёл, но не состоит ни в одной сопоставленной группе LDAP. Оставьте пустым, чтобы такие пользователи не получали разрешений.",
+ groupMapping: "Сопоставление групп (JSON)",
+ groupMappingHint: "Сопоставьте DN групп LDAP с группами Bambuddy. Доступные группы: ",
+ testConnection: "Проверить подключение",
+ settingsSaved: "Настройки LDAP сохранены",
+ errors: {
+ serverRequired: "Укажите адрес сервера LDAP",
+ searchBaseRequired: "Укажите базовый DN поиска",
+ enableAuthFirst: "Сначала включите аутентификацию",
+ configureLdapFirst: "Сначала сохраните настройки LDAP",
+ },
+ },
+ email: {
+ smtpSettings: "Настройка SMTP",
+ smtpHost: "SMTP-сервер",
+ smtpPort: "Порт SMTP",
+ security: "Безопасность",
+ authentication: "Аутентификация",
+ username: "Имя пользователя",
+ password: "Пароль",
+ fromEmail: "Адрес отправителя",
+ fromName: "Имя отправителя",
+ testConnection: "Проверить подключение SMTP",
+ testRecipient: "Адрес получателя тестового письма",
+ sendTest: "Отправить тестовое письмо",
+ sending: "Отправка...",
+ save: "Сохранить настройки",
+ saving: "Сохранение...",
+ advancedAuth: "Расширенная аутентификация",
+ advancedAuthEnabled: "Расширенная аутентификация включена",
+ advancedAuthEnabledDesc: "Функции управления пользователями через email активны. Новые пользователи получают автоматически созданные пароли по почте и могут сбрасывать пароль через функцию восстановления.",
+ advancedAuthDisabled: "Расширенная аутентификация отключена",
+ advancedAuthDisabledDesc: "Включите расширенную аутентификацию, чтобы использовать почтовые функции управления пользователями.",
+ enable: "Включить",
+ disable: "Отключить",
+ feature1: "Пароли для новых пользователей создаются автоматически и отправляются по email",
+ feature2: "Пользователи могут входить по имени или адресу электронной почты",
+ feature3: "Доступно восстановление забытого пароля",
+ feature4: "Администраторы могут сбрасывать пароли пользователей по email",
+ errors: {
+ requiredFields: "Заполните все обязательные поля",
+ usernameRequired: "При включённой аутентификации требуется имя пользователя",
+ enterTestEmail: "Введите адрес для тестового письма",
+ smtpServerAndEmail: "Перед проверкой укажите SMTP-сервер и адрес отправителя",
+ usernamePasswordRequired: "При включённой аутентификации требуются имя пользователя и пароль",
+ configureSmtpFirst: "Сначала настройте и проверьте SMTP",
+ enableAuthFirst: "Чтобы использовать почтовые функции, сначала включите аутентификацию.",
+ },
+ success: {
+ settingsSaved: "Настройки SMTP сохранены",
+ },
+ securityOptions: {
+ starttls: "STARTTLS (порт 587)",
+ ssl: "SSL/TLS (порт 465)",
+ none: "Без шифрования (порт 25)",
+ },
+ authOptions: {
+ enabled: "Включена",
+ disabled: "Отключена",
+ },
+ },
+ appearance: "Внешний вид",
+ notifications: "Уведомления",
+ smartPlugs: "Умные розетки",
+ spoolman: "Spoolman",
+ updates: "Обновления",
+ language: "Язык",
+ languageDescription: "Выберите предпочитаемый язык",
+ theme: "Тема",
+ themeLight: "Светлая",
+ themeDark: "Тёмная",
+ themeSystem: "Системная",
+ defaultView: "Страница по умолчанию",
+ defaultViewDescription: "Страница, которая открывается при запуске приложения",
+ checkForUpdates: "Проверить обновления",
+ autoUpdate: "Автоматическое обновление",
+ currentVersion: "Текущая версия",
+ latestVersion: "Последняя версия",
+ upToDate: "Установлена последняя версия",
+ updateAvailable: "Доступно обновление",
+ notificationLanguage: "Язык уведомлений",
+ notificationLanguageDescription: "Язык push-уведомлений",
+ bedCooledThreshold: "Порог остывания стола",
+ bedCooledThresholdDescription: "Температура, ниже которой стол после печати считается остывшим",
+ userNotificationsEnabled: "Пользовательские уведомления",
+ userNotificationsEnabledDescription: "Включить меню пользовательских и почтовых уведомлений о событиях печати. Требуется расширенная аутентификация.",
+ userNotificationsDisabledHint: "Для пользовательских уведомлений включите расширенную аутентификацию.",
+ notificationProviders: "Провайдеры уведомлений",
+ addProvider: "Добавить провайдера",
+ editProvider: "Изменить провайдера",
+ providerType: "Тип провайдера",
+ testNotification: "Проверить уведомление",
+ testSuccess: "Тестовое уведомление успешно отправлено",
+ testFailed: "Не удалось отправить тестовое уведомление",
+ quietHours: "Тихие часы",
+ quietHoursDescription: "Не беспокоить в указанный период",
+ quietHoursStart: "Начало",
+ quietHoursEnd: "Окончание",
+ events: {
+ title: "События уведомлений",
+ printStart: "Печать началась",
+ printComplete: "Печать завершена",
+ printFailed: "Ошибка печати",
+ printStopped: "Печать остановлена",
+ printProgress: "Этапы выполнения",
+ printProgressDescription: "Уведомлять при 25%, 50% и 75%",
+ printerOffline: "Принтер не в сети",
+ printerError: "Ошибка принтера",
+ filamentLow: "Филамент заканчивается",
+ maintenanceDue: "Требуется обслуживание",
+ maintenanceDueDescription: "Уведомлять, когда наступил срок обслуживания",
+ },
+ smartPlug: {
+ title: "Умные розетки",
+ add: "Добавить умную розетку",
+ edit: "Изменить умную розетку",
+ name: "Название",
+ ipAddress: "IP-адрес",
+ linkedPrinter: "Связанный принтер",
+ autoOn: "Автоматическое включение",
+ autoOnDescription: "Включать при начале печати",
+ autoOff: "Автоматическое выключение",
+ autoOffDescription: "Выключать после завершения печати",
+ offDelay: "Задержка выключения",
+ offDelayMinutes: "Минут после печати",
+ offDelayTemp: "Когда сопло остынет ниже заданной температуры",
+ currentState: "Текущее состояние",
+ turnOn: "Включить",
+ turnOff: "Выключить",
+ },
+ filamentTracking: "Учёт филамента",
+ filamentTrackingDesc: "Выберите способ учёта катушек: встроенный инвентарь или внешний сервер Spoolman.",
+ autoAddUnknownRfid: "Автоматически добавлять неизвестные RFID-катушки",
+ autoAddUnknownRfidDesc: "Автоматически создавать запись в инвентаре при обнаружении катушки с неизвестной RFID-меткой. Отключите, если регистрируете новые катушки заранее, чтобы избежать дубликатов.",
+ filamentChecks: "Проверки филамента",
+ disableFilamentWarnings: "Отключить предупреждения о филаменте",
+ disableFilamentWarningsDesc: "Не показывать предупреждения о нехватке филамента при запуске печати или добавлении в очередь",
+ preferLowestFilament: "Предпочитать катушку с наименьшим остатком",
+ preferLowestFilamentDesc: "Если подходят несколько катушек, использовать катушку с наименьшим остатком филамента",
+ preferLowestFilamentBackupNote: "Работает только при включённом AMS Filament Backup: иначе принтер не сможет переключиться на вторую катушку после окончания выбранной.",
+ trackingModeBuiltIn: "Встроенный инвентарь",
+ trackingModeBuiltInDesc: "Автоматическое сопоставление RFID и учёт расхода",
+ trackingModeSpoolmanDesc: "Внешний сервер управления филаментом",
+ builtInFeatureRfid: "Автоматически определяет официальные RFID-катушки Bambu Lab в AMS",
+ builtInFeatureUsage: "Учитывает расход филамента для каждой печати",
+ builtInFeatureCatalog: "Управление катушками, цветами и профилями K-фактора",
+ builtInFeatureThirdParty: "Сторонние катушки можно связать с катушками инвентаря",
+ amsSyncButton: "Синхронизировать вес из AMS",
+ amsSyncTitle: "Синхронизация веса катушек из AMS",
+ amsSyncMessage: "Вес всех катушек инвентаря будет заменён текущими значениями остатка из AMS подключённых принтеров. Используйте это для восстановления повреждённых данных о весе. Принтеры должны быть в сети.",
+ amsSyncing: "Синхронизация...",
+ amsSyncSuccess: "Синхронизировано катушек: {{synced}}, пропущено: {{skipped}}",
+ amsSyncError: "Не удалось синхронизировать вес из AMS",
+ spoolmanAmsSyncButton: "Синхронизировать вес Spoolman из AMS",
+ spoolmanAmsSyncTitle: "Синхронизация веса катушек Spoolman из AMS",
+ spoolmanAmsSyncMessage: "Вес всех катушек Spoolman будет обновлён по текущим значениям остатка из AMS подключённых принтеров. Принтеры должны быть в сети.",
+ spoolmanAmsSyncing: "Синхронизация...",
+ spoolmanAmsSyncSuccess: "Синхронизировано катушек: {{synced}}, пропущено: {{skipped}}",
+ spoolmanAmsSyncError: "Не удалось синхронизировать вес Spoolman из AMS",
+ spoolmanAmsSyncErrorUnreachable: "Не удалось синхронизировать вес Spoolman: сервер недоступен",
+ spoolmanAmsSyncErrorNotConfigured: "Не удалось синхронизировать вес Spoolman: сервер не настроен",
+ spoolmanNotConfigured: "Spoolman не настроен",
+ spoolmanFilamentCatalogTitle: "Каталог филамента Spoolman",
+ spoolmanFilamentCatalogDesc: "Названия филаментов и масса пустых катушек из Spoolman. Здесь можно изменить название и массу катушки; остальные свойства редактируются непосредственно в Spoolman.",
+ spoolmanUrl: "Адрес Spoolman",
+ spoolmanUrlHint: "Адрес сервера Spoolman, например http://localhost:7912",
+ spoolmanConnected: "Подключён",
+ spoolmanDisconnected: "Отключён",
+ status: "Состояние",
+ connect: "Подключить",
+ disconnect: "Отключить",
+ howSyncWorks: "Как работает синхронизация",
+ syncInfoRfidOnly: "Синхронизируются только официальные RFID-катушки Bambu Lab",
+ syncInfoAutoCreate: "Новые катушки автоматически создаются в Spoolman при первой синхронизации",
+ syncInfoThirdPartySkipped: "Неофициальные катушки Bambu Lab, сторонние и перезаправленные катушки пропускаются",
+ linkingExistingSpools: "Привязка существующих катушек",
+ linkingExistingSpoolsDesc: "Чтобы привязать существующую катушку Spoolman к AMS, наведите указатель на слот AMS и нажмите «Привязать к Spoolman».",
+ syncMode: "Режим синхронизации",
+ syncModeAuto: "Автоматически",
+ syncModeManual: "Только вручную",
+ syncModeAutoDesc: "Данные AMS синхронизируются автоматически при обнаружении изменений",
+ syncModeManualDesc: "Синхронизация выполняется только вручную",
+ syncAmsData: "Синхронизировать данные AMS",
+ syncAmsDataDesc: "Вручную синхронизировать данные AMS принтера со Spoolman",
+ allPrinters: "Все принтеры",
+ noDefaultPrinter: "Без принтера по умолчанию (спрашивать каждый раз)",
+ sidebarOrder: "Порядок пунктов боковой панели",
+ saveThumbnails: "Сохранять миниатюры",
+ captureFinishPhoto: "Снимок после завершения",
+ noPrintersConfigured: "Принтеры не настроены",
+ archiveMode: {
+ always: "Всегда создавать запись в архиве",
+ never: "Не создавать запись в архиве",
+ ask: "Спрашивать каждый раз",
+ },
+ checkForUpdatesLabel: "Проверять обновления",
+ checkPrinterFirmware: "Проверять прошивку принтера",
+ includeBetaUpdates: "Включать бета-версии",
+ includeBetaUpdatesDesc: "Уведомлять о бета- и предварительных версиях при проверке обновлений",
+ localLogin: {
+ disable: "Отключить локальный вход по имени пользователя и паролю",
+ disableHint: "Если включено, вход возможен только через провайдеров SSO. На LDAP это не влияет. Чтобы сохранить аварийный способ входа, задайте на сервере BAMBUDDY_LOCAL_LOGIN=true.",
+ },
+ enableRetry: "Включить повторные попытки",
+ homeAssistantDescription: "Управление умными розетками через Home Assistant",
+ environmentManagedLabel: "(управляется окружением)",
+ autoEnabledViaEnv: "Автоматически включено переменными окружения",
+ urlFromEnvReadOnly: "Значение задано переменной окружения HA_URL (только чтение)",
+ tokenFromEnvReadOnly: "Значение задано переменной окружения HA_TOKEN (только чтение)",
+ mqttConnectedTo: "Подключено к",
+ prometheusDescription: "Экспортировать данные принтеров в формате Prometheus",
+ noSmartPlugsTitle: "Умные розетки не настроены",
+ noSmartPlugsDescription: "Добавьте умную розетку на базе Tasmota для учёта энергии и автоматизации питания.",
+ noProvidersTitle: "Провайдеры не настроены",
+ noProvidersDescription: "Добавьте провайдера для получения уведомлений.",
+ noTemplatesAvailable: "Шаблоны отсутствуют. Перезапустите бэкенд, чтобы создать стандартные шаблоны.",
+ apiPermissionView: "Просмотр состояния принтеров и очереди",
+ apiPermissionEdit: "Добавление и удаление заданий из очереди печати",
+ apiKeysEmptyTitle: "Ключей API нет",
+ apiKeysEmptyDescription: "Создайте ключ API для интеграции с внешними сервисами.",
+ noUsersFound: "Пользователи не найдены",
+ noGroupsFound: "Группы не найдены",
+ noGroupsAvailable: "Доступных групп нет",
+ passwordsDoNotMatch: "Пароли не совпадают",
+ systemGroupWarning: "Названия системных групп изменить нельзя",
+ authDisabledTitle: "Аутентификация отключена",
+ authDisabledFeature1: "Требовать вход для доступа к системе",
+ authDisabledFeature2: "Создавать нескольких пользователей с групповыми разрешениями",
+ authDisabledFeature3: "Управлять доступом с помощью более чем 50 отдельных разрешений",
+ userHasCreated: "Этот пользователь создал:",
+ userItemsQuestion: "Что сделать с этими объектами?",
+ deleteUserConfirm: "Удалить этого пользователя?",
+ actionCannotBeUndone: "Это действие нельзя отменить.",
+ addFirstSmartPlug: "Добавить первую умную розетку",
+ providers: "Провайдеры",
+ log: "Журнал",
+ testAll: "Проверить все",
+ testResults: "Результаты проверки",
+ testPassedCount: "Успешно: {{count}}",
+ testFailedCount: "Ошибок: {{count}}",
+ messageTemplates: "Шаблоны сообщений",
+ messageTemplatesDescription: "Настройте тексты уведомлений для каждого события.",
+ apiKeys: "Ключи API",
+ apiKeysDescription: "Создавайте ключи API для внешних интеграций и вебхуков.",
+ createKey: "Создать ключ",
+ apiKeyCreated: "Ключ API успешно создан",
+ apiKeyCopyWarning: "Скопируйте ключ сейчас — повторно он показан не будет!",
+ useInApiBrowser: "Использовать в обозревателе API",
+ apiKeyQrButton: "QR-код",
+ apiKeyQrTitle: "Сканирование для настройки",
+ apiKeyQrCaption: "Отсканируйте мобильным приложением, чтобы добавить этот сервер и ключ API.",
+ apiKeyQrWarning: "QR-код содержит секретный ключ API — не передавайте его и не публикуйте снимок экрана.",
+ createNewApiKey: "Создать ключ API",
+ keyName: "Название ключа",
+ keyNamePlaceholder: "например, Home Assistant или OctoPrint",
+ readStatus: "Чтение состояния",
+ readStatusDescription: "Просмотр состояния принтеров и очереди",
+ manageQueue: "Управление очередью",
+ manageQueueDescription: "Добавление и удаление заданий из очереди печати",
+ controlPrinter: "Управление принтером",
+ controlPrinterDescription: "Пауза, продолжение и остановка печати",
+ manageLibrary: "Управление библиотекой",
+ manageLibraryDescription: "Загрузка, переименование и удаление файлов библиотеки; импорт моделей из MakerWorld",
+ manageInventory: "Управление запасами",
+ manageInventoryDescription: "Создание, изменение и удаление катушек и записей учёта. Требуется для киосков SpoolBuddy: сканирование NFC, показания весов и системные команды киоска.",
+ manageMaintenance: "Управление обслуживанием",
+ manageMaintenanceDescription: "Регистрация выполненного обслуживания, сброс счётчиков, изменение интервалов и управление каталогом видов обслуживания. Подходит для автоматизаций Home Assistant, которые отмечают, например, «сопло очищено», без предоставления более широких прав управления принтером.",
+ manageArchives: "Управление архивом",
+ manageArchivesDescription: "Изменение и удаление записей архива печати, включая старые задания. Не включает удаление их вклада в статистику. Подходит для автоматизаций очистки истории печати.",
+ manageProjects: "Управление проектами",
+ manageProjectsDescription: "Создание, изменение и удаление проектов, а также добавление в них архивных заданий. Подходит для автоматизаций, распределяющих печати по проектам.",
+ libraryBadge: "Библиотека",
+ inventoryBadge: "Запасы",
+ maintenanceBadge: "Обслуживание",
+ archivesBadge: "Архив",
+ projectsBadge: "Проекты",
+ cloudAccess: "Разрешить доступ к облаку",
+ cloudAccessDescription: "Чтение пресетов и филаментов Bambu Cloud от вашего имени. Требуется вход в Bambu Cloud.",
+ cloudBadge: "Облако",
+ updateEnergyCost: "Обновление тарифа на электроэнергию",
+ updateEnergyCostDescription: "Разрешить этому ключу отправлять новую цену за кВт⋅ч методом POST в /settings/electricity-price. Полезно для автоматизаций динамического тарифа Home Assistant (Tibber, Octopus и т. п.). Это единственный параметр настроек, доступный для записи через ключ API.",
+ energyCostBadge: "Энергия",
+ legacyKey: "Устаревший",
+ legacyKeyTooltip: "Создан до появления привязки к пользователям; пересоздайте для доступа к облаку",
+ unnamedKey: "Ключ без названия",
+ lastUsed: "Последнее использование",
+ read: "Чтение",
+ control: "Управление",
+ createFirstKey: "Создать первый ключ",
+ webhookEndpoints: "Конечные точки вебхуков",
+ webhookApiKeyHint: "Передавайте ключ API в заголовке X-API-Key.",
+ webhook: {
+ getAllStatus: "Получить состояние всех принтеров",
+ getSpecificStatus: "Получить состояние выбранного принтера",
+ addToQueue: "Добавить в очередь печати",
+ pausePrint: "Приостановить печать",
+ resumePrint: "Продолжить печать",
+ stopPrint: "Остановить печать",
+ },
+ apiBrowser: "Обозреватель API",
+ apiBrowserDescription: "Просмотр и проверка всех доступных конечных точек API.",
+ apiKeyForTesting: "Ключ API для проверки",
+ apiKeyPlaceholder: "Вставьте ключ API для проверки защищённых конечных точек…",
+ apiKeyHint: "Ключ будет передан в запросе в заголовке X-API-Key.",
+ deleteApiKeyTitle: "Удаление ключа API",
+ deleteApiKeyMessage: "Удалить этот ключ API? Все использующие его интеграции перестанут работать.",
+ deleteKey: "Удалить ключ",
+ amsDisplayThresholds: "Пороговые значения AMS",
+ amsThresholdsDescription: "Настройте цветовые пороги индикаторов влажности и температуры AMS.",
+ humidity: "Влажность",
+ goodGreen: "Норма (зелёный)",
+ fairOrange: "Допустимо (оранжевый)",
+ aboveFairBad: "Выше допустимого порога отображается красным",
+ fairAlsoDryingThreshold: "Этот порог также запускает автоматическую сушку, если она включена",
+ temperature: "Температура",
+ goodBlue: "Норма (синий)",
+ aboveFairHot: "Выше допустимого порога отображается красным как перегрев",
+ historyRetention: "Хранение истории",
+ keepSensorHistory: "Хранить историю датчиков",
+ historyRetentionDescription: "Более старые данные влажности и температуры будут удаляться автоматически",
+ defaultPrintOptions: "Параметры печати по умолчанию",
+ defaultPrintOptionsDescription: "Задайте значения по умолчанию для новых заданий. Их можно изменить отдельно в диалоге запуска печати.",
+ defaultBedLevelling: "Калибровка стола",
+ defaultBedLevellingDesc: "Автоматически выровнять стол перед печатью",
+ defaultFlowCali: "Калибровка потока",
+ defaultFlowCaliDesc: "Калибровать поток экструзии",
+ defaultVibrationCali: "Калибровка вибраций",
+ defaultVibrationCaliDesc: "Уменьшить артефакты звона",
+ defaultLayerInspect: "Проверка первого слоя",
+ defaultLayerInspectDesc: "Проверка первого слоя системой компьютерного зрения",
+ defaultTimelapse: "Таймлапс",
+ defaultTimelapseDesc: "Записывать таймлапс",
+ defaultNozzleOffsetCali: "Калибровка смещения сопел",
+ defaultNozzleOffsetCaliDesc: "Калибровать взаимное смещение сопел экструдеров",
+ tempFanPresetsTitle: "Пресеты температуры и вентиляторов",
+ tempFanPresetsDescription: "Настройте значения быстрого выбора в меню температуры и скорости вентиляторов карточки принтера. Кнопка «Выкл.» отображается всегда.",
+ tempFanPresetsNozzle: "Температура сопла",
+ tempFanPresetsBed: "Температура стола",
+ tempFanPresetsChamber: "Температура камеры",
+ tempFanPresetsFan: "Скорость вентилятора",
+ tempFanPresetsReset: "Восстановить значения по умолчанию",
+ concurrentUploadsTitle: "Одновременные загрузки",
+ concurrentUploadsDescription: "Количество принтеров, на которые очередь может одновременно отправлять файлы. Передача файлов на принтеры выполняется медленно: крупная модель может загружаться несколько минут, а каждый принтер ждёт своей очереди. В большом парке увеличение этого значения сокращает ожидание последних принтеров в группе. Уменьшите его, если сеть или сервер Bambuddy плохо справляются с параллельной передачей.",
+ concurrentUploadsLabel: "Одновременно загружать на принтеры",
+ concurrentUploadsHelp: "Значение 1 отправляет файл только на один принтер за раз, как в прежнем режиме. По умолчанию: 4.",
+ staggeredStart: "Поэтапный запуск",
+ staggeredStartDescription: "Размер группы и интервал по умолчанию при поэтапном запуске партии на нескольких принтерах. Для каждой партии значения можно изменить в окне запуска печати.",
+ preheatTitle: "Преднагрев и выдержка",
+ preheatDescription: "Нагреть стол и, если поддерживается, камеру, затем выдержать температуру перед запуском каждого задания очереди. Полезно для инженерных пластиков (PA, ABS) на принтерах без активного нагревателя камеры: во время выдержки стол прогревает камеру излучением. Целевая температура стола берётся из файла печати; поведение камеры зависит от модели принтера.",
+ preheatEnabled: "Включить преднагрев и выдержку",
+ preheatEnabledDesc: "Если выключено, задания очереди отправляются сразу. Для каждого задания можно задать отдельное значение.",
+ preheatFilamentTargetsLabel: "Целевая температура камеры по типу филамента (°C)",
+ preheatFilamentTargetsHint: "Bambuddy выбирает наибольшее значение среди задействованных слотов AMS; для печати только PLA автоматически используется 0 и этап прогрева камеры пропускается.",
+ preheatFilamentTargetsReset: "Восстановить значения по умолчанию",
+ preheatFilamentTargetsDefaultRow: "Прочее / без сопоставления",
+ preheatMaxWait: "Максимальное ожидание (с)",
+ preheatMaxWaitHelp: "Предельное время прогрева камеры, после которого процесс продолжится.",
+ preheatSoak: "Выдержка (с)",
+ preheatSoakHelp: "Время выдержки после достижения цели или истечения максимального ожидания.",
+ preheatHardwareTitle: "Поведение по моделям принтеров:",
+ preheatHardwareDetail: "H2C/H2D/H2D Pro/H2S/X2D/X1E активно нагревают камеру командой M141. X1C/P2S измеряют температуру камеры, но прогревают её только теплом стола. У P1S/P1P/A1/A1 Mini нет датчика камеры — применяется только таймер выдержки.",
+ preheatPerItemDesc: "Нагревать стол и камеру перед запуском этого задания. По умолчанию используется общий переключатель «Настройки → Рабочий процесс».",
+ preheatOverride_inherit: "Наследовать",
+ preheatOverride_on: "Включено",
+ preheatOverride_off: "Выключено",
+ preheatTargetOverride: "Переопределение температуры камеры (°C; пусто — значение для филамента)",
+ plateClear: "Подтверждение очистки пластины",
+ requirePlateClear: "Требовать подтверждение очистки пластины",
+ requirePlateClearDescription: "Если включено, планировщик не запускает следующее задание на принтере с завершённой печатью, пока не подтверждена очистка пластины. Отключение также скрывает индикатор состояния пластины и кнопку «Пластина очищена» на карточках принтеров.",
+ gcodeInjection: "Вставка G-кода",
+ gcodeInjectionDescription: "Настройте G-код, добавляемый в начало и/или конец печати для систем автоматического запуска, таких как Farmloop, SwapMod, AutoClear и Printflow 3D. Фрагменты задаются отдельно для каждой модели принтера и применяются, когда для задания очереди включена вставка G-кода.",
+ gcodeInjectionNoPrinters: "Принтеры не найдены. Добавьте принтеры, чтобы настроить фрагменты G-кода.",
+ gcodeStartLabel: "Начальный G-код",
+ gcodeEndLabel: "Завершающий G-код",
+ gcodeStartPlaceholder: "G-код, добавляемый перед началом печати…",
+ gcodeEndPlaceholder: "G-код, добавляемый после завершения печати…",
+ staggerGroupSize: "Размер группы",
+ staggerGroupSizeHelp: "Количество принтеров, запускаемых одновременно",
+ staggerInterval: "Интервал (мин)",
+ staggerIntervalHelp: "Задержка между запуском групп",
+ queueDrying: "Автоматическая сушка в очереди",
+ queueDryingDescription: "Автоматически сушить филамент в AMS, когда принтер простаивает между заданиями очереди. Запуск определяется указанным выше порогом влажности.",
+ queueDryingEnabled: "Включить автоматическую сушку",
+ queueDryingEnabledDescription: "Автоматически запускать сушку AMS, когда принтер простаивает и влажность выше порога",
+ queueDryingBlock: "Ожидать завершения сушки",
+ queueDryingBlockDescription: "Блокировать очередь печати до завершения сушки. Если выключено, печать имеет приоритет.",
+ ambientDryingEnabled: "Фоновая сушка",
+ ambientDryingEnabledDescription: "Автоматически сушить филамент на простаивающих принтерах при превышении порога влажности, даже если очередь пуста.",
+ printDryingEnabled: "Продолжать сушку во время печати",
+ printDryingEnabledDescription: "Разрешить автоматической сушке продолжаться во время печати на поддерживаемом оборудовании (H2D, H2C, H2S, P2S, H2D Pro, X2D, X1C, A2L с актуальной прошивкой). Для защиты катушек температура автоматически ограничивается на 5 °C ниже пресета сушки в простое.",
+ dryingPresets: "Пресеты сушки",
+ dryingPresetsDescription: "Температура и длительность для каждого типа филамента. AMS 2 Pro использует более низкие температуры, AMS-HT поддерживает более высокие.",
+ dryingFilament: "Филамент",
+ humidityThresholds: "Пороги влажности",
+ humidityThresholdsDescription: "Порог запуска автоматической сушки и предупреждений для каждого типа филамента. При смешанной загрузке AMS используется наименьший порог.",
+ humidityThresholdCol: "Порог",
+ humidityThresholdDefault: "По умолчанию (неизвестные типы)",
+ printModal: "Окно запуска печати",
+ expandCustomMapping: "Разворачивать пользовательское сопоставление",
+ expandCustomMappingDescription: "При печати на нескольких принтерах сразу показывать развёрнутое сопоставление AMS для каждого принтера",
+ authentication: "Аутентификация",
+ authEnabledDescription: "Доступ к экземпляру защищён аутентификацией пользователей",
+ authDisabledDescription: "Включите, чтобы требовать вход и управлять доступом пользователей",
+ authDisabledMessage: "Включите аутентификацию, чтобы создавать учётные записи, управлять правами и защитить экземпляр Bambuddy.",
+ enableAuthentication: "Включить аутентификацию",
+ currentUser: "Текущий пользователь",
+ changePassword: "Изменить пароль",
+ admin: "Администратор",
+ users: "Пользователи",
+ addUser: "Добавить пользователя",
+ groups: "Группы",
+ addGroup: "Добавить группу",
+ system: "Система",
+ noDescription: "Нет описания",
+ userCount: "Пользователей: {{count}}",
+ permissionCount: "Разрешений: {{count}}",
+ createUser: "Создать пользователя",
+ username: "Имя пользователя",
+ enterUsername: "Введите имя пользователя",
+ password: "Пароль",
+ enterPassword: "Введите пароль",
+ passwordRequirements: "Не менее 8 символов: одна заглавная и одна строчная буква, одна цифра и один специальный символ.",
+ confirmPassword: "Подтвердите пароль",
+ confirmPasswordPlaceholder: "Повторите пароль",
+ viewReleaseOnGitHub: "Открыть выпуск на GitHub",
+ turnAllPlugsOn: "Включить все розетки",
+ turnAllPlugsOff: "Выключить все розетки",
+ clearNotificationLogs: "Очистить журнал уведомлений",
+ clearLogsMessage: "Все записи журнала уведомлений старше 30 дней будут безвозвратно удалены. Это действие нельзя отменить.",
+ clearLogs: "Очистить журнал",
+ resetUiPreferences: "Сбросить настройки интерфейса",
+ resetUiPreferencesMessage: "Будут сброшены порядок боковой панели, тема, компоновка панели, режимы отображения и сортировка. Принтеры, архивы и серверные настройки НЕ изменятся. После очистки страница перезагрузится.",
+ resetPreferences: "Сбросить настройки",
+ deleteGroupTitle: "Удаление группы",
+ deleteGroupMessage: "Удалить эту группу? Пользователи группы потеряют назначенные ей разрешения.",
+ deleteGroup: "Удалить группу",
+ disableAuthenticationTitle: "Отключение аутентификации",
+ disableAuthenticationMessage: "Отключить аутентификацию? Bambuddy станет доступен без входа. Все пользователи останутся в базе данных, но проверка учётных данных выполняться не будет.",
+ disableAuthentication: "Отключить аутентификацию",
+ configureBambuddy: "Настроить Bambuddy",
+ systemDefault: "Системное значение",
+ archiveSettings: "Настройки архива",
+ newWindow: "Новое окно",
+ embeddedOverlay: "Встроенное наложение",
+ preferredSlicer: "Предпочитаемый слайсер",
+ preferredSlicerDescription: "Слайсер для нарезки внутри приложения через API-службу",
+ openInSlicerLabel: "Открывать в слайсере",
+ openInSlicerInherit: "Как для API-слайсера",
+ openInSlicerDescription: "Настольный слайсер, который открывается кнопкой «Открыть в слайсере». Оставьте «Как для API-слайсера», чтобы наследовать настройку, либо выберите другой локальный слайсер.",
+ orcaslicerKnownIssuesWarning: "В OrcaSlicer 2.3.2 и 2.4.0-dev известны ошибки CLI, мешающие нарезке многих 3MF от Bambu: #12426 (сбой на раскрашенных файлах с несколькими экструдерами) и #13386 (слишком строгая проверка диапазонов параметров). До исправления рекомендуется Bambu Studio.",
+ useSlicerApi: "Использовать API слайсера",
+ useSlicerApiDescription: "Если включено, действия «Нарезать» открывают встроенное окно и обращаются к API-службе слайсера. Если выключено, файл передаётся настольному слайсеру через URI-схему.",
+ slicerCard: "Слайсер",
+ orcaslicerApiUrl: "URL API-службы OrcaSlicer",
+ bambuStudioApiUrl: "URL API-службы Bambu Studio",
+ slicerApiUrlDescription: "URL контейнера API-службы слайсера. Оставьте пустым, чтобы использовать значения переменных окружения SLICER_API_URL или BAMBU_STUDIO_API_URL.",
+ slicerBundlesRemoved: {
+ title: "Пакеты профилей слайсера (удалено)",
+ description: "Импорт пакетов профилей принтера .bbscfg удалён. Экспорт пакета из BambuStudio содержит только пользовательские профили, поэтому стандартные процессы и филаменты не импортировались, а нарезка использовала встроенные настройки.",
+ alternatives: "Для отдельных пользовательских профилей используйте импорт одного профиля либо синхронизацию через Bambu Cloud или Orca Cloud. Стандартные профили автоматически предоставляет служба слайсера.",
+ lookupOrder: "Порядок поиска профиля при нарезке: 1) импортированный локально, 2) Orca Cloud, 3) Bambu Cloud, 4) стандартный профиль службы слайсера.",
+ },
+ externalCameras: "Внешние камеры",
+ costTracking: "Учёт затрат",
+ printsOnly: "Только печать",
+ totalConsumption: "Общее потребление",
+ dataManagement: "Управление данными",
+ storageUsage: "Использование хранилища",
+ storageUsageDescription: "Распределение занятого места по категориям",
+ storageUsageTotal: "Всего",
+ storageUsageErrors: "Ошибки",
+ storageUsageOtherBreakdown: "Прочее (статические ресурсы, скрипты и конфигурационные файлы)",
+ storageUsageSystem: "Система",
+ storageUsageData: "Данные",
+ storageUsageUnavailable: "Сведения об использовании хранилища недоступны",
+ clearNotificationLogsDescription: "Удалить записи журнала уведомлений старше 30 дней",
+ resetUiPreferencesDescription: "Сбросить порядок боковой панели, тему, режимы отображения и компоновку. Принтеры, архивы и настройки не изменятся.",
+ enableHomeAssistant: "Включить Home Assistant",
+ enableMqtt: "Включить MQTT",
+ useTls: "Использовать TLS",
+ enableMetricsEndpoint: "Включить endpoint метрик",
+ availableMetrics: "Доступные метрики",
+ editUser: "Изменить пользователя",
+ deleteUserTitle: "Удаление пользователя",
+ groupName: "Название группы",
+ leaveEmptyForAnonymous: "Оставьте пустым для анонимного доступа",
+ leaveEmptyForNoAuth: "Оставьте пустым, чтобы не использовать аутентификацию",
+ enterNewPassword: "Введите новый пароль",
+ confirmNewPassword: "Повторите новый пароль",
+ enterGroupName: "Введите название группы",
+ enterDescriptionOptional: "Введите описание (необязательно)",
+ enterCurrentPassword: "Введите текущий пароль",
+ enterNewPasswordMin6: "Введите новый пароль (не менее 6 символов)",
+ toast: {
+ keyCopied: "Ключ скопирован в буфер обмена",
+ copyFailed: "Не удалось скопировать ключ",
+ keyAddedToBrowser: "Ключ добавлен в обозреватель API",
+ clearLogsFailed: "Не удалось очистить журнал",
+ uiPreferencesReset: "Настройки интерфейса сброшены. Обновление страницы…",
+ authDisabled: "Аутентификация отключена",
+ authDisableFailed: "Не удалось отключить аутентификацию",
+ apiKeyCreated: "Ключ API создан",
+ apiKeyDeleted: "Ключ API удалён",
+ userCreated: "Пользователь создан",
+ userUpdated: "Пользователь обновлён",
+ userDeleted: "Пользователь удалён",
+ groupCreated: "Группа создана",
+ groupUpdated: "Группа обновлена",
+ groupDeleted: "Группа удалена",
+ fillRequiredFields: "Заполните все обязательные поля",
+ passwordsDoNotMatch: "Пароли не совпадают",
+ passwordTooShort: "Пароль должен содержать не менее 8 символов",
+ passwordNeedsUppercase: "Пароль должен содержать хотя бы одну заглавную букву",
+ passwordNeedsLowercase: "Пароль должен содержать хотя бы одну строчную букву",
+ passwordNeedsDigit: "Пароль должен содержать хотя бы одну цифру",
+ passwordNeedsSpecial: "Пароль должен содержать хотя бы один специальный символ",
+ enterGroupName: "Введите название группы",
+ settingsSaved: "Настройки сохранены",
+ noPermissionUpdate: "У вас нет прав на изменение настроек",
+ cameraSettingsSaved: "Настройки камеры сохранены",
+ enterCameraUrl: "Введите URL камеры",
+ passwordChanged: "Пароль изменён",
+ connectionFailed: "Не удалось подключиться",
+ testFailed: "Проверка завершилась ошибкой",
+ cameraConnected: "Камера подключена{{resolution}}",
+ },
+ testConnection: "Проверить подключение",
+ catalog: {
+ spoolCatalog: "Каталог катушек",
+ spoolCatalogDescription: "Масса пустых катушек по производителю и типу. Используется для автоматического определения массы при добавлении катушек.",
+ searchCatalog: "Поиск по каталогу…",
+ addNewEntry: "Добавить запись",
+ namePlaceholder: "Название (например, Bambu Lab — пластик)",
+ weight: "Масса",
+ type: "Тип",
+ default: "Стандартная",
+ custom: "Пользовательская",
+ noMatch: "Ничего не найдено",
+ empty: "Каталог пуст",
+ deleteEntry: "Удалить запись",
+ deleteConfirm: "Удалить «{{name}}»?",
+ resetCatalog: "Сбросить каталог",
+ resetConfirm: "Сбросить каталог к исходному состоянию? Все пользовательские записи будут удалены.",
+ loadFailed: "Не удалось загрузить каталог катушек",
+ nameWeightRequired: "Укажите название и массу",
+ entryAdded: "Запись добавлена",
+ addFailed: "Не удалось добавить запись",
+ entryUpdated: "Запись обновлена",
+ updateFailed: "Не удалось обновить запись",
+ entryDeleted: "Запись удалена",
+ deleteFailed: "Не удалось удалить запись",
+ resetSuccess: "Каталог сброшен к исходному состоянию",
+ resetFailed: "Не удалось сбросить каталог",
+ exported: "Экспортировано записей: {{count}}",
+ imported: "Импортировано записей: {{added}}, пропущено: {{skipped}}",
+ importFailed: "Не удалось импортировать: неверный формат JSON",
+ exportTooltip: "Экспортировать каталог в JSON",
+ importTooltip: "Импортировать каталог из JSON",
+ resetTooltip: "Сбросить к исходному состоянию",
+ selectedCount: "Выбрано: {{count}}",
+ deleteSelected: "Удалить выбранные",
+ bulkDeleteConfirm: "Удалить выбранные записи ({{count}})?",
+ bulkDeleted: "Удалено записей: {{count}}",
+ bulkDeleteFailed: "Не удалось удалить записи",
+ material: "Материал",
+ spoolWeight: "Масса катушки",
+ color: "Цвет",
+ updateSpoolWeight: "Обновить массу катушки",
+ filamentUpdated: "Филамент обновлён",
+ filamentUpdateFailed: "Не удалось обновить филамент",
+ filamentUpdateInvalid: "Некорректные данные филамента",
+ keepExistingSpoolWeight: "Сохранить прежнюю массу у существующих катушек",
+ keepExistingSpoolWeightDesc: "Катушки, уже созданные с этим типом филамента, сохранят прежнюю массу тары. Для новых катушек будет использоваться обновлённое значение.",
+ applyToAllSpools: "Применить ко всем катушкам",
+ applyToAllSpoolsDesc: "Все расчёты массы для катушек этого типа немедленно начнут использовать новую массу тары.",
+ },
+ colorCatalog: {
+ title: "Каталог цветов",
+ description: "Цвета филамента по производителю и материалу. Используются для автоматического определения цвета при добавлении катушек.",
+ searchColors: "Поиск цветов…",
+ allManufacturers: "Все производители",
+ addNewColor: "Добавить цвет",
+ manufacturer: "Производитель",
+ colorName: "Название цвета",
+ hex: "HEX",
+ materialOptional: "Материал (необязательно)",
+ showing: "Показано {{filtered}} из {{total}} цветов",
+ noMatch: "Подходящие цвета не найдены",
+ empty: "Каталог цветов пуст",
+ deleteColor: "Удалить цвет",
+ deleteConfirm: "Удалить «{{name}}»?",
+ resetCatalog: "Сбросить каталог цветов",
+ resetConfirm: "Сбросить каталог к исходному состоянию? Все пользовательские цвета будут удалены.",
+ sync: "Синхронизировать",
+ starting: "Запуск…",
+ syncTooltip: "Синхронизировать с FilamentColors.xyz (более 2000 цветов; может занять около минуты)",
+ loadFailed: "Не удалось загрузить каталог цветов",
+ fieldsRequired: "Укажите производителя, название цвета и HEX-код",
+ colorAdded: "Цвет добавлен",
+ addFailed: "Не удалось добавить цвет",
+ colorUpdated: "Цвет обновлён",
+ updateFailed: "Не удалось обновить цвет",
+ colorDeleted: "Цвет удалён",
+ deleteFailed: "Не удалось удалить цвет",
+ resetSuccess: "Каталог цветов сброшен к исходному состоянию",
+ resetFailed: "Не удалось сбросить каталог цветов",
+ syncUpToDate: "Каталог уже актуален (проверено цветов: {{count}})",
+ syncComplete: "Добавлено новых цветов: {{added}}, уже существовало: {{skipped}}",
+ syncError: "Ошибка синхронизации",
+ syncFailed: "Не удалось синхронизировать каталог с FilamentColors.xyz",
+ exported: "Экспортировано цветов: {{count}}",
+ imported: "Импортировано цветов: {{added}}, пропущено: {{skipped}}",
+ importFailed: "Не удалось импортировать: неверный формат JSON",
+ selectedCount: "Выбрано: {{count}}",
+ deleteSelected: "Удалить выбранные",
+ bulkDeleteConfirm: "Удалить выбранные цвета ({{count}})?",
+ bulkDeleted: "Удалено цветов: {{count}}",
+ bulkDeleteFailed: "Не удалось удалить цвета",
+ },
+ dateFormat: "Формат даты",
+ dateFormatUs: "США (ММ/ДД/ГГГГ)",
+ dateFormatEu: "Европа (ДД/ММ/ГГГГ)",
+ dateFormatIso: "ISO (ГГГГ-ММ-ДД)",
+ timeFormat: "Формат времени",
+ timeFormat12: "12-часовой (3:30 PM)",
+ timeFormat24: "24-часовой (15:30)",
+ defaultPrinter: "Принтер по умолчанию",
+ defaultPrinterDescription: "Предварительно выбирать этот принтер при загрузке файлов, повторной печати и других операциях.",
+ slicerBambuStudio: "Bambu Studio",
+ slicerOrcaSlicer: "OrcaSlicer",
+ sidebarOrderDescription: "Изменяйте порядок, видимость и пользовательские ссылки в настройках боковой панели.",
+ setDefault: "Сделать стандартным",
+ sidebarOrderSetDefaultHint: "Текущий порядок меню будет применяться к пользователям, которые ещё не настроили его самостоятельно.",
+ sidebarDefaultSet: "Стандартный порядок меню сохранён.",
+ sidebarDefaultCleared: "Стандартный порядок меню сброшен.",
+ sidebarDefaultFailed: "Не удалось сохранить стандартный порядок меню.",
+ reset: "Сбросить",
+ darkMode: "Тёмная тема",
+ lightMode: "Светлая тема",
+ active: "(активна)",
+ background: "Фон",
+ accent: "Акцент",
+ style: "Стиль",
+ bgNeutral: "Нейтральный",
+ bgWarm: "Тёплый",
+ bgCool: "Холодный",
+ bgOled: "Чёрный OLED",
+ bgSlate: "Сланцево-синий",
+ bgForest: "Лесной зелёный",
+ accentGreen: "Зелёный",
+ accentTeal: "Бирюзовый",
+ accentBlue: "Синий",
+ accentOrange: "Оранжевый",
+ accentPurple: "Фиолетовый",
+ accentRed: "Красный",
+ styleClassic: "Классический",
+ styleGlow: "Свечение",
+ styleVibrant: "Насыщенный",
+ themeToggleHint: "Переключайте тёмную, светлую и системную тему значком в боковой панели.",
+ autoArchivePrints: "Автоматически архивировать печать",
+ autoArchiveDescription: "Автоматически сохранять 3MF после завершения печати",
+ saveThumbnailsDescription: "Извлекать и сохранять изображения предпросмотра из 3MF",
+ captureFinishPhotoDescription: "Сделать снимок камерой принтера после завершения печати. Во время печати Bambuddy записывает короткий таймлапс, чтобы получить кадр до опускания стола. Если таймлапс был включён для задания, файл сохранится; иначе после получения снимка он будет автоматически удалён.",
+ ffmpegNotInstalled: "ffmpeg не установлен",
+ ffmpegRequired: "Для захвата изображения требуется ffmpeg. Установите его командой brew install ffmpeg в macOS или apt install ffmpeg в Linux.",
+ camera: "Камера",
+ cameraViewMode: "Режим просмотра камеры",
+ cameraOverlayDescription: "Камера открывается поверх основного экрана в окне с изменяемым размером",
+ cameraWindowDescription: "Камера открывается в отдельном окне браузера",
+ externalCamerasDescription: "Настройка внешних камер вместо встроенной камеры принтера. Поддерживаются потоки MJPEG, RTSP, HTTP-снимки и USB-камеры V4L2. Внешняя камера используется для просмотра в реальном времени и снимков после завершения печати.",
+ cameraPlaceholderUsb: "Путь к устройству (/dev/video0)",
+ cameraPlaceholderUrl: "URL камеры (rtsp://… или http://…)",
+ cameraTypeMjpeg: "Поток MJPEG",
+ cameraTypeRtsp: "Поток RTSP",
+ cameraTypeSnapshot: "HTTP-снимок",
+ cameraTypeUsb: "USB-камера (V4L2)",
+ cameraSnapshotUrl: "URL снимка (необязательно)",
+ cameraSnapshotUrlPlaceholder: "http://192.168.1.61:1984/api/frame.jpeg?src=printer",
+ cameraSnapshotUrlHelp: "URL одиночного кадра для миниатюр уведомлений, снимков после печати, кадров послойного таймлапса и распознавания пластины. Для таймлапса и распознавания пластины должны быть отдельно включены соответствующие настройки принтера; этот URL задаёт лишь источник изображения. Оставьте пустым, чтобы получать кадры из указанного выше видеопотока. Полезно для go2rtc (/api/frame.jpeg) и IP-камер с отдельным endpoint снимка.",
+ cameraRotation: "Поворот",
+ test: "Проверить",
+ connected: "Подключено",
+ disconnected: "Отключено",
+ currency: "Валюта",
+ defaultFilamentCost: "Стоимость филамента по умолчанию (за кг)",
+ electricityCost: "Стоимость электроэнергии за кВт·ч",
+ energyDisplayMode: "Режим отображения энергии",
+ energyModePrintDescription: "На панели показывается сумма энергии, израсходованной во время печати",
+ energyModeTotalDescription: "На панели показывается полный расход энергии по данным умных розеток",
+ fileManager: "Файловый менеджер",
+ createArchiveEntry: "Создавать запись в архиве при печати",
+ createArchiveEntryDescription: "При запуске печати из файлового менеджера при необходимости создавать запись в архиве",
+ lowDiskSpaceWarning: "Предупреждение о нехватке места",
+ lowDiskSpaceDescription: "Показывать предупреждение, когда свободного места остаётся меньше указанного порога",
+ printerFirmware: "Прошивка принтера",
+ checkFirmwareDescription: "Проверять наличие обновлений прошивки принтера у Bambu Lab",
+ bambuddySoftware: "Программное обеспечение Bambuddy",
+ autoCheckDescription: "Автоматически проверять наличие новых версий при запуске",
+ checkNow: "Проверить сейчас",
+ updateAvailableVersion: "Доступно обновление: v{{version}}",
+ releaseNotes: "Примечания к выпуску",
+ updateViaDocker: "Обновление через Docker Compose:",
+ updateViaHomeAssistant: "Обновления устанавливаются через Home Assistant Supervisor. Чтобы установить новую версию, откройте в Home Assistant: Настройки → Дополнения → Bambuddy.",
+ updateViaWindowsInstaller: "В Windows обновление выполняется повторным запуском установщика. Скачайте новую версию ниже — данные, настройки и принтеры сохранятся.",
+ downloadWindowsInstaller: "Скачать установщик v{{version}}",
+ installUpdate: "Установить обновление",
+ latestVersionRunning: "Установлена последняя версия",
+ failedToCheckUpdates: "Не удалось проверить обновления: {{error}}",
+ backupRestore: "Резервное копирование и восстановление",
+ backupRestoreDescription: "Экспорт и импорт настроек, а также резервное копирование в GitHub",
+ goToBackup: "Перейти к резервным копиям",
+ externalUrl: "Внешний URL",
+ externalUrlDescription: "Внешний адрес, по которому доступен Bambuddy. Используется для изображений в уведомлениях и внешних интеграций.",
+ bambuddyUrl: "URL Bambuddy",
+ externalUrlHint: "Укажите протокол и порт, например http://192.168.1.100:8000",
+ ftpRetry: "Повтор FTP-операций",
+ ftpRetryDescription: "Повторять FTP-операции при нестабильном Wi‑Fi принтера. Применяется к скачиванию 3MF и таймлапсов, загрузке заданий и обновлению прошивки.",
+ autoRetryDescription: "Автоматически повторять неудачные FTP-операции",
+ retryAttempts: "Количество попыток",
+ retryDelay: "Задержка между попытками",
+ connectionTimeout: "Тайм-аут подключения",
+ time_one: "{{count}} раз",
+ time_other: "{{count}} раз",
+ second_one: "{{count}} секунда",
+ second_other: "{{count}} секунд",
+ nSeconds: "{{count}} секунд",
+ increaseForWeakWifi: "Увеличьте для принтеров со слабым Wi‑Fi",
+ homeAssistant: "Home Assistant",
+ homeAssistantFullDescription: "Подключение к Home Assistant для управления умными розетками через REST API. Поддерживаются сущности switch, light, input_boolean и script.",
+ homeAssistantUrl: "URL Home Assistant",
+ longLivedAccessToken: "Долгосрочный токен доступа",
+ haTokenHint: "Создайте токен в Home Assistant: Профиль → Долгосрочные токены доступа → Создать токен",
+ connectionSuccessful: "Подключение установлено",
+ connectionFailed: "Подключиться не удалось",
+ haConnectionSuccess: "Подключение к Home Assistant установлено.",
+ haConnectionFailed: "Не удалось подключиться к Home Assistant.",
+ mqttPublishing: "Публикация MQTT",
+ mqttDescription: "Публикация событий Bambuddy во внешнем MQTT-брокере для интеграции с Node-RED, Home Assistant и другими системами автоматизации.",
+ mqttEnableDescription: "Публиковать события во внешнем MQTT-брокере",
+ brokerHostname: "Имя хоста брокера",
+ port: "Порт",
+ usernameOptional: "Имя пользователя (необязательно)",
+ passwordOptional: "Пароль (необязательно)",
+ topicPrefix: "Префикс топиков",
+ topicPrefixHint: "Топики будут иметь вид {{prefix}}/printers//status и т. п.",
+ prometheusMetrics: "Метрики Prometheus",
+ prometheusEndpointDescription: "Публиковать метрики принтеров по адресу /api/v1/metrics для мониторинга в Prometheus/Grafana.",
+ bearerTokenOptional: "Bearer-токен (необязательно)",
+ bearerTokenHint: "Если задан, запросы должны содержать Authorization: Bearer ",
+ metricsConnectionStatus: "Состояние подключения",
+ metricsPrinterState: "Состояние принтера (ожидание, печать и т. п.)",
+ metricsPrintProgress: "Прогресс печати, 0–100 %",
+ metricsBedTemp: "Температура стола",
+ metricsNozzleTemp: "Температура сопла",
+ metricsPrintsTotal: "Общее количество заданий по результату",
+ metricsMore: "…и другие данные: слои, вентиляторы, очередь, расход филамента",
+ smartPlugsDescription: "Подключение умных розеток Tasmota или Home Assistant для автоматического управления питанием принтеров и учёта энергопотребления.",
+ allOn: "Включить все",
+ allOff: "Выключить все",
+ addSmartPlug: "Добавить умную розетку",
+ energySummary: "Сводка энергопотребления",
+ currentPower: "Текущая мощность",
+ plugsOnline: "Розеток в сети: {{reachable}}/{{total}}",
+ today: "Сегодня",
+ yesterday: "Вчера",
+ total: "Всего",
+ enablePlugsForSummary: "Включите розетки, чтобы увидеть сводку энергопотребления",
+ addNotificationProvider: "Добавить",
+ systemBadge: "(системная)",
+ creating: "Создание…",
+ changing: "Изменение…",
+ deleteUserAndItems: "Удалить пользователя И его объекты",
+ deleteUserKeepItems: "Удалить пользователя, объекты оставить без владельца",
+ ok: "ОК",
+ twoFa: {
+ totpTitle: "Приложение-аутентификатор (TOTP)",
+ totpDesc: "Использовать приложение-аутентификатор, например Google Authenticator, Aegis или Authy.",
+ emailOtpTitle: "Одноразовый код по электронной почте",
+ emailOtpDesc: "Отправлять одноразовый код на {{email}} при входе.",
+ emailOtpNoEmail: "Добавьте адрес электронной почты в учётную запись, чтобы включить этот способ.",
+ addEmailFirst: "В вашей учётной записи нет адреса электронной почты. Перед включением одноразовых кодов попросите администратора добавить его.",
+ setupTotp: "Настроить приложение-аутентификатор",
+ setupAuthApp: "Настроить приложение-аутентификатор",
+ setupInstructions: "Отсканируйте QR-код приложением-аутентификатором, затем подтвердите настройку кодом.",
+ manualEntry: "Не получается отсканировать? Введите этот секрет вручную:",
+ scannedContinue: "Код отсканирован — продолжить",
+ enterCodeToConfirm: "Для подтверждения настройки введите шестизначный код из приложения-аутентификатора.",
+ activate: "Активировать",
+ disableTotp: "Отключить аутентификатор",
+ disableConfirmHint: "Чтобы отключить аутентификатор, введите действующий код TOTP или резервный код.",
+ totpDisabled: "Приложение-аутентификатор отключено.",
+ emailOtpEnabled: "Одноразовые коды по электронной почте включены.",
+ emailOtpDisabled: "Одноразовые коды по электронной почте отключены.",
+ smtpRequired: "Сначала настройте и проверьте SMTP.",
+ invalidCode: "Неверный код. Повторите попытку.",
+ enableEmailOtp: "Включить одноразовые коды по электронной почте",
+ disableEmailOtp: "Отключить одноразовые коды по электронной почте",
+ emailSetupEnterCode: "Код подтверждения отправлен на вашу электронную почту. Введите его ниже, чтобы подтвердить доступ к этому почтовому ящику.",
+ verifyAndEnable: "Подтвердить и включить",
+ emailDisablePasswordHint: "Чтобы подтвердить отключение одноразовых кодов по электронной почте, введите пароль учётной записи.",
+ passwordPlaceholder: "Введите пароль",
+ backupCodesTitle: "Сохраните резервные коды",
+ backupCodesWarning: "Сохраните эти коды в надёжном месте. Каждый код можно использовать только один раз; повторно они показаны не будут.",
+ backupCodesRemaining: "Осталось резервных кодов: {{count}}",
+ savedCodes: "Я сохранил коды",
+ regenBackup: "Создать новые резервные коды",
+ regenBackupHint: "Введите текущий код TOTP, чтобы создать 10 новых резервных кодов. Все существующие резервные коды станут недействительными.",
+ newBackupCodes: "Новые резервные коды",
+ linkedAccounts: "Связанные учётные записи SSO",
+ linkedAccountsDesc: "Эти внешние провайдеры идентификации связаны с вашей учётной записью.",
+ oidcUnlinked: "Учётная запись отсоединена.",
+ },
+ sessionPolicy: {
+ title: "Политика сеансов",
+ description: "Максимальный срок действия сеанса для новых входов пользователей. Уже выданные токены сохраняют исходный срок действия.",
+ preset24h: "24 часа",
+ preset7d: "7 дней",
+ preset30d: "30 дней",
+ customHoursLabel: "Срок действия сеанса в часах",
+ hoursSuffix: "часов",
+ warning: "Длительные сеансы снижают защиту автоматическим выходом. Рекомендуется только для доверенных установок с одним пользователем.",
+ },
+ oidc: {
+ title: "Провайдеры SSO / OIDC",
+ desc: "Настройка провайдеров OpenID Connect для единого входа через внешние службы идентификации.",
+ addProvider: "Добавить провайдера",
+ newProvider: "Новый провайдер",
+ empty: "Провайдеры OIDC пока не настроены.",
+ created: "Провайдер создан.",
+ updated: "Провайдер обновлён.",
+ deleted: "Провайдер удалён.",
+ refreshIcon: "Обновить значок",
+ removeIcon: "Удалить значок",
+ iconRefreshed: "Значок обновлён.",
+ iconRemoved: "Значок удалён.",
+ iconFetchFailed: "Не удалось получить значок по URL провайдера.",
+ deleteTitle: "Удалить провайдера",
+ deleteMessage: "Удалить «{{name}}»? Все связанные учётные записи пользователей будут отсоединены.",
+ form: {
+ name: "Отображаемое имя",
+ issuerUrl: "URL издателя",
+ clientId: "Идентификатор клиента",
+ clientSecret: "Секрет клиента",
+ scopes: "Области доступа",
+ iconUrl: "URL значка (необязательно)",
+ enabled: "Включён",
+ autoCreate: "Автоматически создавать пользователей",
+ autoCreateDesc: "Автоматически создавать локальную учётную запись при первом входе.",
+ autoLink: "Автоматически связывать существующие учётные записи",
+ autoLinkDesc: "При первом входе связывать локальные учётные записи по совпадающему адресу электронной почты.",
+ secretHint: "оставьте пустым, чтобы сохранить текущий",
+ secretPlaceholder: "новый секрет",
+ emailClaim: "Поле электронной почты",
+ emailClaimDesc: "Поле JWT, используемое как адрес электронной почты. Для Azure Entra ID, который не передаёт email_verified, используйте preferred_username или upn. Указывайте только доверенные поля.",
+ emailClaimPlaceholder: "email",
+ emailClaimCustomClaimAutoLinkWarning: "Пользовательское поле безопасно для автоматического связывания только тогда, когда его значение назначается администратором арендатора, например upn или preferred_username в Azure Entra ID. Не включайте автоматическое связывание, если ваш IdP позволяет пользователям самостоятельно задавать это поле.",
+ requireEmailVerified: "Требовать подтверждённый адрес электронной почты",
+ requireEmailVerifiedDesc: "Принимать адрес электронной почты только в том случае, если провайдер пометил его как подтверждённый.",
+ requireEmailVerifiedWarning: "Предупреждение: адрес будет принят даже без подтверждения. Используйте только с доверенными провайдерами.",
+ requireEmailVerifiedAutoLink: "Чтобы изменить этот параметр, сначала отключите автоматическое связывание.",
+ defaultGroup: "Группа по умолчанию",
+ defaultGroupDesc: "Группа для автоматически созданных пользователей. Если не задана, используется группа «Наблюдатели».",
+ defaultGroupViewersFallback: "Наблюдатели (по умолчанию)",
+ autologin: "Автоматический вход",
+ autologinDesc: "Сразу перенаправлять неавторизованных посетителей к этому провайдеру. Этот флаг может быть установлен только у одного провайдера.",
+ },
+ },
+ encryption: {
+ title: "Состояние шифрования MFA",
+ enabledFromEnv: "Шифрование данных включено; ключ получен из переменной окружения MFA_ENCRYPTION_KEY",
+ enabledFromFile: "Шифрование данных включено; ключ загружен из каталога данных",
+ enabledGenerated: "Шифрование данных включено с автоматически созданным ключом",
+ notConfigured: "Шифрование хранимых данных не настроено",
+ notConfiguredDesc: "Секреты TOTP и client_secret провайдеров OIDC хранятся открытым текстом. Задайте MFA_ENCRYPTION_KEY или перезапустите Bambuddy с доступным для записи каталогом данных, чтобы ключ был создан автоматически.",
+ allEncrypted: "Все секреты MFA зашифрованы при хранении.",
+ legacyRowsLabel: "Старые записи открытым текстом",
+ encryptedRowsLabel: "Зашифрованные записи",
+ legacyRowsWarning: "Обнаружено старых записей открытым текстом: {{count}}. Чтобы перенести их в зашифрованное хранилище, повторно сохраните провайдера OIDC или заново подключите приложение-аутентификатор пользователя.",
+ backupHint: "Автоматически созданный ключ хранится в DATA_DIR/.mfa_encryption_key и включается в локальные ZIP-копии. Храните резервные копии в безопасном месте либо задайте MFA_ENCRYPTION_KEY явно.",
+ decryptionBrokenTitle: "Отсутствует ключ шифрования",
+ decryptionBrokenError: "Невозможно расшифровать записей: {{count}}, поскольку ключ шифрования больше недоступен. Для восстановления верните прежний MFA_ENCRYPTION_KEY или файл DATA_DIR/.mfa_encryption_key.",
+ migrationErrorWarning: "Не удалось повторно зашифровать старых записей при запуске: {{count}}. Проверьте журнал сервера и перезапустите Bambuddy для повторной попытки.",
+ },
+ pipelineLimits: {
+ title: "Ограничения конвейеров слайсера",
+ maxCopiesLabel: "Максимум копий за запуск",
+ maxCopiesDesc: "Верхний предел количества копий, которое оператор может запросить при запуске конвейера. Жёсткое серверное ограничение — 1000.",
+ },
+ pipelines: {
+ title: "Конвейеры слайсера",
+ subtitle: "Повторно используемые наборы профилей: принтер, процесс, филаменты и тип стола. Сохраните набор в окне нарезки и применяйте его к следующему файлу одним нажатием.",
+ loading: "Загрузка конвейеров...",
+ loadError: "Не удалось загрузить конвейеры.",
+ confirmDelete: "Удалить этот конвейер? Отменить действие нельзя.",
+ staleWarning: "Один или несколько связанных профилей больше не существуют. Чтобы исправить конвейер, повторно сохраните его из окна нарезки.",
+ empty: {
+ title: "Конвейеров пока нет.",
+ howto: "Откройте окно нарезки любого файла, выберите принтер, процесс, филаменты и тип стола, затем нажмите «Сохранить как конвейер». Сохранённые конвейеры появятся здесь.",
+ },
+ field: {
+ name: "Название конвейера",
+ description: "Описание",
+ targetPrinter: "Целевой принтер",
+ noTarget: "— Цель не задана —",
+ targetKind: "Тип цели",
+ targetKindSpecific: "Конкретный принтер",
+ targetKindClass: "Класс принтеров",
+ targetModelClass: "Модель принтера",
+ fanoutStrategy: "Стратегия распределения",
+ fanout: {
+ max_parallel: "Максимум параллельно — распределять между любыми свободными подходящими принтерами",
+ round_robin: "По кругу — последовательно чередовать подходящие принтеры",
+ fill_one_first: "Сначала один — назначить все копии одному принтеру",
+ },
+ fanoutShort: {
+ max_parallel: "параллельно",
+ round_robin: "по кругу",
+ fill_one_first: "сначала один",
+ },
+ },
+ action: {
+ save: "Сохранить",
+ cancel: "Отмена",
+ rename: "Переименовать",
+ delete: "Удалить",
+ },
+ slot: {
+ printer: "Принтер",
+ process: "Процесс",
+ filament: "Филамент",
+ filamentN: "Филамент {{n}}",
+ filamentAll: "Все слоты: {{n}}",
+ bed: "Стол",
+ },
+ group: {
+ profiles: "Профили",
+ filaments: "Филаменты",
+ },
+ searchPlaceholder: "Поиск конвейеров...",
+ filterTargetType: "Фильтр по типу цели",
+ filterTarget: "Фильтр по цели",
+ filter: {
+ all: "Все цели",
+ noTarget: "Цель не задана",
+ count: "{{shown}} из {{total}}",
+ noMatches: "Нет конвейеров, соответствующих текущим фильтрам.",
+ },
+ toast: {
+ saved: "Конвейер сохранён",
+ saveFailed: "Не удалось сохранить",
+ deleted: "Конвейер удалён",
+ deleteFailed: "Не удалось удалить",
+ },
+ noTargetHint: "Чтобы запустить, задайте целевой принтер",
+ noTargetWarning: "Перед запуском конвейера задайте целевой принтер.",
+ runs: {
+ lastRun: "Последний запуск",
+ status: {
+ queued: "в очереди",
+ slicing: "нарезка",
+ dispatching: "назначение",
+ in_progress: "печать",
+ completed: "завершено",
+ failed: "ошибка",
+ partial_failure: "частичная ошибка",
+ cancelled: "отменено",
+ },
+ },
+ },
+ },
+ notification: {
+ printStarted: {
+ title: "Печать началась",
+ body: "{{printer}}: началась печать файла {{filename}}",
+ },
+ printCompleted: {
+ title: "Печать завершена",
+ body: "{{printer}}: файл {{filename}} успешно напечатан",
+ },
+ printFailed: {
+ title: "Ошибка печати",
+ body: "{{printer}}: печать файла {{filename}} завершилась ошибкой",
+ },
+ printStopped: {
+ title: "Печать остановлена",
+ body: "{{printer}}: печать файла {{filename}} остановлена",
+ },
+ printProgress: {
+ title: "Ход печати",
+ body: "{{printer}}: файл {{filename}} напечатан на {{percent}}%",
+ },
+ printerOffline: {
+ title: "Принтер не в сети",
+ body: "{{printer}} не в сети",
+ },
+ printerError: {
+ title: "Ошибка принтера",
+ body: "{{printer}}: {{error}}",
+ },
+ filamentLow: {
+ title: "Заканчивается филамент",
+ body: "{{printer}}: осталось мало филамента",
+ },
+ maintenanceDue: {
+ title: "Требуется обслуживание",
+ body: "{{printer}}: требуют внимания: {{items}}",
+ },
+ },
+ errors: {
+ generic: "Что-то пошло не так",
+ networkError: "Ошибка сети. Проверьте подключение.",
+ notFound: "Не найдено",
+ unauthorized: "Доступ не разрешён",
+ serverError: "Ошибка сервера",
+ validationError: "Проверьте введённые данные",
+ printerConnectionFailed: "Не удалось подключиться к принтеру",
+ saveFailed: "Не удалось сохранить изменения",
+ deleteFailed: "Не удалось удалить",
+ loadFailed: "Не удалось загрузить данные",
+ },
+ hmsErrors: {
+ title: "Ошибки — {{name}}",
+ noErrors: "Ошибок нет",
+ viewOnWiki: "Открыть в Bambu Lab Wiki",
+ unknownCode: "Неизвестный код HMS — подробности см. в Bambu Lab Wiki.",
+ clearInstructions: "Устраните ошибки на принтере, чтобы они исчезли из этого списка.",
+ clearErrors: "Очистить ошибки",
+ clearSuccess: "Ошибки HMS очищены",
+ clearFailed: "Не удалось очистить ошибки HMS",
+ actionSuccess: "Команда отправлена принтеру",
+ actionFailed: "Не удалось отправить команду",
+ runoutExpectedSlot: "Филамент закончился в {{ranOut}}. Теперь принтер ожидает совместимый филамент в {{expected}}. Установите катушку в {{expected}}, затем выберите «Повторить».",
+ runoutExpectedSlotOnly: "Принтер ожидает совместимый филамент в {{expected}}. Установите туда катушку, затем выберите «Повторить».",
+ runoutSlotUnknown: "Филамент закончился, и печать приостановлена. Bambuddy не смог определить, какой слот теперь ожидает принтер. Проверьте запрошенный слот на экране принтера.",
+ actions: {
+ RESUME_PRINTING: "Продолжить печать",
+ RESUME_PRINTING_DEFECTS: "Продолжить (дефекты допустимы)",
+ RESUME_PRINTING_PROBELM_SOLVED: "Продолжить (проблема устранена)",
+ STOP_PRINTING: "Остановить печать",
+ CHECK_ASSISTANT: "Проверить помощник",
+ FILAMENT_EXTRUDED: "Филамент выдавливается — продолжить",
+ RETRY_FILAMENT_EXTRUDED: "Филамент ещё не выходит — повторить",
+ CONTINUE: "Готово — продолжить",
+ LOAD_VIRTUAL_TRAY: "Загрузить филамент",
+ OK_BUTTON: "ОК",
+ FILAMENT_LOAD_RESUME: "Филамент загружен — продолжить",
+ JUMP_TO_LIVEVIEW: "Открыть камеру",
+ NO_REMINDER_NEXT_TIME: "Больше не напоминать",
+ REFRESH_NOZZLE: "Проверить ещё раз",
+ IGNORE_NO_REMINDER_NEXT_TIME: "Игнорировать и больше не напоминать",
+ IGNORE_RESUME: "Игнорировать и продолжить",
+ PROBLEM_SOLVED_RESUME: "Проблема устранена — продолжить",
+ TURN_OFF_FIRE_ALARM: "Понятно, отключить пожарную тревогу",
+ RETRY_PROBLEM_SOLVED: "Повторить (проблема устранена)",
+ CANCLE: "Отмена",
+ STOP_DRYING: "Остановить сушку",
+ PROCEED: "Продолжить",
+ OK_JUMP_RACK: "ОК",
+ ABORT: "Прервать",
+ DISABLE_PURIFICATION: "Отключить очистку воздуха для этой печати",
+ DONT_REMIND_NEXT_TIME: "Больше не напоминать",
+ DBL_CHECK_CANCEL: "Отмена",
+ DBL_CHECK_DONE: "Готово",
+ DBL_CHECK_RETRY: "Повторить",
+ DBL_CHECK_RESUME: "Продолжить",
+ DBL_CHECK_OK: "Подтвердить",
+ REMOVE_CLOSE_BTN: "Закрыть",
+ },
+ },
+ mqttDebug: {
+ title: "Журнал отладки MQTT",
+ searchPlaceholder: "Поиск по теме или содержимому...",
+ noMessages: "Сообщений пока нет",
+ startLoggingHint: "Нажмите «Начать запись», чтобы перехватывать сообщения MQTT",
+ noMessagesMatch: "Нет сообщений, соответствующих фильтру",
+ adjustFilterHint: "Измените запрос или параметры фильтра",
+ incoming: "Входящие",
+ outgoing: "Исходящие",
+ loggingStopped: "Запись остановлена",
+ loggingActive: "Запись активна — сообщения обновляются автоматически",
+ startLogging: "Начать запись",
+ stopLogging: "Остановить запись",
+ clearLog: "Очистить журнал",
+ topic: "Тема",
+ timestamp: "Время",
+ direction: "Направление",
+ all: "Все",
+ },
+ printerFiles: {
+ title: "Файлы принтера",
+ storageUsed: "Занято:",
+ storageFree: "Свободно:",
+ filterPlaceholder: "Фильтр файлов...",
+ deleteButton: "Удалить",
+ deleteFiles: "Удалить файлы: {{count}}",
+ deleteFileConfirm: "Удалить «{{name}}»? Это действие нельзя отменить.",
+ deleteFilesConfirm: "Удалить выбранные файлы ({{count}})? Это действие нельзя отменить.",
+ noFiles: "На принтере нет файлов",
+ loadingFiles: "Загрузка файлов...",
+ failedToLoad: "Не удалось загрузить файлы",
+ toast: {
+ filesDeleted: "Удалено файлов: {{count}}",
+ deleteFailed: "Не удалось удалить: {{error}}",
+ },
+ },
+ confirm: {
+ delete: "Удалить этот объект?",
+ unsavedChanges: "Есть несохранённые изменения. Всё равно уйти со страницы?",
+ clearQueue: "Очистить очередь печати?",
+ },
+ login: {
+ title: "Вход в Bambuddy",
+ subtitle: "Войдите в свою учётную запись",
+ username: "Имя пользователя",
+ usernamePlaceholder: "Введите имя пользователя",
+ usernameOrEmail: "Имя пользователя или email",
+ usernameOrEmailPlaceholder: "Имя пользователя или email",
+ password: "Пароль",
+ passwordPlaceholder: "Введите пароль",
+ signIn: "Войти",
+ signingIn: "Вход...",
+ rememberMe: "Запомнить меня",
+ forgotPassword: "Забыли пароль?",
+ autologinFailed: "Автоматический вход через SSO не выполнен. Выберите провайдера ниже.",
+ localDisabledNotice: "Локальный вход отключён. Используйте одного из SSO-провайдеров ниже.",
+ loginSuccess: "Вход выполнен",
+ loginFailed: "Не удалось войти",
+ enterCredentials: "Введите имя пользователя и пароль",
+ enterEmail: "Введите адрес электронной почты",
+ oidcLoginFailed: "Ошибка входа через OIDC",
+ oidcErrors: {
+ providerError: "Провайдер удостоверений вернул ошибку",
+ missingParameters: "В ответе OIDC отсутствуют обязательные параметры",
+ invalidState: "Состояние OIDC недействительно или уже использовано",
+ stateExpired: "Сеанс входа OIDC истёк — повторите попытку",
+ providerNotFound: "Провайдер OIDC не найден",
+ discoveryFailed: "Не удалось получить документ обнаружения OIDC",
+ invalidDiscovery: "Документ обнаружения OIDC недействителен",
+ networkError: "Сетевая ошибка при обмене токена OIDC",
+ badResponse: "Неожиданный ответ при обмене токена OIDC",
+ noIdToken: "Провайдер OIDC не вернул ID-токен",
+ validationFailed: "Не удалось проверить токен OIDC",
+ nonceMismatch: "Несовпадение nonce OIDC — возможна атака повторного воспроизведения",
+ missingSubClaim: "В токене OIDC отсутствует поле sub",
+ noLinkedAccount: "С этой учётной записью OIDC не связана локальная учётная запись",
+ accountInactive: "Учётная запись неактивна",
+ userResolutionFailed: "Не удалось определить учётную запись",
+ internalError: "Внутренняя ошибка при входе через OIDC",
+ tokenExchangeFailed: "Не удалось обменять токен OIDC",
+ },
+ forgotPasswordTitle: "Восстановление пароля",
+ forgotPasswordMessage: "Обратитесь к системному администратору для сброса пароля.",
+ forgotPasswordEmailMessage: "Введите адрес электронной почты, и мы отправим новый пароль.",
+ emailAddress: "Адрес электронной почты",
+ emailPlaceholder: "your.email@example.com",
+ cancel: "Отмена",
+ sending: "Отправка...",
+ sendResetEmail: "Отправить письмо для сброса",
+ howToReset: "Как сбросить пароль:",
+ resetStep1: "Свяжитесь с администратором Bambuddy",
+ resetStep2: "Попросите сбросить пароль в разделе управления пользователями",
+ resetStep3: "Администратор задаст новый временный пароль",
+ resetStep4: "Войдите с новым паролем и измените его в настройках",
+ gotIt: "Понятно",
+ resetPassword: {
+ title: "Новый пароль",
+ subtitle: "Введите и подтвердите новый пароль.",
+ newPassword: "Новый пароль",
+ newPasswordPlaceholder: "Не менее 8 символов",
+ confirmPassword: "Подтверждение пароля",
+ confirmPasswordPlaceholder: "Повторите новый пароль",
+ saving: "Сохранение…",
+ submit: "Установить новый пароль",
+ backToLogin: "Вернуться ко входу",
+ passwordsDoNotMatch: "Пароли не совпадают",
+ passwordTooShort: "Пароль должен содержать не менее 8 символов",
+ resetFailed: "Не удалось сбросить пароль. Возможно, ссылка устарела.",
+ },
+ twoFA: {
+ title: "Двухфакторная аутентификация",
+ subtitle: "Учётная запись защищена 2FA. Введите код подтверждения.",
+ methodAuthenticator: "Приложение-аутентификатор",
+ methodEmail: "Код по email",
+ methodBackup: "Резервный код",
+ instructionsTotp: "Откройте приложение-аутентификатор и введите шестизначный код Bambuddy.",
+ instructionsEmail: "Шестизначный код отправлен на вашу электронную почту. Он действует 10 минут.",
+ instructionsEmailNotSent: "Нажмите кнопку ниже, чтобы получить код подтверждения по email.",
+ instructionsBackup: "Введите один из восьмизначных резервных кодов восстановления. Каждый код используется только один раз.",
+ sendCodeButton: "Отправить код по email",
+ sendingCode: "Отправка...",
+ resendCode: "Отправить код повторно",
+ codeLabel: "Код подтверждения",
+ backupCodeLabel: "Резервный код",
+ codePlaceholder: "000000",
+ backupCodePlaceholder: "XXXXXXXX",
+ verifyButton: "Подтвердить",
+ verifyingButton: "Проверка...",
+ backToLogin: "← Вернуться ко входу",
+ orContinueWith: "или продолжить через",
+ signInWith: "Войти через {{provider}}",
+ enterCode: "Введите код подтверждения",
+ sendCodeFailed: "Не удалось отправить код подтверждения",
+ invalidCode: "Неверный код. Повторите попытку.",
+ },
+ },
+ setup: {
+ title: "Настройка Bambuddy",
+ subtitle: "Настройте аутентификацию для этого экземпляра Bambuddy",
+ enableAuth: "Включить аутентификацию",
+ adminAccount: "Учётная запись администратора",
+ adminAccountDesc: "Если администраторы уже существуют, аутентификация будет включена с использованием существующих учётных записей. Оставьте поля пустыми или введите данные для создания нового администратора.",
+ adminUsername: "Имя администратора",
+ adminPassword: "Пароль администратора",
+ optionalIfAdminExists: "(необязательно, если администратор уже существует)",
+ adminUsernamePlaceholder: "Введите имя администратора (необязательно)",
+ adminPasswordPlaceholder: "Введите пароль администратора (необязательно)",
+ confirmPassword: "Подтвердите пароль",
+ confirmPasswordPlaceholder: "Повторите пароль администратора",
+ settingUp: "Настройка...",
+ completeSetup: "Завершить настройку",
+ toast: {
+ authEnabledAdminCreated: "Аутентификация включена, администратор создан",
+ authEnabledExistingAdmins: "Аутентификация включена для существующих администраторов",
+ setupCompleted: "Настройка завершена",
+ enterBothCredentials: "Введите имя и пароль администратора либо оставьте оба поля пустыми",
+ passwordsDoNotMatch: "Пароли не совпадают",
+ passwordTooShort: "Пароль должен содержать не менее 6 символов",
+ },
+ },
+ changePassword: {
+ title: "Изменение пароля",
+ currentPassword: "Текущий пароль",
+ currentPasswordPlaceholder: "Введите текущий пароль",
+ newPassword: "Новый пароль",
+ newPasswordPlaceholder: "Введите новый пароль (не менее 6 символов)",
+ confirmPassword: "Подтвердите новый пароль",
+ confirmPasswordPlaceholder: "Повторите новый пароль",
+ passwordsDoNotMatch: "Пароли не совпадают",
+ passwordTooShort: "Пароль должен содержать не менее 6 символов",
+ changing: "Изменение...",
+ success: "Пароль изменён",
+ failed: "Не удалось изменить пароль",
+ },
+ plateAlert: {
+ title: "Печать приостановлена!",
+ message: "На печатной пластине обнаружены объекты. Печать автоматически приостановлена. Очистите пластину и продолжите печать.",
+ understand: "Понятно",
+ },
+ camera: {
+ title: "Камера",
+ invalidPrinterId: "Неверный идентификатор принтера",
+ live: "Прямой эфир",
+ snapshot: "Снимок",
+ restartStream: "Перезапустить поток",
+ refreshSnapshot: "Обновить снимок",
+ fullscreen: "На весь экран",
+ exitFullscreen: "Выйти из полноэкранного режима",
+ connectingToCamera: "Подключение к камере...",
+ capturingSnapshot: "Создание снимка...",
+ connectionLost: "Соединение потеряно",
+ connectionFailed: "Не удалось подключиться к камере",
+ reconnecting: "Повторное подключение через {{countdown}} с... (попытка {{attempt}} из {{max}})",
+ reconnectNow: "Подключиться сейчас",
+ cameraUnavailable: "Камера недоступна",
+ cameraUnavailableDesc: "Убедитесь, что принтер включён и подключён к сети.",
+ noCamera: "Камера отсутствует",
+ retry: "Повторить",
+ cameraStream: "Видеопоток камеры",
+ zoomOut: "Уменьшить",
+ zoomIn: "Увеличить",
+ resetZoom: "Сбросить масштаб",
+ recording: "Запись",
+ startRecording: "Начать запись",
+ stopRecording: "Остановить запись",
+ chamberLight: "Переключить освещение камеры принтера",
+ unavailable: "Камера недоступна",
+ diagnose: {
+ button: "Диагностика",
+ modalTitle: "Диагностика камеры",
+ running: "Выполняется диагностика...",
+ runFailed: "Не удалось выполнить диагностику: {{error}}",
+ retry: "Запустить снова",
+ stage: {
+ tcp_reachable: "Доступность по сети",
+ first_frame: "Получение кадра",
+ live_stream_active: "Активный видеопоток",
+ },
+ summary: {
+ all_ok: "Камера работает. Все этапы диагностики завершены успешно.",
+ live_stream_active_healthy: "Камера уже передаёт свежие кадры — дополнительная проверка не требуется.",
+ printer_unreachable: "Принтер недоступен. Проверьте IP-адрес, сетевое подключение и питание принтера.",
+ camera_port_closed: "Принтер доступен, но порт камеры закрыт. Убедитесь, что в настройках принтера включены режим «Только LAN» и режим разработчика.",
+ no_frame: "Подключение к камере установлено, но кадры не поступают. Повторите попытку или проверьте, включена ли камера в настройках принтера.",
+ unknown_failure: "Диагностика камеры завершилась неизвестной ошибкой. Подробности см. в журнале поддержки.",
+ },
+ meta: {
+ protocol: "Протокол",
+ port: "Порт",
+ profile: "Профиль",
+ },
+ },
+ },
+ groups: {
+ title: "Управление группами",
+ subtitle: "Настройка групп разрешений для контроля доступа",
+ backToSettings: "Вернуться к настройкам",
+ createGroup: "Создать группу",
+ noPermission: "У вас нет доступа к этой странице.",
+ system: "Системная",
+ noDescription: "Без описания",
+ usersCount: "Пользователей: {{count}}",
+ permissionsCount: "Разрешений: {{count}}",
+ edit: "Изменить",
+ delete: "Удалить",
+ toast: {
+ created: "Группа создана",
+ updated: "Группа обновлена",
+ deleted: "Группа удалена",
+ enterGroupName: "Введите название группы",
+ },
+ modal: {
+ editGroup: "Изменение группы",
+ createGroup: "Создание группы",
+ cancel: "Отмена",
+ saving: "Сохранение...",
+ creating: "Создание...",
+ saveChanges: "Сохранить изменения",
+ },
+ form: {
+ groupName: "Название группы",
+ groupNamePlaceholder: "Введите название группы",
+ systemGroupWarning: "Названия системных групп изменить нельзя",
+ description: "Описание",
+ descriptionPlaceholder: "Введите описание (необязательно)",
+ permissions: "Разрешения (выбрано: {{count}})",
+ },
+ deleteModal: {
+ title: "Удаление группы",
+ message: "Удалить эту группу? Входящие в неё пользователи потеряют соответствующие разрешения.",
+ confirm: "Удалить группу",
+ },
+ editor: {
+ title: "Изменение группы",
+ createTitle: "Создание группы",
+ search: "Поиск разрешений...",
+ selectAll: "Выбрать все",
+ clearAll: "Очистить выбор",
+ permissionsSelected: "Выбрано: {{count}}",
+ noResults: "Нет разрешений, соответствующих запросу",
+ websocketHint: "Необходимо для обновлений в реальном времени. Без этого интерфейс будет периодически опрашивать сервер.",
+ },
+ },
+ users: {
+ title: "Управление пользователями",
+ subtitle: "Управление пользователями и их доступом к Bambuddy",
+ backToSettings: "Вернуться к настройкам",
+ createUser: "Создать пользователя",
+ noPermission: "У вас нет доступа к этой странице.",
+ admin: "Администратор",
+ noGroups: "Без групп",
+ active: "Активен",
+ inactive: "Отключён",
+ edit: "Изменить",
+ delete: "Удалить",
+ system: "Системный",
+ noGroupsAvailable: "Нет доступных групп",
+ table: {
+ username: "Имя пользователя",
+ groups: "Группы",
+ status: "Состояние",
+ actions: "Действия",
+ },
+ toast: {
+ created: "Пользователь создан",
+ updated: "Пользователь обновлён",
+ deleted: "Пользователь удалён",
+ fillRequired: "Заполните все обязательные поля",
+ passwordsDoNotMatch: "Пароли не совпадают",
+ passwordTooShort: "Пароль должен содержать не менее 6 символов",
+ ldapProvisioned: "Пользователь LDAP «{{username}}» добавлен",
+ },
+ modal: {
+ createUser: "Создание пользователя",
+ editUser: "Изменение пользователя",
+ cancel: "Отмена",
+ creating: "Создание...",
+ saving: "Сохранение...",
+ saveChanges: "Сохранить изменения",
+ advancedAuthSubtitle: "с расширенной аутентификацией",
+ tabsAriaLabel: "Источник пользователя",
+ localTab: "Локальный",
+ ldapTab: "LDAP",
+ ldapSearchLabel: "Поиск в каталоге",
+ ldapSearchPlaceholder: "Введите имя пользователя, имя или email...",
+ ldapMinChars: "Для поиска введите не менее 2 символов",
+ ldapTypeToSearch: "Начните вводить запрос для поиска в каталоге LDAP",
+ ldapSearching: "Поиск в каталоге...",
+ ldapNoResults: "В каталоге нет подходящих пользователей",
+ ldapSearchError: "Ошибка поиска в каталоге. Проверьте состояние сервера LDAP.",
+ ldapAlreadyProvisioned: "Уже добавлен",
+ ldapSelectedLabel: "Выбран",
+ ldapProvision: "Добавить пользователя",
+ ldapProvisioning: "Добавление...",
+ ldapErrorProvision: "Не удалось добавить пользователя. Проверьте сервер LDAP и повторите попытку.",
+ },
+ form: {
+ username: "Имя пользователя",
+ usernamePlaceholder: "Введите имя пользователя",
+ email: "Электронная почта",
+ emailPlaceholder: "user@example.com",
+ password: "Пароль",
+ passwordPlaceholder: "Введите пароль",
+ confirmPassword: "Подтверждение пароля",
+ confirmPasswordPlaceholder: "Повторите пароль",
+ newPasswordPlaceholder: "Введите новый пароль",
+ confirmNewPasswordPlaceholder: "Повторите новый пароль",
+ leaveBlankToKeep: "оставьте пустым, чтобы сохранить текущий",
+ groups: "Группы",
+ optional: "необязательно",
+ autoGeneratedPassword: "Надёжный пароль будет создан автоматически и отправлен пользователю по email.",
+ passwordManagedByAdvancedAuth: "Пароль управляется расширенной аутентификацией. Используйте «Сбросить пароль», чтобы отправить пользователю новый пароль по email.",
+ resetPassword: "Сбросить пароль",
+ resettingPassword: "Сброс пароля...",
+ },
+ deleteModal: {
+ title: "Удаление пользователя",
+ message: "Удалить этого пользователя? Это действие нельзя отменить.",
+ confirm: "Удалить пользователя",
+ },
+ },
+ streamOverlay: {
+ title: "Оформление трансляции",
+ invalidPrinterId: "Неверный идентификатор принтера",
+ cameraStream: "Видеопоток камеры",
+ progress: "Прогресс",
+ eta: "Осталось",
+ printerIdle: "Принтер простаивает",
+ printerOffline: "Принтер не в сети",
+ status: {
+ printing: "Печать",
+ paused: "Приостановлено",
+ finished: "Завершено",
+ failed: "Ошибка",
+ idle: "Ожидание",
+ unknown: "Неизвестно",
+ },
+ },
+ profiles: {
+ title: "Профили",
+ subtitle: "Управление профилями слайсера и калибровками Pressure Advance",
+ tabs: {
+ bambuCloud: "Bambu Cloud",
+ orcaCloud: "Orca Cloud",
+ local: "Локальные профили",
+ kprofiles: "K-профили",
+ },
+ orcaCloud: {
+ connectedAs: "Подключено как",
+ connectedShort: "Подключено к Orca Cloud",
+ logout: "Отключиться",
+ noLogoutPermission: "У вас нет разрешения отключаться от Orca Cloud",
+ noConnectPermission: "У вас нет разрешения подключаться к Orca Cloud",
+ retry: "Повторить",
+ connectButton: "Подключить Orca Cloud",
+ connect: {
+ title: "Подключение к Orca Cloud",
+ description: "Войдите в Orca Cloud, чтобы синхронизировать профили слайсера с Bambuddy.",
+ },
+ device: {
+ title: "Разрешите доступ Bambuddy в Orca Cloud",
+ instruction: "Откройте Orca Cloud и подтвердите этот код. После подтверждения Bambuddy подключится автоматически.",
+ codeLabel: "Код сопряжения",
+ openButton: "Открыть страницу подтверждения Orca Cloud",
+ manualHint: "Либо откройте {{url}} и введите указанный выше код.",
+ waiting: "Ожидание подтверждения…",
+ cancel: "Отмена",
+ },
+ profiles: {
+ title: "Ваши профили Orca Cloud ({{count}})",
+ refresh: "Обновить",
+ empty: "В вашей учётной записи Orca Cloud пока нет профилей.",
+ },
+ toast: {
+ disconnected: "Orca Cloud отключён",
+ },
+ errors: {
+ startFailed: "Не удалось начать вход в Orca Cloud.",
+ denied: "Сопряжение отклонено в Orca Cloud.",
+ expired: "Срок действия кода сопряжения истёк. Нажмите «Подключить», чтобы повторить попытку.",
+ pollFailed: "Соединение было потеряно во время ожидания подтверждения. Повторите попытку.",
+ },
+ },
+ localProfiles: {
+ title: "Локальные профили",
+ subtitle: "Импорт профилей OrcaSlicer и управление ими",
+ import: "Импортировать профили",
+ importDesc: "Перетащите сюда файлы .bbscfg, .bbsflmt, .orca_filament, .zip или .json",
+ importing: "Импорт...",
+ search: "Поиск локальных профилей...",
+ noPresets: "Локальных профилей пока нет",
+ noSearchResults: "Нет профилей, соответствующих запросу",
+ badge: "Локальный",
+ edit: "Изменить",
+ delete: "Удалить",
+ cancel: "Отмена",
+ deleteConfirmTitle: "Удаление профиля",
+ deleteConfirm: "Удалить этот профиль? Это действие нельзя отменить.",
+ source: "Источник",
+ inheritsFrom: "Наследует",
+ filamentType: "Тип",
+ vendor: "Производитель",
+ compatiblePrinters: "Принтеры",
+ nozzleTemp: "Температура сопла",
+ cost: "Стоимость",
+ density: "Плотность",
+ pressureAdvance: "Опережение давления",
+ filament: "Филамент",
+ process: "Процесс",
+ printer: "Принтер",
+ toast: {
+ importSuccess: "Импортировано профилей: {{count}}",
+ importSkipped: "Пропущено дубликатов: {{count}}",
+ importError: "Ошибок при импорте: {{count}}",
+ deleted: "Профиль удалён",
+ updated: "Профиль обновлён",
+ },
+ },
+ connectedAs: "Подключено как",
+ signInExpiredTitle: "Срок авторизации в Bambu Cloud истёк",
+ signInExpiredBody: "Bambu Lab больше не принимает сохранённый токен. Выполните вход снова, чтобы восстановить облачные профили, импорт из MakerWorld и проверку прошивок.",
+ logout: "Выйти",
+ noLogoutPermission: "У вас нет разрешения выходить из учётной записи",
+ failedToLoad: "Не удалось загрузить профили",
+ retry: "Повторить",
+ time: {
+ justNow: "Только что",
+ minsAgo: "{{count}} мин назад",
+ hoursAgo: "{{count}} ч назад",
+ daysAgo: "{{count}} дн назад",
+ },
+ toast: {
+ loggedOut: "Вы вышли из учётной записи",
+ },
+ login: {
+ title: "Подключение к Bambu Cloud",
+ subtitle: "Синхронизация профилей слайсера между устройствами",
+ email: "Электронная почта",
+ password: "Пароль",
+ region: "Регион",
+ regionGlobal: "Глобальный",
+ regionChina: "Китай",
+ verificationCode: "Код подтверждения",
+ totpCode: "Код приложения-аутентификатора",
+ checkEmail: "Проверьте почту {{email}}: туда отправлен шестизначный код",
+ enterTotpHint: "Введите шестизначный код из приложения-аутентификатора",
+ accessToken: "Токен доступа",
+ accessTokenHint: "Вставьте токен доступа Bambu Cloud. Для учётных записей китайского региона, привязанных к телефону, доступен только этот способ: вход по email не поддерживается. Инструкцию по получению токена из cookie MakerWorld см. в wiki.",
+ back: "Назад",
+ loginButton: "Войти",
+ verifyButton: "Подтвердить",
+ setTokenButton: "Сохранить токен",
+ useToken: "Использовать токен доступа",
+ useEmail: "Войти по email",
+ toast: {
+ loggedIn: "Вход выполнен",
+ codeSent: "Код подтверждения отправлен по email",
+ enterTotp: "Введите код из приложения-аутентификатора",
+ tokenSet: "Токен сохранён",
+ },
+ },
+ presets: {
+ myPreset: "Мой профиль (редактируемый)",
+ duplicate: "Создать копию",
+ editable: "Редактируемый",
+ failedToLoadDetails: "Не удалось загрузить сведения о профиле",
+ deleteConfirm: "Удалить этот профиль?",
+ deleteWarning: "Профиль «{{name}}» будет безвозвратно удалён из Bambu Cloud. Это действие нельзя отменить.",
+ noDuplicatePermission: "У вас нет разрешения копировать профили",
+ noEditPermission: "У вас нет разрешения редактировать профили",
+ noDeletePermission: "У вас нет разрешения удалять профили",
+ types: {
+ filament: "Профиль филамента",
+ printer: "Профиль принтера",
+ process: "Профиль процесса",
+ },
+ toast: {
+ deleted: "Профиль удалён",
+ created: "Профиль создан",
+ updated: "Профиль обновлён",
+ duplicated: "Копия профиля создана",
+ fieldAdded: "Добавлено поле «{{key}}»",
+ exported: "Профиль экспортирован",
+ },
+ baseLabel: "Базовый: {{name}}",
+ currentLabel: "Текущий: {{name}}",
+ newPreset: "Новый профиль",
+ editPreset: "Изменение профиля",
+ duplicatePreset: "Копирование профиля",
+ createNewPreset: "Создание профиля",
+ customizeSettings: "Настройте параметры нового профиля",
+ compareWithBase: "Сравнить с базовым профилем",
+ compare: "Сравнить",
+ basePreset: "Базовый профиль",
+ selectBasePreset: "Выберите базовый профиль...",
+ presetName: "Название профиля",
+ myCustomPreset: "Мой профиль",
+ inheritsFrom: "Наследует от",
+ dropJsonToImport: "Перетащите JSON для импорта",
+ tabs: {
+ common: "Основные",
+ allFields: "Все поля",
+ },
+ availableFields: "Доступные поля",
+ searchFieldsPlaceholder: "Поиск полей...",
+ noMatchingFields: "Нет подходящих полей",
+ allFieldsAdded: "Все поля добавлены",
+ addCustomField: "Добавить произвольное поле",
+ yourOverrides: "Ваши переопределения",
+ noOverridesYet: "Переопределений пока нет",
+ clickFieldsToAdd: "Нажимайте поля слева, чтобы добавить их",
+ saveAsTemplate: "Сохранить как шаблон",
+ jsonTip: "Совет: перетащите файл .json в это окно, чтобы импортировать настройки",
+ },
+ cloudView: {
+ searchPlaceholder: "Поиск профилей...",
+ templates: "Шаблоны",
+ refresh: "Обновить",
+ newPreset: "Новый профиль",
+ clearFilters: "Сбросить фильтры",
+ compareMode: "Режим сравнения",
+ selectAnotherPreset: "Выберите другой профиль типа «{{type}}»",
+ clickTwoPresets: "Выберите два профиля одного типа для сравнения",
+ selectFirst: "1. Выберите первый",
+ selectSecond: "2. Выберите второй",
+ compareNow: "Сравнить",
+ lastSynced: "Последняя синхронизация:",
+ showingCount: "Показано {{showing}} из {{total}} профилей",
+ noPresetsFound: "Профили не найдены",
+ columns: {
+ filament: "Филамент",
+ process: "Процесс",
+ printer: "Принтер",
+ },
+ noFilamentPresets: "Нет профилей филамента",
+ noProcessPresets: "Нет профилей процесса",
+ noPrinterPresets: "Нет профилей принтера",
+ filters: {
+ type: "Тип",
+ owner: "Владелец",
+ printer: "Принтер",
+ nozzle: "Сопло",
+ filament: "Филамент",
+ layer: "Слой",
+ all: "Все",
+ myPresets: "Мои профили",
+ builtIn: "Встроенные",
+ process: "Процесс",
+ },
+ noTemplatesPermission: "У вас нет разрешения управлять шаблонами",
+ noRefreshPermission: "У вас нет разрешения обновлять профили",
+ noCreatePermission: "У вас нет разрешения создавать профили",
+ },
+ templates: {
+ title: "Быстрые шаблоны",
+ noTemplates: "Шаблонов пока нет",
+ createFirst: "Создавайте шаблоны в редакторе профилей",
+ typeFilter: "Тип:",
+ deleteTitle: "Удаление шаблона",
+ deleteWarning: "Это действие нельзя отменить",
+ deleteConfirm: "Удалить шаблон «{{name}}»?",
+ namePlaceholder: "Название шаблона",
+ descriptionPlaceholder: "Описание",
+ settingsJson: "Настройки (JSON)",
+ fieldsCount: "Полей: {{count}}",
+ shownInModals: "Показывается в окнах",
+ hiddenInModals: "Скрыт в окнах",
+ apply: "Применить",
+ toast: {
+ deleted: "Шаблон удалён",
+ updated: "Шаблон обновлён",
+ created: "Шаблон создан",
+ applied: "Шаблон применён",
+ },
+ },
+ },
+ support: {
+ debugLoggingActive: "Отладочное журналирование включено",
+ manageLogs: "Управление",
+ collectItem7: "Подключение принтеров и версии прошивок",
+ collectItem8: "Состояние интеграций (Spoolman, MQTT, HA)",
+ collectItem9: "Сетевые интерфейсы (только подсети)",
+ collectItem10: "Версии пакетов Python",
+ collectItem11: "Проверка состояния базы данных",
+ collectItem12: "Сведения о среде Docker",
+ bundleGenerating: "Формирование пакета...",
+ bundleStepConnection: "Проверка подключения принтеров",
+ bundleStepVirtualPrinters: "Проверка настройки виртуальных принтеров",
+ bundleStepLogScan: "Поиск известных проблем в последних журналах",
+ bundleStepBuild: "Создание ZIP-пакета для поддержки",
+ },
+ fileManager: {
+ title: "Файловый менеджер",
+ subtitle: "Организация и управление файлами для печати",
+ uploadFiles: "Загрузить файлы",
+ newFolder: "Новая папка",
+ folderName: "Имя папки",
+ folderNamePlaceholder: "например, Функциональные детали",
+ renameFile: "Переименовать файл",
+ renameFolder: "Переименовать папку",
+ invalidFilenameChar: "Символ «{{char}}» нельзя использовать в именах файлов печати. SD-карта принтера не принимает: < > : \" / \\ | ? *",
+ moveFiles: "Переместить файлы ({{count}})",
+ rootNoFolder: "Корень (без папки)",
+ current: "текущая",
+ linkFolder: "Связать папку",
+ linkFolderDescription: "Связать «{{name}}» с проектом или архивом для быстрого доступа.",
+ project: "Проект",
+ archive: "Архив",
+ noProjectsFound: "Проекты не найдены",
+ noArchivesFound: "Архивы не найдены",
+ unlink: "Отвязать",
+ link: "Связать",
+ dragDropFiles: "Перетащите файлы сюда",
+ dropFilesHere: "Перетащите файлы сюда",
+ releaseToUpload: "Отпустите для загрузки",
+ orClickToBrowse: "или нажмите для выбора",
+ allFileTypesSupported: "Поддерживаются все типы файлов. ZIP-архивы будут распакованы.",
+ zipFilesDetected: "Обнаружены ZIP-архивы",
+ zipExtractOptions: "ZIP-архивы будут распакованы. Выберите способ обработки структуры папок:",
+ preserveZipStructure: "Сохранить структуру папок из ZIP",
+ createFolderFromZip: "Создать папку с именем ZIP-файла",
+ stlThumbnailGeneration: "Создание миниатюр STL",
+ zipMayContainStl: "ZIP-архивы могут содержать STL-файлы. Миниатюры можно создать при распаковке.",
+ thumbnailsCanBeGenerated: "Для STL-файлов можно создать миниатюры. Обработка крупных моделей может занять больше времени.",
+ generateThumbnailsForStl: "Создать миниатюры для STL-файлов",
+ threemfDetected: "Обнаружены файлы 3MF",
+ threemfExtractionInfo: "Модель принтера, материал, цвет и параметры печати будут автоматически извлечены из файлов 3MF.",
+ willBeExtracted: "Будут извлечены",
+ filesExtracted: "Извлечено файлов: {{count}}",
+ uploadComplete: "Загрузка завершена: успешно — {{succeeded}}",
+ uploadFailed: "Ошибка загрузки",
+ zipFilesFailed: "Не удалось обработать файлов: {{count}}",
+ uploading: "Загрузка...",
+ changeLink: "Изменить связь...",
+ linkTo: "Связать с...",
+ linkToProjectOrArchive: "Связать с проектом или архивом",
+ generateThumbnail: "Создать миниатюру",
+ generateThumbnails: "Создать миниатюры",
+ generateThumbnailsForMissing: "Создать отсутствующие миниатюры для STL-файлов",
+ gridView: "Плитка",
+ listView: "Список",
+ lowDiskSpaceWarning: "Мало свободного места",
+ lowDiskSpaceDetails: "Свободно только {{free}} из {{total}}. Порог предупреждения в настройках: {{threshold}} ГБ.",
+ files: "Файлы",
+ folders: "Папки",
+ size: "Размер",
+ free: "Свободно",
+ allFiles: "Все файлы",
+ allExternal: "Внешние",
+ externalIsEmpty: "Внешних файлов нет",
+ externalEmptyDescription: "Здесь появятся файлы из подключённых внешних папок.",
+ wrap: "Перенос строк",
+ enableTextWrapping: "Включить перенос строк",
+ disableTextWrapping: "Отключить перенос строк",
+ collapse: "Свернуть",
+ collapseFoldersByDefault: "Сворачивать папки по умолчанию",
+ expandFoldersByDefault: "Разворачивать папки по умолчанию",
+ folderSort: "Сортировка папок",
+ folderSortByName: "По имени",
+ folderSortByActivity: "По последней активности",
+ dragToResizeTooltip: "Перетащите для изменения размера, двойной щелчок — сброс",
+ searchFiles: "Поиск файлов...",
+ searchSubfoldersHint: "С учётом вложенных папок",
+ readme: {
+ truncated: "Показано не полностью",
+ show: "Показать README",
+ hide: "Скрыть README",
+ label: "README",
+ },
+ tags: {
+ title: "Метки",
+ subtitle: "Помечайте файлы для сквозной фильтрации: игрушки, безопасно для детей, только PETG и что угодно ещё.",
+ manage: "Метки",
+ manageTitle: "Управление каталогом меток",
+ add: "Новая метка",
+ edit: "Переименовать метку",
+ name: "Название",
+ fileCount: "Файлы",
+ empty: "Меток пока нет. Создайте первую, чтобы начать помечать файлы.",
+ noMatches: "Подходящие метки не найдены.",
+ createPlaceholder: "например, игрушки, детям, petg",
+ createButton: "Создать",
+ nameRequired: "Укажите название.",
+ searchPlaceholder: "Фильтр меток...",
+ created: "Метка создана.",
+ updated: "Метка переименована.",
+ deleted: "Метка удалена.",
+ saveFailed: "Не удалось сохранить метку.",
+ deleteFailed: "Не удалось удалить метку.",
+ applyFailed: "Не удалось применить метки.",
+ applyAdd: "Добавить метки",
+ applyRemove: "Удалить метки",
+ applyAddSuccess: "Добавлено меток: {{count}}; обработано файлов: {{files}}.",
+ applyRemoveSuccess: "Удалено меток: {{count}}; обработано файлов: {{files}}.",
+ actionAdd: "Добавить к выбранным файлам",
+ actionRemove: "Удалить с выбранных файлов",
+ tagAction: "Метки",
+ bulkTitle: "Метки для выбранных файлов ({{count}})",
+ bulkTooltip: "Добавить или удалить метки у всех выбранных файлов.",
+ noPermission: "У вас нет прав на изменение меток файлов.",
+ filterLabel: "Фильтр по меткам:",
+ clearAll: "Очистить всё",
+ confirmDelete: "Удалить метку «{{name}}»?",
+ confirmDeleteMessage: "Метка будет удалена из каталога. Остальные метки файлов сохранятся.",
+ confirmDeleteInUseMessage: "Эта метка назначена файлам ({{count}}). При удалении метка исчезнет у всех файлов; сами файлы не изменятся.",
+ editAria: "Изменить {{name}}",
+ deleteAria: "Удалить {{name}}",
+ },
+ allTypes: "Все типы",
+ prints: "Файлы печати",
+ ascending: "По возрастанию",
+ descending: "По убыванию",
+ resultsCount: "Показано {{showing}} из {{total}} файлов",
+ selectAll: "Выбрать всё",
+ deselectAll: "Снять выделение",
+ selected: "Выбрано: {{count}}",
+ adding: "Добавление...",
+ loadingFiles: "Загрузка файлов...",
+ folderIsEmpty: "Папка пуста",
+ noFilesYet: "Файлов пока нет",
+ folderEmptyDescription: "Загрузите или переместите файлы в эту папку.",
+ noFilesDescription: "Загрузите файлы, чтобы начать упорядочивать материалы для печати.",
+ noMatchingFiles: "Подходящие файлы не найдены",
+ noMatchingFilesDescription: "Нет файлов, соответствующих текущему поиску или фильтрам.",
+ clearFilters: "Сбросить фильтры",
+ printedCount: "Напечатано: {{count}}×",
+ uploadedBy: "Загрузил",
+ deleteFolder: "Удалить папку",
+ deleteFile: "Удалить файл",
+ deleteFilesCount: "Удалить файлы ({{count}})",
+ deleteFolderConfirm: "Удалить эту папку? Все находящиеся в ней файлы также будут удалены.",
+ deleteFileConfirm: "Удалить этот файл?",
+ deleteFilesConfirm: "Удалить выбранные файлы ({{count}})? Это действие нельзя отменить.",
+ deleting: "Удаление...",
+ noPermissionRenameFolder: "У вас нет прав на переименование папок",
+ noPermissionLinkFolder: "У вас нет прав на связывание папок",
+ noPermissionDeleteFolder: "У вас нет прав на удаление папок",
+ noPermissionPrint: "У вас нет прав на запуск печати",
+ noPermissionAddToQueue: "У вас нет прав на добавление в очередь",
+ noPermissionSlice: "У вас нет прав на нарезку файлов",
+ noPermissionDownload: "У вас нет прав на скачивание файлов",
+ noPermissionRenameFile: "У вас нет прав на переименование этого файла",
+ noPermissionGenerateThumbnail: "У вас нет прав на создание миниатюр",
+ noPermissionDeleteFile: "У вас нет прав на удаление этого файла",
+ noPermissionCreateFolder: "У вас нет прав на создание папок",
+ noPermissionUpload: "У вас нет прав на загрузку файлов",
+ noPermissionMoveFiles: "У вас нет прав на перемещение файлов",
+ noPermissionDeleteFiles: "У вас нет прав на удаление файлов",
+ linkExternal: "Подключить внешнюю папку",
+ linkExternalFolder: "Подключить внешнюю папку",
+ linkExternalFolderDescription: "Подключить каталог хоста (NAS, USB-накопитель или сетевой ресурс) к файловому менеджеру. Файлы не копируются — Bambuddy обращается к ним по исходному пути.",
+ externalFolderNamePlaceholder: "например, Модели на NAS",
+ externalPath: "Путь на хосте",
+ externalPathHelp: "Абсолютный путь к каталогу на хосте Docker. Каталог должен быть подключён к контейнеру через bind mount.",
+ readOnly: "Только чтение",
+ readOnlyHelp: "запрещает загрузку и удаление файлов",
+ showHiddenFiles: "Показывать скрытые файлы (dotfiles)",
+ externalFolder: "Внешняя папка",
+ scanFolder: "Сканировать",
+ toast: {
+ folderCreated: "Папка создана",
+ folderDeleted: "Папка удалена",
+ fileDeleted: "Файл удалён",
+ filesDeleted: "Удалено файлов: {{count}}",
+ filesMoved: "Файлы перемещены",
+ folderLinked: "Папка связана",
+ folderUnlinked: "Связь с папкой удалена",
+ externalFolderLinked: "Внешняя папка подключена и просканирована",
+ folderScanned: "Сканирование завершено: добавлено — {{added}}, удалено — {{removed}}",
+ addedToQueue: "Добавлено в очередь файлов: {{count}}",
+ addedToQueuePartial: "Добавлено файлов: {{added}}, ошибок: {{failed}}",
+ failedToAddToQueue: "Не удалось добавить файлы: {{error}}",
+ fileRenamed: "Файл переименован",
+ folderRenamed: "Папка переименована",
+ thumbnailsGenerated: "Создано миниатюр: {{count}}",
+ thumbnailsGeneratedPartial: "Создано миниатюр: {{succeeded}}, ошибок: {{failed}}",
+ noStlMissingThumbnails: "Нет STL-файлов без миниатюр",
+ failedToGenerateThumbnails: "Не удалось создать миниатюры: {{error}}",
+ thumbnailGenerated: "Миниатюра создана",
+ failedToGenerateThumbnail: "Не удалось создать миниатюру: {{error}}",
+ },
+ },
+ projects: {
+ title: "Проекты",
+ subtitle: "Организация и отслеживание проектов 3D-печати",
+ newProject: "Новый проект",
+ editProject: "Изменить проект",
+ deleteProject: "Удалить проект",
+ projectName: "Название проекта",
+ description: "Описание",
+ noProjects: "Проектов пока нет",
+ noProjectsFiltered: "Нет проектов со статусом «{{status}}»",
+ noProjectsFilteredHelp: "У вас нет проектов со статусом «{{status}}». Они появятся здесь после изменения статуса.",
+ createFirst: "Создайте первый проект, чтобы объединять связанные печати, отслеживать ход работ и управлять сборкой.",
+ createFirstButton: "Создать первый проект",
+ create: "Создать",
+ files: "Файлы",
+ prints: "Печати",
+ plates: "пластин",
+ parts: "деталей",
+ lastModified: "Последнее изменение",
+ deleteConfirm: "Удалить этот проект? Архивные записи и элементы очереди будут отвязаны, но не удалены.",
+ addFiles: "Добавить файлы",
+ removeFile: "Убрать файл",
+ viewDetails: "Подробнее",
+ namePlaceholder: "например, Сборка Voron 2.4",
+ descriptionPlaceholder: "Необязательное описание...",
+ urlLabel: "URL",
+ urlPlaceholder: "https://makerworld.com/...",
+ urlInvalid: "URL должен начинаться с http:// или https://",
+ openExternalUrl: "Открыть страницу проекта",
+ coverImageLabel: "Обложка",
+ coverImageAlt: "Обложка проекта",
+ coverImageUpload: "Загрузить",
+ coverImageReplace: "Заменить",
+ coverImageRemove: "Удалить",
+ color: "Цвет",
+ targetPlates: "План по пластинам",
+ targetPlatesPlaceholder: "например, 25",
+ targetPlatesHelp: "Количество заданий печати",
+ targetParts: "План по деталям",
+ targetPartsPlaceholder: "например, 150",
+ targetPartsHelp: "Общее требуемое количество объектов",
+ tagsLabel: "Метки (через запятую)",
+ tagsPlaceholder: "например, voron, функциональное, подарок",
+ dueDate: "Срок",
+ priority: "Приоритет",
+ priorityLow: "Низкий",
+ priorityNormal: "Обычный",
+ priorityHigh: "Высокий",
+ priorityUrgent: "Срочный",
+ statusActive: "Активный",
+ statusCompleted: "Завершён",
+ statusArchived: "В архиве",
+ done: "Готово",
+ completed: "завершено",
+ failed: "ошибка",
+ inQueue: "в очереди",
+ noPrintsYet: "Печатей пока нет",
+ printJobs: "Задания печати (пластины)",
+ partsPrinted: "Напечатано деталей",
+ failedParts: "Неудачных деталей",
+ import: "Импорт",
+ export: "Экспорт",
+ importProject: "Импортировать проект",
+ exportAll: "Экспортировать все проекты",
+ loading: "Загрузка проектов...",
+ noEditPermission: "У вас нет прав на изменение проектов",
+ noDeletePermission: "У вас нет прав на удаление проектов",
+ noCreatePermission: "У вас нет прав на создание проектов",
+ noImportPermission: "У вас нет прав на импорт проектов",
+ noExportPermission: "У вас нет прав на экспорт проектов",
+ toast: {
+ created: "Проект создан",
+ updated: "Проект обновлён",
+ deleted: "Проект удалён",
+ imported: "Проект импортирован",
+ multipleImported: "Импортировано проектов: {{count}}",
+ importFailed: "Не удалось импортировать проект",
+ exported: "Проекты экспортированы (только метаданные)",
+ },
+ },
+ projectDetail: {
+ notFound: "Проект не найден",
+ backToProjects: "Вернуться к проектам",
+ export: "Экспорт",
+ exportProject: "Экспортировать проект",
+ noExportPermission: "У вас нет прав на экспорт проектов",
+ noEditPermission: "У вас нет прав на изменение проектов",
+ partOf: "Входит в:",
+ priorityLabel: "Приоритет:",
+ noPrints: "В этом проекте пока нет печатей",
+ status: {
+ active: "Активный",
+ completed: "Завершён",
+ archived: "В архиве",
+ },
+ priority: {
+ low: "Низкий",
+ normal: "Обычный",
+ high: "Высокий",
+ urgent: "Срочный",
+ },
+ dueDate: {
+ overdue: "Срок истёк",
+ today: "Срок сегодня",
+ daysLeft: "Осталось дней: {{count}}",
+ },
+ progress: {
+ platesProgress: "Выполнение по пластинам",
+ partsProgress: "Выполнение по деталям",
+ printJobs: "заданий печати",
+ parts: "деталей",
+ percentComplete: "Выполнено {{percent}}%",
+ remaining: "Осталось: {{count}}",
+ },
+ stats: {
+ printJobs: "Задания печати",
+ total: "всего",
+ failed: "Неудачных: {{count}}",
+ partsPrinted: "Напечатано деталей: {{count}}",
+ printTime: "Время печати",
+ filamentUsed: "Израсходовано филамента",
+ },
+ cost: {
+ title: "Учёт стоимости",
+ filamentCost: "Стоимость филамента",
+ energy: "Электроэнергия",
+ totalCost: "Общая стоимость",
+ total: "Итого",
+ includesBom: "включая спецификацию",
+ budget: "Бюджет",
+ remaining: "Остаток",
+ },
+ subProjects: {
+ title: "Подпроекты ({{count}})",
+ },
+ notes: {
+ title: "Заметки",
+ noEditPermission: "У вас нет прав на изменение заметок",
+ placeholder: "Добавьте заметки о проекте...",
+ empty: "Заметок пока нет. Нажмите «Изменить», чтобы добавить.",
+ },
+ files: {
+ title: "Файлы",
+ linkFolders: "Свяжите папки из файлового менеджера",
+ forQuickAccess: "с этим проектом для быстрого доступа.",
+ fileCount: "Файлов: {{count}}",
+ empty: "Связанных папок нет. Откройте файловый менеджер и свяжите папку с проектом.",
+ noFiles: "В этой папке нет файлов.",
+ },
+ bom: {
+ title: "Спецификация",
+ acquired: "Приобретено: {{completed}}/{{total}}",
+ showAll: "Показать всё",
+ hideDone: "Скрыть готовое",
+ addPart: "Добавить позицию",
+ noAddPermission: "У вас нет прав на добавление позиций",
+ partNamePlaceholder: "Название позиции (например, винты M3×8)",
+ partName: "Название позиции",
+ qty: "Кол-во",
+ price: "Цена ({{currency}})",
+ sourcingUrlPlaceholder: "Ссылка на поставщика (необязательно)",
+ remarksPlaceholder: "Примечание (необязательно)",
+ deletePart: "Удалить позицию",
+ deleteConfirm: "Удалить «{{name}}»?",
+ noUpdatePermission: "У вас нет прав на обновление позиций",
+ noEditPermission: "У вас нет прав на изменение позиций",
+ noDeletePermission: "У вас нет прав на удаление позиций",
+ totalCost: "Общая стоимость:",
+ empty: "В спецификации пока нет позиций. Добавьте крепёж, электронику и другие компоненты, закупку которых нужно отслеживать.",
+ },
+ timeline: {
+ title: "Хронология активности",
+ empty: "Активности пока нет.",
+ },
+ template: {
+ saveAsTemplate: "Сохранить как шаблон",
+ noCreatePermission: "У вас нет прав на создание шаблонов",
+ },
+ queue: {
+ title: "Очередь",
+ viewAll: "Показать всё",
+ printing: "Печатается: {{count}}",
+ queued: "В очереди: {{count}}",
+ },
+ prints: {
+ title: "Печати ({{count}})",
+ },
+ toast: {
+ projectUpdated: "Проект обновлён",
+ partAdded: "Позиция добавлена",
+ partRemoved: "Позиция удалена",
+ exportFailed: "Не удалось экспортировать",
+ projectExported: "Проект экспортирован",
+ templateCreated: "Шаблон создан",
+ },
+ },
+ system: {
+ title: "Информация о системе",
+ version: "Версия",
+ uptime: "Время работы",
+ cpuUsage: "Загрузка процессора",
+ memoryUsage: "Использование памяти",
+ diskUsage: "Использование диска",
+ networkInfo: "Сетевая информация",
+ logs: "Журналы",
+ debugMode: "Режим отладки",
+ enableDebug: "Включить журналирование отладки",
+ disableDebug: "Отключить журналирование отладки",
+ downloadLogs: "Скачать журналы",
+ clearLogs: "Очистить журналы",
+ dockerInfo: "Информация о Docker",
+ containerName: "Имя контейнера",
+ imageName: "Имя образа",
+ platform: "Платформа",
+ architecture: "Архитектура",
+ },
+ sponsors: {
+ sectionTitle: "Независимый проект на поддержке сообщества",
+ tagline: "Bambuddy бесплатен и остаётся таким благодаря добровольной поддержке пользователей. Без венчурного капитала и привязки к облаку.",
+ viewSupporters: "Посмотреть сторонников проекта",
+ toastPrints: "С Bambuddy выполнено печатей: {{count}}. Проект остаётся бесплатным благодаря поддержке сообщества.",
+ toastCost: "С помощью Bambuddy учтено филамента на сумму {{total}}. Посмотрите, кто помогает проекту оставаться независимым.",
+ toastArchives: "С Bambuddy архивировано печатей: {{count}}. Посмотрите, кто помогает проекту оставаться независимым.",
+ toastAnniversary: "Вы уже год с Bambuddy! Посмотрите, кто помогает проекту оставаться независимым.",
+ toastVersionUpdate: "Обновлено до версии {{version}}. Bambuddy остаётся бесплатным благодаря поддержке сообщества.",
+ toastBusiness: "Используете Bambuddy для {{count}} принтеров? Для команд доступен план поддержки с приоритетным исправлением ошибок, выставлением счетов и прямой связью с разработчиком.",
+ businessCta: "Bambuddy для бизнеса",
+ businessTitle: "Bambuddy для бизнеса",
+ businessTagline: "Вы используете {{count}} принтеров. Для команд и печатных ферм доступны приоритетная поддержка, коммерческая лицензия и выставление счетов.",
+ },
+ library: {
+ title: "Библиотека филаментов",
+ addFilament: "Добавить филамент",
+ editFilament: "Изменить филамент",
+ deleteFilament: "Удалить филамент",
+ vendor: "Производитель",
+ material: "Материал",
+ color: "Цвет",
+ kFactor: "Коэффициент K",
+ temperature: "Температура",
+ noFilaments: "В библиотеке нет филаментов",
+ deleteConfirm: "Удалить этот филамент?",
+ importFromPrinter: "Импортировать с принтера",
+ exportToFile: "Экспортировать в файл",
+ runWithPipeline: {
+ actionLabel: "Запустить через конвейер",
+ noPermission: "У вас нет прав на запуск конвейеров",
+ modalTitle: "Запуск через конвейер",
+ confirmTitle: "Подтверждение запуска",
+ confirmIntro: "Предварительная проверка обнаружила проблемы",
+ sourceHint: "Источник",
+ pipelineHint: "Конвейер",
+ targetHint: "Назначение",
+ pipelineListAria: "Доступные конвейеры",
+ runAnyway: "Всё равно запустить",
+ loading: "Загрузка…",
+ empty: "Сохранённых конвейеров пока нет. Откройте диалог нарезки и нажмите «Сохранить как конвейер».",
+ noTarget: "Целевой принтер не задан",
+ noTargetMessage: "Для этого конвейера не задан целевой принтер. Откройте его в настройках и выберите принтер.",
+ copies: "Копии",
+ copiesHint: "макс. {{n}}",
+ classTarget: "Любой {{model}}",
+ toast: {
+ started: "Конвейер запущен",
+ failed: "Не удалось запустить конвейер",
+ },
+ issue: {
+ printerNotSet: "Для этого конвейера не задан целевой принтер.",
+ printerNotFound: "Целевой принтер больше не существует.",
+ printerDisabled: "Целевой принтер отключён.",
+ printerOffline: "Целевой принтер не в сети.",
+ filamentType: "Слот филамента {{slot}}: ожидается {{expected}}, в AMS установлен {{actual}}",
+ filamentColor: "Слот филамента {{slot}}: цвет отличается (ожидается {{expected}}, в AMS установлен {{actual}})",
+ amsSlotMissing: "Слот AMS {{slot}} недоступен на этом принтере",
+ filamentUnverified: "Филамент в слоте {{slot}} выбран из облачного или стандартного профиля и не может быть проверен заранее.",
+ noClassMatches: "Ни один принтер в этой установке не соответствует целевому классу модели конвейера ({{expected}}).",
+ classNotSet: "В качестве цели конвейера выбран класс принтера, но модель не указана.",
+ },
+ },
+ },
+ slice: {
+ title: "Нарезка модели",
+ action: "Нарезать",
+ actionAll: "Нарезать все пластины ({{count}})",
+ actionAllTitle: "Нарезать все пластины в один многостольный результат и сохранить в одном архиве. Выбор филаментов охватывает все слоты, используемые проектом.",
+ allPlatesToggle: "Нарезать все пластины ({{count}})",
+ slicing: "Нарезка…",
+ printer: "Профиль принтера",
+ process: "Профиль процесса",
+ filament: "Профиль филамента",
+ filamentSlot: "Филамент {{index}} ({{type}})",
+ selectPreset: "— Выберите профиль —",
+ loadingPresets: "Загрузка профилей…",
+ analyzingPlateFilaments: "Анализ филаментов пластины…",
+ analyzingPlateFilamentsHint: "Выполняется предварительная нарезка, чтобы определить, какие слоты AMS используются на этой пластине. Результат кэшируется, поэтому повторное открытие будет мгновенным.",
+ previewToast: "Анализ {{name}} — {{elapsed}}",
+ previewWithProgress: "Анализ {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}",
+ notUsedByPlate: "— не используется на этой пластине",
+ noPresetsForSlot: "Нет доступных профилей",
+ otherPrinters: "Другие принтеры",
+ presetsLoadFailed: "Не удалось загрузить профили. Сначала импортируйте их в разделе «Настройки → Профили».",
+ refreshPresets: "Обновить",
+ refreshPresetsTitle: "Обновить профили — получить свежие облачные и встроенные списки. Используйте после удаления профиля в Bambu Studio или Bambu Handy.",
+ allPresetsRequired: "Необходимо выбрать все профили",
+ useEmbedded: "Использовать встроенные настройки файла",
+ useEmbeddedHint: "Нарезать так, как задумал автор модели (стенки, заполнение, филамент), вместо профилей выше. Доступно, потому что ваш принтер совпадает с указанным в файле.",
+ enqueuing: "Отправка задания на нарезку…",
+ queued: "В очереди…",
+ failed: "Ошибка нарезки. Проверьте журналы вспомогательного сервиса слайсера.",
+ startedToast: "Фоновая нарезка {{name}}…",
+ queuedToast: "В очереди: {{name}} — {{elapsed}}",
+ runningToast: "Нарезка {{name}} — {{elapsed}}",
+ runningWithProgress: "{{name}} — {{stage}} ({{percent}}%) — {{elapsed}}",
+ runningWithProgressMultiPlate: "Пластина {{plateIndex}} из {{plateCount}} • {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}",
+ completedToast: "Нарезка {{name}} завершена",
+ failedTitle: "Ошибка нарезки",
+ failedToast: "Не удалось нарезать {{name}}: {{detail}}",
+ tier: {
+ local: "Импортированные",
+ cloud: "Bambu Cloud",
+ orcaCloud: "Orca Cloud",
+ standard: "Стандартные",
+ },
+ cloud: {
+ notAuthenticated: "Войдите в Bambu Cloud («Настройки → Профили → Bambu Cloud»), чтобы увидеть облачные профили.",
+ expired: "Сессия Bambu Cloud истекла. Войдите снова, чтобы обновить облачные профили.",
+ unreachable: "Bambu Cloud сейчас недоступен. Локальные и стандартные профили продолжат работать.",
+ },
+ orcaCloud: {
+ notAuthenticated: "Войдите в Orca Cloud («Профили → Orca Cloud»), чтобы увидеть профили Orca.",
+ expired: "Сессия Orca Cloud истекла. Войдите снова, чтобы обновить профили Orca.",
+ unreachable: "Orca Cloud сейчас недоступен. Остальные профили продолжат работать.",
+ },
+ bedType: {
+ label: "Печатная пластина",
+ auto: "Авто (из профиля процесса)",
+ coolPlate: "Холодная пластина",
+ coolPlateSuperTack: "Холодная пластина SuperTack",
+ engineering: "Инженерная пластина",
+ highTemp: "Высокотемпературная пластина",
+ texturedPEI: "Текстурированная PEI-пластина",
+ smoothPEI: "Гладкая PEI-пластина",
+ },
+ pipelines: {
+ label: "Конвейер",
+ applyAria: "Применить конвейер",
+ applyPrompt: "Применить конвейер…",
+ empty: "Нет сохранённых конвейеров",
+ saveButton: "Сохранить как конвейер",
+ saveTitle: "Сохранить текущий набор из четырёх профилей как повторно используемый конвейер",
+ namePlaceholder: "Название конвейера",
+ nameAria: "Название нового конвейера",
+ toast: {
+ applied: "Применён конвейер «{{name}}»",
+ saved: "Конвейер сохранён",
+ saveFailed: "Не удалось сохранить",
+ },
+ },
+ },
+ spoolman: {
+ title: "Интеграция со Spoolman",
+ enabled: "Spoolman включён",
+ url: "URL Spoolman",
+ connected: "Подключено",
+ disconnected: "Нет подключения",
+ testConnection: "Проверить подключение",
+ sync: "Синхронизировать",
+ syncing: "Синхронизация…",
+ lastSync: "Последняя синхронизация",
+ linkToSpoolman: "Связать со Spoolman",
+ openInSpoolman: "Открыть в Spoolman",
+ unlinkSpool: "Отвязать катушку",
+ unlinkConfirmTitle: "Снять назначение катушки?",
+ unlinkConfirmMessage: "Катушка будет удалена из этого слота. Данные самой катушки останутся без изменений.",
+ selectSpool: "Выбрать катушку",
+ noUnlinkedSpools: "Нет свободных катушек",
+ linkSuccess: "Катушка успешно назначена",
+ linkFailed: "Не удалось назначить катушку",
+ unlinkSuccess: "Назначение катушки снято",
+ unlinkFailed: "Не удалось снять назначение катушки",
+ linkedSpool: "Назначенная катушка",
+ spoolId: "ID катушки",
+ fillSourceLabel: "(Spoolman)",
+ weight: "Масса",
+ remaining: "Остаток",
+ disableWeightSync: "Отключить синхронизацию расчётной массы AMS",
+ disableWeightSyncDesc: "Не обновлять остаток по оценке AMS. Используйте это, если предпочитаете учёт расхода Spoolman процентной оценке AMS. Для новых катушек оценка AMS всё равно будет использована как начальная масса.",
+ reportPartialUsage: "Учитывать частичный расход при неудачной печати",
+ reportPartialUsageDesc: "Если печать завершилась ошибкой или была отменена, учитывать примерный расход филамента до этого момента по прогрессу слоёв.",
+ },
+ locations: {
+ title: "Места хранения",
+ subtitle: "Управление полками, ящиками и другими физическими местами хранения катушек",
+ add: "Добавить место",
+ addShort: "Добавить",
+ edit: "Изменить место",
+ name: "Название",
+ spools: "Катушки",
+ empty: "Мест хранения пока нет. Создайте первую полку или ящик.",
+ manage: "Места хранения",
+ createPlaceholder: "например, Полка A или Ящик 1",
+ nameRequired: "Укажите название места хранения",
+ created: "Место хранения создано",
+ updated: "Место хранения обновлено",
+ deleted: "Место хранения удалено",
+ saveFailed: "Не удалось сохранить место хранения",
+ deleteFailed: "Не удалось удалить место хранения",
+ deleteBlocked: "Перед удалением переместите из этого места все катушки",
+ confirmDelete: "Удалить «{{name}}»?",
+ confirmDeleteMessage: "Это место будет удалено из каталога. Сначала необходимо переместить все катушки.",
+ },
+ inventory: {
+ title: "Учёт катушек",
+ subtitle: "Управление катушками",
+ addToInventory: "Добавить в учёт",
+ addToInventoryPending: "Добавление…",
+ addToInventorySuccess: "Катушка добавлена в учёт",
+ addToInventoryFailed: "Не удалось добавить катушку в учёт",
+ unknownSpoolTitle: "Обнаружен новый филамент",
+ unknownSpoolMessage: "В {{location}} обнаружена катушка с неизвестной RFID-меткой. Добавить её в учёт?",
+ unknownSpoolSlot: "Слот",
+ bulk: {
+ selectAllVisible: "Выбрать все видимые",
+ selectRow: "Выбрать строку",
+ selectGroup: "Выбрать группу",
+ selectionCount: "Выбрано: {{count}}",
+ edit: "Изменить",
+ printLabels: "Печать этикеток",
+ resetUsage: "Сбросить расход",
+ restore: "Восстановить",
+ archive: "Архивировать",
+ delete: "Удалить",
+ clearSelection: "Снять выделение",
+ editTitle: "Массовое изменение катушек",
+ editSubtitle: "Изменения применятся к {{count}} выбранным катушкам. Обновятся только отмеченные поля.",
+ editHint: "Введите значение в поле, чтобы включить его обновление. Будут отправлены только отмеченные строки. Пустое поле не изменяет катушки; очистить значение можно только при редактировании отдельной катушки.",
+ useCustom: "Использовать «{{value}}»",
+ toggleField: "Включить или отключить обновление этого поля",
+ changeCount: "Будет обновлено полей: {{count}}.",
+ applyPending: "Применение…",
+ applyButton: "Применить к {{count}} катушкам",
+ deleteTitle: "Удалить выбранные катушки",
+ archiveTitle: "Архивировать выбранные катушки",
+ restoreTitle: "Восстановить выбранные катушки",
+ resetUsageTitle: "Сбросить расход выбранных катушек",
+ deleteMessage: "Безвозвратно удалить {{count}} катушек? Это действие нельзя отменить.",
+ archiveMessage: "Архивировать {{count}} катушек? Позже их можно будет восстановить.",
+ restoreMessage: "Восстановить {{count}} архивных катушек?",
+ resetUsageMessage: "Сбросить счётчик «Израсходовано всего» у {{count}} катушек? Текущий остаток массы сохранится.",
+ updateSuccess: "Обновлено катушек: {{count}}",
+ updateFailed: "Ошибка массового обновления",
+ updatePartial: "Обновлено: {{ok}}, с ошибкой: {{failed}}",
+ updateAllFailed: "Не удалось обновить все {{count}} катушек. Выделение сохранено для повторной попытки.",
+ deleteSuccess: "Удалено катушек: {{count}}",
+ deleteFailed: "Ошибка массового удаления",
+ deletePartial: "Удалено: {{ok}}, с ошибкой: {{failed}}",
+ deleteAllFailed: "Не удалось удалить все {{count}} катушек. Выделение сохранено для повторной попытки.",
+ archiveSuccess: "Архивировано катушек: {{count}}",
+ archiveFailed: "Ошибка массового архивирования",
+ archivePartial: "Архивировано: {{ok}}, с ошибкой: {{failed}}",
+ archiveAllFailed: "Не удалось архивировать все {{count}} катушек. Выделение сохранено для повторной попытки.",
+ restoreSuccess: "Восстановлено катушек: {{count}}",
+ restoreFailed: "Ошибка массового восстановления",
+ restorePartial: "Восстановлено: {{ok}}, с ошибкой: {{failed}}",
+ restoreAllFailed: "Не удалось восстановить все {{count}} катушек. Выделение сохранено для повторной попытки.",
+ invalidHex: "Введите 6 шестнадцатеричных символов (RRGGBB) или 8 (RRGGBBAA), иначе поле не будет применено.",
+ },
+ spoolmanMixedContentTitle: "Spoolman не загружается через HTTPS: браузер заблокировал смешанное содержимое",
+ spoolmanMixedContentBody: "Bambuddy открыт через HTTPS (через обратный прокси), а URL Spoolman всё ещё использует обычный HTTP. Браузер блокирует такое смешанное содержимое, поэтому встроенный интерфейс Spoolman не отображается. Для работы Spoolman должен быть доступен по HTTPS.",
+ spoolmanMixedContentFixReverseProxy: "Разместите Spoolman за тем же обратным прокси, что и Bambuddy (Traefik / Nginx / Caddy), включите HTTPS и укажите новый HTTPS-адрес Spoolman в настройках.",
+ spoolmanMixedContentFixOpenNewTab: "В качестве обходного решения откройте Spoolman по HTTP в новой вкладке. Ограничение смешанного содержимого действует только для встроенных фреймов.",
+ spoolmanOpenInNewTab: "Открыть Spoolman в новой вкладке",
+ labels: {
+ title: "Печать этикеток катушек",
+ selectedCount: "Выбрано: {{count}}",
+ pickSpools: "Выберите катушки для печати этикеток:",
+ monochrome: "Монохромный режим (чёрно-белый принтер)",
+ monochromeHint: "Убирает образец цвета и расширяет область текста",
+ searchPlaceholder: "Поиск по названию, бренду или #ID",
+ filterByMaterial: "Материал:",
+ allMaterials: "Все",
+ selectVisible: "Выбрать все видимые ({{count}})",
+ deselectVisible: "Снять выделение с видимых",
+ clearAll: "Очистить выбор",
+ noSpoolsToShow: "Нет катушек для отображения. Измените фильтр и повторите попытку.",
+ noMatches: "Нет катушек, соответствующих поиску или фильтру.",
+ printOne: "Напечатать этикетку этой катушки",
+ printLabels: "Печать этикеток…",
+ bulkTitle: "Выберите катушки для печати этикеток из {{count}} отображаемых",
+ noSpoolsTitle: "Нет катушек для печати этикеток",
+ error: "Не удалось создать этикетки: {{msg}}",
+ sortBy: {
+ label: "Сортировка:",
+ id: "По ID",
+ color: "По цвету",
+ },
+ templates: {
+ amsHolderSmall: {
+ label: "Держатель AMS — малый (74 × 33 мм)",
+ hint: "Одна этикетка на страницу; соответствует печатной этикетке для модели MakerWorld 752566 (AMS Filament Label Holder).",
+ },
+ amsHolderLarge: {
+ label: "Держатель AMS — большой (75 × 55 мм)",
+ hint: "Одна этикетка на страницу; подходит для варианта держателя AMS с картонной вставкой. Достаточно места для образца цвета, бренда, материала, ID и QR-кода.",
+ },
+ box40x30: {
+ label: "Этикетка для коробки (40 × 30 мм)",
+ hint: "Одна этикетка на страницу; распространённый размер рулона DK/Brother, подходит для пакетов с филаментом и контейнеров хранения.",
+ },
+ box: {
+ label: "Этикетка для коробки (62 × 29 мм)",
+ hint: "Одна этикетка на страницу; размер для малых этикеток Brother PT/QL и Dymo.",
+ },
+ averyL7160: {
+ label: "Avery L7160 — лист A4 (38,1 × 63,5 мм × 21)",
+ hint: "Европейский формат: 21 этикетка на листе A4.",
+ },
+ avery5160: {
+ label: "Avery 5160 — лист US Letter (25,4 × 66,7 мм × 30)",
+ hint: "Американский формат: 30 этикеток на листе Letter.",
+ },
+ },
+ },
+ csv: {
+ importButton: "Импорт CSV",
+ exportButton: "Экспорт CSV",
+ modalTitle: "Импорт катушек из CSV",
+ selectFile: "Выберите CSV-файл или перетащите его сюда",
+ dragHint: "Заголовок: material (обязательно), brand, subtype, color_name, rgba, …",
+ parsing: "Чтение файла…",
+ previewError: "Не удалось прочитать CSV-файл",
+ validCount: "Корректных: {{count}}",
+ errorCount: "Ошибок: {{count}}",
+ skippedCount: "Пропущено: {{count}}",
+ colRow: "Строка",
+ colStatus: "Состояние",
+ colColor: "Цвет",
+ colorResolved: "Цвет подставлен из каталога",
+ colorCrossMaterial: "Цвет взят у другого материала: точного совпадения в каталоге нет",
+ duplicateExisting: "Катушка с таким материалом, брендом и цветом уже существует, но запись всё равно будет импортирована как новая катушка",
+ spoolmanHint: "В режиме Spoolman используйте встроенный импорт и экспорт CSV в Spoolman.",
+ importValidRows: "Импортировать {{count}} корректных строк",
+ noValidRows: "Нет корректных строк",
+ importing: "Импорт…",
+ importSuccess: "Импортировано катушек: {{count}}",
+ importError: "Ошибка импорта",
+ exportError: "Ошибка экспорта",
+ },
+ addSpool: "Добавить катушку",
+ editSpool: "Изменить катушку",
+ copySpool: "Копировать катушку",
+ material: "Материал",
+ selectMaterial: "Выберите материал…",
+ subtype: "Подтип",
+ brand: "Бренд",
+ searchBrand: "Поиск бренда…",
+ useCustomBrand: "Использовать «{{brand}}»",
+ useCustomMaterial: "Использовать свой материал: {{material}}",
+ colorName: "Название цвета",
+ colorNamePlaceholder: "Jade White, Fire Red…",
+ color: "Цвет",
+ hexColor: "Цвет HEX",
+ pickColor: "Выбрать свой цвет",
+ labelWeight: "Номинальная масса",
+ coreWeight: "Масса пустой катушки",
+ searchSpoolWeight: "Поиск массы катушки…",
+ weightUsed: "Израсходовано",
+ currentWeight: "Остаток массы",
+ measuredWeight: "Измеренная масса",
+ spoolName: "Катушка",
+ costPerKg: "Стоимость за кг",
+ storageLocation: "Место хранения",
+ storageLocationPlaceholder: "например, Полка A, Ящик 1",
+ openInInventory: "Открыть в учёте",
+ measuredWeightError: "Измеренная масса должна быть от {{min}} до {{max}} г.",
+ slicerFilament: "Филамент слайсера",
+ slicerFilamentName: "Название пресета слайсера",
+ slicerPreset: "Пресет слайсера",
+ searchPresets: "Поиск пресетов филамента…",
+ selectedPreset: "Выбрано",
+ noPresetsFound: "Пресеты не найдены",
+ tempOverrides: "Переопределение температур",
+ note: "Примечание",
+ notePlaceholder: "Дополнительные сведения об этой катушке…",
+ category: "Категория",
+ categoryPlaceholder: "например, Производство, Прототип, Клиент A",
+ categoryNone: "Без категории",
+ storageLocationNone: "Место не указано",
+ lowStockThresholdOverride: "Порог малого остатка (эта катушка)",
+ lowStockThresholdOverrideHelp: "Оставьте пустым, чтобы использовать общий порог ({{global}}%).",
+ clearRfid: "Очистить RFID-метку",
+ rfidCleared: "RFID-метка очищена",
+ archive: "Архивировать",
+ restore: "Восстановить",
+ noSpools: "Катушек пока нет. Добавьте первую катушку.",
+ noAvailableSpools: "Нет доступных катушек. Добавьте катушку в учёт или сначала освободите её в другом слоте.",
+ kProfiles: "K-профили",
+ addKProfile: "Добавить K-профиль",
+ assignSpool: "Назначить катушку",
+ unassignSpool: "Снять назначение",
+ assignSuccess: "Катушка назначена, слот AMS настроен",
+ assignPendingInsert: "Катушка назначена. Слот будет настроен после её установки.",
+ assignFailed: "Не удалось назначить катушку",
+ selectSpool: "Выберите катушку для назначения этому слоту",
+ assigned: "Назначено",
+ assigning: "Назначение…",
+ searchSpools: "Поиск катушек…",
+ showAllSpools: "Показать все катушки",
+ spoolmanSpools: "Катушки Spoolman",
+ allMaterials: "Все материалы",
+ filterByBrand: "Фильтр по бренду…",
+ showArchived: "Показывать архивные",
+ quickAdd: "Быстрое добавление",
+ quantity: "Количество",
+ stock: "На складе",
+ configured: "Настроено",
+ spoolsCreated: "Создано катушек: {{count}}",
+ spoolsPartiallyCreated: "Создано {{created}} из {{total}} катушек; часть операций завершилась ошибкой",
+ spoolCreated: "Катушка создана",
+ spoolUpdated: "Катушка обновлена",
+ spoolDeleted: "Катушка удалена",
+ deepLinkSpoolNotFound: "Катушка не найдена",
+ deepLinkFetchFailed: "Не удалось загрузить катушку. Повторите попытку.",
+ spoolArchived: "Катушка архивирована",
+ spoolRestored: "Катушка восстановлена",
+ kProfileSaveFailed: "Не удалось сохранить настройки K-профиля",
+ syncWeightSpoolNotFound: "Катушка не найдена: возможно, она была удалена",
+ syncWeightSpoolmanUnreachable: "Spoolman недоступен. Повторите попытку позже.",
+ syncWeightFailed: "Не удалось синхронизировать массу",
+ spoolmanUnreachable: "Spoolman недоступен. Повторите попытку позже.",
+ deleteSpoolNotFound: "Катушка не найдена: возможно, она уже удалена",
+ deleteFailed: "Не удалось удалить катушку",
+ archiveSpoolNotFound: "Катушка не найдена: возможно, она уже удалена",
+ archiveFailed: "Не удалось архивировать катушку",
+ restoreSpoolNotFound: "Катушка не найдена: возможно, она уже удалена",
+ restoreFailed: "Не удалось восстановить катушку",
+ saveFailed: "Не удалось сохранить изменения",
+ tagClearFailed: "Не удалось очистить метку",
+ deleteConfirm: "Удалить эту катушку без возможности восстановления?",
+ archiveConfirm: "Архивировать эту катушку?",
+ advancedSettings: "Расширенные настройки",
+ filamentInfoTab: "Сведения о филаменте",
+ paProfileTab: "Профиль PA",
+ filamentInfo: "Филамент",
+ additional: "Дополнительно",
+ loadingPresets: "Загрузка облачных пресетов…",
+ cloudConnected: "Облако подключено",
+ cloudNotConnected: "Облако не подключено; используются значения по умолчанию",
+ recentColors: "Недавние",
+ searchColors: "Поиск цветов…",
+ searchResults: "Результаты поиска",
+ allColors: "Все цвета",
+ commonColors: "Основные цвета",
+ showLess: "Показать меньше",
+ showAll: "Показать все",
+ noColorsFound: "Нет цветов, соответствующих запросу",
+ noResults: "Совпадений не найдено",
+ extraColorsLabel: "Дополнительные цвета",
+ extraColorsPlaceholder: "EC984C,#6CD4BC,A66EB9,D87694",
+ extraColorsHint: "Вставьте от 2 до 8 HEX-цветов через запятую. Они будут отображены как градиент.",
+ extraColorsInvalid: "Пропущены некорректные HEX-значения: {{tokens}}",
+ colorEffectLabel: "Эффект",
+ colorEffect: {
+ none: "Нет",
+ sparkle: "Блёстки",
+ wood: "Дерево",
+ marble: "Мрамор",
+ glow: "Свечение",
+ matte: "Матовый",
+ silk: "Шёлк",
+ galaxy: "Галактика",
+ rainbow: "Радуга",
+ metal: "Металл",
+ translucent: "Полупрозрачный",
+ gradient: "Градиент",
+ dualColor: "Двухцветный",
+ triColor: "Трёхцветный",
+ multicolor: "Многоцветный",
+ },
+ selectMaterialFirst: "Сначала выберите материал на вкладке «Сведения о филаменте».",
+ noPrintersConfigured: "Принтеры не настроены. Добавьте принтеры, чтобы использовать профили PA.",
+ matchingFilter: "Совпадающие",
+ anyBrand: "Любой бренд",
+ anyVariant: "Любой вариант",
+ autoSelect: "Автовыбор",
+ matches: "совпадений",
+ match: "совпадение",
+ noMatches: "Нет совпадений",
+ connected: "Подключён",
+ offline: "Не в сети",
+ printerOffline: "Принтер не в сети. Подключите его для просмотра калибровочных профилей.",
+ noKProfilesMatch: "Нет K-профилей, соответствующих выбранному филаменту.",
+ leftNozzle: "Левое сопло",
+ rightNozzle: "Правое сопло",
+ profilesSelected: "выбрано калибровочных профилей",
+ totalInventory: "Всего в учёте",
+ totalConsumed: "Израсходовано всего",
+ byMaterial: "По материалам",
+ inPrinter: "В принтерах",
+ lowStock: "Малый остаток",
+ sinceTracking: "С начала учёта",
+ resetConsumedCounter: "Сбросить счётчик",
+ resetConsumedCounterTooltip: "Обнулить счётчик израсходованных граммов для этой катушки. Остаток массы не изменится.",
+ resetConsumedCounterConfirm: "Сбросить счётчик расхода этой катушки до 0? Последующие печати будут учитываться заново. Сама катушка, расчёт остатка и настройки не изменятся.",
+ resetAllConsumedCounters: "Сбросить все счётчики",
+ resetAllConsumedCountersTooltip: "Обнулить счётчик израсходованных граммов у всех катушек. Остатки массы не изменятся.",
+ resetAllConsumedCountersConfirm: "Сбросить счётчик расхода до 0 у всех {{count}} катушек, включая архивные? Показатель «Израсходовано всего» будет очищен, а будущие печати начнут учитываться с нуля. Катушки и их остатки не изменятся.",
+ consumedCounterReset: "Счётчик сброшен",
+ allConsumedCountersReset: "Счётчик сброшен у {{count}} катушек",
+ resetConsumedCounterFailed: "Не удалось сбросить счётчик",
+ loadedInAms: "Загружено в AMS/внешний слот",
+ remaining: "Остаток",
+ weightCheck: "Проверка массы",
+ lastWeighed: "Последнее взвешивание",
+ neverWeighed: "Не взвешивалась",
+ search: "Поиск катушек…",
+ showing: "Показано",
+ to: "–",
+ of: "из",
+ show: "Показывать",
+ spools: "катушек",
+ spool: "катушка",
+ page: "Страница",
+ noSpoolsMatch: "Ничего не найдено",
+ noSpoolsMatchDesc: "Измените поисковый запрос или фильтры.",
+ active: "Активные",
+ archived: "Архивные",
+ all: "Все",
+ used: "Израсходовано",
+ new: "Новые",
+ clearFilters: "Сбросить фильтры",
+ table: "Таблица",
+ cards: "Карточки",
+ net: "Нетто",
+ groupSimilar: "Группировать",
+ groupedSpools: "Одинаковых катушек: {{count}}",
+ groupedRows: "строк",
+ columns: "Столбцы",
+ configureColumns: "Настроить столбцы",
+ configureColumnsDesc: "Перетаскивайте столбцы или используйте стрелки для изменения порядка. Видимость переключается значком глаза.",
+ visible: "видимых",
+ reset: "Сбросить",
+ cancel: "Отмена",
+ applyChanges: "Применить изменения",
+ moveUp: "Переместить вверх",
+ moveDown: "Переместить вниз",
+ hideColumn: "Скрыть столбец",
+ showColumn: "Показать столбец",
+ linkToSpool: "Связать с катушкой",
+ tagLinked: "Метка связана с катушкой",
+ tagLinkFailed: "Не удалось связать метку",
+ tagAlreadyLinked: "Метка уже связана с другой катушкой",
+ unknownTag: "Обнаружена неизвестная RFID-метка",
+ usageHistory: "История расхода",
+ noUsageHistory: "Расход пока не зарегистрирован",
+ printName: "Название печати",
+ weightConsumed: "Израсходованная масса",
+ clearHistory: "Очистить",
+ historyCleared: "История расхода очищена",
+ fillSourceLabel: "(Учёт)",
+ lowStockThresholdError: "Порог должен быть от 0,1 до 99,9",
+ assignMismatchTitle: "Несоответствие материала",
+ assignMismatchMessage: "Материал выбранной катушки «{{spoolMaterial}}» не соответствует материалу слота «{{trayMaterial}}» в {{location}}. Всё равно назначить?",
+ assignMismatchConfirm: "Всё равно назначить",
+ assignPartialMismatchMessage: "Материал катушки «{{spoolMaterial}}» похож, но не совпадает точно с «{{trayMaterial}}» в {{location}}. Продолжить?",
+ assignProfileMismatchMessage: "Профиль катушки «{{spoolProfile}}» не соответствует профилю слота «{{trayProfile}}» в {{location}}. Продолжить?",
+ assignReconfigureNote: "Слот AMS будет перенастроен на профиль катушки.",
+ spoolmanFilamentCatalog: "Каталог филаментов Spoolman",
+ pickFromSpoolmanCatalog: "Выбрать из каталога Spoolman…",
+ spoolmanFilamentSelected: "Филамент выбран из каталога Spoolman",
+ spoolmanFilamentUnlinked: "Связь с каталогом филаментов удалена",
+ noSpoolmanFilaments: "В каталоге Spoolman филаменты не найдены",
+ spoolmanFilamentColorSwatch: "Цвет филамента",
+ spoolWeightManagedBySpoolman: "Масса пустой катушки задаётся в Spoolman для каждого типа филамента",
+ spoolmanCatalogLoadFailed: "Не удалось загрузить каталог филаментов Spoolman",
+ },
+ timelapse: {
+ title: "Таймлапс",
+ create: "Создать таймлапс",
+ download: "Скачать",
+ delete: "Удалить",
+ preview: "Предпросмотр",
+ frameRate: "Частота кадров",
+ quality: "Качество",
+ processing: "Обработка...",
+ noTimelapses: "Таймлапсы отсутствуют",
+ },
+ ams: {
+ title: "AMS",
+ slot: "Слот",
+ empty: "Пусто",
+ emptySlot: "Пустой слот",
+ slotEmpty: "Пусто",
+ slotUnconfigured: "?",
+ emptySlotReset: "Филамент не назначен",
+ unknown: "Неизвестно",
+ humidity: "Влажность",
+ temperature: "Температура",
+ filamentType: "Тип филамента",
+ filamentColor: "Цвет",
+ remaining: "Остаток",
+ history: "История AMS",
+ noHistory: "История отсутствует",
+ configureSlot: "Настроить слот",
+ externalSpool: "Внешняя катушка",
+ profile: "Профиль",
+ kFactor: "Коэффициент K",
+ fill: "Заполнить",
+ configure: "Настроить",
+ used: "использовано",
+ remainingUnit: "осталось",
+ },
+ printModal: {
+ selectPrinter: "Выберите принтер",
+ selectPlate: "Выберите пластину",
+ filamentMapping: "Сопоставление филаментов",
+ plateN: "Пластина {{n}}",
+ plateFilamentsUnreadable: "Не удалось определить филаменты выбранной пластины, поэтому их невозможно сопоставить. Снимите выбор с этой пластины, чтобы добавить остальные в очередь.",
+ totalCost: "Общая стоимость:",
+ slotRemainingShort: " — осталось {{grams}} г",
+ printSettings: "Настройки печати",
+ bedLeveling: "Калибровка стола",
+ flowCalibration: "Калибровка потока",
+ vibrationCalibration: "Калибровка вибраций",
+ layerInspection: "Проверка первого слоя",
+ timelapse: "Таймлапс",
+ cancel: "Отмена",
+ noPrintersAvailable: "Нет доступных принтеров",
+ printerBusy: "Принтер занят",
+ printerOffline: "Принтер не в сети",
+ sameTypeDifferentColor: "Тот же тип, другой цвет",
+ filamentTypeNotLoaded: "Филамент этого типа не загружен",
+ whenToPrint: "Когда печатать",
+ asap: "Как можно скорее",
+ queue: "В очередь",
+ schedule: "По расписанию",
+ dateTime: "Дата и время",
+ invalidDateTime: "Введите корректные дату и время",
+ openCalendar: "Открыть календарь",
+ requireManualStart: "Требовать ручного запуска",
+ requirePreviousSuccess: "Запускать только после успешной предыдущей печати",
+ autoOffAfter: "Выключить принтер после завершения",
+ helpAsap: "Задание будет добавлено в начало очереди и запустится, как только подходящий принтер освободится.",
+ helpSchedule: "Задание запустится в указанное время, если принтер свободен. Если принтер занят, оно будет ждать освобождения.",
+ helpQueue: "Задание будет добавлено в конец очереди.",
+ leftNozzle: "Л",
+ rightNozzle: "П",
+ leftNozzleTooltip: "Левое сопло",
+ rightNozzleTooltip: "Правое сопло",
+ filamentOverride: "Переопределение филаментов",
+ filamentOverrideHint: "При необходимости замените филаменты для назначения по модели. Планировщик будет сопоставлять выбранные филаменты вместо исходных значений из 3MF.",
+ originalFilament: "Исходный",
+ overrideWith: "Заменить на",
+ resetToOriginal: "Вернуть исходный",
+ insufficientFilamentTitle: "Недостаточно филамента",
+ waitingForAmsStatus: "Ожидание состояния AMS от принтера {{printer}}…",
+ insufficientFilamentMessage: "На некоторых назначенных катушках осталось меньше филамента, чем требуется для этой печати:",
+ insufficientFilamentLine: "{{printer}} — {{slot}}: требуется {{required}} г, осталось {{remaining}} г",
+ printAnyway: "Всё равно печатать",
+ forceColorMatch: "Обязательно учитывать цвет",
+ staggerPrinterStarts: "Запускать принтеры с задержкой",
+ staggerGroupSize: "Размер группы",
+ staggerInterval: "Интервал (мин)",
+ staggerPreview: "{{printers}} принтеров → {{groups}} групп по {{size}}, запуск каждые {{interval}} мин",
+ staggerLastGroup: "последняя группа: {{count}}",
+ staggerTotal: "всего: {{minutes}} мин",
+ staggerToPrinters: "Распределить запуск для {{count}} принтеров",
+ gcodeInjection: "Добавить G-code автозапуска",
+ },
+ backup: {
+ includesEncryptionKey: "Локальные резервные копии включают файл ключа шифрования MFA (DATA_DIR/.mfa_encryption_key), поэтому ZIP-архив является самодостаточным. Считайте этот ZIP конфиденциальным: любой, у кого есть файл, сможет расшифровать сохранённые в нём секреты клиента OIDC и TOTP.",
+ title: "Резервное копирование и восстановление",
+ createBackup: "Создать резервную копию",
+ restoreBackup: "Восстановить из копии",
+ restoreDescription: "Заменить все данные данными из резервной копии",
+ downloadBackup: "Скачать резервную копию",
+ uploadBackup: "Загрузить резервную копию",
+ lastBackup: "Последняя копия",
+ autoBackup: "Автоматическое резервное копирование",
+ backupNow: "Создать копию сейчас",
+ restoreWarning: "Внимание: восстановление из резервной копии перезапишет все текущие данные.",
+ includeArchives: "Включить архивы",
+ includeSettings: "Включить настройки",
+ includeProfiles: "Включить профили",
+ backupSuccess: "Резервная копия успешно создана",
+ restoreSuccess: "Резервная копия успешно восстановлена",
+ backupFailed: "Не удалось создать резервную копию",
+ restoreFailed: "Не удалось выполнить восстановление",
+ restoreNote: "На время восстановления виртуальный принтер будет остановлен",
+ githubBackup: "Резервная копия в Git",
+ enabled: "Включено",
+ cloudLoginRequired: "Требуется вход в Bambu Cloud. Войдите в разделе «Профили → Облачные профили», чтобы включить резервное копирование в GitHub.",
+ cloudLoginRequiredShort: "Требуется вход в облако",
+ githubDescription: "Автоматически синхронизировать профили с приватным репозиторием GitHub для резервного копирования и хранения истории версий.",
+ repoIsPrivate: "Репозиторий приватный — резервное копирование безопасно.",
+ repoIsPublicWarning: "Репозиторий ПУБЛИЧНЫЙ. Резервные копии Bambuddy содержат учётные данные MQTT, токены Home Assistant и Prometheus, адрес электронной почты Bambu Cloud и коды доступа к принтерам из K-профилей. Сохранение заблокировано, пока репозиторий не будет сделан приватным в настройках провайдера.",
+ repoVisibilityUnknown: "Не удалось определить видимость репозитория. Bambuddy отказывается создавать резервные копии в репозитории, приватность которого не подтверждена; сохранение будет заблокировано.",
+ repositoryUrl: "URL репозитория",
+ repoUrlPlaceholderGitHub: "https://github.com/username/repo-name",
+ repoUrlPlaceholderGitea: "https://gitea.example.com/username/repo-name",
+ repoUrlPlaceholderForgejo: "https://forgejo.example.com/username/repo-name",
+ repoUrlPlaceholderGitLab: "https://gitlab.com/username/repo-name",
+ allowInsecureHttp: "Разрешить небезопасный HTTP",
+ allowInsecureHttpHint: "Включайте для локальных серверов в частной сети без TLS",
+ personalAccessToken: "Персональный токен доступа",
+ tokenSaved: "(сохранён)",
+ enterNewToken: "Введите новый токен для обновления",
+ tokenHint: "Токен с точечными правами на чтение и запись содержимого",
+ branch: "Ветка",
+ provider: "Git-провайдер",
+ providerGitHub: "GitHub",
+ providerGitLab: "GitLab",
+ providerGitea: "Gitea",
+ providerForgejo: "Forgejo",
+ manualOnly: "Только вручную",
+ hourly: "Ежечасно",
+ daily: "Ежедневно",
+ weekly: "Еженедельно",
+ includeInBackup: "Включить в резервную копию",
+ kProfiles: "K-профили",
+ kProfilesDescription: "Калибровки Pressure Advance с подключённых принтеров",
+ noPrintersConnected: "Нет подключённых принтеров",
+ printersConnected: "Подключено {{connected}} из {{total}}",
+ cloudProfiles: "Облачные профили",
+ cloudProfilesDescription: "Предустановки филамента, принтера и процесса из Bambu Cloud",
+ appSettings: "Настройки приложения",
+ appSettingsDescription: "Конфигурация Bambuddy (полная база данных)",
+ spoolInventory: "Учёт катушек",
+ spoolInventoryDescription: "Катушки филамента, история расхода и учёт стоимости",
+ printArchives: "Архив печати",
+ printArchivesDescription: "Метаданные истории печати без файлов G-code и 3MF",
+ lastBackupAt: "Последняя копия:",
+ noBackupsYet: "Резервных копий пока нет",
+ next: "Следующая:",
+ startingBackup: "Запуск резервного копирования...",
+ test: "Проверить",
+ enableBackup: "Включить резервное копирование",
+ testConnection: "Проверить соединение",
+ enterRepoUrl: "Введите URL репозитория",
+ enterRepoAndToken: "Введите URL репозитория и токен доступа",
+ repoRequired: "Необходимо указать URL репозитория",
+ tokenRequired: "Необходимо указать токен доступа",
+ githubBackupEnabled: "Резервное копирование в GitHub включено",
+ tokenUpdated: "Токен обновлён",
+ settingsSaved: "Настройки сохранены",
+ failedToSave: "Не удалось сохранить: {{message}}",
+ backupCompleteFiles: "Резервное копирование завершено — обновлено файлов: {{count}}",
+ backupSkippedNoChanges: "Резервное копирование пропущено — изменений нет",
+ backupFailed2: "Ошибка резервного копирования: {{message}}",
+ clearedLogs: "Очищено записей журнала: {{count}}",
+ failedToClearLogs: "Не удалось очистить журнал: {{message}}",
+ history: "История",
+ clear: "Очистить",
+ date: "Дата",
+ status: "Статус",
+ commit: "Коммит",
+ localBackup: "Локальная резервная копия",
+ localBackupDescription: "Создать полную резервную копию данных Bambuddy, включая базу данных, архивы, загрузки и все файлы.",
+ downloadBackupLabel: "Скачать резервную копию",
+ completeBackupZip: "Полная копия: база данных и все файлы (ZIP)",
+ download: "Скачать",
+ preparingBackup: "Подготовка резервной копии...",
+ creatingArchive: "Создание архива резервной копии... Для больших архивов это может занять некоторое время.",
+ downloadingFile: "Скачивание файла резервной копии...",
+ backupDownloaded: "Резервная копия успешно скачана",
+ failedToCreateBackup: "Не удалось создать резервную копию: {{message}}",
+ restore: "Восстановить",
+ restoreReplacesAll: "Восстановление заменит все данные.",
+ restoreReplacesAllDetail: "Текущая база данных и файлы будут полностью заменены. После восстановления потребуется перезапуск.",
+ restoreConfirmTitle: "Восстановление из резервной копии",
+ restoreConfirmMessage: "Восстановить данные из файла «{{filename}}»? Текущая база данных и все файлы будут полностью заменены. После восстановления приложение потребуется перезапустить.",
+ restoreConfirmButton: "Восстановить",
+ uploadingFile: "Загрузка файла резервной копии...",
+ backupRestoredRestart: "Резервная копия восстановлена. Перезапустите Bambuddy.",
+ failedToRestore: "Не удалось восстановить резервную копию. Проверьте формат файла.",
+ reloadNow: "Перезагрузить сейчас",
+ creatingBackup: "Создание резервной копии",
+ restoringBackup: "Восстановление данных",
+ preparing: "Подготовка...",
+ processing: "Обработка...",
+ doNotClosePage: "Не закрывайте эту страницу и не переходите на другую. Для больших резервных копий операция может занять несколько минут.",
+ restoring: "Восстановление...",
+ restoreComplete: "Восстановление завершено",
+ restoreFailed2: "Ошибка восстановления",
+ importSettings: "Импортировать настройки из файла резервной копии",
+ pleaseWaitRestoring: "Подождите, пока данные восстанавливаются",
+ selectBackupFile: "Нажмите, чтобы выбрать файл резервной копии (.json или .zip)",
+ duplicateHandling: "Правила обработки дубликатов:",
+ matchPrinters: "Принтеры",
+ matchPrintersBy: "сопоставляются по серийному номеру",
+ matchSmartPlugs: "Умные розетки",
+ matchSmartPlugsBy: "сопоставляются по IP-адресу",
+ matchNotificationProviders: "Провайдеры уведомлений",
+ matchNotificationProvidersBy: "сопоставляются по имени",
+ matchFilaments: "Филаменты",
+ matchFilamentsBy: "сопоставляются по имени, типу и бренду",
+ matchArchives: "Архивы",
+ matchArchivesBy: "сопоставляются по хешу содержимого и всегда пропускаются",
+ matchPendingUploads: "Ожидающие загрузки",
+ matchPendingUploadsBy: "сопоставляются по имени файла",
+ matchSettingsTemplates: "Настройки и шаблоны",
+ matchSettingsTemplatesBy: "всегда перезаписываются",
+ replaceExisting: "Заменять существующие данные",
+ keepExisting: "Сохранять существующие данные",
+ overwriteDescription: "Перезаписывать существующие элементы данными из резервной копии",
+ keepDescription: "Восстанавливать только отсутствующие элементы",
+ overwriteCaution: "Внимание:",
+ overwriteWarning: "Перезапись заменит текущие настройки данными из резервной копии. В целях безопасности коды доступа к принтерам никогда не перезаписываются.",
+ cancel: "Отмена",
+ processingBackup: "Обработка файла резервной копии...",
+ itemsRestored: "Восстановлено элементов",
+ itemsSkipped: "Пропущено элементов",
+ restored: "Восстановлено",
+ skippedAlreadyExist: "Пропущено — уже существует",
+ filesCategory: "Файлы (3MF, миниатюры и т. п.)",
+ andMore: "...и ещё {{count}}",
+ newApiKeysGenerated: "Созданы новые API-ключи",
+ keysShownOnce: "Эти ключи показываются только один раз. Скопируйте их сейчас!",
+ copy: "Копировать",
+ noDataFound: "В резервной копии не найдено данных для восстановления.",
+ close: "Закрыть",
+ scheduledBackup: "Резервные копии по расписанию",
+ scheduledBackupDescription: "Автоматически создавать снимки резервных копий по расписанию. Каталог назначения можно смонтировать с NAS или внешнего накопителя.",
+ frequency: "Периодичность",
+ backupTime: "Время",
+ retention: "Хранение",
+ retentionDescription: "Количество сохраняемых резервных копий",
+ outputPath: "Каталог назначения",
+ outputPathPlaceholder: "По умолчанию: {{path}}",
+ outputPathDescription: "Оставьте пустым, чтобы использовать стандартный каталог",
+ runNow: "Запустить сейчас",
+ backupFiles: "Файлы резервных копий",
+ noScheduledBackups: "Резервных копий пока нет",
+ deleteBackup: "Удалить",
+ deleteBackupConfirm: "Удалить этот файл резервной копии?",
+ backupRunning: "Выполняется резервное копирование...",
+ scheduledBackupComplete: "Резервная копия успешно создана",
+ scheduledBackupFailed: "Ошибка резервного копирования",
+ nextBackup: "Следующая копия",
+ backupSize: "Размер",
+ localTimeHint: "Местное время ({{tz}})",
+ defaultPathLabel: "По умолчанию:",
+ pathCheck: {
+ title: "Bambuddy не может записывать в этот каталог",
+ howToFix: "Как исправить:",
+ sandboxed: "Служба Bambuddy не может записывать в {{path}}. Её модуль systemd работает с ProtectSystem=strict, поэтому все каталоги за пределами каталогов установки, данных и журналов доступны службе только для чтения, даже если из вашей командной оболочки запись разрешена.",
+ read_only: "{{path}} находится в файловой системе, доступной только для чтения.",
+ permission_denied: "Bambuddy не разрешена запись в {{path}}. Проверьте владельца каталога и права доступа.",
+ no_space: "В файловой системе, содержащей {{path}}, закончилось свободное место.",
+ not_a_directory: "{{path}} существует, но не является каталогом.",
+ missing: "{{path}} не существует, и создать этот каталог не удалось.",
+ error: "Bambuddy не может записывать в {{path}}.",
+ ephemeralTitle: "Эти резервные копии не сохранятся после перезапуска контейнера",
+ container_ephemeral: "{{path}} находится внутри контейнера Bambuddy, а не на хосте. Записанные туда резервные копии будут потеряны при пересоздании контейнера. Подключите каталог с хоста:",
+ },
+ categories: {
+ settings: "Настройки",
+ notification_providers: "Провайдеры уведомлений",
+ notification_templates: "Шаблоны уведомлений",
+ smart_plugs: "Умные розетки",
+ printers: "Принтеры",
+ filaments: "Филаменты",
+ maintenance_types: "Виды обслуживания",
+ archives: "Архивы",
+ projects: "Проекты",
+ pending_uploads: "Ожидающие загрузки",
+ external_links: "Внешние ссылки",
+ api_keys: "API-ключи",
+ },
+ },
+ tags: {
+ title: "Метки",
+ addTag: "Добавить метку",
+ editTag: "Изменить метку",
+ deleteTag: "Удалить метку",
+ tagName: "Название метки",
+ tagColor: "Цвет метки",
+ noTags: "Меток нет",
+ deleteConfirm: "Удалить эту метку?",
+ manageTags: "Управление метками",
+ },
+ uploadModal: {
+ title: "Загрузка файлов 3MF",
+ dragDrop: "Перетащите файлы .3mf сюда",
+ or: "или",
+ browseFiles: "Выбрать файлы",
+ extractionInfo: "Модель принтера будет автоматически определена по метаданным файла 3MF.",
+ uploaded: "загружено",
+ failed: "ошибок",
+ uploading: "Загрузка...",
+ upload: "Загрузить",
+ uploadFailed: "Не удалось загрузить",
+ },
+ editArchive: {
+ title: "Редактирование архива",
+ name: "Название",
+ namePlaceholder: "Название печати",
+ printer: "Принтер",
+ noPrinter: "Без принтера",
+ project: "Проект",
+ noProject: "Без проекта",
+ itemsPrinted: "Напечатано изделий",
+ itemsPrintedHelp: "Количество изделий, полученных в этом задании печати",
+ notes: "Заметки",
+ notesPlaceholder: "Добавьте заметки об этой печати...",
+ externalLink: "Внешняя ссылка",
+ externalLinkPlaceholder: "https://printables.com/model/...",
+ externalLinkHelp: "Ссылка на Printables, Thingiverse или другой источник",
+ tags: "Метки",
+ tagsPlaceholder: "Добавить метки...",
+ addMoreTags: "Добавить ещё метки...",
+ matchingTags: "Совпадения для «{{query}}»",
+ existingTags: "Существующие метки",
+ clickToAdd: "(нажмите, чтобы добавить)",
+ status: "Статус",
+ failureReason: "Причина сбоя",
+ selectReason: "Выберите причину...",
+ photos: "Фотографии результата печати",
+ photosHelp: "Нажмите +, чтобы добавить фотографии результата",
+ printResult: "Результат печати",
+ saving: "Сохранение...",
+ failureReasons: {
+ adhesionFailure: "Плохая адгезия к столу",
+ spaghettiDetached: "Спагетти / отрыв детали",
+ layerShift: "Сдвиг слоёв",
+ cloggedNozzle: "Засор сопла",
+ filamentRunout: "Закончился филамент",
+ warping: "Коробление",
+ stringing: "Стрингинг",
+ underExtrusion: "Недоэкструзия",
+ powerFailure: "Сбой питания",
+ userCancelled: "Отменено пользователем",
+ other: "Другое",
+ },
+ statuses: {
+ completed: "Завершено",
+ failed: "Ошибка",
+ aborted: "Отменено",
+ printing: "Печать",
+ },
+ },
+ kProfiles: {
+ title: "K-профили",
+ noPrintersConfigured: "Принтеры не настроены",
+ addPrinterInSettings: "Добавьте принтер в настройках, чтобы управлять K-профилями",
+ noActivePrinters: "Нет активных принтеров",
+ enablePrinterConnection: "Включите подключение к принтеру, чтобы просматривать его K-профили",
+ loadingProfiles: "Загрузка K-профилей...",
+ printerOffline: "Принтер не в сети",
+ printerOfflineDesc: "Выбранный принтер не подключён. Включите его, чтобы просмотреть K-профили.",
+ noMatchingProfiles: "Подходящие профили не найдены",
+ noMatchingProfilesDesc: "Ни один профиль не соответствует условиям поиска",
+ noKProfiles: "K-профили отсутствуют",
+ noKProfilesDesc: "Для сопла {{diameter}} мм не найдены профили Pressure Advance",
+ createFirstProfile: "Создать первый профиль",
+ printer: "Принтер",
+ nozzle: "Сопло",
+ refresh: "Обновить",
+ addProfile: "Добавить профиль",
+ export: "Экспорт",
+ import: "Импорт",
+ select: "Выбрать",
+ selectAll: "Выбрать все",
+ delete: "Удалить",
+ searchPlaceholder: "Поиск по названию или филаменту...",
+ allExtruders: "Все экструдеры",
+ leftOnly: "Только левый",
+ rightOnly: "Только правый",
+ allFlow: "Любой тип потока",
+ hfOnly: "Только HF",
+ sOnly: "Только S",
+ sortName: "Сортировка: название",
+ sortKValue: "Сортировка: K-значение",
+ sortFilament: "Сортировка: филамент",
+ leftExtruder: "Левый экструдер",
+ rightExtruder: "Правый экструдер",
+ modal: {
+ addTitle: "Добавить K-профиль",
+ editTitle: "Изменить K-профиль",
+ profileName: "Название профиля",
+ profileNamePlaceholder: "Мой профиль PLA",
+ kValue: "K-значение",
+ kValuePlaceholder: "0.020",
+ kValueHelp: "Типичный диапазон: 0,01–0,06 для PLA, 0,02–0,10 для PETG",
+ filament: "Филамент",
+ selectFilament: "Выберите филамент...",
+ noFilamentsHelp: "Филаменты не найдены. Сначала создайте K-профиль в Bambu Studio.",
+ flowType: "Тип потока",
+ highFlow: "Высокопоточный",
+ standard: "Стандартный",
+ nozzleSize: "Диаметр сопла",
+ extruder: "Экструдер",
+ extruders: "Экструдеры",
+ left: "Левый",
+ right: "Правый",
+ notes: "Заметки (хранятся локально)",
+ notesPlaceholder: "Добавьте заметки об этом профиле...",
+ notesHelp: "Заметки сохраняются в Bambuddy, а не на принтере",
+ syncing: "Синхронизация с принтером...",
+ savingExtruder: "Сохранение в экструдер {{current}}/{{total}}...",
+ pleaseWait: "Подождите",
+ },
+ deleteConfirm: {
+ title: "Удалить профиль",
+ cannotUndo: "Это действие нельзя отменить",
+ message: "Удалить профиль «{{name}}» с принтера?",
+ },
+ bulkDelete: {
+ title: "Удалить профили",
+ cannotUndo: "Это действие нельзя отменить",
+ message: "Удалить с принтера выбранные профили ({{count}})?",
+ },
+ toast: {
+ profileSaved: "K-профиль сохранён",
+ profilesSaved: "K-профиль сохранён для {{count}} экструдеров",
+ selectAtLeastOneExtruder: "Выберите хотя бы один экструдер",
+ profileDeleted: "K-профиль удалён",
+ profilesDeleted: "Удалено профилей: {{count}}",
+ exportedProfiles: "Экспортировано профилей: {{count}}",
+ importedProfiles: "Импортировано {{count}} из {{total}} профилей",
+ noProfilesToExport: "Нет профилей для экспорта",
+ invalidFileFormat: "Недопустимый формат файла",
+ failedToParseImport: "Не удалось разобрать файл импорта",
+ failedToSaveBatch: "Не удалось сохранить K-профили",
+ noteSaved: "Заметка сохранена",
+ failedToSaveNote: "Не удалось сохранить заметку",
+ },
+ permission: {
+ noRead: "У вас нет прав на обновление профилей",
+ noCreate: "У вас нет прав на добавление профилей",
+ noUpdate: "У вас нет прав на изменение K-профилей",
+ noDelete: "У вас нет прав на удаление K-профилей",
+ noExport: "У вас нет прав на экспорт профилей",
+ noImport: "У вас нет прав на импорт профилей",
+ },
+ },
+ virtualPrinter: {
+ title: "Виртуальный принтер",
+ running: "Запущен",
+ stopped: "Остановлен",
+ description: {
+ default: "Включает виртуальный принтер, который отображается в Bambu Studio и OrcaSlicer. Отправленные на него файлы сразу сохраняются в архив без печати.",
+ proxy: "Включает прокси, перенаправляющий трафик слайсера на реальный принтер и позволяющий печатать удалённо из любой сети.",
+ },
+ enable: {
+ title: "Включить виртуальный принтер",
+ visibleInSlicer: "Отображается как «Bambuddy» при обнаружении принтеров в слайсере",
+ proxyingTo: "Проксирование на {{name}}",
+ notActive: "Не активен",
+ },
+ model: {
+ title: "Модель принтера",
+ description: "Выберите модель принтера, которую нужно эмулировать.",
+ restartWarning: "При изменении модели виртуальный принтер будет перезапущен",
+ },
+ accessCode: {
+ title: "Код доступа",
+ isSet: "Код доступа задан",
+ notSet: "Код доступа не задан — он необходим для включения",
+ placeholder: "Введите 8-значный код",
+ placeholderChange: "Введите новый код",
+ hint: "Код должен состоять ровно из 8 символов. Слайсеры используют его для аутентификации.",
+ charCount: "({{count}}/8)",
+ inheritedFromTarget: "Унаследован от целевого принтера",
+ derivedFromTargetHint: "Используется код доступа целевого принтера. Мост перенаправляет аутентификацию слайсера на реальный принтер, поэтому коды должны совпадать. Чтобы изменить значение, измените код доступа самого принтера.",
+ reveal: "Показать код доступа",
+ hide: "Скрыть код доступа",
+ },
+ targetPrinter: {
+ title: "Целевой принтер",
+ configured: "Целевой принтер для прокси настроен",
+ notConfigured: "Целевой принтер не выбран — он необходим для режима прокси",
+ placeholder: "Выберите принтер...",
+ hint: "Выберите принтер, на который будет перенаправляться трафик слайсера. Принтер должен работать в режиме LAN.",
+ noPrinters: "Нет настроенных принтеров. Сначала добавьте принтер.",
+ },
+ remoteInterface: {
+ title: "Переопределение сетевого интерфейса",
+ configured: "Переопределение интерфейса активно",
+ optional: "Необязательно — используйте, если IP определён неверно, например при нескольких сетевых картах, Docker или VPN",
+ placeholder: "Определять автоматически...",
+ hint: "Переопределяет IP-адрес, публикуемый через SSDP и используемый в TLS-сертификате. Полезно, если у Bambuddy несколько сетевых интерфейсов.",
+ },
+ mode: {
+ title: "Режим",
+ archive: "Архив",
+ archiveDesc: "Сразу сохранять файлы в архив",
+ review: "Проверка",
+ reviewDesc: "Проверять перед добавлением в архив",
+ queue: "Очередь",
+ queueDesc: "Сохранять в архив и добавлять в очередь",
+ proxy: "Прокси",
+ proxyDesc: "Перенаправлять на реальный принтер",
+ },
+ autoDispatch: {
+ title: "Автоматический запуск",
+ description: "Автоматически запускать задания после добавления в очередь. Если выключено, задания ожидают ручного запуска.",
+ },
+ queueForceColorMatch: {
+ title: "Требовать совпадения цвета",
+ description: "Не назначать задание принтеру, если загружены филамент другого типа или другого цвета. По умолчанию выключено: без этой проверки очередь сопоставляет только модель принтера и может выбрать принтер с неподходящим цветом.",
+ },
+ gcodeInjection: {
+ title: "Вставка G-code",
+ description: "Применять к заданиям этого виртуального принтера фрагменты G-code для соответствующей модели, заданные в настройках. По умолчанию выключено.",
+ },
+ tailscaleDisabled: {
+ title: "Интеграция Tailscale",
+ description: "Отметить этот виртуальный принтер как доступный через Tailscale. Будет показан Tailscale-адрес хоста, который нужно указать в слайсере. Импорт сертификата центра сертификации выполняется как обычно; этот переключатель на сертификаты не влияет.",
+ },
+ setupRequired: {
+ title: "Требуется настройка",
+ description: "Для работы виртуального принтера требуется дополнительная настройка системы: перенаправление портов, правила межсетевого экрана и параметры, зависящие от платформы.",
+ readGuide: "Перед включением прочитайте руководство по настройке",
+ },
+ archiveNameSource: {
+ title: "Источник названия архива",
+ description: "Выберите способ формирования названия новых архивов для файлов, полученных через виртуальный принтер. «Метаданные» использует поле Title, встроенное слайсером в 3MF. «Имя файла» использует имя, переданное Bambu Studio по FTP. Bambu Studio заменяет введённое в окне отправки название значением Title из 3MF, если оно присутствует, поэтому оба режима часто дают одинаковый результат.",
+ metadata: "Метаданные",
+ filename: "Имя файла",
+ },
+ caCert: {
+ title: "Сертификат для слайсера",
+ description: "Виртуальные принтеры используют TLS-сертификат, подписанный центром сертификации Bambuddy. Один раз импортируйте этот сертификат CA в хранилище доверенных сертификатов слайсера, чтобы он принимал соединение.",
+ copy: "Копировать",
+ copied: "Скопировано",
+ download: "Скачать",
+ fingerprint: "SHA-256",
+ },
+ howItWorks: {
+ title: "Как это работает",
+ step1: "В одной локальной сети виртуальные принтеры автоматически появляются в Bambu Studio и OrcaSlicer. Из других сетей добавьте их вручную по IP-адресу и коду доступа.",
+ step2: "В режимах «Архив», «Проверка» и «Очередь» используйте кнопку «Отправить» в слайсере для загрузки 3MF в Bambuddy. Слайсер покажет сообщение об успешной печати, но файл будет только сохранён, без запуска печати.",
+ step3: "В режиме прокси виртуальный принтер перенаправляет весь трафик на реальный принтер — печать запускается сразу, как при прямом подключении.",
+ },
+ status: {
+ title: "Сведения о состоянии",
+ printerName: "Имя принтера",
+ model: "Модель",
+ serialNumber: "Серийный номер",
+ mode: "Режим",
+ pendingFiles: "Ожидающие файлы",
+ targetPrinter: "Целевой принтер",
+ ftpPort: "Порт FTP",
+ mqttPort: "Порт MQTT",
+ ftpConnections: "Соединения FTP",
+ mqttConnections: "Соединения MQTT",
+ },
+ toast: {
+ updated: "Настройки виртуального принтера обновлены",
+ failedToUpdate: "Не удалось обновить настройки",
+ copyFailed: "Не удалось скопировать — выделите текст вручную",
+ accessCodeRequired: "Сначала задайте код доступа",
+ targetPrinterRequired: "Сначала выберите целевой принтер",
+ bindIpRequired: "Сначала задайте IP-адрес привязки",
+ accessCodeEmpty: "Код доступа не может быть пустым",
+ accessCodeLength: "Код доступа должен состоять ровно из 8 символов",
+ targetCodeChangedRebind: "Код доступа приведён в соответствие с новым целевым принтером. Удалите и снова добавьте устройство в слайсере, чтобы он получил новый код.",
+ created: "Виртуальный принтер создан",
+ failedToCreate: "Не удалось создать виртуальный принтер",
+ deleted: "Виртуальный принтер удалён",
+ failedToDelete: "Не удалось удалить виртуальный принтер",
+ },
+ list: {
+ title: "Виртуальные принтеры",
+ add: "Добавить",
+ addFirst: "Добавить виртуальный принтер",
+ empty: "Виртуальные принтеры не настроены. Добавьте первый принтер.",
+ },
+ bindIp: {
+ title: "Интерфейс привязки",
+ placeholder: "Выберите интерфейс...",
+ hint: "Сетевой интерфейс, к которому будет привязан этот виртуальный принтер. Для каждого принтера он должен быть уникальным.",
+ },
+ proxy: {
+ accessCodeHint: "В режиме прокси используйте в слайсере код доступа целевого принтера. Соединение прозрачно перенаправляется на реальный принтер.",
+ },
+ addDialog: {
+ title: "Добавление виртуального принтера",
+ name: "Название",
+ hint: "После создания можно настроить код доступа, целевой принтер и остальные параметры.",
+ create: "Создать",
+ },
+ deleteConfirm: {
+ title: "Удаление виртуального принтера",
+ message: "Удалить «{{name}}»? Все службы этого виртуального принтера будут остановлены.",
+ },
+ },
+ modelViewer: {
+ openInSlicer: "Открыть в слайсере",
+ tabs: {
+ model: "3D-модель",
+ gcode: "Предпросмотр G-code",
+ },
+ notAvailable: "недоступно",
+ notSliced: "не нарезано",
+ plates: "Пластины",
+ allPlates: "Все пластины",
+ plateNumber: "Пластина {{number}}",
+ plateCount: "{{count}} пластина",
+ plateCount_other: "{{count}} пластин",
+ objectCount: "{{count}} объект",
+ objectCount_other: "{{count}} объектов",
+ filamentCount: "{{count}} филамент",
+ filamentCount_other: "{{count}} филаментов",
+ eta: "Осталось {{minutes}} мин",
+ noPreview: "Для этого файла нет предпросмотра",
+ pagination: {
+ pageOf: "Страница {{current}} из {{total}}",
+ prev: "Назад",
+ next: "Далее",
+ },
+ errors: {
+ failedToLoad: "Не удалось загрузить файл",
+ noMeshes: "В файле 3MF не найдены сеточные модели",
+ unsupportedFormat: "Неподдерживаемый формат файла",
+ },
+ },
+ maintenanceDescriptions: {
+ lubricateCarbonRods: "Смазать углепластиковые направляющие для плавного перемещения",
+ lubricateRails: "Смазать линейные направляющие для плавного перемещения",
+ cleanNozzle: "Очистить хотэнд и сопло для предотвращения засоров",
+ checkBelts: "Проверить натяжение ремней для сохранения точности печати",
+ cleanBuildPlate: "Очистить печатную пластину для улучшения адгезии",
+ checkExtruder: "Проверить шестерни экструдера на износ",
+ checkCooling: "Проверить исправность вентиляторов охлаждения",
+ generalInspection: "Общий осмотр принтера",
+ cleanCarbonRods: "Очистить углепластиковые направляющие для уменьшения трения",
+ lubricateSteelRods: "Смазать стальные направляющие для плавного перемещения",
+ cleanSteelRods: "Очистить стальные направляющие для уменьшения трения",
+ cleanLinearRails: "Протереть линейные направляющие от пыли и загрязнений",
+ checkPtfeTube: "Проверить PTFE-трубку на износ и повреждения",
+ replaceHepaFilter: "Заменить HEPA-фильтр",
+ replaceCarbonFilter: "Заменить угольный фильтр",
+ lubricateLeftNozzleRail: "Смазать направляющую левого сопла (серия H2)",
+ },
+ smartPlugs: {
+ offline: "Не в сети",
+ admin: "Управление",
+ openPlugAdminPage: "Открыть страницу управления розеткой",
+ deleteSmartPlug: "Удалить умную розетку",
+ turnOnSmartPlug: "Включить умную розетку",
+ turnOffSmartPlug: "Выключить умную розетку",
+ turnOn: "Включить",
+ turnOff: "Выключить",
+ addSmartPlug: {
+ scanningNetwork: "Сканирование сети...",
+ chooseEntity: "Выберите сущность...",
+ connectionFailed: "Ошибка подключения",
+ searchEntities: "Поиск сущностей...",
+ searchPowerSensors: "Поиск датчиков мощности...",
+ searchEnergySensors: "Поиск датчиков энергии...",
+ placeholders: {
+ plugName: "Розетка в гостиной",
+ mqttStateOnValue: "ON, true, 1",
+ mqttSameAsPower: "Та же тема, что для мощности, или другая",
+ },
+ },
+ linkedTo: "Связана с:",
+ monitorOnly: "Только мониторинг",
+ alerts: "Оповещения",
+ scheduleOn: "Включение в {{time}}",
+ scheduleOff: "Выключение в {{time}}",
+ on: "Включена",
+ off: "Выключена",
+ power: "Мощность",
+ kwhToday: "кВт·ч сегодня",
+ settings: "Настройки",
+ automationSettings: "Настройки автоматизации",
+ showInSwitchbar: "Показывать на панели переключателей",
+ quickAccessSidebar: "Быстрый доступ с боковой панели",
+ enabled: "Включено",
+ enableAutomation: "Включить автоматизацию для этой розетки",
+ autoOn: "Автовключение",
+ autoOnDescription: "Включать при начале печати",
+ autoOff: "Автовыключение",
+ autoOffDescription: "Выключать после завершения печати (однократно)",
+ autoOffPersistent: "Оставлять включённым",
+ autoOffPersistentDescription: "Не сбрасывать автовыключение после печати",
+ autoOffAfterDrying: "Выключать после сушки",
+ autoOffAfterDryingDescription: "Выключать после завершения сушки в AMS",
+ delayAfterDryingMinutes: "Задержка после сушки (мин)",
+ turnOffDelayMode: "Условие отложенного выключения",
+ time: "Время",
+ temp: "Температура",
+ delayMinutes: "Задержка (мин)",
+ tempThreshold: "Порог температуры (°C)",
+ tempThresholdDescription: "Выключать, когда сопло остынет ниже этой температуры",
+ edit: "Изменить",
+ deleteConfirm: "Удалить «{{name}}»? Это действие нельзя отменить.",
+ turnOnConfirm: "Включить «{{name}}»?",
+ turnOffConfirm: "Выключить «{{name}}»? Питание подключённого устройства будет отключено.",
+ failedToTurn: "Не удалось {{action}} «{{name}}»",
+ unknown: "Неизвестно",
+ addTitle: "Добавление умной розетки",
+ editTitle: "Редактирование умной розетки",
+ stopScanning: "Остановить сканирование",
+ discoverTasmota: "Найти устройства Tasmota",
+ foundDevices: "Найдено устройств: {{count}}. Нажмите для выбора:",
+ noDevicesFound: "Устройства Tasmota в сети не найдены",
+ haNotConfigured: "Home Assistant не настроен. Настройте его в разделе",
+ haSettingsPath: "Настройки → Сеть → Home Assistant",
+ selectEntity: "Выберите сущность *",
+ ipAddress: "IP-адрес *",
+ nameLabel: "Название *",
+ username: "Имя пользователя",
+ password: "Пароль",
+ authHint: "Оставьте пустым, если устройство Tasmota не требует аутентификации",
+ linkToPrinter: "Связать с принтером",
+ noPrinter: "Без принтера — только ручное управление",
+ linkingDescription: "Связь позволяет автоматически включать и выключать питание при начале и завершении печати",
+ powerAlerts: "Оповещения о мощности",
+ alertAbove: "Оповещать выше (Вт)",
+ alertBelow: "Оповещать ниже (Вт)",
+ alertDescription: "Отправлять уведомление при пересечении заданных порогов мощности. Оставьте поле пустым, чтобы отключить соответствующий порог.",
+ dailySchedule: "Ежедневное расписание",
+ turnOnAt: "Включать в",
+ turnOffAt: "Выключать в",
+ scheduleDescription: "Ежедневно включать и выключать розетку в указанное время. Оставьте поле пустым, чтобы не выполнять соответствующее действие.",
+ showOnPrinterCard: "Показывать в карточке принтера",
+ displayOnPrinterCard: "Показывать кнопку в карточке принтера",
+ connectedResult: "Подключено!",
+ deviceLabel: "Устройство: {{name}} — ",
+ stateLabel: "Состояние: {{state}}",
+ test: "Проверить",
+ delete: "Удалить",
+ save: "Сохранить",
+ add: "Добавить",
+ cancel: "Отмена",
+ failedToStartScan: "Не удалось запустить сканирование",
+ nameRequired: "Укажите название",
+ entityRequired: "Для розеток Home Assistant необходимо выбрать сущность",
+ mqttTopicRequired: "Для мониторинга мощности, энергии или состояния необходимо настроить хотя бы одну тему MQTT",
+ loadingEntities: "Загрузка сущностей...",
+ loading: "Загрузка...",
+ failedToLoadEntities: "Не удалось загрузить сущности: {{error}}",
+ noEntitiesMatching: "Сущности по запросу «{{search}}» не найдены",
+ noEntitiesAvailable: "Нет доступных сущностей",
+ searchingEntities: "Поиск по всем сущностям, найдено: {{count}}",
+ showingEntities: "Показаны switch, light и input_boolean, доступно: {{count}}",
+ energyMonitoringOptional: "Мониторинг энергии (необязательно)",
+ energyMonitoringHint: "Найдите и выберите датчики мощности и энергии.",
+ powerSensorW: "Датчик мощности (Вт)",
+ energyTodayKwh: "Энергия за сегодня (кВт·ч)",
+ totalEnergyKwh: "Общая энергия (кВт·ч)",
+ noMatchingSensors: "Подходящие датчики не найдены",
+ none: "Нет",
+ mqttNotConfigured: "Брокер MQTT не настроен. Укажите его адрес в разделе",
+ mqttSettingsPath: "Настройки → Сеть → Публикация MQTT",
+ mqttNotConfiguredSuffix: "Включать публикацию не обязательно — достаточно заполнить параметры брокера.",
+ mqttMonitorOnlyDescription: "Розетки MQTT получают данные мощности и энергии через подписку MQTT. Управление включением и выключением недоступно — используйте брокер MQTT или систему домашней автоматизации.",
+ powerMonitoring: "Мониторинг мощности",
+ energyMonitoring: "Мониторинг энергии",
+ stateMonitoring: "Мониторинг состояния",
+ optional: "необязательно",
+ topic: "Тема",
+ jsonPath: "Путь JSON",
+ multiplier: "Множитель",
+ onValue: "Значение «включено»",
+ mqttPowerHint: "Путь JSON извлекает значение из полезной нагрузки JSON, например «power_l1». Оставьте пустым, если тема публикует число напрямую.\nДля преобразования мВт→Вт используйте 0.001, для кВт→Вт — 1000.",
+ mqttEnergyHint: "Путь JSON извлекает значение из полезной нагрузки JSON. Оставьте пустым для числового значения напрямую.\nДля преобразования Вт·ч→кВт·ч используйте 0.001, для МВт·ч→кВт·ч — 1000.",
+ mqttStateHint: "Путь JSON извлекает значение из полезной нагрузки JSON. Оставьте пустым для значения напрямую.\nЗначение «включено» — точная строка, означающая включённое состояние. Оставьте пустым для автоматического распознавания ON, true и 1.",
+ restControl: "Управление",
+ restOnUrl: "URL включения",
+ restOffUrl: "URL выключения",
+ restOnBody: "Тело запроса включения",
+ restOffBody: "Тело запроса выключения",
+ restMethod: "Метод HTTP",
+ restHeaders: "Пользовательские заголовки (JSON)",
+ restStatusUrl: "URL состояния",
+ restStatusPath: "Путь JSON состояния",
+ restStatusOnValue: "Значение «включено»",
+ restPowerUrl: "URL мощности",
+ restPowerPath: "Путь JSON мощности",
+ restPowerMultiplier: "Множитель мощности",
+ restEnergyUrl: "URL энергии",
+ restEnergyPath: "Путь JSON энергии",
+ restEnergyTotalPath: "Путь JSON полной энергии",
+ restEnergyTotalMultiplier: "Множитель полной энергии",
+ restEnergyTotalPathHint: "например, aenergy.total",
+ restEnergyTotalHint: "Многие розетки, включая все устройства Shelly, передают только накопительный счётчик энергии, который никогда не сбрасывается. Его следует указывать здесь, а не в поле выше: если считать его суточным расходом, значение не сбросится в полночь, а данные за вчера и общий расход останутся пустыми. Bambuddy вычисляет расход за сегодня и вчера по этому счётчику; для накопления данных потребуется один-два дня. Shelly передаёт ватт-часы, поэтому используйте множитель 0.001.",
+ restEnergyMultiplier: "Множитель энергии",
+ restUrlRequired: "Для REST-розетки необходимо указать хотя бы один URL: включения или выключения",
+ restHeadersHint: "например, {\"Authorization\": \"Bearer your-token\"}",
+ restBodyHint: "например, ON или {\"state\": \"on\"}",
+ restStatusHint: "URL для опроса текущего состояния",
+ restPathHint: "например, state или data.power.status",
+ restPowerUrlHint: "Отдельный URL данных мощности; если пусто, используется URL состояния",
+ restEnergyUrlHint: "Отдельный URL данных энергии; если пусто, используется URL состояния",
+ restEnergyHint: "Для каждого значения можно использовать отдельный URL либо URL состояния. Множители используются для преобразования единиц, например 0.001 для Вт·ч→кВт·ч.",
+ testConnection: "Проверить подключение",
+ connectionSuccess: "Подключение успешно",
+ noSwitchesInSwitchbar: "На панели переключателей нет устройств",
+ enableSwitchbarHint: "Включите «Показывать на панели переключателей» в разделе «Настройки → Умные розетки»",
+ },
+ notifications: {
+ providerTypes: {
+ callmebot: "CallMeBot/WhatsApp",
+ ntfy: "ntfy",
+ pushover: "Pushover",
+ telegram: "Telegram",
+ email: "Электронная почта",
+ discord: "Discord",
+ webhook: "Вебхук",
+ homeassistant: "Home Assistant",
+ },
+ providerDescriptions: {
+ email: "Уведомления по электронной почте через SMTP",
+ telegram: "Уведомления через Telegram-бота",
+ discord: "Отправка в канал Discord через вебхук",
+ ntfy: "Бесплатные push-уведомления с возможностью самостоятельного размещения сервера",
+ pushover: "Простые и надёжные push-уведомления",
+ callmebot: "Бесплатные уведомления WhatsApp через CallMeBot",
+ webhook: "Универсальный HTTP POST-запрос на любой URL",
+ homeassistant: "Постоянные уведомления на панели Home Assistant",
+ },
+ lastSuccess: "Последняя отправка: {{date}}",
+ error: "Ошибка",
+ printer: "Принтер:",
+ allPrinters: "Все принтеры",
+ sendTestNotification: "Отправить тестовое уведомление",
+ eventSettings: "Настройки событий",
+ enabled: "Включено",
+ sendFromProvider: "Отправлять уведомления через этого провайдера",
+ printEvents: "События печати",
+ printerStatus: "Состояние принтера",
+ amsAlarms: "Предупреждения AMS",
+ amsHtAlarms: "Предупреждения AMS-HT",
+ printQueue: "Очередь печати",
+ start: "Запуск",
+ plateCheck: "Проверка пластины",
+ complete: "Завершено",
+ failed: "Ошибка",
+ stopped: "Остановлено",
+ progress: "Ход печати",
+ offline: "Не в сети",
+ lowFilament: "Мало филамента",
+ maintenance: "Обслуживание",
+ amsHumidity: "Влажность AMS",
+ amsTemp: "Температура AMS",
+ amsHtHumidity: "Влажность AMS-HT",
+ amsHtTemp: "Температура AMS-HT",
+ bedCooled: "Стол остыл",
+ firstLayer: "Первый слой",
+ quiet: "Тихий режим",
+ digest: "Сводка в {{time}}",
+ printStarted: "Печать началась",
+ plateNotEmpty: "Пластина не пуста",
+ plateNotEmptyDescription: "Перед печатью на пластине обнаружены объекты",
+ printCompleted: "Печать завершена",
+ bedCooledLabel: "Стол остыл",
+ bedCooledDescription: "После печати температура стола опустилась ниже заданного порога",
+ firstLayerCompleteLabel: "Первый слой завершён",
+ firstLayerCompleteDescription: "Уведомить со снимком после завершения первого слоя",
+ missingSpoolAssignmentLabel: "Катушка не назначена",
+ missingSpoolAssignmentDescription: "Уведомить при запуске печати, если для необходимых слотов не назначены катушки",
+ printFailed: "Ошибка печати",
+ printStopped: "Печать остановлена",
+ progressMilestones: "Этапы выполнения",
+ progressMilestonesDescription: "Уведомлять при 25%, 50% и 75%",
+ printerOffline: "Принтер не в сети",
+ printerError: "Ошибка принтера",
+ aiFailureDetection: "Обнаружение сбоев с помощью ИИ",
+ aiFailureDetectionDescription: "Уведомить, если Obico AI обнаружит возможный сбой печати",
+ lowFilamentLabel: "Заканчивается филамент",
+ maintenanceDue: "Требуется обслуживание",
+ maintenanceDueDescription: "Уведомить, когда принтеру потребуется обслуживание",
+ amsHumidityHigh: "Высокая влажность в AMS",
+ amsHumidityHighDescription: "Влажность в обычной AMS превысила заданный порог",
+ amsTemperatureHigh: "Высокая температура в AMS",
+ amsTemperatureHighDescription: "Температура в обычной AMS превысила заданный порог",
+ amsHtHumidityHigh: "Высокая влажность в AMS-HT",
+ amsHtHumidityHighDescription: "Влажность в AMS-HT превысила заданный порог",
+ amsHtTemperatureHigh: "Высокая температура в AMS-HT",
+ amsHtTemperatureHighDescription: "Температура в AMS-HT превысила заданный порог",
+ inventoryAlerts: "Уведомления о запасах",
+ stockReorderAlert: "Пора заказывать",
+ stockReorderAlertDescription: "Запас по SKU достиг точки повторного заказа",
+ stockBreakAlert: "Риск исчерпания запаса",
+ stockBreakAlertDescription: "Запас закончится раньше, чем поступит пополнение",
+ jobAdded: "Задание добавлено",
+ jobAddedDescription: "Задание добавлено в очередь",
+ jobAssigned: "Задание назначено",
+ jobAssignedDescription: "Задание по модели назначено принтеру",
+ jobStarted: "Задание запущено",
+ jobStartedDescription: "Задание из очереди отправлено на печать",
+ jobWaiting: "Задание ожидает",
+ jobWaitingDescription: "Задание ожидает филамент или свободный принтер",
+ jobSkipped: "Задание пропущено",
+ jobSkippedDescription: "Задание пропущено из-за ошибки предыдущего",
+ jobFailed: "Не удалось запустить задание",
+ jobFailedDescription: "Задание не удалось отправить на печать",
+ queueComplete: "Очередь завершена",
+ queueCompleteDescription: "Все задания в очереди завершены",
+ quietHours: "Тихие часы",
+ noNotificationsDuring: "Не отправлять уведомления в это время",
+ editProviderToChangeQuietHours: "Измените провайдера, чтобы настроить тихие часы",
+ dailyDigest: "Ежедневная сводка",
+ batchNotifications: "Объединять уведомления в одну ежедневную сводку",
+ sendAt: "Отправлять в {{time}}",
+ editProviderToChangeDigestTime: "Измените провайдера, чтобы настроить время сводки",
+ edit: "Изменить",
+ deleteProvider: "Удалить провайдера уведомлений",
+ deleteConfirm: "Удалить «{{name}}»? Это действие нельзя отменить.",
+ delete: "Удалить",
+ addTitle: "Добавить провайдера уведомлений",
+ editTitle: "Изменить провайдера уведомлений",
+ nameLabel: "Название *",
+ namePlaceholder: "Мои уведомления",
+ providerTypeLabel: "Тип провайдера *",
+ configuration: "Настройка",
+ testConfiguration: "Проверить настройку",
+ printerFilter: "Фильтр принтеров",
+ onlyFromPrinter: "Отправлять уведомления только о событиях этого принтера",
+ quietHoursDnd: "Тихие часы (не беспокоить)",
+ quietStart: "Начало",
+ quietEnd: "Окончание",
+ dailyDigestLabel: "Ежедневная сводка",
+ sendDigestAt: "Отправлять сводку в",
+ digestCollected: "События будут собраны и отправлены одной сводкой в указанное время",
+ notificationEvents: "События для уведомлений",
+ progressPercent: "(25%, 50%, 75%)",
+ bedCooledAfterPrint: "(после завершения печати)",
+ eventPriority: {
+ sectionTitle: "Приоритет ntfy",
+ helpNtfy: "Выберите приоритет для каждого включённого события. ntfy использует его для усиления оповещений: звука, видимости и поведения push-уведомлений. Для неуказанных событий используется приоритет по умолчанию сервера ntfy.",
+ min: "Минимальный",
+ low: "Низкий",
+ default: "Обычный",
+ high: "Высокий",
+ urgent: "Срочный",
+ },
+ cancel: "Отмена",
+ save: "Сохранить",
+ add: "Добавить",
+ nameRequired: "Укажите название",
+ fieldRequired: "Поле «{{field}}» обязательно",
+ phoneNumber: "Номер телефона",
+ apiKey: "Ключ API",
+ serverUrl: "URL сервера",
+ topic: "Тема",
+ authToken: "Токен авторизации",
+ userKey: "Ключ пользователя",
+ appToken: "Токен приложения",
+ priority: "Приоритет",
+ pushoverRetry: "Повтор экстренного уведомления (с)",
+ pushoverExpire: "Срок действия экстренного уведомления (с)",
+ botToken: "Токен бота",
+ chatId: "ID чата",
+ smtpServer: "SMTP-сервер",
+ smtpPort: "Порт SMTP",
+ security: "Защита соединения",
+ authentication: "Аутентификация",
+ username: "Имя пользователя",
+ password: "Пароль",
+ fromEmail: "Адрес отправителя",
+ toEmail: "Адрес получателя",
+ webhookUrl: "URL вебхука",
+ payloadFormat: "Формат данных",
+ authorization: "Авторизация",
+ titleFieldName: "Имя поля заголовка",
+ messageFieldName: "Имя поля сообщения",
+ editTemplate: "Изменить шаблон: {{name}}",
+ titleLabel: "Заголовок",
+ bodyLabel: "Текст",
+ titlePlaceholder: "Заголовок уведомления...",
+ bodyPlaceholder: "Текст уведомления...",
+ availableVariables: "Доступные переменные",
+ clickToInsert: "Нажмите, чтобы вставить в позицию курсора в тексте",
+ livePreview: "Предварительный просмотр",
+ hide: "Скрыть",
+ show: "Показать",
+ loadingPreview: "Загрузка предварительного просмотра...",
+ enterTemplateContent: "Введите содержимое шаблона для предварительного просмотра",
+ titlePreview: "Заголовок:",
+ bodyPreview: "Текст:",
+ resetToDefault: "Восстановить стандартный шаблон",
+ titleRequired: "Укажите заголовок",
+ bodyRequired: "Введите текст уведомления",
+ notificationLog: "Журнал уведомлений",
+ showFailedOnly: "Только неудачные",
+ last24Hours: "Последние 24 часа",
+ last7Days: "Последние 7 дней",
+ last30Days: "Последние 30 дней",
+ last90Days: "Последние 90 дней",
+ justNow: "Только что",
+ noFailedNotifications: "Неудачных уведомлений нет",
+ noNotificationsLogged: "В журнале пока нет уведомлений",
+ unknownProvider: "Неизвестный провайдер",
+ logTitle: "Заголовок",
+ logMessage: "Сообщение",
+ logError: "Ошибка",
+ logProvider: "Провайдер: {{type}}",
+ logTime: "Время: {{time}}",
+ refresh: "Обновить",
+ clearOld: "Удалить старые",
+ statsSummary: "За последние {{days}} дней:",
+ statsNotifications: "уведомлений",
+ statsSent: "отправлено: {{count}}",
+ statsFailed: "ошибок: {{count}}",
+ eventTypes: {
+ print_start: "Печать началась",
+ print_complete: "Печать завершена",
+ print_failed: "Ошибка печати",
+ print_stopped: "Печать остановлена",
+ print_progress: "Ход печати",
+ printer_offline: "Принтер не в сети",
+ printer_error: "Ошибка принтера",
+ filament_low: "Заканчивается филамент",
+ maintenance_due: "Требуется обслуживание",
+ test: "Тест",
+ },
+ userEmail: {
+ title: "Уведомления",
+ emailNotifications: "Уведомления по электронной почте",
+ emailNotificationsDesc: "Получать письма о собственных заданиях печати. Для отправки используются системные параметры SMTP из раздела расширенной аутентификации.",
+ sendingTo: "Уведомления будут отправляться на адрес",
+ noEmailWarning: "Для вашей учётной записи не указан адрес электронной почты. Обратитесь к администратору.",
+ printJobNotifications: "Уведомления о заданиях печати",
+ printJobNotificationsDesc: "Выберите события, при которых будут отправляться письма о запущенных вами заданиях.",
+ printJobStarts: "Запуск задания печати",
+ printJobStartsDesc: "Уведомлять о начале вашего задания печати.",
+ printJobFinishes: "Завершение задания печати",
+ printJobFinishesDesc: "Уведомлять об успешном завершении вашего задания печати.",
+ printErrors: "Ошибки печати",
+ printErrorsDesc: "Уведомлять, если задание завершилось ошибкой или при печати возникла проблема.",
+ printJobStops: "Остановка задания печати",
+ printJobStopsDesc: "Уведомлять об отмене или остановке вашего задания печати.",
+ saveSuccess: "Настройки уведомлений сохранены.",
+ saveError: "Не удалось сохранить настройки уведомлений.",
+ },
+ },
+ richTextEditor: {
+ bold: "Полужирный",
+ italic: "Курсив",
+ underline: "Подчёркивание",
+ bulletList: "Маркированный список",
+ numberedList: "Нумерованный список",
+ alignLeft: "По левому краю",
+ alignCenter: "По центру",
+ alignRight: "По правому краю",
+ addLink: "Добавить ссылку",
+ removeLink: "Удалить ссылку",
+ },
+ externalLinks: {
+ title: "Ссылки на боковой панели",
+ sidebarLayout: "Боковая панель",
+ sidebarLayoutDescription: "Показывайте или скрывайте встроенные страницы, добавляйте внешние ссылки и перетаскивайте пункты, меняя порядок навигации.",
+ systemPages: "Страницы Bambuddy",
+ externalLinks: "Внешние ссылки",
+ visibleInSidebar: "Показывается на боковой панели",
+ hiddenFromSidebar: "Скрыто с боковой панели",
+ requiredInSidebar: "Обязательный пункт боковой панели",
+ hidePage: "Скрыть страницу",
+ showPage: "Показать страницу",
+ settingsCannotBeHidden: "Настройки нельзя скрыть",
+ noLinksConfigured: "Внешние ссылки не настроены",
+ deleteLink: "Удалить ссылку",
+ removeCustomIcon: "Удалить пользовательский значок",
+ openInNewTab: "Открывать в новой вкладке",
+ placeholders: {
+ linkName: "Моя ссылка",
+ },
+ },
+ keyboardShortcuts: {
+ title: "Горячие клавиши",
+ navigation: "Навигация",
+ archivesSection: "Архив",
+ kProfilesSection: "K-профили",
+ generalSection: "Общие",
+ shortcuts: {
+ goToPrinters: "Перейти к принтерам",
+ goToArchives: "Перейти в архив",
+ goToQueue: "Перейти к очереди",
+ goToStats: "Перейти к статистике",
+ goToProfiles: "Перейти к облачным профилям",
+ goToSettings: "Перейти к настройкам",
+ focusSearch: "Перейти в строку поиска",
+ openUploadModal: "Открыть окно загрузки",
+ clearSelection: "Снять выделение / убрать фокус с поля",
+ contextMenu: "Контекстное меню карточки",
+ refreshProfiles: "Обновить профили",
+ newProfile: "Новый профиль",
+ exitSelectionMode: "Выйти из режима выделения",
+ showHelp: "Показать эту справку",
+ },
+ footer: "Нажмите Esc или щёлкните снаружи, чтобы закрыть",
+ },
+ notificationLog: {
+ title: "Журнал уведомлений",
+ events: {
+ printStarted: "Печать началась",
+ printComplete: "Печать завершена",
+ printFailed: "Ошибка печати",
+ printStopped: "Печать остановлена",
+ progress: "Ход выполнения",
+ printerOffline: "Принтер не в сети",
+ printerError: "Ошибка принтера",
+ lowFilament: "Заканчивается филамент",
+ maintenanceDue: "Требуется обслуживание",
+ test: "Тест",
+ },
+ timeAgo: {
+ justNow: "Только что",
+ minutesAgo: "{{minutes}} мин назад",
+ hoursAgo: "{{hours}} ч назад",
+ },
+ },
+ restoreBackup: {
+ title: "Восстановление резервной копии",
+ restoring: "Восстановление...",
+ restoreComplete: "Восстановление завершено",
+ restoreFailed: "Ошибка восстановления",
+ importSettings: "Импортировать настройки из файла резервной копии",
+ pleaseWait: "Подождите, пока данные восстанавливаются",
+ clickToSelect: "Нажмите, чтобы выбрать файл резервной копии (.json или .zip)",
+ howDuplicateHandling: "Как обрабатываются совпадения:",
+ categories: {
+ printers: "Принтеры",
+ smartPlugs: "Умные розетки",
+ notificationProviders: "Провайдеры уведомлений",
+ filaments: "Филаменты",
+ archives: "Архив",
+ pendingUploads: "Ожидающие загрузки",
+ settingsTemplates: "Настройки и шаблоны",
+ },
+ matchingInfo: {
+ printers: "сопоставляются по серийному номеру",
+ smartPlugs: "сопоставляются по IP-адресу",
+ notificationProviders: "сопоставляются по названию",
+ filaments: "сопоставляются по названию, типу и бренду",
+ archives: "сопоставляются по хешу содержимого",
+ pendingUploads: "сопоставляются по имени файла",
+ settingsTemplates: "всегда перезаписываются",
+ },
+ replaceExisting: "Заменить существующие данные",
+ keepExisting: "Сохранить существующие данные",
+ replaceDescription: "Перезаписать уже существующие элементы данными из резервной копии",
+ keepDescription: "Восстановить только отсутствующие элементы",
+ caution: "Внимание:",
+ cautionText: "При перезаписи текущая конфигурация будет заменена данными из резервной копии. В целях безопасности коды доступа к принтерам никогда не перезаписываются.",
+ itemsRestored: "Восстановлено элементов",
+ itemsSkipped: "Пропущено элементов",
+ restored: "Восстановлено",
+ skipped: "Пропущено (уже существует)",
+ filesLabel: "Файлы (3MF, миниатюры и т. п.)",
+ newApiKeysGenerated: "Созданы новые ключи API",
+ newApiKeysWarning: "Эти ключи показываются только один раз. Скопируйте их сейчас!",
+ processingBackup: "Обработка резервной копии...",
+ noDataFound: "В резервной копии не найдено данных для восстановления.",
+ failedToRestore: "Не удалось восстановить резервную копию. Проверьте формат файла.",
+ },
+ backupExport: {
+ title: "Экспорт резервной копии",
+ selectData: "Выберите данные для включения",
+ selectAll: "Выбрать всё",
+ selectNone: "Снять выделение",
+ categoryDescriptions: {
+ settings: "Язык, тема и настройки обновлений",
+ notifications: "ntfy, Pushover, Discord и другие",
+ templates: "Пользовательские шаблоны сообщений",
+ smartPlugs: "Конфигурация розеток Tasmota",
+ externalLinks: "Ссылки на внешние сервисы в боковой панели",
+ printers: "Сведения о принтерах (без кодов доступа)",
+ plateDetection: "Эталонные изображения пустых пластин",
+ filaments: "Типы и стоимость филамента",
+ maintenance: "Пользовательские графики обслуживания",
+ archives: "Все данные печати и файлы (3MF, миниатюры, фотографии)",
+ projects: "Проекты, позиции спецификаций и вложения",
+ pendingUploads: "Загрузки виртуальных принтеров, ожидающие проверки",
+ apiKeys: "Ключи API вебхуков (при импорте создаются новые)",
+ },
+ requiresPrinters: "Необходимо выбрать раздел «Принтеры»",
+ zipFileWarning: "Будет создан ZIP-файл.",
+ zipFileDescription: "В него войдут все файлы 3MF, миниатюры, таймлапсы и фотографии. Операция может занять некоторое время, а файл — получиться большим.",
+ includeAccessCodes: "Включить коды доступа",
+ includeAccessCodesDescription: "Для переноса на другой компьютер",
+ includeAccessCodesWarning: "Коды доступа попадут в файл открытым текстом. Храните резервную копию в безопасном месте!",
+ categoriesSelected: "Выбрано категорий: {{selectedCount}}",
+ },
+ pendingUploads: {
+ placeholders: {
+ notes: "Добавьте примечания об этой печати...",
+ },
+ discardUpload: "Отклонить загрузку",
+ archiveAllUploads: "Добавить все загрузки в архив",
+ discardAllUploads: "Отклонить все загрузки",
+ archive: "В архив",
+ timeAgo: {
+ justNow: "Только что",
+ minutesAgo: "{{minutes}} мин назад",
+ hoursAgo: "{{hours}} ч назад",
+ daysAgo: "{{days}} дн. назад",
+ },
+ },
+ apiBrowser: {
+ placeholders: {
+ requestBody: "Тело запроса JSON...",
+ searchEndpoints: "Поиск конечных точек...",
+ },
+ },
+ configureAmsSlot: {
+ title: "Настройка слота AMS",
+ slotConfigured: "Слот настроен!",
+ configuringSlot: "Настраивается слот:",
+ slotLabel: "{{ams}}, слот {{slot}}",
+ searchPresets: "Поиск профилей...",
+ colorPlaceholder: "Название или HEX-код цвета (например: brown, FF8800)",
+ clearCustomColor: "Очистить пользовательский цвет",
+ noCloudPresets: "Облачных профилей нет. Войдите в Bambu Cloud для синхронизации.",
+ noPresetsAvailable: "Нет доступных профилей. Войдите в Bambu Cloud или импортируйте локальные профили.",
+ noMatchingPresets: "Подходящие профили не найдены.",
+ custom: "Пользовательский",
+ builtin: "Встроенный",
+ orcaCloud: "Orca Cloud",
+ bambuCloud: "Bambu Cloud",
+ settingsSentToPrinter: "Настройки отправлены на принтер",
+ filamentProfile: "Профиль филамента",
+ kProfileLabel: "K-профиль (Pressure Advance)",
+ filteringFor: "Фильтр по материалу: {{material}}",
+ noKProfile: "Без K-профиля (стандартное значение 0,020)",
+ noMatchingKProfiles: "Подходящие K-профили не найдены. Будет использовано стандартное значение K=0,020.",
+ selectFilamentFirst: "Сначала выберите профиль филамента",
+ kFromCalibration: "K={{value}} из калибровки принтера",
+ customColorLabel: "Пользовательский цвет (необязательно)",
+ presetColors: "Цвета {{name}}:",
+ showLessColors: "Показать меньше цветов",
+ showMoreColors: "Показать больше цветов",
+ clear: "Очистить",
+ hexLabel: "HEX: #{{hex}}",
+ resetting: "Сброс...",
+ resetSlot: "Сбросить слот",
+ cancel: "Отмена",
+ configuring: "Настройка...",
+ configureSlot: "Настроить слот",
+ },
+ githubBackup: {
+ title: "Резервное копирование в Git",
+ history: "История",
+ downloadBackup: "Скачать резервную копию",
+ restoreBackup: "Восстановить резервную копию",
+ noBackupsYet: "Резервных копий пока нет",
+ },
+ emailSettings: {
+ placeholders: {
+ fromName: "BamBuddy",
+ },
+ },
+ tagManagement: {
+ searchTags: "Поиск меток...",
+ renameTag: "Переименовать метку",
+ deleteTag: "Удалить метку",
+ },
+ notificationTemplates: {
+ placeholders: {
+ title: "Заголовок уведомления...",
+ body: "Текст уведомления...",
+ },
+ },
+ batchTag: {
+ placeholders: {
+ newTag: "Введите новую метку...",
+ },
+ },
+ photoGallery: {
+ deletePhoto: "Удалить фотографию",
+ },
+ filamentHoverCard: {
+ copySpoolUuid: "Скопировать UUID катушки",
+ },
+ kProfilesView: {
+ hasNote: "Есть примечание",
+ copyProfile: "Копировать профиль",
+ },
+ layout: {
+ openMenu: "Открыть меню",
+ noPermissionSystemInfo: "У вас нет разрешения на просмотр системной информации",
+ },
+ dashboard: {
+ dragToReorder: "Перетащите, чтобы изменить порядок",
+ hideWidget: "Скрыть виджет",
+ },
+ notificationProviderCard: {
+ deleteNotificationProvider: "Удалить провайдера уведомлений",
+ },
+ fileManagerModal: {
+ closeFileManager: "Закрыть файловый менеджер",
+ sortFiles: "Сортировать файлы",
+ goToParentFolder: "Перейти в родительскую папку",
+ threeView: "Просмотр 3D",
+ },
+ embeddedCameraViewer: {
+ refreshStream: "Обновить поток",
+ close: "Закрыть",
+ zoomOut: "Уменьшить",
+ resetZoom: "Сбросить масштаб",
+ zoomIn: "Увеличить",
+ dragToResize: "Перетащите, чтобы изменить размер",
+ },
+ timelapseViewer: {
+ skipBack5s: "Назад на 5 с",
+ skipForward5s: "Вперёд на 5 с",
+ },
+ notificationProviders: {
+ descriptions: {
+ email: "Уведомления по электронной почте через SMTP",
+ telegram: "Уведомления через Telegram-бота",
+ discord: "Отправка в канал Discord через вебхук",
+ ntfy: "Бесплатные push-уведомления с возможностью самостоятельного размещения сервера",
+ pushover: "Простые и надёжные push-уведомления",
+ callmebot: "Бесплатные уведомления WhatsApp через CallMeBot",
+ webhook: "Обычный HTTP POST на любой URL",
+ },
+ },
+ logViewer: {
+ searchPlaceholder: "Поиск по сообщению или имени логгера...",
+ noLogEntries: "Записи журнала не найдены",
+ },
+ switchbarPopover: {
+ noSwitchesInSwitchbar: "На панели переключателей нет устройств",
+ },
+ projectPageModal: {
+ placeholders: {
+ title: "Название",
+ designer: "Автор",
+ license: "Лицензия",
+ description: "Введите описание...",
+ profileTitle: "Название профиля",
+ profileDescription: "Описание профиля...",
+ },
+ },
+ spoolmanSettings: {
+ },
+ time: {
+ unknown: "—",
+ waiting: "Ожидание",
+ justNow: "Только что",
+ now: "Сейчас",
+ minsAgo: "{{count}} мин назад",
+ inMins: "через {{count}} мин",
+ hoursAgo: "{{count}} ч назад",
+ inHours: "через {{count}} ч",
+ daysAgo: "{{count}} дн. назад",
+ inDays: "через {{count}} дн.",
+ },
+ spoolbuddy: {
+ nav: {
+ dashboard: "Панель",
+ ams: "AMS",
+ inventory: "Катушки",
+ writeTag: "Запись метки",
+ settings: "Настройки",
+ },
+ status: {
+ nfcReady: "NFC готов",
+ nfcOff: "NFC выключен",
+ offline: "Не в сети",
+ online: "В сети",
+ noPrinters: "Нет принтеров",
+ deviceOffline: "Устройство не в сети",
+ waitingConnection: "Ожидание подключения устройства...",
+ systemReady: "Система готова",
+ status: "Состояние",
+ },
+ dashboard: {
+ readyToScan: "Готово к сканированию",
+ idleMessage: "Поставьте катушку на весы для идентификации",
+ nfcHint: "Метка NFC будет считана автоматически",
+ device: "Устройство",
+ syncWeight: "Синхронизировать массу",
+ weightSynced: "Синхронизировано!",
+ unknownTag: "Неизвестная метка",
+ newTag: "Обнаружена новая метка",
+ onScale: "на весах",
+ linkSpool: "Связать с катушкой",
+ linkTagTitle: "Связать метку с катушкой",
+ linkTag: "Связать метку",
+ selectSpool: "Выберите катушку, с которой нужно связать эту метку:",
+ noUntagged: "Катушки без меток не найдены",
+ tagDetected: "Метка обнаружена",
+ noTag: "Метка отсутствует",
+ tagId: "Метка",
+ grossWeight: "Масса брутто",
+ spoolSize: "Размер катушки",
+ close: "Закрыть",
+ currentSpool: "Текущая катушка",
+ plateReady: "Пластина готова: {{name}}",
+ plateReadyLabel: "Пластины, готовые к очистке",
+ plateClearAction: "Очищено",
+ plateClearedToast: "Пластина отмечена как очищенная",
+ plateClearFailed: "Не удалось отметить пластину как очищенную",
+ },
+ modal: {
+ spoolDetected: "Катушка обнаружена",
+ assignToAms: "Назначить в AMS",
+ syncWeight: "Синхронизировать массу",
+ weightSynced: "Синхронизировано!",
+ syncing: "Синхронизация...",
+ newTagDetected: "Обнаружена новая метка",
+ addToInventory: "Добавить в учёт",
+ assignToAmsTitle: "Назначить в AMS",
+ selectSlot: "Выберите слот",
+ assign: "Назначить",
+ assigning: "Назначение...",
+ assignSuccess: "Назначено!",
+ assignPendingInsert: "Назначено. Слот будет настроен после установки катушки.",
+ assignError: "Не удалось назначить катушку. Повторите попытку.",
+ noPrinterSelected: "Выберите принтер...",
+ noAmsDetected: "На этом принтере AMS не обнаружена",
+ slot: "Слот",
+ },
+ weight: {
+ noReading: "Нет показаний",
+ stable: "Стабильно",
+ measuring: "Измерение...",
+ tare: "Тарировать",
+ calibrate: "Калибровать",
+ },
+ spool: {
+ remaining: "Остаток",
+ material: "Материал",
+ brand: "Бренд",
+ color: "Цвет",
+ coreWeight: "Сердечник",
+ labelWeight: "По этикетке",
+ scaleWeight: "По весам",
+ netWeight: "Нетто",
+ lastUsed: "Последнее использование",
+ },
+ ams: {
+ noData: "AMS не обнаружена",
+ connectAms: "Подключите AMS, чтобы увидеть слоты филамента",
+ noPrinter: "Принтер не выбран",
+ selectPrinter: "Выберите принтер на верхней панели",
+ printerDisconnected: "Принтер отключён",
+ humidity: "Влажность",
+ level: "Уровень",
+ active: "Активен",
+ slot: "Слот",
+ empty: "Пусто",
+ },
+ inventory: {
+ search: "Поиск катушек...",
+ empty: "В учёте нет катушек",
+ noResults: "Подходящие катушки не найдены",
+ spools: "катушек",
+ addSpool: "Добавить катушку",
+ },
+ settings: {
+ tabDevice: "Устройство",
+ tabDisplay: "Экран",
+ tabScale: "Весы",
+ tabUpdates: "Обновления",
+ nfcReader: "Считыватель NFC",
+ type: "Тип",
+ connection: "Подключение",
+ notConnected: "Н/Д",
+ deviceInfo: "Сведения об устройстве",
+ hostname: "Хост",
+ uptime: "Время работы",
+ systemConfig: "Бэкенд и авторизация",
+ backendUrl: "URL бэкенда Bambuddy",
+ apiToken: "Токен API",
+ apiTokenPlaceholder: "Введите токен API",
+ saveConfig: "Сохранить конфигурацию",
+ systemQueued: "Конфигурация поставлена в очередь.",
+ nfcDiagnostic: "Диагностика NFC",
+ scaleDiagnostic: "Диагностика весов",
+ readTagDiagnostic: "Диагностика чтения метки",
+ testNfc: "Проверить считыватель",
+ testScale: "Проверить точность",
+ testReadTag: "Считать метку",
+ systemFieldsRequired: "Необходимо указать URL бэкенда.",
+ brightness: "Яркость",
+ saved: "Сохранено",
+ noBacklight: "Подсветка DSI не обнаружена. Для управления яркостью требуется дисплей DSI.",
+ screenBlank: "Тайм-аут отключения экрана",
+ screenBlankDesc: "Экран выключается при бездействии. Коснитесь его для пробуждения.",
+ displayNote: "Яркость регулируется программным фильтром.",
+ scaleCalibration: "Калибровка весов",
+ currentWeight: "Текущая масса",
+ tareOffset: "Тара",
+ calFactor: "Коэффициент",
+ knownWeight: "Эталонная масса",
+ calStep1: "Уберите всё с весов и нажмите «Установить ноль».",
+ calStep2: "Положите на весы груз известной массы.",
+ setZero: "Установить ноль",
+ calibrateNow: "Калибровать",
+ calibrated: "Откалибровано",
+ tareSet: "Команда тарирования отправлена. Ожидание устройства...",
+ tareComplete: "Тарирование завершено!",
+ tareTimedOut: "Истекло время ожидания тарирования — демон SpoolBuddy запущен?",
+ tareFailed: "Не удалось отправить команду тарирования",
+ zeroSet: "Нулевая точка установлена. Положите на весы груз известной массы.",
+ calibrationDone: "Калибровка завершена!",
+ calibrationFailed: "Ошибка калибровки",
+ lastCalibrated: "Последняя калибровка",
+ stable: "Стабильно",
+ settling: "Стабилизация...",
+ firmware: "Прошивка",
+ scale: "Весы",
+ noDevice: "Устройство SpoolBuddy не найдено",
+ daemonVersion: "Версия демона",
+ currentVersion: "Текущая",
+ versionPending: "Ожидание демона...",
+ checking: "Проверка...",
+ checkUpdates: "Проверить обновления",
+ updateAvailable: "Доступно обновление",
+ updateInstructions: "Обновление по SSH: запустите установочный скрипт SpoolBuddy.",
+ upToDate: "Установлена актуальная версия",
+ includeBeta: "Включать бета-версии",
+ },
+ writeTag: {
+ tabExisting: "Существующая катушка",
+ tabNew: "Новая катушка",
+ tabReplace: "Заменить метку",
+ searchPlaceholder: "Поиск по материалу, цвету или бренду...",
+ noUntaggedSpools: "Нет катушек без меток",
+ noTaggedSpools: "Нет катушек с метками",
+ selectSpool: "Выберите катушку, затем положите чистую метку NTAG на считыватель",
+ placeTag: "Положите метку NTAG на считыватель",
+ tagReady: "Метка обнаружена — можно записывать",
+ writeTag: "Записать метку",
+ replaceTag: "Заменить метку",
+ writing: "Запись метки...",
+ waiting: "Ожидание SpoolBuddy...",
+ writeSuccess: "Метка успешно записана!",
+ writeFailed: "Ошибка записи",
+ queueFailed: "Не удалось поставить команду записи в очередь",
+ tryAgain: "Повторить",
+ cancel: "Отмена",
+ replaceWarning: "Старая метка будет отвязана и заменена новой.",
+ deviceOffline: "SpoolBuddy не в сети",
+ material: "Материал",
+ colorName: "Название цвета",
+ color: "Цвет",
+ brand: "Бренд",
+ weight: "Масса (г)",
+ createSpool: "Создать катушку",
+ creating: "Создание...",
+ spoolCreated: "Катушка создана! Можно записывать метку.",
+ createFailed: "Не удалось создать катушку",
+ incompleteDataWarning: "Метка записана с неполными данными Spoolman",
+ },
+ quickMenu: {
+ printerPower: "Питание принтера",
+ systemControls: "Система",
+ restartDaemon: "Перезапустить демон",
+ restartBrowser: "Перезапустить браузер",
+ reboot: "Перезагрузить",
+ shutdown: "Выключить",
+ swipeToClose: "Проведите вниз, чтобы закрыть",
+ confirmTitle: "Подтверждение",
+ confirmShutdown: "Выключить SpoolBuddy? Для повторного включения потребуется физический доступ.",
+ confirmReboot: "Перезагрузить SpoolBuddy?",
+ confirmRestartDaemon: "Перезапустить демон SpoolBuddy? NFC и весы временно будут недоступны.",
+ confirmRestartBrowser: "Перезапустить браузер киоска? Экран ненадолго погаснет.",
+ confirm: "Подтвердить",
+ confirmPlugOn: "Включить {{name}}?",
+ confirmPlugOff: "Выключить {{name}}?",
+ turnOn: "Включить",
+ turnOff: "Выключить",
+ },
+ },
+ diagnostic: {
+ modalTitle: "Диагностика подключения — {{name}}",
+ running: "Выполняется диагностика...",
+ runningElapsed: "Выполняется диагностика... ({{elapsed}} с)",
+ waitingForReportHint: "Ожидание публикации отчёта о состоянии принтера — это может занять до {{max}} секунд.",
+ runFailed: "Не удалось выполнить диагностику: {{error}}",
+ retry: "Запустить снова",
+ runButton: "Запустить диагностику",
+ sectionTitle: "Диагностика подключения",
+ sectionDescription: "Проверьте, почему принтер не подключается или не печатает: доступность портов, режим разработчика LAN, сетевой режим Docker и учётные данные.",
+ noPrinters: "Принтеры не настроены.",
+ overall: {
+ ok: "Проблем не обнаружено — подключение к принтеру исправно.",
+ warnings: "Принтер должен работать, но некоторые пункты требуют внимания.",
+ problems: "Обнаружены проблемы, объясняющие, почему принтер не подключается или не печатает.",
+ },
+ check: {
+ port_mqtt: {
+ title: "Порт управления (MQTT 8883)",
+ pass: "Доступен — принтер принимает управляющие подключения.",
+ fail: "Порт 8883 недоступен. Принтер выключен, имеет другой IP-адрес либо подключение блокирует межсетевой экран. Проверьте IP-адрес принтера и доступность порта 8883.",
+ },
+ port_ftps: {
+ title: "Порт передачи файлов (FTPS 990)",
+ pass: "Доступен — отправка файлов печати будет работать.",
+ warn: "Порт 990 недоступен. Мониторинг может работать, но отправка заданий на принтер завершится ошибкой. Убедитесь, что порт 990 не заблокирован.",
+ },
+ external_storage: {
+ title: "Сохранять отправленные файлы во внешнем хранилище (шаг 4 установки)",
+ pass: "Принтер сообщает, что параметр включён: отправленные файлы будут сохраняться на SD-карте, а в архиве появятся миниатюры и метаданные слайсера.",
+ fail: "Принтер сообщает, что параметр выключен. Включите «Сохранять отправленные файлы во внешнем хранилище»: в новых прошивках (P2S 01.02 / Bambu Studio 2.6+) переключатель находится в настройках печати принтера, в старых — на вкладке «Устройство» Bambu Studio / OrcaSlicer. Без этого у всех архивных заданий не будет миниатюр и метаданных слайсера.",
+ skip: "Не проверено — требуется активное подключение MQTT. В старых версиях слайсеров этот параметр существует только в слайсере и принтер его не сообщает, поэтому проверка может пройти даже при выключенном параметре. Проверьте шаг 4 установки вручную.",
+ skip_unsupported_model: "В этой модели есть слот SD-карты, но включить соответствующую функцию невозможно: текущая прошивка серии P1 не предоставляет переключатель в Bambu Studio, а у принтера нет экрана. Исправлять здесь нечего. Пока Bambu Lab не добавит поддержку в прошивку, архивные задания могут сохраняться без миниатюр и метаданных слайсера.",
+ },
+ port_rtsps: {
+ title: "Порт камеры ({{protocol}} {{port}})",
+ pass: "Доступен — видеопоток камеры будет работать.",
+ warn: "Порт {{port}} недоступен. Просмотр камеры в реальном времени работать не будет. На печать это не влияет.",
+ },
+ network_mode: {
+ title: "Сетевой режим Docker",
+ pass: "Используется сетевой режим host.",
+ warn: "Bambuddy запущен в Docker с сетью bridge. Для обнаружения принтеров и виртуального принтера требуется режим host — пересоздайте контейнер с параметром «network_mode: host».",
+ skip: "Bambuddy запущен не в Docker — проверка неприменима.",
+ },
+ subnet: {
+ title: "Подсеть",
+ pass: "Принтер и Bambuddy находятся в одной подсети.",
+ warn: "Принтер ({{printer_ip}}) и Bambuddy ({{host_ip}}) находятся в разных подсетях. Без настроенной маршрутизации между подсетями они могут быть недоступны друг для друга.",
+ skip: "Не удалось определить подсеть — проверка пропущена.",
+ },
+ mqtt_auth: {
+ title: "Учётные данные принтера",
+ pass: "Принтер принял подключение.",
+ fail: "Принтер доступен, но отклонил подключение. Скорее всего, неверны код доступа или серийный номер. Код доступа изменяется при каждом переключении режима разработчика — снова скопируйте его с экрана принтера.",
+ skip: "Не проверено — принтер недоступен.",
+ },
+ developer_mode: {
+ title: "Режим разработчика LAN",
+ pass: "Режим разработчика включён.",
+ fail: "Режим разработчика на принтере ВЫКЛЮЧЕН. Включите его в настройках LAN принтера и подтвердите кнопкой OK. Без него задания печати не запускаются.",
+ skip: "Не удалось проверить — требуется активное подключение к принтеру.",
+ },
+ printer_publishing: {
+ title: "Принтер публикует состояние",
+ pass: "Принтер публикует обновления состояния — AMS, филаменты и K-профили будут корректно передаваться в слайсер.",
+ fail: "MQTT-брокер принял подключение, но принтер не опубликовал ни одного отчёта о состоянии. Почти всегда причина в неверном регистре или ошибке в серийном номере: тема device//report чувствительна к регистру. Сверьте серийный номер в настройках принтера с номером на его экране.",
+ skip: "Не удалось проверить — требуется активное подключение к принтеру.",
+ },
+ },
+ },
+ systemHealth: {
+ sectionTitle: "Состояние системы",
+ sectionDescription: "Проверяет последние журналы на известные проблемы, которые обычно можно исправить самостоятельно до обращения в поддержку.",
+ rescan: "Проверить снова",
+ clean: "В последних {{times}} записях журнала известные проблемы не найдены.",
+ logUnavailable: "Запись журналов в файл отключена, поэтому выполнить проверку невозможно. Включите файловое журналирование.",
+ learnMore: "Как исправить",
+ fixLabel: "Исправление:",
+ occurrences: "Обнаружено {{times}} раз; последний раз — {{lastSeen}}",
+ category: {
+ layer8: "Можно исправить самостоятельно",
+ environment: "Окружение",
+ bug: "Сообщите об ошибке",
+ },
+ signature: {
+ "ftp-auth-rejected": {
+ name: "Принтер отклонил код доступа",
+ cause: "Принтер отклонил вход в службу передачи файлов. Код доступа неверен либо изменился после переключения режима разработчика.",
+ fix: "Снова скопируйте код доступа с экрана принтера в настройках LAN и обновите его в настройках принтера Bambuddy.",
+ },
+ "ftp-connection-timeout": {
+ name: "Истекло время подключения к службе передачи файлов",
+ cause: "Bambuddy не смог подключиться к порту передачи файлов принтера (FTPS 990). Порт заблокирован, принтер выключен либо находится в другой подсети.",
+ fix: "Убедитесь, что порт 990 между Bambuddy и принтером не блокируется и оба устройства находятся в доступных друг другу сетях.",
+ },
+ "ftp-ssl-error": {
+ name: "Ошибка защищённого соединения с файловой службой",
+ cause: "Не удалось выполнить TLS-рукопожатие с сервером передачи файлов принтера. Частые причины — межсетевой экран или устаревшая прошивка принтера.",
+ fix: "Обновите прошивку принтера и убедитесь, что межсетевой экран или прокси не перехватывает соединение на порту 990.",
+ },
+ "mqtt-connection-flapping": {
+ name: "Подключение к принтеру постоянно обрывается",
+ cause: "Управляющее соединение MQTT 8883 постоянно разрывается и восстанавливается. Обычно причина в нестабильной сети или частично заблокированном порте.",
+ fix: "Проверьте уровень Wi‑Fi у принтера, по возможности используйте проводное подключение и убедитесь в стабильной доступности порта 8883.",
+ },
+ "camera-connection-refused": {
+ name: "Видеопоток камеры недоступен",
+ cause: "Камера недоступна по порту RTSPS 322. Порт заблокирован либо на принтере выключены камера или просмотр по LAN.",
+ fix: "Включите камеру и просмотр по LAN на принтере и убедитесь, что порт 322 не заблокирован. На печать это не влияет.",
+ },
+ "database-locked": {
+ name: "Конфликт записи в базу данных",
+ cause: "Под нагрузкой SQLite выдаёт ошибки «database is locked». Это часто происходит при одновременной работе с несколькими принтерами.",
+ fix: "Переведите Bambuddy на внешнюю базу PostgreSQL. См. руководство по PostgreSQL в документации.",
+ },
+ },
+ },
+ vpDiagnostic: {
+ title: "Проверка настройки — {{name}}",
+ runButton: "Запустить проверку",
+ running: "Выполняется проверка настройки...",
+ runFailed: "Не удалось выполнить проверку: {{error}}",
+ retry: "Запустить снова",
+ overall: {
+ ok: "Все проверки пройдены — виртуальный принтер настроен правильно.",
+ warnings: "Виртуальный принтер должен работать, но некоторые пункты требуют внимания.",
+ problems: "Обнаружены проблемы, из-за которых слайсер не видит или не может использовать виртуальный принтер.",
+ },
+ check: {
+ enabled: {
+ title: "Виртуальный принтер включён",
+ fail: "Виртуальный принтер выключен. Включите его, чтобы он обнаруживался в сети.",
+ },
+ running: {
+ title: "Службы запущены",
+ fail: "Виртуальный принтер включён, но его службы не работают. Проверьте журнал Bambuddy: обычно запуску мешает конфликт IP-адреса привязки или ошибка прав доступа.",
+ },
+ bind_interface: {
+ title: "Сетевой интерфейс привязки",
+ fail: "Интерфейс привязки не задан или больше не существует на этом хосте. Выберите актуальный интерфейс в списке «Интерфейс привязки».",
+ },
+ access_code: {
+ title: "Код доступа задан",
+ fail: "Код доступа не задан. В слайсере необходимо указать тот же восьмизначный код, который задан здесь.",
+ },
+ target_printer: {
+ title: "Целевой принтер",
+ fail: "Целевой принтер не выбран. Для режима прокси необходимо указать реальный принтер.",
+ warn: "Целевой принтер сейчас не в сети. Перенаправление возобновится после его подключения.",
+ },
+ port_ftps: {
+ title: "Служба загрузки файлов (порт {{port}})",
+ fail: "На порту {{port}} выбранного IP-адреса никто не слушает, поэтому слайсер не сможет загружать файлы. Обычно причина в конфликте порта на этом интерфейсе.",
+ },
+ port_mqtt: {
+ title: "Служба управления (порт {{port}})",
+ fail: "На порту {{port}} выбранного IP-адреса никто не слушает, поэтому слайсер не сможет подключиться и отображать состояние.",
+ },
+ port_bind: {
+ title: "Служба обнаружения (порт {{port}})",
+ fail: "На порту {{port}} выбранного IP-адреса никто не слушает, поэтому сетевое обнаружение слайсером не работает.",
+ },
+ certificate: {
+ title: "Сертификат TLS",
+ pass: "Сертификат готов. Убедитесь, что сертификат центра сертификации Bambuddy, указанный выше, импортирован в доверенное хранилище слайсера.",
+ fail: "Сертификат TLS для этого виртуального принтера отсутствует. Проверьте права записи в каталог данных Bambuddy.",
+ },
+ },
+ },
+ bugReport: {
+ title: "Сообщить об ошибке",
+ description: "Описание",
+ descriptionPlaceholder: "Что пошло не так? Опишите проблему...",
+ email: "Электронная почта (необязательно)",
+ emailPlaceholder: "your@email.com",
+ emailPrivacy: "Указанный адрес будет добавлен в сворачиваемый раздел задачи GitHub, чтобы сопровождающий мог с вами связаться.",
+ screenshot: "Снимок экрана",
+ uploadOrPaste: "Загрузите, вставьте или перетащите изображение",
+ dataCollectedSummary: "Какие данные включаются в отчёт?",
+ dataIncluded: "Включаются:",
+ dataIncludedList: "Версия приложения, ОС, архитектура, версия Python, статистика базы данных (только количества), модели принтеров, количество сопел, версии прошивок, состояние подключений, состояние интеграций (Spoolman, MQTT, HA), неконфиденциальные настройки, количество сетевых интерфейсов, сведения о Docker и версии зависимостей.",
+ dataNeverIncluded: "Никогда не включаются:",
+ dataNeverIncludedList: "Имена принтеров, серийные номера, коды доступа, пароли, IP-адреса, адреса электронной почты, ключи API, токены, URL вебхуков, имена хостов и пользователей.",
+ submit: "Отправить",
+ startLogging: "Начать отладочную запись",
+ stepEnableLogging: "Отладочная запись включена",
+ stepReproduce: "Теперь воспроизведите проблему",
+ stepStopLogging: "Остановить и отправить отчёт",
+ stopAndSubmit: "Остановить и отправить",
+ maxDuration: "Автоматическая остановка через {{minutes}} мин",
+ stoppingLogs: "Сбор журналов и отправка...",
+ submitting: "Отправка отчёта об ошибке...",
+ submittingStepConnection: "Проверка подключений к принтерам",
+ submittingStepVirtualPrinters: "Проверка настройки виртуальных принтеров",
+ submittingStepLogScan: "Поиск известных проблем в последних журналах",
+ submittingStepSubmit: "Отправка отчёта в GitHub",
+ submitSuccess: "Отчёт об ошибке успешно отправлен!",
+ submitFailed: "Не удалось отправить отчёт об ошибке",
+ diagnosticChecking: "Проверка подключений к принтерам...",
+ diagnosticHealthy: "Проверка подключения пройдена — проблем с принтерами не обнаружено.",
+ diagnosticSummary: "Проблемы с подключением обнаружены у {{problems}} из {{total}} принтеров",
+ diagnosticIntro: "У одного или нескольких принтеров есть проблема подключения, которая может быть причиной сбоя. Разверните сведения о принтере ниже и посмотрите способ исправления — возможно, отчёт об ошибке не потребуется. При необходимости его всё равно можно отправить ниже.",
+ logHealthSummary: "В журналах найдены известные проблемы",
+ logHealthIntro: "Последние записи журнала совпадают с известными проблемами. Посмотрите способы исправления ниже — возможно, отчёт об ошибке не потребуется. При необходимости его всё равно можно отправить.",
+ thankYou: "Спасибо!",
+ submitted: "Отчёт об ошибке отправлен.",
+ viewIssue: "Открыть задачу",
+ unexpectedError: "Произошла непредвиденная ошибка",
+ },
+ failureDetection: {
+ title: "Обнаружение сбоев с помощью ИИ",
+ description: "Контролируйте печать через собственный сервер Obico ML API и автоматически реагируйте на обнаруженные сбои.",
+ mlUrl: "URL Obico ML API",
+ mlUrlHint: "Базовый URL собственного контейнера Obico ml_api, например http://192.168.1.10:3333.",
+ test: "Проверить",
+ testSuccess: "ML API доступен и работает.",
+ testFailed: "Не удалось подключиться к ML API.",
+ sensitivity: "Чувствительность",
+ sensitivityLow: "Низкая (меньше ложных срабатываний)",
+ sensitivityMedium: "Средняя (сбалансированная)",
+ sensitivityHigh: "Высокая (раннее обнаружение, больше ложных срабатываний)",
+ sensitivityHint: "Определяет пороги уверенности, при которых создаются предупреждения и фиксируются сбои.",
+ action: "Действие при обнаружении сбоя",
+ actionNotify: "Только уведомить",
+ actionPause: "Приостановить печать",
+ actionPauseOff: "Приостановить печать и отключить питание",
+ pollInterval: "Интервал проверки (секунды)",
+ pollIntervalHint: "Как часто проверять каждый принтер во время печати. Минимум 5 с, максимум 120 с.",
+ externalUrlMissing: "Внешний URL не задан.",
+ externalUrlHint: "ML API получает снимок камеры по URL. Укажите внешний URL в общих настройках, чтобы контейнер ML API мог обращаться к Bambuddy.",
+ perPrinterTitle: "Контролируемые принтеры",
+ perPrinterHint: "Выберите принтеры, за которыми будет следить служба обнаружения.",
+ monitorAll: "Контролировать все подключённые принтеры",
+ statusTitle: "Состояние",
+ serviceRunning: "Служба работает",
+ thresholds: "Низкий / высокий порог",
+ activePrinters: "Активные задания",
+ noActivePrints: "Сейчас ничего не печатается.",
+ historyTitle: "Последние обнаружения",
+ noHistory: "Обнаружений пока нет.",
+ },
+ makerworld: {
+ title: "MakerWorld",
+ description: "Вставьте URL модели MakerWorld, чтобы импортировать и напечатать её прямо из Bambuddy — без перехода в приложение Bambu Handy.",
+ pasteUrlHeader: "Импорт из MakerWorld",
+ pasteUrlPlaceholder: "https://makerworld.com/en/models/… или любая ссылка MakerWorld",
+ resolveButton: "Получить данные",
+ signInRequiredTitle: "Для загрузки требуется вход в Bambu Cloud",
+ signInRequiredBody: "Просматривать сведения о модели можно анонимно, но для загрузки файлов 3MF MakerWorld требует учётную запись Bambu Cloud.",
+ signInExpiredTitle: "Срок авторизации в Bambu Cloud истёк",
+ signInExpiredBody: "Вы по-прежнему авторизованы в Bambuddy, но Bambu Lab перестал принимать сохранённый токен, поэтому загрузки завершатся ошибкой. Выполните вход в Bambu Cloud снова.",
+ openCloudSettings: "Открыть настройки облака",
+ untitledModel: "Модель без названия",
+ byCreator: "Автор: {{name}}",
+ downloadsCount: "Загрузок: {{count}}",
+ licensePrefix: "Лицензия",
+ alreadyImported: "Уже в библиотеке",
+ openOnMakerworld: "Открыть на MakerWorld",
+ alreadyInLibrary: "Эта модель уже есть в библиотеке — найдите её в разделе «Файлы → MakerWorld».",
+ importSuccess: "Импортирован файл {{filename}} — сохранён в «Файлы → MakerWorld».",
+ platesHeader: "Пластины ({{count}})",
+ plateDefaultName: "Пластина {{n}}",
+ materialCount: "Филаментов: {{count}}",
+ amsRequired: "Требуется AMS",
+ slicedFor: "Нарезано для {{printer}}",
+ alsoCompatible: "Также отмечено как совместимое: {{printers}}",
+ importToLibrary: "Сохранить",
+ sliceIn: "Сохранить и нарезать в {{slicer}}",
+ disclaimer: "Интеграция с MakerWorld использует документированные сообществом конечные точки API. Bambuddy не связан с MakerWorld или Bambu Lab и не одобрен ими.",
+ lastImportSuccess: "Импортировано в библиотеку",
+ lastImportAlreadyInLibrary: "Уже в библиотеке",
+ viewInLibrary: "Открыть в файловом менеджере",
+ openInBambuStudio: "Открыть в Bambu Studio",
+ openInOrcaSlicer: "Открыть в OrcaSlicer",
+ importTo: "Импортировать в файловый менеджер",
+ recentImportsHeader: "Недавние импорты",
+ phaseResolving: "Получение данных",
+ phaseDownloading: "Загрузка",
+ folderAuto: "MakerWorld (по умолчанию)",
+ importAll: "Импортировать всё",
+ importAllProgress: "Импорт {{current}} из {{total}}",
+ openGallery: "Открыть галерею изображений",
+ galleryPrev: "Предыдущее изображение",
+ galleryNext: "Следующее изображение",
+ deleteImport: "Удалить из библиотеки",
+ importDeleting: "Удаление…",
+ importDeleted: "Удалено из библиотеки",
+ confirmDelete: "Удалить {{filename}} из библиотеки? Локальный файл будет удалён, но пластину можно снова импортировать из MakerWorld.",
+ errors: {
+ resolveFailed: "Не удалось обработать эту ссылку MakerWorld.",
+ downloadFailed: "Ошибка загрузки. Повторите попытку.",
+ deleteFailed: "Не удалось удалить файл из библиотеки.",
+ },
+ },
+ gcodeViewer: {
+ back: "Назад",
+ backToArchives: "Вернуться в архив печати",
+ backToFiles: "Вернуться в файловый менеджер",
+ },
+ libraryTrash: {
+ title: "Корзина",
+ headerButton: "Корзина",
+ headerTooltip: "Просмотреть файлы, перемещённые в корзину",
+ backToFiles: "Вернуться к файлам",
+ subtitleAdmin: "Удалённые файлы хранятся здесь {{days}} дней, затем удаляются автоматически. Показаны файлы всех пользователей.",
+ subtitleUser: "Удалённые файлы хранятся здесь {{days}} дней, затем удаляются автоматически.",
+ loading: "Загрузка корзины…",
+ loadError: "Не удалось загрузить корзину.",
+ empty: "Корзина пуста.",
+ summary: "{{count}} файлов · {{size}}",
+ emptyTrash: "Очистить корзину",
+ restore: "Восстановить",
+ purgeNow: "Удалить сейчас",
+ autoPurgeIn: "Автоудаление через {{when}}",
+ days: "дней",
+ retentionLabel: "Автоудаление через",
+ selectAll: "Выбрать всё",
+ selectOne: "Выбрать {{filename}}",
+ selectionCount: "Выбрано: {{count}}",
+ bulkRestore: "Восстановить выбранные",
+ bulkPurge: "Удалить выбранные",
+ col: {
+ filename: "Файл",
+ folder: "Папка",
+ size: "Размер",
+ deleted: "Перемещён в корзину",
+ autoPurge: "Автоудаление",
+ owner: "Владелец",
+ actions: "Действия",
+ },
+ confirm: {
+ purgeTitle: "Удалить навсегда?",
+ purgeBody: "Файл {{filename}} будет удалён с диска без возможности восстановления.",
+ emptyTitle: "Очистить корзину?",
+ emptyBody: "Все файлы ({{count}}) будут удалены с диска. Отменить это действие нельзя.",
+ bulkPurgeTitle: "Удалить выбранные файлы навсегда?",
+ bulkPurgeBody: "Выбранные файлы ({{count}}) будут удалены с диска без возможности восстановления.",
+ cta: "Удалить навсегда",
+ },
+ toast: {
+ restored: "Файл восстановлен.",
+ restoreFailed: "Не удалось восстановить файл.",
+ purged: "Файл удалён навсегда.",
+ purgeFailed: "Не удалось удалить файл.",
+ emptied: "Из корзины удалено файлов: {{count}}.",
+ emptyFailed: "Не удалось очистить корзину.",
+ retentionSaved: "Срок автоудаления: {{days}} дней.",
+ retentionFailed: "Не удалось сохранить срок хранения.",
+ bulkRestored: "Восстановлено файлов: {{count}}.",
+ bulkPurged: "Удалено файлов: {{count}}.",
+ },
+ },
+ libraryPurge: {
+ title: "Очистить старые файлы",
+ headerButton: "Очистить старые",
+ headerTooltip: "Массово переместить старые файлы в корзину",
+ description: "За один проход убирает старые файлы из библиотеки. Для печатавшихся файлов возраст считается от даты последней печати, для ни разу не печатавшихся — от даты загрузки.",
+ ageLabel: "Переместить файлы старше",
+ days: "дней",
+ includeNeverPrinted: "Включить файлы, которые ни разу не печатались",
+ effectsTitle: "Что произойдёт после нажатия «Очистить»",
+ effect1: "Подходящие файлы будут перемещены в корзину, но пока не удалены с диска.",
+ effect2: "Их можно восстановить из корзины до окончания срока хранения.",
+ effect3: "После окончания срока хранения очистка корзины окончательно удалит их с диска.",
+ effect4: "Файлы во внешних подключённых папках пропускаются: Bambuddy не удаляет чужие данные.",
+ previewLoading: "Подсчёт подходящих файлов…",
+ previewFailed: "Не удалось выполнить предварительный расчёт.",
+ previewSummary: "В корзину будет перемещено: {{count}} файлов · {{size}}",
+ andMore: "…и ещё {{count}}",
+ warning: "Файлы в корзине продолжают занимать место до окончания срока хранения. Чтобы освободить диск сразу, после операции очистите корзину.",
+ confirmCta: "Переместить в корзину: {{count}}",
+ purging: "Перемещение в корзину…",
+ toast: {
+ success: "Перемещено в корзину файлов: {{count}}.",
+ failed: "Не удалось очистить файлы.",
+ },
+ },
+ libraryAutoPurge: {
+ enableLabel: "Автоматически очищать старые файлы",
+ enableDescription: "Раз в сутки запускает административную очистку. Сначала файлы попадают в корзину и не удаляются немедленно.",
+ ageLabel: "Автоматически очищать файлы старше",
+ ageDescription: "Минимум 7 дней, максимум 10 лет. Используется тот же способ расчёта возраста, что и при ручной очистке.",
+ days: "дней",
+ includeNeverPrinted: "Включить файлы, которые ни разу не печатались",
+ saveFailed: "Не удалось сохранить настройки автоочистки.",
+ },
+ archivePurge: {
+ headerButton: "Очистить старые",
+ headerTooltip: "Массово удалить старые записи архива",
+ title: "Очистить старые записи архива",
+ description: "Удаляет старую историю печати. Возраст записи считается от последнего завершения печати; повторная печать обновляет дату, поэтому используемые записи не удаляются.",
+ ageLabel: "Удалить записи, которые не печатались последние",
+ days: "дней",
+ effectsTitle: "Что произойдёт после нажатия «Очистить»",
+ effect1: "Каждая подходящая запись будет скрыта из списков, а связанные файлы удалены с диска: 3MF, миниатюра, таймлапс, исходный 3MF, проект F3D и фотографии.",
+ effect2: "Строка архива останется в базе, поэтому быстрая статистика сохранит вклад по филаменту, времени, стоимости и энергии — как при обычном удалении отдельной записи.",
+ effect3: "Установите флажок «Также удалить из статистики», чтобы исключить вклад из быстрой статистики. Это действие необратимо.",
+ effect4: "Повторная печать обновляет дату записи, поэтому используемые архивы не удаляются.",
+ purgeStatsLabel: "Также удалить из статистики",
+ purgeStatsHint: "Исключает соответствующие записи из быстрой статистики по филаменту, времени, стоимости и энергии. Без этого удаляются только файлы, а статистика сохраняется.",
+ previewLoading: "Подсчёт подходящих записей…",
+ previewFailed: "Не удалось выполнить предварительный расчёт.",
+ previewSummary: "Будет удалено: {{count}} записей · {{size}}",
+ andMore: "…и ещё {{count}}",
+ warning: "Файлы будут удалены с диска без возможности восстановления. Перед продолжением скачайте или добавьте в избранное всё, что нужно сохранить.",
+ confirmCta: "Удалить записей: {{count}}",
+ purging: "Удаление…",
+ toast: {
+ success: "Удалено записей архива: {{count}}.",
+ failed: "Не удалось очистить архив.",
+ },
+ },
+ archiveAutoPurge: {
+ enableLabel: "Автоматически очищать старые записи архива",
+ enableDescription: "Раз в сутки скрывает записи из списков и удаляет их файлы с диска, если они не печатались в течение заданного срока. Повторная печать сбрасывает отсчёт.",
+ ageLabel: "Автоматически удалять записи, которые не печатались последние",
+ ageDescription: "Минимум 7 дней, максимум 10 лет. Срок считается от последнего завершения печати; повторная печать обновляет дату. Удаляются 3MF, миниатюра, таймлапс, исходный 3MF, F3D и фотографии.",
+ days: "дней",
+ purgeStatsLabel: "Также удалить из статистики",
+ purgeStatsDescription: "Если включено, ежедневная очистка исключает удалённые записи из быстрой статистики по филаменту, времени, стоимости и энергии. По умолчанию выключено: статистика сохраняется, удаляются только файлы.",
+ runNow: "Очистить архив сейчас",
+ saveFailed: "Не удалось сохранить настройки автоочистки.",
+ },
+ cameraTokens: {
+ scope: {
+ camera_stream: "Поток камеры",
+ camwall: "Стена камер",
+ overlay: "Оверлей для стрима",
+ },
+ title: "Токены API камеры",
+ navTitle: "Токены API камеры",
+ description: "Долгоживущие токены для встраивания видеопотока в Home Assistant, Frigate, киоски и другие системы, которым нужен постоянный URL. Каждый токен даёт доступ только к потоку камеры и может быть отозван в любой момент.",
+ loading: "Загрузка...",
+ confirmRevoke: {
+ title: "Отозвать этот токен?",
+ body: "Все устройства, использующие «{{name}}», немедленно потеряют доступ. Отменить это действие нельзя.",
+ cancel: "Отмена",
+ confirm: "Отозвать",
+ },
+ create: {
+ scopeLabel: "Область действия",
+ hintCameraStream: "Токен потока камеры позволяет получать только видеопотоки и снимки. Используйте его для Home Assistant, Frigate и других систем, встраивающих изображение с одной камеры.",
+ hintCamWall: "Токен стены камер открывает страницу /camwall на экране без авторизации. Он позволяет видеть названия и состояния всех принтеров, а также видеопотоки с их камер. Имена файлов, адреса и коды доступа недоступны.",
+ hintOverlay: "Токен оверлея для стрима открывает страницу /overlay/{printerId} на экране без авторизации — для OBS или любой прямой трансляции. Он даёт доступ к видеопотоку одного принтера и его текущему статусу печати, включая имя файла, отображаемое на экране. Адреса и коды доступа недоступны.",
+ title: "Создать токен",
+ nameLabel: "Название токена",
+ namePlaceholder: "Например, Home Assistant",
+ daysLabel: "Срок действия, дней",
+ submit: "Создать",
+ hint: "Максимальный срок действия — 365 дней. Значение токена показывается только один раз при создании — скопируйте его сейчас.",
+ },
+ created: {
+ camWallUrlTitle: "URL стены камер для этого экрана",
+ camWallUrlHint: "Откройте этот адрес на экране. Любой, кто получит URL, сможет наблюдать за стеной камер, поэтому обращайтесь с ним как с ключом. Отзовите токен, чтобы отключить экран.",
+ overlayUrlTitle: "URL оверлея для OBS",
+ overlayUrlHint: "Добавьте этот адрес как источник браузера (Browser Source) в OBS. Замените число в /overlay/1 на номер вашего принтера (его можно узнать из URL на странице «Принтеры»). Любой, кто получит URL, сможет смотреть трансляцию, поэтому обращайтесь с ним как с ключом — отзовите токен, чтобы прекратить доступ.",
+ title: "Токен создан — скопируйте его сейчас",
+ warning: "Это единственный раз, когда токен отображается. После закрытия окна посмотреть его снова будет невозможно.",
+ copy: "Копировать",
+ dismiss: "Я сохранил токен",
+ },
+ list: {
+ scope: "Область действия",
+ myTitle: "Мои токены",
+ allTitle: "Все пользователи (режим администратора)",
+ empty: "Токенов пока нет.",
+ name: "Название",
+ owner: "Владелец",
+ prefix: "Префикс",
+ created: "Создан",
+ expires: "Истекает",
+ lastUsed: "Последнее использование",
+ revoke: "Отозвать",
+ expired: "Истёк",
+ },
+ toast: {
+ created: "Токен создан",
+ createFailed: "Не удалось создать токен",
+ revoked: "Токен отозван",
+ revokeFailed: "Не удалось отозвать токен",
+ loadFailed: "Не удалось загрузить токены",
+ copied: "Скопировано в буфер обмена",
+ copyFailed: "Не удалось скопировать — выделите и скопируйте вручную",
+ },
+ },
+ forecast: {
+ title: "Прогноз",
+ noSpools: "Активные катушки не найдены. Добавьте катушки в учёт, чтобы увидеть прогноз.",
+ noUsageData: "Нет данных о расходе — невозможно спрогнозировать остатки.",
+ sku: "Артикул",
+ material: "Материал",
+ stock: "Запас",
+ dailyRate: "Расход",
+ daysLeft: "Осталось дней",
+ emptyBy: "Закончится к",
+ reorderBy: "Заказать до",
+ actions: "Действия",
+ trend: "Тренд",
+ estimated: "Оценка",
+ noData: "Нет данных",
+ timeframe: "Период",
+ chartTitle: "Прогноз запаса — 5 основных материалов",
+ dashedLinesROP: "Пунктирные линии — точки заказа",
+ stockLevel: "Уровень запаса",
+ reorderPoint: "Точка заказа",
+ safetyMargin: "Страховой запас",
+ trendLegend: "Тренд (по истории, уровень обслуживания 95%)",
+ estimatedLegend: "Оценка (по изменению массы)",
+ noDataLegend: "Нет данных",
+ ropLabel: "ТЗ",
+ ssLabel: "СЗ",
+ safetyStockLegend: "Страховой запас",
+ stockArrivalLegend: "Поступление",
+ stockoutLegend: "Исчерпание запаса",
+ alertCount_one: "{{count}} предупреждение",
+ alertCount_other: "{{count}} предупреждений",
+ order: "Заказать",
+ save: "Сохранить",
+ cancel: "Отмена",
+ settingsSaved: "Настройки сохранены",
+ failedSaveSettings: "Не удалось сохранить настройки",
+ globalLeadTimeSaved: "Общий срок поставки сохранён",
+ globalLeadTime: "Общий срок поставки",
+ globalLeadTimeHint: "Минимальный общий срок поставки, используемый при расчёте точки заказа для всех артикулов",
+ skuLeadTimeOverride: "Переопределение срока поставки",
+ skuLeadTimeHint: "0 — использовать общий срок поставки. Значение больше 0 переопределяет его для этого артикула.",
+ safetyMarginLabel: "Страховой запас",
+ effectiveLeadTime: "Фактический срок поставки",
+ effectiveLeadTimeHint: "макс. (общий {{global}} дн., для артикула {{sku}} дн.)",
+ reorderPointHint: "средний расход × срок поставки + страховой запас — заказывайте, когда остаток достигнет этого уровня",
+ safetyMarginHint: "Статистический страховой запас (z=1,65 × σ × √LT) плюс заданный пользователем резерв",
+ safetyMarginHintDays: "Резерв поверх статистического страхового запаса.{{approx}}",
+ safetyMarginHintDaysApprox: " ≈ {{g}} г при текущем расходе.",
+ safetyMarginHintG: "Фиксированный весовой резерв поверх статистического страхового запаса.{{approx}}",
+ safetyMarginHintGApprox: " ≈ {{days}} дн. при текущем расходе.",
+ individualSpools: "Отдельные катушки",
+ labelWeight: "Метка",
+ spoolCount_one: "{{count}} катушка",
+ spoolCount_other: "{{count}} катушек",
+ stockBreakRisk: "Риск исчерпания запаса",
+ stockBreakDetail: "Осталось {{days}} дн., срок поставки {{lt}} дн.",
+ stockBreakBefore: "Запас закончится до пополнения",
+ reorderNow: "Заказать сейчас",
+ reorderTriggerPassed: "Дата заказа {{date}} уже прошла.",
+ shoppingList: "Список покупок",
+ shoppingListItems_one: "({{count}} позиция)",
+ shoppingListItems_other: "({{count}} позиций)",
+ shoppingListEmpty: "Список покупок пуст. Нажмите значок корзины в нужной строке, чтобы добавить позицию.",
+ addToCart: "Добавить в список покупок",
+ alertsSnoozed: "Отключить предупреждения для артикула",
+ alertsEnabled: "Включить предупреждения для артикула",
+ addedToCart: "Добавлено в список покупок",
+ failedAddItem: "Не удалось добавить позицию",
+ listView: "Список",
+ logisticsView: "Логистика",
+ qty: "Кол-во",
+ weight: "Масса",
+ leadTime: "Срок поставки",
+ expectedRestock: "Ожидаемое пополнение",
+ status: "Состояние",
+ note: "Примечание",
+ pending: "Ожидается",
+ purchased: "Куплено",
+ received: "Получено",
+ markPurchased: "Отметить как купленное",
+ markReceived: "Отметить как полученное — катушки будут добавлены в запас",
+ resetToPending: "Вернуть в ожидание",
+ remove: "Удалить",
+ clearAll: "Очистить всё",
+ downloadCsv: "CSV",
+ addToCartTitle: "Добавить в список покупок",
+ byQuantity: "По количеству",
+ byDuration: "По сроку",
+ numberOfSpools: "Количество катушек",
+ lastHowManyDays: "На сколько дней должно хватить?",
+ noUsageQty: "Нет данных о расходе — количество установлено равным 1.",
+ noteOptional: "Примечание (необязательно)",
+ notePlaceholder: "например, для проекта X, срочно…",
+ addNSpools_one: "Добавить {{count}} катушку",
+ addNSpools_other: "Добавить {{count}} катушек",
+ onArrival: "После поступления",
+ stockBreakIn: "Запас закончится через {{days}} дн.",
+ stockRunsOutBefore: "Запас закончится раньше, чем истекут {{lt}} дн. срока поставки.",
+ atRate: "При расходе {{rate}} г/день требуется",
+ moreSpools_one: "ещё {{count}} катушка",
+ moreSpools_other: "ещё {{count}} катушек",
+ bridgeGap: "чтобы перекрыть дефицит.",
+ noReadAccess: "У вас нет прав на просмотр прогноза запасов.",
+ noWriteAccess: "У вас нет прав на изменение настроек прогноза.",
+ },
+};
diff --git a/static/assets/index-Cqi3-E-p.js b/static/assets/index-DrPqYCte.js
similarity index 95%
rename from static/assets/index-Cqi3-E-p.js
rename to static/assets/index-DrPqYCte.js
index bb4bc79d8..0f5a524d8 100644
--- a/static/assets/index-Cqi3-E-p.js
+++ b/static/assets/index-DrPqYCte.js
@@ -39,7 +39,10 @@ ON值:表示"ON"的确切字符串。留空以自动检测(ON、true、1)
ON值:表示"ON"的確切字串。留空以自動檢測(ON、true、1)。`,restControl:`控制`,restOnUrl:`開啟 URL`,restOffUrl:`關閉 URL`,restOnBody:`開啟請求內容`,restOffBody:`關閉請求內容`,restMethod:`HTTP 方法`,restHeaders:`自訂標頭(JSON)`,restStatusUrl:`狀態 URL`,restStatusPath:`狀態 JSON 路徑`,restStatusOnValue:`ON 值`,restPowerUrl:`功率URL`,restPowerPath:`功率 JSON 路徑`,restPowerMultiplier:`功率乘數`,restEnergyUrl:`能耗URL`,restEnergyPath:`能耗 JSON 路徑(今日)`,restEnergyTotalPath:`能耗 JSON 路徑(累計值)`,restEnergyTotalMultiplier:`累計值倍數`,restEnergyTotalPathHint:`例如 aenergy.total`,restEnergyTotalHint:`許多插座(包括所有 Shelly)只提供永不歸零的累計計數值。該值應填在此處,而非上方欄位:若當作今日用量讀取,它在午夜不會歸零,而「昨日」與「總計」會一直是空的。Bambuddy 會據此推算「今日」與「昨日」,這需要一至兩天的取樣資料。Shelly 以瓦時為單位,因此倍數請填 0.001。`,restEnergyMultiplier:`能耗乘數`,restUrlRequired:`REST 插座至少需要一個 URL(ON 或 OFF)`,restHeadersHint:`例如:{"Authorization": "Bearer your-token"}`,restBodyHint:`例如:ON、{"state": "on"}`,restStatusHint:`用於輪詢目前狀態的 URL`,restPathHint:`例如:state 或 data.power.status`,restPowerUrlHint:`功率資料的獨立URL(留空則使用狀態URL)`,restEnergyUrlHint:`能耗資料的獨立URL(留空則使用狀態URL)`,restEnergyHint:`每個值可以使用獨立的URL,或回退到狀態 URL。使用乘數進行單位轉換(例如:0.001 將 Wh 轉換為 kWh)。`,testConnection:`測試連線`,connectionSuccess:`連線成功`,noSwitchesInSwitchbar:`開關欄中沒有開關`,enableSwitchbarHint:`在設定 > 智慧插座中啟用"在開關欄顯示"`},notifications:{providerTypes:{callmebot:`CallMeBot/WhatsApp`,ntfy:`ntfy`,pushover:`Pushover`,telegram:`Telegram`,email:`電子郵件`,discord:`Discord`,webhook:`Webhook`,homeassistant:`Home Assistant`},providerDescriptions:{email:`SMTP 電子郵件通知`,telegram:`透過 Telegram 機器人傳送通知`,discord:`透過 Webhook 傳送到 Discord 頻道`,ntfy:`免費、可自託管的推送通知`,pushover:`簡單、可靠的推送通知`,callmebot:`透過 CallMeBot 免費傳送 WhatsApp 通知`,webhook:`通用 HTTP POST 到任意 URL`,homeassistant:`Home Assistant 儀表板中的持久通知`},lastSuccess:`上次:{{date}}`,error:`錯誤`,printer:`印表機:`,allPrinters:`所有印表機`,sendTestNotification:`傳送測試通知`,eventSettings:`事件設定`,enabled:`已啟用`,sendFromProvider:`從此提供者傳送通知`,printEvents:`列印事件`,printerStatus:`印表機狀態`,amsAlarms:`AMS 警報`,amsHtAlarms:`AMS-HT 警報`,printQueue:`列印佇列`,start:`開始`,plateCheck:`熱床檢測`,complete:`完成`,failed:`失敗`,stopped:`已停止`,progress:`進度`,offline:`離線`,lowFilament:`耗材不足`,maintenance:`維護`,amsHumidity:`AMS 濕度`,amsTemp:`AMS 溫度`,amsHtHumidity:`AMS-HT 濕度`,amsHtTemp:`AMS-HT 溫度`,bedCooled:`熱床已冷卻`,firstLayer:`首層完成`,quiet:`免打擾`,digest:`摘要 {{time}}`,printStarted:`列印已開始`,plateNotEmpty:`熱床非空`,plateNotEmptyDescription:`列印前偵測到物體`,printCompleted:`列印已完成`,bedCooledLabel:`熱床已冷卻`,bedCooledDescription:`列印後熱床溫度降至閾值以下`,firstLayerCompleteLabel:`首層列印完成`,firstLayerCompleteDescription:`首層完成時傳送帶照片的通知`,missingSpoolAssignmentLabel:`缺少料卷分配`,missingSpoolAssignmentDescription:`當列印開始且所需料盤沒有分配料卷時傳送通知`,printFailed:`列印失敗`,printStopped:`列印已停止`,progressMilestones:`進度里程碑`,progressMilestonesDescription:`在 25%、50%、75% 時通知`,printerOffline:`印表機離線`,printerError:`印表機錯誤`,aiFailureDetection:`AI 失敗偵測`,aiFailureDetectionDescription:`當 Obico AI 偵測到可能的列印失敗時通知`,lowFilamentLabel:`耗材不足`,maintenanceDue:`需要維護`,maintenanceDueDescription:`需要維護時通知`,amsHumidityHigh:`AMS 濕度過高`,amsHumidityHighDescription:`普通 AMS 濕度超過閾值`,amsTemperatureHigh:`AMS 溫度過高`,amsTemperatureHighDescription:`普通 AMS 溫度超過閾值`,amsHtHumidityHigh:`AMS-HT 濕度過高`,amsHtHumidityHighDescription:`AMS-HT 濕度超過閾值`,amsHtTemperatureHigh:`AMS-HT 溫度過高`,amsHtTemperatureHighDescription:`AMS-HT 溫度超過閾值`,inventoryAlerts:`庫存警報`,stockReorderAlert:`補貨警報`,stockReorderAlertDescription:`SKU 已達到補貨點`,stockBreakAlert:`斷貨警報`,stockBreakAlertDescription:`庫存將在補貨到達前耗盡`,jobAdded:`任務已新增`,jobAddedDescription:`任務已新增到佇列`,jobAssigned:`任務已分配`,jobAssignedDescription:`基於模型的任務已分配給印表機`,jobStarted:`任務已開始`,jobStartedDescription:`佇列任務已開始列印`,jobWaiting:`任務等待中`,jobWaitingDescription:`任務正在等待耗材或印表機`,jobSkipped:`任務已跳過`,jobSkippedDescription:`任務已跳過(上一個失敗)`,jobFailed:`任務失敗`,jobFailedDescription:`任務啟動失敗`,queueComplete:`佇列已完成`,queueCompleteDescription:`所有佇列任務已完成`,quietHours:`免打擾時段`,noNotificationsDuring:`在此時段內不傳送通知`,editProviderToChangeQuietHours:`編輯提供者以更改免打擾時段`,dailyDigest:`每日摘要`,batchNotifications:`將通知彙總為每日摘要`,sendAt:`傳送於 {{time}}`,editProviderToChangeDigestTime:`編輯提供者以更改摘要時間`,edit:`編輯`,deleteProvider:`刪除通知提供者`,deleteConfirm:`確定要刪除"{{name}}"嗎?此操作無法復原。`,delete:`刪除`,addTitle:`新增通知提供者`,editTitle:`編輯通知提供者`,nameLabel:`名稱 *`,namePlaceholder:`我的通知`,providerTypeLabel:`提供者類型 *`,configuration:`設定`,testConfiguration:`測試設定`,printerFilter:`印表機篩選`,onlyFromPrinter:`僅傳送來自此印表機的事件通知`,quietHoursDnd:`免打擾時段`,quietStart:`開始`,quietEnd:`結束`,dailyDigestLabel:`每日摘要`,sendDigestAt:`傳送摘要於`,digestCollected:`事件將被收集並在此時間作為單條摘要傳送`,notificationEvents:`通知事件`,progressPercent:`(25%、50%、75%)`,bedCooledAfterPrint:`(列印完成後)`,eventPriority:{sectionTitle:`ntfy 優先級`,helpNtfy:`為每個已啟用的事件選擇優先級。ntfy 使用它來升級提醒(聲音、可見性、推播行為)。此處未設定的級別將使用 ntfy 伺服器預設值。`,min:`最低`,low:`低`,default:`預設`,high:`高`,urgent:`緊急`},cancel:`取消`,save:`儲存`,add:`新增`,nameRequired:`名稱為必填項`,fieldRequired:`{{field}}為必填項`,phoneNumber:`電話號碼`,apiKey:`API 金鑰`,serverUrl:`伺服器 URL`,topic:`主題`,authToken:`認證權杖`,userKey:`使用者金鑰`,appToken:`應用程式權杖`,priority:`優先順序`,pushoverRetry:`緊急重試 (秒)`,pushoverExpire:`緊急逾時 (秒)`,botToken:`機器人權杖`,chatId:`聊天 ID`,smtpServer:`SMTP 伺服器`,smtpPort:`SMTP 連接埠`,security:`安全`,authentication:`認證`,username:`使用者名稱`,password:`密碼`,fromEmail:`寄件人信箱`,toEmail:`收件人信箱`,webhookUrl:`Webhook URL`,payloadFormat:`負載格式`,authorization:`授權`,titleFieldName:`標題欄位名`,messageFieldName:`訊息欄位名`,editTemplate:`編輯範本:{{name}}`,titleLabel:`標題`,bodyLabel:`正文`,titlePlaceholder:`通知標題...`,bodyPlaceholder:`通知正文...`,availableVariables:`可用變數`,clickToInsert:`點選插入到正文游標位置`,livePreview:`即時預覽`,hide:`隱藏`,show:`顯示`,loadingPreview:`載入預覽中...`,enterTemplateContent:`輸入範本內容以檢視預覽`,titlePreview:`標題:`,bodyPreview:`正文:`,resetToDefault:`恢復預設`,titleRequired:`標題為必填項`,bodyRequired:`正文為必填項`,notificationLog:`通知日誌`,showFailedOnly:`僅顯示失敗`,last24Hours:`最近 24 小時`,last7Days:`最近 7 天`,last30Days:`最近 30 天`,last90Days:`最近 90 天`,justNow:`剛剛`,noFailedNotifications:`沒有失敗的通知`,noNotificationsLogged:`沒有通知紀錄`,unknownProvider:`未知提供者`,logTitle:`標題`,logMessage:`訊息`,logError:`錯誤`,logProvider:`提供者:{{type}}`,logTime:`時間:{{time}}`,refresh:`重新整理`,clearOld:`清除舊紀錄`,statsSummary:`最近 {{days}} 天:`,statsNotifications:`條通知`,statsSent:`{{count}} 條已傳送`,statsFailed:`{{count}} 條失敗`,eventTypes:{print_start:`列印已開始`,print_complete:`列印完成`,print_failed:`列印失敗`,print_stopped:`列印已停止`,print_progress:`進度`,printer_offline:`印表機離線`,printer_error:`印表機錯誤`,filament_low:`耗材不足`,maintenance_due:`需要維護`,test:`測試`},userEmail:{title:`通知`,emailNotifications:`郵件通知`,emailNotificationsDesc:`接收您自己列印任務的郵件通知。郵件將透過進階身份驗證中設定的 SMTP 設定傳送。`,sendingTo:`通知將傳送至`,noEmailWarning:`您的帳戶沒有郵件地址。請聯絡管理員新增。`,printJobNotifications:`列印任務通知`,printJobNotificationsDesc:`選擇哪些事件會觸發您提交的列印任務的郵件通知。`,printJobStarts:`列印任務開始`,printJobStartsDesc:`當您的列印任務開始時收到通知。`,printJobFinishes:`列印任務完成`,printJobFinishesDesc:`當您的列印任務成功完成時收到通知。`,printErrors:`列印錯誤`,printErrorsDesc:`當您的列印任務失敗或遇到錯誤時收到通知。`,printJobStops:`列印任務停止`,printJobStopsDesc:`當您的列印任務被取消或停止時收到通知。`,saveSuccess:`通知偏好設定已儲存。`,saveError:`儲存通知偏好設定失敗。`}},richTextEditor:{bold:`粗體`,italic:`斜體`,underline:`底線`,bulletList:`無序列表`,numberedList:`有序列表`,alignLeft:`左對齊`,alignCenter:`居中對齊`,alignRight:`右對齊`,addLink:`新增連結`,removeLink:`移除連結`},externalLinks:{title:`側邊欄連結`,sidebarLayout:`側邊欄`,sidebarLayoutDescription:`顯示或隱藏內建頁面、加入外部連結,並拖曳項目以重新排序側邊欄導覽。`,systemPages:`Bambuddy 頁面`,externalLinks:`外部連結`,visibleInSidebar:`顯示於側邊欄`,hiddenFromSidebar:`隱藏於側邊欄`,requiredInSidebar:`側邊欄中必須顯示`,hidePage:`隱藏頁面`,showPage:`顯示頁面`,settingsCannotBeHidden:`設定無法隱藏`,noLinksConfigured:`未設定外部連結`,deleteLink:`刪除連結`,removeCustomIcon:`移除自訂圖示`,openInNewTab:`在新標籤頁中開啟`,placeholders:{linkName:`我的連結`}},keyboardShortcuts:{title:`鍵盤快捷鍵`,navigation:`導航`,archivesSection:`歸檔`,kProfilesSection:`K 值設定`,generalSection:`通用`,shortcuts:{goToPrinters:`前往印表機`,goToArchives:`前往歸檔`,goToQueue:`前往佇列`,goToStats:`前往統計`,goToProfiles:`前往雲端設定`,goToSettings:`前往設定`,focusSearch:`聚焦搜尋`,openUploadModal:`開啟上傳對話方塊`,clearSelection:`清除選擇 / 取消焦點`,contextMenu:`卡片右鍵選單`,refreshProfiles:`重新整理設定`,newProfile:`新增設定`,exitSelectionMode:`結束選擇模式`,showHelp:`顯示此協助`},footer:`按 Esc 或點選外部關閉`},notificationLog:{title:`通知日誌`,events:{printStarted:`列印開始`,printComplete:`列印完成`,printFailed:`列印失敗`,printStopped:`列印停止`,progress:`進度`,printerOffline:`印表機離線`,printerError:`印表機錯誤`,lowFilament:`耗材不足`,maintenanceDue:`維護到期`,test:`測試`},timeAgo:{justNow:`剛剛`,minutesAgo:`{{minutes}} 分鐘前`,hoursAgo:`{{hours}} 小時前`}},restoreBackup:{title:`恢復備份`,restoring:`恢復中...`,restoreComplete:`恢復完成`,restoreFailed:`恢復失敗`,importSettings:`從備份檔案匯入設定`,pleaseWait:`請稍候,正在恢復您的資料`,clickToSelect:`點選選擇備份檔案(.json 或 .zip)`,howDuplicateHandling:`重複處理方式:`,categories:{printers:`印表機`,smartPlugs:`智慧插座`,notificationProviders:`通知提供者`,filaments:`耗材`,archives:`歸檔`,pendingUploads:`待處理上傳`,settingsTemplates:`設定和範本`},matchingInfo:{printers:`按序列號匹配`,smartPlugs:`按 IP 位址匹配`,notificationProviders:`按名稱匹配`,filaments:`按名稱 + 類型 + 品牌匹配`,archives:`按內容雜湊匹配`,pendingUploads:`按檔名匹配`,settingsTemplates:`始終覆蓋`},replaceExisting:`替換現有資料`,keepExisting:`保留現有資料`,replaceDescription:`用備份資料覆蓋已存在的項目`,keepDescription:`僅恢復不存在的項目`,caution:`注意:`,cautionText:`覆蓋將用備份資料替換您目前的設定。出於安全考慮,印表機存取碼永遠不會被覆蓋。`,itemsRestored:`已恢復項目`,itemsSkipped:`已跳過項目`,restored:`已恢復`,skipped:`已跳過(已存在)`,filesLabel:`檔案(3MF、縮圖等)`,newApiKeysGenerated:`已產生新 API 金鑰`,newApiKeysWarning:`這些金鑰僅顯示一次。請立即複製!`,processingBackup:`處理備份檔案中...`,noDataFound:`備份檔案中未找到可恢復的資料。`,failedToRestore:`恢復備份失敗。請檢查檔案格式。`},backupExport:{title:`匯出備份`,selectData:`選擇要包含的資料`,selectAll:`全選`,selectNone:`全不選`,categoryDescriptions:{settings:`語言、主題、更新偏好`,notifications:`ntfy、Pushover、Discord 等`,templates:`自訂訊息範本`,smartPlugs:`Tasmota 插座設定`,externalLinks:`側邊欄外部服務連結`,printers:`印表機資訊(不含存取碼)`,plateDetection:`空列印板參考影像`,filaments:`耗材類型和成本`,maintenance:`自訂維護計畫`,archives:`所有列印資料 + 檔案(3MF、縮圖、照片)`,projects:`專案、材料清單和附件`,pendingUploads:`虛擬印表機待審核的上傳`,apiKeys:`Webhook API 金鑰(匯入時產生新金鑰)`},requiresPrinters:`需要選擇印表機`,zipFileWarning:`將建立 ZIP 檔案。`,zipFileDescription:`包括所有 3MF 檔案、縮圖、縮時攝影和照片。這可能需要一些時間並產生較大的檔案。`,includeAccessCodes:`包含存取碼`,includeAccessCodesDescription:`用於轉移到另一臺機器`,includeAccessCodesWarning:`存取碼將以明文形式包含。請妥善保管此備份檔案!`,categoriesSelected:`已選擇 {{selectedCount}} 個類別`},pendingUploads:{placeholders:{notes:`新增關於此列印的備註...`},discardUpload:`丟棄上傳`,archiveAllUploads:`歸檔所有上傳`,discardAllUploads:`丟棄所有上傳`,archive:`歸檔`,timeAgo:{justNow:`剛剛`,minutesAgo:`{{minutes}} 分鐘前`,hoursAgo:`{{hours}} 小時前`,daysAgo:`{{days}} 天前`}},apiBrowser:{placeholders:{requestBody:`JSON 請求體...`,searchEndpoints:`搜尋端點...`}},configureAmsSlot:{title:`設定 AMS 槽位`,slotConfigured:`槽位已設定!`,configuringSlot:`正在設定槽位:`,slotLabel:`{{ams}} 槽位 {{slot}}`,searchPresets:`搜尋預設...`,colorPlaceholder:`顏色名稱或十六進位(例如:棕色、FF8800)`,clearCustomColor:`清除自訂顏色`,noCloudPresets:`無雲端預設。登入拓竹雲以同步。`,noPresetsAvailable:`無可用預設。登入拓竹雲或匯入本機設定。`,noMatchingPresets:`未找到匹配的預設。`,custom:`自訂`,builtin:`內建`,orcaCloud:`Orca Cloud`,bambuCloud:`Bambu Cloud`,settingsSentToPrinter:`設定已傳送到印表機`,filamentProfile:`耗材設定`,kProfileLabel:`K 值設定(壓力推進)`,filteringFor:`篩選:{{material}}`,noKProfile:`無 K 值設定(使用預設值 0.020)`,noMatchingKProfiles:`未找到匹配的 K 值設定。將使用預設 K=0.020。`,selectFilamentFirst:`請先選擇耗材設定`,kFromCalibration:`K={{value}}(來自印表機校準)`,customColorLabel:`自訂顏色(可選)`,presetColors:`{{name}} 顏色:`,showLessColors:`顯示更少顏色`,showMoreColors:`顯示更多顏色`,clear:`清除`,hexLabel:`十六進位:#{{hex}}`,resetting:`重設中...`,resetSlot:`重設槽位`,cancel:`取消`,configuring:`設定中...`,configureSlot:`設定槽位`},githubBackup:{title:`Git 備份`,history:`歷史`,downloadBackup:`下載備份`,restoreBackup:`恢復備份`,noBackupsYet:`尚無備份`},emailSettings:{placeholders:{fromName:`Bambuddy`}},tagManagement:{searchTags:`搜尋標籤...`,renameTag:`重新命名標籤`,deleteTag:`刪除標籤`},notificationTemplates:{placeholders:{title:`通知標題...`,body:`通知正文...`}},batchTag:{placeholders:{newTag:`輸入新標籤...`}},photoGallery:{deletePhoto:`刪除照片`},filamentHoverCard:{copySpoolUuid:`複製耗材 UUID`},kProfilesView:{hasNote:`有備註`,copyProfile:`複製設定`},layout:{openMenu:`開啟選單`,noPermissionSystemInfo:`您沒有檢視系統資訊的權限`},dashboard:{dragToReorder:`拖曳以重新排列`,hideWidget:`隱藏小工具`},notificationProviderCard:{deleteNotificationProvider:`刪除通知提供者`},fileManagerModal:{closeFileManager:`關閉檔案管理器`,sortFiles:`排序檔案`,goToParentFolder:`返回上級資料夾`,threeView:`3D 檢視`},embeddedCameraViewer:{refreshStream:`重新整理流`,close:`關閉`,zoomOut:`縮小`,resetZoom:`重設縮放`,zoomIn:`放大`,dragToResize:`拖曳調整大小`},timelapseViewer:{skipBack5s:`後退 5 秒`,skipForward5s:`前進 5 秒`},notificationProviders:{descriptions:{email:`SMTP 郵件通知`,telegram:`透過 Telegram 機器人通知`,discord:`透過 Webhook 傳送到 Discord 頻道`,ntfy:`免費、可自託管的推送通知`,pushover:`簡單、可靠的推送通知`,callmebot:`透過 CallMeBot 的免費 WhatsApp 通知`,webhook:`通用 HTTP POST 到任意 URL`}},logViewer:{searchPlaceholder:`搜尋訊息或日誌名稱...`,noLogEntries:`未找到日誌條目`},switchbarPopover:{noSwitchesInSwitchbar:`切換欄中沒有開關`},projectPageModal:{placeholders:{title:`標題`,designer:`設計師`,license:`許可證`,description:`輸入描述...`,profileTitle:`設定標題`,profileDescription:`設定描述...`}},spoolmanSettings:{},time:{unknown:`-`,waiting:`等待中`,justNow:`剛剛`,now:`現在`,minsAgo:`{{count}} 分鐘前`,inMins:`{{count}} 分鐘後`,hoursAgo:`{{count}} 小時前`,inHours:`{{count}} 小時後`,daysAgo:`{{count}} 天前`,inDays:`{{count}} 天後`},spoolbuddy:{nav:{dashboard:`儀表板`,ams:`AMS`,inventory:`庫存`,writeTag:`寫入`,settings:`設定`},status:{nfcReady:`NFC 就緒`,nfcOff:`NFC 關閉`,offline:`離線`,online:`線上`,noPrinters:`無印表機`,deviceOffline:`裝置離線`,waitingConnection:`等待裝置連線...`,systemReady:`系統就緒`,status:`狀態`},dashboard:{readyToScan:`準備掃描`,idleMessage:`將耗材放在磅秤上以識別`,nfcHint:`NFC 標籤將自動讀取`,device:`裝置`,syncWeight:`同步重量`,weightSynced:`已同步!`,unknownTag:`未知標籤`,newTag:`偵測到新標籤`,onScale:`在磅秤上`,linkSpool:`連結到耗材`,linkTagTitle:`將標籤連結到耗材`,linkTag:`連結標籤`,selectSpool:`選擇要連結此標籤的耗材:`,noUntagged:`未找到沒有標籤的耗材`,tagDetected:`偵測到標籤`,noTag:`無標籤`,tagId:`標籤`,grossWeight:`毛重`,spoolSize:`耗材盤尺寸`,close:`關閉`,currentSpool:`目前耗材`,plateReady:`熱床就緒: {{name}}`,plateReadyLabel:`待清理的熱床`,plateClearAction:`清理`,plateClearedToast:`已將熱床標記為已清理`,plateClearFailed:`無法將熱床標記為已清理`},modal:{spoolDetected:`偵測到耗材`,assignToAms:`分配到 AMS`,syncWeight:`同步重量`,weightSynced:`已同步!`,syncing:`同步中...`,newTagDetected:`偵測到新標籤`,addToInventory:`新增到庫存`,assignToAmsTitle:`分配到 AMS`,selectSlot:`選擇槽位`,assign:`分配`,assigning:`分配中...`,assignSuccess:`已分配!`,assignPendingInsert:`已分配。插入耗材後將設定槽位。`,assignError:`分配耗材失敗。請重試。`,noPrinterSelected:`選擇印表機...`,noAmsDetected:`此印表機未偵測到 AMS`,slot:`槽位`},weight:{noReading:`無讀數`,stable:`穩定`,measuring:`測量中...`,tare:`去皮`,calibrate:`校準`},spool:{remaining:`剩餘`,material:`材料`,brand:`品牌`,color:`顏色`,coreWeight:`軸心重`,labelWeight:`標籤重`,scaleWeight:`磅秤重`,netWeight:`淨重`,lastUsed:`上次使用`},ams:{noData:`未偵測到 AMS`,connectAms:`連線 AMS 以檢視耗材槽位`,noPrinter:`未選擇印表機`,selectPrinter:`從頂部欄選擇印表機`,printerDisconnected:`印表機已斷開`,humidity:`濕度`,level:`餘量`,active:`活躍`,slot:`槽位`,empty:`空`},inventory:{search:`搜尋耗材...`,empty:`庫存中沒有耗材`,noResults:`沒有匹配的耗材`,spools:`個耗材`,addSpool:`新增耗材`},settings:{tabDevice:`裝置`,tabDisplay:`顯示`,tabScale:`磅秤`,tabUpdates:`更新`,nfcReader:`NFC 讀卡器`,type:`類型`,connection:`連線`,notConnected:`不適用`,deviceInfo:`裝置資訊`,hostname:`主機`,uptime:`執行時間`,systemConfig:`後端與認證`,backendUrl:`Bambuddy 後端 URL`,apiToken:`API 權杖`,apiTokenPlaceholder:`輸入 API 權杖`,saveConfig:`儲存設定`,systemQueued:`設定已加入佇列。`,nfcDiagnostic:`NFC 診斷`,scaleDiagnostic:`磅秤診斷`,readTagDiagnostic:`讀取標籤診斷`,testNfc:`測試讀卡器`,testScale:`測試精度`,testReadTag:`讀取標籤`,systemFieldsRequired:`後端 URL 為必填項。`,brightness:`亮度`,saved:`已儲存`,noBacklight:`未偵測到 DSI 背光。亮度控制需要 DSI 螢幕。`,screenBlank:`螢幕熄滅超時`,screenBlankDesc:`不活動後螢幕關閉。觸控喚醒。`,displayNote:`亮度作為軟體濾鏡套用。`,scaleCalibration:`磅秤校準`,currentWeight:`目前重量`,tareOffset:`去皮`,calFactor:`係數`,knownWeight:`已知重量`,calStep1:`移除磅秤上所有物品並按設定零點。`,calStep2:`將已知重量放在磅秤上。`,setZero:`設定零點`,calibrateNow:`校準`,calibrated:`已校準`,tareSet:`去皮命令已傳送。等待裝置回應...`,tareComplete:`去皮完成!`,tareTimedOut:`去皮逾時 — SpoolBuddy 守護程序是否正在執行?`,tareFailed:`傳送去皮命令失敗`,zeroSet:`零點已設定。將已知重量放在磅秤上。`,calibrationDone:`校準完成!`,calibrationFailed:`校準失敗`,lastCalibrated:`上次校準`,stable:`穩定`,settling:`穩定中...`,firmware:`韌體`,scale:`磅秤`,noDevice:`未找到 SpoolBuddy 裝置`,daemonVersion:`守護程式版本`,currentVersion:`目前`,versionPending:`等待守護程式...`,checking:`檢查中...`,checkUpdates:`檢查更新`,updateAvailable:`有可用更新`,updateInstructions:`透過 SSH 更新:執行 SpoolBuddy 安裝腳本進行升級。`,upToDate:`已是最新`,includeBeta:`包含測試版本`},writeTag:{tabExisting:`現有耗材`,tabNew:`新耗材`,tabReplace:`替換標籤`,searchPlaceholder:`按材料、顏色、品牌搜尋...`,noUntaggedSpools:`沒有無標籤的耗材`,noTaggedSpools:`沒有有標籤的耗材`,selectSpool:`選擇一個耗材,然後將空白 NTAG 放在讀卡器上`,placeTag:`將 NTAG 放在讀卡器上`,tagReady:`偵測到標籤 — 準備寫入`,writeTag:`寫入標籤`,replaceTag:`替換標籤`,writing:`寫入標籤中...`,waiting:`等待 SpoolBuddy...`,writeSuccess:`標籤寫入成功!`,writeFailed:`寫入失敗`,queueFailed:`佇列寫入命令失敗`,tryAgain:`重試`,cancel:`取消`,replaceWarning:`舊標籤將被取消連結。新標籤將替換它。`,deviceOffline:`SpoolBuddy 離線`,material:`材料`,colorName:`顏色名稱`,color:`顏色`,brand:`品牌`,weight:`重量 (g)`,createSpool:`建立耗材`,creating:`建立中...`,spoolCreated:`耗材已建立!準備寫入。`,createFailed:`建立耗材失敗`,incompleteDataWarning:`已使用不完整的Spoolman資料寫入標籤`},quickMenu:{printerPower:`印表機電源`,systemControls:`系統`,restartDaemon:`重新啟動守護程式`,restartBrowser:`重新啟動瀏覽器`,reboot:`重新開機`,shutdown:`關機`,swipeToClose:`向下滑動關閉`,confirmTitle:`確認`,confirmShutdown:`確定要關閉 SpoolBuddy 嗎?您需要實體存取才能重新開啟。`,confirmReboot:`確定要重新開機 SpoolBuddy 嗎?`,confirmRestartDaemon:`重新啟動 SpoolBuddy 守護程式?NFC 和磅秤將暫時不可用。`,confirmRestartBrowser:`重新啟動kiosk瀏覽器?螢幕將短暫變黑。`,confirm:`確認`,confirmPlugOn:`開啟 {{name}}?`,confirmPlugOff:`關閉 {{name}}?`,turnOn:`開啟`,turnOff:`關閉`}},diagnostic:{modalTitle:`連線診斷 — {{name}}`,running:`正在執行診斷...`,runningElapsed:`正在執行診斷... ({{elapsed}}秒)`,waitingForReportHint:`正在等待印表機發佈狀態報告 — 最長可能需要 {{max}} 秒。`,runFailed:`無法執行診斷:{{error}}`,retry:`重新執行`,runButton:`執行診斷`,sectionTitle:`連線診斷`,sectionDescription:`檢查印表機無法連線或無法列印的原因 — 連接埠可達性、LAN 開發者模式、Docker 網路模式與認證資訊。`,noPrinters:`未設定印表機。`,overall:{ok:`未發現問題 — 印表機連線看起來正常。`,warnings:`印表機應該可以運作,但有些項目需要注意。`,problems:`發現了可解釋印表機無法連線或無法列印的問題。`},check:{port_mqtt:{title:`控制連接埠(MQTT 8883)`,pass:`可達 — 印表機正在接受控制連線。`,fail:`連接埠 8883 無法連線。印表機已關機、IP 位址不同,或被防火牆封鎖。請核實印表機 IP,並確保沒有任何東西封鎖連接埠 8883。`},port_ftps:{title:`檔案傳輸連接埠(FTPS 990)`,pass:`可達 — 傳送列印檔案將正常運作。`,warn:`連接埠 990 無法連線。監控可能仍然有效,但向印表機傳送列印工作將失敗。請確保連接埠 990 未被封鎖。`},external_storage:{title:`將傳送的檔案儲存在外部儲存中(安裝步驟 4)`,pass:`印表機回報此選項已開啟 — 傳送的檔案將儲存在 SD 卡上,封存將包含縮圖和切片機中繼資料。`,fail:`印表機回報此選項已關閉。請啟用「將傳送的檔案儲存在外部儲存中」 — 在較新韌體 (P2S 01.02 / Bambu Studio 2.6+) 中,開關位於印表機的列印設定中;在較舊版本中位於 Bambu Studio / OrcaSlicer 的裝置分頁中。如果未啟用此選項,每次封存的列印都將沒有縮圖也沒有切片機中繼資料。`,skip:`未檢查 — 需要有效的 MQTT 連線。在該設定僅存在於切片機中的較舊切片機上,印表機不會回報此設定,因此即使選項已關閉,此檢查也會通過 — 請手動驗證安裝步驟 4。`,skip_unsupported_model:`此型號有 SD 卡槽,但無法開啟該選項 — 目前 P1 系列韌體不會在 Bambu Studio 中顯示此開關,且印表機沒有螢幕。這裡無需修復;在 Bambu Lab 透過韌體加入支援之前,封存的列印可能缺少縮圖和切片中繼資料。`},port_rtsps:{title:`攝影機連接埠({{protocol}} {{port}})`,pass:`可達 — 攝影機串流將正常運作。`,warn:`連接埠 {{port}} 無法連線。即時攝影機檢視將無法運作。這不影響列印。`},network_mode:{title:`Docker 網路模式`,pass:`正在以 host 網路模式執行。`,warn:`Bambuddy 正在以 Docker bridge 網路執行。印表機探索與虛擬印表機需要 host 網路模式 — 請使用 "network_mode: host" 重新建立容器。`,skip:`未在 Docker 中執行 — 不適用。`},subnet:{title:`網路子網路`,pass:`印表機與 Bambuddy 位於同一子網路。`,warn:`印表機({{printer_ip}})與 Bambuddy({{host_ip}})位於不同的子網路。除非設定了子網路之間的路由,否則它們可能無法互相連線。`,skip:`無法判定子網路 — 已略過。`},mqtt_auth:{title:`印表機認證資訊`,pass:`印表機已接受連線。`,fail:`印表機可達,但拒絕了連線。存取碼或序號很可能有誤。每次切換開發者模式時存取碼都會變更 — 請從印表機螢幕重新複製。`,skip:`未檢查 — 無法連線到印表機。`},developer_mode:{title:`LAN 開發者模式`,pass:`開發者模式已啟用。`,fail:`印表機上的開發者模式已關閉。請在印表機的 LAN 設定中啟用它 — 並按 OK 確認。否則列印將無法開始。`,skip:`無法檢查 — 需要與印表機的即時連線。`},printer_publishing:{title:`印表機正在發佈狀態`,pass:`印表機正在發佈狀態更新 — AMS、耗材和 K 配置將正確鏡像到切片軟體。`,fail:`MQTT 代理已接受連線,但印表機未發佈任何狀態報告。這幾乎總是因為序號錯誤或大小寫不一致 — device//report 主題區分大小寫。請將印表機設定中的序號與印表機螢幕上的顯示進行核對。`,skip:`無法檢查 — 需要與印表機的即時連線。`}}},systemHealth:{sectionTitle:`系統健康`,sectionDescription:`掃描最近的日誌以找出已知問題,在它們演變成支援工單之前,通常你可以自行解決。`,rescan:`重新掃描`,clean:`在最近 {{times}} 筆日誌中未發現已知問題。`,logUnavailable:`檔案日誌記錄已停用,因此無法掃描日誌。請啟用檔案日誌以使用此檢查。`,learnMore:`如何解決`,fixLabel:`解決方法:`,occurrences:`出現 {{times}} 次 — 最近一次 {{lastSeen}}`,category:{layer8:`你可以自行解決`,environment:`環境`,bug:`請回報此問題`},signature:{"ftp-auth-rejected":{name:`印表機拒絕了存取碼`,cause:`印表機拒絕了檔案傳輸登入。存取碼錯誤,或在切換開發者模式後已變更。`,fix:`從印表機螢幕(區域網路設定)重新複製存取碼,並在 Bambuddy 的印表機設定中更新。`},"ftp-connection-timeout":{name:`檔案傳輸連線逾時`,cause:`Bambuddy 無法連線印表機的檔案傳輸連接埠(FTPS 990)。該連接埠被封鎖,或印表機已關機或位於其他子網路。`,fix:`請確認 Bambuddy 與印表機之間的 990 連接埠未被封鎖,且兩者位於同一網路。`},"ftp-ssl-error":{name:`安全檔案傳輸交握失敗`,cause:`與印表機檔案傳輸伺服器的 TLS 交握失敗。通常是防火牆或印表機韌體過舊所致。`,fix:`請更新印表機韌體,並檢查沒有防火牆或代理伺服器攔截 990 連接埠上的連線。`},"mqtt-connection-flapping":{name:`印表機連線反覆中斷`,cause:`控制連線(MQTT 8883)反覆中斷並重新連線——通常是網路訊號弱或連接埠被部分封鎖所致。`,fix:`請檢查印表機附近的 Wi-Fi 訊號,盡量使用有線連線,並確認 8883 連接埠能夠穩定連線。`},"camera-connection-refused":{name:`無法存取攝影機串流`,cause:`無法在 RTSPS 322 連接埠連線即時攝影機。該連接埠被封鎖,或印表機上的攝影機或區域網路即時影像已關閉。`,fix:`請在印表機上啟用攝影機和區域網路即時影像,並確認 322 連接埠未被封鎖。這不會影響列印。`},"database-locked":{name:`資料庫寫入衝突`,cause:`在負載下 SQLite 資料庫出現 "database is locked" 錯誤——同時使用多台印表機時較為常見。`,fix:`請將 Bambuddy 切換到外部 PostgreSQL 資料庫。參見文件中的 PostgreSQL 指南。`}}},vpDiagnostic:{title:`設定檢查 — {{name}}`,runButton:`執行設定檢查`,running:`正在執行設定檢查...`,runFailed:`無法執行設定檢查:{{error}}`,retry:`重新執行`,overall:{ok:`所有檢查均已通過 — 此虛擬印表機已正確設定。`,warnings:`虛擬印表機應該可以運作,但有些方面需要注意。`,problems:`發現的問題可以解釋切片軟體為何無法看到或使用此虛擬印表機。`},check:{enabled:{title:`虛擬印表機已啟用`,fail:`此虛擬印表機已關閉。請將其開啟以使其可被探索。`},running:{title:`服務正在執行`,fail:`虛擬印表機已啟用,但其服務未執行。請檢查 Bambuddy 記錄 — 通常是繫結 IP 衝突或權限錯誤使其停止。`},bind_interface:{title:`繫結網路介面`,fail:`繫結介面未設定,或在此主機上已不存在。請在「繫結介面」下拉選單中選擇一個目前的介面。`},access_code:{title:`已設定存取碼`,fail:`未設定存取碼。必須向切片軟體提供與您在此處設定的相同的 8 位存取碼。`},target_printer:{title:`目標印表機`,fail:`未選擇目標印表機。代理模式需要一台實際的印表機進行轉送。`,warn:`目標印表機目前處於離線狀態 — 重新連線後將恢復轉送。`},port_ftps:{title:`檔案上傳服務(連接埠 {{port}})`,fail:`繫結 IP 的連接埠 {{port}} 上沒有任何監聽,因此切片軟體無法上傳檔案。通常是此介面上的連接埠衝突所致。`},port_mqtt:{title:`控制服務(連接埠 {{port}})`,fail:`繫結 IP 的連接埠 {{port}} 上沒有任何監聽,因此切片軟體無法連線或顯示狀態。`},port_bind:{title:`探索服務(連接埠 {{port}})`,fail:`繫結 IP 的連接埠 {{port}} 上沒有任何監聽,因此切片軟體的探索交握會失敗。`},certificate:{title:`TLS 憑證`,pass:`憑證已就緒。請確保已將 Bambuddy CA 憑證(上方)匯入切片軟體的信任庫。`,fail:`此虛擬印表機的 TLS 憑證遺失。請檢查 Bambuddy 資料目錄是否可寫入。`}}},bugReport:{logHealthSummary:`在你的日誌中發現了已知問題`,logHealthIntro:`最近的日誌與已知問題相符。請查看下方的解決方法——解決它們可能無需提交錯誤報告即可解決你的問題。你仍然可以在下方提交報告。`,title:`報告錯誤`,description:`描述`,descriptionPlaceholder:`出了什麼問題?請描述問題...`,email:`信箱(可選)`,emailPlaceholder:`your@email.com`,emailPrivacy:`如果提供,您的信箱將包含在GitHub Issue的摺疊部分中,以便維護者後續跟進。`,screenshot:`截圖`,uploadOrPaste:`上傳、貼上或拖曳圖片`,dataCollectedSummary:`報告中包含哪些資料?`,dataIncluded:`包含:`,dataIncludedList:`應用程式版本、作業系統、架構、Python版本、資料庫統計(僅計數)、印表機型號、噴嘴數量、韌體版本、連線狀態、整合狀態(Spoolman、MQTT、HA)、非敏感設定、網路介面數量、Docker詳情、依賴版本。`,dataNeverIncluded:`絕不包含:`,dataNeverIncludedList:`印表機名稱、序列號、存取碼、密碼、IP 位址、信箱地址、API金鑰、權杖、Webhook URL、主機名稱或使用者名稱。`,submit:`提交`,startLogging:`開始偵錯日誌`,stepEnableLogging:`偵錯日誌已啟用`,stepReproduce:`請現在重現問題`,stepStopLogging:`停止並提交報告`,stopAndSubmit:`停止並提交`,maxDuration:`{{minutes}} 分鐘後自動停止`,stoppingLogs:`正在收集日誌並提交...`,submitting:`正在提交錯誤報告...`,submittingStepConnection:`正在執行印表機連線檢查`,submittingStepVirtualPrinters:`正在執行虛擬印表機設定檢查`,submittingStepLogScan:`正在掃描最近的日誌以尋找已知問題`,submittingStepSubmit:`正在將報告提交至 GitHub`,submitSuccess:`錯誤報告提交成功!`,submitFailed:`提交錯誤報告失敗`,diagnosticChecking:`正在檢查印表機連線...`,diagnosticHealthy:`連線檢查通過 — 未在您的印表機上發現問題。`,diagnosticSummary:`{{total}} 台印表機中有 {{problems}} 台存在連線問題`,diagnosticIntro:`一台或多台印表機存在連線問題,可能正是您遇到問題的原因。請展開下方的印表機查看解決方法 — 解決它也許無需提交錯誤報告即可解決問題。您仍然可以在下方提交報告。`,thankYou:`謝謝!`,submitted:`您的錯誤報告已提交。`,viewIssue:`檢視 Issue`,unexpectedError:`發生了意外錯誤`},failureDetection:{title:`AI 故障檢測`,description:`透過自託管的 Obico ML API 監控列印,並對偵測到的故障自動採取行動。`,mlUrl:`Obico ML API 地址`,mlUrlHint:`您自託管的 Obico ml_api 容器的基礎 URL(例如 http://192.168.1.10:3333)。`,test:`測試`,testSuccess:`ML API 可存取且正常。`,testFailed:`無法存取 ML API。`,sensitivity:`靈敏度`,sensitivityLow:`低(減少誤報)`,sensitivityMedium:`中(平衡)`,sensitivityHigh:`高(更早檢測,更多誤報)`,sensitivityHint:`調整觸發警告和故障的置信度閾值。`,action:`偵測到故障時的操作`,actionNotify:`僅通知`,actionPause:`暫停列印`,actionPauseOff:`暫停並切斷電源`,pollInterval:`檢查間隔(秒)`,pollIntervalHint:`列印過程中每臺印表機的檢查頻率。最小 5 秒,最大 120 秒。`,externalUrlMissing:`尚未設定外部 URL。`,externalUrlHint:`ML API 透過 URL 擷取攝影機快照。請在一般設定中設定外部 URL,讓 ML API 容器可以連線到 Bambuddy。`,perPrinterTitle:`監控的印表機`,perPrinterHint:`選擇檢測服務要監視哪些印表機。`,monitorAll:`監控所有已連線的印表機`,statusTitle:`狀態`,serviceRunning:`服務執行中`,thresholds:`低 / 高閾值`,activePrinters:`活動列印`,noActivePrints:`目前沒有正在進行的列印。`,historyTitle:`最近檢測`,noHistory:`尚無檢測紀錄。`},makerworld:{title:`MakerWorld`,description:`貼上 MakerWorld 模型連結,即可直接在 Bambuddy 中匯入並列印 —— 無需切換至 Bambu Handy 應用程式。`,pasteUrlHeader:`從 MakerWorld 匯入`,pasteUrlPlaceholder:`https://makerworld.com/en/models/… 或貼上任意 MakerWorld 連結`,resolveButton:`解析`,signInRequiredTitle:`下載需要登入 Bambu Cloud`,signInRequiredBody:`您可以匿名瀏覽模型詳情,但下載 3MF 檔案需要 Bambu Cloud 帳戶。`,signInExpiredTitle:`Bambu Cloud 登入已過期`,signInExpiredBody:`您仍處於 Bambuddy 的登入狀態,但 Bambu Lab 已不再接受已儲存的權杖,因此下載會失敗。請重新登入 Bambu Cloud。`,openCloudSettings:`開啟雲端設定`,untitledModel:`無標題模型`,byCreator:`作者: {{name}}`,downloadsCount:`{{count}} 次下載`,licensePrefix:`授權條款`,alreadyImported:`已在資料庫中`,openOnMakerworld:`在 MakerWorld 中開啟`,alreadyInLibrary:`此模型已在您的資料庫中 —— 可在檔案管理員 → MakerWorld 中找到`,importSuccess:`已匯入 {{filename}} —— 已儲存至檔案管理員 → MakerWorld`,platesHeader:`列印板 ({{count}})`,plateDefaultName:`列印板 {{n}}`,materialCount:`{{count}} 種耗材`,amsRequired:`需要 AMS`,slicedFor:`為 {{printer}} 切片`,alsoCompatible:`還標記為相容:{{printers}}`,importToLibrary:`儲存`,sliceIn:`儲存並在 {{slicer}} 中切片`,disclaimer:`MakerWorld 整合使用由社群記錄的 API 介面。Bambuddy 與 MakerWorld 或 Bambu Lab 無從屬或認可關係。`,lastImportSuccess:`已匯入您的資料庫`,lastImportAlreadyInLibrary:`已存在於您的資料庫中`,viewInLibrary:`在檔案管理員中查看`,openInBambuStudio:`在 Bambu Studio 中開啟`,openInOrcaSlicer:`在 OrcaSlicer 中開啟`,importTo:`匯入至檔案管理員`,recentImportsHeader:`最近匯入`,phaseResolving:`解析中`,phaseDownloading:`下載中`,folderAuto:`MakerWorld (預設)`,importAll:`全部匯入`,importAllProgress:`正在匯入 {{current}}/{{total}}`,openGallery:`開啟圖片庫`,galleryPrev:`上一張`,galleryNext:`下一張`,deleteImport:`從資料庫中移除`,importDeleting:`正在移除…`,importDeleted:`已從資料庫中移除`,confirmDelete:`從資料庫中移除 {{filename}}?本機檔案將被刪除,但可以從 MakerWorld 重新匯入。`,errors:{resolveFailed:`無法解析該 MakerWorld 連結。`,downloadFailed:`下載失敗。請重試。`,deleteFailed:`無法從資料庫中移除檔案。`}},gcodeViewer:{back:`返回`,backToArchives:`返回列印歸檔`,backToFiles:`返回檔案管理器`},libraryTrash:{title:`資源回收筒`,headerButton:`資源回收筒`,headerTooltip:`檢視已移至資源回收筒的檔案`,backToFiles:`返回檔案管理員`,subtitleAdmin:`已刪除的檔案會在資源回收筒保留 {{days}} 天,之後自動刪除。此檢視顯示所有使用者的資源回收筒。`,subtitleUser:`已刪除的檔案會在資源回收筒保留 {{days}} 天,之後自動刪除。`,loading:`正在載入資源回收筒…`,loadError:`無法載入資源回收筒。`,empty:`資源回收筒是空的。`,summary:`{{count}} 個檔案 · {{size}}`,emptyTrash:`清空資源回收筒`,restore:`還原`,purgeNow:`立即刪除`,autoPurgeIn:`將於 {{when}} 自動刪除`,days:`天`,retentionLabel:`自動刪除時間`,selectAll:`全選`,selectOne:`選擇 {{filename}}`,selectionCount:`已選擇 {{count}} 項`,bulkRestore:`還原所選`,bulkPurge:`刪除所選`,col:{filename:`檔案`,folder:`資料夾`,size:`大小`,deleted:`移入資源回收筒`,autoPurge:`自動刪除`,owner:`擁有者`,actions:`操作`},confirm:{purgeTitle:`永久刪除?`,purgeBody:`{{filename}} 將從磁碟中刪除,無法還原。`,emptyTitle:`清空資源回收筒?`,emptyBody:`全部 {{count}} 個檔案將從磁碟中刪除。此操作無法復原。`,bulkPurgeTitle:`永久刪除所選檔案?`,bulkPurgeBody:`所選的 {{count}} 個檔案將從磁碟中刪除,無法還原。`,cta:`永久刪除`},toast:{restored:`檔案已還原。`,restoreFailed:`無法還原檔案。`,purged:`檔案已永久刪除。`,purgeFailed:`無法刪除檔案。`,emptied:`已從資源回收筒刪除 {{count}} 個檔案。`,emptyFailed:`無法清空資源回收筒。`,retentionSaved:`自動刪除已設定為 {{days}} 天。`,retentionFailed:`無法儲存保留設定。`,bulkRestored:`已還原 {{count}} 個檔案。`,bulkPurged:`已刪除 {{count}} 個檔案。`}},libraryPurge:{title:`清理舊檔案`,headerButton:`清理舊檔案`,headerTooltip:`批次將舊檔案移至資源回收筒`,description:`早於所選時間的檔案將被移至資源回收筒。外部資料夾會被略過。在自動刪除之前,您可以從資源回收筒還原檔案。`,ageLabel:`移動早於以下天數的檔案`,days:`天`,includeNeverPrinted:`包括從未列印過的檔案`,effectsTitle:`點擊清除時會發生什麼`,effect1:`符合的檔案移至回收筒 — 尚未從磁碟刪除。`,effect2:`在保留期到期之前,您可以隨時從回收筒復原。`,effect3:`保留期滿後,回收筒清理器將它們從磁碟永久刪除。`,effect4:`外部(連結)資料夾中的檔案將被略過 — Bambuddy 從不刪除不屬於自己的位元組。`,previewLoading:`正在檢查符合的檔案數量…`,previewFailed:`無法預覽清理結果。`,previewSummary:`{{count}} 個檔案 · {{size}} 將被移至資源回收筒`,andMore:`…還有 {{count}} 個`,warning:`檔案將被軟刪除——在保留期結束前,您可以從資源回收筒還原它們。`,confirmCta:`將 {{count}} 個移至資源回收筒`,purging:`正在移至資源回收筒…`,toast:{success:`已將 {{count}} 個檔案移至資源回收筒。`,failed:`無法清理檔案。`}},libraryAutoPurge:{enableLabel:`自動清理舊檔案`,enableDescription:`每天執行一次管理員清理。檔案會先進入資源回收筒——不會立即刪除。`,ageLabel:`自動清理早於以下天數的檔案`,ageDescription:`最少 7 天,最多 10 年。使用與手動「清理舊檔案」按鈕相同的時間規則。`,days:`天`,includeNeverPrinted:`包括從未列印過的檔案`,saveFailed:`無法儲存自動清理設定。`},archivePurge:{headerButton:`清除舊條目`,headerTooltip:`批次刪除舊歸檔`,title:`清除舊歸檔`,description:`清除舊的列印歷史。每個歸檔按其最近一次列印完成時間老化 — 重新列印歸檔會重新整理其年齡,因此活躍工作永遠不會被清除。`,ageLabel:`刪除最近未列印的歸檔:`,days:`天`,effectsTitle:`點擊清除時會發生什麼`,effect1:`每個符合的歸檔將從清單中隱藏,其磁碟檔案(3MF、縮圖、縮時攝影、原始 3MF、F3D、照片)也會被刪除。`,effect2:`資料庫中的歸檔記錄會保留,因此 Quick Stats 仍可計入耗材、時間、成本與能耗的貢獻 — 與單筆刪除的預設行為一致。`,effect3:`勾選下方「同時從統計中移除」,可一併清除 Quick Stats 中的貢獻(等同單筆刪除選項)。此操作無法復原。`,effect4:`重新列印歸檔會重新整理其使用計時器,因此仍在使用的歸檔不會被清除。`,purgeStatsLabel:`同時從統計中移除`,purgeStatsHint:`從 Quick Stats(耗材、時間、成本、能耗)中移除符合的歸檔。未勾選時,Quick Stats 會保留所有貢獻,僅檔案從磁碟刪除。`,previewLoading:`檢查符合的歸檔數量…`,previewFailed:`無法預覽清除。`,previewSummary:`將移除 {{count}} 個歸檔 · {{size}}`,andMore:`…還有 {{count}} 個`,warning:`檔案會從磁碟刪除且無法復原。繼續前請下載或收藏您想保留的內容。`,confirmCta:`移除 {{count}} 個歸檔`,purging:`移除中…`,toast:{success:`已移除 {{count}} 個歸檔。`,failed:`無法清除歸檔。`}},archiveAutoPurge:{enableLabel:`自動清除舊歸檔`,enableDescription:`每天一次,將閾值內未列印的歸檔從清單中隱藏,並從磁碟中刪除其檔案。重新列印會重設計時器。`,ageLabel:`自動刪除最近未列印的歸檔:`,ageDescription:`最少 7 天,最多 10 年。基於最近一次列印完成 — 重新列印會重新整理年齡。刪除 3MF、縮圖、縮時攝影、原始 3MF、F3D 與照片。`,days:`天`,purgeStatsLabel:`同時從統計中移除`,purgeStatsDescription:`啟用後,每日清理任務還會將每個被清除的歸檔從 Quick Stats(耗材、時間、成本、能耗)中移除。預設關閉 — Quick Stats 會保留貢獻,僅檔案從磁碟刪除。`,runNow:`立即清除歸檔`,saveFailed:`無法儲存自動清除設定。`},cameraTokens:{scope:{camera_stream:`攝影機串流`,camwall:`攝影機牆`,overlay:`直播疊加層`},title:`攝影機 API 權杖`,navTitle:`攝影機 API 權杖`,description:`長期權杖,用於將攝影機串流嵌入 Home Assistant、Frigate、自助展示螢幕或其他需要穩定網址的工具。權限範圍在建立時選擇,權杖可隨時撤銷。`,loading:`載入中…`,confirmRevoke:{title:`撤銷此權杖?`,body:`使用「{{name}}」的任何裝置將立即失去存取權限。此操作無法復原。`,cancel:`取消`,confirm:`撤銷`},create:{scopeLabel:`權限範圍`,hintCameraStream:`攝影機串流權杖只能取得攝影機串流與快照。適用於 Home Assistant、Frigate 或任何嵌入單一攝影機的情境。`,hintCamWall:`攝影機牆權杖可在無須登入的螢幕上開啟 /camwall,能看到每台印表機的名稱與狀態以及攝影機串流,但看不到檔案名稱、位址或存取碼。`,hintOverlay:`直播疊加層權杖可在無須登入的螢幕上開啟 /overlay/{printerId}——供 OBS 或任何直播使用。它能看到一台印表機的攝影機串流以及即時列印狀態,包括螢幕上顯示的檔案名稱,但看不到位址或存取碼。`,title:`建立新權杖`,nameLabel:`權杖名稱`,namePlaceholder:`例如 Home Assistant`,daysLabel:`到期天數`,submit:`建立`,hint:`最大有效期 365 天。權杖值僅在建立時顯示一次 — 請立即複製。`},created:{camWallUrlTitle:`此螢幕的攝影機牆網址`,camWallUrlHint:`在螢幕上開啟此網址。任何能看到該網址的人都能觀看攝影機牆,請像對待鑰匙一樣對待它——撤銷權杖即可切斷該螢幕的存取。`,overlayUrlTitle:`用於 OBS 的疊加層網址`,overlayUrlHint:`在 OBS 中將其新增為「瀏覽器」來源(Browser Source)。將 /overlay/1 中的數字改為您印表機的編號(可在「印表機」頁面的網址中查看)。任何能看到該網址的人都能觀看直播,請像對待鑰匙一樣對待它——撤銷權杖即可切斷存取。`,title:`權杖已建立 — 立即複製`,warning:`這是此權杖唯一一次可見。關閉此對話框後您將無法再次查看。`,copy:`複製`,dismiss:`我已儲存`},list:{scope:`權限範圍`,myTitle:`我的權杖`,allTitle:`所有使用者(管理員視圖)`,empty:`尚無權杖。`,name:`名稱`,owner:`擁有者`,prefix:`前綴`,created:`建立時間`,expires:`到期時間`,lastUsed:`最近使用`,revoke:`撤銷`,expired:`已過期`},toast:{created:`權杖已建立`,createFailed:`建立權杖失敗`,revoked:`權杖已撤銷`,revokeFailed:`撤銷權杖失敗`,loadFailed:`載入權杖失敗`,copied:`已複製到剪貼簿`,copyFailed:`複製失敗 — 手動選擇並複製`}},forecast:{title:`庫存預測`,noSpools:`未找到活躍的料卷。請將料卷新增至庫存以查看預測資料。`,noUsageData:`無可用使用資料 — 無法預測庫存時間線。`,sku:`SKU`,material:`材料`,stock:`庫存`,dailyRate:`消耗率`,daysLeft:`剩餘天數`,emptyBy:`耗盡日期`,reorderBy:`補貨截止日`,actions:`操作`,trend:`趨勢`,estimated:`估算`,noData:`無資料`,timeframe:`時間範圍`,chartTitle:`庫存預測 — 前5種材料`,dashedLinesROP:`虛線 = 再訂貨點`,stockLevel:`庫存量`,reorderPoint:`再訂購點`,safetyMargin:`安全餘量`,trendLegend:`趨勢(基於歷史,95%服務水準)`,estimatedLegend:`估算(重量差值)`,noDataLegend:`無資料`,ropLabel:`再訂貨點`,ssLabel:`安全庫存`,safetyStockLegend:`安全庫存`,stockArrivalLegend:`到貨`,stockoutLegend:`斷貨`,alertCount_one:`{{count}}條警告`,alertCount_other:`{{count}}條警告`,order:`訂購`,globalLeadTime:`全域交貨期`,globalLeadTimeHint:`全域交貨期下限 — 用於所有 SKU 的再訂購點計算`,save:`儲存`,cancel:`取消`,settingsSaved:`設定已儲存`,failedSaveSettings:`儲存設定失敗`,globalLeadTimeSaved:`全域提前期已儲存`,skuLeadTimeOverride:`SKU 交貨期覆蓋`,skuLeadTimeHint:`0 = 使用全域交貨期。設定 >0 以覆蓋此 SKU。`,safetyMarginLabel:`安全餘量`,effectiveLeadTime:`有效交貨期`,effectiveLeadTimeHint:`max(全域 {{global}}天, SKU {{sku}}天)`,reorderPointHint:`d̄ × LT + safety margin — 當庫存降至此水準時下單`,safetyMarginHint:`統計安全庫存 (z=1.65 × σ × √LT) + 使用者自訂緩衝`,safetyMarginHintDays:`在統計安全庫存基礎上額外增加的緩衝。{{approx}}`,safetyMarginHintDaysApprox:` ≈ 按當前速率 {{g}}g。`,safetyMarginHintG:`在統計安全庫存基礎上增加的固定重量緩衝。{{approx}}`,safetyMarginHintGApprox:` ≈ 按當前速率 {{days}}天。`,individualSpools:`單個料卷`,labelWeight:`標示重量`,spoolCount_one:`{{count}}個線軸`,spoolCount_other:`{{count}}個線軸`,stockBreakRisk:`斷貨風險`,stockBreakBefore:`補貨前庫存斷檔`,stockBreakDetail:`剩餘 {{days}} 天,交貨期 {{lt}} 天。`,reorderNow:`立即補貨`,reorderTriggerPassed:`觸發日期 {{date}} 已過。`,shoppingList:`購物清單`,shoppingListItems_one:`({{count}}項)`,shoppingListItems_other:`({{count}}項)`,shoppingListEmpty:`購物清單為空。點擊任意列的購物車圖示以新增商品。`,addToCart:`新增至購物清單`,alertsSnoozed:`靜音此SKU的提醒`,alertsEnabled:`啟用此SKU的提醒`,addedToCart:`已新增至購物清單`,failedAddItem:`新增項目失敗`,listView:`列表`,logisticsView:`物流`,qty:`數量`,weight:`重量`,leadTime:`交貨期`,expectedRestock:`預計補貨日期`,status:`狀態`,note:`備註`,pending:`待處理`,purchased:`已購買`,received:`已收貨`,markPurchased:`標記為已購買`,markReceived:`標記為已收貨 — 將料卷新增至庫存`,resetToPending:`重置為待處理`,remove:`移除`,clearAll:`清空`,downloadCsv:`CSV`,addToCartTitle:`新增至購物清單`,byQuantity:`依數量`,byDuration:`依時長`,numberOfSpools:`線軸數量`,lastHowManyDays:`需要持續多少天?`,noUsageQty:`無使用資料 — 數量已設為1。`,noteOptional:`備註(選填)`,notePlaceholder:`例如:用於專案X,緊急…`,addNSpools_one:`新增{{count}}個線軸`,addNSpools_other:`新增{{count}}個線軸`,onArrival:`到貨時`,stockBreakIn:`{{days}} 天後斷貨。`,stockRunsOutBefore:`庫存在 {{lt}} 天交貨期結束前耗盡。`,atRate:`按 {{rate}}g/天的速度,您需要`,moreSpools_one:`再{{count}}個線軸`,moreSpools_other:`再{{count}}個線軸`,bridgeGap:`來彌補缺口。`,noReadAccess:`您沒有查看庫存預測的權限。`,noWriteAccess:`您沒有修改預測設定的權限。`}}},tr:{translation:{nav:{printers:`Yazıcılar`,archives:`Arşivler`,queue:`Baskı Kuyruğu`,stats:`İstatistikler`,profiles:`Profiller`,maintenance:`Bakım`,projects:`Projeler`,inventory:`Filament`,files:`Dosya Yöneticisi`,makerworld:`MakerWorld`,notifications:`Bildirimler`,settings:`Ayarlar`,system:`Sistem`,collapseSidebar:`Kenar çubuğunu daralt`,expandSidebar:`Kenar çubuğunu genişlet`,update:`Güncelle`,updateAvailable:`Güncelleme mevcut: v{{version}}`,updateAvailableBanner:`{{version}} sürümü kullanılabilir!`,viewUpdate:`Güncellemeyi gör`,viewOnGithub:`GitHub'da gör`,keyboardShortcuts:`Klavye kısayolları (?)`,switchToLight:`Açık moda geç`,switchToDark:`Koyu moda geç`,switchToSystem:`Sistem moduna geç`,smartSwitches:`Akıllı Anahtarlar`,logout:`Çıkış`,installApp:`Uygulamayı yükle`,installAppSuccess:`Bambuddy yüklendi`},common:{save:`Kaydet`,saving:`Kaydediliyor...`,cancel:`İptal`,delete:`Sil`,edit:`Düzenle`,add:`Ekle`,close:`Kapat`,confirm:`Onayla`,loading:`Yükleniyor...`,error:`Hata`,errorLoading:`Veri yüklenirken hata`,retry:`Yeniden dene`,success:`Başarılı`,warning:`Uyarı`,enabled:`Etkin`,disabled:`Devre dışı`,yes:`Evet`,no:`Hayır`,on:`Açık`,off:`Kapalı`,all:`Tümü`,none:`Hiçbiri`,search:`Ara`,filter:`Filtrele`,sort:`Sırala`,refresh:`Yenile`,download:`İndir`,upload:`Yükle`,uploading:`Yükleniyor...`,uploadFailed:`Yükleme başarısız`,actions:`İşlemler`,status:`Durum`,name:`Ad`,description:`Açıklama`,date:`Tarih`,time:`Saat`,hours:`saat`,minutes:`dakika`,seconds:`saniye`,days:`gün`,enable:`Etkinleştir`,disable:`Devre dışı bırak`,permissions:`İzinler`,noPrinters:`Yapılandırılmış yazıcı yok`,noData:`Veri yok`,linkNotFound:`Bağlantı bulunamadı`,required:`Zorunlu`,optional:`İsteğe bağlı`,dismiss:`Kapat`,apply:`Uygula`,reset:`Sıfırla`,export:`Dışa aktar`,import:`İçe aktar`,clear:`Temizle`,selectAll:`Tümünü Seç`,deselectAll:`Seçimi Kaldır`,noChange:`— Değişiklik yok —`,unchanged:`Değişmedi`,unassigned:`Atanmamış`,unknown:`Bilinmiyor`,unknownError:`Bilinmeyen hata`,today:`Bugün`,tomorrow:`Yarın`,asap:`En kısa sürede`,overdue:`Gecikmiş`,now:`Şimdi`,collapse:`Daralt`,expand:`Genişlet`,previous:`Önceki`,next:`Sonraki`,viewArchive:`Arşivi gör`,viewInFileManager:`Dosya Yöneticisinde gör`,addedBy:`{{username}} tarafından eklendi`,prints:`baskı`,more:`+{{count}} daha`,ascending:`Artan`,descending:`Azalan`,back:`Geri`,copy:`Kopyala`,copied:`Kopyalandı!`,printer:`Yazıcı`,remove:`Kaldır`,type:`Tür`,print:`Baskı`,rename:`Yeniden adlandır`,move:`Taşı`,create:`Oluştur`,duplicate:`Çoğalt`,left:`Sol`,right:`Sağ`},printers:{title:`Yazıcılar`,addPrinter:`Yazıcı Ekle`,addPreflight:{checking:`Bağlantı kontrol ediliyor...`,warning:`Bazı bağlantı kontrolleri başarısız oldu. Bu yazıcı çevrimdışı olarak görünebilir. Aşağıdaki kontrolleri inceleyin, düzeltebileceklerinizi düzeltin veya yine de kaydedin.`,back:`Geri`,saveAnyway:`Yine de kaydet`},editPrinter:`Yazıcıyı Düzenle`,deletePrinter:`Yazıcıyı Sil`,printerName:`Yazıcı Adı`,serialNumber:`Seri Numarası`,ipAddress:`IP Adresi / Ana Bilgisayar Adı`,accessCode:`Erişim Kodu`,model:`Model`,nozzleCount:`Nozul Sayısı`,autoArchive:`Otomatik Arşivle`,status:{available:`Müsait`,idle:`Boşta`,printing:`Baskıda`,paused:`Duraklatıldı`,offline:`Çevrimdışı`,problem:`Sorun`,error:`Hata`,finished:`Tamamlandı`,unknown:`Bilinmiyor`},temperatures:{nozzle:`Nozul`,bed:`Tabla`,chamber:`Hazne`},heaterHistory:{title:`Isıtıcı Geçmişi`,openLabel:`Isıtıcı geçmişini görüntüle`,nozzle:`Nozul`,nozzle2:`Nozul 2`,bed:`Tabla`,chamber:`Hazne`,error:`Geçmiş yüklenemedi`,empty:`Henüz veri kaydedilmedi`},progress:`%{{percent}} tamamlandı`,timeRemaining:`{{time}} kaldı`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz?`,maintenanceOk:`Bakım Tamam`,maintenanceWarning:`{{count}} uyarı`,maintenanceWarning_plural:`{{count}} uyarı`,maintenanceDue:`{{count}} bekliyor`,maintenanceDue_plural:`{{count}} bekliyor`,sort:{name:`Ad`,status:`Durum`,model:`Model`,location:`Konum`,eta:`Kalan süre`,ascending:`Artan sırala`,descending:`Azalan sırala`},cardSize:{small:`Küçük kartlar`,medium:`Orta kartlar`,large:`Büyük kartlar`,extraLarge:`Çok büyük kartlar`},pageView:{openCamWallPage:`Kamera duvarını sayfa olarak aç`,cards:`Kartlar`,camWall:`Kamera duvarı`},camWall:{page:{tokenRejected:`Bu kamera duvarı bağlantısı artık geçerli değil. Belirtecin süresi dolmuş veya belirteç iptal edilmiş olabilir.`,loadFailed:`Yazıcılar yüklenemedi.`},noPrinters:`Gösterilecek yazıcı yok`,noSignal:`Sinyal yok`,live:`Canlı`,snap:`Foto`,off:`Kapalı`,summary:`{{live}} canlı, {{snap}} fotoğraf, toplam {{total}}`,layer:`Katman {{cur}}/{{total}}`,timeLeft:`{{time}} kaldı`,statusMode:{off:`Kapalı`,compact:`Sade`,full:`Tam`},settings:{title:`Kamera duvarı ayarları`,maxLive:`Maks. canlı yayın`,maxLiveHint:`Aynı anda kaç döşemenin canlı yayın yaptığı. Diğerleri foto olarak yenilenir.`,snapshotInterval:`Foto aralığı (saniye)`,snapshotIntervalHint:`Canlı olmayan döşemelerin ne sıklıkla yeni bir foto aldığı.`,statusOverlay:`Durum kaplaması`,statusOverlayHint:`Sade: yalnızca durum rozeti. Tam: + ilerleme, katman, kalan süre.`}},hideOffline:`Çevrimdışı olanları gizle`,nextAvailable:`Sıradaki müsait`,powerOn:`Aç`,offlinePrintersWithPlugs:`Akıllı prizli çevrimdışı yazıcılar`,noPrintersConfigured:`Henüz yapılandırılmış yazıcı yok`,search:`Yazıcı ara...`,noSearchResults:`Aramanıza veya filtrelerinize uyan yazıcı yok`,filter:{allStatuses:`Tüm durumlar`,allLocations:`Tüm konumlar`},toolbar:{filters:`Filtreler`,view:`Görünüm`,actions:`İşlemler`},readyToPrint:`Baskıya hazır`,external:`Harici`,extL:`Ext-L`,extR:`Ext-R`,deleteArchives:`Baskı arşivlerini sil`,noLabel:`Etiket yok`,printPreview:`Baskı önizleme`,width:`Genişlik`,height:`Yükseklik`,noObjectsFound:`Nesne bulunamadı`,objectsLoadedOnPrintStart:`Nesneler baskı başladığında yüklenir`,willBeSkipped:`Atlanacak`,name:`Ad`,serialCannotBeChanged:`Seri numarası değiştirilemez`,locationHelp:`Yazıcıları gruplamak ve kuyruk işlerini filtrelemek için kullanılır`,wifiSignal:{veryWeak:`Çok zayıf`,weak:`Zayıf`,fair:`Orta`,good:`İyi`,excellent:`Mükemmel`},maintenanceUpToDate:`Tüm bakım güncel - Görüntülemek için tıklayın`,maintenance:{title:`Bakımda`,subtitle:`Bu yazıcı duraklatıldı — bağlı değil, kuyruğa uygun değil, bildirim göndermiyor.`,pillLabel:`Bakım`,exitButton:`Bakımdan çık`,menuEnter:`Bakım moduna gir`,menuExit:`Bakım modundan çık`,toastEntered:`{{name}} artık bakım modunda`,toastExited:`{{name}} tekrar çevrimiçi`,confirmMidPrintTitle:`Yazdırma sırasında bakım moduna geçilsin mi?`,confirmMidPrintMessage:`{{name}} şu anda yazdırıyor. Bakım moduna geçmek MQTT bağlantısını kesecek ve bu iş için ilerleme takibi ile tamamlanma bildirimlerini durduracak. Devam edilsin mi?`,editFieldLabel:`Bakım modu`,editFieldHelp:`Etkinleştirildiğinde, bu yazıcı MQTT, kuyruk gönderimi ve bildirimlerden duraklatılır — tamir, paralel Bambuddy kurulumları veya geçici askıya alma için kullanışlıdır.`},chamberLightOn:`Hazne ışığını aç`,chamberLightOff:`Hazne ışığını kapat`,files:`Dosyalar`,browseFiles:`Yazıcı dosyalarına göz at`,autoOffAfterPrint:`Baskı sonrası otomatik kapat`,autoOffExecuted:`Otomatik kapama uygulandı - sıfırlamak için yazıcıyı açın`,hmsErrors:`HMS Hataları`,viewHmsErrors:`{{count}} HMS hatasını gör`,resume:`Devam Et`,pause:`Duraklat`,stop:`Durdur`,camera:`Kamera`,skipObject:`Nesneyi Atla`,reconnect:`Yeniden Bağlan`,forceRefresh:`Zorla Yenile`,forceRefreshSuccess:`Yenileme istendi`,mqttDebug:`MQTT Hata Ayıklama`,printerInformation:`Yazıcı Bilgisi`,copyToClipboard:`Kopyala`,copied:`Kopyalandı!`,state:`Durum`,wifiSignalLabel:`WiFi Sinyali`,developerMode:`Geliştirici Modu`,enabled:`Etkin`,disabled:`Devre dışı`,addedOn:`Eklendi`,sdCard:`SD Kart`,inserted:`Takılı`,notInserted:`Takılı değil`,totalPrintHours:`Baskı Saatleri`,activeNozzle:`Aktif: {{nozzle}} nozul`,nozzleRack:`Nozul Rafı`,nozzleDocked:`Yuvalanmış`,nozzleMounted:`Takılı`,nozzleActive:`Aktif`,nozzleIdle:`Boşta`,nozzleDiameter:`Çap`,nozzleType:`Tür`,nozzleStatus:`Durum`,nozzleFilament:`Filament`,nozzleWear:`Aşınma`,nozzleMaxTemp:`Maks. Sıcaklık`,nozzleSerial:`Seri`,nozzleHardenedSteel:`Sertleştirilmiş Çelik`,nozzleStainlessSteel:`Paslanmaz Çelik`,nozzleTungstenCarbide:`Tungsten Karbür`,nozzleFlow:`Akış`,nozzleHighFlow:`Yüksek Akış`,nozzleStandardFlow:`Standart`,firmwareUpdate:`Firmware Güncellemesi`,firmwareInstructions:`Yazıcının dokunmatik ekranında şuraya gidin:`,firmwareNav:`Şuraya gidin`,settings:`Ayarlar`,firmware:`Firmware`,discoverPrinters:`Yazıcıları Keşfet`,searching:`Aranıyor...`,manualEntry:`Manuel Giriş`,addFromCloud:`Bulut'tan Ekle`,toast:{printerDeleted:`Yazıcı silindi`,missingSpoolAssignment:`{{printer}} üzerinde baskı başladı. Şunlar için eksik makara ataması: {{slots}}`,printerAdded:`Yazıcı eklendi`,printerUpdated:`Yazıcı güncellendi`,failedToDelete:`Yazıcı silinemedi`,failedToAdd:`Yazıcı eklenemedi`,connectionFailedNotAdded:`Yazıcıya bağlanılamadı. IP, seri numarası ve erişim kodunu doğrulayın ve yalnızca LAN modunun açık olduğunu onaylayın. Yazıcı eklenmedi.`,failedToUpdate:`Yazıcı güncellenemedi`,commandSent:`Komut gönderildi`,failedToSendCommand:`Komut gönderilemedi`,turnedOn:`{{name}} açıldı`,failedToPowerOn:`{{name}} açılamadı`,scriptTriggered:`Betik tetiklendi`,printStopped:`Baskı durduruldu`,printPaused:`Baskı duraklatıldı`,printResumed:`Baskıya devam edildi`,referenceDeleted:`Referans silindi`,detectionAreaSaved:`Algılama alanı kaydedildi`,failedToRunScript:`Betik çalıştırılamadı`,failedToStopPrint:`Baskı durdurulamadı`,failedToPausePrint:`Baskı duraklatılamadı`,failedToResumePrint:`Baskıya devam edilemedi`,failedToControlChamberLight:`Hazne ışığı kontrol edilemedi`,failedToSetSpeed:`Baskı hızı ayarlanamadı`,failedToUpdateSetting:`Ayar güncellenemedi`,failedToSkipObjects:`Nesneler atlanamadı`,failedToRereadRfid:`RFID yeniden okunamadı`,failedToCheckPlate:`Plaka kontrol edilemedi`,failedToUpdateLabel:`Etiket güncellenemedi`,failedToDeleteReference:`Referans silinemedi`,failedToSaveDetectionArea:`Algılama alanı kaydedilemedi`,plateCheckEnabled:`Plaka kontrolü etkinleştirildi`,plateCheckDisabled:`Plaka kontrolü devre dışı bırakıldı`,calibrationSaved:`Kalibrasyon kaydedildi!`,calibrationFailed:`Kalibrasyon başarısız`,rfidRereadInitiated:`RFID yeniden okuma başlatıldı`,loadInitiated:`Filament yükleniyor…`,unloadInitiated:`Filament çıkarılıyor…`,failedToLoad:`Filament yüklenemedi`,failedToUnload:`Filament çıkarılamadı`},connection:{connected:`Bağlı`,offline:`Çevrimdışı`},plateStatus:{markCleared:`Plakayı temizlendi olarak işaretle`,cleared:`Plaka Temiz`,notCleared:`Plaka Temiz Değil`,inUse:`Plaka Kullanımda`},queue:{inQueue:`Kuyrukta {{count}} baskı`,inQueue_plural:`Kuyrukta {{count}} baskı`},controls:`Kontroller`,rfid:{reread:`RFID'yi yeniden oku`},ams:{load:`Yükle`,unload:`Çıkar`},bedJog:{limitWarning:`Manuel hareketlerde hareket sınırları uygulanmaz — bir Bambu donanım yazılımı hatası, uzaktan komutlarda yazılım limit anahtarlarını yok sayar. Çarpışmayı önlemek için dikkatlice hareket ettirin.`,title:`Jog kontrolleri`,bed:`Tabla`,step:`Adım (mm)`,up:`Plakayı yukarı hareket ettir`,down:`Plakayı aşağı hareket ettir`,disabledWhilePrinting:`Baskı sırasında devre dışı`,notHomedTitle:`Yazıcı sıfırlanmamış`,notHomedMessage:`Yazıcı son baskıdan bu yana sıfırlanmadı. Güvenli konumlandırma için önce otomatik sıfırlamayı çalıştırın (kafayı park eder, ardından X, Y ve Z sıfırlanır) veya yine de hareket ettirin — yazılım son durakları atlanır.`,homeZ:`Otomatik Sıfırla`,moveAnyway:`Yine de hareket ettir`,homingStarted:`Yazıcı otomatik sıfırlanıyor…`},permission:{noAdd:`Yazıcı eklemek için izniniz yok`,noEdit:`Yazıcıları düzenlemek için izniniz yok`,noDelete:`Yazıcıları silmek için izniniz yok`,noControl:`Yazıcıları kontrol etmek için izniniz yok`,noFiles:`Yazıcı dosyalarına erişim izniniz yok`,noAmsRfid:`AMS RFID'yi yeniden okumak için izniniz yok`,noSmartPlugControl:`Akıllı prizleri kontrol etme izniniz yok`,noCamera:`Kameraları görüntüleme izniniz yok`},modal:{addTitle:`Yazıcı Ekle`,editTitle:`Yazıcıyı Düzenle`,myPrinter:`Yazıcım`,selectModel:`Model seç...`,locationGroup:`Konum / Grup (isteğe bağlı)`,locationPlaceholder:`örn., Atölye, Ofis, Bodrum`,autoArchiveLabel:`Tamamlanan baskıları otomatik arşivle`,fromPrinterSettings:`Yazıcı ayarlarından`,modelOptional:`Model (isteğe bağlı)`,saveChanges:`Değişiklikleri Kaydet`},skipObjects:{tooltip:`Nesneleri atla`,onlyWhilePrinting:`Nesneleri atla (yalnızca baskı sırasında)`,requiresMultiple:`Nesneleri atla (2+ nesne gerektirir)`,title:`Nesneleri Atla`,matchIdsInfo:`ID'leri yazıcı ekranınızla eşleştirin`,printerShowsIds:`Yazıcı ekranı baskı plakasındaki nesne ID'lerini gösterir`,skipSelected:`Seçilenleri Atla`,skipping:`Atlanıyor...`,noObjectsSelected:`Hiçbir nesne seçilmedi`,selectObjectsToSkip:`Mevcut baskıdan atlamak istediğiniz nesneleri seçin`,skipped:`atlandı`,objectsSkipped:`Nesneler atlandı`,activeCount:`{{count}} aktif`,waitForLayer:`Nesneleri atlamak için 2+ katmanı bekleyin (şu an katman {{layer}})`,skip:`Atla`,confirmTitle:`Nesne Atlansın mı?`,confirmMessage:`"{{name}}" atlamak istediğinizden emin misiniz? Bu geri alınamaz.`},confirm:{deleteTitle:`Yazıcıyı Sil`,deleteMessage:`"{{name}}" silmek istediğinizden emin misiniz? Bu, tüm bağlantı ayarlarını kaldıracak.`,deleteArchivesNote:`Bu yazıcı için tüm baskı geçmişi kalıcı olarak silinecek.`,keepArchivesNote:`Baskı geçmişi saklanacak ancak artık bu yazıcıyla ilişkilendirilmeyecek.`,stopTitle:`Baskıyı Durdur`,stopMessage:`"{{name}}" üzerindeki mevcut baskıyı durdurmak istediğinizden emin misiniz? Bu, baskı işini iptal edecek.`,stopButton:`Baskıyı Durdur`,pauseTitle:`Baskıyı Duraklat`,pauseMessage:`"{{name}}" üzerindeki mevcut baskıyı duraklatmak istediğinizden emin misiniz?`,pauseButton:`Baskıyı Duraklat`,resumeTitle:`Baskıya Devam Et`,resumeMessage:`"{{name}}" üzerindeki baskıya devam etmek istediğinizden emin misiniz?`,resumeButton:`Baskıya Devam Et`,powerOnTitle:`Yazıcıyı Aç`,powerOnMessage:`"{{name}}" için gücü AÇMAK istediğinizden emin misiniz?`,powerOnButton:`Aç`,powerOffTitle:`Yazıcıyı Kapat`,powerOffMessage:`"{{name}}" için gücü KAPATMAK istediğinizden emin misiniz?`,powerOffWarning:`UYARI: "{{name}}" şu anda baskı yapıyor! Gücü KAPATMAK istediğinizden emin misiniz? Bu, baskıyı kesintiye uğratacak ve yazıcıya zarar verebilir.`,powerOffButton:`Kapat`,haToggleTitle:`"{{name}}" Aç/Kapat`,haToggleMessage:`Home Assistant varlığı {{entity}} açılıp kapatılsın mı? Şu anda açıksa güç kesilebilir.`,haToggleWarning:`UYARI: "{{name}}" şu anda baskı yapıyor! {{entity}} açılıp kapatılması gücü kesip baskıyı kesintiye uğratabilir. Devam edilsin mi?`,haToggleButton:`Aç/Kapat`},bulk:{select:`Seç`,selectAll:`Tümünü Seç`,selectByLocation:`Konuma Göre Seç`,selected:`{{count}} seçildi`,actions:{stop:`Durdur`,pause:`Duraklat`,resume:`Devam Et`,clearPlate:`Tablayı Temizle`,clearHMS:`Bildirimleri Temizle`},confirm:{stopTitle:`{{count}} Baskıyı Durdur`,stopMessage:`Bu, {{count}} yazıcı üzerindeki aktif baskıları iptal edecek. Bu işlem geri alınamaz.`,stopButton:`Hepsini Durdur`,pauseTitle:`{{count}} Baskıyı Duraklat`,pauseMessage:`Bu, {{count}} yazıcı üzerindeki aktif baskıları duraklatacak.`,pauseButton:`Hepsini Duraklat`,clearPlateTitle:`{{count}} Baskı Tablasını Temizle`,clearPlateMessage:`Bu, {{count}} yazıcının baskı tablasını temizleyecek ve kuyruktaki işleri tetikleyebilir.`,clearPlateButton:`Hepsini Temizle`},success:`{{count}} yazıcı üzerinde {{action}} tamamlandı`,partial:`{{succeeded}} başarılı, {{failed}} başarısız`,noneApplicable:`Seçilen yazıcılar bu işlem için doğru durumda değil`,selectByState:`Duruma Göre Seç`},discovery:{title:`Yazıcıları Keşfet`,searching:`Aranıyor...`,scanning:`Taranıyor...`,scanProgress:`Taranıyor... {{scanned}}/{{total}}`,foundPrinters:`{{count}} yazıcı bulundu`,noPrintersFound:`Yazıcı bulunamadı`,noPrintersFoundSubnet:`Belirtilen alt ağda yazıcı bulunamadı.`,noPrintersFoundNetwork:`Ağda yazıcı bulunamadı.`,allConfigured:`Keşfedilen tüm yazıcılar zaten yapılandırılmış.`,alreadyAdded:`Zaten eklendi`,select:`Seç`,manualEntry:`Manuel Giriş`,addFromCloud:`Bulut'tan Ekle`,subnetToScan:`Taranacak alt ağ`,dockerNote:`Docker algılandı. Yazıcınızın alt ağını CIDR gösteriminde girin. docker-compose.yml'de network_mode: host gerektirir.`,scanSubnet:`Yazıcılar için Alt Ağı Tara`,discoverNetwork:`Ağda Yazıcıları Keşfet`,scanningSubnet:`Bambu yazıcıları için alt ağ taranıyor...`,scanningNetwork:`Ağ taranıyor...`,serialRequired:`Seri numarası gerekli`,unknown:`Bilinmiyor`,failedToStart:`Keşif başlatılamadı`,customSubnetOption:`Özel alt ağ...`,customSubnetLabel:`Özel alt ağ (CIDR)`,customSubnetNote:`Yazıcınız bu sunucudan farklı bir ağda ise özel bir alt ağ kullanın. FTP (990) ve MQTT (8883) bağlantı noktaları yönlendirme sınırı boyunca erişilebilir olmalıdır.`},drying:{start:`Kurutmayı Başlat`,stop:`Kurutmayı Durdur`,temperature:`Sıcaklık`,duration:`Süre`,hours:`saat`,timeRemaining:`{{time}} kaldı`,active:`Kurutuluyor`,targetSummary:`{{filament}} @ {{temp}}°C`,notSupported:`Kurutma desteklenmiyor`,powerRequired:`Kurutmayı etkinleştirmek için AMS güç adaptörünü bağlayın`,startingDrying:`Kurutma başlatılıyor...`,toastCommandSent:`Kurutma komutu gönderildi`,toastStopped:`Kurutma durduruldu`,toastNotStarted:`Yazıcı komutu kabul etti ancak AMS kurutmayı başlatmadı. AMS güç adaptörünün bağlı olduğundan ve yazıcının boşta olduğundan emin olun.`,screenOnly:`Bu yazıcıda AMS kurutma yalnızca yazıcının kendi ekranından kontrol edilebilir (Bambu kısıtlaması)`,stoppingDrying:`Kurutma durduruluyor...`,rotateTray:`Kurutma sırasında makarayı döndür`,rotateUnavailableReason:`Kullanılamaz — bu AMS'nin bir yuvası kafaya doğru yüklenmiş durumda. Makara besleme borusu tarafından kilitlendiği için döndürülemez. Önce filamenti geri çekin.`},amsBackup:{titleOn:`AMS Filament Backup AÇIK. Devre dışı bırakmak için tıklayın.`,titleOff:`AMS Filament Backup KAPALI. Etkinleştirmek için tıklayın.`,titleUnknown:`Bu yazıcıda AMS Filament Backup durumu kullanılamıyor.`,toastEnabled:`AMS Filament Backup etkinleştirildi`,toastDisabled:`AMS Filament Backup devre dışı bırakıldı`,modalTitle:`AMS Filament Backup`,modalHelp:`Aktif slot tükendiğinde, yazıcı aynı ön ayar ve renkteki slotları bu sırayla dolaşır.`,modalNoSlots:`Yüklenmiş filament yok.`,modalNoPairs:`Yedek çifti yok — hiçbir slot çifti aynı ön ayar ve rengi paylaşmıyor.`,extruderRightShort:`S`,extruderLeftShort:`L`,stateOn:`Etkin`,stateOff:`Devre dışı`,stateUnknown:`Bu yazıcıda desteklenmiyor`},activeJobSlot:{title:`Bu slot, aktif baskıdaki {{n}} numaralı filament`,ariaLabel:`Aktif baskı slotu {{n}}`},expectedSlot:{title:`Yazıcı bu slotta filament bekliyor`,ariaLabel:`Beklenen filament slotu {{n}}`,label:`{{ams}} · Slot {{slot}}`,external:`Harici makara`},filaments:`Filamentler`,openCameraOverlay:`Kamera bindirmesini aç`,openCameraWindow:`Kamerayı yeni pencerede aç`,firmwareUpdateAvailable:`Firmware güncellemesi mevcut: {{current}} → {{latest}}`,firmwareUpToDate:`Firmware {{version}} — Güncel`,firmwareUpdateButton:`Güncelle`,plateDetection:{noPermission:`Yazıcıları güncellemek için izniniz yok`,enabledClick:`Plaka kontrolü etkin - Devre dışı bırakmak için tıklayın`,disabledClick:`Plaka kontrolü devre dışı - Etkinleştirmek için tıklayın`,manageCalibration:`Plaka algılama kalibrasyonunu yönet`,calibrationRequired:`Kalibrasyon Gerekli`,calibrationInstructions:`Lütfen baskı plakasının tamamen boş olduğundan emin olun, ardından Kalibre Et'e tıklayın.`,calibrationDescription:`Kalibrasyon, boş plakanın referans görüntüsünü yakalar. Gelecekteki kontroller, nesneleri algılamak için bu referansa karşı karşılaştırılır.`,calibrationTip:`İpucu: Farklı plakalar için 5 kalibrasyona kadar saklayabilirsiniz. Sistem, kontrol sırasında en iyi eşleşmeyi otomatik olarak kullanır.`,plateEmpty:`Plaka boş görünüyor`,objectsDetected:`Plakada nesneler algılandı`,confidence:`Güven`,difference:`Fark`,analysisPreview:`Analiz önizlemesi:`,analysisLegend:`Yeşil kutu = algılama alanı, Kırmızı kaplama = kalibrasyondan farklar`,savedReferences:`Kaydedilen Referanslar ({{count}}/{{max}})`,deleteReference:`Referansı sil`,labelPlaceholder:`Etiket...`,clickToEdit:`{{label}} - Düzenlemek için tıklayın`,clickToAddLabel:`Etiket eklemek için tıklayın`},speed:{title:`Baskı Hızı`,silent:`Sessiz (%50)`,standard:`Standart (%100)`,sport:`Spor (%124)`,ludicrous:`Çılgın (%166)`},airduct:{title:`Hava Kanalı Modu`,cooling:`Soğutma`,heating:`Isıtma`},noSdCard:`SD Yok`,door:{open:`Açık`,closed:`Kapalı`},fans:{partCooling:`Parça Soğutma Fanı`,auxiliary:`Yardımcı Fan`,chamber:`Hazne Fanı`},clickToViewHmsErrors:`HMS hatalarını görüntülemek için tıklayın`,estimatedCompletion:`Tahmini tamamlanma süresi`,plateNumber:`Plaka {{number}}`,slotOptions:`Yuva seçenekleri`,amsPopup:{friendlyName:`AMS Adı`,friendlyNamePlaceholder:`örn. AMS Kolay Adı`,serialNumber:`Seri Numarası`,firmwareVersion:`Firmware`,save:`Kaydet`,clear:`Temizle`,noEditPermission:`AMS birimlerini yeniden adlandırma izniniz yok`},firmwareModal:{title:`Firmware Güncellemesi`,titleUpToDate:`Firmware Bilgisi`,currentVersion:`Mevcut:`,latestVersion:`En son:`,releaseNotes:`Sürüm Notları`,checkingPrereqs:`Önkoşullar kontrol ediliyor...`,sdCardReady:`SD kart hazır. Firmware yüklemek için aşağıya tıklayın.`,uploadedSuccess:`Firmware SD karta yüklendi!`,applyInstructions:`Güncellemeyi yazıcınıza uygulamak için:`,step1:`Yazıcının dokunmatik ekranında Ayarlar'a gidin`,step2:`Firmware'e gidin`,step3:`SD karttan güncelle'yi seçin`,step4:`Güncelleme 10-20 dakika sürer`,done:`Tamam`,starting:`Başlatılıyor...`,uploadFirmware:`Firmware Yükle`,uploadFailed:`Yükleme başlatılamadı: {{error}}`,uploadedToast:`Firmware yüklendi! Güncellemeyi yazıcı ekranından tetikleyin.`,availableVersions:`Kullanılabilir sürümler`,usable:`Kullanılabilir`,unavailable:`Kullanılamaz`,installed:`Yüklü`,newerBadge:`daha yeni`,olderBadge:`daha eski`,currentBadge:`mevcut`},accessCodePlaceholder:`Mevcut olanı korumak için boş bırakın`,roi:{title:`Algılama Alanı (ROI)`,xStart:`X Başlangıç`,yStart:`Y Başlangıç`,width:`Genişlik`,height:`Yükseklik`,instruction:`Baskı plakasına odaklanmak için algılama alanını ayarlayın. Önizlemedeki yeşil kutu mevcut alanı gösterir.`},developerModeWarning:`Geliştirici LAN modu şunlarda etkin değil: {{names}}. Bazı özellikler çalışmayabilir.`,howToEnable:`Nasıl etkinleştirilir`,incompatibleFile:`Bu dosya {{slicedFor}} için dilimlendi, ancak bu yazıcı bir {{printerModel}}`,dropNotPrintable:`Yalnızca .gcode ve .gcode.3mf dosyaları yazdırılabilir`,dropToPrint:`Yazdırmak için bırakın`,cannotPrint:`Yazıcı meşgul`},archives:{title:`Baskı Arşivleri`,no3mfBanner:{title:`Bazı son baskılar küçük resimlerle birlikte arşivlenemedi`,body:`Dilimleyici yazıcının SD kartına .gcode.3mf dosyasını bırakmadı, bu nedenle Bambuddy küçük resmi veya dilimleyici meta verilerini alamadı. Bu genellikle dilimleyicide (Bambu Studio / OrcaSlicer'in Cihaz sekmesi) "Gönderilen dosyaları harici depolamada sakla" seçeneğinin kapalı olmasından kaynaklanır.`,docsLink:`Kurulum adımı 4'ü görüntüle`,dismissLabel:`Bu bildirimi kapat`},searchPlaceholder:`Arşivlerde ara...`,filterByPrinter:`Yazıcıya göre filtrele`,filterByStatus:`Duruma göre filtrele`,sortBy:`Sıralama`,sortNewest:`Önce en yeni`,sortOldest:`Önce en eski`,sortName:`Ad`,sortDuration:`Süre`,sortLargest:`Önce en büyük`,sortSmallest:`Önce en küçük`,sortSize:`Boyut`,noArchives:`Arşiv bulunamadı`,noArchivesSearch:`Aramanızla eşleşen arşiv yok`,originalPrintNotVisible:`Orijinal baskı görünmüyor - filtreleri temizlemeyi deneyin`,noArchivesYet:`Henüz arşiv yok`,prints:`baskı`,pagination:{showing:`Gösterilen`,to:`-`,of:`/`,show:`Göster`,page:`Sayfa`,all:`Tümü`},loadingArchives:`Arşivler yükleniyor...`,releaseToUpload:`Yüklemek için bırakın`,showAll:`Tümünü göster`,showFavoritesOnly:`Yalnızca favorileri göster`,gridView:`Izgara görünümü`,listView:`Liste görünümü`,calendarView:`Takvim görünümü`,logView:`Baskı Günlüğü`,manageTags:`Etiketleri Yönet`,showFailedPrints:`Başarısız baskıları göster`,hideFailedPrints:`Başarısız baskıları gizle`,hideDuplicates:`Tekrarları Gizle`,viewOriginalPrint:`Orijinal baskıyı görüntülemek için tıklayın (#{{id}})`,printTime:`Baskı Süresi`,filamentUsed:`Kullanılan Filament`,cost:`Maliyet`,preview:`Önizleme`,deleteArchive:`Arşivi Sil`,deleteConfirm:`Bu arşivi silmek istediğinizden emin misiniz?`,favorite:`Favori`,unfavorite:`Favorilerden kaldır`,viewDetails:`Detayları Görüntüle`,status:{completed:`Tamamlandı`,failed:`Başarısız`,stopped:`Durduruldu`},toast:{source3mfAttached:`Kaynak 3MF eklendi: {{filename}}`,failedUploadSource3mf:`Kaynak 3MF yüklenemedi`,source3mfRemoved:`Kaynak 3MF kaldırıldı`,failedRemoveSource3mf:`Kaynak 3MF kaldırılamadı`,f3dAttached:`F3D eklendi: {{filename}}`,failedUploadF3d:`F3D yüklenemedi`,f3dRemoved:`F3D kaldırıldı`,failedRemoveF3d:`F3D kaldırılamadı`,timelapseAttached:`Zaman atlamalı video eklendi: {{filename}}`,timelapseAlreadyAttached:`Zaman atlamalı video zaten eklendi`,noMatchingTimelapse:`Eşleşen zaman atlamalı video bulunamadı`,failedScanTimelapse:`Zaman atlamalı video taranamadı`,failedAttachTimelapse:`Zaman atlamalı video eklenemedi`,timelapseRemoved:`Zaman atlamalı video kaldırıldı`,failedRemoveTimelapse:`Zaman atlamalı video kaldırılamadı`,timelapseUploaded:`Zaman atlamalı video yüklendi: {{filename}}`,failedUploadTimelapse:`Zaman atlamalı video yüklenemedi`,archiveDeleted:`Arşiv silindi`,failedDeleteArchive:`Arşiv silinemedi`,addedToFavorites:`Favorilere eklendi`,removedFromFavorites:`Favorilerden kaldırıldı`,projectUpdated:`Proje güncellendi`,failedUpdateProject:`Proje güncellenemedi`,linkCopied:`Bağlantı panoya kopyalandı`,failedCopyLink:`Bağlantı kopyalanamadı`,photoDeleted:`Fotoğraf silindi`,failedDeletePhoto:`Fotoğraf silinemedi`,failedDeleteArchives:`Arşivler silinemedi`,failedUpdateFavorites:`Favoriler güncellenemedi`,exportDownloaded:`Dışa aktarma indirildi`,exportFailed:`Dışa aktarma başarısız`},menu:{print:`Yazdır`,openInBambuStudio:`Dilimleyicide Aç`,slice:`Dilimle`,externalLink:`Harici Bağlantı`,viewOnMakerWorld:`MakerWorld'de Görüntüle`,preview3d:`3B Önizleme`,viewTimelapse:`Zaman Atlamalı Videoyu Görüntüle`,scanForTimelapse:`Zaman Atlamalı Video Tara`,uploadTimelapse:`Zaman Atlamalı Video Yükle`,removeTimelapse:`Zaman Atlamalı Videoyu Kaldır`,downloadSource3mf:`Kaynak 3MF İndir`,uploadSource3mf:`Kaynak 3MF Yükle`,replaceSource3mf:`Kaynak 3MF Değiştir`,removeSource3mf:`Kaynak 3MF Kaldır`,uploadF3d:`F3D Yükle`,replaceF3d:`F3D Değiştir`,downloadF3d:`F3D İndir`,removeF3d:`F3D Kaldır`,download:`İndir`,copyDownloadLink:`İndirme Bağlantısını Kopyala`,qrCode:`QR Kod`,viewPhotos:`Fotoğrafları Görüntüle`,viewPhotosCount:`Fotoğrafları Görüntüle ({{count}})`,projectPage:`Proje Sayfası`,addToFavorites:`Favorilere Ekle`,removeFromFavorites:`Favorilerden Kaldır`,edit:`Düzenle`,printLog:`Baskı Günlüğü`,goToProject:`Projeye Git: {{name}}`,addToProject:`Projeye Ekle`,removeFromProject:`Projeden Kaldır`,loading:`Yükleniyor...`,noProjectsAvailable:`Kullanılabilir proje yok`,searchProjects:`Projelerde ara…`,select:`Seç`,deselect:`Seçimi Kaldır`,delete:`Sil`},permission:{noReprint:`Bu arşivi yeniden yazdırma izniniz yok`,noAddToQueue:`Kuyruğa ekleme izniniz yok`,noUpdateArchives:`Arşivleri güncelleme izniniz yok`,noUploadFiles:`Dosya yükleme izniniz yok`,noDownload:`Arşivleri indirme izniniz yok`,noCopyLink:`İndirme bağlantılarını kopyalama izniniz yok`,noDelete:`Bu arşivi silme izniniz yok`,noEdit:`Bu girişi düzenleme izniniz yok`,noCreate:`Arşiv oluşturma izniniz yok`},platePicker:{title:`Önizleme için plaka seçin`,hint:`Bu arşivde birden fazla plaka var. GCode görüntüleyicide açmak için birini seçin.`,plateLabel:`Plaka {{index}}`,objectCount:`{{count}} nesne`,objectCount_plural:`{{count}} nesne`,noGcode:`Bu arşivin önizleme için dilimlenmiş G-kodu yok. Önce dilimlemek için Bambu Studio'da açın.`},card:{previousPlate:`Önceki plaka`,nextPlate:`Sonraki plaka`,plateNumber:`Plaka {{index}}`,moreOptions:`Daha fazla seçenek için sağ tıklayın`,addToFavorites:`Favorilere ekle`,removeFromFavorites:`Favorilerden kaldır`,cancelled:`iptal edildi`,failed:`başarısız`,duplicate:`tekrar`,duplicateTitle:`Bu model daha önce yazdırıldı`,openSource3mf:`Kaynak 3MF'yi Bambu Studio'da aç (daha fazla seçenek için sağ tıklayın)`,downloadF3d:`Fusion 360 tasarım dosyasını indir`,viewTimelapse:`Zaman atlamalı videoyu görüntüle`,viewPhoto:`1 fotoğrafı görüntüle`,viewPhotos:`{{count}} fotoğrafı görüntüle`,openFolder:`Klasörü aç: {{name}}`,slicedFile:`Dilimlenmiş dosya - yazdırmaya hazır`,sourceFile:`Yalnızca kaynak dosya - AMS eşlemesi mevcut değil`,gcode:`GCODE`,source:`KAYNAK`,project:`Proje: {{name}}`,runsBadge:`{{count}} baskı`,runsBadgeTitle:`Toplam {{count}} baskı — {{successful}} başarılı, {{failed}} başarısız. Tam baskı günlüğünü görmek için tıklayın.`,estimated:`Tahmini: {{time}}`,actual:`Gerçek: {{time}}`,accuracy:`Doğruluk: %{{percent}}`,filament:`{{weight}}g`,layer:`{{count}} katman`,layers:`{{count}} katman`,object:`{{count}} nesne`,objects:`{{count}} nesne`,slicedFor:`{{model}} için dilimlendi`,uploadedBy:`Yükleyen`,noPermissionReprint:`Yeniden yazdırma izniniz yok`,noFileForReprint:`Kullanılabilir 3MF dosyası yok — baskı kaydedildiğinde dosya yazıcıdan indirilemedi`,noPermissionEdit:`Arşivleri düzenleme izniniz yok`,noPermissionDelete:`Arşivleri silme izniniz yok`,openInBambuStudio:`Dilimleyicide Aç`,openInBambuStudioToSlice:`Dilimlemek için Dilimleyicide Aç`,slice:`Dilimle`,externalLink:`Harici Bağlantı`,makerWorld:`MakerWorld: {{designer}}`,viewProject:`Projeyi görüntüle`,noExternalLink:`Harici bağlantı yok`,preview3d:`3B Önizleme`,download:`İndir`,edit:`Düzenle`,delete:`Sil`},runLog:{title:`Baskı Günlüğü`,modalTitle:`Baskı Günlüğü — {{name}}`,modalTitleFallback:`bu arşiv`,empty:`Bu arşiv için henüz baskı olayı kaydedilmedi.`,col:{date:`Tarih`,status:`Durum`,duration:`Süre`,filament:`Filament`,cost:`Maliyet`},status:{completed:`Tamamlandı`,failed:`Başarısız`,cancelled:`İptal edildi`,stopped:`Durduruldu`,skipped:`Atlandı`,printing:`Yazdırılıyor`}},modal:{deleteArchive:`Arşivi Sil`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.`,deleteButton:`Sil`,deletePurgeStats:`Ayrıca bu baskıyı Hızlı İstatistiklerden de kaldır (filament, süre, maliyet, enerji)`,deleteQueueItemsWarning:`Bu arşive bağlı {{count}} kuyruk öğesi de kaldırılacak.`,deleteBlockedByPrinting:`Silinemiyor — {{count}} kuyruk öğesi şu anda yazdırılıyor. Önce yazdırmayı durdurun, ardından tekrar deneyin.`,removeSource3mf:`Kaynak 3MF Kaldır`,removeSource3mfConfirm:`"{{name}}" dosyasından kaynak 3MF dosyasını kaldırmak istediğinizden emin misiniz? Bu, orijinal dilimleyici proje dosyasını silecek.`,removeButton:`Kaldır`,removeF3d:`F3D Kaldır`,removeF3dConfirm:`"{{name}}" dosyasından Fusion 360 tasarım dosyasını kaldırmak istediğinizden emin misiniz?`,removeTimelapse:`Zaman Atlamalı Videoyu Kaldır`,removeTimelapseConfirm:`"{{name}}" dosyasından zaman atlamalı videoyu kaldırmak istediğinizden emin misiniz?`,timelapse:`{{name}} - Zaman Atlamalı Video`,selectTimelapse:`Zaman Atlamalı Video Seç`,selectTimelapseDesc:`Otomatik eşleşme bulunamadı. Bu baskı için zaman atlamalı videoyu seçin:`,deleteArchives:`Arşivleri Sil`,deleteArchivesConfirm:`{{count}} arşivi silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.`,deleteCount:`{{count}} Sil`},page:{title:`Arşivler`,printsCount:`{{total}} baskıdan {{filtered}} tanesi`,dropFilesHere:`.3mf dosyalarını buraya bırakın`,releaseToUpload:`Yüklemek için bırakın`,only3mfSupported:`Yalnızca .3mf dosyaları desteklenir`,close:`Kapat`,selected:`{{count}} seçildi`,selectAll:`Tümünü Seç`,tags:`Etiketler`,project:`Proje`,favorite:`Favori`,delete:`Sil`,toggledFavorites:`{{count}} arşiv için favoriler değiştirildi`,failedUpdateFavorites:`Favoriler güncellenemedi`,archivesDeleted:`{{count}} arşiv silindi`,failedDeleteArchives:`Arşivler silinemedi`,photoDeleted:`Fotoğraf silindi`,failedDeletePhoto:`Fotoğraf silinemedi`},list:{name:`Ad`,printer:`Yazıcı`,date:`Tarih`,size:`Boyut`,actions:`İşlemler`,hasTimelapse:`Zaman atlamalı videosu var`},log:{date:`Tarih`,printName:`Baskı Adı`,printer:`Yazıcı`,user:`Kullanıcı`,status:`Durum`,duration:`Süre`,filament:`Filament`,allPrinters:`Tüm Yazıcılar`,allUsers:`Tüm Kullanıcılar`,allStatuses:`Tüm Durumlar`,cancelled:`İptal edildi`,skipped:`Atlandı`,dateFrom:`Başlangıç`,dateTo:`Bitiş`,noEntries:`Baskı günlüğü kaydı bulunamadı`,showing:`{{total}} kayıttan {{count}} tanesi gösteriliyor`,rowsPerPage:`Satır`,page:`Sayfa`,prev:`Önceki`,next:`Sonraki`,clearLog:`Günlüğü Temizle`,clearLogTitle:`Baskı Günlüğünü Temizle`,clearLogConfirm:`Tüm baskı günlüğü kayıtları kalıcı olarak silinecek. Arşivler ve kuyruk öğeleri etkilenmeyecek. Bu işlem geri alınamaz. Emin misiniz?`,clearLogButton:`Hepsini Temizle`,cleared:`{{count}} günlük kaydı temizlendi`,clearFailed:`Baskı günlüğü temizlenemedi`,deleteEntryTitle:`Baskı günlüğü girişini sil`,deleteEntryConfirm:`Bu giriş günlükten kaldırılacak ve filament, süre ve maliyet katkıları Hızlı İstatistikler'den çıkarılacak. İlgili arşiv (varsa) etkilenmez. Bu işlem geri alınamaz.`,entryDeleted:`Baskı günlüğü girişi silindi`,entryDeleteFailed:`Baskı günlüğü girişi silinemedi`,editEntryTitle:`Baskı günlüğü girişini düzenle`,editEntryDescription:`Bu baskıyı sınıflandırın. Hata Analizi widget'ı bu değerlere göre gruplandırır, böylece güncellemeler istatistiklere anında yansır.`,entryUpdated:`Baskı günlüğü girişi güncellendi`,entryUpdateFailed:`Baskı günlüğü girişi güncellenemedi`,statuses:{completed:`Tamamlandı`,failed:`Başarısız`,stopped:`Durduruldu`,cancelled:`İptal edildi`,skipped:`Atlandı`}}},dispatchToast:{untitled:`Yazdırma işi`,startingPrints:`Yazdırmalar başlatılıyor`,progressSummary:`{{complete}}/{{total}} tamamlandı • İşleniyor: {{processing}}`,expandDetails:`Gönderim ayrıntılarını genişlet`,collapseDetails:`Gönderim ayrıntılarını daralt`,awaitingPrinter:`Yazıcı bekleniyor…`,status:{processing:`İşleniyor`,completed:`Tamamlandı`,failed:`Başarısız`},failed:{generic:`Gönderim başarısız`,upload_failed:`Yazıcıya yükleme başarısız`,start_command_failed:`Yazıcı başlatma komutunu reddetti`},dismiss:`Kapat`},pipelineRuns:{title:`Pipeline çalıştırmaları`,loading:`Yükleniyor…`,empty:`Henüz pipeline çalıştırması yok.`,filter:{pipeline:`Pipeline`,status:`Durum`,target:`Hedef`,all:`Tümü`,allPipelines:`Tüm pipeline'lar`,allStatus:`Tüm durumlar`,allTargets:`Tüm hedefler`,clear:`Filtreleri temizle`,noMatches:`Mevcut filtrelere uyan çalıştırma yok.`},totalCount_one:`{{n}} çalıştırma`,totalCount_other:`{{n}} çalıştırma`,copies:`{{n}} kopya`,failedCount:`{{n}} başarısız`,copyN:`Kopya {{n}}`,retryFailed:`Başarısızları tekrar dene`,retryOf:`#{{n}} yeniden denemesi`,pagination:`{{total}} içinden {{start}}–{{end}}`,toast:{cancelled:`Çalıştırma iptal edildi`,cancelFailed:`İptal başarısız`,retryStarted:`Yeniden deneme başlatıldı`,retryFailed:`Yeniden deneme başarısız`,cleared:`{{n}} çalıştırma temizlendi`,clearFailed:`Temizleme başarısız`},clearLog:`Geçmişi temizle`,clearConfirmTitle:`Geçmiş temizlensin mi?`,clearConfirmBody:`Tamamlanan, başarısız olan, iptal edilen ve kısmen başarısız tüm pipeline çalıştırmaları silinsin mi? Devam eden çalıştırmalar korunur. Bu geri alınamaz.`,clearConfirmAction:`Temizle`,jobStatus:{pending:`beklemede`,awaiting_printer:`yazıcı bekleniyor`,queued:`kuyrukta`,printing:`yazdırılıyor`,completed:`tamamlandı`,failed:`başarısız`,cancelled:`iptal edildi`},cancelledByUser:`Kullanıcı tarafından iptal edildi`},queue:{title:`Baskı Kuyruğu`,subtitle:`Baskı işlerinizi zamanlayın ve yönetin`,filamentShort:{rowBadge:`Atanan makara için yetersiz filament`,rowTooltip:`Sevk planlayıcı bu öğeyi işaretledi. Yuva başına eksikliği görmek ve yine de yazdırıp yazdırmayacağınıza karar vermek için Oynat'a tıklayın.`,confirmTitle:`Yetersiz filament`,confirmIntro:`Atanan makara en az bir yuvayı karşılayamıyor. Yine de yazdırılsın mı?`,lineItem:`Yuva {{slot}}: {{required}} g gerekli, {{remaining}} g kaldı`,unknown:`bilinmiyor`,printAnyway:`Yine de Yazdır`},editQueueItem:`Kuyruk Öğesini Düzenle`,selectAllPlates:`Tüm {{count}} Plakayı Seç`,deselectAll:`Seçimi Kaldır`,printQueued:`Baskı kuyruğa eklendi`,printQueuedWillStartWhenIdle:`Yazıcı boştayken başlayacak`,itemsQueued:`{{count}} öğe kuyruğa eklendi`,sending:`Gönderiliyor...`,sendingProgress:`Gönderiliyor {{current}}/{{total}}...`,adding:`Ekleniyor...`,addingProgress:`Ekleniyor {{current}}/{{total}}...`,savingProgress:`Kaydediliyor {{current}}/{{total}}...`,clearQueue:`Kuyruğu Temizle`,clearHistory:`Geçmişi Temizle`,emptyQueue:`Kuyruk boş`,position:`Konum`,scheduledTime:`Zamanlanmış Süre`,moveUp:`Yukarı Taşı`,moveDown:`Aşağı Taşı`,startNow:`Şimdi Başlat`,printingInProgress:`Baskı devam ediyor...`,viewArchive:`Arşivi görüntüle`,viewInFileManager:`Dosya Yöneticisinde görüntüle`,itemCount:`{{count}} öğe`,itemCount_plural:`{{count}} öğe`,dragToReorder:`Yeniden sıralamak için sürükleyin (yalnızca ASAP)`,reorderHint:`Konum yalnızca ASAP öğelerini etkiler. Zamanlanmış öğeler belirlenen zamanlarında çalışır.`,sjf:{label:`SJF`,tooltip:`En Kısa İş İlk — planlayıcı daha kısa baskılara öncelik verir`},addedBy:`{{name}} tarafından eklendi`,nextInQueue:`Kuyrukta sıradaki`,clearPlateSuccess:`Plaka temizlendi — sonraki baskıya hazır`,plateNumber:`Plaka {{index}}`,quantity:`Miktar`,quantityHint:`{{count}} kuyruk öğesi oluşturur`,activeBatches:`Aktif Yığınlar`,batchProgress:`{{total}} öğeden {{completed}} tanesi tamamlandı`,cancelBatch:`Kalanları İptal Et`,batchCancelled:`Kalan yığın öğeleri iptal edildi`,cancelBatchConfirmTitle:`Yığını İptal Et`,cancelBatchConfirmMessage:`Bu yığındaki tüm bekleyen öğeler iptal edilsin mi?`,batch:{defaultName:`Yığın`,label:`{{count}} öğe`,label_plural:`{{count}} öğe`,pendingCount:`{{count}} bekleyen`,pendingCount_plural:`{{count}} bekleyen`,expand:`Yığını genişlet`,collapse:`Yığını daralt`,groupAsBatch:`Yığın olarak grupla…`,groupAsBatchDescription:`Seçilen {{count}} öğeyi tek bir daraltılabilir yığında birleştirin.`,nameLabel:`Yığın adı`,namePlaceholder:`örn. Cuma hediyeleri`,create:`Yığın oluştur`,ungroup:`Gruptan çıkar`,ungroupConfirmTitle:`Yığını gruptan çıkar?`,ungroupConfirmMessage:`Öğeler kuyrukta kalacak ancak artık birlikte gruplanmayacak.`,dragGroup:`Grubu sürükle`},tabs:{queue:`Kuyruk`,history:`Geçmiş`,timeline:`Zaman çizelgesi`,pipelines:`Pipeline'lar`},layout:{flatList:`Liste`,byPrinter:`Yazıcıya göre`,groupByPrinter:`Yazıcıya göre grupla`},history:{emptyTitle:`Henüz geçmiş yok`,emptyDescription:`Tamamlanan, iptal edilen ve başarısız baskılar burada görünür.`},dragGhost:{multiCount:`{{count}} öğe`,batch:`{{name}} ({{count}} kopya)`,batch_plural:`{{name}} ({{count}} kopya)`},sections:{currentlyPrinting:`Şu Anda Yazdırılan`,queued:`Kuyruktaki`,history:`Geçmiş`},status:{pending:`Beklemede`,waiting:`Bekliyor`,printing:`Yazdırılıyor`,paused:`Duraklatıldı`,completed:`Tamamlandı`,failed:`Başarısız`,skipped:`Atlandı`,cancelled:`İptal edildi`},summary:{printing:`Yazdırılıyor`,queued:`Kuyrukta`,totalTime:`Toplam Kuyruk Süresi`,totalWeight:`Toplam Kuyruk Ağırlığı`,history:`Geçmiş`},filter:{allPrinters:`Tüm Yazıcılar`,unassigned:`Atanmamış`,allStatus:`Tüm Durumlar`,allLocations:`Tüm Konumlar`,any:`Herhangi`},sort:{byPosition:`Konuma Göre Sırala`,byName:`Ada Göre Sırala`,byPrinter:`Yazıcıya Göre Sırala`,bySchedule:`Zamana Göre Sırala`,byDate:`Tarihe Göre Sırala`,ascendingOldest:`Artan (önce en eski)`,descendingNewest:`Azalan (önce en yeni)`},badges:{staged:`Hazırlandı`,requiresPrevious:`Önceki başarı gerekli`,autoPowerOff:`Otomatik kapanma`,gcodeInjection:`G-kod`},empty:{title:`Zamanlanmış baskı yok`,description:`Bağlam menüsündeki "Zamanla" seçeneğini kullanarak Arşivler sayfasından bir baskı zamanlayın veya başlamak için dosyaları sürükleyip bırakın.`},time:{asap:`ASAP`,overdue:`Gecikmiş`,now:`Şimdi`,lessThanMinute:`Bir dakikadan az`,inMinutes:`{{count}} dk içinde`,inHours:`{{count}} saat içinde`},actions:{startPrint:`Baskıyı Başlat`,stopPrint:`Baskıyı Durdur`,requeue:`Yeniden Kuyrukla`},bulkEdit:{title:`{{count}} Öğeyi Düzenle`,title_plural:`{{count}} Öğeyi Düzenle`,description:`Yalnızca değiştirilen ayarlar seçili öğelere uygulanacak.`,printer:`Yazıcı`,noChange:`— Değişiklik yok —`,queueOptions:`Kuyruk Seçenekleri`,staged:`Hazırlandı (manuel başlatma)`,autoPowerOff:`Baskı sonrası otomatik kapanma`,requirePrevious:`Önceki başarı gerekli`,printOptions:`Baskı Seçenekleri`,bedLevelling:`Tabla seviyelendirme`,flowCalibration:`Akış kalibrasyonu`,vibrationCalibration:`Titreşim kalibrasyonu`,layerInspection:`İlk katman denetimi`,timelapse:`Zaman atlamalı video`,useAms:`AMS Kullan`,nozzleOffsetCali:`Nozül ofset kalibrasyonu`,applyChanges:`Değişiklikleri Uygula`,selectAll:`Tümünü Seç`,deselectAll:`Seçimi Kaldır`,selected:`{{count}} seçildi`,editSelected:`Seçilenleri Düzenle`,cancelSelected:`Seçilenleri İptal Et`},confirm:{cancelTitle:`Zamanlanmış Baskıyı İptal Et`,cancelMessage:`"{{name}}" iptal etmek istediğinizden emin misiniz?`,stopTitle:`Baskıyı Durdur`,stopMessage:`"{{name}}" mevcut baskıyı durdurmak istediğinizden emin misiniz? Bu, yazıcıdaki baskı işini iptal edecek.`,removeTitle:`Geçmişten Kaldır`,removeMessage:`"{{name}}" kuyruk geçmişinden kaldırmak istediğinizden emin misiniz?`,clearHistoryTitle:`Geçmişi Temizle`,clearHistoryMessage:`Geçmişten {{count}} öğenin tümünü kaldırmak istediğinizden emin misiniz?`,cancelButton:`Baskıyı İptal Et`,stopButton:`Baskıyı Durdur`,thisPrint:`bu baskı`,thisItem:`bu öğe`},toast:{cancelled:`Kuyruk öğesi iptal edildi`,cancelFailed:`Öğe iptal edilemedi`,removed:`Kuyruk öğesi kaldırıldı`,removeFailed:`Öğe kaldırılamadı`,stopped:`Baskı durduruldu`,stopFailed:`Baskı durdurulamadı`,released:`Baskı kuyruğa bırakıldı`,startFailed:`Baskı başlatılamadı`,reorderFailed:`Kuyruk yeniden sıralanamadı`,historyCleared:`{{count}} geçmiş öğesi temizlendi`,clearHistoryFailed:`Geçmiş temizlenemedi`,updateFailed:`Öğeler güncellenemedi`,bulkCancelled:`{{count}} öğe iptal edildi`,bulkCancelFailed:`Öğeler iptal edilemedi`,batchCreated:`"{{name}}" yığını oluşturuldu`,batchCreateFailed:`Yığın oluşturma başarısız`,batchUngrouped:`{{count}} öğe gruptan çıkarıldı`,batchUngroupFailed:`Yığını gruptan çıkarma başarısız`,resumedAfterFailure:`Kuyruk devam ettirildi — {{restored}} iş bekleyene geri alındı`,resumeAfterFailureFailed:`Kuyruk devam ettirilemedi`},resumeAfterFailure:{banner:`{{printer}} önceki bir baskı hatası nedeniyle engellendi — {{count}} iş atlandı`,bannerHint:`Yazıcı sorununu çözün, ardından atlanan işleri geri yüklemek ve engellemeyi kaldırmak için devam ettirin.`,button:`Hatadan sonra devam et`,confirmTitle:`Hatadan sonra kuyruğa devam edilsin mi?`,confirmMessage:`{{printer}} üzerindeki {{count}} atlanan işi bekleyene geri yükleyin ve önceki baskı engelini kaldırın. Devam etmeden önce yazıcının hazır olduğundan emin olun.`},timeline:{listView:`Liste`,timelineView:`Zaman Çizelgesi`,unassigned:`Atanmamış`,noData:`Bu gün için zamanlanmış baskı yok`,nothingCommitted:`Bu pencerede onaylanmış programlar yok. Hazırlanmış öğeler, beklemedeki öğeler ve boştaki yazıcılardaki ASAP işleri gösterilmez — burada görmek için zamanlanmış bir saat belirleyin veya hazırlanmış bir öğeyi serbest bırakın.`,allDoneBy:`Tüm baskıların {{time}}'e kadar bitmesi tahmin ediliyor`,staged:`Hazırlandı`,filterAll:`Tümünü Göster`,filterPrinting:`Yazdırılıyor`,filterQueued:`Kuyrukta`,time:{anyMoment:`her an`,minutesLeft:`{{minutes}}dk kaldı`,hoursLeft:`{{hours}}sa kaldı`,hoursMinutesLeft:`{{hours}}sa {{minutes}}dk kaldı`},day:{previous:`Önceki gün`,next:`Sonraki gün`,today:`Bugün`},window:{back12h:`12 saat geri`,forward12h:`12 saat ileri`,now:`Şimdi`},printerColumnHeader:`Yazıcı`},permissions:{noStopPrint:`Baskıları durdurma izniniz yok`,noStartPrint:`Baskıları başlatma izniniz yok`,noEdit:`Bu kuyruk öğesini düzenleme izniniz yok`,noCancel:`Bu kuyruk öğesini iptal etme izniniz yok`,noRequeue:`Öğeleri yeniden kuyruklama izniniz yok`,noRemove:`Bu kuyruk öğesini kaldırma izniniz yok`,noClearHistory:`Tüm geçmişi temizleme izniniz yok`,noEditItems:`Kuyruk öğelerini düzenleme izniniz yok`,noCancelItems:`Kuyruk öğelerini iptal etme izniniz yok`}},stats:{title:`İstatistikler`,subtitle:`Yeniden düzenlemek için widget'ları sürükleyin. Gizlemek için göz simgesine tıklayın.`,overview:`Genel Bakış`,totalPrints:`Toplam Baskı`,successRate:`Başarı Oranı`,totalPrintTime:`Toplam Baskı Süresi`,printTime:`Baskı Süresi`,totalFilament:`Toplam Kullanılan Filament`,filamentUsed:`Kullanılan Filament`,filamentCost:`Filament Maliyeti`,totalCost:`Toplam Maliyet`,energyUsed:`Kullanılan Enerji`,energyCost:`Enerji Maliyeti`,energyWarmingUpTooltip:`Enerji takibi hâlâ saatlik anlık görüntüler topluyor. Tarih aralığı toplamları, seçilen aralıktan önce en az bir anlık görüntü olduğunda doğru hâle gelir. Erken değerler eksik sayabilir.`,averagePrintTime:`Ortalama Baskı Süresi`,printsPerDay:`Günlük Baskı`,byPrinter:`Yazıcıya Göre`,printsByPrinter:`Yazıcıya Göre Baskılar`,byMaterial:`Malzemeye Göre`,byMonth:`Aya Göre`,last7Days:`Son 7 Gün`,last30Days:`Son 30 Gün`,last90Days:`Son 90 Gün`,allTime:`Tüm Zamanlar`,quickStats:`Hızlı İstatistikler`,printActivity:`Baskı Etkinliği`,filamentTypes:`Filament Türleri`,filamentTrends:`Filament Trendleri`,failureAnalysis:`Başarısızlık Analizi`,timeAccuracy:`Süre Doğruluğu`,successful:`Başarılı:`,failed:`Başarısız:`,cancelled:`İptal edildi:`,perfectEstimate:`%100 = mükemmel tahmin`,noTimeAccuracyData:`Henüz süre doğruluğu verisi yok`,noFilamentData:`Filament verisi mevcut değil`,noPrinterData:`Yazıcı verisi mevcut değil`,noPrintData:`Baskı verisi mevcut değil`,noPrintDataLast30Days:`Son 30 günde baskı verisi yok`,failureReasons:`Başarısızlık Nedenleri`,topFailureReasons:`En Sık Başarısızlık Nedenleri`,failedPrintsCount:`{{total}} baskının {{failed}} tanesi başarısız`,lastWeekRate:`Geçen hafta: %{{rate}}`,resetLayout:`Düzeni Sıfırla`,recalculateCosts:`Maliyetleri Yeniden Hesapla`,recalculateCostsHint:`Mevcut filament fiyatlarını kullanarak tüm arşiv maliyetlerini yeniden hesapla`,exportStats:`İstatistikleri Dışa Aktar`,exportAsCsv:`CSV Olarak Dışa Aktar`,exportAsExcel:`Excel Olarak Dışa Aktar`,hiddenCount:`{{count}} Gizli`,exportDownloaded:`Dışa aktarma indirildi`,exportFailed:`Dışa aktarma başarısız`,layoutReset:`Düzen sıfırlandı`,recalculatedCosts:`{{count}} arşiv için maliyetler yeniden hesaplandı`,recalculateFailed:`Maliyetler yeniden hesaplanamadı`,loadingStats:`İstatistikler yükleniyor...`,noPermissionResetLayout:`Düzeni sıfırlama izniniz yok`,noPermissionRecalculate:`Maliyetleri yeniden hesaplama izniniz yok`,noPrintDataInRange:`Seçili aralıkta baskı verisi yok`,periodFilament:`Dönem Filamenti`,periodCost:`Dönem Maliyeti`,avgPerPrint:`Baskı Başına Ort.`,usageOverTime:`Zaman İçinde Kullanım`,filamentByWeight:`Ağırlık`,printDuration:`Baskı Süresi`,printerUtilization:`Yazıcı Kullanımı`,filamentSuccess:`Malzemeye Göre Başarı`,printHabits:`Baskı Alışkanlıkları`,printTimeOfDay:`Günün Baskı Saati`,colorDistribution:`Renk Dağılımı`,noColorData:`Renk verisi mevcut değil`,records:`Kayıtlar`,longestPrint:`En Uzun Baskı`,heaviestPrint:`En Ağır Baskı`,mostExpensivePrint:`En Pahalı`,busiestDay:`En Yoğun Gün`,successStreak:`Başarı Serisi`,streakPrint:`ardışık baskı`,streakPrints:`{{count}} ardışık baskı`,printerStats:`Yazıcı İstatistikleri`,hours:`saat`,avgPrints:`Ort. baskı`,noArchiveData:`Baskı verisi mevcut değil`,filamentByTime:`Süre`,avgWeight:`Ort. ağırlık`,avgTime:`Ort. süre`,filamentByPrints:`Baskılar`,timeframe:{today:`Bugün`,"this-week":`Bu Hafta`,"this-month":`Bu Ay`,"last-7":`Son 7 Gün`,"last-30":`Son 30 Gün`,"last-90":`Son 90 Gün`,"this-year":`Bu Yıl`,"all-time":`Tüm Zamanlar`,custom:`Özel Aralık`,from:`Başlangıç`,to:`Bitiş`},allUsers:`Tüm Kullanıcılar`,noUser:`Kullanıcı Yok (Sistem)`,filterByUser:`Kullanıcıya Göre Filtrele`},maintenance:{title:`Bakım`,overview:`Genel Bakış`,allOk:`Tüm bakım güncel`,dueCount:`{{count}} öğe bekliyor`,dueCount_plural:`{{count}} öğe bekliyor`,warningCount:`{{count}} uyarı`,warningCount_plural:`{{count}} uyarı`,totalPrintTime:`Toplam Baskı Süresi`,nextMaintenance:`Sonraki Bakım`,nothingDue:`Bekleyen yok`,tasks:`Görevler`,lastPerformed:`Son yapılan`,interval:`Aralık`,hoursRemaining:`{{hours}}sa kaldı`,hoursOverdue:`{{hours}}sa gecikmiş`,markDone:`Tamamlandı Olarak İşaretle`,performMaintenance:`Bakım Gerçekleştir`,history:`Geçmiş`,noHistory:`Bakım geçmişi yok`,editPrintHours:`Baskı Saatlerini Düzenle`,currentHours:`Mevcut Saat`,statusTab:`Durum`,settingsTab:`Ayarlar`,overdueCount:`{{count}} gecikmiş`,dueSoonCount:`{{count}} yakında`,dueSoon:`Yakında`,allGood:`Her şey iyi`,overdueBy:`{{duration}} gecikmiş`,dueIn:`{{duration}} içinde`,timeLeft:`{{duration}} kaldı`,day:`1 gün`,days:`{{count}} gün`,week:`1 hafta`,weeks:`{{count}} hafta`,month:`1 ay`,months:`{{count}} ay`,year:`1 yıl`,maintenanceTypes:`Bakım Türleri`,maintenanceTypesDescription:`Sistem türleri ve özel bakım görevleriniz`,addCustomType:`Özel Tür Ekle`,restoreDefaults:`Varsayılan Görevleri Geri Yükle`,intervalType:`Aralık Türü`,intervalValue:`Aralık ({{type}})`,icon:`Simge`,documentationLink:`Dokümantasyon Bağlantısı (isteğe bağlı)`,assignToPrinters:`Yazıcılara Ata`,selectAtLeastOnePrinter:`En az bir yazıcı seçin`,addType:`Tür Ekle`,custom:`Özel`,printHours:`Baskı Saatleri`,calendarDays:`Takvim Günleri`,exampleName:`örn., HEPA Filtresini Değiştir`,viewDocumentation:`Dokümantasyonu görüntüle`,timeBasedInterval:`Zaman tabanlı aralık`,intervalOverrides:`Aralık Geçersiz Kılmaları`,intervalOverridesDescription:`Belirli yazıcılar için aralıkları özelleştir`,assignedToPrinters:`Atanan yazıcılar:`,noPrintersAssigned:`Atanan yazıcı yok`,addPrinterShort:`Ekle:`,printersAssignedClick:`{{count}} yazıcı atandı - yönetmek için tıklayın`,removeFromPrinter:`Bu yazıcıdan kaldır`,types:{lubricateCarbonRods:`Karbon Çubukları Yağla`,lubricateRails:`Lineer Rayları Yağla`,cleanNozzle:`Nozulu/Hotend Temizle`,checkBelts:`Kayış Gerginliğini Kontrol Et`,cleanBuildPlate:`Baskı Plakasını Temizle`,checkExtruder:`Ekstrüder Dişlilerini Kontrol Et`,checkCooling:`Soğutma Fanlarını Kontrol Et`,generalInspection:`Genel Denetim`,cleanCarbonRods:`Karbon Çubukları Temizle`,lubricateSteelRods:`Çelik Çubukları Yağla`,cleanSteelRods:`Çelik Çubukları Temizle`,cleanLinearRails:`Lineer Rayları Temizle`,checkPtfeTube:`PTFE Tüpünü Kontrol Et`,replaceHepaFilter:`HEPA Filtresini Değiştir`,replaceCarbonFilter:`Karbon Filtresini Değiştir`,lubricateLeftNozzleRail:`Sol Nozul Rayını Yağla`},maintenanceComplete:`Bakım tamamlandı olarak işaretlendi`,typeUpdated:`Bakım türü güncellendi`,typeDeleted:`Bakım türü silindi`,defaultsRestored:`{{count}} varsayılan görev geri yüklendi`,printHoursUpdated:`Baskı saatleri güncellendi`,printerAssigned:`Yazıcı atandı`,printerRemoved:`Yazıcı kaldırıldı`,deleteTypeConfirm:`"{{name}}" silinsin mi?`,deleteSystemTypeTitle:`Varsayılan bakım görevi silinsin mi?`,deleteSystemTypeMessage:`"{{name}}" varsayılan bakım görevini silmek istediğinizden emin misiniz?`,noPermissionUpdate:`Bakım öğelerini güncelleme izniniz yok`,noPermissionPerform:`Bakım gerçekleştirme izniniz yok`,noPermissionEditTypes:`Bakım türlerini düzenleme izniniz yok`,noPermissionDeleteTypes:`Bakım türlerini silme izniniz yok`,noPermissionEditHours:`Baskı saatlerini düzenleme izniniz yok`,noPermissionRemovePrinter:`Yazıcı atamalarını kaldırma izniniz yok`,noPermissionAssignPrinter:`Yazıcı atama izniniz yok`,noPermissionEditIntervals:`Aralıkları düzenleme izniniz yok`,configureSettings:`Bakım türlerini ve aralıklarını yapılandır`},settings:{title:`Ayarlar`,general:`Genel`,tabs:{general:`Genel`,smartPlugs:`Akıllı Prizler`,notifications:`Bildirimler`,queue:`İş Akışı`,queueDispatch:`Kuyruk ve Sevkıyat`,queuePipelines:`Pipeline'lar`,filament:`Filament`,network:`Ağ`,apiKeys:`API Anahtarları`,virtualPrinter:`Sanal Yazıcı`,spoolbuddy:`SpoolBuddy`,failureDetection:`Başarısızlık Algılama`,users:`Kimlik Doğrulama`,backup:`Yedekleme`,emailAuth:`E-posta Kimlik Doğrulama`,ldap:`LDAP`,twoFa:`İki Faktörlü Kimlik Doğrulama`,oidc:`SSO / OIDC`,security:`Güvenlik`},spoolbuddy:{infoTitle:`SpoolBuddy cihazları`,infoBody:`SpoolBuddy kioskları heartbeat üzerinden otomatik olarak kayıt olur. Artık kullanılmıyorsa veya bir daemon çökmesi nedeniyle eski bir kopya kaldıysa bir cihazı buradan kayıttan çıkarın.`,duplicatesTitle:`{{count}} cihaz kayıtlı`,duplicatesBody:`Yalnızca ilk kayıtlı cihaz kiosk arayüzü tarafından kullanılır. Bunlardan biri çökme sonucu kalmış eski bir kopya ise kayıttan çıkarın — çevrimiçi bir cihaz sonraki heartbeat'inde kendini yeniden kaydedecek.`,empty:`Henüz kayıtlı SpoolBuddy cihazı yok.`,online:`Çevrimiçi`,offline:`Çevrimdışı`,unregister:`Kayıttan Çıkar`,unregisterSuccess:`Cihaz kayıttan çıkarıldı`,unregisterError:`Cihaz kayıttan çıkarılamadı`,confirmTitle:`SpoolBuddy cihazı kayıttan çıkarılsın mı?`,confirmBody:`Bu, "{{hostname}}" ({{deviceId}}) cihazını veritabanından kaldıracak. Cihaz çevrimiçiyse, sonraki heartbeat'inde kendini yeniden kaydedecek.`,ipAddress:`IP adresi`,firmware:`Firmware`,lastSeen:`Son görülme`,daemonUptime:`Daemon çalışma süresi`,systemUptime:`Sistem çalışma süresi`,never:`asla`,nfc:`NFC`,scale:`Tartı`,cpuTemp:`CPU sıcaklığı`,cpuLoad:`CPU yükü`,memory:`Bellek`,disk:`Disk`,update:`Güncelle`,updateConfirmTitle:`Spoolbuddy daemon güncellensin mi?`,updateConfirmBody:`"{{hostname}}" cihazında yazılım güncellemesi tetiklensin mi? Güncelleme uygulandığında daemon yeniden başlayacak.`,restartBrowser:`Tarayıcıyı Yeniden Başlat`,restartBrowserConfirmTitle:`Kiosk tarayıcısı yeniden başlatılsın mı?`,restartBrowserConfirmBody:`"{{hostname}}" cihazındaki kiosk tarayıcısı yeniden başlatılsın mı? Ekran kısa bir süre kararacak.`,restartDaemon:`Daemon'u Yeniden Başlat`,restartDaemonConfirmTitle:`Spoolbuddy daemon yeniden başlatılsın mı?`,restartDaemonConfirmBody:`"{{hostname}}" üzerindeki Spoolbuddy daemon yeniden başlatılsın mı? Cihaz birkaç saniye çevrimdışı olacak.`,reboot:`Yeniden Başlat`,rebootConfirmTitle:`Cihaz yeniden başlatılsın mı?`,rebootConfirmBody:`"{{hostname}}" yeniden başlatılsın mı? Cihaz yaklaşık bir dakika çevrimdışı olacak.`,shutdown:`Kapat`,shutdownConfirmTitle:`Cihaz kapatılsın mı?`,shutdownConfirmBody:`"{{hostname}}" kapatılsın mı? Tekrar açmak için fiziksel erişime ihtiyacınız olacak.`,commandConfirm:`Onayla`,commandQueued:`Komut kuyruğa alındı`,commandError:`Komut gönderilemedi`},ldap:{title:`LDAP Kimlik Doğrulama`,enabledDesc:`LDAP kimlik doğrulama etkin`,disabledDesc:`LDAP kimlik doğrulama devre dışı`,disabledHint:`Aşağıdaki LDAP ayarlarını yapılandırın ve kaydedin, ardından etkinleştirin.`,enabled:`LDAP kimlik doğrulama etkinleştirildi`,disabled:`LDAP kimlik doğrulama devre dışı bırakıldı`,feature1:`Kullanıcılar LDAP kimlik bilgileriyle giriş yapabilir`,feature2:`Yerel yönetici hesabı yedek olarak kalır`,feature3:`LDAP grupları giriş sırasında BamBuddy gruplarına eşlenir`,serverConfig:`LDAP Sunucu Yapılandırması`,serverUrl:`Sunucu URL`,serverUrlHint:`SSL için ldaps:// veya StartTLS ile ldap:// kullanın`,security:`Güvenlik`,securityHint:`StartTLS düz bir bağlantıyı TLS'ye yükseltir. LDAPS başlangıçtan itibaren TLS kullanır.`,bindDn:`Bind DN (Servis Hesabı)`,bindPassword:`Bind Parolası`,searchBase:`Arama Tabanı DN`,userFilter:`Kullanıcı Arama Filtresi`,userFilterHint:`{username} giriş kullanıcı adıyla değiştirilir. OpenLDAP için (uid={username}) kullanın.`,advanced:`Gelişmiş`,autoProvision:`Kullanıcıları otomatik tedarik et`,autoProvisionHint:`İlk LDAP girişinde otomatik olarak BamBuddy hesabı oluştur`,defaultGroup:`Varsayılan grup`,defaultGroupNone:`— Hiçbiri (yedek yok) —`,defaultGroupHint:`Bir LDAP kullanıcısı kimlik doğruladığında ancak eşlenmiş herhangi bir LDAP grubunda listelenmediğinde atanan yedek grup. Eşlenmemiş kullanıcıları izinsiz bırakmak için boş bırakın.`,groupMapping:`Grup Eşleme (JSON)`,groupMappingHint:`LDAP grup DN'lerini BamBuddy gruplarına eşle. Kullanılabilir gruplar: `,testConnection:`Bağlantıyı Test Et`,settingsSaved:`LDAP ayarları kaydedildi`,errors:{serverRequired:`LDAP sunucu URL gerekli`,searchBaseRequired:`Arama tabanı DN gerekli`,enableAuthFirst:`Önce kimlik doğrulamayı etkinleştirin`,configureLdapFirst:`Önce LDAP ayarlarını kaydedin`}},email:{smtpSettings:`SMTP Yapılandırması`,smtpHost:`SMTP Sunucusu`,smtpPort:`SMTP Portu`,security:`Güvenlik`,authentication:`Kimlik Doğrulama`,username:`Kullanıcı Adı`,password:`Parola`,fromEmail:`Gönderen E-posta`,fromName:`Gönderen Adı`,testConnection:`SMTP Bağlantısını Test Et`,testRecipient:`Test Alıcı E-postası`,sendTest:`Test E-postası Gönder`,sending:`Gönderiliyor...`,save:`Ayarları Kaydet`,saving:`Kaydediliyor...`,advancedAuth:`Gelişmiş Kimlik Doğrulama`,advancedAuthEnabled:`Gelişmiş Kimlik Doğrulama etkin`,advancedAuthEnabledDesc:`E-posta tabanlı kullanıcı yönetimi özellikleri aktif. Yeni kullanıcılar e-posta ile otomatik oluşturulan parolalar alacak ve kullanıcılar parola sıfırlama özelliğiyle parolalarını sıfırlayabilecek.`,advancedAuthDisabled:`Gelişmiş Kimlik Doğrulama devre dışı`,advancedAuthDisabledDesc:`Kullanıcı yönetimi için e-posta tabanlı özellikleri etkinleştirmek için gelişmiş kimlik doğrulamayı etkinleştirin.`,enable:`Etkinleştir`,disable:`Devre dışı bırak`,feature1:`Parolalar otomatik oluşturulur ve yeni kullanıcılara e-posta ile gönderilir`,feature2:`Kullanıcılar kullanıcı adı veya e-posta ile giriş yapabilir`,feature3:`Parola unuttum özelliği kullanılabilir`,feature4:`Yöneticiler kullanıcı parolalarını e-posta ile sıfırlayabilir`,errors:{requiredFields:`Lütfen tüm zorunlu alanları doldurun`,usernameRequired:`Kimlik doğrulama etkinken kullanıcı adı zorunludur`,enterTestEmail:`Lütfen test e-posta adresi girin`,smtpServerAndEmail:`Test etmeden önce lütfen SMTP Sunucusu ve Gönderen E-posta alanlarını doldurun`,usernamePasswordRequired:`Kimlik doğrulama etkinken Kullanıcı Adı ve Parola zorunludur`,configureSmtpFirst:`Lütfen önce SMTP ayarlarını yapılandırın ve test edin`,enableAuthFirst:`E-posta tabanlı özellikleri kullanmak için lütfen önce kimlik doğrulamayı etkinleştirin.`},success:{settingsSaved:`SMTP ayarları başarıyla kaydedildi`},securityOptions:{starttls:`STARTTLS (Port 587)`,ssl:`SSL/TLS (Port 465)`,none:`Hiçbiri (Port 25)`},authOptions:{enabled:`Etkin`,disabled:`Devre dışı`}},appearance:`Görünüm`,notifications:`Bildirimler`,smartPlugs:`Akıllı Prizler`,spoolman:`Spoolman`,updates:`Güncellemeler`,language:`Dil`,languageDescription:`Tercih ettiğiniz dili seçin`,theme:`Tema`,themeLight:`Açık`,themeDark:`Koyu`,themeSystem:`Sistem`,defaultView:`Varsayılan Görünüm`,defaultViewDescription:`Uygulamayı açarken gösterilecek sayfa`,checkForUpdates:`Güncellemeleri Kontrol Et`,autoUpdate:`Otomatik Güncelleme`,currentVersion:`Mevcut Sürüm`,latestVersion:`En Son Sürüm`,upToDate:`Güncelsiniz`,updateAvailable:`Güncelleme mevcut`,notificationLanguage:`Bildirim Dili`,notificationLanguageDescription:`Push bildirimleri için dil`,bedCooledThreshold:`Tabla Soğuma Eşiği`,bedCooledThresholdDescription:`Bir baskıdan sonra tablanın soğumuş kabul edildiği sıcaklık`,userNotificationsEnabled:`Kullanıcı Bildirimleri`,userNotificationsEnabledDescription:`Baskı işi olayları için kullanıcı bildirim menüsünü ve e-posta bildirimlerini etkinleştir. Gelişmiş Kimlik Doğrulama gerektirir.`,userNotificationsDisabledHint:`Kullanıcı bildirimlerini kullanmak için Gelişmiş Kimlik Doğrulamayı etkinleştirin.`,notificationProviders:`Bildirim Sağlayıcıları`,addProvider:`Sağlayıcı Ekle`,editProvider:`Sağlayıcıyı Düzenle`,providerType:`Sağlayıcı Türü`,testNotification:`Test Bildirimi`,testSuccess:`Test bildirimi başarıyla gönderildi`,testFailed:`Test bildirimi gönderilemedi`,quietHours:`Sessiz Saatler`,quietHoursDescription:`Bu saatler arasında rahatsız etme`,quietHoursStart:`Başlangıç`,quietHoursEnd:`Bitiş`,events:{title:`Bildirim Olayları`,printStart:`Baskı Başladı`,printComplete:`Baskı Tamamlandı`,printFailed:`Baskı Başarısız`,printStopped:`Baskı Durduruldu`,printProgress:`İlerleme Kilometre Taşları`,printProgressDescription:`%25, %50, %75'te bildir`,printerOffline:`Yazıcı Çevrimdışı`,printerError:`Yazıcı Hatası`,filamentLow:`Az Filament`,maintenanceDue:`Bakım Zamanı`,maintenanceDueDescription:`Bakım gerektiğinde bildir`},smartPlug:{title:`Akıllı Prizler`,add:`Akıllı Priz Ekle`,edit:`Akıllı Prizi Düzenle`,name:`Ad`,ipAddress:`IP Adresi`,linkedPrinter:`Bağlı Yazıcı`,autoOn:`Otomatik Aç`,autoOnDescription:`Baskı başladığında aç`,autoOff:`Otomatik Kapat`,autoOffDescription:`Baskı tamamlandıktan sonra kapat`,offDelay:`Kapatma Gecikmesi`,offDelayMinutes:`Baskıdan sonra dakika`,offDelayTemp:`Nozul sıcaklığın altında olduğunda`,currentState:`Mevcut Durum`,turnOn:`Aç`,turnOff:`Kapat`},filamentTracking:`Filament Takibi`,filamentTrackingDesc:`Filament makaralarınızı nasıl takip edeceğinizi seçin. Yerleşik envanteri kullanabilir veya harici bir Spoolman sunucusuna bağlanabilirsiniz.`,autoAddUnknownRfid:`Bilinmeyen RFID makaralarını otomatik ekle`,autoAddUnknownRfidDesc:`Bilinmeyen RFID etiketli bir makara algılandığında otomatik olarak envantere bir kayıt oluşturur. Çoğaltmaları önlemek için yeni makaraları manuel olarak önceden kaydediyorsanız kapatın.`,filamentChecks:`Filament kontrolleri`,disableFilamentWarnings:`Filament uyarılarını devre dışı bırak`,disableFilamentWarningsDesc:`Yazdırırken veya kuyruğa eklerken yetersiz filamentle ilgili uyarıları gösterme`,preferLowestFilament:`En az kalan filamenti tercih et`,preferLowestFilamentDesc:`Birden fazla makara eşleştiğinde, kalan filamenti en az olanı kullan`,preferLowestFilamentBackupNote:`Yalnızca yazıcıda AMS Filament Backup etkinleştirildiğinde uygulanır — aksi takdirde seçilen makara bittiğinde yazıcı ikinci bir makaraya geçemez.`,trackingModeBuiltIn:`Yerleşik Envanter`,trackingModeBuiltInDesc:`RFID otomatik eşleştirme ve kullanım takibi dahil`,trackingModeSpoolmanDesc:`Harici filament yönetim sunucusu`,builtInFeatureRfid:`AMS'deki Bambu Lab RFID makaralarını otomatik olarak algılar`,builtInFeatureUsage:`Baskı başına filament tüketimini takip eder`,builtInFeatureCatalog:`Makaraları, renkleri ve K faktör profillerini yönetin`,builtInFeatureThirdParty:`Üçüncü taraf makaralar envanter makaralarına atanabilir`,amsSyncButton:`AMS'den Ağırlıkları Senkronize Et`,amsSyncTitle:`AMS'den Makara Ağırlıklarını Senkronize Et`,amsSyncMessage:`Bu, bağlı yazıcılardan gelen mevcut AMS kalan% değerleriyle tüm envanter makara ağırlıklarının üzerine yazar. Bozuk ağırlık verilerinden kurtarmak için bunu kullanın. Yazıcılar çevrimiçi olmalıdır.`,amsSyncing:`Senkronize ediliyor...`,amsSyncSuccess:`{{synced}} makara senkronize edildi, {{skipped}} atlandı`,amsSyncError:`AMS'den ağırlıklar senkronize edilemedi`,spoolmanAmsSyncButton:`AMS'den Spoolman Ağırlıklarını Senkronize Et`,spoolmanAmsSyncTitle:`AMS'den Spoolman Makara Ağırlıklarını Senkronize Et`,spoolmanAmsSyncMessage:`Bu, bağlı yazıcılardan gelen mevcut AMS kalan% değerlerine göre tüm Spoolman makara ağırlıklarını güncelleyecek. Yazıcılar çevrimiçi olmalıdır.`,spoolmanAmsSyncing:`Senkronize ediliyor...`,spoolmanAmsSyncSuccess:`{{synced}} makara senkronize edildi, {{skipped}} atlandı`,spoolmanAmsSyncError:`Spoolman ağırlıkları AMS'den senkronize edilemedi`,spoolmanAmsSyncErrorUnreachable:`Spoolman ağırlıkları senkronize edilemedi (Spoolman erişilemez)`,spoolmanAmsSyncErrorNotConfigured:`Spoolman ağırlıkları senkronize edilemedi (Spoolman yapılandırılmamış)`,spoolmanNotConfigured:`Spoolman yapılandırılmamış`,spoolmanFilamentCatalogTitle:`Spoolman Filament Kataloğu`,spoolmanFilamentCatalogDesc:`Spoolman örneğinizden filament adları ve boş ağırlıkları. Ad ve makara ağırlığı burada düzenlenebilir; diğer tüm özellikler doğrudan Spoolman'da yönetilir.`,spoolmanUrl:`Spoolman URL`,spoolmanUrlHint:`Spoolman sunucunuzun URL'si (örn., http://localhost:7912)`,spoolmanConnected:`Bağlı`,spoolmanDisconnected:`Bağlı değil`,status:`Durum`,connect:`Bağlan`,disconnect:`Bağlantıyı Kes`,howSyncWorks:`Senkronizasyon Nasıl Çalışır`,syncInfoRfidOnly:`Yalnızca RFID'li resmi Bambu Lab makaraları senkronize edilir`,syncInfoAutoCreate:`Yeni makaralar ilk senkronizasyonda Spoolman'da otomatik olarak oluşturulur`,syncInfoThirdPartySkipped:`Bambu Lab dışı makaralar (üçüncü taraf, yeniden doldurulmuş) atlanır`,linkingExistingSpools:`Mevcut Makaraları Bağlama`,linkingExistingSpoolsDesc:`Mevcut Spoolman makaralarını AMS'inize bağlamak için, bir AMS yuvasının üzerine gelin ve "Spoolman'a Bağla"ya tıklayın.`,syncMode:`Senkronizasyon Modu`,syncModeAuto:`Otomatik`,syncModeManual:`Yalnızca Manuel`,syncModeAutoDesc:`Değişiklikler algılandığında AMS verisi otomatik olarak senkronize edilir`,syncModeManualDesc:`Yalnızca manuel olarak tetiklendiğinde senkronize et`,syncAmsData:`AMS Verisini Senkronize Et`,syncAmsDataDesc:`Yazıcı AMS verisini manuel olarak Spoolman'a senkronize et`,allPrinters:`Tüm Yazıcılar`,noDefaultPrinter:`Varsayılan yok (her seferinde sor)`,sidebarOrder:`Kenar çubuğu sırası`,saveThumbnails:`Küçük resimleri kaydet`,captureFinishPhoto:`Bitiş fotoğrafı çek`,noPrintersConfigured:`Yapılandırılmış yazıcı yok`,archiveMode:{always:`Her zaman arşiv girişi oluştur`,never:`Asla arşiv girişi oluşturma`,ask:`Her seferinde sor`},checkForUpdatesLabel:`Güncellemeleri kontrol et`,checkPrinterFirmware:`Yazıcı firmware'ini kontrol et`,includeBetaUpdates:`Beta sürümleri dahil et`,includeBetaUpdatesDesc:`Güncellemeleri kontrol ederken beta ve önyayım sürümleri hakkında bildir`,localLogin:{disable:`Yerel kullanıcı adı/şifre ile oturum açmayı devre dışı bırak`,disableHint:`Etkinleştirildiğinde yalnızca SSO sağlayıcıları ile oturum açılabilir. LDAP etkilenmez. Bir kurtarma yolu açık tutmak için sunucuda BAMBUDDY_LOCAL_LOGIN=true ayarlayın.`},enableRetry:`Yeniden denemeyi etkinleştir`,homeAssistantDescription:`Akıllı prizleri Home Assistant üzerinden kontrol et`,environmentManagedLabel:`(Ortam Yönetiliyor)`,autoEnabledViaEnv:`Ortam değişkenleriyle otomatik etkinleştirildi`,urlFromEnvReadOnly:`Değer HA_URL ortam değişkeniyle ayarlandı (salt okunur)`,tokenFromEnvReadOnly:`Değer HA_TOKEN ortam değişkeniyle ayarlandı (salt okunur)`,mqttConnectedTo:`Bağlı`,prometheusDescription:`Yazıcı verisini Prometheus formatında sun`,noSmartPlugsTitle:`Yapılandırılmış akıllı priz yok`,noSmartPlugsDescription:`Enerji kullanımını takip etmek ve güç kontrolünü otomatikleştirmek için Tasmota tabanlı bir akıllı priz ekleyin.`,noProvidersTitle:`Yapılandırılmış sağlayıcı yok`,noProvidersDescription:`Uyarı almak için bir sağlayıcı ekleyin.`,noTemplatesAvailable:`Şablon mevcut değil. Varsayılan şablonları yüklemek için arka ucu yeniden başlatın.`,apiPermissionView:`Yazıcı durumunu ve kuyruğu görüntüle`,apiPermissionEdit:`Baskı kuyruğundan öğe ekle ve kaldır`,apiKeysEmptyTitle:`API anahtarı yok`,apiKeysEmptyDescription:`Harici servislerle entegre olmak için bir API anahtarı oluşturun.`,noUsersFound:`Kullanıcı bulunamadı`,noGroupsFound:`Grup bulunamadı`,noGroupsAvailable:`Kullanılabilir grup yok`,passwordsDoNotMatch:`Parolalar eşleşmiyor`,systemGroupWarning:`Sistem grubu adları değiştirilemez`,authDisabledTitle:`Kimlik Doğrulama Devre Dışı`,authDisabledFeature1:`Sisteme erişmek için giriş gerektir`,authDisabledFeature2:`Grup tabanlı izinlerle birden fazla kullanıcı oluştur`,authDisabledFeature3:`50'den fazla ayrıntılı izinle erişimi kontrol et`,userHasCreated:`Bu kullanıcı şunları oluşturdu:`,userItemsQuestion:`Bu öğelerle ne yapmak istersiniz?`,deleteUserConfirm:`Bu kullanıcıyı silmek istediğinizden emin misiniz?`,actionCannotBeUndone:`Bu işlem geri alınamaz.`,addFirstSmartPlug:`İlk Akıllı Prizinizi Ekleyin`,providers:`Sağlayıcılar`,log:`Günlük`,testAll:`Hepsini Test Et`,testResults:`Test Sonuçları`,testPassedCount:`{{count}} başarılı`,testFailedCount:`{{count}} başarısız`,messageTemplates:`Mesaj Şablonları`,messageTemplatesDescription:`Her olay için bildirim mesajlarını özelleştirin.`,apiKeys:`API Anahtarları`,apiKeysDescription:`Harici entegrasyonlar ve webhook'lar için API anahtarları oluşturun.`,createKey:`Anahtar Oluştur`,apiKeyCreated:`API Anahtarı Başarıyla Oluşturuldu`,apiKeyCopyWarning:`Bu anahtarı şimdi kopyalayın - bir daha gösterilmeyecek!`,useInApiBrowser:`API Tarayıcısında Kullan`,apiKeyQrButton:`QR kodu`,apiKeyQrTitle:`Yapılandırmak için tarayın`,apiKeyQrCaption:`Bu sunucuyu ve API anahtarını eklemek için mobil uygulamanızla tarayın.`,apiKeyQrWarning:`Gizli API anahtarınızı içerir — başkalarının görebileceği yerlerde paylaşmayın veya ekran görüntüsü almayın.`,createNewApiKey:`Yeni API Anahtarı Oluştur`,keyName:`Anahtar Adı`,keyNamePlaceholder:`örn., Home Assistant, OctoPrint`,readStatus:`Durumu Oku`,readStatusDescription:`Yazıcı durumunu ve kuyruğu görüntüle`,manageQueue:`Kuyruğu Yönet`,manageQueueDescription:`Baskı kuyruğundan öğe ekle ve kaldır`,controlPrinter:`Yazıcıyı Kontrol Et`,controlPrinterDescription:`Baskıları duraklat, devam ettir ve durdur`,manageLibrary:`Kütüphaneyi Yönet`,manageLibraryDescription:`Kütüphane dosyalarını yükle, yeniden adlandır ve sil; MakerWorld'den model içe aktar`,manageInventory:`Envanteri Yönet`,manageInventoryDescription:`Makaraları ve envanter kayıtlarını oluştur, güncelle ve sil. SpoolBuddy kiosklar (NFC tarama, tartı okumaları, kiosk sistem komutları) için gereklidir.`,manageMaintenance:`Bakımı yönet`,manageMaintenanceDescription:`Tamamlanan bakımları kaydet, sayaçları sıfırla, aralıkları düzenle ve bakım türü kataloğunu yönet. Daha geniş yazıcı kontrolü vermeden "nozulu temizledim"i kaydeden Home Assistant otomasyonlarına uygundur.`,manageArchives:`Arşivleri yönet`,manageArchivesDescription:`Eski baskıların kaldırılması dahil olmak üzere baskı arşivlerini düzenleyin ve silin. İstatistik katkılarının temizlenmesini içermez. Baskı geçmişini budayan otomasyonlar için uygundur.`,manageProjects:`Projeleri yönet`,manageProjectsDescription:`Projeleri oluşturun, güncelleyin ve silin, ayrıca bunlara arşiv ekleyin. Baskıları projeler halinde düzenleyen otomasyonlar için uygundur.`,maintenanceBadge:`Bakım`,archivesBadge:`Arşivler`,projectsBadge:`Projeler`,libraryBadge:`Kütüphane`,inventoryBadge:`Envanter`,cloudAccess:`Bulut erişimine izin ver`,cloudAccessDescription:`Adınıza Bambu Bulut ön ayarlarını ve filamentleri okuyun. Bambu Bulut'a giriş yapmış olmanız gerekir.`,cloudBadge:`Bulut`,updateEnergyCost:`Elektrik fiyatını güncelle`,updateEnergyCostDescription:`Bu anahtarın /settings/electricity-price üzerine yeni bir kWh başına elektrik fiyatı POST etmesine izin ver. Home Assistant dinamik tarife otomasyonları (Tibber, Octopus, vb.) için kullanışlıdır. Bu, API anahtarıyla yazılabilen tek ayar alanıdır.`,energyCostBadge:`Enerji`,legacyKey:`Eski`,legacyKeyTooltip:`Kullanıcı başına sahiplikten önce oluşturuldu; bulut erişimini kullanmak için yeniden oluşturun`,unnamedKey:`Adsız Anahtar`,lastUsed:`Son kullanım`,read:`Oku`,control:`Kontrol`,createFirstKey:`İlk Anahtarınızı Oluşturun`,webhookEndpoints:`Webhook Uç Noktaları`,webhookApiKeyHint:`API anahtarınızı X-API-Key başlığında kullanın.`,webhook:{getAllStatus:`Tüm yazıcı durumlarını al`,getSpecificStatus:`Belirli yazıcı durumunu al`,addToQueue:`Baskı kuyruğuna ekle`,pausePrint:`Baskıyı duraklat`,resumePrint:`Baskıya devam et`,stopPrint:`Baskıyı durdur`},apiBrowser:`API Tarayıcısı`,apiBrowserDescription:`Mevcut tüm API uç noktalarını keşfedin ve test edin.`,apiKeyForTesting:`Test için API Anahtarı`,apiKeyPlaceholder:`Kimlik doğrulamalı uç noktaları test etmek için API anahtarınızı buraya yapıştırın...`,apiKeyHint:`Bu anahtar isteklerle birlikte X-API-Key başlığı olarak gönderilecek.`,deleteApiKeyTitle:`API Anahtarını Sil`,deleteApiKeyMessage:`Bu API anahtarını silmek istediğinizden emin misiniz? Bu anahtarı kullanan tüm entegrasyonlar çalışmayı durduracak.`,deleteKey:`Anahtarı Sil`,amsDisplayThresholds:`AMS Görüntü Eşikleri`,amsThresholdsDescription:`AMS nem ve sıcaklık göstergeleri için renk eşiklerini yapılandırın.`,humidity:`Nem`,goodGreen:`İyi (yeşil)`,fairOrange:`Orta (turuncu)`,aboveFairBad:`Orta eşiğin üstü kırmızı olarak gösterilir (kötü)`,fairAlsoDryingThreshold:`Bu eşik aynı zamanda etkinleştirildiğinde otomatik kurutmayı tetiklemek için de kullanılır`,temperature:`Sıcaklık`,goodBlue:`İyi (mavi)`,aboveFairHot:`Orta eşiğin üstü kırmızı olarak gösterilir (sıcak)`,historyRetention:`Geçmiş Saklama`,keepSensorHistory:`Sensör geçmişini sakla`,historyRetentionDescription:`Daha eski nem ve sıcaklık verileri otomatik olarak silinecek`,defaultPrintOptions:`Varsayılan Baskı Seçenekleri`,defaultPrintOptionsDescription:`Yeni baskılar başlatılırken baskı seçenekleri için varsayılan değerleri ayarlayın. Bunlar baskı iletişim kutusunda baskı başına geçersiz kılınabilir.`,defaultBedLevelling:`Tabla Seviyelendirme`,defaultBedLevellingDesc:`Baskıdan önce tablayı otomatik seviyelendir`,defaultFlowCali:`Akış Kalibrasyonu`,defaultFlowCaliDesc:`Ekstrüzyon akışını kalibre et`,defaultVibrationCali:`Titreşim Kalibrasyonu`,defaultVibrationCaliDesc:`Çınlama artefaktlarını azalt`,defaultLayerInspect:`İlk Katman Denetimi`,defaultLayerInspectDesc:`İlk katmanın AI denetimi`,defaultTimelapse:`Zaman Atlamalı Video`,defaultTimelapseDesc:`Zaman atlamalı video kaydet`,defaultNozzleOffsetCali:`Nozül Ofset Kalibrasyonu`,defaultNozzleOffsetCaliDesc:`Ekstrüderler arasındaki nozül ofsetlerini kalibre et`,tempFanPresetsTitle:`Sıcaklık ve Fan Ön Ayarları`,tempFanPresetsDescription:`Yazıcı kartı sıcaklık ve fan hızı pencerelerinde gösterilen hızlı seçim değerlerini özelleştirin. Kapalı düğmesi her zaman gösterilir.`,tempFanPresetsNozzle:`Nozül sıcaklığı`,tempFanPresetsBed:`Tabla sıcaklığı`,tempFanPresetsChamber:`Hazne sıcaklığı`,tempFanPresetsFan:`Fan hızı`,tempFanPresetsReset:`Varsayılanlara sıfırla`,concurrentUploadsTitle:`Eşzamanlı Yüklemeler`,concurrentUploadsDescription:`Kuyruğun aynı anda kaç yazıcıya dosya gönderebileceği. Yazıcılar dosyaları yavaş alır (büyük bir baskı birkaç dakika sürebilir) ve her biri sırasını bekler; bu nedenle büyük bir filoda bu değeri artırmak, bir gruptaki son yazıcının kendisinden önceki tüm aktarımları beklemesini önler. Ağınız veya Bambuddy sunucunuz paralel aktarımlarda zorlanıyorsa değeri düşürün.`,concurrentUploadsLabel:`Aynı anda dosya gönderilen yazıcı sayısı`,concurrentUploadsHelp:`1, aynı anda tek yazıcıya gönderir (eski davranış). Varsayılan 4'tür.`,staggeredStart:`Kademeli Başlatma`,staggeredStartDescription:`Çoklu yazıcı toplu başlatmaları kademelendirilirken varsayılan grup boyutu ve aralığı. Baskı modalinde yığın başına geçersiz kılınabilir.`,preheatTitle:`Ön Isıtma & Heat Soak`,preheatDescription:`Kuyruktaki her baskı başlamadan önce tablayı (ve destekleniyorsa odayı) ısıtır ve sıcaklığı korur. Aktif oda ısıtıcısı olmayan yazıcılarda mühendislik filamentleri (PA, ABS) için yararlıdır — soak zamanlayıcısı çalışırken tabla, odayı radyasyonla ısıtır. Tabla hedef sıcaklığı baskı dosyasından okunur; oda davranışı yazıcı modeline bağlıdır.`,preheatEnabled:`Ön ısıtma & soak'u etkinleştir`,preheatEnabledDesc:`Kapalıyken kuyruktaki baskılar hemen başlar. Her kuyruk öğesi baskı bazında geçersiz kılabilir.`,preheatFilamentTargetsLabel:`Filament başına oda hedefi (°C)`,preheatFilamentTargetsHint:`Bambuddy yüklü AMS yuvaları arasındaki en yüksek hedefi seçer; yalnız PLA baskıları 0 türeterek oda aşamasını otomatik atlar.`,preheatFilamentTargetsReset:`Varsayılanlara sıfırla`,preheatFilamentTargetsDefaultRow:`Diğer / eşlenmemiş`,preheatMaxWait:`Maks. bekleme (saniye)`,preheatMaxWaitHelp:`Soak'a geçilmeden önce oda ısıtma aşaması için üst sınır.`,preheatSoak:`Soak (saniye)`,preheatSoakHelp:`Hedefe ulaşıldıktan veya maks. bekleme dolduktan sonra tutma süresi.`,preheatHardwareTitle:`Yazıcıya göre davranış:`,preheatHardwareDetail:`H2C/H2D/H2D Pro/H2S/X2D/X1E odayı M141 ile aktif ısıtır. X1C/P2S oda sıcaklığını okur ancak yalnızca tabla radyasyonu ile ısınır. P1S/P1P/A1/A1 Mini'de oda sensörü yoktur — yalnızca soak zamanlayıcısı geçerlidir.`,preheatPerItemDesc:`Bu baskı başlamadan önce tablayı ve odayı ısıtın. Varsayılan olarak Ayarlar → İş Akışı genel anahtarını kullanır.`,preheatOverride_inherit:`Devral`,preheatOverride_on:`Açık`,preheatOverride_off:`Kapalı`,preheatTargetOverride:`Oda hedefini geçersiz kıl (°C, boş = filament varsayılanı)`,plateClear:`Plaka Temizleme Onayı`,requirePlateClear:`Plaka temizleme onayı gerektir`,requirePlateClearDescription:`Etkinleştirildiğinde, planlayıcı bitmiş işleri olan yazıcılarda kuyruktaki baskıları başlatmadan önce yazıcı başına plaka temizleme onayını bekler. Bunu devre dışı bırakmak ayrıca plaka durum rozetini ve yazıcı kartlarındaki "Plakayı temizlendi olarak işaretle" düğmesini gizler.`,gcodeInjection:`G-kod Enjeksiyonu`,gcodeInjectionDescription:`Farmloop, SwapMod, AutoClear ve Printflow 3D gibi otomatik baskı sistemleri için baskıların başlangıcında ve/veya sonunda enjekte edilecek özel G-kodu yapılandırın. Parçacıklar yazıcı modeli başına yapılandırılır ve bir kuyruk öğesinde "G-kod Enjekte Et" etkinleştirildiğinde uygulanır.`,gcodeInjectionNoPrinters:`Yazıcı bulunamadı. G-kod parçacıklarını yapılandırmak için yazıcı ekleyin.`,gcodeStartLabel:`Başlangıç G-kodu`,gcodeEndLabel:`Bitiş G-kodu`,gcodeStartPlaceholder:`Baskı başlamadan önce eklenecek G-kodu...`,gcodeEndPlaceholder:`Baskı bittikten sonra eklenecek G-kodu...`,staggerGroupSize:`Grup boyutu`,staggerGroupSizeHelp:`Grup başına eş zamanlı başlatılacak yazıcılar`,staggerInterval:`Aralık (dakika)`,staggerIntervalHelp:`Her grubun başlatılması arasındaki gecikme`,queueDrying:`Kuyruk Otomatik Kurutma`,queueDryingDescription:`Kuyruktaki baskılar arasında yazıcı boştayken AMS filamentini otomatik olarak kurut. Kurutmayı tetiklemek için yukarıdaki nem eşiğini kullanır.`,queueDryingEnabled:`Otomatik kurutmayı etkinleştir`,queueDryingEnabledDescription:`Yazıcı boştayken ve nem eşiğin üzerindeyken AMS kurutmasını otomatik olarak başlat`,queueDryingBlock:`Kurutmanın tamamlanmasını bekle`,queueDryingBlockDescription:`Kurutma bitene kadar baskı kuyruğunu engelle. Kapalıyken, baskılar kurutmadan önceliklidir.`,ambientDryingEnabled:`Ortam kurutma`,ambientDryingEnabledDescription:`Kuyrukta baskı olmasa bile, nem eşiği aştığında boşta yazıcılarda filamenti otomatik olarak kurut.`,printDryingEnabled:`Baskı sırasında kurutmaya devam et`,printDryingEnabledDescription:`Desteklenen donanımda (H2D, H2C, H2S, P2S, H2D Pro, X2D, X1C, A2L güncel firmware ile) baskı sırasında otomatik kurutmanın çalışmaya devam etmesine izin verir. Makara koruması için kurutma sıcaklığı otomatik olarak boştaki ön ayarın 5°C altına sınırlandırılır.`,dryingPresets:`Kurutma Ön Ayarları`,dryingPresetsDescription:`Filament türü başına sıcaklık ve süre. AMS 2 Pro daha düşük sıcaklıklar kullanır, AMS-HT daha yüksek sıcaklıkları destekler.`,dryingFilament:`Filament`,humidityThresholds:`Nem Eşikleri`,humidityThresholdsDescription:`Otomatik kurutma ve alarmlar için filament türüne göre nem tetikleyici. Tek AMS'te karışık yükler en düşük eşiği kullanır.`,humidityThresholdCol:`Eşik`,humidityThresholdDefault:`Varsayılan (bilinmeyen türler)`,printModal:`Baskı Modali`,expandCustomMapping:`Özel eşlemeyi varsayılan olarak genişlet`,expandCustomMappingDescription:`Birden fazla yazıcıya yazdırırken, yazıcı başına AMS eşlemesini genişletilmiş olarak göster`,authentication:`Kimlik Doğrulama`,authEnabledDescription:`Örneğiniz kullanıcı kimlik doğrulamayla güvende`,authDisabledDescription:`Girişi gerektirmek ve kullanıcı erişimini yönetmek için etkinleştir`,authDisabledMessage:`Kullanıcı hesapları oluşturmak, izinleri yönetmek ve Bambuddy örneğinizi güvende tutmak için kimlik doğrulamayı etkinleştirin.`,enableAuthentication:`Kimlik Doğrulamayı Etkinleştir`,currentUser:`Mevcut Kullanıcı`,changePassword:`Parolayı Değiştir`,admin:`Yönetici`,users:`Kullanıcılar`,addUser:`Kullanıcı Ekle`,groups:`Gruplar`,addGroup:`Grup Ekle`,system:`Sistem`,noDescription:`Açıklama yok`,userCount:`{{count}} kullanıcı`,permissionCount:`{{count}} izin`,createUser:`Kullanıcı Oluştur`,username:`Kullanıcı Adı`,enterUsername:`Kullanıcı adı girin`,password:`Parola`,enterPassword:`Parola girin`,passwordRequirements:`En az 8 karakter, bir büyük harf, bir küçük harf, bir rakam ve bir özel karakter ile.`,confirmPassword:`Parolayı Onayla`,confirmPasswordPlaceholder:`Parolayı onayla`,viewReleaseOnGitHub:`Yayını GitHub'da görüntüle`,turnAllPlugsOn:`Tüm prizleri aç`,turnAllPlugsOff:`Tüm prizleri kapat`,clearNotificationLogs:`Bildirim Günlüklerini Temizle`,clearLogsMessage:`Bu, 30 günden eski tüm bildirim günlüklerini kalıcı olarak silecek. Bu işlem geri alınamaz.`,clearLogs:`Günlükleri Temizle`,resetUiPreferences:`Arayüz Tercihlerini Sıfırla`,resetUiPreferencesMessage:`Bu, tüm arayüz tercihlerini varsayılana sıfırlayacak: kenar çubuğu sırası, tema, gösterge paneli düzeni, görünüm modları ve sıralama tercihleri. Yazıcılarınız, arşivleriniz ve sunucu ayarlarınız ETKİLENMEYECEK. Sayfa temizleme sonrası yeniden yüklenecek.`,resetPreferences:`Tercihleri Sıfırla`,deleteGroupTitle:`Grubu Sil`,deleteGroupMessage:`Bu grubu silmek istediğinizden emin misiniz? Bu gruptaki kullanıcılar bu izinleri kaybedecek.`,deleteGroup:`Grubu Sil`,disableAuthenticationTitle:`Kimlik Doğrulamayı Devre Dışı Bırak`,disableAuthenticationMessage:`Kimlik doğrulamayı devre dışı bırakmak istediğinizden emin misiniz? Bu, Bambuddy örneğinizi giriş yapmadan erişilebilir hale getirecek. Tüm kullanıcılar veritabanında kalacak ancak kimlik doğrulama devre dışı bırakılacak.`,disableAuthentication:`Kimlik Doğrulamayı Devre Dışı Bırak`,configureBambuddy:`Bambuddy'yi Yapılandır`,systemDefault:`Sistem Varsayılanı`,archiveSettings:`Arşiv Ayarları`,newWindow:`Yeni Pencere`,embeddedOverlay:`Gömülü Bindirme`,preferredSlicer:`Tercih Edilen Dilimleyici`,preferredSlicerDescription:`Uygulama içi dilimleme için API yardımcı kabıyla kullanılan dilimleyici`,openInSlicerLabel:`Dilimleyicide Aç`,openInSlicerInherit:`API dilimleyicisiyle aynı`,openInSlicerDescription:`'Dilimleyicide Aç' düğmesinin kullandığı masaüstü dilimleyici. Devralmak için 'API dilimleyicisiyle aynı' bırakın veya yerel olarak kullanmak için farklı bir dilimleyici seçin.`,orcaslicerKnownIssuesWarning:`OrcaSlicer 2.3.2 / 2.4.0-dev, birçok Bambu yazılı 3MF'nin dilimlenmesini engelleyen bilinen CLI hatalarına sahiptir — yukarı yöndeki #12426 (boyalı çok ekstrüderli dosyalarda segfault) ve #13386 (parametre aralığı katı doğrulama reddi) sorunlarına bakın. Yukarı yön düzeltmeler gelene kadar Bambu Studio önerilir.`,useSlicerApi:`Dilimleyici API kullan`,useSlicerApiDescription:`Açıkken, "Dilimle" eylemleri uygulama içi dilimleyici modalini açar ve dilimleyici-API yardımcı bileşenini çağırır. Kapalıyken (varsayılan), URI şeması üzerinden masaüstü dilimleyiciye devredilirler.`,slicerCard:`Dilimleyici`,orcaslicerApiUrl:`OrcaSlicer yardımcı bileşen URL`,bambuStudioApiUrl:`Bambu Studio yardımcı bileşen URL`,slicerApiUrlDescription:`Dilimleyici-API yardımcı bileşen konteynerinin URL'si. SLICER_API_URL / BAMBU_STUDIO_API_URL ortam değişkeni varsayılanlarını kullanmak için boş bırakın.`,slicerBundlesRemoved:{title:`Dilimleyici Paketleri (kaldırıldı)`,description:`Yazıcı Ön Ayar Paketi (.bbscfg) içe aktarma kaldırıldı. BambuStudio'nun paket dışa aktarması yalnızca kullanıcı tarafından özelleştirilmiş ön ayarları içerir, bu nedenle içe aktarma hiçbir zaman standart süreçleri / filamentleri sağlamadı ve dilimleme gömülü ayarlara geri döndü.`,alternatives:`Bireysel özelleştirmeler için Tekli Ön Ayar İçe Aktarma'yı kullanın veya Bambu Cloud / Orca Cloud üzerinden senkronize edin. Standart ön ayarlar otomatik olarak dilimleyici sidecar'ından gelir.`,lookupOrder:`Dilimleme sırasında ön ayar arama sırası: 1) İçe aktarılmış (yerel), 2) Orca Cloud, 3) Bambu Cloud, 4) Standart (sidecar yedeği).`},externalCameras:`Harici Kameralar`,costTracking:`Maliyet Takibi`,printsOnly:`Yalnızca Baskılar`,totalConsumption:`Toplam Tüketim`,dataManagement:`Veri Yönetimi`,storageUsage:`Depolama Kullanımı`,storageUsageDescription:`Kategoriye göre veri kullanımı dökümü`,storageUsageTotal:`Toplam`,storageUsageErrors:`Hatalar`,storageUsageOtherBreakdown:`Diğer (statik varlıklar, betikler ve yapılandırma dosyaları dahil)`,storageUsageSystem:`Sistem`,storageUsageData:`Veri`,storageUsageUnavailable:`Depolama kullanım bilgisi mevcut değil`,clearNotificationLogsDescription:`30 günden eski bildirim günlüklerini sil`,resetUiPreferencesDescription:`Kenar çubuğu sırası, tema, görünüm modları ve düzen tercihlerini sıfırla. Yazıcılar, arşivler ve ayarlar etkilenmez.`,enableHomeAssistant:`Home Assistant'ı Etkinleştir`,enableMqtt:`MQTT'yi Etkinleştir`,useTls:`TLS Kullan`,enableMetricsEndpoint:`Metrikler Uç Noktasını Etkinleştir`,availableMetrics:`Kullanılabilir Metrikler`,editUser:`Kullanıcıyı Düzenle`,deleteUserTitle:`Kullanıcıyı Sil`,groupName:`Grup Adı`,leaveEmptyForAnonymous:`Anonim için boş bırakın`,leaveEmptyForNoAuth:`Kimlik doğrulama olmaması için boş bırakın`,enterNewPassword:`Yeni parola girin`,confirmNewPassword:`Yeni parolayı onayla`,enterGroupName:`Grup adını girin`,enterDescriptionOptional:`Açıklama girin (isteğe bağlı)`,enterCurrentPassword:`Mevcut parolayı girin`,enterNewPasswordMin6:`Yeni parolayı girin (en az 6 karakter)`,toast:{keyCopied:`Anahtar panoya kopyalandı`,copyFailed:`Anahtar kopyalanamadı`,keyAddedToBrowser:`Anahtar API Tarayıcısına eklendi`,clearLogsFailed:`Günlükler temizlenemedi`,uiPreferencesReset:`Arayüz tercihleri sıfırlandı. Yenileniyor...`,authDisabled:`Kimlik doğrulama başarıyla devre dışı bırakıldı`,authDisableFailed:`Kimlik doğrulama devre dışı bırakılamadı`,apiKeyCreated:`API anahtarı oluşturuldu`,apiKeyDeleted:`API anahtarı silindi`,userCreated:`Kullanıcı başarıyla oluşturuldu`,userUpdated:`Kullanıcı başarıyla güncellendi`,userDeleted:`Kullanıcı başarıyla silindi`,groupCreated:`Grup başarıyla oluşturuldu`,groupUpdated:`Grup başarıyla güncellendi`,groupDeleted:`Grup başarıyla silindi`,fillRequiredFields:`Lütfen tüm zorunlu alanları doldurun`,passwordsDoNotMatch:`Parolalar eşleşmiyor`,passwordTooShort:`Parola en az 8 karakter olmalı`,passwordNeedsUppercase:`Parola en az bir büyük harf içermeli`,passwordNeedsLowercase:`Parola en az bir küçük harf içermeli`,passwordNeedsDigit:`Parola en az bir rakam içermeli`,passwordNeedsSpecial:`Parola en az bir özel karakter içermeli`,enterGroupName:`Lütfen bir grup adı girin`,settingsSaved:`Ayarlar kaydedildi`,noPermissionUpdate:`Ayarları değiştirme izniniz yok`,cameraSettingsSaved:`Kamera ayarları kaydedildi`,enterCameraUrl:`Lütfen bir kamera URL'si girin`,passwordChanged:`Parola başarıyla değiştirildi`,connectionFailed:`Bağlantı başarısız`,testFailed:`Test başarısız`,cameraConnected:`Kamera bağlandı{{resolution}}`},testConnection:`Bağlantıyı Test Et`,catalog:{spoolCatalog:`Makara Kataloğu`,spoolCatalogDescription:`Marka/türe göre boş makara ağırlıkları. Makara eklerken otomatik ağırlık araması için kullanılır.`,searchCatalog:`Katalogda ara...`,addNewEntry:`Yeni Giriş Ekle`,namePlaceholder:`Ad (örn., Bambu Lab - Plastik)`,weight:`Ağırlık`,type:`Tür`,default:`Varsayılan`,custom:`Özel`,noMatch:`Aramanızla eşleşen giriş yok`,empty:`Katalogda giriş yok`,deleteEntry:`Girişi Sil`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz?`,resetCatalog:`Kataloğu Sıfırla`,resetConfirm:`Katalog varsayılana sıfırlansın mı? Bu, tüm özel girişleri kaldıracak.`,loadFailed:`Makara kataloğu yüklenemedi`,nameWeightRequired:`Ad ve ağırlık gereklidir`,entryAdded:`Giriş eklendi`,addFailed:`Giriş eklenemedi`,entryUpdated:`Giriş güncellendi`,updateFailed:`Giriş güncellenemedi`,entryDeleted:`Giriş silindi`,deleteFailed:`Giriş silinemedi`,resetSuccess:`Katalog varsayılana sıfırlandı`,resetFailed:`Katalog sıfırlanamadı`,exported:`{{count}} giriş dışa aktarıldı`,imported:`{{added}} giriş içe aktarıldı ({{skipped}} atlandı)`,importFailed:`İçe aktarma başarısız: geçersiz JSON formatı`,exportTooltip:`Kataloğu JSON'a dışa aktar`,importTooltip:`Kataloğu JSON'dan içe aktar`,resetTooltip:`Varsayılana sıfırla`,selectedCount:`{{count}} seçildi`,deleteSelected:`Seçilenleri Sil`,bulkDeleteConfirm:`{{count}} girişi silmek istediğinizden emin misiniz?`,bulkDeleted:`{{count}} giriş silindi`,bulkDeleteFailed:`Girişler silinemedi`,material:`Malzeme`,spoolWeight:`Makara Ağırlığı`,color:`Renk`,updateSpoolWeight:`Makara Ağırlığını Güncelle`,filamentUpdated:`Filament güncellendi`,filamentUpdateFailed:`Filament güncellenemedi`,filamentUpdateInvalid:`Geçersiz filament verisi`,keepExistingSpoolWeight:`Mevcut makaralar için eski ağırlığı koru`,keepExistingSpoolWeightDesc:`Bu filament türüyle önceden oluşturulmuş makaralar eski boş ağırlığı korur. Yeni makaralar güncellenmiş değeri kullanır.`,applyToAllSpools:`Tüm makaralara uygula`,applyToAllSpoolsDesc:`Bu filament türü için tüm ağırlık hesaplamaları hemen yeni boş ağırlığı kullanır.`},colorCatalog:{title:`Renk Kataloğu`,description:`Üreticiye/malzemeye göre filament renkleri. Makara eklerken otomatik renk araması için kullanılır.`,searchColors:`Renklerde ara...`,allManufacturers:`Tüm üreticiler`,addNewColor:`Yeni Renk Ekle`,manufacturer:`Üretici`,colorName:`Renk Adı`,hex:`Hex`,materialOptional:`Malzeme (isteğe bağlı)`,showing:`{{total}} renkten {{filtered}} tanesi gösteriliyor`,noMatch:`Aramanızla eşleşen renk yok`,empty:`Katalogda renk yok`,deleteColor:`Rengi Sil`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz?`,resetCatalog:`Renk Kataloğunu Sıfırla`,resetConfirm:`Katalog varsayılana sıfırlansın mı? Bu, tüm özel renkleri kaldıracak.`,sync:`Senkronize Et`,starting:`Başlatılıyor...`,syncTooltip:`FilamentColors.xyz'den senkronize et (2000+ renk, bir dakika sürebilir)`,loadFailed:`Renk kataloğu yüklenemedi`,fieldsRequired:`Üretici, renk adı ve hex renk gereklidir`,colorAdded:`Renk eklendi`,addFailed:`Renk eklenemedi`,colorUpdated:`Renk güncellendi`,updateFailed:`Renk güncellenemedi`,colorDeleted:`Renk silindi`,deleteFailed:`Renk silinemedi`,resetSuccess:`Renk kataloğu varsayılana sıfırlandı`,resetFailed:`Katalog sıfırlanamadı`,syncUpToDate:`Zaten güncel ({{count}} renk kontrol edildi)`,syncComplete:`{{added}} yeni renk eklendi ({{skipped}} zaten mevcuttu)`,syncError:`Senkronizasyon hatası`,syncFailed:`FilamentColors.xyz'den senkronize edilemedi`,exported:`{{count}} renk dışa aktarıldı`,imported:`{{added}} renk içe aktarıldı ({{skipped}} atlandı)`,importFailed:`İçe aktarma başarısız: geçersiz JSON formatı`,selectedCount:`{{count}} seçildi`,deleteSelected:`Seçilenleri Sil`,bulkDeleteConfirm:`{{count}} rengi silmek istediğinizden emin misiniz?`,bulkDeleted:`{{count}} renk silindi`,bulkDeleteFailed:`Renkler silinemedi`},dateFormat:`Tarih Formatı`,dateFormatUs:`ABD (AA/GG/YYYY)`,dateFormatEu:`AB (GG/AA/YYYY)`,dateFormatIso:`ISO (YYYY-AA-GG)`,timeFormat:`Saat Formatı`,timeFormat12:`12 saat (3:30 PM)`,timeFormat24:`24 saat (15:30)`,defaultPrinter:`Varsayılan Yazıcı`,defaultPrinterDescription:`Yüklemeler, tekrar baskılar ve diğer işlemler için bu yazıcıyı önceden seç.`,slicerBambuStudio:`Bambu Studio`,slicerOrcaSlicer:`OrcaSlicer`,sidebarOrderDescription:`Öğeleri yeniden sıralamak, görünürlüğü sıfırlamak ve özel bağlantıları yönetmek için Kenar çubuğu düzenini kullanın.`,setDefault:`Varsayılan Yap`,sidebarOrderSetDefaultHint:`Varsayılan ayarla, mevcut menü sırasını henüz özelleştirmemiş kullanıcılara uygular.`,sidebarDefaultSet:`Varsayılan menü sırası ayarlandı.`,sidebarDefaultCleared:`Varsayılan menü sırası temizlendi.`,sidebarDefaultFailed:`Varsayılan menü sırası ayarlanamadı.`,reset:`Sıfırla`,darkMode:`Koyu Mod`,lightMode:`Açık Mod`,active:`(aktif)`,background:`Arka Plan`,accent:`Vurgu`,style:`Stil`,bgNeutral:`Nötr`,bgWarm:`Sıcak`,bgCool:`Soğuk`,bgOled:`OLED Siyah`,bgSlate:`Arduvaz Mavisi`,bgForest:`Orman Yeşili`,accentGreen:`Yeşil`,accentTeal:`Camgöbeği`,accentBlue:`Mavi`,accentOrange:`Turuncu`,accentPurple:`Mor`,accentRed:`Kırmızı`,styleClassic:`Klasik`,styleGlow:`Parıltı`,styleVibrant:`Canlı`,themeToggleHint:`Kenar çubuğundaki güneş/ay simgesini kullanarak koyu ve açık mod arasında geçiş yapın.`,autoArchivePrints:`Baskıları otomatik arşivle`,autoArchiveDescription:`Baskılar tamamlandığında 3MF dosyalarını otomatik olarak kaydet`,saveThumbnailsDescription:`3MF dosyalarından önizleme görüntülerini çıkar ve kaydet`,captureFinishPhotoDescription:`Baskı tamamlandığında yazıcı kamerasından bir fotoğraf çek. Bambuddy, baskı sırasında kısa bir zaman atlamalı kayıt yapar, böylece fotoğraf tabla inmeden önceki andan alınabilir. Bu baskı için zaman atlamalı kaydı etkinleştirdiyseniz dosya saklanır, aksi takdirde fotoğraf çekildikten sonra otomatik olarak silinir.`,ffmpegNotInstalled:`ffmpeg yüklü değil`,ffmpegRequired:`Kamera yakalama ffmpeg gerektirir. brew install ffmpeg (macOS) veya apt install ffmpeg (Linux) ile yükleyin.`,camera:`Kamera`,cameraViewMode:`Kamera Görüntüleme Modu`,cameraOverlayDescription:`Kamera ana ekranda yeniden boyutlandırılabilir bir bindirmede açılır`,cameraWindowDescription:`Kamera ayrı bir tarayıcı penceresinde açılır`,externalCamerasDescription:`Yerleşik yazıcı kamerasını değiştirmek için harici kameraları yapılandırın. MJPEG akışlarını, RTSP, HTTP anlık görüntüleri ve USB kameralarını (V4L2) destekler. Etkinleştirildiğinde, harici kamera canlı görüntüleme ve bitiş fotoğrafları için kullanılır.`,cameraPlaceholderUsb:`Cihaz yolu (/dev/video0)`,cameraPlaceholderUrl:`Kamera URL'si (rtsp://... veya http://...)`,cameraTypeMjpeg:`MJPEG Akışı`,cameraTypeRtsp:`RTSP Akışı`,cameraTypeSnapshot:`HTTP Anlık Görüntü`,cameraTypeUsb:`USB Kamera (V4L2)`,cameraSnapshotUrl:`Anlık Görüntü URL (isteğe bağlı)`,cameraSnapshotUrlPlaceholder:`http://192.168.1.61:1984/api/frame.jpeg?src=printer`,cameraSnapshotUrlHelp:`Bildirim küçük resimleri, bitiş fotoğrafları, katman zaman atlamalı kareler ve plaka algılama için kullanılan tek kare URL'si. Zaman atlamalı video ve plaka algılama, her birinin kendi yazıcı başına anahtarı gerektirir — bu URL yalnızca aktif olduklarında çektikleri görüntü kaynağıdır. Yukarıdaki canlı akıştan yakalamak için boş bırakın. go2rtc (/api/frame.jpeg) ve özel anlık görüntü uç noktasına sahip IP kameraları için kullanışlıdır.`,cameraRotation:`Döndürme`,test:`Test`,connected:`Bağlı`,disconnected:`Bağlı değil`,currency:`Para Birimi`,defaultFilamentCost:`Varsayılan filament maliyeti (kg başına)`,electricityCost:`kWh başına elektrik maliyeti`,energyDisplayMode:`Enerji görüntüleme modu`,energyModePrintDescription:`Gösterge paneli, baskılar sırasında kullanılan enerji toplamını gösterir`,energyModeTotalDescription:`Gösterge paneli, akıllı prizlerden ömür boyu enerjiyi gösterir`,fileManager:`Dosya Yöneticisi`,createArchiveEntry:`Yazdırırken Arşiv Girişi Oluştur`,createArchiveEntryDescription:`Dosya Yöneticisinden yazdırırken isteğe bağlı olarak bir arşiv girişi oluştur`,lowDiskSpaceWarning:`Düşük Disk Alanı Uyarısı`,lowDiskSpaceDescription:`Boş disk alanı bu eşiğin altına düştüğünde uyarı göster`,printerFirmware:`Yazıcı Firmware`,checkFirmwareDescription:`Bambu Lab'dan yazıcı firmware güncellemelerini kontrol et`,bambuddySoftware:`Bambuddy Yazılımı`,autoCheckDescription:`Başlangıçta otomatik olarak yeni sürümleri kontrol et`,checkNow:`Şimdi kontrol et`,updateAvailableVersion:`Güncelleme mevcut: v{{version}}`,releaseNotes:`Sürüm Notları`,updateViaDocker:`Docker Compose ile güncelle:`,updateViaHomeAssistant:`Güncellemeler Home Assistant Supervisor tarafından yönetilir. Yeni sürümü yüklemek için Home Assistant'ta Ayarlar → Eklentiler → Bambuddy'ye gidin.`,updateViaWindowsInstaller:`Windows kurulumları, kurucu yeniden çalıştırılarak güncellenir. Yeni sürümü aşağıdan indirin — verileriniz, ayarlarınız ve yazıcılarınız korunur.`,downloadWindowsInstaller:`v{{version}} için kurucuyu indir`,installUpdate:`Güncellemeyi Yükle`,latestVersionRunning:`En son sürümü çalıştırıyorsunuz`,failedToCheckUpdates:`Güncellemeler kontrol edilemedi: {{error}}`,backupRestore:`Yedekleme ve Geri Yükleme`,backupRestoreDescription:`Ayarları dışa/içe aktar ve GitHub yedeklemesini yapılandır`,goToBackup:`Yedeklemeye Git`,externalUrl:`Harici URL`,externalUrlDescription:`Bambuddy'nin erişilebildiği harici URL. Bildirim görüntüleri ve harici entegrasyonlar için kullanılır.`,bambuddyUrl:`Bambuddy URL`,externalUrlHint:`Protokol ve port dahil edin (örn., http://192.168.1.100:8000)`,ftpRetry:`FTP Yeniden Dene`,ftpRetryDescription:`Yazıcı WiFi güvenilmez olduğunda FTP işlemlerini yeniden dene. 3MF indirmelerine, baskı yüklemelerine, zaman atlamalı video indirmelerine ve firmware güncellemelerine uygulanır.`,autoRetryDescription:`Başarısız FTP işlemlerini otomatik olarak yeniden dene`,retryAttempts:`Yeniden deneme sayısı`,retryDelay:`Yeniden deneme gecikmesi`,connectionTimeout:`Bağlantı zaman aşımı`,time_one:`{{count}} kez`,time_other:`{{count}} kez`,second_one:`{{count}} saniye`,second_other:`{{count}} saniye`,nSeconds:`{{count}} saniye`,increaseForWeakWifi:`Zayıf WiFi'li yazıcılar için artırın`,homeAssistant:`Home Assistant`,homeAssistantFullDescription:`HA'nın REST API'si üzerinden akıllı prizleri kontrol etmek için Home Assistant'a bağlanın. switch, light, input_boolean ve script varlıklarını destekler.`,homeAssistantUrl:`Home Assistant URL`,longLivedAccessToken:`Uzun Ömürlü Erişim Belirteci`,haTokenHint:`HA'da belirteç oluşturun: Profil → Uzun Ömürlü Erişim Belirteçleri → Belirteç Oluştur`,connectionSuccessful:`Bağlantı Başarılı`,connectionFailed:`Bağlantı Başarısız`,haConnectionSuccess:`Home Assistant'a başarıyla bağlanıldı.`,haConnectionFailed:`Home Assistant'a bağlanılamadı.`,mqttPublishing:`MQTT Yayınlama`,mqttDescription:`Node-RED, Home Assistant ve diğer otomasyon sistemleriyle entegrasyon için BamBuddy olaylarını harici bir MQTT brokerına yayınla.`,mqttEnableDescription:`Olayları harici MQTT brokerına yayınla`,brokerHostname:`Broker ana bilgisayar adı`,port:`Port`,usernameOptional:`Kullanıcı adı (isteğe bağlı)`,passwordOptional:`Parola (isteğe bağlı)`,topicPrefix:`Konu öneki`,topicPrefixHint:`Konular: {{prefix}}/printers//status, vb. olacak`,prometheusMetrics:`Prometheus Metrikleri`,prometheusEndpointDescription:`Prometheus/Grafana izleme için yazıcı metriklerini /api/v1/metrics adresinde sun.`,bearerTokenOptional:`Bearer Belirteci (isteğe bağlı)`,bearerTokenHint:`Ayarlandıysa, isteklerin Authorization: Bearer içermesi gerekir`,metricsConnectionStatus:`Bağlantı durumu`,metricsPrinterState:`Yazıcı durumu (boşta/yazdırılıyor/vb.)`,metricsPrintProgress:`Baskı ilerlemesi 0-100%`,metricsBedTemp:`Tabla sıcaklığı`,metricsNozzleTemp:`Nozul sıcaklığı`,metricsPrintsTotal:`Sonuca göre toplam baskılar`,metricsMore:`...ve daha fazlası (katmanlar, fanlar, kuyruk, filament kullanımı)`,smartPlugsDescription:`Güç kontrolünü otomatikleştirmek ve yazıcılarınız için enerji kullanımını takip etmek üzere akıllı prizleri (Tasmota veya Home Assistant) bağlayın.`,allOn:`Tümü Açık`,allOff:`Tümü Kapalı`,addSmartPlug:`Akıllı Priz Ekle`,energySummary:`Enerji Özeti`,currentPower:`Mevcut Güç`,plugsOnline:`{{reachable}}/{{total}} priz çevrimiçi`,today:`Bugün`,yesterday:`Dün`,total:`Toplam`,enablePlugsForSummary:`Enerji özetini görmek için prizleri etkinleştirin`,addNotificationProvider:`Ekle`,systemBadge:`(Sistem)`,creating:`Oluşturuluyor...`,changing:`Değiştiriliyor...`,deleteUserAndItems:`Kullanıcıyı VE öğelerini sil`,deleteUserKeepItems:`Kullanıcıyı sil, öğeleri tut (sahipsiz olur)`,ok:`Tamam`,twoFa:{totpTitle:`Doğrulayıcı Uygulama (TOTP)`,totpDesc:`Google Authenticator, Aegis veya Authy gibi bir doğrulayıcı uygulama kullanın.`,emailOtpTitle:`E-posta OTP`,emailOtpDesc:`Giriş yaptığınızda {{email}} adresine tek seferlik bir kod gönder.`,emailOtpNoEmail:`Bu yöntemi etkinleştirmek için hesabınıza bir e-posta adresi ekleyin.`,addEmailFirst:`Hesabınızın e-posta adresi yok. E-posta OTP'yi etkinleştirmeden önce bir yöneticiden eklemesini isteyin.`,setupTotp:`Doğrulayıcı Uygulamayı Ayarla`,setupAuthApp:`Doğrulayıcı Uygulamayı Ayarla`,setupInstructions:`Aşağıdaki QR kodunu doğrulayıcı uygulamanızla tarayın, ardından bir kodla onaylayın.`,manualEntry:`Tarayamıyor musunuz? Bu gizli anahtarı manuel olarak girin:`,scannedContinue:`Kodu taradım — devam et`,enterCodeToConfirm:`Kurulumu onaylamak için doğrulayıcı uygulamanızdan 6 haneli kodu girin.`,activate:`Etkinleştir`,disableTotp:`Doğrulayıcıyı Devre Dışı Bırak`,disableConfirmHint:`Doğrulayıcıyı devre dışı bırakmak için geçerli bir TOTP kodu veya yedek kod girin.`,totpDisabled:`Doğrulayıcı uygulama devre dışı bırakıldı.`,emailOtpEnabled:`E-posta OTP etkinleştirildi.`,emailOtpDisabled:`E-posta OTP devre dışı bırakıldı.`,smtpRequired:`Lütfen önce SMTP ayarlarını yapılandırın ve test edin.`,invalidCode:`Geçersiz kod. Lütfen tekrar deneyin.`,enableEmailOtp:`E-posta OTP'yi Etkinleştir`,disableEmailOtp:`E-posta OTP'yi Devre Dışı Bırak`,emailSetupEnterCode:`E-posta adresinize bir doğrulama kodu gönderildi. Bu kutunun sahibi olduğunuzu onaylamak için aşağıya girin.`,verifyAndEnable:`Doğrula ve Etkinleştir`,emailDisablePasswordHint:`E-posta OTP'yi devre dışı bırakmayı onaylamak için hesap parolanızı girin.`,passwordPlaceholder:`Parolanızı girin`,backupCodesTitle:`Yedek kodlarınızı kaydedin`,backupCodesWarning:`Bu kodları güvenli bir yere kaydedin. Her kod yalnızca bir kez kullanılabilir ve tekrar gösterilmeyecektir.`,backupCodesRemaining:`{{count}} yedek kod kaldı`,savedCodes:`Kodlarımı kaydettim`,regenBackup:`Yedek Kodları Yeniden Oluştur`,regenBackupHint:`10 yeni yedek kod oluşturmak için mevcut TOTP kodunuzu girin. Mevcut tüm yedek kodlar geçersiz kılınacak.`,newBackupCodes:`Yeni yedek kodlar`,linkedAccounts:`Bağlı SSO Hesapları`,linkedAccountsDesc:`Bu harici kimlik sağlayıcıları hesabınıza bağlıdır.`,oidcUnlinked:`Hesap bağlantısı kaldırıldı.`},sessionPolicy:{title:`Oturum Politikası`,description:`Yeni kullanıcı girişleri için maksimum oturum süresi. Daha önce verilmiş belirteçler özgün son kullanma tarihlerini korur.`,preset24h:`24 saat`,preset7d:`7 gün`,preset30d:`30 gün`,customHoursLabel:`Özel oturum süresi (saat)`,hoursSuffix:`saat`,warning:`Daha uzun oturumlar otomatik oturum kapatma korumasını azaltır. Yalnızca güvenilir tek kullanıcılı dağıtımlar için önerilir.`},oidc:{title:`SSO / OIDC Sağlayıcıları`,desc:`Harici kimlik sağlayıcılar aracılığıyla tek oturum açmaya izin vermek için OpenID Connect sağlayıcılarını yapılandırın.`,addProvider:`Sağlayıcı Ekle`,newProvider:`Yeni Sağlayıcı`,empty:`Henüz yapılandırılmış OIDC sağlayıcısı yok.`,created:`Sağlayıcı oluşturuldu.`,updated:`Sağlayıcı güncellendi.`,deleted:`Sağlayıcı silindi.`,refreshIcon:`Simgeyi yenile`,removeIcon:`Simgeyi kaldır`,iconRefreshed:`Simge yenilendi.`,iconRemoved:`Simge kaldırıldı.`,iconFetchFailed:`Simge sağlayıcı URL'sinden alınamadı.`,deleteTitle:`Sağlayıcıyı Sil`,deleteMessage:`"{{name}}" silinsin mi? Tüm bağlı kullanıcı hesaplarının bağlantısı kaldırılacak.`,form:{name:`Görünen Ad`,issuerUrl:`Yayıncı URL`,clientId:`İstemci Kimliği`,clientSecret:`İstemci Gizli Anahtarı`,scopes:`Kapsamlar`,iconUrl:`Simge URL (isteğe bağlı)`,enabled:`Etkin`,autoCreate:`Kullanıcıları otomatik oluştur`,autoCreateDesc:`İlk girişte otomatik olarak yerel bir hesap oluştur.`,autoLink:`Mevcut hesapları otomatik bağla`,autoLinkDesc:`İlk girişte mevcut yerel hesapları e-posta eşleştirerek bağla.`,secretHint:`mevcut olanı korumak için boş bırakın`,secretPlaceholder:`yeni gizli anahtar`,emailClaim:`E-posta İddiası`,emailClaimDesc:`E-posta kimliği olarak kullanılan JWT iddiası. Azure Entra ID için 'preferred_username' veya 'upn' kullanın (email_verified göndermez). Yalnızca güvenilir iddia adlarını kullanın.`,emailClaimPlaceholder:`email`,emailClaimCustomClaimAutoLinkWarning:`Özel iddialar yalnızca değer kiracı tarafından yönetildiğinde otomatik bağlantı için güvenlidir (örn. Azure Entra ID upn / preferred_username). Kimlik sağlayıcınız kullanıcıların bu iddiayı kendi kendine onaylamasına izin veriyorsa otomatik bağlantıyı etkinleştirmeyin.`,requireEmailVerified:`E-posta doğrulamasını gerektir`,requireEmailVerifiedDesc:`E-posta iddiasını yalnızca sağlayıcı doğrulanmış olarak işaretlediğinde kabul et.`,requireEmailVerifiedWarning:`Uyarı: e-posta doğrulama olmadan bile kabul edilecek. Yalnızca güvenilir sağlayıcılarla kullanın.`,requireEmailVerifiedAutoLink:`Bu ayarı değiştirmek için önce otomatik bağlantıyı devre dışı bırakın.`,defaultGroup:`Varsayılan Grup`,defaultGroupDesc:`Otomatik oluşturulan kullanıcılara atanan grup. Ayarlanmazsa Viewers'a geri döner.`,defaultGroupViewersFallback:`Viewers (varsayılan)`,autologin:`Otomatik oturum açma`,autologinDesc:`Kimlik doğrulaması yapılmamış ziyaretçileri doğrudan bu sağlayıcıya yönlendir. Bu işareti yalnızca bir sağlayıcı taşıyabilir.`}},encryption:{title:`MFA Şifreleme Durumu`,enabledFromEnv:`Sabit şifreleme etkin (anahtar MFA_ENCRYPTION_KEY ortam değişkeninden)`,enabledFromFile:`Sabit şifreleme etkin (anahtar veri dizininden yüklendi)`,enabledGenerated:`Sabit şifreleme otomatik oluşturulan anahtarla etkin`,notConfigured:`Sabit şifreleme yapılandırılmamış`,notConfiguredDesc:`TOTP gizli anahtarları ve OIDC client_secrets düz metin olarak saklanır. MFA_ENCRYPTION_KEY ayarlayın veya Bambuddy'yi otomatik olarak oluşturmak için yazılabilir bir veri dizini ile yeniden başlatın.`,allEncrypted:`Tüm MFA gizli anahtarları sabit olarak şifrelenmiş durumda.`,legacyRowsLabel:`Eski düz metin satırlar`,encryptedRowsLabel:`Şifrelenmiş satırlar`,legacyRowsWarning:`{{count}} eski düz metin satır algılandı. Şifrelenmiş depolamaya geçmek için OIDC sağlayıcısını yeniden kaydedin veya kullanıcının doğrulayıcı uygulamasını yeniden kaydedin.`,backupHint:`Otomatik oluşturulan anahtar DATA_DIR/.mfa_encryption_key konumunda saklanır ve yerel yedek ZIP'lere dahil edilir. Yedeklerinizi güvende tutun veya MFA_ENCRYPTION_KEY'i açıkça ayarlayın.`,decryptionBrokenTitle:`Şifreleme anahtarı eksik`,decryptionBrokenError:`Şifreleme anahtarı artık mevcut olmadığından {{count}} şifrelenmiş kayıt şifresi çözülemiyor. Kurtarmak için önceki MFA_ENCRYPTION_KEY veya DATA_DIR/.mfa_encryption_key'i geri yükleyin.`,migrationErrorWarning:`Başlangıçta {{count}} eski satır yeniden şifrelenemedi. Sunucu günlüklerini kontrol edin ve yeniden denemek için Bambuddy'yi yeniden başlatın.`},pipelineLimits:{title:`Dilimleyici pipeline limitleri`,maxCopiesLabel:`Çalıştırma başına maksimum kopya`,maxCopiesDesc:`Bir pipeline çalıştırıldığında operatörlerin isteyebileceği kopya sayısı üst sınırı. Sunucu tarafı sert sınır 1000'dir.`},pipelines:{title:`Dilimleyici Pipeline'ları`,subtitle:`Yeniden kullanılabilir ön ayar paketleri (yazıcı + işlem + filamentler + tabla türü). Dilimleme diyalogundan bir tane kaydedin ve bir sonraki dosyaya tek tıkla uygulayın.`,loading:`Pipeline'lar yükleniyor…`,loadError:`Pipeline'lar yüklenemedi.`,confirmDelete:`Bu pipeline silinsin mi? Bu işlem geri alınamaz.`,staleWarning:`Atıfta bulunulan bir veya daha fazla ön ayar artık mevcut değil. Dilimleme diyalogundan bu pipeline'ı yeniden kaydederek düzeltin.`,empty:{title:`Henüz pipeline yok.`,howto:`Herhangi bir dosya için Dilimleme diyalogunu açın, yazıcı / işlem / filamentler / tablayı seçin, sonra "Pipeline olarak kaydet"e tıklayın. Kaydedilen pipeline'larınız burada görünecek.`},field:{name:`Pipeline adı`,description:`Açıklama`,targetPrinter:`Hedef yazıcı`,noTarget:`— Hedef yok —`,targetKind:`Hedef türü`,targetKindSpecific:`Belirli yazıcı`,targetKindClass:`Yazıcı sınıfı`,targetModelClass:`Yazıcı modeli`,fanoutStrategy:`Dağıtım stratejisi`,fanout:{max_parallel:`Maksimum paralel — eşleşen boş yazıcılara dağıt`,round_robin:`Sırayla — uygun yazıcılar arasında döndür`,fill_one_first:`Önce birini doldur — tüm kopyaları tek yazıcıya sabitle`},fanoutShort:{max_parallel:`paralel`,round_robin:`sırayla`,fill_one_first:`önce bir`}},action:{save:`Kaydet`,cancel:`İptal`,rename:`Yeniden adlandır`,delete:`Sil`},slot:{printer:`Yazıcı`,process:`İşlem`,filament:`Filament`,filamentN:`Filament {{n}}`,filamentAll:`Tüm {{n}} yuva`,bed:`Tabla`},group:{profiles:`Profiller`,filaments:`Filamentler`},searchPlaceholder:`Pipeline'larda ara…`,filterTargetType:`Hedef türüne göre filtrele`,filterTarget:`Hedefe göre filtrele`,filter:{all:`Tüm hedefler`,noTarget:`Hedef belirlenmemiş`,count:`{{shown}} / {{total}}`,noMatches:`Mevcut filtrelere uyan pipeline yok.`},toast:{saved:`Pipeline kaydedildi`,saveFailed:`Kaydetme başarısız`,deleted:`Pipeline silindi`,deleteFailed:`Silme başarısız`},noTargetHint:`Çalıştırmak için bir hedef yazıcı belirleyin`,noTargetWarning:`Bu pipeline'ı çalıştırmadan önce bir hedef yazıcı belirleyin.`,runs:{lastRun:`Son çalıştırma`,status:{queued:`kuyrukta`,slicing:`dilimleniyor`,dispatching:`gönderiliyor`,in_progress:`yazdırılıyor`,completed:`tamamlandı`,failed:`başarısız`,partial_failure:`kısmi başarısızlık`,cancelled:`iptal edildi`}}}},notification:{printStarted:{title:`Baskı Başladı`,body:`{{printer}}: {{filename}} yazdırmaya başladı`},printCompleted:{title:`Baskı Tamamlandı`,body:`{{printer}}: {{filename}} başarıyla tamamlandı`},printFailed:{title:`Baskı Başarısız`,body:`{{printer}}: {{filename}} başarısız oldu`},printStopped:{title:`Baskı Durduruldu`,body:`{{printer}}: {{filename}} durduruldu`},printProgress:{title:`Baskı İlerlemesi`,body:`{{printer}}: {{filename}} %{{percent}} tamamlandı`},printerOffline:{title:`Yazıcı Çevrimdışı`,body:`{{printer}} çevrimdışı`},printerError:{title:`Yazıcı Hatası`,body:`{{printer}}: {{error}}`},filamentLow:{title:`Az Filament`,body:`{{printer}}: Filament azalıyor`},maintenanceDue:{title:`Bakım Zamanı`,body:`{{printer}}: {{items}} dikkat gerektiriyor`}},errors:{generic:`Bir şeyler ters gitti`,networkError:`Ağ hatası. Lütfen bağlantınızı kontrol edin.`,notFound:`Bulunamadı`,unauthorized:`Yetkisiz`,serverError:`Sunucu hatası`,validationError:`Lütfen girdinizi kontrol edin`,printerConnectionFailed:`Yazıcıya bağlanılamadı`,saveFailed:`Değişiklikler kaydedilemedi`,deleteFailed:`Silme başarısız`,loadFailed:`Veri yüklenemedi`},hmsErrors:{title:`Hatalar - {{name}}`,noErrors:`Hata yok`,viewOnWiki:`Bambu Lab Wiki'de görüntüle`,unknownCode:`Bilinmeyen HMS kodu — ayrıntılar için Bambu Lab wiki sayfasına bakın.`,clearInstructions:`Buradan kapatmak için yazıcıdaki hataları temizleyin.`,clearErrors:`Hataları Temizle`,clearSuccess:`HMS hataları temizlendi`,clearFailed:`HMS hataları temizlenemedi`,actionSuccess:`Eylem yazıcıya gönderildi`,actionFailed:`Eylem gönderilemedi`,runoutExpectedSlot:`{{ranOut}} slotundaki filament bitti. Yazıcı şimdi {{expected}} slotunda uyumlu filament bekliyor. {{expected}} slotuna bir makara takın ve ardından Yeniden Dene'yi seçin.`,runoutExpectedSlotOnly:`Yazıcı {{expected}} slotunda uyumlu filament bekliyor. Oraya bir makara takın ve ardından Yeniden Dene'yi seçin.`,runoutSlotUnknown:`Filament bitti ve baskı duraklatıldı. Bambuddy yazıcının şu anda hangi slotu beklediğini belirleyemedi — istenen slot için yazıcının ekranını kontrol edin.`,actions:{RESUME_PRINTING:`Baskıyı sürdür`,RESUME_PRINTING_DEFECTS:`Sürdür (kusurlar kabul edilebilir)`,RESUME_PRINTING_PROBELM_SOLVED:`Sürdür (sorun çözüldü)`,STOP_PRINTING:`Baskıyı durdur`,CHECK_ASSISTANT:`Asistanı aç`,FILAMENT_EXTRUDED:`Filament ekstrude edildi, devam et`,RETRY_FILAMENT_EXTRUDED:`Henüz ekstrude edilmedi, tekrar dene`,CONTINUE:`Tamamlandı, devam et`,LOAD_VIRTUAL_TRAY:`Filament yükle`,OK_BUTTON:`Tamam`,FILAMENT_LOAD_RESUME:`Filament yüklendi, sürdür`,JUMP_TO_LIVEVIEW:`Canlı görünümü aç`,NO_REMINDER_NEXT_TIME:`Bir daha hatırlatma`,REFRESH_NOZZLE:`Tekrar kontrol et`,IGNORE_NO_REMINDER_NEXT_TIME:`Yok say ve bir daha hatırlatma`,IGNORE_RESUME:`Yok say ve sürdür`,PROBLEM_SOLVED_RESUME:`Sorun çözüldü, sürdür`,TURN_OFF_FIRE_ALARM:`Anlaşıldı, yangın alarmını kapat`,RETRY_PROBLEM_SOLVED:`Tekrar dene (sorun çözüldü)`,CANCLE:`İptal`,STOP_DRYING:`Kurutmayı durdur`,PROCEED:`Devam et`,OK_JUMP_RACK:`Tamam`,ABORT:`İptal`,DISABLE_PURIFICATION:`Bu baskı için arıtmayı devre dışı bırak`,DONT_REMIND_NEXT_TIME:`Beni hatırlatma`,DBL_CHECK_CANCEL:`İptal`,DBL_CHECK_DONE:`Tamam`,DBL_CHECK_RETRY:`Tekrar dene`,DBL_CHECK_RESUME:`Sürdür`,DBL_CHECK_OK:`Onayla`,REMOVE_CLOSE_BTN:`Kapat`}},mqttDebug:{title:`MQTT Hata Ayıklama Günlüğü`,searchPlaceholder:`Konu veya yük ara...`,noMessages:`Henüz mesaj kaydedilmedi`,startLoggingHint:`MQTT mesajlarını yakalamaya başlamak için "Kaydetmeye Başla"ya tıklayın`,noMessagesMatch:`Filtrenizle eşleşen mesaj yok`,adjustFilterHint:`Arama veya filtre kriterlerinizi ayarlamayı deneyin`,incoming:`Gelen`,outgoing:`Giden`,loggingStopped:`Kaydetme durduruldu`,loggingActive:`Kaydetme aktif - mesajlar otomatik olarak yenilenecek`,startLogging:`Kaydetmeye Başla`,stopLogging:`Kaydetmeyi Durdur`,clearLog:`Günlüğü Temizle`,topic:`Konu`,timestamp:`Zaman damgası`,direction:`Yön`,all:`Tümü`},printerFiles:{title:`Dosya Yöneticisi`,storageUsed:`Kullanılan:`,storageFree:`Boş:`,filterPlaceholder:`Dosyaları filtrele...`,deleteButton:`Sil`,deleteFiles:`{{count}} Dosya Sil`,deleteFileConfirm:`"{{name}}" silinsin mi? Bu geri alınamaz.`,deleteFilesConfirm:`Seçilen {{count}} dosya silinsin mi? Bu geri alınamaz.`,noFiles:`Yazıcıda dosya yok`,loadingFiles:`Dosyalar yükleniyor...`,failedToLoad:`Dosyalar yüklenemedi`,toast:{filesDeleted:`{{count}} dosya silindi`,deleteFailed:`Silme başarısız: {{error}}`}},confirm:{delete:`Bunu silmek istediğinizden emin misiniz?`,unsavedChanges:`Kaydedilmemiş değişiklikleriniz var. Çıkmak istediğinizden emin misiniz?`,clearQueue:`Kuyruğu temizlemek istediğinizden emin misiniz?`},login:{title:`Bambuddy Giriş`,subtitle:`Hesabınıza giriş yapın`,username:`Kullanıcı Adı`,usernamePlaceholder:`Kullanıcı adınızı girin`,usernameOrEmail:`Kullanıcı Adı veya E-posta`,usernameOrEmailPlaceholder:`Kullanıcı adı veya @ E-posta`,password:`Parola`,passwordPlaceholder:`Parolanızı girin`,signIn:`Giriş yap`,signingIn:`Giriş yapılıyor...`,rememberMe:`Beni Hatırla`,forgotPassword:`Parolanızı mı unuttunuz?`,autologinFailed:`Otomatik SSO girişi başarısız oldu. Devam etmek için aşağıdan bir sağlayıcı seçin.`,localDisabledNotice:`Yerel oturum açma devre dışı. Aşağıdaki SSO sağlayıcılarından birini kullanın.`,loginSuccess:`Başarıyla giriş yapıldı`,loginFailed:`Giriş başarısız`,enterCredentials:`Lütfen kullanıcı adı ve parola girin`,enterEmail:`Lütfen e-posta adresinizi girin`,oidcLoginFailed:`OIDC girişi başarısız`,oidcErrors:{providerError:`Kimlik sağlayıcısı bir hata döndürdü`,missingParameters:`OIDC geri arama gerekli parametreleri eksik`,invalidState:`OIDC durumu geçersiz veya zaten kullanılmış`,stateExpired:`OIDC giriş oturumu süresi doldu — lütfen tekrar deneyin`,providerNotFound:`OIDC sağlayıcısı bulunamadı`,discoveryFailed:`OIDC keşif belgesi alınamadı`,invalidDiscovery:`OIDC keşif belgesi geçersiz`,networkError:`OIDC belirteç değişimi sırasında ağ hatası`,badResponse:`OIDC belirteç değişimi sırasında beklenmeyen yanıt`,noIdToken:`OIDC sağlayıcısı bir ID belirteci döndürmedi`,validationFailed:`OIDC belirteç doğrulaması başarısız`,nonceMismatch:`OIDC nonce uyuşmazlığı — olası tekrar saldırısı`,missingSubClaim:`OIDC belirteci sub iddiasını içermiyor`,noLinkedAccount:`Bu OIDC kimliğine bağlı yerel hesap yok`,accountInactive:`Hesabınız aktif değil`,userResolutionFailed:`Hesabınız çözümlenemedi`,internalError:`OIDC girişi sırasında dahili bir hata oluştu`,tokenExchangeFailed:`OIDC belirteç değişimi başarısız`},forgotPasswordTitle:`Parolayı Unuttum`,forgotPasswordMessage:`Parolanızı unuttuysanız, sıfırlamak için lütfen sistem yöneticinizle iletişime geçin.`,forgotPasswordEmailMessage:`E-posta adresinizi girin, size yeni bir parola göndereceğiz.`,emailAddress:`E-posta Adresi`,emailPlaceholder:`eposta.adresi@example.com`,cancel:`İptal`,sending:`Gönderiliyor...`,sendResetEmail:`Sıfırlama E-postası Gönder`,howToReset:`Parolanızı nasıl sıfırlarsınız:`,resetStep1:`Bambuddy yöneticinizle iletişime geçin`,resetStep2:`Kullanıcı Yönetiminde parolanızı sıfırlamasını isteyin`,resetStep3:`Sizin için yeni bir geçici parola belirleyebilirler`,resetStep4:`Yeni parolayla giriş yapın ve Ayarlarda değiştirin`,gotIt:`Anladım`,resetPassword:{title:`Yeni Parola Belirle`,subtitle:`Aşağıya yeni parolanızı girin ve onaylayın.`,newPassword:`Yeni Parola`,newPasswordPlaceholder:`En az 8 karakter`,confirmPassword:`Parolayı Onayla`,confirmPasswordPlaceholder:`Yeni parolayı tekrarlayın`,saving:`Kaydediliyor…`,submit:`Yeni Parola Belirle`,backToLogin:`Girişe dön`,passwordsDoNotMatch:`Parolalar eşleşmiyor`,passwordTooShort:`Parola en az 8 karakter olmalı`,resetFailed:`Parola sıfırlama başarısız. Bağlantının süresi dolmuş olabilir.`},twoFA:{title:`İki Faktörlü Kimlik Doğrulama`,subtitle:`Hesabınız 2FA ile korunuyor. Aşağıya doğrulama kodunu girin.`,methodAuthenticator:`Doğrulayıcı Uygulama`,methodEmail:`E-posta Kodu`,methodBackup:`Yedek Kod`,instructionsTotp:`Doğrulayıcı uygulamanızı açın ve Bambuddy için 6 haneli kodu girin.`,instructionsEmail:`E-posta adresinize 6 haneli bir kod gönderildi. 10 dakika içinde sona erer.`,instructionsEmailNotSent:`E-posta yoluyla bir doğrulama kodu almak için aşağıdaki düğmeye tıklayın.`,instructionsBackup:`8 karakterlik yedek kurtarma kodlarınızdan birini girin. Her kod yalnızca bir kez kullanılabilir.`,sendCodeButton:`E-posta ile Kod Gönder`,sendingCode:`Gönderiliyor...`,resendCode:`Kodu yeniden gönder`,codeLabel:`Doğrulama Kodu`,backupCodeLabel:`Yedek Kod`,codePlaceholder:`000000`,backupCodePlaceholder:`XXXXXXXX`,verifyButton:`Doğrula`,verifyingButton:`Doğrulanıyor...`,backToLogin:`← Girişe dön`,orContinueWith:`veya şununla devam edin`,signInWith:`{{provider}} ile giriş yap`,enterCode:`Lütfen doğrulama kodunu girin`,sendCodeFailed:`Doğrulama kodu gönderilemedi`,invalidCode:`Geçersiz kod. Lütfen tekrar deneyin.`}},setup:{title:`Bambuddy Kurulumu`,subtitle:`Bambuddy örneğiniz için kimlik doğrulamayı yapılandırın`,enableAuth:`Kimlik Doğrulamayı Etkinleştir`,adminAccount:`Yönetici Hesabı`,adminAccountDesc:`Yönetici kullanıcılar zaten varsa, kimlik doğrulama mevcut yönetici hesapları kullanılarak etkinleştirilecek. Mevcut yöneticileri kullanmak için aşağıdaki alanları boş bırakın veya yeni bir yönetici kullanıcı oluşturmak için yeni kimlik bilgileri girin.`,adminUsername:`Yönetici Kullanıcı Adı`,adminPassword:`Yönetici Parolası`,optionalIfAdminExists:`(yönetici kullanıcılar varsa isteğe bağlı)`,adminUsernamePlaceholder:`Yönetici kullanıcı adı girin (isteğe bağlı)`,adminPasswordPlaceholder:`Yönetici parolası girin (isteğe bağlı)`,confirmPassword:`Parolayı Onayla`,confirmPasswordPlaceholder:`Yönetici parolasını onayla`,settingUp:`Kuruluyor...`,completeSetup:`Kurulumu Tamamla`,toast:{authEnabledAdminCreated:`Kimlik doğrulama etkinleştirildi ve yönetici kullanıcı oluşturuldu`,authEnabledExistingAdmins:`Mevcut yönetici kullanıcılar kullanılarak kimlik doğrulama etkinleştirildi`,setupCompleted:`Kurulum tamamlandı`,enterBothCredentials:`Lütfen hem yönetici kullanıcı adı hem de parola girin veya mevcut yönetici kullanıcıları kullanmak için her ikisini de boş bırakın`,passwordsDoNotMatch:`Parolalar eşleşmiyor`,passwordTooShort:`Parola en az 6 karakter olmalı`}},changePassword:{title:`Parolayı Değiştir`,currentPassword:`Mevcut Parola`,currentPasswordPlaceholder:`Mevcut parolayı girin`,newPassword:`Yeni Parola`,newPasswordPlaceholder:`Yeni parolayı girin (en az 6 karakter)`,confirmPassword:`Yeni Parolayı Onayla`,confirmPasswordPlaceholder:`Yeni parolayı onayla`,passwordsDoNotMatch:`Parolalar eşleşmiyor`,passwordTooShort:`Parola en az 6 karakter olmalı`,changing:`Değiştiriliyor...`,success:`Parola başarıyla değiştirildi`,failed:`Parola değiştirilemedi`},plateAlert:{title:`Baskı Duraklatıldı!`,message:`Baskı plakasında nesneler algılandı. Baskı otomatik olarak duraklatıldı. Lütfen plakayı temizleyin ve baskıya devam edin.`,understand:`Anladım`},camera:{title:`Kamera Görünümü`,invalidPrinterId:`Geçersiz yazıcı ID'si`,live:`Canlı`,snapshot:`Anlık Görüntü`,restartStream:`Akışı yeniden başlat`,refreshSnapshot:`Anlık görüntüyü yenile`,fullscreen:`Tam ekran`,exitFullscreen:`Tam ekrandan çık`,connectingToCamera:`Kameraya bağlanılıyor...`,capturingSnapshot:`Anlık görüntü yakalanıyor...`,connectionLost:`Bağlantı kesildi`,connectionFailed:`Kamera bağlantısı başarısız`,reconnecting:`{{countdown}}sn içinde yeniden bağlanılıyor... (deneme {{attempt}}/{{max}})`,reconnectNow:`Şimdi yeniden bağlan`,cameraUnavailable:`Kamera kullanılamıyor`,cameraUnavailableDesc:`Yazıcının açık ve bağlı olduğundan emin olun.`,noCamera:`Kamera yok`,retry:`Yeniden dene`,cameraStream:`Kamera akışı`,zoomOut:`Uzaklaştır`,zoomIn:`Yakınlaştır`,resetZoom:`Yakınlaştırmayı sıfırla`,recording:`Kaydediyor`,startRecording:`Kaydı Başlat`,stopRecording:`Kaydı Durdur`,chamberLight:`Hazne ışığını aç/kapat`,unavailable:`Kamera kullanılamıyor`,diagnose:{button:`Tanıla`,modalTitle:`Kamera tanılaması`,running:`Tanılama çalışıyor...`,runFailed:`Tanılama çalıştırılamadı: {{error}}`,retry:`Tekrar çalıştır`,stage:{tcp_reachable:`Ağ erişilebilirliği`,first_frame:`Kare yakalama`,live_stream_active:`Canlı akış aktif`},summary:{all_ok:`Kamera çalışıyor. Tanılama tüm aşamaları başarıyla tamamladı.`,live_stream_active_healthy:`Kamera şu anda son karelerle akış yapıyor — teste gerek yok.`,printer_unreachable:`Yazıcıya erişilemiyor. IP adresini, ağ bağlantısını ve yazıcının açık olduğunu kontrol edin.`,camera_port_closed:`Yazıcıya erişilebilir ancak kamera portu kapalı. Yazıcı ayarlarında yalnızca LAN modunun ve Geliştirici Modunun etkin olduğundan emin olun.`,no_frame:`Kameraya bağlanıldı ancak hiç kare alınmadı. Tekrar deneyin veya yazıcı ayarlarında kameranın etkin olduğunu kontrol edin.`,unknown_failure:`Kamera tanılaması bilinmeyen bir nedenle başarısız oldu. Ayrıntılar için destek günlüğüne bakın.`},meta:{protocol:`Protokol`,port:`Port`,profile:`Profil`}}},groups:{title:`Grup Yönetimi`,subtitle:`Erişim kontrolü için izin gruplarını yönetin`,backToSettings:`Ayarlara Dön`,createGroup:`Grup Oluştur`,noPermission:`Bu sayfaya erişim izniniz yok.`,system:`Sistem`,noDescription:`Açıklama yok`,usersCount:`{{count}} kullanıcı`,permissionsCount:`{{count}} izin`,edit:`Düzenle`,delete:`Sil`,toast:{created:`Grup başarıyla oluşturuldu`,updated:`Grup başarıyla güncellendi`,deleted:`Grup başarıyla silindi`,enterGroupName:`Lütfen bir grup adı girin`},modal:{editGroup:`Grubu Düzenle`,createGroup:`Grup Oluştur`,cancel:`İptal`,saving:`Kaydediliyor...`,creating:`Oluşturuluyor...`,saveChanges:`Değişiklikleri Kaydet`},form:{groupName:`Grup Adı`,groupNamePlaceholder:`Grup adını girin`,systemGroupWarning:`Sistem grubu adları değiştirilemez`,description:`Açıklama`,descriptionPlaceholder:`Açıklama girin (isteğe bağlı)`,permissions:`İzinler ({{count}} seçildi)`},deleteModal:{title:`Grubu Sil`,message:`Bu grubu silmek istediğinizden emin misiniz? Bu gruptaki kullanıcılar bu izinleri kaybedecek.`,confirm:`Grubu Sil`},editor:{title:`Grubu Düzenle`,createTitle:`Grup Oluştur`,search:`İzinlerde ara...`,selectAll:`Tümünü Seç`,clearAll:`Tümünü Temizle`,permissionsSelected:`{{count}} seçildi`,noResults:`Aramanızla eşleşen izin yok`,websocketHint:`Canlı güncellemeler için gereklidir. Bu izin olmadan arayüz düzenli yoklamaya geri döner.`}},users:{title:`Kullanıcı Yönetimi`,subtitle:`Kullanıcıları ve Bambuddy örneğinize erişimlerini yönetin`,backToSettings:`Ayarlara Dön`,createUser:`Kullanıcı Oluştur`,noPermission:`Bu sayfaya erişim izniniz yok.`,admin:`Yönetici`,noGroups:`Grup yok`,active:`Aktif`,inactive:`Pasif`,edit:`Düzenle`,delete:`Sil`,system:`Sistem`,noGroupsAvailable:`Kullanılabilir grup yok`,table:{username:`Kullanıcı Adı`,groups:`Gruplar`,status:`Durum`,actions:`İşlemler`},toast:{created:`Kullanıcı başarıyla oluşturuldu`,updated:`Kullanıcı başarıyla güncellendi`,deleted:`Kullanıcı başarıyla silindi`,fillRequired:`Lütfen tüm zorunlu alanları doldurun`,passwordsDoNotMatch:`Parolalar eşleşmiyor`,passwordTooShort:`Parola en az 6 karakter olmalı`,ldapProvisioned:`"{{username}}" LDAP kullanıcısı tedarik edildi`},modal:{createUser:`Kullanıcı Oluştur`,editUser:`Kullanıcıyı Düzenle`,cancel:`İptal`,creating:`Oluşturuluyor...`,saving:`Kaydediliyor...`,saveChanges:`Değişiklikleri Kaydet`,advancedAuthSubtitle:`Gelişmiş Kimlik Doğrulama ile`,tabsAriaLabel:`Kullanıcı kaynağı`,localTab:`Yerel`,ldapTab:`LDAP`,ldapSearchLabel:`Dizinde ara`,ldapSearchPlaceholder:`Bir kullanıcı adı, isim veya e-posta yazın...`,ldapMinChars:`Aramak için en az 2 karakter yazın`,ldapTypeToSearch:`LDAP dizininde aramak için yazmaya başlayın`,ldapSearching:`Dizinde aranıyor...`,ldapNoResults:`Dizinde eşleşen kullanıcı yok`,ldapSearchError:`Dizin araması başarısız. LDAP sunucu durumunu kontrol edin.`,ldapAlreadyProvisioned:`Zaten tedarik edildi`,ldapSelectedLabel:`Seçildi`,ldapProvision:`Kullanıcıyı tedarik et`,ldapProvisioning:`Tedarik ediliyor...`,ldapErrorProvision:`Tedarik başarısız. LDAP sunucu durumunu kontrol edin ve tekrar deneyin.`},form:{username:`Kullanıcı Adı`,usernamePlaceholder:`Kullanıcı adını girin`,email:`E-posta`,emailPlaceholder:`kullanici@example.com`,password:`Parola`,passwordPlaceholder:`Parolayı girin`,confirmPassword:`Parolayı Onayla`,confirmPasswordPlaceholder:`Parolayı onayla`,newPasswordPlaceholder:`Yeni parolayı girin`,confirmNewPasswordPlaceholder:`Yeni parolayı onayla`,leaveBlankToKeep:`mevcut olanı korumak için boş bırakın`,groups:`Gruplar`,optional:`isteğe bağlı`,autoGeneratedPassword:`Güvenli bir parola otomatik olarak oluşturulacak ve kullanıcıya e-posta ile gönderilecek.`,passwordManagedByAdvancedAuth:`Parola Gelişmiş Kimlik Doğrulama tarafından yönetilir. Kullanıcıya e-posta yoluyla yeni bir parola göndermek için "Parolayı Sıfırla"yı kullanın.`,resetPassword:`Parolayı Sıfırla`,resettingPassword:`Parola Sıfırlanıyor...`},deleteModal:{title:`Kullanıcıyı Sil`,message:`Bu kullanıcıyı silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.`,confirm:`Kullanıcıyı Sil`}},streamOverlay:{title:`Akış Bindirmesi`,invalidPrinterId:`Geçersiz yazıcı ID'si`,cameraStream:`Kamera akışı`,progress:`İlerleme`,eta:`ETA`,printerIdle:`Yazıcı boşta`,printerOffline:`Yazıcı çevrimdışı`,status:{printing:`Yazdırılıyor`,paused:`Duraklatıldı`,finished:`Tamamlandı`,failed:`Başarısız`,idle:`Boşta`,unknown:`Bilinmiyor`}},profiles:{title:`Profiller`,subtitle:`Dilimleyici ön ayarlarını ve basınç ilerleme kalibrasyonlarını yönetin`,tabs:{bambuCloud:`Bambu Cloud`,orcaCloud:`Orca Cloud`,local:`Yerel Profiller`,kprofiles:`K-Profilleri`},orcaCloud:{connectedAs:`Bağlı kullanıcı`,connectedShort:`Orca Cloud'a bağlanıldı`,logout:`Bağlantıyı kes`,noLogoutPermission:`Bağlantıyı kesme izniniz yok`,noConnectPermission:`Orca Cloud'a bağlanma izniniz yok`,retry:`Yeniden dene`,connectButton:`Orca Cloud'a bağlan`,connect:{title:`Orca Cloud'a bağlan`,description:`Dilimleyici profillerinizi Bambuddy ile senkronize etmek için Orca Cloud hesabınıza giriş yapın.`},device:{title:`Orca Cloud'da Bambuddy'yi onayla`,instruction:`Orca Cloud'u açın ve bu kodu onaylayın. Onayladığınızda Bambuddy otomatik olarak bağlanır.`,codeLabel:`Eşleştirme kodunuz`,openButton:`Orca Cloud onay sayfasını aç`,manualHint:`Ya da {{url}} adresine gidin ve yukarıdaki kodu girin.`,waiting:`Onayınız bekleniyor…`,cancel:`İptal`},profiles:{title:`Orca Cloud profilleriniz ({{count}})`,refresh:`Yenile`,empty:`Orca Cloud hesabınızda henüz profil bulunamadı.`},toast:{disconnected:`Orca Cloud bağlantısı kesildi`},errors:{startFailed:`Orca Cloud giriş akışı başlatılamadı.`,denied:`Eşleştirme Orca Cloud'da reddedildi.`,expired:`Eşleştirme kodunun süresi doldu. Tekrar denemek için Bağlan'a tıklayın.`,pollFailed:`Onay beklenirken bağlantı kesildi. Lütfen tekrar deneyin.`}},localProfiles:{title:`Yerel Profiller`,subtitle:`OrcaSlicer'dan dilimleyici ön ayarlarını içe aktar ve yönet`,import:`Profilleri İçe Aktar`,importDesc:`.bbscfg, .bbsflmt, .orca_filament, .zip veya .json dosyalarını buraya bırakın`,importing:`İçe aktarılıyor...`,search:`Yerel ön ayarlarda ara...`,noPresets:`Henüz yerel ön ayar yok`,noSearchResults:`Aramanızla eşleşen ön ayar yok`,badge:`Yerel`,edit:`Düzenle`,delete:`Sil`,cancel:`İptal`,deleteConfirmTitle:`Ön Ayarı Sil`,deleteConfirm:`Bu ön ayarı silmek istediğinizden emin misiniz? Bu geri alınamaz.`,source:`Kaynak`,inheritsFrom:`Miras alır`,filamentType:`Tür`,vendor:`Satıcı`,compatiblePrinters:`Yazıcılar`,nozzleTemp:`Nozul Sıcaklığı`,cost:`Maliyet`,density:`Yoğunluk`,pressureAdvance:`Basınç İlerlemesi`,filament:`Filament`,process:`İşlem`,printer:`Yazıcı`,toast:{importSuccess:`{{count}} ön ayar içe aktarıldı`,importSkipped:`{{count}} ön ayar atlandı (yinelenenler)`,importError:`İçe aktarma sırasında {{count}} hata`,deleted:`Ön ayar silindi`,updated:`Ön ayar güncellendi`}},connectedAs:`Bağlı kullanıcı`,signInExpiredTitle:`Bambu Cloud oturumu sona erdi`,signInExpiredBody:`Bambu Lab kayıtlı belirteci artık kabul etmiyor. Bulut profillerini, MakerWorld içe aktarmalarını ve donanım yazılımı denetimlerini geri yüklemek için yeniden oturum açın.`,logout:`Çıkış`,noLogoutPermission:`Çıkış yapma izniniz yok`,failedToLoad:`Profiller yüklenemedi`,retry:`Yeniden dene`,time:{justNow:`Az önce`,minsAgo:`{{count}}dk önce`,hoursAgo:`{{count}}sa önce`,daysAgo:`{{count}}g önce`},toast:{loggedOut:`Çıkış yapıldı`},login:{title:`Bambu Cloud'a Bağlan`,subtitle:`Dilimleyici ön ayarlarınızı cihazlar arasında senkronize edin`,email:`E-posta`,password:`Parola`,region:`Bölge`,regionGlobal:`Global`,regionChina:`Çin`,verificationCode:`Doğrulama Kodu`,totpCode:`Doğrulayıcı Kodu`,checkEmail:`E-postanızı ({{email}}) 6 haneli kod için kontrol edin`,enterTotpHint:`Doğrulayıcı uygulamanızdan 6 haneli kodu girin`,accessToken:`Erişim Belirteci`,accessTokenHint:`Bambu Cloud erişim belirtecinizi yapıştırın. Çin bölgesi hesapları bu yolu kullanmalıdır (telefon bağımlı — e-posta girişi kullanılamaz). MakerWorld çerezlerinden belirteci nasıl alacağınız için wiki'ye bakın.`,back:`Geri`,loginButton:`Giriş`,verifyButton:`Doğrula`,setTokenButton:`Belirteç Ayarla`,useToken:`Erişim belirteci kullan`,useEmail:`E-posta ile giriş yap`,toast:{loggedIn:`Başarıyla giriş yapıldı`,codeSent:`Doğrulama kodu e-postanıza gönderildi`,enterTotp:`Doğrulayıcı uygulamanızdan kod girin`,tokenSet:`Belirteç başarıyla ayarlandı`}},presets:{myPreset:`Ön ayarım (düzenlenebilir)`,duplicate:`Çoğalt`,editable:`Düzenlenebilir`,failedToLoadDetails:`Ön ayar ayrıntıları yüklenemedi`,deleteConfirm:`Bu ön ayar silinsin mi?`,deleteWarning:`Bu, "{{name}}" ön ayarını Bambu Cloud'dan kalıcı olarak silecek. Bu geri alınamaz.`,noDuplicatePermission:`Ön ayarları çoğaltma izniniz yok`,noEditPermission:`Ön ayarları düzenleme izniniz yok`,noDeletePermission:`Ön ayarları silme izniniz yok`,types:{filament:`Filament ön ayarı`,printer:`Yazıcı ön ayarı`,process:`İşlem ön ayarı`},toast:{deleted:`Ön ayar silindi`,created:`Ön ayar oluşturuldu`,updated:`Ön ayar güncellendi`,duplicated:`Ön ayar çoğaltıldı`,fieldAdded:`"{{key}}" alanı eklendi`,exported:`Ön ayar dışa aktarıldı`},baseLabel:`Taban: {{name}}`,currentLabel:`Mevcut: {{name}}`,newPreset:`Yeni Ön Ayar`,editPreset:`Ön Ayarı Düzenle`,duplicatePreset:`Ön Ayarı Çoğalt`,createNewPreset:`Yeni Ön Ayar Oluştur`,customizeSettings:`Yeni ön ayarınız için ayarları özelleştirin`,compareWithBase:`Taban ön ayarla karşılaştır`,compare:`Karşılaştır`,basePreset:`Taban Ön Ayar`,selectBasePreset:`Taban ön ayar seç...`,presetName:`Ön Ayar Adı`,myCustomPreset:`Özel ön ayarım`,inheritsFrom:`Miras alır`,dropJsonToImport:`İçe aktarmak için JSON bırakın`,tabs:{common:`Ortak`,allFields:`Tüm Alanlar`},availableFields:`Kullanılabilir Alanlar`,searchFieldsPlaceholder:`Alanlarda ara...`,noMatchingFields:`Eşleşen alan yok`,allFieldsAdded:`Tüm alanlar eklendi`,addCustomField:`Özel alan ekle`,yourOverrides:`Geçersiz Kılmalarınız`,noOverridesYet:`Henüz geçersiz kılma yok`,clickFieldsToAdd:`Eklemek için soldaki alanlara tıklayın`,saveAsTemplate:`Şablon olarak kaydet`,jsonTip:`İpucu: Ayarları içe aktarmak için bu modalin herhangi bir yerine .json dosyasını sürükleyip bırakın`},cloudView:{searchPlaceholder:`Ön ayarlarda ara...`,templates:`Şablonlar`,refresh:`Yenile`,newPreset:`Yeni Ön Ayar`,clearFilters:`Filtreleri temizle`,compareMode:`Karşılaştırma Modu`,selectAnotherPreset:`Başka bir {{type}} ön ayarı seç`,clickTwoPresets:`Karşılaştırmak için aynı türden iki ön ayara tıklayın`,selectFirst:`1. İlkini seç`,selectSecond:`2. İkincisini seç`,compareNow:`Şimdi Karşılaştır`,lastSynced:`Son senkronizasyon:`,showingCount:`{{total}} ön ayardan {{showing}} tanesi gösteriliyor`,noPresetsFound:`Ön ayar bulunamadı`,columns:{filament:`Filament`,process:`İşlem`,printer:`Yazıcı`},noFilamentPresets:`Filament ön ayarı yok`,noProcessPresets:`İşlem ön ayarı yok`,noPrinterPresets:`Yazıcı ön ayarı yok`,filters:{type:`Tür`,owner:`Sahip`,printer:`Yazıcı`,nozzle:`Nozul`,filament:`Filament`,layer:`Katman`,all:`Tümü`,myPresets:`Ön Ayarlarım`,builtIn:`Yerleşik`,process:`İşlem`},noTemplatesPermission:`Şablonları yönetme izniniz yok`,noRefreshPermission:`Profilleri yenileme izniniz yok`,noCreatePermission:`Ön ayar oluşturma izniniz yok`},templates:{title:`Hızlı Şablonlar`,noTemplates:`Henüz şablon yok`,createFirst:`Ön ayar düzenleyicisinden şablonlar oluşturun`,typeFilter:`Tür:`,deleteTitle:`Şablonu Sil`,deleteWarning:`Bu işlem geri alınamaz`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz?`,namePlaceholder:`Şablon adı`,descriptionPlaceholder:`Açıklama`,settingsJson:`Ayarlar (JSON)`,fieldsCount:`{{count}} alan`,shownInModals:`Modallerde gösterilir`,hiddenInModals:`Modallerde gizli`,apply:`Uygula`,toast:{deleted:`Şablon silindi`,updated:`Şablon güncellendi`,created:`Şablon oluşturuldu`,applied:`Şablon uygulandı`}}},support:{debugLoggingActive:`Hata ayıklama kaydı aktif`,manageLogs:`Yönet`,collectItem7:`Yazıcı bağlantısı ve firmware sürümleri`,collectItem8:`Entegrasyon durumu (Spoolman, MQTT, HA)`,collectItem9:`Ağ arayüzleri (yalnızca alt ağlar)`,collectItem10:`Python paket sürümleri`,collectItem11:`Veritabanı sağlık kontrolleri`,collectItem12:`Docker ortam ayrıntıları`,bundleGenerating:`Paket oluşturuluyor...`,bundleStepConnection:`Yazıcı bağlantı kontrolleri çalıştırılıyor`,bundleStepVirtualPrinters:`Sanal yazıcı kurulum kontrolleri çalıştırılıyor`,bundleStepLogScan:`Son günlüklerde bilinen sorunlar taranıyor`,bundleStepBuild:`Destek paketi ZIP oluşturuluyor`},fileManager:{title:`Dosya Yöneticisi`,subtitle:`Baskı dosyalarınızı organize edin ve yönetin`,uploadFiles:`Dosya Yükle`,newFolder:`Yeni Klasör`,folderName:`Klasör Adı`,folderNamePlaceholder:`örn., Fonksiyonel Parçalar`,renameFile:`Dosyayı Yeniden Adlandır`,renameFolder:`Klasörü Yeniden Adlandır`,invalidFilenameChar:`Baskı dosya adlarında "{{char}}" karakterine izin verilmiyor. Yazıcının SD kartı şu karakterleri reddeder: < > : " / \\ | ? *`,moveFiles:`{{count}} Dosyayı Taşı`,rootNoFolder:`Kök (Klasör Yok)`,current:`mevcut`,linkFolder:`Klasörü Bağla`,linkFolderDescription:`Hızlı erişim için "{{name}}" klasörünü bir projeye veya arşive bağla.`,project:`Proje`,archive:`Arşiv`,noProjectsFound:`Proje bulunamadı`,noArchivesFound:`Arşiv bulunamadı`,unlink:`Bağlantıyı Kaldır`,link:`Bağla`,dragDropFiles:`Dosyaları buraya sürükleyip bırakın`,dropFilesHere:`Dosyaları buraya bırakın`,releaseToUpload:`Yüklemek için bırakın`,orClickToBrowse:`veya göz atmak için tıklayın`,allFileTypesSupported:`Tüm dosya türleri desteklenir. ZIP dosyaları çıkarılacak.`,zipFilesDetected:`ZIP dosyaları algılandı`,zipExtractOptions:`ZIP dosyaları çıkarılacak. Klasör yapısını nasıl yöneteceğinizi seçin:`,preserveZipStructure:`ZIP'ten klasör yapısını koru`,createFolderFromZip:`ZIP dosya adından klasör oluştur`,stlThumbnailGeneration:`STL küçük resim oluşturma`,zipMayContainStl:`ZIP dosyaları STL dosyaları içerebilir. Küçük resimler çıkarma sırasında oluşturulabilir.`,thumbnailsCanBeGenerated:`STL dosyaları için küçük resimler oluşturulabilir. Büyük modellerin işlenmesi daha uzun sürebilir.`,generateThumbnailsForStl:`STL dosyaları için küçük resim oluştur`,threemfDetected:`3MF dosyaları algılandı`,threemfExtractionInfo:`Yazıcı modeli, malzeme, renk ve baskı ayarları 3MF dosyalarından otomatik olarak çıkarılacak.`,willBeExtracted:`Çıkarılacak`,filesExtracted:`{{count}} dosya çıkarıldı`,uploadComplete:`Yükleme tamamlandı: {{succeeded}} başarılı`,uploadFailed:`Yükleme başarısız`,zipFilesFailed:`{{count}} dosya başarısız`,uploading:`Yükleniyor...`,changeLink:`Bağlantıyı Değiştir...`,linkTo:`Şuna bağla...`,linkToProjectOrArchive:`Projeye veya arşive bağla`,generateThumbnail:`Küçük Resim Oluştur`,generateThumbnails:`Küçük Resimler Oluştur`,generateThumbnailsForMissing:`Eksik olan STL dosyaları için küçük resimler oluştur`,gridView:`Izgara görünümü`,listView:`Liste görünümü`,lowDiskSpaceWarning:`Düşük disk alanı uyarısı`,lowDiskSpaceDetails:`Toplam {{total}} alandan yalnızca {{free}} boş. Eşik ayarlarda {{threshold}} GB olarak ayarlanmış.`,files:`Dosyalar`,folders:`Klasörler`,size:`Boyut`,free:`Boş`,allFiles:`Tüm Dosyalar`,allExternal:`Harici`,externalIsEmpty:`Harici dosya yok`,externalEmptyDescription:`Bağlı harici klasörlerinizdeki dosyalar burada görünecek.`,wrap:`Sar`,enableTextWrapping:`Metin sarmayı etkinleştir`,disableTextWrapping:`Metin sarmayı devre dışı bırak`,collapse:`Daralt`,collapseFoldersByDefault:`Klasörleri varsayılan olarak daralt`,expandFoldersByDefault:`Klasörleri varsayılan olarak genişlet`,folderSort:`Klasörleri sırala`,folderSortByName:`Ada göre`,folderSortByActivity:`Son etkinliğe göre`,dragToResizeTooltip:`Yeniden boyutlandırmak için sürükleyin, sıfırlamak için çift tıklayın`,searchFiles:`Dosyalarda ara...`,searchSubfoldersHint:`Alt klasörler dahil`,readme:{truncated:`Kısaltıldı`,show:`README’yi göster`,hide:`README’yi gizle`,label:`README`},tags:{title:`Etiketler`,subtitle:`Çapraz filtreleme için dosyaları etiketleyin — oyuncak, çocuklar için güvenli, sadece PETG, ne isterseniz.`,manage:`Etiketler`,manageTitle:`Etiket kataloğunu yönet`,add:`Yeni etiket`,edit:`Etiketi yeniden adlandır`,name:`Ad`,fileCount:`Dosya`,empty:`Henüz etiket yok. Bir tane oluşturup dosyaları etiketlemeye başlayın.`,noMatches:`Eşleşen etiket yok.`,createPlaceholder:`örn. oyuncak, çocuk-güvenli, petg`,createButton:`Oluştur`,nameRequired:`Ad gerekli.`,searchPlaceholder:`Etiketleri filtrele...`,created:`Etiket oluşturuldu.`,updated:`Etiket yeniden adlandırıldı.`,deleted:`Etiket kaldırıldı.`,saveFailed:`Etiket kaydedilemedi.`,deleteFailed:`Etiket kaldırılamadı.`,applyFailed:`Etiketler uygulanamadı.`,applyAdd:`Etiket ekle`,applyRemove:`Etiket kaldır`,applyAddSuccess:`{{files}} dosyaya {{count}} etiket eklendi.`,applyRemoveSuccess:`{{files}} dosyadan {{count}} etiket kaldırıldı.`,actionAdd:`Seçili dosyalara ekle`,actionRemove:`Seçili dosyalardan kaldır`,tagAction:`Etiketle`,bulkTitle:`Seçili {{count}} dosyayı etiketle`,bulkTooltip:`Seçili her dosyaya etiket ekleyin veya kaldırın.`,noPermission:`Dosyaları etiketleme izniniz yok.`,filterLabel:`Filtre:`,clearAll:`Tümünü temizle`,confirmDelete:`"{{name}}" etiketi silinsin mi?`,confirmDeleteMessage:`Bu, etiketi katalogdan kaldırır. Dosyalar diğer etiketlerini korur.`,confirmDeleteInUseMessage:`Bu etiket {{count}} dosyada bulunuyor. Silmek hepsinden çıkarır; dosyaların kendisine dokunulmaz.`,editAria:`{{name}} düzenle`,deleteAria:`{{name}} sil`},allTypes:`Tüm türler`,prints:`Baskılar`,ascending:`Artan`,descending:`Azalan`,resultsCount:`{{total}} dosyadan {{showing}} tanesi`,selectAll:`Tümünü Seç`,deselectAll:`Seçimi Kaldır`,selected:`{{count}} seçildi`,adding:`Ekleniyor...`,loadingFiles:`Dosyalar yükleniyor...`,folderIsEmpty:`Klasör boş`,noFilesYet:`Henüz dosya yok`,folderEmptyDescription:`Başlamak için bu klasöre dosya yükleyin veya dosyaları taşıyın.`,noFilesDescription:`Baskıyla ilgili dosyalarınızı organize etmeye başlamak için dosya yükleyin.`,noMatchingFiles:`Eşleşen dosya yok`,noMatchingFilesDescription:`Mevcut arama veya filtre kriterlerinizle eşleşen dosya yok.`,clearFilters:`Filtreleri temizle`,printedCount:`{{count}}x yazdırıldı`,uploadedBy:`Yükleyen`,deleteFolder:`Klasörü Sil`,deleteFile:`Dosyayı Sil`,deleteFilesCount:`{{count}} Dosya Sil`,deleteFolderConfirm:`Bu klasörü silmek istediğinizden emin misiniz? İçindeki tüm dosyalar da silinecek.`,deleteFileConfirm:`Bu dosyayı silmek istediğinizden emin misiniz?`,deleteFilesConfirm:`{{count}} seçili dosyayı silmek istediğinizden emin misiniz? Bu işlem geri alınamaz.`,deleting:`Siliniyor...`,noPermissionRenameFolder:`Klasörleri yeniden adlandırma izniniz yok`,noPermissionLinkFolder:`Klasörleri bağlama izniniz yok`,noPermissionDeleteFolder:`Klasörleri silme izniniz yok`,noPermissionPrint:`Yazdırma izniniz yok`,noPermissionAddToQueue:`Kuyruğa ekleme izniniz yok`,noPermissionSlice:`Dosyaları dilimleme izniniz yok`,noPermissionDownload:`Dosyaları indirme izniniz yok`,noPermissionRenameFile:`Bu dosyayı yeniden adlandırma izniniz yok`,noPermissionGenerateThumbnail:`Küçük resim oluşturma izniniz yok`,noPermissionDeleteFile:`Bu dosyayı silme izniniz yok`,noPermissionCreateFolder:`Klasör oluşturma izniniz yok`,noPermissionUpload:`Dosya yükleme izniniz yok`,noPermissionMoveFiles:`Dosyaları taşıma izniniz yok`,noPermissionDeleteFiles:`Dosyaları silme izniniz yok`,linkExternal:`Harici Bağla`,linkExternalFolder:`Harici Klasör Bağla`,linkExternalFolderDescription:`Bir ana bilgisayar dizinini (NAS, USB, ağ paylaşımı) Dosya Yöneticisine bağla. Dosyalar kopyalanmaz — orijinal yoldan doğrudan erişilir.`,externalFolderNamePlaceholder:`örn., NAS Baskıları`,externalPath:`Ana Bilgisayar Yolu`,externalPathHelp:`Docker ana bilgisayarındaki dizinin mutlak yolu. Konteynere bind-mount edilmiş olmalıdır.`,readOnly:`Salt Okunur`,readOnlyHelp:`yüklemeleri ve silmeleri engeller`,showHiddenFiles:`Gizli dosyaları göster (nokta dosyaları)`,externalFolder:`Harici Klasör`,scanFolder:`Tara`,toast:{folderCreated:`Klasör oluşturuldu`,folderDeleted:`Klasör silindi`,fileDeleted:`Dosya silindi`,filesDeleted:`{{count}} dosya silindi`,filesMoved:`Dosyalar taşındı`,folderLinked:`Klasör bağlandı`,folderUnlinked:`Klasör bağlantısı kaldırıldı`,externalFolderLinked:`Harici klasör bağlandı ve tarandı`,folderScanned:`Tarama tamamlandı: {{added}} eklendi, {{removed}} kaldırıldı`,addedToQueue:`Kuyruğa {{count}} dosya eklendi`,addedToQueuePartial:`{{added}} dosya eklendi, {{failed}} başarısız`,failedToAddToQueue:`Dosyalar eklenemedi: {{error}}`,fileRenamed:`Dosya yeniden adlandırıldı`,folderRenamed:`Klasör yeniden adlandırıldı`,thumbnailsGenerated:`{{count}} küçük resim oluşturuldu`,thumbnailsGeneratedPartial:`{{succeeded}} küçük resim oluşturuldu, {{failed}} başarısız`,noStlMissingThumbnails:`Küçük resmi eksik STL dosyası yok`,failedToGenerateThumbnails:`Küçük resimler oluşturulamadı: {{error}}`,thumbnailGenerated:`Küçük resim oluşturuldu`,failedToGenerateThumbnail:`Küçük resim oluşturulamadı: {{error}}`}},projects:{title:`Projeler`,subtitle:`3D baskı projelerinizi organize edin ve takip edin`,newProject:`Yeni Proje`,editProject:`Projeyi Düzenle`,deleteProject:`Projeyi Sil`,projectName:`Proje Adı`,description:`Açıklama`,noProjects:`Henüz proje yok`,noProjectsFiltered:`{{status}} proje yok`,noProjectsFilteredHelp:`Hiç {{status}} projeniz yok. Projeler durumları değiştiğinde burada görünecek.`,createFirst:`İlgili baskıları organize etmeye, ilerlemeyi takip etmeye ve yapımlarınızı yönetmeye başlamak için ilk projenizi oluşturun.`,createFirstButton:`İlk Projenizi Oluşturun`,create:`Oluştur`,files:`Dosyalar`,prints:`Baskılar`,plates:`plaka`,parts:`parça`,lastModified:`Son Değiştirme`,deleteConfirm:`Bu projeyi silmek istediğinizden emin misiniz? Arşivler ve kuyruk öğelerinin bağlantısı kaldırılacak ancak silinmeyecek.`,addFiles:`Dosya Ekle`,removeFile:`Dosyayı Kaldır`,viewDetails:`Detayları Görüntüle`,namePlaceholder:`örn., Voron 2.4 Yapımı`,descriptionPlaceholder:`İsteğe bağlı açıklama...`,urlLabel:`URL`,urlPlaceholder:`https://makerworld.com/...`,urlInvalid:`URL http:// veya https:// ile başlamalı`,openExternalUrl:`Proje URL'sini aç`,coverImageLabel:`Kapak fotoğrafı`,coverImageAlt:`Proje kapak fotoğrafı`,coverImageUpload:`Yükle`,coverImageReplace:`Değiştir`,coverImageRemove:`Kaldır`,color:`Renk`,targetPlates:`Hedef Plakalar`,targetPlatesPlaceholder:`örn., 25`,targetPlatesHelp:`Baskı işi sayısı`,targetParts:`Hedef Parçalar`,targetPartsPlaceholder:`örn., 150`,targetPartsHelp:`Gereken toplam nesne`,tagsLabel:`Etiketler (virgülle ayrılmış)`,tagsPlaceholder:`örn., voron, fonksiyonel, hediye`,dueDate:`Son Tarih`,priority:`Öncelik`,priorityLow:`Düşük`,priorityNormal:`Normal`,priorityHigh:`Yüksek`,priorityUrgent:`Acil`,statusActive:`Aktif`,statusCompleted:`Tamamlandı`,statusArchived:`Arşivlendi`,done:`Tamamlandı`,completed:`tamamlandı`,failed:`başarısız`,inQueue:`kuyrukta`,noPrintsYet:`Henüz baskı yok`,printJobs:`Baskı işleri (plakalar)`,partsPrinted:`Yazdırılan parçalar`,failedParts:`Başarısız parçalar`,import:`İçe Aktar`,export:`Dışa Aktar`,importProject:`Projeyi içe aktar`,exportAll:`Tüm projeleri dışa aktar`,loading:`Projeler yükleniyor...`,noEditPermission:`Projeleri düzenleme izniniz yok`,noDeletePermission:`Projeleri silme izniniz yok`,noCreatePermission:`Proje oluşturma izniniz yok`,noImportPermission:`Projeleri içe aktarma izniniz yok`,noExportPermission:`Projeleri dışa aktarma izniniz yok`,toast:{created:`Proje oluşturuldu`,updated:`Proje güncellendi`,deleted:`Proje silindi`,imported:`Proje içe aktarıldı`,multipleImported:`{{count}} proje içe aktarıldı`,importFailed:`İçe aktarma başarısız`,exported:`Projeler dışa aktarıldı (yalnızca meta veriler)`}},projectDetail:{notFound:`Proje bulunamadı`,backToProjects:`Projelere Dön`,export:`Dışa Aktar`,exportProject:`Projeyi dışa aktar`,noExportPermission:`Projeleri dışa aktarma izniniz yok`,noEditPermission:`Projeleri düzenleme izniniz yok`,partOf:`Şunun parçası:`,priorityLabel:`Öncelik:`,noPrints:`Bu projede henüz baskı yok`,status:{active:`Aktif`,completed:`Tamamlandı`,archived:`Arşivlendi`},priority:{low:`Düşük`,normal:`Normal`,high:`Yüksek`,urgent:`Acil`},dueDate:{overdue:`Gecikmiş`,today:`Bugün teslim`,daysLeft:`{{count}} gün kaldı`},progress:{platesProgress:`Plaka İlerlemesi`,partsProgress:`Parça İlerlemesi`,printJobs:`baskı işi`,parts:`parça`,percentComplete:`%{{percent}} tamamlandı`,remaining:`{{count}} kaldı`},stats:{printJobs:`Baskı İşleri`,total:`toplam`,failed:`{{count}} başarısız`,partsPrinted:`{{count}} parça yazdırıldı`,printTime:`Baskı Süresi`,filamentUsed:`Kullanılan Filament`},cost:{title:`Maliyet Takibi`,filamentCost:`Filament Maliyeti`,energy:`Enerji`,totalCost:`Toplam Maliyet`,total:`Toplam`,includesBom:`BOM dahil`,budget:`Bütçe`,remaining:`Kalan`},subProjects:{title:`Alt projeler ({{count}})`},notes:{title:`Notlar`,noEditPermission:`Notları düzenleme izniniz yok`,placeholder:`Bu proje hakkında notlar ekleyin...`,empty:`Henüz not yok. Not eklemek için Düzenle'ye tıklayın.`},files:{title:`Dosyalar`,linkFolders:`Dosya Yöneticisinden klasörleri bağla`,forQuickAccess:`hızlı erişim için bu projeye.`,fileCount:`{{count}} dosya`,empty:`Bağlı klasör yok. Dosya Yöneticisine gidin ve bu projeye bir klasör bağlayın.`,noFiles:`Bu klasörde dosya yok.`},bom:{title:`Malzeme Listesi`,acquired:`{{completed}}/{{total}} edinildi`,showAll:`Tümünü göster`,hideDone:`Tamamlananları gizle`,addPart:`Parça Ekle`,noAddPermission:`Parça ekleme izniniz yok`,partNamePlaceholder:`Parça adı (örn., M3x8 vidalar)`,partName:`Parça adı`,qty:`Adet`,price:`Fiyat ({{currency}})`,sourcingUrlPlaceholder:`Kaynak URL'si (isteğe bağlı)`,remarksPlaceholder:`Notlar (isteğe bağlı)`,deletePart:`Parçayı Sil`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz?`,noUpdatePermission:`Parçaları güncelleme izniniz yok`,noEditPermission:`Parçaları düzenleme izniniz yok`,noDeletePermission:`Parçaları silme izniniz yok`,totalCost:`Toplam maliyet:`,empty:`Malzeme listesinde parça yok. Nelerin tedarik edilmesi gerektiğini takip etmek için donanım, elektronik veya diğer bileşenler ekleyin.`},timeline:{title:`Etkinlik Zaman Çizelgesi`,empty:`Henüz etkinlik yok.`},template:{saveAsTemplate:`Şablon Olarak Kaydet`,noCreatePermission:`Şablon oluşturma izniniz yok`},queue:{title:`Kuyruk`,viewAll:`Tümünü görüntüle`,printing:`{{count}} yazdırılıyor`,queued:`{{count}} kuyrukta`},prints:{title:`Baskılar ({{count}})`},toast:{projectUpdated:`Proje güncellendi`,partAdded:`Parça eklendi`,partRemoved:`Parça kaldırıldı`,exportFailed:`Dışa aktarma başarısız`,projectExported:`Proje dışa aktarıldı`,templateCreated:`Şablon oluşturuldu`}},system:{title:`Sistem Bilgisi`,version:`Sürüm`,uptime:`Çalışma Süresi`,cpuUsage:`CPU Kullanımı`,memoryUsage:`Bellek Kullanımı`,diskUsage:`Disk Kullanımı`,networkInfo:`Ağ Bilgisi`,logs:`Günlükler`,debugMode:`Hata Ayıklama Modu`,enableDebug:`Hata Ayıklama Kaydını Etkinleştir`,disableDebug:`Hata Ayıklama Kaydını Devre Dışı Bırak`,downloadLogs:`Günlükleri İndir`,clearLogs:`Günlükleri Temizle`,dockerInfo:`Docker Bilgisi`,containerName:`Konteyner Adı`,imageName:`İmaj Adı`,platform:`Platform`,architecture:`Mimari`},sponsors:{sectionTitle:`Bağımsız ve topluluk destekli`,tagline:`Bambuddy ücretsizdir ve böyle kalır çünkü insanlar onu desteklemeyi seçer. VC yok, bulut bağımlılığı yok.`,viewSupporters:`Destekçileri görüntüle`,toastPrints:`Bambuddy ile {{count}} baskı tamamladın. Bambuddy, destekçileri sayesinde ücretsiz kalıyor.`,toastCost:`Bambuddy ile {{total}} kadar filament takip ettin. Projeyi bağımsız tutanları gör.`,toastArchives:`{{count}} baskı Bambuddy ile arşivlendi. Bağımsız kalmasını sağlayanları gör.`,toastAnniversary:`Bambuddy ile bir yılı doldurdun! Projeyi bağımsız tutanları gör.`,toastVersionUpdate:`v{{version}} sürümüne güncellendi. Bambuddy, destekçileri sayesinde ücretsiz kalıyor.`,toastBusiness:`Bambuddy'yi {{count}} yazıcıda mı çalıştırıyorsunuz? Ekipler için bir destek planı var: öncelikli düzeltmeler, faturalandırma ve geliştiriciye doğrudan erişim.`,businessCta:`Kurumsal Bambuddy`,businessTitle:`Kurumsal Bambuddy`,businessTagline:`{{count}} yazıcı çalıştırıyorsunuz. Ekipler ve baskı çiftlikleri için öncelikli destek, ticari lisanslama ve faturalandırma mevcut.`},library:{title:`Filament Kütüphanesi`,addFilament:`Filament Ekle`,editFilament:`Filamenti Düzenle`,deleteFilament:`Filamenti Sil`,vendor:`Satıcı`,material:`Malzeme`,color:`Renk`,kFactor:`K Faktörü`,temperature:`Sıcaklık`,noFilaments:`Kütüphanede filament yok`,deleteConfirm:`Bu filamenti silmek istediğinizden emin misiniz?`,importFromPrinter:`Yazıcıdan İçe Aktar`,exportToFile:`Dosyaya Dışa Aktar`,runWithPipeline:{actionLabel:`Pipeline ile çalıştır`,noPermission:`Pipeline çalıştırma izniniz yok`,modalTitle:`Pipeline ile çalıştır`,confirmTitle:`Çalıştırmayı onayla`,confirmIntro:`Ön kontrol bu çalıştırmayla ilgili sorunlar buldu`,sourceHint:`Kaynak`,pipelineHint:`Pipeline`,targetHint:`Hedef`,pipelineListAria:`Kullanılabilir pipeline'lar`,runAnyway:`Yine de çalıştır`,loading:`Yükleniyor…`,empty:`Henüz kayıtlı pipeline yok. Dilimleme diyalogunu açın ve oluşturmak için "Pipeline olarak kaydet"e tıklayın.`,noTarget:`Hedef yazıcı belirlenmemiş`,noTargetMessage:`Bu pipeline'ın hedef yazıcısı yok. Birini seçmek için Ayarlar'da açın.`,copies:`Kopyalar`,copiesHint:`maks {{n}}`,classTarget:`Herhangi {{model}}`,toast:{started:`Pipeline çalıştırması başladı`,failed:`Çalıştırma başlatılamadı`},issue:{printerNotSet:`Bu pipeline'da hedef yazıcı belirlenmemiş.`,printerNotFound:`Hedef yazıcı artık mevcut değil.`,printerDisabled:`Hedef yazıcı devre dışı.`,printerOffline:`Hedef yazıcı çevrimdışı.`,filamentType:`Filament yuvası {{slot}}: beklenen {{expected}}, AMS'de {{actual}}`,filamentColor:`Filament yuvası {{slot}}: renk farklı (beklenen {{expected}}, AMS'de {{actual}})`,amsSlotMissing:`AMS yuvası {{slot}} bu yazıcıda yok`,filamentUnverified:`Filament yuvası {{slot}} bulut / standart ön ayardan geldiği için statik olarak doğrulanamadı.`,noClassMatches:`Bu kurulumda pipeline'ın hedef model sınıfıyla ({{expected}}) eşleşen yazıcı yok.`,classNotSet:`Pipeline hedefi yazıcı sınıfı olarak ayarlanmış ancak model seçilmemiş.`}}},slice:{title:`Modeli dilimle`,action:`Dilimle`,actionAll:`Tüm {{count}} plakayı dilimle`,actionAllTitle:`Her plakayı tek bir çok plakalı çıktıya dilimle (tek arşiv). Filament seçimi projenin tanımladığı her yuvayı kapsar.`,allPlatesToggle:`Tüm {{count}} plakayı dilimle`,slicing:`Dilimleniyor…`,printer:`Yazıcı profili`,process:`İşlem profili`,filament:`Filament profili`,filamentSlot:`Filament {{index}} ({{type}})`,selectPreset:`— Bir ön ayar seçin —`,loadingPresets:`Ön ayarlar yükleniyor…`,analyzingPlateFilaments:`Plaka filamentleri analiz ediliyor…`,analyzingPlateFilamentsHint:`Bu plakanın hangi AMS yuvalarını kullandığını keşfetmek için bir önizleme dilimleme çalıştırılıyor. Sonradan önbelleğe alınır — yeniden açma anlıktır.`,previewToast:`{{name}} analiz ediliyor — {{elapsed}}`,previewWithProgress:`{{name}} analiz ediliyor — {{stage}} (%{{percent}}) — {{elapsed}}`,notUsedByPlate:`— bu plaka tarafından kullanılmıyor`,noPresetsForSlot:`Kullanılabilir ön ayar yok`,otherPrinters:`Diğer yazıcılar`,presetsLoadFailed:`Ön ayarlar yüklenemedi. Önce içe aktarmak için Ayarlar → Profiller'i açın.`,refreshPresets:`Yenile`,refreshPresetsTitle:`Ön ayarları yenile — en güncel bulut ve paketli listeleri getir (Bambu Studio veya Bambu Handy'de bir ön ayar sildikten sonra kullanın)`,allPresetsRequired:`Tüm ön ayarlar seçilmelidir`,useEmbedded:`Dosyanın yerleşik ayarlarını kullan`,useEmbeddedHint:`Yukarıdaki profiller yerine tasarımcının ayarladığı gibi (duvarlar, dolgu, filament) dilimle. Yazıcınız dosyayla eşleştiği için sunuluyor.`,enqueuing:`Dilimleme işi gönderiliyor…`,queued:`Kuyrukta…`,failed:`Dilimleme başarısız. Dilimleyici yardımcı bileşen günlüklerini kontrol edin.`,startedToast:`{{name}} arka planda dilimleniyor…`,queuedToast:`Kuyrukta: {{name}} — {{elapsed}}`,runningToast:`{{name}} dilimleniyor — {{elapsed}}`,runningWithProgress:`{{name}} — {{stage}} (%{{percent}}) — {{elapsed}}`,runningWithProgressMultiPlate:`{{plateCount}}/{{plateIndex}} plaka • {{name}} — {{stage}} (%{{percent}}) — {{elapsed}}`,completedToast:`{{name}} dilimlendi`,failedTitle:`Dilimleme başarısız`,failedToast:`{{name}} dilimleme başarısız: {{detail}}`,tier:{local:`İçe aktarılmış`,cloud:`Bambu Cloud`,orcaCloud:`Orca Cloud`,standard:`Standart`},cloud:{notAuthenticated:`Bulut ön ayarlarınızı görmek için Bambu Cloud'a giriş yapın (Ayarlar → Profiller → Bambu Cloud).`,expired:`Bambu Cloud oturumu süresi doldu — bulut ön ayarlarınızı yenilemek için tekrar giriş yapın.`,unreachable:`Bambu Cloud şu anda erişilemez. Yerel ve standart ön ayarlar hâlâ çalışıyor.`},orcaCloud:{notAuthenticated:`Orca ön ayarlarınızı görmek için Orca Cloud'a giriş yapın (Profiller → Orca Cloud).`,expired:`Orca Cloud oturumu sona erdi — Orca ön ayarlarınızı yenilemek için tekrar giriş yapın.`,unreachable:`Orca Cloud şu anda erişilemez. Diğer ön ayarlar çalışmaya devam ediyor.`},bedType:{label:`Baskı plakası`,auto:`Otomatik (işlem ön ayarı kullan)`,coolPlate:`Soğuk Plaka`,coolPlateSuperTack:`Soğuk Plaka SuperTack`,engineering:`Mühendislik Plakası`,highTemp:`Yüksek Sıcaklık Plakası`,texturedPEI:`Dokulu PEI Plakası`,smoothPEI:`Düz PEI Plakası`},pipelines:{label:`Pipeline`,applyAria:`Pipeline uygula`,applyPrompt:`Pipeline uygula…`,empty:`Kayıtlı pipeline yok`,saveButton:`Pipeline olarak kaydet`,saveTitle:`Dört slotluk mevcut seçimi yeniden kullanılabilir pipeline olarak kaydet`,namePlaceholder:`Pipeline adı`,nameAria:`Yeni pipeline adı`,toast:{applied:`"{{name}}" uygulandı`,saved:`Pipeline kaydedildi`,saveFailed:`Kaydetme başarısız`}}},spoolman:{title:`Spoolman Entegrasyonu`,enabled:`Spoolman Etkin`,url:`Spoolman URL`,connected:`Bağlı`,disconnected:`Bağlı Değil`,testConnection:`Bağlantıyı Test Et`,sync:`Senkronize Et`,syncing:`Senkronize ediliyor...`,lastSync:`Son Senkronizasyon`,linkToSpoolman:`Spoolman'a Bağla`,openInSpoolman:`Spoolman'da Aç`,unlinkSpool:`Makara Bağlantısını Kaldır`,unlinkConfirmTitle:`Makara Atamasını Kaldır?`,unlinkConfirmMessage:`Bu, makarayı bu yuvadan kaldıracak. Makara verisinin kendisi değişmeyecek.`,selectSpool:`Makara Seç`,noUnlinkedSpools:`Atanmamış makara yok`,linkSuccess:`Makara başarıyla atandı`,linkFailed:`Makara atanamadı`,unlinkSuccess:`Makara ataması başarıyla kaldırıldı`,unlinkFailed:`Makara ataması kaldırılamadı`,linkedSpool:`Atanan makara`,spoolId:`Makara ID`,fillSourceLabel:`(Spoolman)`,weight:`Ağırlık`,remaining:`Kalan`,disableWeightSync:`AMS Tahmini Ağırlık Senkronizasyonunu Devre Dışı Bırak`,disableWeightSyncDesc:`AMS tahminlerinden kalan kapasiteyi güncelleme. AMS yüzde tabanlı tahminler yerine Spoolman'ın kullanım takibini tercih ediyorsanız bunu kullanın. Yeni makaralar yine de başlangıç ağırlığı olarak AMS tahminini kullanacak.`,reportPartialUsage:`Başarısız Baskılar için Kısmi Kullanımı Bildir`,reportPartialUsageDesc:`Bir baskı başarısız olduğunda veya iptal edildiğinde, katman ilerlemesine göre o noktaya kadar kullanılan tahmini filamenti bildir.`},locations:{title:`Depolama Konumları`,subtitle:`Makaralarınız için raf, çekmece ve diğer fiziksel depolama yerlerini yönetin`,add:`Konum Ekle`,addShort:`Ekle`,edit:`Konumu Düzenle`,name:`Ad`,spools:`Makaralar`,empty:`Henüz depolama konumu yok. İlk rafınızı veya çekmecenizi oluşturun.`,manage:`Konumlar`,createPlaceholder:`örn. Raf A, Çekmece 1`,nameRequired:`Konum adı zorunludur`,created:`Konum oluşturuldu`,updated:`Konum güncellendi`,deleted:`Konum silindi`,saveFailed:`Konum kaydedilemedi`,deleteFailed:`Konum silinemedi`,deleteBlocked:`Silmeden önce bu konumdaki tüm makaraları taşıyın`,confirmDelete:`"{{name}}" silinsin mi?`,confirmDeleteMessage:`Bu konum kataloğdan kaldırılacak. Önce makaralar taşınmalıdır.`},inventory:{title:`Makara Envanteri`,subtitle:`Makaralarınızı yönetin`,addToInventory:`Envantere Ekle`,addToInventoryPending:`Ekleniyor...`,addToInventorySuccess:`Makara envantere eklendi`,addToInventoryFailed:`Makara envantere eklenemedi`,unknownSpoolTitle:`Yeni filament algılandı`,unknownSpoolMessage:`{{location}} konumunda bilinmeyen RFID etiketli bir makara algılandı. Şimdi envantere eklensin mi?`,unknownSpoolSlot:`Yuva`,bulk:{selectAllVisible:`Görünenleri seç`,selectRow:`Satırı seç`,selectGroup:`Grubu seç`,selectionCount:`{{count}} seçildi`,edit:`Düzenle`,printLabels:`Etiket yazdır`,resetUsage:`Kullanımı sıfırla`,restore:`Geri yükle`,archive:`Arşivle`,delete:`Sil`,clearSelection:`Seçimi temizle`,editTitle:`Makaraları toplu düzenle`,editSubtitle:`Seçilen {{count}} makaraya uygulanır. Yalnızca işaretlediğiniz alanlar güncellenir.`,editHint:`Bir alana yazmak onu güncelleme için işaretler — yalnızca işaretli satırlar gönderilir. Boş bırakılan alanlar makaraları değiştirmez (alanları boşaltmak yalnızca makara bazında yapılabilir).`,useCustom:`"{{value}}" kullan`,toggleField:`Bu alanın güncellenmesini değiştir`,changeCount:`{{count}} alan güncellenecek.`,applyPending:`Uygulanıyor...`,applyButton:`{{count}} makaraya uygula`,deleteTitle:`Seçili makaraları sil`,archiveTitle:`Seçili makaraları arşivle`,restoreTitle:`Seçili makaraları geri yükle`,resetUsageTitle:`Seçili makaraların kullanımını sıfırla`,deleteMessage:`{{count}} makara kalıcı olarak silinsin mi? Bu işlem geri alınamaz.`,archiveMessage:`{{count}} makara arşivlensin mi? Daha sonra geri yüklenebilir.`,restoreMessage:`{{count}} arşivlenmiş makara geri yüklensin mi?`,resetUsageMessage:`{{count}} makaranın "Toplam Tüketim" sayacı sıfırlansın mı? Kalan ağırlık korunur.`,updateSuccess:`{{count}} makara güncellendi`,updateFailed:`Toplu güncelleme başarısız`,updatePartial:`{{ok}} makara güncellendi, {{failed}} başarısız`,updateAllFailed:`{{count}} güncellemenin tümü başarısız oldu — yeniden denemek için seçim korundu`,deleteSuccess:`{{count}} makara silindi`,deleteFailed:`Toplu silme başarısız`,deletePartial:`{{ok}} makara silindi, {{failed}} başarısız`,deleteAllFailed:`{{count}} silmenin tümü başarısız oldu — yeniden denemek için seçim korundu`,archiveSuccess:`{{count}} makara arşivlendi`,archiveFailed:`Toplu arşivleme başarısız`,archivePartial:`{{ok}} makara arşivlendi, {{failed}} başarısız`,archiveAllFailed:`{{count}} arşivlemenin tümü başarısız oldu — yeniden denemek için seçim korundu`,restoreSuccess:`{{count}} makara geri yüklendi`,restoreFailed:`Toplu geri yükleme başarısız`,restorePartial:`{{ok}} makara geri yüklendi, {{failed}} başarısız`,restoreAllFailed:`{{count}} geri yüklemenin tümü başarısız oldu — yeniden denemek için seçim korundu`,invalidHex:`6 hex karakter (RRGGBB) veya 8 (RRGGBBAA) girin. Aksi takdirde alan uygulanmaz.`},spoolmanMixedContentTitle:`Spoolman HTTPS üzerinden yüklenemiyor — tarayıcınız tarafından karışık içerik engellendi`,spoolmanMixedContentBody:`Bambuddy HTTPS üzerinden sunuluyor (ters proxy'niz aracılığıyla), ancak Spoolman URL'niz hâlâ düz HTTP. Tarayıcılar güvenlik için karışık içeriği engeller, bu nedenle gömülü Spoolman arayüzü oluşturulamaz. Bunun çalışması için Spoolman'in HTTPS üzerinden erişilebilir olması gerekiyor.`,spoolmanMixedContentFixReverseProxy:`Spoolman'i Bambuddy ile aynı ters proxy'nin (Traefik / Nginx / Caddy) arkasına HTTPS ile koyun, ardından Ayarlardaki Spoolman URL'sini yeni HTTPS adresine güncelleyin.`,spoolmanMixedContentFixOpenNewTab:`Geçici bir çözüm olarak, Spoolman'i HTTP üzerinden yeni bir tarayıcı sekmesinde açın — karışık içerik kuralları yalnızca gömülü çerçevelere uygulanır, bu nedenle bağımsız bir sekme yine çalışır.`,spoolmanOpenInNewTab:`Spoolman'i yeni sekmede aç`,labels:{title:`Makara etiketleri yazdır`,selectedCount:`{{count}} seçildi`,pickSpools:`Hangi makaralar için etiket yazdırılacağını seçin:`,monochrome:`Tek renk (siyah beyaz yazıcı)`,monochromeHint:`Renk örneğini kaldırır ve metni genişletir`,searchPlaceholder:`Ad, marka veya #ID ara`,filterByMaterial:`Malzeme:`,allMaterials:`Tümü`,selectVisible:`Görünen tümünü seç ({{count}})`,deselectVisible:`Görünenleri seçimden kaldır`,clearAll:`Tümünü temizle`,noSpoolsToShow:`Gösterilecek makara yok. Filtrenizi ayarlayın ve tekrar deneyin.`,noMatches:`Mevcut arama veya filtreyle eşleşen makara yok.`,printOne:`Bu makara için etiket yazdır`,printLabels:`Etiketleri yazdır…`,bulkTitle:`Şu anda gösterilen {{count}} makaradan etiket yazdırılacak olanları seçin`,noSpoolsTitle:`Etiketlenecek makara yok`,error:`Etiketler oluşturulamadı: {{msg}}`,sortBy:{label:`Sırala:`,id:`ID'ye göre`,color:`Renge göre`},templates:{amsHolderSmall:{label:`AMS tutucu — küçük (74 × 33 mm)`,hint:`Sayfa başına tek etiket; MakerWorld model 752566 (AMS Filament Etiket Tutucu) yazdırılabilir etiketle eşleşir.`},amsHolderLarge:{label:`AMS tutucu — büyük (75 × 55 mm)`,hint:`Sayfa başına tek etiket; AMS Filament Etiket Tutucu'nun karton uçlu varyantına uyar. Numune, marka, malzeme, ID ve QR kod için yeterli yer.`},box40x30:{label:`Kutu etiketi (40 × 30 mm)`,hint:`Sayfa başına tek etiket; yaygın DK/Brother rulo boyutu, filament torbası ve depolama kutusu etiketleri için iyi.`},box:{label:`Kutu etiketi (62 × 29 mm)`,hint:`Sayfa başına tek etiket; Brother PT/QL ve Dymo küçük etiketleri için boyutlandırılmış.`},averyL7160:{label:`Avery L7160 — A4 sayfa (38.1 × 63.5 mm × 21)`,hint:`AB sayfa stoğu; A4 sayfa başına 21 etiket.`},avery5160:{label:`Avery 5160 — US Letter sayfa (25.4 × 66.7 mm × 30)`,hint:`ABD sayfa stoğu; Letter sayfası başına 30 etiket.`}}},csv:{importButton:`CSV İçe Aktar`,exportButton:`CSV Dışa Aktar`,modalTitle:`CSV'den makara içe aktar`,selectFile:`Bir CSV dosyası seçin veya buraya sürükleyin`,dragHint:`Başlık: material (zorunlu), brand, subtype, color_name, rgba, …`,parsing:`Dosya okunuyor…`,previewError:`CSV dosyası okunamadı`,validCount:`{{count}} geçerli`,errorCount:`{{count}} hatalı`,skippedCount:`{{count}} atlandı`,colRow:`Satır`,colStatus:`Durum`,colColor:`Renk`,colorResolved:`Renk katalogdan dolduruldu`,colorCrossMaterial:`Renk farklı bir malzemeden alındı — katalogda tam eşleşme yok`,duplicateExisting:`Bu malzeme, marka ve renkte bir makara zaten var — yine de yeni makara olarak içe aktarılacak`,spoolmanHint:`Spoolman modunda Spoolman'ın yerleşik CSV içe/dışa aktarımını kullanın.`,importValidRows:`{{count}} geçerli satırı içe aktar`,noValidRows:`Geçerli satır yok`,importing:`İçe aktarılıyor…`,importSuccess:`{{count}} makara içe aktarıldı`,importError:`İçe aktarma başarısız`,exportError:`Dışa aktarma başarısız`},addSpool:`Makara Ekle`,editSpool:`Makarayı Düzenle`,copySpool:`Makarayı Kopyala`,material:`Malzeme`,selectMaterial:`Malzeme seç...`,subtype:`Alt tür`,brand:`Marka`,searchBrand:`Marka ara...`,useCustomBrand:`"{{brand}}" kullan`,useCustomMaterial:`Özel malzeme kullan: {{material}}`,colorName:`Renk Adı`,colorNamePlaceholder:`Yeşim Beyazı, Ateş Kırmızısı...`,color:`Renk`,hexColor:`Hex Renk`,pickColor:`Özel renk seç`,labelWeight:`Etiket Ağırlığı`,coreWeight:`Boş Makara Ağırlığı`,searchSpoolWeight:`Makara ağırlığı ara...`,weightUsed:`Kullanılan`,currentWeight:`Kalan Ağırlık`,measuredWeight:`Ölçülen Ağırlık`,spoolName:`Makara`,costPerKg:`kg başına maliyet`,storageLocation:`Depolama Konumu`,storageLocationPlaceholder:`örn. Raf A, Çekmece 1`,openInInventory:`Envanterde Aç`,measuredWeightError:`Ölçülen ağırlık {{min}}g ile {{max}}g arasında olmalı.`,slicerFilament:`Dilimleyici Filamenti`,slicerFilamentName:`Dilimleyici Ön Ayar Adı`,slicerPreset:`Dilimleyici Ön Ayarı`,searchPresets:`Filament ön ayarlarında ara...`,selectedPreset:`Seçildi`,noPresetsFound:`Ön ayar bulunamadı`,tempOverrides:`Sıcaklık Geçersiz Kılmaları`,note:`Not`,notePlaceholder:`Bu makara hakkında ek notlar...`,category:`Kategori`,categoryPlaceholder:`örn. Üretim, Prototip, Müşteri A`,categoryNone:`Kategorisiz`,storageLocationNone:`Konum ayarlanmamış`,lowStockThresholdOverride:`Düşük stok eşiği (bu makara)`,lowStockThresholdOverrideHelp:`Global eşiği kullanmak için boş bırakın (%{{global}}).`,clearRfid:`RFID Etiketini Temizle`,rfidCleared:`RFID etiketi temizlendi`,archive:`Arşivle`,restore:`Geri Yükle`,noSpools:`Henüz makara yok. Başlamak için ilk makaranızı ekleyin.`,noAvailableSpools:`Kullanılabilir makara yok. Envanterinize bir makara ekleyin veya önce başka bir yuvadan atamayı kaldırın.`,kProfiles:`K-Profilleri`,addKProfile:`K-Profili Ekle`,assignSpool:`Makara Ata`,unassignSpool:`Atamayı Kaldır`,assignSuccess:`Makara atandı ve AMS yuvası yapılandırıldı`,assignPendingInsert:`Atandı. Makarayı yerleştirdiğinizde yuva yapılandırılacak.`,assignFailed:`Makara atanamadı`,selectSpool:`Bu yuvaya atamak için bir makara seçin`,assigned:`Atandı`,assigning:`Atanıyor...`,searchSpools:`Makaralarda ara...`,showAllSpools:`Tüm makaraları göster`,spoolmanSpools:`Spoolman Makaraları`,allMaterials:`Tüm Malzemeler`,filterByBrand:`Markaya göre filtrele...`,showArchived:`Arşivlenmişleri göster`,quickAdd:`Hızlı Ekle (Stok)`,quantity:`Miktar`,stock:`Stok`,configured:`Yapılandırıldı`,spoolsCreated:`{{count}} makara oluşturuldu`,spoolsPartiallyCreated:`{{total}} makaradan {{created}} tanesi oluşturuldu (bazıları başarısız)`,spoolCreated:`Makara oluşturuldu`,spoolUpdated:`Makara güncellendi`,spoolDeleted:`Makara silindi`,deepLinkSpoolNotFound:`Makara bulunamadı`,deepLinkFetchFailed:`Makara yüklenemedi — tekrar deneyin`,spoolArchived:`Makara arşivlendi`,spoolRestored:`Makara geri yüklendi`,kProfileSaveFailed:`K-profili ayarları kaydedilemedi`,syncWeightSpoolNotFound:`Makara bulunamadı — silinmiş olabilir`,syncWeightSpoolmanUnreachable:`Spoolman'a erişilemiyor — daha sonra tekrar deneyin`,syncWeightFailed:`Ağırlık senkronize edilemedi`,spoolmanUnreachable:`Spoolman erişilebilir değil — lütfen daha sonra tekrar deneyin`,deleteSpoolNotFound:`Makara bulunamadı — zaten silinmiş olabilir`,deleteFailed:`Makara silinemedi`,archiveSpoolNotFound:`Makara bulunamadı — zaten silinmiş olabilir`,archiveFailed:`Makara arşivlenemedi`,restoreSpoolNotFound:`Makara bulunamadı — zaten silinmiş olabilir`,restoreFailed:`Makara geri yüklenemedi`,saveFailed:`Değişiklikler kaydedilemedi`,tagClearFailed:`Etiket temizlenemedi`,deleteConfirm:`Bu makarayı silmek istediğinizden emin misiniz? Bu geri alınamaz.`,archiveConfirm:`Bu makarayı arşivlemek istediğinizden emin misiniz?`,advancedSettings:`Gelişmiş Ayarlar`,filamentInfoTab:`Filament Bilgisi`,paProfileTab:`PA Profili`,filamentInfo:`Filament`,additional:`Ek`,loadingPresets:`Bulut ön ayarları yükleniyor...`,cloudConnected:`Bulut bağlı`,cloudNotConnected:`Bulut bağlı değil (varsayılanlar kullanılıyor)`,recentColors:`Son Kullanılan`,searchColors:`Renklerde ara...`,searchResults:`Arama sonuçları`,allColors:`Tüm renkler`,commonColors:`Yaygın renkler`,showLess:`Daha az göster`,showAll:`Tümünü göster`,noColorsFound:`Aramanızla eşleşen renk yok`,noResults:`Eşleşme bulunamadı`,extraColorsLabel:`Ekstra renkler`,extraColorsPlaceholder:`EC984C,#6CD4BC,A66EB9,D87694`,extraColorsHint:`Virgülle ayrılmış 2 ile 8 arası hex durağı yapıştırın. Bir gradyan olarak görüntülenir.`,extraColorsInvalid:`Geçersiz hex yok sayıldı: {{tokens}}`,colorEffectLabel:`Efekt`,colorEffect:{none:`Yok`,sparkle:`Parıltı`,wood:`Ahşap`,marble:`Mermer`,glow:`Parlama`,matte:`Mat`,silk:`İpek`,galaxy:`Galaksi`,rainbow:`Gökkuşağı`,metal:`Metal`,translucent:`Yarı saydam`,gradient:`Gradyan`,dualColor:`Çift Renk`,triColor:`Üç Renk`,multicolor:`Çok Renkli`},selectMaterialFirst:`Lütfen önce Filament Bilgisi sekmesinde bir malzeme seçin.`,noPrintersConfigured:`Yapılandırılmış yazıcı yok. PA profillerini kullanmak için yazıcı ekleyin.`,matchingFilter:`Eşleşen`,anyBrand:`Herhangi marka`,anyVariant:`Herhangi varyant`,autoSelect:`Otomatik seç`,matches:`eşleşme`,match:`eşleşme`,noMatches:`Eşleşme yok`,connected:`Bağlı`,offline:`Çevrimdışı`,printerOffline:`Yazıcı çevrimdışı. Kalibrasyon profillerini görüntülemek için bağlanın.`,noKProfilesMatch:`Seçilen filamentle eşleşen K-profili yok.`,leftNozzle:`Sol Nozul`,rightNozzle:`Sağ Nozul`,profilesSelected:`kalibrasyon profili seçildi`,totalInventory:`Toplam Envanter`,totalConsumed:`Toplam Tüketim`,byMaterial:`Malzemeye Göre`,inPrinter:`Yazıcıda`,lowStock:`Düşük Stok`,sinceTracking:`Takip başladığından beri`,resetConsumedCounter:`Sayacı sıfırla`,resetConsumedCounterTooltip:`Bu makara için tüketilen gram sayacını sıfırla. Kalan ağırlık değişmez.`,resetConsumedCounterConfirm:`Bu makaranın tüketilen gram sayacı 0'a sıfırlansın mı? Gelecekteki baskılar sıfırdan tekrar takip edilecek. Makaranın kendisi, kalan ağırlık hesaplaması ve ayarlarınız değiştirilmez.`,resetAllConsumedCounters:`Tüm sayaçları sıfırla`,resetAllConsumedCountersTooltip:`Her makarada tüketilen gram sayacını sıfırla. Kalan ağırlıklar değişmez.`,resetAllConsumedCountersConfirm:`Tüm {{count}} makaradaki (arşivlenmişler dahil) tüketilen gram sayacı 0'a sıfırlansın mı? Bu, "Toplam Tüketim" istatistiğini temizler, böylece gelecekteki baskılar sıfırdan takip edilir. Makaralar ve kalan ağırlıklar değiştirilmez.`,consumedCounterReset:`Sayaç sıfırlandı`,allConsumedCountersReset:`{{count}} makaranın sayacı sıfırlandı`,resetConsumedCounterFailed:`Sayaç sıfırlanamadı`,loadedInAms:`AMS/Ext'te Yüklü`,remaining:`Kalan`,weightCheck:`Ağırlık Kontrolü`,lastWeighed:`Son tartım`,neverWeighed:`Hiç tartılmadı`,search:`Makaralarda ara...`,showing:`Gösterilen`,to:`-`,of:`/`,show:`Göster`,spools:`makara`,spool:`makara`,page:`Sayfa`,noSpoolsMatch:`Sonuç bulunamadı`,noSpoolsMatchDesc:`Aradığınızı bulmak için aramanızı veya filtrelerinizi ayarlamayı deneyin.`,active:`Aktif`,archived:`Arşivlendi`,all:`Tümü`,used:`Kullanılmış`,new:`Yeni`,clearFilters:`Filtreleri temizle`,table:`Tablo`,cards:`Kartlar`,net:`Net`,groupSimilar:`Grupla`,groupedSpools:`{{count}} aynı makara`,groupedRows:`satır`,columns:`Sütunlar`,configureColumns:`Sütunları Yapılandır`,configureColumnsDesc:`Sütunları yeniden sıralamak için sürükleyin veya okları kullanın. Göz simgesiyle görünürlüğü değiştirin.`,visible:`görünür`,reset:`Sıfırla`,cancel:`İptal`,applyChanges:`Değişiklikleri Uygula`,moveUp:`Yukarı taşı`,moveDown:`Aşağı taşı`,hideColumn:`Sütunu gizle`,showColumn:`Sütunu göster`,linkToSpool:`Makaraya Bağla`,tagLinked:`Etiket makaraya bağlandı`,tagLinkFailed:`Etiket bağlanamadı`,tagAlreadyLinked:`Etiket zaten başka bir makaraya bağlı`,unknownTag:`Bilinmeyen RFID etiketi algılandı`,usageHistory:`Kullanım Geçmişi`,noUsageHistory:`Henüz kullanım kaydedilmedi`,printName:`Baskı Adı`,weightConsumed:`Tüketilen Ağırlık`,clearHistory:`Temizle`,historyCleared:`Kullanım geçmişi temizlendi`,fillSourceLabel:`(Env)`,lowStockThresholdError:`Eşik 0.1 ile 99.9 arasında olmalı`,assignMismatchTitle:`Malzeme uyumsuzluğu`,assignMismatchMessage:`Seçilen makara malzemesi "{{spoolMaterial}}", {{location}} için tepsi malzemesi "{{trayMaterial}}" ile eşleşmiyor. Yine de atansın mı?`,assignMismatchConfirm:`Yine de Ata`,assignPartialMismatchMessage:`Makara malzemesi "{{spoolMaterial}}", {{location}} konumundaki "{{trayMaterial}}" ile benzer ancak tam olarak eşleşmiyor. Devam etmek istiyor musunuz?`,assignProfileMismatchMessage:`Makara profili "{{spoolProfile}}", {{location}} konumundaki tepsi profili "{{trayProfile}}" ile eşleşmiyor. Devam etmek istiyor musunuz?`,assignReconfigureNote:`AMS yuvası, makaranın profilini kullanacak şekilde yeniden yapılandırılacak.`,spoolmanFilamentCatalog:`Spoolman Filament Kataloğu`,pickFromSpoolmanCatalog:`Spoolman kataloğundan seç…`,spoolmanFilamentSelected:`Filament Spoolman kataloğundan seçildi`,spoolmanFilamentUnlinked:`Filament katalog bağlantısı temizlendi`,noSpoolmanFilaments:`Spoolman kataloğunda filament bulunamadı`,spoolmanFilamentColorSwatch:`Filament rengi`,spoolWeightManagedBySpoolman:`Boş makara ağırlığı Spoolman'de filament türü başına yönetilir`,spoolmanCatalogLoadFailed:`Spoolman filament kataloğu yüklenemedi`},timelapse:{title:`Zaman Atlamalı Video`,create:`Zaman Atlamalı Video Oluştur`,download:`İndir`,delete:`Sil`,preview:`Önizleme`,frameRate:`Kare Hızı`,quality:`Kalite`,processing:`İşleniyor...`,noTimelapses:`Kullanılabilir zaman atlamalı video yok`},ams:{title:`AMS`,slot:`Yuva`,empty:`Boş`,emptySlot:`Boş yuva`,slotEmpty:`Boş`,slotUnconfigured:`?`,emptySlotReset:`Atanmış filament yok`,unknown:`Bilinmiyor`,humidity:`Nem`,temperature:`Sıcaklık`,filamentType:`Filament Türü`,filamentColor:`Renk`,remaining:`Kalan`,history:`AMS Geçmişi`,noHistory:`Geçmiş mevcut değil`,configureSlot:`Yuvayı Yapılandır`,externalSpool:`Harici Makara`,profile:`Profil`,kFactor:`K Faktörü`,fill:`Doldur`,configure:`Yapılandır`,used:`kullanılan`,remainingUnit:`kalan`},printModal:{selectPrinter:`Yazıcı Seç`,selectPlate:`Plaka Seç`,filamentMapping:`Filament Eşlemesi`,plateN:`Plaka {{n}}`,plateFilamentsUnreadable:`Seçili bir plakanın filamentleri okunamadı, bu yüzden eşleştirilemiyor. Diğerlerini kuyruğa almak için o plakanın seçimini kaldırın.`,totalCost:`Toplam maliyet:`,slotRemainingShort:` - {{grams}}g kaldı`,printSettings:`Baskı Ayarları`,bedLeveling:`Tabla Seviyelendirme`,flowCalibration:`Akış Kalibrasyonu`,vibrationCalibration:`Titreşim Kalibrasyonu`,layerInspection:`İlk Katman Denetimi`,timelapse:`Zaman Atlamalı Video`,cancel:`İptal`,noPrintersAvailable:`Kullanılabilir yazıcı yok`,printerBusy:`Yazıcı meşgul`,printerOffline:`Yazıcı çevrimdışı`,sameTypeDifferentColor:`Aynı tür, farklı renk`,filamentTypeNotLoaded:`Filament türü yüklenmedi`,whenToPrint:`Ne zaman yazdırılsın`,asap:`En kısa sürede`,queue:`Kuyruk`,schedule:`Zamanla`,dateTime:`Tarih ve saat`,invalidDateTime:`Lütfen geçerli bir tarih ve saat girin`,openCalendar:`Takvimi aç`,requireManualStart:`Manuel başlatma gerektir`,requirePreviousSuccess:`Yalnızca önceki baskı başarılıysa başlat`,autoOffAfter:`Bittiğinde yazıcıyı kapat`,helpAsap:`Baskı kuyruğun en üstüne eklenir ve uygun bir yazıcı boştaysa başlar.`,helpSchedule:`Yazıcı boşta ise baskı zamanlanan saatte başlar. Meşgulse yazıcı uygun olana kadar bekler.`,helpQueue:`Baskı kuyruğun sonuna eklenir.`,leftNozzle:`S`,rightNozzle:`R`,leftNozzleTooltip:`Sol nozul`,rightNozzleTooltip:`Sağ nozul`,filamentOverride:`Filament Geçersiz Kılma`,filamentOverrideHint:`Model tabanlı atama için isteğe bağlı olarak filamentleri geçersiz kıl. Planlayıcı, orijinal 3MF değerleri yerine seçtiğiniz filamentlere göre eşleşecek.`,originalFilament:`Orijinal`,overrideWith:`Şununla geçersiz kıl`,resetToOriginal:`Orijinale sıfırla`,insufficientFilamentTitle:`Yeterli filament yok`,waitingForAmsStatus:`{{printer}} için AMS durumu bekleniyor…`,insufficientFilamentMessage:`Bazı atanmış makaralarda bu baskının ihtiyaç duyduğundan daha az filament kaldı:`,insufficientFilamentLine:`{{printer}} - {{slot}}: {{required}}g gerekli, {{remaining}}g kaldı`,printAnyway:`Yine de yazdır`,forceColorMatch:`Renk eşleşmesini zorla`,staggerPrinterStarts:`Yazıcı başlangıçlarını kademelendir`,staggerGroupSize:`Grup boyutu`,staggerInterval:`Aralık (dk)`,staggerPreview:`{{printers}} yazıcı → {{size}} kişilik {{groups}} grup, her {{interval}} dk'da bir başlatılıyor`,staggerLastGroup:`son grup: {{count}}`,staggerTotal:`toplam: {{minutes}} dk`,staggerToPrinters:`{{count}} yazıcıya kademelendir`,gcodeInjection:`Otomatik baskı G-kodu enjekte et`},backup:{includesEncryptionKey:`Yerel yedekler, yedek ZIP'nin kendi içinde tamamlanmış olması için MFA şifreleme anahtarı dosyasını (DATA_DIR/.mfa_encryption_key) içerir. ZIP'yi hassas olarak değerlendirin — dosyaya sahip olan herkes içinde saklanan OIDC istemci gizli anahtarlarını ve TOTP gizli anahtarlarını çözebilir.`,title:`Yedekleme ve Geri Yükleme`,createBackup:`Yedek Oluştur`,restoreBackup:`Yedeği Geri Yükle`,restoreDescription:`Tüm verileri bir yedek dosyasından değiştir`,downloadBackup:`Yedeği İndir`,uploadBackup:`Yedek Yükle`,lastBackup:`Son Yedek`,autoBackup:`Otomatik Yedekleme`,backupNow:`Şimdi Yedekle`,restoreWarning:`Uyarı: Bir yedeği geri yüklemek tüm mevcut verilerin üzerine yazacak.`,includeArchives:`Arşivleri Dahil Et`,includeSettings:`Ayarları Dahil Et`,includeProfiles:`Profilleri Dahil Et`,backupSuccess:`Yedek başarıyla oluşturuldu`,restoreSuccess:`Yedek başarıyla geri yüklendi`,backupFailed:`Yedekleme başarısız`,restoreFailed:`Geri yükleme başarısız`,restoreNote:`Geri yükleme sırasında Sanal Yazıcı durdurulacak`,githubBackup:`Git Yedekleme`,enabled:`Etkin`,cloudLoginRequired:`Bambu Cloud girişi gerekli. GitHub yedeklemesini etkinleştirmek için Profiller → Bulut Profilleri altında giriş yapın.`,cloudLoginRequiredShort:`Bulut girişi gerekli`,githubDescription:`Yedekleme ve sürüm geçmişi için profillerinizi otomatik olarak özel bir GitHub deposuna senkronize et.`,repoIsPrivate:`Depo özel — yedeklemek için güvenli.`,repoIsPublicWarning:`Depo HERKESE AÇIK. Bambuddy yedekleri MQTT kimlik bilgilerini, Home Assistant belirteçlerini, Prometheus belirteçlerini, Bambu Cloud e-postanızı ve K-profilleri aracılığıyla yazıcı erişim kodlarını içerir. Sağlayıcınızın ayarlarında depoyu özel hale getirene kadar kaydetme engellenir.`,repoVisibilityUnknown:`Depo görünürlüğü belirlenemedi. Bambuddy, özel olarak onaylanmamış hiçbir şeye yedekleme yapmayı reddeder; kaydetme engellenecek.`,repositoryUrl:`Depo URL'si`,repoUrlPlaceholderGitHub:`https://github.com/username/repo-name`,repoUrlPlaceholderGitea:`https://gitea.example.com/username/repo-name`,repoUrlPlaceholderForgejo:`https://forgejo.example.com/username/repo-name`,repoUrlPlaceholderGitLab:`https://gitlab.com/username/repo-name`,allowInsecureHttp:`Güvensiz HTTP'ye izin ver`,allowInsecureHttpHint:`TLS olmadan özel ağlarda kendi barındırılan örnekler için etkinleştir`,personalAccessToken:`Kişisel Erişim Belirteci`,tokenSaved:`(kaydedildi)`,enterNewToken:`Güncellemek için yeni belirteç girin`,tokenHint:`Contents okuma/yazma izni olan ayrıntılı belirteç`,branch:`Dal`,provider:`Git Sağlayıcısı`,providerGitHub:`GitHub`,providerGitLab:`GitLab`,providerGitea:`Gitea`,providerForgejo:`Forgejo`,manualOnly:`Yalnızca manuel`,hourly:`Saatlik`,daily:`Günlük`,weekly:`Haftalık`,includeInBackup:`Yedeğe dahil et`,kProfiles:`K-Profilleri`,kProfilesDescription:`Bağlı yazıcılardan basınç ilerleme kalibrasyonu`,noPrintersConnected:`Bağlı yazıcı yok`,printersConnected:`{{connected}}/{{total}} bağlı`,cloudProfiles:`Bulut Profilleri`,cloudProfilesDescription:`Bambu Cloud'dan filament, yazıcı ve işlem ön ayarları`,appSettings:`Uygulama Ayarları`,appSettingsDescription:`Bambuddy yapılandırması (tam veritabanı)`,spoolInventory:`Makara Envanteri`,spoolInventoryDescription:`Filament makaraları, kullanım geçmişi ve maliyet takibi`,printArchives:`Baskı Arşivleri`,printArchivesDescription:`Baskı geçmişi meta verileri (gcode/3MF dosyaları yok)`,lastBackupAt:`Son yedek:`,noBackupsYet:`Henüz yedek yok`,next:`Sonraki:`,startingBackup:`Yedekleme başlatılıyor...`,test:`Test`,enableBackup:`Yedeklemeyi Etkinleştir`,testConnection:`Bağlantıyı Test Et`,enterRepoUrl:`Depo URL'sini girin`,enterRepoAndToken:`Depo URL'si ve erişim belirteci girin`,repoRequired:`Depo URL'si gerekli`,tokenRequired:`Erişim belirteci gerekli`,githubBackupEnabled:`GitHub yedeklemesi etkinleştirildi`,tokenUpdated:`Belirteç güncellendi`,settingsSaved:`Ayarlar kaydedildi`,failedToSave:`Kaydedilemedi: {{message}}`,backupCompleteFiles:`Yedekleme tamamlandı - {{count}} dosya güncellendi`,backupSkippedNoChanges:`Yedekleme atlandı - değişiklik yok`,backupFailed2:`Yedekleme başarısız: {{message}}`,clearedLogs:`{{count}} günlük temizlendi`,failedToClearLogs:`Günlükler temizlenemedi: {{message}}`,history:`Geçmiş`,clear:`Temizle`,date:`Tarih`,status:`Durum`,commit:`Commit`,localBackup:`Yerel Yedekleme`,localBackupDescription:`Veritabanı, arşivler, yüklemeler ve tüm dosyalar dahil Bambuddy verilerinizin tam bir yedeğini oluşturun.`,downloadBackupLabel:`Yedeği İndir`,completeBackupZip:`Tam yedek: veritabanı + tüm dosyalar (ZIP)`,download:`İndir`,preparingBackup:`Yedek hazırlanıyor...`,creatingArchive:`Yedek arşivi oluşturuluyor... Büyük arşivler için bu biraz zaman alabilir.`,downloadingFile:`Yedek dosyası indiriliyor...`,backupDownloaded:`Yedek başarıyla indirildi`,failedToCreateBackup:`Yedek oluşturulamadı: {{message}}`,restore:`Geri Yükle`,restoreReplacesAll:`Geri yükleme tüm verilerin yerine geçer.`,restoreReplacesAllDetail:`Mevcut veritabanınız ve dosyalarınız tamamen değiştirilecek. Geri yüklemeden sonra yeniden başlatma gerekli.`,restoreConfirmTitle:`Yedeği Geri Yükle`,restoreConfirmMessage:`"{{filename}}" dosyasından geri yüklemek istediğinizden emin misiniz? Bu, mevcut veritabanınızı ve tüm dosyaları tamamen değiştirecek. Geri yüklemeden sonra uygulamanın yeniden başlatılması gerekecek.`,restoreConfirmButton:`Yedeği Geri Yükle`,uploadingFile:`Yedek dosyası yükleniyor...`,backupRestoredRestart:`Yedek geri yüklendi. Lütfen Bambuddy'yi yeniden başlatın.`,failedToRestore:`Yedek geri yüklenemedi. Lütfen dosya formatını kontrol edin.`,reloadNow:`Şimdi Yeniden Yükle`,creatingBackup:`Yedek Oluşturuluyor`,restoringBackup:`Yedek Geri Yükleniyor`,preparing:`Hazırlanıyor...`,processing:`İşleniyor...`,doNotClosePage:`Lütfen bu sayfayı kapatmayın veya başka bir yere gitmeyin. Büyük yedekler için bu işlem birkaç dakika sürebilir.`,restoring:`Geri yükleniyor...`,restoreComplete:`Geri Yükleme Tamamlandı`,restoreFailed2:`Geri Yükleme Başarısız`,importSettings:`Ayarları bir yedek dosyasından içe aktar`,pleaseWaitRestoring:`Verileriniz geri yüklenirken lütfen bekleyin`,selectBackupFile:`Yedek dosyası seçmek için tıklayın (.json veya .zip)`,duplicateHandling:`Yinelenen yönetiminin nasıl çalıştığı:`,matchPrinters:`Yazıcılar`,matchPrintersBy:`seri numarasına göre eşleşti`,matchSmartPlugs:`Akıllı Prizler`,matchSmartPlugsBy:`IP adresine göre eşleşti`,matchNotificationProviders:`Bildirim Sağlayıcıları`,matchNotificationProvidersBy:`ada göre eşleşti`,matchFilaments:`Filamentler`,matchFilamentsBy:`ad + tür + markaya göre eşleşti`,matchArchives:`Arşivler`,matchArchivesBy:`içerik hash'ine göre eşleşti (her zaman atlanır)`,matchPendingUploads:`Bekleyen Yüklemeler`,matchPendingUploadsBy:`dosya adına göre eşleşti`,matchSettingsTemplates:`Ayarlar ve Şablonlar`,matchSettingsTemplatesBy:`her zaman üzerine yazılır`,replaceExisting:`Mevcut veriyi değiştir`,keepExisting:`Mevcut veriyi koru`,overwriteDescription:`Zaten mevcut olan öğeleri yedek verisiyle üzerine yaz`,keepDescription:`Yalnızca zaten mevcut olmayan öğeleri geri yükle`,overwriteCaution:`Dikkat:`,overwriteWarning:`Üzerine yazma, mevcut yapılandırmalarınızı yedekten gelen verilerle değiştirecek. Güvenlik için yazıcı erişim kodları asla üzerine yazılmaz.`,cancel:`İptal`,processingBackup:`Yedek dosyası işleniyor...`,itemsRestored:`Geri Yüklenen Öğeler`,itemsSkipped:`Atlanan Öğeler`,restored:`Geri yüklendi`,skippedAlreadyExist:`Atlandı (zaten mevcut)`,filesCategory:`Dosyalar (3MF, küçük resimler, vb.)`,andMore:`...ve {{count}} daha`,newApiKeysGenerated:`Yeni API Anahtarları Oluşturuldu`,keysShownOnce:`Bu anahtarlar yalnızca bir kez gösterilir. Şimdi kopyalayın!`,copy:`Kopyala`,noDataFound:`Yedek dosyasında geri yüklenecek veri bulunamadı.`,close:`Kapat`,scheduledBackup:`Zamanlanmış Yedekler`,scheduledBackupDescription:`Zamanlamaya göre otomatik olarak yedek anlık görüntüleri oluşturun. Çıktı dizini bir NAS veya harici depolama alanına bağlanabilir.`,frequency:`Sıklık`,backupTime:`Saat`,retention:`Saklama`,retentionDescription:`Saklanacak yedek sayısı`,outputPath:`Çıktı Yolu`,outputPathPlaceholder:`Varsayılan: {{path}}`,outputPathDescription:`Varsayılan konum için boş bırakın`,runNow:`Şimdi Çalıştır`,backupFiles:`Yedek Dosyaları`,noScheduledBackups:`Henüz yedek yok`,deleteBackup:`Sil`,deleteBackupConfirm:`Bu yedek dosyası silinsin mi?`,backupRunning:`Yedekleme devam ediyor...`,scheduledBackupComplete:`Yedekleme başarıyla tamamlandı`,scheduledBackupFailed:`Yedekleme başarısız`,nextBackup:`Sonraki yedek`,backupSize:`Boyut`,localTimeHint:`Yerel saat ({{tz}})`,defaultPathLabel:`Varsayılan:`,pathCheck:{title:`Bambuddy bu dizine yazamıyor`,howToFix:`Nasıl düzeltilir:`,sandboxed:`Bambuddy servisi {{path}} dizinine yazamıyor. systemd birimi ProtectSystem=strict ile çalıştığı için kurulum, veri ve günlük dizinleri dışındaki her dizin servis açısından salt okunurdur - kendi kabuğunuzdan yazabildiğiniz bir dizin olsa bile.`,read_only:`{{path}} salt okunur bir dosya sisteminde.`,permission_denied:`Bambuddy'nin {{path}} dizinine yazma izni yok. Dizinin sahibini ve izinlerini kontrol edin.`,no_space:`{{path}} dizinini barındıran dosya sistemi dolu.`,not_a_directory:`{{path}} var ancak bir dizin değil.`,missing:`{{path}} yok ve oluşturulamadı.`,error:`Bambuddy {{path}} dizinine yazamıyor.`,ephemeralTitle:`Bu yedekler kapsayıcı yeniden oluşturulduğunda kaybolur`,container_ephemeral:`{{path}} ana makinede değil, Bambuddy kapsayıcısının içinde. Oraya yazılan yedekler kapsayıcı yeniden oluşturulduğunda kaybolur. Dizini ana makineden bağlayın:`},categories:{settings:`Ayarlar`,notification_providers:`Bildirim Sağlayıcıları`,notification_templates:`Bildirim Şablonları`,smart_plugs:`Akıllı Prizler`,printers:`Yazıcılar`,filaments:`Filamentler`,maintenance_types:`Bakım Türleri`,archives:`Arşivler`,projects:`Projeler`,pending_uploads:`Bekleyen Yüklemeler`,external_links:`Harici Bağlantılar`,api_keys:`API Anahtarları`}},tags:{title:`Etiketler`,addTag:`Etiket Ekle`,editTag:`Etiketi Düzenle`,deleteTag:`Etiketi Sil`,tagName:`Etiket Adı`,tagColor:`Etiket Rengi`,noTags:`Etiket yok`,deleteConfirm:`Bu etiketi silmek istediğinizden emin misiniz?`,manageTags:`Etiketleri Yönet`},uploadModal:{title:`3MF Dosyalarını Yükle`,dragDrop:`.3mf dosyalarını buraya sürükleyip bırakın`,or:`veya`,browseFiles:`Dosyalara Göz At`,extractionInfo:`Yazıcı modeli, 3MF dosya meta verilerinden otomatik olarak çıkarılacak.`,uploaded:`yüklendi`,failed:`başarısız`,uploading:`Yükleniyor...`,upload:`Yükle`,uploadFailed:`Yükleme başarısız`},editArchive:{title:`Arşivi Düzenle`,name:`Ad`,namePlaceholder:`Baskı adı`,printer:`Yazıcı`,noPrinter:`Yazıcı yok`,project:`Proje`,noProject:`Proje yok`,itemsPrinted:`Yazdırılan Öğeler`,itemsPrintedHelp:`Bu baskı işinde üretilen öğe sayısı`,notes:`Notlar`,notesPlaceholder:`Bu baskı hakkında notlar ekleyin...`,externalLink:`Harici Bağlantı`,externalLinkPlaceholder:`https://printables.com/model/...`,externalLinkHelp:`Printables, Thingiverse veya başka bir kaynağa bağlantı`,tags:`Etiketler`,tagsPlaceholder:`Etiketler ekle...`,addMoreTags:`Daha fazla etiket ekle...`,matchingTags:`"{{query}}" ile eşleşen`,existingTags:`Mevcut etiketler`,clickToAdd:`(eklemek için tıklayın)`,status:`Durum`,failureReason:`Başarısızlık Nedeni`,selectReason:`Neden seç...`,photos:`Yazdırılan Sonuç Fotoğrafları`,photosHelp:`Yazdırılan sonuçunuzun fotoğraflarını eklemek için + tıklayın`,printResult:`Baskı sonucu`,saving:`Kaydediliyor...`,failureReasons:{adhesionFailure:`Yapışma başarısız`,spaghettiDetached:`Spagetti / Ayrılmış`,layerShift:`Katman kayması`,cloggedNozzle:`Tıkalı nozul`,filamentRunout:`Filament bitti`,warping:`Bükülme`,stringing:`İplik oluşumu`,underExtrusion:`Az ekstrüzyon`,powerFailure:`Güç kesintisi`,userCancelled:`Kullanıcı iptal etti`,other:`Diğer`},statuses:{completed:`Tamamlandı`,failed:`Başarısız`,aborted:`İptal edildi`,printing:`Yazdırılıyor`}},kProfiles:{title:`K-Profilleri`,noPrintersConfigured:`Yapılandırılmış Yazıcı Yok`,addPrinterInSettings:`K-profillerini yönetmek için Ayarlarda bir yazıcı ekleyin`,noActivePrinters:`Aktif Yazıcı Yok`,enablePrinterConnection:`K-profillerini görüntülemek için bir yazıcı bağlantısını etkinleştirin`,loadingProfiles:`K-Profilleri yükleniyor...`,printerOffline:`Yazıcı Çevrimdışı`,printerOfflineDesc:`Seçilen yazıcı bağlı değil. K-profillerini görüntülemek için açın.`,noMatchingProfiles:`Eşleşen Profil Yok`,noMatchingProfilesDesc:`Arama kriterlerinizle eşleşen profil yok`,noKProfiles:`K-Profili Yok`,noKProfilesDesc:`{{diameter}}mm nozul için basınç ilerleme profili bulunamadı`,createFirstProfile:`İlk Profili Oluştur`,printer:`Yazıcı`,nozzle:`Nozul`,refresh:`Yenile`,addProfile:`Profil Ekle`,export:`Dışa Aktar`,import:`İçe Aktar`,select:`Seç`,selectAll:`Tümünü Seç`,delete:`Sil`,searchPlaceholder:`Ad veya filamente göre ara...`,allExtruders:`Tüm Ekstrüderler`,leftOnly:`Yalnızca Sol`,rightOnly:`Yalnızca Sağ`,allFlow:`Tüm Akış`,hfOnly:`Yalnızca HF`,sOnly:`Yalnızca S`,sortName:`Sırala: Ad`,sortKValue:`Sırala: K-Değeri`,sortFilament:`Sırala: Filament`,leftExtruder:`Sol Ekstrüder`,rightExtruder:`Sağ Ekstrüder`,modal:{addTitle:`K-Profili Ekle`,editTitle:`K-Profilini Düzenle`,profileName:`Profil Adı`,profileNamePlaceholder:`PLA Profilim`,kValue:`K-Değeri`,kValuePlaceholder:`0.020`,kValueHelp:`Tipik aralık: PLA için 0.01 - 0.06, PETG için 0.02 - 0.10`,filament:`Filament`,selectFilament:`Filament seç...`,noFilamentsHelp:`Filament bulunamadı. Önce Bambu Studio'da bir K-profili oluşturun.`,flowType:`Akış Türü`,highFlow:`Yüksek Akış`,standard:`Standart`,nozzleSize:`Nozul Boyutu`,extruder:`Ekstrüder`,extruders:`Ekstrüderler`,left:`Sol`,right:`Sağ`,notes:`Notlar (yerel olarak saklanır)`,notesPlaceholder:`Bu profil hakkında notlar ekleyin...`,notesHelp:`Notlar yazıcıda değil, Bambuddy'de kaydedilir`,syncing:`Yazıcıyla senkronize ediliyor...`,savingExtruder:`Ekstrüdere kaydediliyor {{current}}/{{total}}...`,pleaseWait:`Lütfen bekleyin`},deleteConfirm:{title:`Profili Sil`,cannotUndo:`Bu geri alınamaz`,message:`"{{name}}" yazıcıdan silmek istediğinizden emin misiniz?`},bulkDelete:{title:`Profilleri Sil`,cannotUndo:`Bu geri alınamaz`,message:`Yazıcıdan seçili {{count}} profili silmek istediğinizden emin misiniz?`},toast:{profileSaved:`K-profili kaydedildi`,profilesSaved:`{{count}} ekstrüdere K-profili kaydedildi`,selectAtLeastOneExtruder:`Lütfen en az bir ekstrüder seçin`,profileDeleted:`K-profili silindi`,profilesDeleted:`{{count}} profil silindi`,exportedProfiles:`{{count}} profil dışa aktarıldı`,importedProfiles:`{{total}} profilden {{count}} tanesi içe aktarıldı`,noProfilesToExport:`Dışa aktarılacak profil yok`,invalidFileFormat:`Geçersiz dosya formatı`,failedToParseImport:`İçe aktarma dosyası ayrıştırılamadı`,failedToSaveBatch:`K-profilleri kaydedilemedi`,noteSaved:`Not kaydedildi`,failedToSaveNote:`Not kaydedilemedi`},permission:{noRead:`Profilleri yenileme izniniz yok`,noCreate:`Profil ekleme izniniz yok`,noUpdate:`K-profillerini güncelleme izniniz yok`,noDelete:`K-profillerini silme izniniz yok`,noExport:`Profilleri dışa aktarma izniniz yok`,noImport:`Profilleri içe aktarma izniniz yok`}},virtualPrinter:{title:`Sanal Yazıcı`,running:`Çalışıyor`,stopped:`Durduruldu`,description:{default:`Bambu Studio ve OrcaSlicer'da görünen bir sanal yazıcı etkinleştirin. Bu yazıcıya gönderilen dosyalar yazdırılmadan doğrudan arşivlenecek.`,proxy:`Dilimleyici trafiğini gerçek bir yazıcıya ileten bir proxy etkinleştirin, böylece herhangi bir ağ üzerinden uzaktan baskı yapabilirsiniz.`},enable:{title:`Sanal Yazıcıyı Etkinleştir`,visibleInSlicer:`Dilimleyici keşfinde "Bambuddy" olarak görünür`,proxyingTo:`{{name}} cihazına proxy yapılıyor`,notActive:`Aktif değil`},model:{title:`Yazıcı Modeli`,description:`Öykünülecek yazıcı modelini seçin.`,restartWarning:`Modeli değiştirmek sanal yazıcıyı yeniden başlatacak`},accessCode:{title:`Erişim Kodu`,isSet:`Erişim kodu ayarlandı`,notSet:`Erişim kodu ayarlanmadı - etkinleştirmek için gerekli`,placeholder:`8 karakterli kodu girin`,placeholderChange:`Değiştirmek için yeni kodu girin`,hint:`Tam olarak 8 karakter olmalı. Dilimleyiciler tarafından kimlik doğrulama için kullanılır.`,charCount:`({{count}}/8)`,inheritedFromTarget:`Hedef yazıcıdan devralındı`,derivedFromTargetHint:`Hedef yazıcının erişim kodunu kullanır. Köprü, dilimleyicinin kimlik doğrulamasını gerçek yazıcıya iletir, bu nedenle kodlar eşleşmelidir — değiştirmek için yazıcının ayarlarında erişim kodunu düzenleyin.`,reveal:`Erişim kodunu göster`,hide:`Erişim kodunu gizle`},targetPrinter:{title:`Hedef Yazıcı`,configured:`Proxy hedefi yapılandırıldı`,notConfigured:`Hedef yazıcı seçilmedi - proxy modu için gerekli`,placeholder:`Bir yazıcı seçin...`,hint:`Dilimleyici trafiğine proxy yapmak için yazıcıyı seçin. Yazıcı LAN modunda olmalıdır.`,noPrinters:`Yapılandırılmış yazıcı yok. Proxy modunu kullanmak için önce bir yazıcı ekleyin.`},remoteInterface:{title:`Ağ Arayüzü Geçersiz Kılma`,configured:`Arayüz geçersiz kılma aktif`,optional:`İsteğe bağlı - otomatik algılanan IP yanlışsa kullanın (örn. birden fazla NIC, Docker, VPN)`,placeholder:`Otomatik algıla (varsayılan)...`,hint:`SSDP üzerinden tanıtılan ve TLS sertifikasında kullanılan IP adresini geçersiz kıl. Bambuddy birden fazla ağ arayüzüne sahip olduğunda kullanışlıdır.`},mode:{title:`Mod`,archive:`Arşiv`,archiveDesc:`Dosyaları hemen arşivle`,review:`İnceleme`,reviewDesc:`Arşivlemeden önce incele`,queue:`Kuyruk`,queueDesc:`Arşivle ve kuyruğa ekle`,proxy:`Proxy`,proxyDesc:`Gerçek yazıcıya ilet`},autoDispatch:{title:`Otomatik sevk`,description:`Kuyruğa eklendiğinde baskıları otomatik olarak başlat. Kapalıyken, baskılar manuel sevki bekler.`},queueForceColorMatch:{title:`Renk eşleşmesini zorla`,description:`Tam olarak doğru filament türü ve rengi yüklü olmayan bir yazıcıya sevk etmeyi reddet. Varsayılan olarak kapalı — bu olmadan kuyruk yalnızca model eşleşmesi kullanır ve yanlış renk yüklü bir yazıcı seçebilir.`},gcodeInjection:{title:`G-code enjeksiyonu`,description:`Ayarlar'da model bazında yapılandırılan G-code parçacıklarını bu VP'nin işlerine uygular. Varsayılan olarak kapalı.`},tailscaleDisabled:{title:`Tailscale entegrasyonu`,description:`Bu VP'yi Tailscale üzerinden açıkta olarak işaretlemek için etkinleştirin. Dilimleyiciye hangi IP'yi yapıştıracağınızı bilmeniz için ana bilgisayarın Tailscale adresini gösterir. CA içe aktarma adımı değişmedi — bu anahtarın sertifikalar üzerinde etkisi yoktur.`},setupRequired:{title:`Kurulum Gerekli`,description:`Sanal yazıcı özelliği çalışmadan önce ek sistem yapılandırması gerektirir. Bu, port yönlendirme, güvenlik duvarı kuralları ve platforma özgü ayarları içerir.`,readGuide:`Etkinleştirmeden önce kurulum kılavuzunu okuyun`},archiveNameSource:{title:`Arşiv ad kaynağı`,description:`Dosyalar sanal yazıcı aracılığıyla geldiğinde yeni arşivlerin nasıl adlandırılacağını seçin. "Meta veri" 3MF'den dilimleyici-gömülü başlığı kullanır (varsayılan). "Dosya adı" Bambu Studio'nun FTP üzerinden gönderdiği dosya adını kullanır. Not: Bambu Studio, 3MF'de bir Başlık alanı varsa "yazıcıya gönder" iletişim kutusunda yazdığınız adı bu alanla geçersiz kılar, bu nedenle her iki mod da genellikle aynı dizeyi üretir.`,metadata:`Meta veri`,filename:`Dosya adı`},caCert:{title:`Dilimleyici sertifikası`,description:`Sanal yazıcılar Bambuddy CA tarafından imzalanmış bir TLS sertifikası kullanır. Bağlantıyı kabul etmesi için bu CA sertifikasını dilimleyicinizin güven deposuna bir kez içe aktarın — komut satırından kopyalamaya gerek yok.`,copy:`Kopyala`,copied:`Kopyalandı`,download:`İndir`,fingerprint:`SHA-256`},howItWorks:{title:`Nasıl çalışır`,step1:`Aynı LAN'da, sanal yazıcılar dilimleyicinizde (Bambu Studio / OrcaSlicer) keşif yoluyla otomatik olarak görünür. Diğer ağlardan, IP adresi ve erişim koduyla manuel olarak ekleyin.`,step2:`3MF dosyalarını Bambuddy'ye yüklemek için Arşiv, İnceleme ve Kuyruk modlarında dilimleyicinizdeki "Gönder" düğmesini kullanın. Dilimleyici "Baskı başarılı" gösterecek — dosya saklanır, yazdırılmaz.`,step3:`Proxy modunda, sanal yazıcı tüm trafiği gerçek bir yazıcıya iletir — baskılar doğrudan bağlıymış gibi hemen başlar.`},status:{title:`Durum Ayrıntıları`,printerName:`Yazıcı Adı`,model:`Model`,serialNumber:`Seri Numarası`,mode:`Mod`,pendingFiles:`Bekleyen Dosyalar`,targetPrinter:`Hedef Yazıcı`,ftpPort:`FTP Portu`,mqttPort:`MQTT Portu`,ftpConnections:`FTP Bağlantıları`,mqttConnections:`MQTT Bağlantıları`},toast:{updated:`Sanal yazıcı ayarları güncellendi`,failedToUpdate:`Ayarlar güncellenemedi`,copyFailed:`Kopyalama başarısız — metni manuel olarak seçmeyi deneyin`,accessCodeRequired:`Lütfen önce bir erişim kodu ayarlayın`,targetPrinterRequired:`Lütfen önce bir hedef yazıcı seçin`,bindIpRequired:`Lütfen önce bir bind IP'si ayarlayın`,accessCodeEmpty:`Erişim kodu boş olamaz`,accessCodeLength:`Erişim kodu tam olarak 8 karakter olmalı`,targetCodeChangedRebind:`Erişim kodu artık yeni hedef yazıcıyla eşleşiyor. Yeni kodu almak için bu cihazı dilimleyicinizde yeniden ekleyin.`,created:`Sanal yazıcı oluşturuldu`,failedToCreate:`Sanal yazıcı oluşturulamadı`,deleted:`Sanal yazıcı silindi`,failedToDelete:`Sanal yazıcı silinemedi`},list:{title:`Sanal Yazıcılar`,add:`Ekle`,addFirst:`Sanal Yazıcı Ekle`,empty:`Yapılandırılmış sanal yazıcı yok. Başlamak için bir tane ekleyin.`},bindIp:{title:`Bind Arayüzü`,placeholder:`Arayüz seç...`,hint:`Bu sanal yazıcının bağlanacağı ağ arayüzü. Yazıcı başına benzersiz olmalıdır.`},proxy:{accessCodeHint:`Proxy modunda, dilimleyicide hedef yazıcınızın erişim kodunu kullanın. Bağlantı şeffaf olarak gerçek yazıcıya iletilir.`},addDialog:{title:`Sanal Yazıcı Ekle`,name:`Ad`,hint:`Oluşturduktan sonra erişim kodunu, hedef yazıcıyı ve diğer ayarları yapılandırabilirsiniz.`,create:`Oluştur`},deleteConfirm:{title:`Sanal Yazıcıyı Sil`,message:`"{{name}}" silmek istediğinizden emin misiniz? Bu, bu yazıcı için tüm servisleri durduracak.`}},modelViewer:{openInSlicer:`Dilimleyicide Aç`,tabs:{model:`3B Model`,gcode:`G-kod Önizleme`},notAvailable:`mevcut değil`,notSliced:`dilimlenmemiş`,plates:`Plakalar`,allPlates:`Tüm Plakalar`,plateNumber:`Plaka {{number}}`,plateCount:`{{count}} plaka`,plateCount_other:`{{count}} plaka`,objectCount:`{{count}} nesne`,objectCount_other:`{{count}} nesne`,filamentCount:`{{count}} filament`,filamentCount_other:`{{count}} filament`,eta:`ETA {{minutes}} dk`,noPreview:`Bu dosya için önizleme yok`,pagination:{pageOf:`{{total}} sayfadan {{current}} tanesi`,prev:`Önceki`,next:`Sonraki`},errors:{failedToLoad:`Dosya yüklenemedi`,noMeshes:`3MF dosyasında ağ bulunamadı`,unsupportedFormat:`Desteklenmeyen dosya formatı`}},maintenanceDescriptions:{lubricateCarbonRods:`Düzgün hareket için karbon çubuklara yağ uygula`,lubricateRails:`Düzgün hareket için lineer raylara yağ uygula`,cleanNozzle:`Tıkanmaları önlemek için hotend ve nozulu temizle`,checkBelts:`Doğru baskılar için kayış gerginliğini kontrol et`,cleanBuildPlate:`Daha iyi yapışma için baskı plakasını temizle`,checkExtruder:`Aşınma için ekstrüder dişlilerini inceleyin`,checkCooling:`Soğutma fanlarının düzgün çalıştığından emin ol`,generalInspection:`Genel yazıcı denetimi`,cleanCarbonRods:`Sürtünmeyi azaltmak için karbon çubukları temizle`,lubricateSteelRods:`Düzgün hareket için çelik çubuklara yağ uygula`,cleanSteelRods:`Sürtünmeyi azaltmak için çelik çubukları temizle`,cleanLinearRails:`Toz ve kalıntıları temizlemek için lineer rayları sil`,checkPtfeTube:`Aşınma veya hasar için PTFE tüpünü incele`,replaceHepaFilter:`Hava kalitesi için HEPA filtresini değiştir`,replaceCarbonFilter:`Aktif karbon filtresini değiştir`,lubricateLeftNozzleRail:`Sol nozul rayını yağla (H2 serisi)`},smartPlugs:{offline:`Çevrimdışı`,admin:`Yönetici`,openPlugAdminPage:`Priz yönetici sayfasını aç`,deleteSmartPlug:`Akıllı Prizi Sil`,turnOnSmartPlug:`Akıllı Prizi Aç`,turnOffSmartPlug:`Akıllı Prizi Kapat`,turnOn:`Aç`,turnOff:`Kapat`,addSmartPlug:{scanningNetwork:`Ağ taranıyor...`,chooseEntity:`Bir varlık seçin...`,connectionFailed:`Bağlantı başarısız`,searchEntities:`Varlıklarda ara...`,searchPowerSensors:`Güç sensörlerinde ara...`,searchEnergySensors:`Enerji sensörlerinde ara...`,placeholders:{plugName:`Oturma Odası Prizi`,mqttStateOnValue:`ON, true, 1`,mqttSameAsPower:`Güç konusuyla aynı veya farklı`}},linkedTo:`Bağlı:`,monitorOnly:`Yalnızca İzle`,alerts:`Uyarılar`,scheduleOn:`{{time}} Açık`,scheduleOff:`{{time}} Kapalı`,on:`Açık`,off:`Kapalı`,power:`Güç`,kwhToday:`Bugün kWh`,settings:`Ayarlar`,automationSettings:`Otomasyon Ayarları`,showInSwitchbar:`Anahtar Çubuğunda Göster`,quickAccessSidebar:`Kenar çubuğundan hızlı erişim`,enabled:`Etkin`,enableAutomation:`Bu priz için otomasyonu etkinleştir`,autoOn:`Otomatik Aç`,autoOnDescription:`Baskı başladığında aç`,autoOff:`Otomatik Kapat`,autoOffDescription:`Baskı tamamlandığında kapat (tek seferlik)`,autoOffPersistent:`Etkin Tut`,autoOffPersistentDescription:`Tek seferlik yerine baskılar arasında etkin kal`,autoOffAfterDrying:`Kurutmadan Sonra Otomatik Kapat`,autoOffAfterDryingDescription:`AMS kurutması tamamlandığında kapat`,delayAfterDryingMinutes:`Kurutma gecikmesi (dakika)`,turnOffDelayMode:`Kapatma Gecikme Modu`,time:`Süre`,temp:`Sıcaklık`,delayMinutes:`Gecikme (dakika)`,tempThreshold:`Sıcaklık eşiği (°C)`,tempThresholdDescription:`Nozul bu sıcaklığın altına soğuduğunda kapanır`,edit:`Düzenle`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz? Bu geri alınamaz.`,turnOnConfirm:`"{{name}}" açmak istediğinizden emin misiniz?`,turnOffConfirm:`"{{name}}" kapatmak istediğinizden emin misiniz? Bu, bağlı cihazın gücünü kesecek.`,failedToTurn:`"{{name}}" {{action}} başarısız`,unknown:`Bilinmiyor`,addTitle:`Akıllı Priz Ekle`,editTitle:`Akıllı Prizi Düzenle`,stopScanning:`Taramayı Durdur`,discoverTasmota:`Tasmota Cihazlarını Keşfet`,foundDevices:`{{count}} cihaz bulundu - seçmek için tıklayın:`,noDevicesFound:`Ağınızda Tasmota cihazı bulunamadı`,haNotConfigured:`Home Assistant yapılandırılmamış. Şuradan ayarlayın:`,haSettingsPath:`Ayarlar → Ağ → Home Assistant`,selectEntity:`Varlık Seç *`,ipAddress:`IP Adresi *`,nameLabel:`Ad *`,username:`Kullanıcı Adı`,password:`Parola`,authHint:`Tasmota cihazınız kimlik doğrulama gerektirmiyorsa boş bırakın`,linkToPrinter:`Yazıcıya Bağla`,noPrinter:`Yazıcı yok (yalnızca manuel kontrol)`,linkingDescription:`Bağlama, baskılar başladığında/tamamlandığında otomatik açma/kapamayı etkinleştirir`,powerAlerts:`Güç Uyarıları`,alertAbove:`Üstündeyse uyar (W)`,alertBelow:`Altındaysa uyar (W)`,alertDescription:`Güç tüketimi bu eşikleri geçtiğinde bildirim alın. O yönü devre dışı bırakmak için boş bırakın.`,dailySchedule:`Günlük Zamanlama`,turnOnAt:`Şu saatte aç`,turnOffAt:`Şu saatte kapat`,scheduleDescription:`Prizi günlük olarak bu saatlerde otomatik aç/kapat. O eylemi atlamak için boş bırakın.`,showOnPrinterCard:`Yazıcı Kartında Göster`,displayOnPrinterCard:`Yazıcı kartında düğme göster`,connectedResult:`Bağlandı!`,deviceLabel:`Cihaz: {{name}} - `,stateLabel:`Durum: {{state}}`,test:`Test`,delete:`Sil`,save:`Kaydet`,add:`Ekle`,cancel:`İptal`,failedToStartScan:`Tarama başlatılamadı`,nameRequired:`Ad gerekli`,entityRequired:`Home Assistant prizleri için varlık gerekli`,mqttTopicRequired:`Güç, enerji veya durum izleme için en az bir MQTT konusu yapılandırılmalı`,loadingEntities:`Varlıklar yükleniyor...`,loading:`Yükleniyor...`,failedToLoadEntities:`Varlıklar yüklenemedi: {{error}}`,noEntitiesMatching:`"{{search}}" ile eşleşen varlık bulunamadı`,noEntitiesAvailable:`Kullanılabilir varlık yok`,searchingEntities:`Tüm varlıklar aranıyor ({{count}} bulundu)`,showingEntities:`switch, light, input_boolean gösteriliyor ({{count}} mevcut)`,energyMonitoringOptional:`Enerji İzleme (İsteğe Bağlı)`,energyMonitoringHint:`Güç/enerji verisi sağlayan sensörleri arayın ve seçin.`,powerSensorW:`Güç Sensörü (W)`,energyTodayKwh:`Bugünkü Enerji (kWh)`,totalEnergyKwh:`Toplam Enerji (kWh)`,noMatchingSensors:`Eşleşen sensör yok`,none:`Hiçbiri`,mqttNotConfigured:`MQTT brokerı yapılandırılmamış. Şurada broker adresini ayarlayın:`,mqttSettingsPath:`Ayarlar → Ağ → MQTT Yayınlama`,mqttNotConfiguredSuffix:`(yayınlamayı etkinleştirmenize gerek yok, yalnızca broker ayrıntılarını doldurun).`,mqttMonitorOnlyDescription:`MQTT prizleri MQTT aboneliği aracılığıyla güç/enerji verisi alır. Açma/kapama kontrolü kullanılamaz - MQTT brokerınızı veya ev otomasyon sisteminizi kullanın.`,powerMonitoring:`Güç İzleme`,energyMonitoring:`Enerji İzleme`,stateMonitoring:`Durum İzleme`,optional:`isteğe bağlı`,topic:`Konu`,jsonPath:`JSON Yolu`,multiplier:`Çarpan`,onValue:`ON Değeri`,mqttPowerHint:`JSON yolu JSON yükten değer çıkarır (örn., "power_l1"). Konu ham sayısal değerler yayınlıyorsa boş bırakın.
mW→W için 0.001, kW→W için 1000 çarpanı kullanın.`,mqttEnergyHint:`JSON yolu JSON yükten değer çıkarır. Ham değerler için boş bırakın.
Wh→kWh için 0.001, MWh→kWh için 1000 çarpanı kullanın.`,mqttStateHint:`JSON yolu JSON yükten değer çıkarır. Ham değerler için boş bırakın.
-ON değeri: "ON" anlamına gelen tam string. Otomatik algılama için boş bırakın (ON, true, 1).`,restControl:`Kontrol`,restOnUrl:`AÇ URL'si`,restOffUrl:`KAPAT URL'si`,restOnBody:`AÇ İstek Gövdesi`,restOffBody:`KAPAT İstek Gövdesi`,restMethod:`HTTP Yöntemi`,restHeaders:`Özel Başlıklar (JSON)`,restStatusUrl:`Durum URL'si`,restStatusPath:`Durum JSON Yolu`,restStatusOnValue:`ON Değeri`,restPowerUrl:`Güç URL'si`,restPowerPath:`Güç JSON Yolu`,restPowerMultiplier:`Güç Çarpanı`,restEnergyUrl:`Enerji URL'si`,restEnergyPath:`Enerji JSON yolu (bugün)`,restEnergyTotalPath:`Enerji JSON yolu (toplam sayaç)`,restEnergyTotalMultiplier:`Toplam sayaç çarpanı`,restEnergyTotalPathHint:`örn. aenergy.total`,restEnergyTotalHint:`Birçok priz — tüm Shelly'ler dahil — yalnızca hiç sıfırlanmayan bir toplam sayaç bildirir. Bu değer yukarıdaki alana değil, buraya girilmelidir: bugünün tüketimi olarak okunursa gece yarısı sıfırlanmaz, Dün ve Toplam da boş kalır. Bambuddy Bugün ve Dün değerlerini bundan hesaplar; bunun için bir iki günlük ölçüm gerekir. Shelly watt-saat bildirdiğinden çarpan olarak 0.001 kullanın.`,restEnergyMultiplier:`Enerji Çarpanı`,restUrlRequired:`REST prizleri için en az bir URL (ON veya OFF) gerekli`,restHeadersHint:`örn. {"Authorization": "Bearer your-token"}`,restBodyHint:`örn. ON, {"state": "on"}`,restStatusHint:`Mevcut durumu sorgulamak için URL`,restPathHint:`örn. state veya data.power.status`,restPowerUrlHint:`Güç verisi için ayrı URL (boşsa Durum URL'sini kullanır)`,restEnergyUrlHint:`Enerji verisi için ayrı URL (boşsa Durum URL'sini kullanır)`,restEnergyHint:`Her değer kendi URL'sini kullanabilir veya Durum URL'sine geri dönebilir. Birim dönüşümü için çarpanları kullanın (örn. Wh'yi kWh'ye dönüştürmek için 0.001).`,testConnection:`Bağlantıyı Test Et`,connectionSuccess:`Bağlantı başarılı`,noSwitchesInSwitchbar:`Anahtar çubuğunda anahtar yok`,enableSwitchbarHint:`Ayarlar > Akıllı Prizler'de "Anahtar Çubuğunda Göster"i etkinleştirin`},notifications:{providerTypes:{callmebot:`CallMeBot/WhatsApp`,ntfy:`ntfy`,pushover:`Pushover`,telegram:`Telegram`,email:`E-posta`,discord:`Discord`,webhook:`Webhook`,homeassistant:`Home Assistant`},providerDescriptions:{email:`SMTP e-posta bildirimleri`,telegram:`Telegram botu üzerinden bildirimler`,discord:`Webhook üzerinden Discord kanalına gönder`,ntfy:`Ücretsiz, kendi barındırılabilir push bildirimleri`,pushover:`Basit, güvenilir push bildirimleri`,callmebot:`CallMeBot üzerinden ücretsiz WhatsApp bildirimleri`,webhook:`Herhangi bir URL'ye genel HTTP POST`,homeassistant:`Home Assistant gösterge panelinde kalıcı bildirimler`},lastSuccess:`Son: {{date}}`,error:`Hata`,printer:`Yazıcı:`,allPrinters:`Tüm yazıcılar`,sendTestNotification:`Test Bildirimi Gönder`,eventSettings:`Olay Ayarları`,enabled:`Etkin`,sendFromProvider:`Bu sağlayıcıdan bildirim gönder`,printEvents:`Baskı Olayları`,printerStatus:`Yazıcı Durumu`,amsAlarms:`AMS Alarmları`,amsHtAlarms:`AMS-HT Alarmları`,printQueue:`Baskı Kuyruğu`,start:`Başlangıç`,plateCheck:`Plaka Kontrolü`,complete:`Tamamlandı`,failed:`Başarısız`,stopped:`Durduruldu`,progress:`İlerleme`,offline:`Çevrimdışı`,lowFilament:`Az Filament`,maintenance:`Bakım`,amsHumidity:`AMS Nemi`,amsTemp:`AMS Sıcaklığı`,amsHtHumidity:`AMS-HT Nemi`,amsHtTemp:`AMS-HT Sıcaklığı`,bedCooled:`Tabla Soğudu`,firstLayer:`İlk Katman`,quiet:`Sessiz`,digest:`Özet {{time}}`,printStarted:`Baskı Başladı`,plateNotEmpty:`Plaka Boş Değil`,plateNotEmptyDescription:`Baskıdan önce nesneler algılandı`,printCompleted:`Baskı Tamamlandı`,bedCooledLabel:`Tabla Soğudu`,bedCooledDescription:`Baskıdan sonra tabla eşiğin altına soğudu`,firstLayerCompleteLabel:`İlk Katman Tamamlandı`,firstLayerCompleteDescription:`İlk katman bittiğinde anlık görüntüyle bildir`,missingSpoolAssignmentLabel:`Eksik Makara Ataması`,missingSpoolAssignmentDescription:`Baskı başladığında ve gerekli tepsilerin atanmış makarası olmadığında bildir`,printFailed:`Baskı Başarısız`,printStopped:`Baskı Durduruldu`,progressMilestones:`İlerleme Kilometre Taşları`,progressMilestonesDescription:`%25, %50, %75'te bildir`,printerOffline:`Yazıcı Çevrimdışı`,printerError:`Yazıcı Hatası`,aiFailureDetection:`AI Hata Tespiti`,aiFailureDetectionDescription:`Obico AI olası bir baskı hatası tespit ettiğinde bildir`,lowFilamentLabel:`Az Filament`,maintenanceDue:`Bakım Zamanı`,maintenanceDueDescription:`Bakım gerektiğinde bildir`,amsHumidityHigh:`AMS Nemi Yüksek`,amsHumidityHighDescription:`Normal AMS nemi eşiği aşıyor`,amsTemperatureHigh:`AMS Sıcaklığı Yüksek`,amsTemperatureHighDescription:`Normal AMS sıcaklığı eşiği aşıyor`,amsHtHumidityHigh:`AMS-HT Nemi Yüksek`,amsHtHumidityHighDescription:`AMS-HT nemi eşiği aşıyor`,amsHtTemperatureHigh:`AMS-HT Sıcaklığı Yüksek`,amsHtTemperatureHighDescription:`AMS-HT sıcaklığı eşiği aşıyor`,inventoryAlerts:`Envanter Uyarıları`,stockReorderAlert:`Yeniden Sipariş Uyarısı`,stockReorderAlertDescription:`SKU yeniden sipariş noktasına ulaştı`,stockBreakAlert:`Stok Tükenme Uyarısı`,stockBreakAlertDescription:`Yenileme gelmeden stok tükenecek`,jobAdded:`İş Eklendi`,jobAddedDescription:`İş kuyruğa eklendi`,jobAssigned:`İş Atandı`,jobAssignedDescription:`Model tabanlı iş yazıcıya atandı`,jobStarted:`İş Başladı`,jobStartedDescription:`Kuyruk işi yazdırmaya başladı`,jobWaiting:`İş Bekliyor`,jobWaitingDescription:`İş filament veya yazıcı için bekliyor`,jobSkipped:`İş Atlandı`,jobSkippedDescription:`İş atlandı (önceki başarısız oldu)`,jobFailed:`İş Başarısız`,jobFailedDescription:`İş başlatılamadı`,queueComplete:`Kuyruk Tamamlandı`,queueCompleteDescription:`Tüm kuyruk işleri bitti`,quietHours:`Sessiz Saatler`,noNotificationsDuring:`Bu saatler arasında bildirim yok`,editProviderToChangeQuietHours:`Sessiz saatleri değiştirmek için sağlayıcıyı düzenleyin`,dailyDigest:`Günlük Özet`,batchNotifications:`Bildirimleri tek bir günlük özette topla`,sendAt:`{{time}}'de gönder`,editProviderToChangeDigestTime:`Özet saatini değiştirmek için sağlayıcıyı düzenleyin`,edit:`Düzenle`,deleteProvider:`Bildirim Sağlayıcısını Sil`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz? Bu geri alınamaz.`,delete:`Sil`,addTitle:`Bildirim Sağlayıcısı Ekle`,editTitle:`Bildirim Sağlayıcısını Düzenle`,nameLabel:`Ad *`,namePlaceholder:`Bildirimlerim`,providerTypeLabel:`Sağlayıcı Türü *`,configuration:`Yapılandırma`,testConfiguration:`Yapılandırmayı Test Et`,printerFilter:`Yazıcı Filtresi`,onlyFromPrinter:`Yalnızca bu yazıcının olayları için bildirim gönder`,quietHoursDnd:`Sessiz Saatler (Rahatsız Etme)`,quietStart:`Başlangıç`,quietEnd:`Bitiş`,dailyDigestLabel:`Günlük Özet`,sendDigestAt:`Özeti şu saatte gönder`,digestCollected:`Olaylar toplanacak ve bu saatte tek bir özet olarak gönderilecek`,notificationEvents:`Bildirim Olayları`,progressPercent:`(%25, %50, %75)`,bedCooledAfterPrint:`(baskı tamamlandıktan sonra)`,eventPriority:{sectionTitle:`ntfy Önceliği`,helpNtfy:`Her etkin olay için bir öncelik seçin. ntfy uyarıları kademelendirmek için bunları kullanır (ses, görünürlük, push davranışı). Burada ayarlanmamış seviyeler ntfy sunucu varsayılanını kullanır.`,min:`Min`,low:`Düşük`,default:`Varsayılan`,high:`Yüksek`,urgent:`Acil`},cancel:`İptal`,save:`Kaydet`,add:`Ekle`,nameRequired:`Ad gerekli`,fieldRequired:`{{field}} gerekli`,phoneNumber:`Telefon Numarası`,apiKey:`API Anahtarı`,serverUrl:`Sunucu URL`,topic:`Konu`,authToken:`Yetkilendirme Belirteci`,userKey:`Kullanıcı Anahtarı`,appToken:`Uygulama Belirteci`,priority:`Öncelik`,pushoverRetry:`Acil yeniden deneme (sn)`,pushoverExpire:`Acil sona erme (sn)`,botToken:`Bot Belirteci`,chatId:`Sohbet ID`,smtpServer:`SMTP Sunucusu`,smtpPort:`SMTP Portu`,security:`Güvenlik`,authentication:`Kimlik Doğrulama`,username:`Kullanıcı Adı`,password:`Parola`,fromEmail:`Gönderen E-posta`,toEmail:`Alıcı E-posta`,webhookUrl:`Webhook URL`,payloadFormat:`Yük Formatı`,authorization:`Yetkilendirme`,titleFieldName:`Başlık Alanı Adı`,messageFieldName:`Mesaj Alanı Adı`,editTemplate:`Şablonu Düzenle: {{name}}`,titleLabel:`Başlık`,bodyLabel:`Gövde`,titlePlaceholder:`Bildirim başlığı...`,bodyPlaceholder:`Bildirim gövdesi...`,availableVariables:`Kullanılabilir Değişkenler`,clickToInsert:`Gövdede imleç konumuna eklemek için tıklayın`,livePreview:`Canlı Önizleme`,hide:`Gizle`,show:`Göster`,loadingPreview:`Önizleme yükleniyor...`,enterTemplateContent:`Önizlemeyi görmek için şablon içeriğini girin`,titlePreview:`Başlık:`,bodyPreview:`Gövde:`,resetToDefault:`Varsayılana Sıfırla`,titleRequired:`Başlık gerekli`,bodyRequired:`Gövde gerekli`,notificationLog:`Bildirim Günlüğü`,showFailedOnly:`Yalnızca başarısız`,last24Hours:`Son 24 saat`,last7Days:`Son 7 gün`,last30Days:`Son 30 gün`,last90Days:`Son 90 gün`,justNow:`Az önce`,noFailedNotifications:`Başarısız bildirim yok`,noNotificationsLogged:`Kaydedilen bildirim yok`,unknownProvider:`Bilinmeyen Sağlayıcı`,logTitle:`Başlık`,logMessage:`Mesaj`,logError:`Hata`,logProvider:`Sağlayıcı: {{type}}`,logTime:`Saat: {{time}}`,refresh:`Yenile`,clearOld:`Eskileri Temizle`,statsSummary:`Son {{days}} gün:`,statsNotifications:`bildirim`,statsSent:`{{count}} gönderildi`,statsFailed:`{{count}} başarısız`,eventTypes:{print_start:`Baskı Başladı`,print_complete:`Baskı Tamamlandı`,print_failed:`Baskı Başarısız`,print_stopped:`Baskı Durduruldu`,print_progress:`İlerleme`,printer_offline:`Yazıcı Çevrimdışı`,printer_error:`Yazıcı Hatası`,filament_low:`Az Filament`,maintenance_due:`Bakım Zamanı`,test:`Test`},userEmail:{title:`Bildirimler`,emailNotifications:`E-posta Bildirimleri`,emailNotificationsDesc:`Kendi baskı işleriniz için e-posta bildirimleri alın. E-postalar Gelişmiş Kimlik Doğrulamada yapılandırılan sistem SMTP ayarları kullanılarak gönderilir.`,sendingTo:`Bildirimler şuraya gönderilecek`,noEmailWarning:`Hesabınızın e-posta adresi yok. Eklemek için bir yöneticiyle iletişime geçin.`,printJobNotifications:`Baskı İşi Bildirimleri`,printJobNotificationsDesc:`Gönderdiğiniz baskı işleri için hangi olayların e-posta bildirimlerini tetikleyeceğini seçin.`,printJobStarts:`Baskı İşi Başlar`,printJobStartsDesc:`Baskı işiniz başladığında bildirim alın.`,printJobFinishes:`Baskı İşi Biter`,printJobFinishesDesc:`Baskı işiniz başarıyla tamamlandığında bildirim alın.`,printErrors:`Baskı Hataları`,printErrorsDesc:`Baskı işiniz başarısız olduğunda veya bir hatayla karşılaştığında bildirim alın.`,printJobStops:`Baskı İşi Durur`,printJobStopsDesc:`Baskı işiniz iptal edildiğinde veya durdurulduğunda bildirim alın.`,saveSuccess:`Bildirim tercihleri kaydedildi.`,saveError:`Bildirim tercihleri kaydedilemedi.`}},richTextEditor:{bold:`Kalın`,italic:`İtalik`,underline:`Altı Çizili`,bulletList:`Madde İşaretli Liste`,numberedList:`Numaralı Liste`,alignLeft:`Sola Hizala`,alignCenter:`Ortaya Hizala`,alignRight:`Sağa Hizala`,addLink:`Bağlantı Ekle`,removeLink:`Bağlantıyı Kaldır`},externalLinks:{title:`Kenar çubuğu bağlantıları`,sidebarLayout:`Kenar çubuğu`,sidebarLayoutDescription:`Yerleşik sayfaları gösterin veya gizleyin, harici bağlantılar ekleyin ve kenar çubuğu gezinmesini yeniden sıralamak için öğeleri sürükleyin.`,systemPages:`Bambuddy sayfaları`,externalLinks:`Harici bağlantılar`,visibleInSidebar:`Kenar çubuğunda görünür`,hiddenFromSidebar:`Kenar çubuğunda gizli`,requiredInSidebar:`Kenar çubuğunda gerekli`,hidePage:`Sayfayı gizle`,showPage:`Sayfayı göster`,settingsCannotBeHidden:`Ayarlar gizlenemez`,noLinksConfigured:`Yapılandırılmış harici bağlantı yok`,deleteLink:`Bağlantıyı Sil`,removeCustomIcon:`Özel simgeyi kaldır`,openInNewTab:`Yeni sekmede aç`,placeholders:{linkName:`Bağlantım`}},keyboardShortcuts:{title:`Klavye Kısayolları`,navigation:`Navigasyon`,archivesSection:`Arşivler`,kProfilesSection:`K-Profilleri`,generalSection:`Genel`,shortcuts:{goToPrinters:`Yazıcılara Git`,goToArchives:`Arşivlere Git`,goToQueue:`Kuyruğa Git`,goToStats:`İstatistiklere Git`,goToProfiles:`Bulut Profillerine Git`,goToSettings:`Ayarlara Git`,focusSearch:`Aramaya odaklan`,openUploadModal:`Yükleme modalini aç`,clearSelection:`Seçimi temizle / odağı kaldır`,contextMenu:`Kartlarda bağlam menüsü`,refreshProfiles:`Profilleri yenile`,newProfile:`Yeni profil`,exitSelectionMode:`Seçim modundan çık`,showHelp:`Bu yardımı göster`},footer:`Kapatmak için Esc'ye basın veya dışarı tıklayın`},notificationLog:{title:`Bildirim Günlüğü`,events:{printStarted:`Baskı Başladı`,printComplete:`Baskı Tamamlandı`,printFailed:`Baskı Başarısız`,printStopped:`Baskı Durduruldu`,progress:`İlerleme`,printerOffline:`Yazıcı Çevrimdışı`,printerError:`Yazıcı Hatası`,lowFilament:`Az Filament`,maintenanceDue:`Bakım Zamanı`,test:`Test`},timeAgo:{justNow:`Az önce`,minutesAgo:`{{minutes}}dk önce`,hoursAgo:`{{hours}}sa önce`}},restoreBackup:{title:`Yedeği Geri Yükle`,restoring:`Geri yükleniyor...`,restoreComplete:`Geri Yükleme Tamamlandı`,restoreFailed:`Geri Yükleme Başarısız`,importSettings:`Ayarları bir yedek dosyasından içe aktar`,pleaseWait:`Verileriniz geri yüklenirken lütfen bekleyin`,clickToSelect:`Yedek dosyası seçmek için tıklayın (.json veya .zip)`,howDuplicateHandling:`Yinelenen yönetiminin nasıl çalıştığı:`,categories:{printers:`Yazıcılar`,smartPlugs:`Akıllı Prizler`,notificationProviders:`Bildirim Sağlayıcıları`,filaments:`Filamentler`,archives:`Arşivler`,pendingUploads:`Bekleyen Yüklemeler`,settingsTemplates:`Ayarlar ve Şablonlar`},matchingInfo:{printers:`seri numarasına göre eşleşti`,smartPlugs:`IP adresine göre eşleşti`,notificationProviders:`ada göre eşleşti`,filaments:`ad + tür + markaya göre eşleşti`,archives:`içerik hash'ine göre eşleşti`,pendingUploads:`dosya adına göre eşleşti`,settingsTemplates:`her zaman üzerine yazılır`},replaceExisting:`Mevcut veriyi değiştir`,keepExisting:`Mevcut veriyi koru`,replaceDescription:`Zaten mevcut olan öğeleri yedek verisiyle üzerine yaz`,keepDescription:`Yalnızca zaten mevcut olmayan öğeleri geri yükle`,caution:`Dikkat:`,cautionText:`Üzerine yazma, mevcut yapılandırmalarınızı yedek verisiyle değiştirecek. Güvenlik için yazıcı erişim kodları asla üzerine yazılmaz.`,itemsRestored:`Geri Yüklenen Öğeler`,itemsSkipped:`Atlanan Öğeler`,restored:`Geri yüklendi`,skipped:`Atlandı (zaten mevcut)`,filesLabel:`Dosyalar (3MF, küçük resimler, vb.)`,newApiKeysGenerated:`Yeni API Anahtarları Oluşturuldu`,newApiKeysWarning:`Bu anahtarlar yalnızca bir kez gösterilir. Şimdi kopyalayın!`,processingBackup:`Yedek dosyası işleniyor...`,noDataFound:`Yedek dosyasında geri yüklenecek veri bulunamadı.`,failedToRestore:`Yedek geri yüklenemedi. Lütfen dosya formatını kontrol edin.`},backupExport:{title:`Yedeği Dışa Aktar`,selectData:`Dahil edilecek veriyi seçin`,selectAll:`Tümünü Seç`,selectNone:`Hiçbirini Seçme`,categoryDescriptions:{settings:`Dil, tema, güncelleme tercihleri`,notifications:`ntfy, Pushover, Discord, vb.`,templates:`Özel mesaj şablonları`,smartPlugs:`Tasmota priz yapılandırmaları`,externalLinks:`Harici servislere kenar çubuğu bağlantıları`,printers:`Yazıcı bilgisi (erişim kodları hariç)`,plateDetection:`Boş plaka referans görüntüleri`,filaments:`Filament türleri ve maliyetleri`,maintenance:`Özel bakım programları`,archives:`Tüm baskı verileri + dosyalar (3MF, küçük resimler, fotoğraflar)`,projects:`Projeler, BOM öğeleri ve ekler`,pendingUploads:`İnceleme bekleyen sanal yazıcı yüklemeleri`,apiKeys:`Webhook API anahtarları (içe aktarımda yeni anahtarlar oluşturulur)`},requiresPrinters:`Yazıcıların seçili olması gerekir`,zipFileWarning:`ZIP dosyası oluşturulacak.`,zipFileDescription:`Tüm 3MF dosyalarını, küçük resimleri, zaman atlamalı videoları ve fotoğrafları içerir. Bu biraz zaman alabilir ve büyük bir dosya oluşturabilir.`,includeAccessCodes:`Erişim Kodlarını Dahil Et`,includeAccessCodesDescription:`Başka bir makineye aktarmak için`,includeAccessCodesWarning:`Erişim kodları düz metin olarak dahil edilecek. Bu yedek dosyasını güvende tutun!`,categoriesSelected:`{{selectedCount}} kategori seçildi`},pendingUploads:{placeholders:{notes:`Bu baskı hakkında notlar ekleyin...`},discardUpload:`Yüklemeyi At`,archiveAllUploads:`Tüm Yüklemeleri Arşivle`,discardAllUploads:`Tüm Yüklemeleri At`,archive:`Arşivle`,timeAgo:{justNow:`Az önce`,minutesAgo:`{{minutes}}dk önce`,hoursAgo:`{{hours}}sa önce`,daysAgo:`{{days}}g önce`}},apiBrowser:{placeholders:{requestBody:`JSON istek gövdesi...`,searchEndpoints:`Uç noktalarda ara...`}},configureAmsSlot:{title:`AMS Yuvasını Yapılandır`,slotConfigured:`Yuva Yapılandırıldı!`,configuringSlot:`Yuva yapılandırılıyor:`,slotLabel:`{{ams}} Yuva {{slot}}`,searchPresets:`Ön ayarlarda ara...`,colorPlaceholder:`Renk adı veya hex (örn., kahverengi, FF8800)`,clearCustomColor:`Özel rengi temizle`,noCloudPresets:`Bulut ön ayarı yok. Senkronize etmek için Bambu Cloud'a giriş yapın.`,noPresetsAvailable:`Kullanılabilir ön ayar yok. Bambu Cloud'a giriş yapın veya yerel profilleri içe aktarın.`,noMatchingPresets:`Eşleşen ön ayar bulunamadı.`,custom:`Özel`,builtin:`Yerleşik`,orcaCloud:`Orca Cloud`,bambuCloud:`Bambu Cloud`,settingsSentToPrinter:`Ayarlar yazıcıya gönderildi`,filamentProfile:`Filament Profili`,kProfileLabel:`K Profili (Basınç İlerlemesi)`,filteringFor:`Şu için filtreleniyor: {{material}}`,noKProfile:`K profili yok (varsayılan 0.020 kullan)`,noMatchingKProfiles:`Eşleşen K profili bulunamadı. Varsayılan K=0.020 kullanılacak.`,selectFilamentFirst:`Önce bir filament profili seçin`,kFromCalibration:`Yazıcı kalibrasyonundan K={{value}}`,customColorLabel:`Özel Renk (isteğe bağlı)`,presetColors:`{{name}} renkleri:`,showLessColors:`Daha az renk göster`,showMoreColors:`Daha fazla renk göster`,clear:`Temizle`,hexLabel:`Hex: #{{hex}}`,resetting:`Sıfırlanıyor...`,resetSlot:`Yuvayı Sıfırla`,cancel:`İptal`,configuring:`Yapılandırılıyor...`,configureSlot:`Yuvayı Yapılandır`},githubBackup:{title:`Git Yedekleme`,history:`Geçmiş`,downloadBackup:`Yedeği İndir`,restoreBackup:`Yedeği Geri Yükle`,noBackupsYet:`Henüz yedek yok`},emailSettings:{placeholders:{fromName:`BamBuddy`}},tagManagement:{searchTags:`Etiketlerde ara...`,renameTag:`Etiketi yeniden adlandır`,deleteTag:`Etiketi sil`},notificationTemplates:{placeholders:{title:`Bildirim başlığı...`,body:`Bildirim gövdesi...`}},batchTag:{placeholders:{newTag:`Yeni etiket girin...`}},photoGallery:{deletePhoto:`Fotoğrafı Sil`},filamentHoverCard:{copySpoolUuid:`Makara UUID'sini kopyala`},kProfilesView:{hasNote:`Notu var`,copyProfile:`Profili kopyala`},layout:{openMenu:`Menüyü aç`,noPermissionSystemInfo:`Sistem bilgisini görüntüleme izniniz yok`},dashboard:{dragToReorder:`Yeniden sıralamak için sürükleyin`,hideWidget:`Widget'ı gizle`},notificationProviderCard:{deleteNotificationProvider:`Bildirim Sağlayıcısını Sil`},fileManagerModal:{closeFileManager:`Dosya yöneticisini kapat`,sortFiles:`Dosyaları sırala`,goToParentFolder:`Üst klasöre git`,threeView:`3B Görünüm`},embeddedCameraViewer:{refreshStream:`Akışı yenile`,close:`Kapat`,zoomOut:`Uzaklaştır`,resetZoom:`Yakınlaştırmayı sıfırla`,zoomIn:`Yakınlaştır`,dragToResize:`Yeniden boyutlandırmak için sürükleyin`},timelapseViewer:{skipBack5s:`5 sn geri al`,skipForward5s:`5 sn ileri al`},notificationProviders:{descriptions:{email:`SMTP e-posta bildirimleri`,telegram:`Telegram botu üzerinden bildirimler`,discord:`Webhook üzerinden Discord kanalına gönder`,ntfy:`Ücretsiz, kendi barındırılabilir push bildirimleri`,pushover:`Basit, güvenilir push bildirimleri`,callmebot:`CallMeBot üzerinden ücretsiz WhatsApp bildirimleri`,webhook:`Herhangi bir URL'ye genel HTTP POST`}},logViewer:{searchPlaceholder:`Mesaj veya günlükçü adı ara...`,noLogEntries:`Günlük kaydı bulunamadı`},switchbarPopover:{noSwitchesInSwitchbar:`Anahtar çubuğunda anahtar yok`},projectPageModal:{placeholders:{title:`Başlık`,designer:`Tasarımcı`,license:`Lisans`,description:`Açıklama girin...`,profileTitle:`Profil Başlığı`,profileDescription:`Profil açıklaması...`}},spoolmanSettings:{},time:{unknown:`-`,waiting:`Bekliyor`,justNow:`Az önce`,now:`Şimdi`,minsAgo:`{{count}}dk önce`,inMins:`{{count}}dk sonra`,hoursAgo:`{{count}}sa önce`,inHours:`{{count}}sa sonra`,daysAgo:`{{count}}g önce`,inDays:`{{count}}g sonra`},spoolbuddy:{nav:{dashboard:`Gösterge Paneli`,ams:`AMS`,inventory:`Envanter`,writeTag:`Yaz`,settings:`Ayarlar`},status:{nfcReady:`NFC Hazır`,nfcOff:`NFC Kapalı`,offline:`Çevrimdışı`,online:`Çevrimiçi`,noPrinters:`Yazıcı yok`,deviceOffline:`Cihaz Çevrimdışı`,waitingConnection:`Cihaz bağlantısı bekleniyor...`,systemReady:`Sistem Hazır`,status:`Durum`},dashboard:{readyToScan:`Taramaya hazır`,idleMessage:`Tanımlamak için bir makarayı tartıya yerleştirin`,nfcHint:`NFC etiketi otomatik olarak okunacak`,device:`Cihaz`,syncWeight:`Ağırlığı Senkronize Et`,weightSynced:`Senkronize edildi!`,unknownTag:`Bilinmeyen Etiket`,newTag:`Yeni Etiket Algılandı`,onScale:`tartıda`,linkSpool:`Makaraya Bağla`,linkTagTitle:`Etiketi Makaraya Bağla`,linkTag:`Etiketi Bağla`,selectSpool:`Bu etiketi bağlamak için bir makara seçin:`,noUntagged:`Etiketsiz makara bulunamadı`,tagDetected:`Etiket algılandı`,noTag:`Etiket yok`,tagId:`Etiket`,grossWeight:`Brüt ağırlık`,spoolSize:`Makara boyutu`,close:`Kapat`,currentSpool:`Mevcut Makara`,plateReady:`Plaka hazır: {{name}}`,plateReadyLabel:`Temizlenmeye hazır plakalar`,plateClearAction:`Temizle`,plateClearedToast:`Plaka temizlendi olarak işaretlendi`,plateClearFailed:`Plaka temizlendi olarak işaretlenemedi`},modal:{spoolDetected:`Makara Algılandı`,assignToAms:`AMS'e Ata`,syncWeight:`Ağırlığı Senkronize Et`,weightSynced:`Senkronize edildi!`,syncing:`Senkronize ediliyor...`,newTagDetected:`Yeni Etiket Algılandı`,addToInventory:`Envantere Ekle`,assignToAmsTitle:`AMS'e Ata`,selectSlot:`Bir yuva seçin`,assign:`Ata`,assigning:`Atanıyor...`,assignSuccess:`Atandı!`,assignPendingInsert:`Atandı. Makarayı yerleştirdiğinizde yuva yapılandırılacak.`,assignError:`Makara atanamadı. Lütfen tekrar deneyin.`,noPrinterSelected:`Bir yazıcı seçin...`,noAmsDetected:`Bu yazıcıda AMS algılanmadı`,slot:`Yuva`},weight:{noReading:`Okuma yok`,stable:`Kararlı`,measuring:`Ölçülüyor...`,tare:`Dara`,calibrate:`Kalibre Et`},spool:{remaining:`Kalan`,material:`Malzeme`,brand:`Marka`,color:`Renk`,coreWeight:`Çekirdek`,labelWeight:`Etiket`,scaleWeight:`Tartı`,netWeight:`Net`,lastUsed:`Son kullanım`},ams:{noData:`AMS algılanmadı`,connectAms:`Filament yuvalarını görmek için bir AMS bağlayın`,noPrinter:`Yazıcı seçilmedi`,selectPrinter:`Üst çubuktan bir yazıcı seçin`,printerDisconnected:`Yazıcı bağlantısı kesildi`,humidity:`Nem`,level:`Seviye`,active:`Aktif`,slot:`Yuva`,empty:`Boş`},inventory:{search:`Makaralarda ara...`,empty:`Envanterde makara yok`,noResults:`Eşleşen makara yok`,spools:`makara`,addSpool:`Makara Ekle`},settings:{tabDevice:`Cihaz`,tabDisplay:`Görüntü`,tabScale:`Tartı`,tabUpdates:`Güncellemeler`,nfcReader:`NFC Okuyucu`,type:`Tür`,connection:`Bağlantı`,notConnected:`N/A`,deviceInfo:`Cihaz Bilgisi`,hostname:`Ana Bilgisayar`,uptime:`Çalışma Süresi`,systemConfig:`Arka Uç ve Kimlik Doğrulama`,backendUrl:`Bambuddy Arka Uç URL'si`,apiToken:`API Belirteci`,apiTokenPlaceholder:`API belirtecini girin`,saveConfig:`Yapılandırmayı Kaydet`,systemQueued:`Yapılandırma kuyruğa alındı.`,nfcDiagnostic:`NFC Tanılaması`,scaleDiagnostic:`Tartı Tanılaması`,readTagDiagnostic:`Etiket Okuma Tanılaması`,testNfc:`Okuyucuyu test et`,testScale:`Doğruluğu test et`,testReadTag:`Etiket oku`,systemFieldsRequired:`Arka uç URL'si gerekli.`,brightness:`Parlaklık`,saved:`Kaydedildi`,noBacklight:`DSI arka ışık algılanmadı. Parlaklık kontrolü DSI ekran gerektirir.`,screenBlank:`Ekran Kapanma Zaman Aşımı`,screenBlankDesc:`Hareketsizlik sonrası ekran kapanır. Uyandırmak için dokunun.`,displayNote:`Parlaklık bir yazılım filtresi olarak uygulanır.`,scaleCalibration:`Tartı Kalibrasyonu`,currentWeight:`Mevcut ağırlık`,tareOffset:`Dara`,calFactor:`Faktör`,knownWeight:`Bilinen ağırlık`,calStep1:`Tartıdan tüm öğeleri kaldırın ve Sıfır Ayarla'ya basın.`,calStep2:`Bilinen ağırlığı tartıya yerleştirin.`,setZero:`Sıfır Ayarla`,calibrateNow:`Kalibre Et`,calibrated:`Kalibre edildi`,tareSet:`Dara komutu gönderildi. Cihaz bekleniyor...`,tareComplete:`Dara tamam!`,tareTimedOut:`Dara zaman aşımına uğradı — SpoolBuddy daemon çalışıyor mu?`,tareFailed:`Dara komutu gönderilemedi`,zeroSet:`Sıfır noktası ayarlandı. Bilinen ağırlığı tartıya yerleştirin.`,calibrationDone:`Kalibrasyon tamamlandı!`,calibrationFailed:`Kalibrasyon başarısız`,lastCalibrated:`Son kalibrasyon`,stable:`Kararlı`,settling:`Sabitleniyor...`,firmware:`Firmware`,scale:`Tartı`,noDevice:`SpoolBuddy cihazı bulunamadı`,daemonVersion:`Daemon Sürümü`,currentVersion:`Mevcut`,versionPending:`Daemon bekleniyor...`,checking:`Kontrol ediliyor...`,checkUpdates:`Güncellemeleri Kontrol Et`,updateAvailable:`Güncelleme mevcut`,updateInstructions:`SSH üzerinden güncelle: yükseltmek için SpoolBuddy yükleme betiğini çalıştırın.`,upToDate:`Güncel`,includeBeta:`Beta sürümleri dahil et`},writeTag:{tabExisting:`Mevcut Makara`,tabNew:`Yeni Makara`,tabReplace:`Etiketi Değiştir`,searchPlaceholder:`Malzeme, renk, marka ile ara...`,noUntaggedSpools:`Etiketsiz makara yok`,noTaggedSpools:`Etiketli makara yok`,selectSpool:`Bir makara seçin, ardından okuyucuya boş bir NTAG yerleştirin`,placeTag:`Okuyucuya bir NTAG yerleştirin`,tagReady:`Etiket algılandı — yazmaya hazır`,writeTag:`Etiketi Yaz`,replaceTag:`Etiketi Değiştir`,writing:`Etiket yazılıyor...`,waiting:`SpoolBuddy bekleniyor...`,writeSuccess:`Etiket başarıyla yazıldı!`,writeFailed:`Yazma başarısız`,queueFailed:`Yazma komutu kuyruğa alınamadı`,tryAgain:`Tekrar Dene`,cancel:`İptal`,replaceWarning:`Eski etiket bağlantısı kaldırılacak. Yeni etiket yerini alacak.`,deviceOffline:`SpoolBuddy çevrimdışı`,material:`Malzeme`,colorName:`Renk Adı`,color:`Renk`,brand:`Marka`,weight:`Ağırlık (g)`,createSpool:`Makara Oluştur`,creating:`Oluşturuluyor...`,spoolCreated:`Makara oluşturuldu! Yazmaya hazır.`,createFailed:`Makara oluşturulamadı`,incompleteDataWarning:`Etiket eksik Spoolman verisiyle yazıldı`},quickMenu:{printerPower:`Yazıcı Gücü`,systemControls:`Sistem`,restartDaemon:`Daemon'u Yeniden Başlat`,restartBrowser:`Tarayıcıyı Yeniden Başlat`,reboot:`Yeniden Başlat`,shutdown:`Kapat`,swipeToClose:`Kapatmak için aşağı kaydır`,confirmTitle:`Onayla`,confirmShutdown:`SpoolBuddy'yi kapatmak istediğinizden emin misiniz? Tekrar açmak için fiziksel erişime ihtiyacınız olacak.`,confirmReboot:`SpoolBuddy'yi yeniden başlatmak istediğinizden emin misiniz?`,confirmRestartDaemon:`SpoolBuddy daemon yeniden başlatılsın mı? NFC ve tartı geçici olarak kullanılamayacak.`,confirmRestartBrowser:`Kiosk tarayıcısı yeniden başlatılsın mı? Ekran kısa bir süre kararacak.`,confirm:`Onayla`,confirmPlugOn:`{{name}} açılsın mı?`,confirmPlugOff:`{{name}} kapatılsın mı?`,turnOn:`Aç`,turnOff:`Kapat`}},diagnostic:{modalTitle:`Bağlantı tanılaması — {{name}}`,running:`Tanılama çalışıyor...`,runningElapsed:`Tanılama çalışıyor... ({{elapsed}}s)`,waitingForReportHint:`Yazıcının durum raporu yayınlamasını bekliyor — bu işlem en fazla {{max}} saniye sürebilir.`,runFailed:`Tanılama çalıştırılamadı: {{error}}`,retry:`Tekrar çalıştır`,runButton:`Tanılamayı çalıştır`,sectionTitle:`Bağlantı Tanılaması`,sectionDescription:`Bir yazıcının neden bağlanmadığını veya yazdırmadığını kontrol edin — port erişilebilirliği, LAN geliştirici modu, Docker ağ modu ve kimlik bilgileri.`,noPrinters:`Yapılandırılmış yazıcı yok.`,overall:{ok:`Sorun bulunamadı — yazıcı bağlantısı sağlıklı görünüyor.`,warnings:`Yazıcı çalışmalı, ancak bazı şeyler dikkat gerektiriyor.`,problems:`Yazıcının neden bağlanmadığını veya yazdırmadığını açıklayan sorunlar bulundu.`},check:{port_mqtt:{title:`Kontrol portu (MQTT 8883)`,pass:`Erişilebilir — yazıcı kontrol bağlantılarını kabul ediyor.`,fail:`Port 8883 erişilemez. Yazıcı kapalı, farklı bir IP adresinde veya bir güvenlik duvarı engelliyor. Yazıcı IP'sini ve hiçbir şeyin port 8883'ü engellemediğini doğrulayın.`},port_ftps:{title:`Dosya aktarım portu (FTPS 990)`,pass:`Erişilebilir — baskı dosyaları gönderme çalışacak.`,warn:`Port 990 erişilemez. İzleme yine çalışabilir, ancak yazıcıya baskı gönderme başarısız olacak. Port 990'ın engellenmediğinden emin olun.`},external_storage:{title:`Gönderilen dosyaları harici depolamada sakla (kurulum adımı 4)`,pass:`Yazıcı bu seçeneğin açık olduğunu bildiriyor — gönderilen dosyalar SD kartta saklanacak ve arşivler küçük resim ve dilimleyici meta verileri içerecek.`,fail:`Yazıcı bu seçeneğin kapalı olduğunu bildiriyor. "Gönderilen dosyaları harici depolamada sakla" seçeneğini etkinleştirin — yeni donanım yazılımlarında (P2S 01.02 / Bambu Studio 2.6+) düğme yazıcının Baskı Ayarları'nda; eski sürümlerde Bambu Studio / OrcaSlicer'in Cihaz sekmesindedir. Bu seçenek olmadan, arşivlenen her baskıda küçük resim ve dilimleyici meta verisi olmayacak.`,skip:`Kontrol edilmedi — etkin bir MQTT bağlantısı gerekli. Bu ayarın yalnızca dilimleyicide bulunduğu eski dilimleyicilerde yazıcı bunu bildirmez, bu nedenle seçenek kapalı olsa bile bu kontrol geçer — kurulum adımı 4'ü manuel olarak doğrulayın.`,skip_unsupported_model:`Bu modelde SD yuvası var ancak seçeneği açmanın bir yolu yok — mevcut P1 serisi bellenim, Bambu Studio'da bu anahtarı göstermiyor ve yazıcının ekranı yok. Burada düzeltilecek bir şey yok; Bambu Lab bellenim desteği ekleyene kadar arşivlenen baskılarda küçük resimler ve dilimleyici meta verileri eksik olabilir.`},port_rtsps:{title:`Kamera portu ({{protocol}} {{port}})`,pass:`Erişilebilir — kamera akışı çalışacak.`,warn:`Port {{port}} erişilemez. Canlı kamera görünümü çalışmayacak. Bu, baskıyı etkilemez.`},network_mode:{title:`Docker ağ modu`,pass:`Ana bilgisayar ağ modunda çalışıyor.`,warn:`Bambuddy, Docker köprü ağı kullanılarak çalışıyor. Yazıcı keşfi ve Sanal Yazıcı, ana bilgisayar ağ modu gerektirir — konteyneri "network_mode: host" ile yeniden oluşturun.`,skip:`Docker'da çalışmıyor — uygulanamaz.`},subnet:{title:`Ağ alt ağı`,pass:`Yazıcı ve Bambuddy aynı alt ağda.`,warn:`Yazıcı ({{printer_ip}}) ve Bambuddy ({{host_ip}}) farklı alt ağlarda. Alt ağlar arasında yönlendirme yapılandırılmazsa birbirlerine erişemeyebilirler.`,skip:`Alt ağ belirlenemedi — atlandı.`},mqtt_auth:{title:`Yazıcı kimlik bilgileri`,pass:`Yazıcı bağlantıyı kabul etti.`,fail:`Yazıcı erişilebilir ancak bağlantıyı reddetti. Büyük olasılıkla erişim kodu veya seri numarası yanlış. Erişim kodu, Geliştirici Modu her açılıp kapatıldığında değişir — yazıcı ekranından yeniden kopyalayın.`,skip:`Kontrol edilmedi — yazıcıya erişilemedi.`},developer_mode:{title:`LAN Geliştirici Modu`,pass:`Geliştirici Modu etkin.`,fail:`Yazıcıda Geliştirici Modu KAPALI. Yazıcının LAN ayarlarında etkinleştirin — ve OK ile onaylayın. Bu olmadan baskılar başlamayacak.`,skip:`Kontrol edilemedi — yazıcıya canlı bir bağlantı gerektirir.`},printer_publishing:{title:`Yazıcı durum yayını yapıyor`,pass:`Yazıcı durum güncellemelerini yayınlıyor — AMS, filamentler ve K profilleri dilimleyiciye doğru şekilde yansıtılacak.`,fail:`MQTT aracısı bağlantıyı kabul etti, ancak yazıcı hiç durum raporu yayınlamadı. Bu neredeyse her zaman yanlış ya da büyük/küçük harf hatalı bir seri numarasından kaynaklanır — device//report konusu büyük/küçük harfe duyarlıdır. Yazıcı ayarlarındaki seri numarasını cihazın ekranındaki ile karşılaştırarak doğrulayın.`,skip:`Kontrol edilemedi — yazıcıya canlı bir bağlantı gerektirir.`}}},systemHealth:{sectionTitle:`Sistem Sağlığı`,sectionDescription:`Bir destek talebine dönüşmeden önce genellikle kendi başınıza düzeltebileceğiniz bilinen sorunlar için son günlükleri tarar.`,rescan:`Yeniden tara`,clean:`Son {{times}} günlük kaydında bilinen sorun bulunamadı.`,logUnavailable:`Dosya günlüğü devre dışı, bu nedenle günlükler taranamıyor. Bu kontrolü kullanmak için dosya günlüğünü etkinleştirin.`,learnMore:`Nasıl düzeltilir`,fixLabel:`Düzeltme:`,occurrences:`{{times}}× görüldü — son {{lastSeen}}'de`,category:{layer8:`Bunu düzeltebilirsiniz`,environment:`Ortam`,bug:`Lütfen bunu bildirin`},signature:{"ftp-auth-rejected":{name:`Yazıcı erişim kodunu reddetti`,cause:`Yazıcı dosya aktarım girişini reddetti. Erişim kodu yanlış veya Geliştirici Modu açılıp kapatıldıktan sonra değişti.`,fix:`Erişim kodunu yazıcı ekranından (LAN ayarları) yeniden kopyalayın ve Bambuddy'deki yazıcının ayarlarında güncelleyin.`},"ftp-connection-timeout":{name:`Dosya aktarım bağlantısı zaman aşımına uğradı`,cause:`Bambuddy yazıcının dosya aktarım portuna (FTPS 990) erişemedi. Port engellendi veya yazıcı kapalı ya da başka bir alt ağda.`,fix:`Bambuddy ile yazıcı arasında hiçbir şeyin port 990'ı engellemediğinden ve her ikisinin de aynı ağda olduğundan emin olun.`},"ftp-ssl-error":{name:`Güvenli dosya aktarım el sıkışması başarısız`,cause:`Yazıcının dosya aktarım sunucusuyla TLS el sıkışması başarısız oldu. Bu genellikle bir güvenlik duvarı veya eski yazıcı firmware'idir.`,fix:`Yazıcı firmware'ini güncelleyin ve port 990'daki bağlantıyı hiçbir güvenlik duvarı veya proxy'nin engellemediğini kontrol edin.`},"mqtt-connection-flapping":{name:`Yazıcı bağlantısı sürekli düşüyor`,cause:`Kontrol bağlantısı (MQTT 8883) tekrar tekrar bağlantısı kesiliyor ve yeniden bağlanıyor — genellikle zayıf bir ağ yolu veya kısmen engellenmiş bir port.`,fix:`Yazıcıdaki Wi-Fi sinyalini kontrol edin, kablolu bağlantı tercih edin ve port 8883'ün güvenilir bir şekilde erişilebilir olduğundan emin olun.`},"camera-connection-refused":{name:`Kamera akışına erişilemez`,cause:`Canlı kameraya RTSPS 322 portunda erişilemedi. Port engellendi veya yazıcıda kamera veya LAN canlı görünümü kapalı.`,fix:`Yazıcıda kamerayı ve LAN canlı görünümünü etkinleştirin ve port 322'nin engellenmediğinden emin olun. Bu, baskıyı etkilemez.`},"database-locked":{name:`Veritabanı yazma çekişmesi`,cause:`SQLite veritabanı yük altında "veritabanı kilitli" hatalarıyla karşılaşıyor — aynı anda birkaç yazıcı çalıştırırken yaygındır.`,fix:`Bambuddy'yi harici bir PostgreSQL veritabanına geçirin. Dokümantasyondaki PostgreSQL kılavuzuna bakın.`}}},vpDiagnostic:{title:`Kurulum kontrolü — {{name}}`,runButton:`Kurulum kontrolünü çalıştır`,running:`Kurulum kontrolü çalışıyor...`,runFailed:`Kurulum kontrolü çalıştırılamadı: {{error}}`,retry:`Tekrar çalıştır`,overall:{ok:`Tüm kontroller geçti — bu sanal yazıcı doğru şekilde kurulmuş.`,warnings:`Sanal yazıcı çalışmalı, ancak bazı şeyler dikkat gerektiriyor.`,problems:`Dilimleyicinin bu sanal yazıcıyı neden göremediğini veya kullanamadığını açıklayan sorunlar bulundu.`},check:{enabled:{title:`Sanal yazıcı etkin`,fail:`Bu sanal yazıcı kapatılmış. Keşfedilebilir hale getirmek için açın.`},running:{title:`Servisler çalışıyor`,fail:`Sanal yazıcı etkin ancak servisleri çalışmıyor. Bambuddy günlüğünü kontrol edin — bir bind IP çakışması veya bir izin hatası genellikle onları durdurur.`},bind_interface:{title:`Bind ağ arayüzü`,fail:`Bind arayüzü ayarlanmamış veya artık bu ana bilgisayarda mevcut değil. Bind Arayüzü açılır menüsünde mevcut bir arayüz seçin.`},access_code:{title:`Erişim kodu ayarlandı`,fail:`Erişim kodu ayarlanmamış. Dilimleyiciye burada ayarladığınız aynı 8 karakterli erişim kodunun verilmesi gerekir.`},target_printer:{title:`Hedef yazıcı`,fail:`Hedef yazıcı seçilmemiş. Proxy modu iletmek için gerçek bir yazıcıya ihtiyaç duyar.`,warn:`Hedef yazıcı şu anda çevrimdışı — yeniden bağlandığında proxy devam edecek.`},port_ftps:{title:`Dosya yükleme servisi (port {{port}})`,fail:`Bind IP'sinin {{port}} portunda hiçbir şey dinlemiyor, bu nedenle dilimleyici dosya yükleyemez. Bu arayüzde bir port çakışması genellikle nedendir.`},port_mqtt:{title:`Kontrol servisi (port {{port}})`,fail:`Bind IP'sinin {{port}} portunda hiçbir şey dinlemiyor, bu nedenle dilimleyici bağlanamaz veya durum gösteremez.`},port_bind:{title:`Keşif servisi (port {{port}})`,fail:`Bind IP'sinin {{port}} portunda hiçbir şey dinlemiyor, bu nedenle dilimleyicinin keşif el sıkışması başarısız oluyor.`},certificate:{title:`TLS sertifikası`,pass:`Sertifika hazır. Bambuddy CA sertifikasının (yukarıda) dilimleyicinizin güven deposuna içe aktarıldığından emin olun.`,fail:`Bu sanal yazıcı için TLS sertifikası eksik. Bambuddy veri dizininin yazılabilir olduğunu kontrol edin.`}}},bugReport:{title:`Hata Bildir`,description:`Açıklama`,descriptionPlaceholder:`Ne ters gitti? Lütfen sorunu tanımlayın...`,email:`E-posta (isteğe bağlı)`,emailPlaceholder:`sizin@email.com`,emailPrivacy:`Sağlanırsa, e-postanız GitHub sorunundaki daraltılmış bir bölümde dahil edilecek, böylece bakımcı takip edebilir.`,screenshot:`Ekran Görüntüsü`,uploadOrPaste:`Bir görüntü yükleyin, yapıştırın veya sürükleyin`,dataCollectedSummary:`Rapora hangi veriler dahil edilir?`,dataIncluded:`Dahil:`,dataIncludedList:`Uygulama sürümü, OS, mimari, Python sürümü, veritabanı istatistikleri (yalnızca sayılar), yazıcı modelleri, nozul sayıları, firmware sürümleri, bağlantı durumu, entegrasyon durumu (Spoolman, MQTT, HA), hassas olmayan ayarlar, ağ arayüzü sayısı, Docker ayrıntıları, bağımlılık sürümleri.`,dataNeverIncluded:`Asla dahil edilmez:`,dataNeverIncludedList:`Yazıcı adları, seri numaraları, erişim kodları, parolalar, IP adresleri, e-posta adresleri, API anahtarları, belirteçler, webhook URL'leri, ana bilgisayar adları veya kullanıcı adları.`,submit:`Gönder`,startLogging:`Hata Ayıklama Kaydını Başlat`,stepEnableLogging:`Hata ayıklama kaydı etkin`,stepReproduce:`Sorunu şimdi yeniden oluşturun`,stepStopLogging:`Durdur ve raporu gönder`,stopAndSubmit:`Durdur ve Gönder`,maxDuration:`{{minutes}} dk sonra otomatik durur`,stoppingLogs:`Günlükler toplanıyor ve gönderiliyor...`,submitting:`Hata raporu gönderiliyor...`,submittingStepConnection:`Yazıcı bağlantı kontrolleri çalıştırılıyor`,submittingStepVirtualPrinters:`Sanal yazıcı kurulum kontrolleri çalıştırılıyor`,submittingStepLogScan:`Son günlüklerde bilinen sorunlar taranıyor`,submittingStepSubmit:`Rapor GitHub'a gönderiliyor`,submitSuccess:`Hata raporu başarıyla gönderildi!`,submitFailed:`Hata raporu gönderilemedi`,diagnosticChecking:`Yazıcı bağlantıları kontrol ediliyor...`,diagnosticHealthy:`Bağlantı kontrolü başarılı — yazıcılarınızda sorun bulunamadı.`,diagnosticSummary:`{{total}} yazıcıdan {{problems}} tanesinde bağlantı sorunu var`,diagnosticIntro:`Bir veya daha fazla yazıcının sorununuza neden olabilecek bir bağlantı sorunu var. Düzeltmeyi görmek için aşağıda bir yazıcıyı genişletin — bunu çözmek, hata raporu olmadan sorunu çözebilir. Yine de aşağıda bir rapor gönderebilirsiniz.`,logHealthSummary:`Günlüklerinizde bilinen sorunlar bulundu`,logHealthIntro:`Son günlükler bilinen sorunlarla eşleşiyor. Aşağıdaki düzeltmeleri kontrol edin — bunları çözmek, hata raporu olmadan sorununuzu çözebilir. Yine de aşağıda bir rapor gönderebilirsiniz.`,thankYou:`Teşekkürler!`,submitted:`Hata raporunuz gönderildi.`,viewIssue:`Sorunu Görüntüle`,unexpectedError:`Beklenmedik bir hata oluştu`},failureDetection:{title:`AI Başarısızlık Algılama`,description:`Baskıları kendi barındırılan bir Obico ML API ile izle ve algılanan başarısızlıklara otomatik olarak yanıt ver.`,mlUrl:`Obico ML API URL'si`,mlUrlHint:`Kendi barındırılan Obico ml_api konteynerinizin temel URL'si (örn. http://192.168.1.10:3333).`,test:`Test`,testSuccess:`ML API erişilebilir ve sağlıklı.`,testFailed:`ML API'ye erişilemedi.`,sensitivity:`Hassasiyet`,sensitivityLow:`Düşük (daha az yanlış pozitif)`,sensitivityMedium:`Orta (dengeli)`,sensitivityHigh:`Yüksek (erken algıla, daha fazla yanlış pozitif)`,sensitivityHint:`Uyarıları ve başarısızlıkları tetikleyen güven eşiklerini ayarlar.`,action:`Algılanan başarısızlıkta eylem`,actionNotify:`Yalnızca bildir`,actionPause:`Baskıyı duraklat`,actionPauseOff:`Duraklat ve gücü kes`,pollInterval:`Sorgulama aralığı (saniye)`,pollIntervalHint:`Baskı yaparken her yazıcının ne sıklıkta kontrol edileceği. Minimum 5sn, maksimum 120sn.`,externalUrlMissing:`Harici URL ayarlanmamış.`,externalUrlHint:`ML API, kamera anlık görüntüsünü URL üzerinden alır. ML API konteyneri Bambuddy'ye erişebilsin diye Genel ayarlarda Harici URL'yi ayarlayın.`,perPrinterTitle:`İzlenen Yazıcılar`,perPrinterHint:`Algılama servisinin hangi yazıcıları izleyeceğini seçin.`,monitorAll:`Tüm bağlı yazıcıları izle`,statusTitle:`Durum`,serviceRunning:`Servis çalışıyor`,thresholds:`Düşük / Yüksek eşikler`,activePrinters:`Aktif baskılar`,noActivePrints:`Şu anda çalışan baskı yok.`,historyTitle:`Son Algılamalar`,noHistory:`Henüz algılama yok.`},makerworld:{title:`MakerWorld`,description:`Bambu Handy uygulamasına gitmeden — doğrudan Bambuddy'den içe aktarmak ve yazdırmak için bir MakerWorld model URL'si yapıştırın.`,pasteUrlHeader:`MakerWorld'den İçe Aktar`,pasteUrlPlaceholder:`https://makerworld.com/en/models/… veya herhangi bir MakerWorld bağlantısını yapıştırın`,resolveButton:`Çöz`,signInRequiredTitle:`İndirme için Bambu Cloud girişi gerekli`,signInRequiredBody:`Model ayrıntılarına anonim olarak göz atabilirsiniz, ancak MakerWorld 3MF dosyalarını indirmek için bir Bambu Cloud hesabı gerektirir.`,signInExpiredTitle:`Bambu Cloud oturumu sona erdi`,signInExpiredBody:`Bambuddy oturumunuz açık kalmaya devam ediyor, ancak Bambu Lab kayıtlı belirteci artık kabul etmediği için indirmeler başarısız olacak. Bambu Cloud oturumunu yeniden açın.`,openCloudSettings:`Bulut ayarlarını aç`,untitledModel:`Adsız model`,byCreator:`{{name}} tarafından`,downloadsCount:`{{count}} indirme`,licensePrefix:`Lisans`,alreadyImported:`Zaten kütüphanede`,openOnMakerworld:`MakerWorld'de aç`,alreadyInLibrary:`Bu model zaten kütüphanenizde — Dosya Yöneticisi → MakerWorld'de bulun`,importSuccess:`{{filename}} içe aktarıldı — Dosya Yöneticisi → MakerWorld'e kaydedildi`,platesHeader:`Plakalar ({{count}})`,plateDefaultName:`Plaka {{n}}`,materialCount:`{{count}} filament`,amsRequired:`AMS gerekli`,slicedFor:`{{printer}} için dilimlendi`,alsoCompatible:`Ayrıca uyumlu olarak işaretlendi: {{printers}}`,importToLibrary:`Kaydet`,sliceIn:`Kaydet ve {{slicer}}'de Dilimle`,disclaimer:`MakerWorld entegrasyonu topluluk tarafından belgelenen API uç noktalarını kullanır. Bambuddy, MakerWorld veya Bambu Lab ile ilişkili veya onaylı değildir.`,lastImportSuccess:`Kütüphanenize içe aktarıldı`,lastImportAlreadyInLibrary:`Zaten kütüphanenizde`,viewInLibrary:`Dosya Yöneticisinde Görüntüle`,openInBambuStudio:`Bambu Studio'da Aç`,openInOrcaSlicer:`OrcaSlicer'da Aç`,importTo:`Dosya yöneticisine içe aktar`,recentImportsHeader:`Son içe aktarımlar`,phaseResolving:`Çözülüyor`,phaseDownloading:`İndiriliyor`,folderAuto:`MakerWorld (varsayılan)`,importAll:`Tümünü içe aktar`,importAllProgress:`{{current}}/{{total}} içe aktarılıyor`,openGallery:`Görüntü galerisini aç`,galleryPrev:`Önceki görüntü`,galleryNext:`Sonraki görüntü`,deleteImport:`Kütüphaneden kaldır`,importDeleting:`Kaldırılıyor…`,importDeleted:`Kütüphaneden kaldırıldı`,confirmDelete:`{{filename}} kütüphaneden kaldırılsın mı? Bu, yerel dosyayı siler ancak plaka MakerWorld'den yeniden içe aktarılabilir.`,errors:{resolveFailed:`O MakerWorld URL'si çözülemedi.`,downloadFailed:`İndirme başarısız. Lütfen tekrar deneyin.`,deleteFailed:`Dosya kütüphaneden kaldırılamadı.`}},gcodeViewer:{back:`Geri`,backToArchives:`Baskı Arşivlerine Dön`,backToFiles:`Dosya Yöneticisine Dön`},libraryTrash:{title:`Çöp Kutusu`,headerButton:`Çöp`,headerTooltip:`Çöpe taşınan dosyaları görüntüle`,backToFiles:`Dosya Yöneticisine Dön`,subtitleAdmin:`Silinen dosyalar burada {{days}} gün kalır, ardından otomatik silinir. Bu görünüm tüm kullanıcılar için çöpteki dosyaları gösterir.`,subtitleUser:`Silinen dosyalar burada {{days}} gün kalır, ardından otomatik silinir.`,loading:`Çöp yükleniyor…`,loadError:`Çöp yüklenemedi.`,empty:`Çöp boş.`,summary:`{{count}} dosya · {{size}}`,emptyTrash:`Çöpü boşalt`,restore:`Geri Yükle`,purgeNow:`Şimdi sil`,autoPurgeIn:`{{when}} içinde otomatik silinir`,days:`gün`,retentionLabel:`Otomatik sil`,selectAll:`Tümünü seç`,selectOne:`{{filename}} seç`,selectionCount:`{{count}} seçildi`,bulkRestore:`Seçilenleri geri yükle`,bulkPurge:`Seçilenleri sil`,col:{filename:`Dosya`,folder:`Klasör`,size:`Boyut`,deleted:`Çöpe taşındı`,autoPurge:`Otomatik silinir`,owner:`Sahip`,actions:`İşlemler`},confirm:{purgeTitle:`Kalıcı olarak silinsin mi?`,purgeBody:`{{filename}} diskten silinecek ve geri yüklenemeyecek.`,emptyTitle:`Çöp boşaltılsın mı?`,emptyBody:`Tüm {{count}} dosya diskten silinecek. Bu geri alınamaz.`,bulkPurgeTitle:`Seçili dosyalar kalıcı olarak silinsin mi?`,bulkPurgeBody:`Seçili {{count}} dosya diskten silinecek ve geri yüklenemeyecek.`,cta:`Kalıcı olarak sil`},toast:{restored:`Dosya geri yüklendi.`,restoreFailed:`Dosya geri yüklenemedi.`,purged:`Dosya kalıcı olarak silindi.`,purgeFailed:`Dosya silinemedi.`,emptied:`{{count}} dosya çöpten silindi.`,emptyFailed:`Çöp boşaltılamadı.`,retentionSaved:`Otomatik silme {{days}} gün olarak ayarlandı.`,retentionFailed:`Saklama ayarı kaydedilemedi.`,bulkRestored:`{{count}} dosya geri yüklendi.`,bulkPurged:`{{count}} dosya silindi.`}},libraryPurge:{title:`Eski dosyaları temizle`,headerButton:`Eskileri temizle`,headerTooltip:`Eski dosyaları toplu olarak çöpe taşı`,description:`Kütüphanenizden eski dosyaları tek seferde temizleyin. Baskı geçmişi olan dosyalar son baskı tarihlerine göre, hiç yazdırılmamış dosyalar yükleme tarihlerine göre yaşlandırılır.`,ageLabel:`Şundan eski dosyaları taşı`,days:`gün`,includeNeverPrinted:`Hiç yazdırılmamış dosyaları dahil et`,effectsTitle:`Temizle'ye tıkladığınızda ne olur`,effect1:`Eşleşen dosyalar Çöp'e taşınır — henüz diskten silinmezler.`,effect2:`Saklama penceresi sona erene kadar Çöp'ten herhangi bir zamanda geri yükleyebilirsiniz.`,effect3:`Saklama sonrası, çöp süpürücü onları kalıcı olarak diskten kaldırır.`,effect4:`Harici (bağlı) klasörlerdeki dosyalar atlanır — Bambuddy asla sahibi olmadığı bayt'ları silmez.`,previewLoading:`Kaç dosyanın eşleştiği kontrol ediliyor…`,previewFailed:`Temizleme önizlenemedi.`,previewSummary:`{{count}} dosya · {{size}} çöpe taşınacak`,andMore:`…ve {{count}} daha`,warning:`Çöpe taşınan dosyalar saklama penceresi sona erene kadar depolama alanını kullanmaya devam eder. Diski hemen boşaltmak için sonradan Çöp'ü boşaltın.`,confirmCta:`{{count}} dosyayı çöpe taşı`,purging:`Çöpe taşınıyor…`,toast:{success:`{{count}} dosya çöpe taşındı.`,failed:`Dosyalar temizlenemedi.`}},libraryAutoPurge:{enableLabel:`Eski dosyaları otomatik temizle`,enableDescription:`Yönetici temizliğini günde bir kez çalıştırır. Dosyalar önce Çöp'e gider — hemen silinmezler.`,ageLabel:`Şundan eski dosyaları otomatik temizle`,ageDescription:`Minimum 7 gün, maksimum 10 yıl. Manuel Temizle düğmesiyle aynı yaş kuralını kullanır.`,days:`gün`,includeNeverPrinted:`Hiç yazdırılmamış dosyaları dahil et`,saveFailed:`Otomatik temizleme ayarları kaydedilemedi.`},archivePurge:{headerButton:`Eskileri temizle`,headerTooltip:`Eski arşivleri toplu olarak sil`,title:`Eski arşivleri temizle`,description:`Eski baskı geçmişini temizleyin. Her arşiv en son baskı tamamlamasına göre yaşlandırılır — bir arşivi yeniden yazdırmak yaşını yeniler, bu nedenle aktif çalışma asla temizlenmez.`,ageLabel:`Son şu kadar günde yazdırılmamış arşivleri sil`,days:`gün`,effectsTitle:`Temizle'ye tıkladığınızda ne olur`,effect1:`Eşleşen her arşiv listelerden gizlenir ve dosyaları diskten kaldırılır (3MF, küçük resim, zaman atlamalı video, kaynak 3MF, F3D tasarım dosyası, fotoğraflar).`,effect2:`Arşiv satırı veritabanında kalır, böylece Hızlı İstatistikler filament, süre, maliyet ve enerji katkısını korur — tek arşiv silme varsayılanı ile aynı.`,effect3:`Hızlı İstatistik katkısını da kaldırmak için aşağıdaki "Ayrıca istatistiklerden kaldır"ı işaretleyin (tek arşiv silme seçeneğiyle eşleşir). O yol geri alınamaz.`,effect4:`Bir arşivi yeniden yazdırmak yaş saatini yeniler, bu nedenle hâlâ kullandığınız arşivler güvendedir.`,purgeStatsLabel:`Ayrıca istatistiklerden kaldır`,purgeStatsHint:`Eşleşen arşivleri Hızlı İstatistiklerden (filament, süre, maliyet, enerji) düşürür. Bu olmadan, Hızlı İstatistikler her katkıyı korur ve yalnızca dosyalar diskten ayrılır.`,previewLoading:`Kaç arşivin eşleştiği kontrol ediliyor…`,previewFailed:`Temizleme önizlenemedi.`,previewSummary:`{{count}} arşiv · {{size}} kaldırılacak`,andMore:`…ve {{count}} daha`,warning:`Dosyalar diskten kaldırılır ve geri yüklenemez. Devam etmeden önce saklamak istediğiniz her şeyi indirin veya favoriye ekleyin.`,confirmCta:`{{count}} arşivi kaldır`,purging:`Kaldırılıyor…`,toast:{success:`{{count}} arşiv kaldırıldı.`,failed:`Arşivler temizlenemedi.`}},archiveAutoPurge:{enableLabel:`Eski arşivleri otomatik temizle`,enableDescription:`Günde bir kez, eşik içinde yazdırılmamışsa arşivleri listelerden gizler ve dosyalarını diskten kaldırır. Bir arşivi yeniden yazdırmak saati sıfırlar.`,ageLabel:`Son şu kadar günde yazdırılmamış arşivleri otomatik sil`,ageDescription:`Minimum 7 gün, maksimum 10 yıl. En son baskı tamamlamasına göre — bir arşivi yeniden yazdırmak yaşını yeniler. 3MF, küçük resim, zaman atlamalı video, kaynak 3MF, F3D ve fotoğrafları kaldırır.`,days:`gün`,purgeStatsLabel:`Ayrıca istatistiklerden kaldır`,purgeStatsDescription:`Etkinleştirildiğinde, günlük süpürücü her temizlenen arşivi de Hızlı İstatistiklerden (filament, süre, maliyet, enerji) düşürür. Varsayılan kapalı — Hızlı İstatistikler katkıyı korur, yalnızca dosyalar diskten ayrılır.`,runNow:`Arşivleri şimdi temizle`,saveFailed:`Otomatik temizleme ayarları kaydedilemedi.`},cameraTokens:{scope:{camera_stream:`Kamera akışı`,camwall:`Kamera duvarı`,overlay:`Yayın bindirmesi`},title:`Kamera API Belirteçleri`,navTitle:`Kamera API belirteçleri`,description:`Kamera akışını Home Assistant, Frigate, kiosk ekranları veya sabit bir adres gerektiren başka araçlara gömmek için uzun ömürlü belirteçler. Kapsam oluşturma sırasında seçilir; belirteç istediğiniz zaman iptal edilebilir.`,loading:`Yükleniyor…`,confirmRevoke:{title:`Bu belirteç iptal edilsin mi?`,body:`"{{name}}" kullanan herhangi bir cihaz hemen erişimini kaybedecek. Bu geri alınamaz.`,cancel:`İptal`,confirm:`İptal Et`},create:{scopeLabel:`Kapsam`,hintCameraStream:`Kamera akışı belirteci yalnızca kamera akışlarını ve anlık görüntüleri alabilir. Home Assistant, Frigate veya tek bir kamerayı gömen her şey için kullanın.`,hintCamWall:`Kamera duvarı belirteci, oturum açmadan bir ekranda /camwall adresini açar. Her yazıcının adını ve durumunu, ayrıca kamera akışlarını görebilir. Dosya adlarını, adresleri veya erişim kodlarını göremez.`,hintOverlay:`Yayın bindirmesi belirteci, oturum açmadan bir ekranda /overlay/{printerId} adresini açar — OBS veya herhangi bir canlı yayın için. Bir yazıcının kamera akışını ve ekranda gösterilen dosya adı dahil canlı yazdırma durumunu görebilir. Adresleri veya erişim kodlarını göremez.`,title:`Yeni belirteç oluştur`,nameLabel:`Belirteç adı`,namePlaceholder:`örn. Home Assistant`,daysLabel:`Sona erene kadar gün`,submit:`Oluştur`,hint:`Maksimum ömür 365 gün. Belirteç değeri oluşturmada yalnızca bir kez gösterilir — şimdi kopyalayın.`},created:{camWallUrlTitle:`Bu ekran için kamera duvarı adresi`,camWallUrlHint:`Bu adresi ekranda açın. Adresi okuyabilen herkes duvarı izleyebilir, bu yüzden onu bir anahtar gibi görün; ekranın erişimini kesmek için belirteci iptal edin.`,overlayUrlTitle:`OBS için bindirme adresi`,overlayUrlHint:`Bunu OBS'ye Tarayıcı Kaynağı olarak ekleyin. /overlay/1 içindeki sayıyı yazıcınızın numarasıyla değiştirin (Yazıcılar sayfasındaki adresinden). Adresi okuyabilen herkes yayını izleyebilir, bu yüzden onu bir anahtar gibi görün — erişimi kesmek için belirteci iptal edin.`,title:`Belirteç oluşturuldu — şimdi kopyalayın`,warning:`Bu, bu belirtecin görünür olacağı tek seferdir. Bu iletişim kutusunu kapattıktan sonra onu bir daha asla görüntüleyemezsiniz.`,copy:`Kopyala`,dismiss:`Kaydettim`},list:{scope:`Kapsam`,myTitle:`Belirteçlerim`,allTitle:`Tüm kullanıcılar (yönetici görünümü)`,empty:`Henüz belirteç yok.`,name:`Ad`,owner:`Sahip`,prefix:`Önek`,created:`Oluşturuldu`,expires:`Sona Erer`,lastUsed:`Son kullanım`,revoke:`İptal Et`,expired:`Süresi Doldu`},toast:{created:`Belirteç oluşturuldu`,createFailed:`Belirteç oluşturulamadı`,revoked:`Belirteç iptal edildi`,revokeFailed:`Belirteç iptal edilemedi`,loadFailed:`Belirteçler yüklenemedi`,copied:`Panoya kopyalandı`,copyFailed:`Kopyalama başarısız — manuel olarak seçip kopyalayın`}},forecast:{title:`Tahmin`,noSpools:`Aktif makara bulunamadı. Tahmin verisini görmek için envanterinize makara ekleyin.`,noUsageData:`Kullanım verisi mevcut değil — stok zaman çizelgesi öngörülemiyor.`,sku:`SKU`,material:`Malzeme`,stock:`Stok`,dailyRate:`Oran`,daysLeft:`Kalan Gün`,emptyBy:`Şu Tarihte Boş`,reorderBy:`Şu Tarihte Sipariş`,actions:`İşlemler`,trend:`Trend`,estimated:`Tahmini`,noData:`Veri yok`,timeframe:`Zaman Aralığı`,chartTitle:`Öngörülen Stok — İlk 5 Malzeme`,dashedLinesROP:`Kesik çizgiler = yeniden sipariş noktaları`,stockLevel:`Stok Seviyesi`,reorderPoint:`Yeniden Sipariş Noktası`,safetyMargin:`Güvenlik Marjı`,trendLegend:`Trend (geçmiş tabanlı, %95 servis seviyesi)`,estimatedLegend:`Tahmini (ağırlık farkı)`,noDataLegend:`Veri yok`,ropLabel:`ROP`,ssLabel:`SS`,safetyStockLegend:`Güvenlik stoku`,stockArrivalLegend:`Stok varışı`,stockoutLegend:`Stok tükenmesi`,alertCount_one:`{{count}} uyarı`,alertCount_other:`{{count}} uyarı`,order:`Sipariş`,save:`Kaydet`,cancel:`İptal`,settingsSaved:`Ayarlar kaydedildi`,failedSaveSettings:`Ayarlar kaydedilemedi`,globalLeadTimeSaved:`Global teslim süresi kaydedildi`,globalLeadTime:`Global teslim süresi`,globalLeadTimeHint:`Global teslim süresi tabanı — tüm SKU'lar için yeniden sipariş noktası hesaplamasında kullanılır`,skuLeadTimeOverride:`SKU Teslim Süresi Geçersiz Kılma`,skuLeadTimeHint:`0 = global teslim süresini kullan. Bu SKU için geçersiz kılmak için >0 ayarlayın.`,safetyMarginLabel:`Güvenlik Marjı`,effectiveLeadTime:`Etkili Teslim Süresi`,effectiveLeadTimeHint:`max(global {{global}}g, SKU {{sku}}g)`,reorderPointHint:`d̄ × LT + güvenlik marjı — stok bu seviyeye geldiğinde sipariş ver`,safetyMarginHint:`İstatistiksel güvenlik stoku (z=1.65 × σ × √LT) + kullanıcı tanımlı tampon`,safetyMarginHintDays:`İstatistiksel güvenlik stokunun üzerine eklenen tampon.{{approx}}`,safetyMarginHintDaysApprox:` ≈ mevcut oranda {{g}}g.`,safetyMarginHintG:`İstatistiksel güvenlik stokunun üzerine eklenen sabit ağırlık tamponu.{{approx}}`,safetyMarginHintGApprox:` ≈ mevcut oranda {{days}}g.`,individualSpools:`Bireysel makaralar`,labelWeight:`Etiket`,spoolCount_one:`{{count}} makara`,spoolCount_other:`{{count}} makara`,stockBreakRisk:`Stok tükenme riski`,stockBreakDetail:`{{days}}g kaldı, teslim süresi {{lt}}g.`,stockBreakBefore:`Yenileme öncesi stok tükenmesi`,reorderNow:`Şimdi sipariş ver`,reorderTriggerPassed:`Tetikleyici tarih {{date}} geçti.`,shoppingList:`Alışveriş Listesi`,shoppingListItems_one:`({{count}} öğe)`,shoppingListItems_other:`({{count}} öğe)`,shoppingListEmpty:`Alışveriş listesi boş. Öğe eklemek için herhangi bir satırdaki sepet simgesine tıklayın.`,addToCart:`Alışveriş listesine ekle`,alertsSnoozed:`Bu SKU için uyarıları sustur`,alertsEnabled:`Bu SKU için uyarıları aç`,addedToCart:`Alışveriş listesine eklendi`,failedAddItem:`Öğe eklenemedi`,listView:`Liste`,logisticsView:`Lojistik`,qty:`Adet`,weight:`Ağırlık`,leadTime:`Teslim Süresi`,expectedRestock:`Beklenen Yenileme`,status:`Durum`,note:`Not`,pending:`Beklemede`,purchased:`Satın Alındı`,received:`Teslim Alındı`,markPurchased:`Satın alındı olarak işaretle`,markReceived:`Teslim alındı olarak işaretle — makaraları Stok envanterine ekler`,resetToPending:`Beklemeye sıfırla`,remove:`Kaldır`,clearAll:`Tümünü temizle`,downloadCsv:`CSV`,addToCartTitle:`Alışveriş Listesine Ekle`,byQuantity:`Miktara Göre`,byDuration:`Süreye Göre`,numberOfSpools:`Makara sayısı`,lastHowManyDays:`Kaç gün dayanmalı?`,noUsageQty:`Kullanım verisi yok — miktar 1 olarak ayarlandı.`,noteOptional:`Not (isteğe bağlı)`,notePlaceholder:`örn. X projesi için, acil…`,addNSpools_one:`{{count}} makara ekle`,addNSpools_other:`{{count}} makara ekle`,onArrival:`Varışta`,stockBreakIn:`{{days}}g içinde stok tükenmesi.`,stockRunsOutBefore:`{{lt}}g teslim süresi dolmadan önce stok tükenir.`,atRate:`{{rate}}g/gün oranında size gerekli`,moreSpools_one:`{{count}} daha makara`,moreSpools_other:`{{count}} daha makara`,bridgeGap:`boşluğu kapatmak için.`,noReadAccess:`Envanter tahminlerini görüntüleme izniniz yok.`,noWriteAccess:`Tahmin ayarlarını değiştirme izniniz yok.`}}}},Tt=[`en`,`de`,`es`,`fr`,`ja`,`it`,`ko`,`pt-BR`,`tr`,`zh-CN`,`zh-TW`],Et=`bambuddy_appliance_locale_consumed`;De.use(Ct).use(Ke).init({resources:wt,fallbackLng:`en`,supportedLngs:Tt,detection:{order:[`localStorage`,`navigator`,`htmlTag`],lookupLocalStorage:`bambutrack_language`,caches:[`localStorage`]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});function Dt(){if(typeof window>`u`||!window.localStorage)return;let e=window.localStorage;typeof e.getItem!=`function`||typeof e.setItem!=`function`||e.getItem(Et)||fetch(`/api/v1/system/appliance`).then(e=>e.ok?e.json():null).then(t=>{!t||typeof t.locale!=`string`||Tt.includes(t.locale)&&(De.changeLanguage(t.locale),e.setItem(Et,`1`))}).catch(()=>{})}Dt();var Ot=[{code:`en`,name:`English`,nativeName:`English`},{code:`de`,name:`German`,nativeName:`Deutsch`},{code:`es`,name:`Spanish`,nativeName:`Español`},{code:`fr`,name:`French`,nativeName:`Français`},{code:`ja`,name:`Japanese`,nativeName:`日本語`},{code:`it`,name:`Italian`,nativeName:`Italiano`},{code:`ko`,name:`Korean`,nativeName:`한국어`},{code:`pt-BR`,name:`Portuguese (Brazil)`,nativeName:`Português (Brasil)`},{code:`zh-CN`,name:`Chinese (Simplified)`,nativeName:`简体中文`},{code:`zh-TW`,name:`Chinese (Traditional)`,nativeName:`繁體中文`},{code:`tr`,name:`Turkish`,nativeName:`Türkçe`}],kt=`modulepreload`,At=function(e){return`/`+e},jt={},Mt=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=At(t,n),t in jt)return;jt[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:kt,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},G=`popstate`;function Nt(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function Pt(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return zt(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:Bt(t)}return Ht(t,n,null,e)}function Ft(e,t){if(e===!1||e==null)throw Error(t)}function It(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function Lt(){return Math.random().toString(36).substring(2,10)}function Rt(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function zt(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?Vt(t):t,state:n,key:t&&t.key||r||Lt(),mask:i}}function Bt({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function Vt(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function Ht(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=Nt(e)?e:zt(h.location,e,t);n&&n(r,e),l=u()+1;let d=Rt(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=Nt(e)?e:zt(h.location,e,t);n&&n(r,e),l=u();let i=Rt(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return Ut(i,e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(G,d),c=e,()=>{i.removeEventListener(G,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function Ut(e,t,n=!1){let r=`http://localhost`;e&&(r=e.location.origin===`null`?e.location.href:e.location.origin),Ft(r,`No window.location.(origin|href) available to create URL`);let i=typeof t==`string`?t:Bt(t);return i=i.replace(/ $/,`%20`),!n&&i.startsWith(`//`)&&(i=r+i),new URL(i,r)}function Wt(e,t,n=`/`){return Gt(e,t,n,!1)}function Gt(e,t,n,r,i){let a=dn((typeof t==`string`?Vt(t):t).pathname||`/`,n);if(a==null)return null;let o=i??qt(e),s=null,c=un(a);for(let e=0;s==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;Ft(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=bn([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(Ft(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),Jt(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:an(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of Yt(e.path))a(e,t,!0,n)}),t}function Yt(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=Yt(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function Xt(e){e.sort((e,t)=>e.score===t.score?on(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var Zt=/^:[\w-]+$/,Qt=3,$t=2,en=1,tn=10,nn=-2,rn=e=>e===`*`;function an(e,t){let n=e.split(`/`),r=n.length;return n.some(rn)&&(r+=nn),t&&(r+=$t),n.filter(e=>!rn(e)).reduce((e,t)=>e+(Zt.test(t)?Qt:t===``?en:tn),r)}function on(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function sn(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function ln(e,t=!1,n=!0){It(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function un(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return It(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function dn(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var fn=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function pn(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?Vt(e):e,a;return n?(n=yn(n),a=n.startsWith(`/`)?mn(n.substring(1),`/`):mn(n,t)):a=t,{pathname:a,search:Cn(r),hash:wn(i)}}function mn(e,t){let n=xn(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function hn(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function gn(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function _n(e){let t=gn(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function vn(e,t,n,r=!1){let i;typeof e==`string`?i=Vt(e):(i={...e},Ft(!i.pathname||!i.pathname.includes(`?`),hn(`?`,`pathname`,`search`,i)),Ft(!i.pathname||!i.pathname.includes(`#`),hn(`#`,`pathname`,`hash`,i)),Ft(!i.search||!i.search.includes(`#`),hn(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=pn(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var yn=e=>e.replace(/\/\/+/g,`/`),bn=e=>yn(e.join(`/`)),xn=e=>e.replace(/\/+$/,``),Sn=e=>xn(e).replace(/^\/*/,`/`),Cn=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,wn=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,Tn=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function En(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Dn(e){return bn(e.map(e=>e.route.path).filter(Boolean))||`/`}var On=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function kn(e,t){let n=e;if(typeof n!=`string`||!fn.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(On)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=dn(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{It(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var An=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(An);var jn=[`GET`,...An];new Set(jn);var Mn=y.createContext(null);Mn.displayName=`DataRouter`;var Nn=y.createContext(null);Nn.displayName=`DataRouterState`;var Pn=y.createContext(!1);function Fn(){return y.useContext(Pn)}var In=y.createContext({isTransitioning:!1});In.displayName=`ViewTransition`;var Ln=y.createContext(new Map);Ln.displayName=`Fetchers`;var Rn=y.createContext(null);Rn.displayName=`Await`;var zn=y.createContext(null);zn.displayName=`Navigation`;var Bn=y.createContext(null);Bn.displayName=`Location`;var Vn=y.createContext({outlet:null,matches:[],isDataRoute:!1});Vn.displayName=`Route`;var Hn=y.createContext(null);Hn.displayName=`RouteError`;var Un=`REACT_ROUTER_ERROR`,Wn=`REDIRECT`,Gn=`ROUTE_ERROR_RESPONSE`;function Kn(e){if(e.startsWith(`${Un}:${Wn}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function qn(e){if(e.startsWith(`${Un}:${Gn}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new Tn(t.status,t.statusText,t.data)}catch{}}function Jn(e,{relative:t}={}){Ft(Yn(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=y.useContext(zn),{hash:i,pathname:a,search:o}=ar(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:bn([n,a])),r.createHref({pathname:s,search:o,hash:i})}function Yn(){return y.useContext(Bn)!=null}function Xn(){return Ft(Yn(),`useLocation() may be used only in the context of a component.`),y.useContext(Bn).location}var Zn=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function Qn(e){y.useContext(zn).static||y.useLayoutEffect(e)}function $n(){let{isDataRoute:e}=y.useContext(Vn);return e?wr():er()}function er(){Ft(Yn(),`useNavigate() may be used only in the context of a component.`);let e=y.useContext(Mn),{basename:t,navigator:n}=y.useContext(zn),{matches:r}=y.useContext(Vn),{pathname:i}=Xn(),a=JSON.stringify(_n(r)),o=y.useRef(!1);return Qn(()=>{o.current=!0}),y.useCallback((r,s={})=>{if(It(o.current,Zn),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=vn(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:bn([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}var tr=y.createContext(null);function nr(){return y.useContext(tr)}function rr(e){let t=y.useContext(Vn).outlet;return y.useMemo(()=>t&&y.createElement(tr.Provider,{value:e},t),[t,e])}function ir(){let{matches:e}=y.useContext(Vn);return e[e.length-1]?.params??{}}function ar(e,{relative:t}={}){let{matches:n}=y.useContext(Vn),{pathname:r}=Xn(),i=JSON.stringify(_n(n));return y.useMemo(()=>vn(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function or(e,t){return sr(e,t)}function sr(e,t,n){Ft(Yn(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=y.useContext(zn),{matches:i}=y.useContext(Vn),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;Er(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
+ON değeri: "ON" anlamına gelen tam string. Otomatik algılama için boş bırakın (ON, true, 1).`,restControl:`Kontrol`,restOnUrl:`AÇ URL'si`,restOffUrl:`KAPAT URL'si`,restOnBody:`AÇ İstek Gövdesi`,restOffBody:`KAPAT İstek Gövdesi`,restMethod:`HTTP Yöntemi`,restHeaders:`Özel Başlıklar (JSON)`,restStatusUrl:`Durum URL'si`,restStatusPath:`Durum JSON Yolu`,restStatusOnValue:`ON Değeri`,restPowerUrl:`Güç URL'si`,restPowerPath:`Güç JSON Yolu`,restPowerMultiplier:`Güç Çarpanı`,restEnergyUrl:`Enerji URL'si`,restEnergyPath:`Enerji JSON yolu (bugün)`,restEnergyTotalPath:`Enerji JSON yolu (toplam sayaç)`,restEnergyTotalMultiplier:`Toplam sayaç çarpanı`,restEnergyTotalPathHint:`örn. aenergy.total`,restEnergyTotalHint:`Birçok priz — tüm Shelly'ler dahil — yalnızca hiç sıfırlanmayan bir toplam sayaç bildirir. Bu değer yukarıdaki alana değil, buraya girilmelidir: bugünün tüketimi olarak okunursa gece yarısı sıfırlanmaz, Dün ve Toplam da boş kalır. Bambuddy Bugün ve Dün değerlerini bundan hesaplar; bunun için bir iki günlük ölçüm gerekir. Shelly watt-saat bildirdiğinden çarpan olarak 0.001 kullanın.`,restEnergyMultiplier:`Enerji Çarpanı`,restUrlRequired:`REST prizleri için en az bir URL (ON veya OFF) gerekli`,restHeadersHint:`örn. {"Authorization": "Bearer your-token"}`,restBodyHint:`örn. ON, {"state": "on"}`,restStatusHint:`Mevcut durumu sorgulamak için URL`,restPathHint:`örn. state veya data.power.status`,restPowerUrlHint:`Güç verisi için ayrı URL (boşsa Durum URL'sini kullanır)`,restEnergyUrlHint:`Enerji verisi için ayrı URL (boşsa Durum URL'sini kullanır)`,restEnergyHint:`Her değer kendi URL'sini kullanabilir veya Durum URL'sine geri dönebilir. Birim dönüşümü için çarpanları kullanın (örn. Wh'yi kWh'ye dönüştürmek için 0.001).`,testConnection:`Bağlantıyı Test Et`,connectionSuccess:`Bağlantı başarılı`,noSwitchesInSwitchbar:`Anahtar çubuğunda anahtar yok`,enableSwitchbarHint:`Ayarlar > Akıllı Prizler'de "Anahtar Çubuğunda Göster"i etkinleştirin`},notifications:{providerTypes:{callmebot:`CallMeBot/WhatsApp`,ntfy:`ntfy`,pushover:`Pushover`,telegram:`Telegram`,email:`E-posta`,discord:`Discord`,webhook:`Webhook`,homeassistant:`Home Assistant`},providerDescriptions:{email:`SMTP e-posta bildirimleri`,telegram:`Telegram botu üzerinden bildirimler`,discord:`Webhook üzerinden Discord kanalına gönder`,ntfy:`Ücretsiz, kendi barındırılabilir push bildirimleri`,pushover:`Basit, güvenilir push bildirimleri`,callmebot:`CallMeBot üzerinden ücretsiz WhatsApp bildirimleri`,webhook:`Herhangi bir URL'ye genel HTTP POST`,homeassistant:`Home Assistant gösterge panelinde kalıcı bildirimler`},lastSuccess:`Son: {{date}}`,error:`Hata`,printer:`Yazıcı:`,allPrinters:`Tüm yazıcılar`,sendTestNotification:`Test Bildirimi Gönder`,eventSettings:`Olay Ayarları`,enabled:`Etkin`,sendFromProvider:`Bu sağlayıcıdan bildirim gönder`,printEvents:`Baskı Olayları`,printerStatus:`Yazıcı Durumu`,amsAlarms:`AMS Alarmları`,amsHtAlarms:`AMS-HT Alarmları`,printQueue:`Baskı Kuyruğu`,start:`Başlangıç`,plateCheck:`Plaka Kontrolü`,complete:`Tamamlandı`,failed:`Başarısız`,stopped:`Durduruldu`,progress:`İlerleme`,offline:`Çevrimdışı`,lowFilament:`Az Filament`,maintenance:`Bakım`,amsHumidity:`AMS Nemi`,amsTemp:`AMS Sıcaklığı`,amsHtHumidity:`AMS-HT Nemi`,amsHtTemp:`AMS-HT Sıcaklığı`,bedCooled:`Tabla Soğudu`,firstLayer:`İlk Katman`,quiet:`Sessiz`,digest:`Özet {{time}}`,printStarted:`Baskı Başladı`,plateNotEmpty:`Plaka Boş Değil`,plateNotEmptyDescription:`Baskıdan önce nesneler algılandı`,printCompleted:`Baskı Tamamlandı`,bedCooledLabel:`Tabla Soğudu`,bedCooledDescription:`Baskıdan sonra tabla eşiğin altına soğudu`,firstLayerCompleteLabel:`İlk Katman Tamamlandı`,firstLayerCompleteDescription:`İlk katman bittiğinde anlık görüntüyle bildir`,missingSpoolAssignmentLabel:`Eksik Makara Ataması`,missingSpoolAssignmentDescription:`Baskı başladığında ve gerekli tepsilerin atanmış makarası olmadığında bildir`,printFailed:`Baskı Başarısız`,printStopped:`Baskı Durduruldu`,progressMilestones:`İlerleme Kilometre Taşları`,progressMilestonesDescription:`%25, %50, %75'te bildir`,printerOffline:`Yazıcı Çevrimdışı`,printerError:`Yazıcı Hatası`,aiFailureDetection:`AI Hata Tespiti`,aiFailureDetectionDescription:`Obico AI olası bir baskı hatası tespit ettiğinde bildir`,lowFilamentLabel:`Az Filament`,maintenanceDue:`Bakım Zamanı`,maintenanceDueDescription:`Bakım gerektiğinde bildir`,amsHumidityHigh:`AMS Nemi Yüksek`,amsHumidityHighDescription:`Normal AMS nemi eşiği aşıyor`,amsTemperatureHigh:`AMS Sıcaklığı Yüksek`,amsTemperatureHighDescription:`Normal AMS sıcaklığı eşiği aşıyor`,amsHtHumidityHigh:`AMS-HT Nemi Yüksek`,amsHtHumidityHighDescription:`AMS-HT nemi eşiği aşıyor`,amsHtTemperatureHigh:`AMS-HT Sıcaklığı Yüksek`,amsHtTemperatureHighDescription:`AMS-HT sıcaklığı eşiği aşıyor`,inventoryAlerts:`Envanter Uyarıları`,stockReorderAlert:`Yeniden Sipariş Uyarısı`,stockReorderAlertDescription:`SKU yeniden sipariş noktasına ulaştı`,stockBreakAlert:`Stok Tükenme Uyarısı`,stockBreakAlertDescription:`Yenileme gelmeden stok tükenecek`,jobAdded:`İş Eklendi`,jobAddedDescription:`İş kuyruğa eklendi`,jobAssigned:`İş Atandı`,jobAssignedDescription:`Model tabanlı iş yazıcıya atandı`,jobStarted:`İş Başladı`,jobStartedDescription:`Kuyruk işi yazdırmaya başladı`,jobWaiting:`İş Bekliyor`,jobWaitingDescription:`İş filament veya yazıcı için bekliyor`,jobSkipped:`İş Atlandı`,jobSkippedDescription:`İş atlandı (önceki başarısız oldu)`,jobFailed:`İş Başarısız`,jobFailedDescription:`İş başlatılamadı`,queueComplete:`Kuyruk Tamamlandı`,queueCompleteDescription:`Tüm kuyruk işleri bitti`,quietHours:`Sessiz Saatler`,noNotificationsDuring:`Bu saatler arasında bildirim yok`,editProviderToChangeQuietHours:`Sessiz saatleri değiştirmek için sağlayıcıyı düzenleyin`,dailyDigest:`Günlük Özet`,batchNotifications:`Bildirimleri tek bir günlük özette topla`,sendAt:`{{time}}'de gönder`,editProviderToChangeDigestTime:`Özet saatini değiştirmek için sağlayıcıyı düzenleyin`,edit:`Düzenle`,deleteProvider:`Bildirim Sağlayıcısını Sil`,deleteConfirm:`"{{name}}" silmek istediğinizden emin misiniz? Bu geri alınamaz.`,delete:`Sil`,addTitle:`Bildirim Sağlayıcısı Ekle`,editTitle:`Bildirim Sağlayıcısını Düzenle`,nameLabel:`Ad *`,namePlaceholder:`Bildirimlerim`,providerTypeLabel:`Sağlayıcı Türü *`,configuration:`Yapılandırma`,testConfiguration:`Yapılandırmayı Test Et`,printerFilter:`Yazıcı Filtresi`,onlyFromPrinter:`Yalnızca bu yazıcının olayları için bildirim gönder`,quietHoursDnd:`Sessiz Saatler (Rahatsız Etme)`,quietStart:`Başlangıç`,quietEnd:`Bitiş`,dailyDigestLabel:`Günlük Özet`,sendDigestAt:`Özeti şu saatte gönder`,digestCollected:`Olaylar toplanacak ve bu saatte tek bir özet olarak gönderilecek`,notificationEvents:`Bildirim Olayları`,progressPercent:`(%25, %50, %75)`,bedCooledAfterPrint:`(baskı tamamlandıktan sonra)`,eventPriority:{sectionTitle:`ntfy Önceliği`,helpNtfy:`Her etkin olay için bir öncelik seçin. ntfy uyarıları kademelendirmek için bunları kullanır (ses, görünürlük, push davranışı). Burada ayarlanmamış seviyeler ntfy sunucu varsayılanını kullanır.`,min:`Min`,low:`Düşük`,default:`Varsayılan`,high:`Yüksek`,urgent:`Acil`},cancel:`İptal`,save:`Kaydet`,add:`Ekle`,nameRequired:`Ad gerekli`,fieldRequired:`{{field}} gerekli`,phoneNumber:`Telefon Numarası`,apiKey:`API Anahtarı`,serverUrl:`Sunucu URL`,topic:`Konu`,authToken:`Yetkilendirme Belirteci`,userKey:`Kullanıcı Anahtarı`,appToken:`Uygulama Belirteci`,priority:`Öncelik`,pushoverRetry:`Acil yeniden deneme (sn)`,pushoverExpire:`Acil sona erme (sn)`,botToken:`Bot Belirteci`,chatId:`Sohbet ID`,smtpServer:`SMTP Sunucusu`,smtpPort:`SMTP Portu`,security:`Güvenlik`,authentication:`Kimlik Doğrulama`,username:`Kullanıcı Adı`,password:`Parola`,fromEmail:`Gönderen E-posta`,toEmail:`Alıcı E-posta`,webhookUrl:`Webhook URL`,payloadFormat:`Yük Formatı`,authorization:`Yetkilendirme`,titleFieldName:`Başlık Alanı Adı`,messageFieldName:`Mesaj Alanı Adı`,editTemplate:`Şablonu Düzenle: {{name}}`,titleLabel:`Başlık`,bodyLabel:`Gövde`,titlePlaceholder:`Bildirim başlığı...`,bodyPlaceholder:`Bildirim gövdesi...`,availableVariables:`Kullanılabilir Değişkenler`,clickToInsert:`Gövdede imleç konumuna eklemek için tıklayın`,livePreview:`Canlı Önizleme`,hide:`Gizle`,show:`Göster`,loadingPreview:`Önizleme yükleniyor...`,enterTemplateContent:`Önizlemeyi görmek için şablon içeriğini girin`,titlePreview:`Başlık:`,bodyPreview:`Gövde:`,resetToDefault:`Varsayılana Sıfırla`,titleRequired:`Başlık gerekli`,bodyRequired:`Gövde gerekli`,notificationLog:`Bildirim Günlüğü`,showFailedOnly:`Yalnızca başarısız`,last24Hours:`Son 24 saat`,last7Days:`Son 7 gün`,last30Days:`Son 30 gün`,last90Days:`Son 90 gün`,justNow:`Az önce`,noFailedNotifications:`Başarısız bildirim yok`,noNotificationsLogged:`Kaydedilen bildirim yok`,unknownProvider:`Bilinmeyen Sağlayıcı`,logTitle:`Başlık`,logMessage:`Mesaj`,logError:`Hata`,logProvider:`Sağlayıcı: {{type}}`,logTime:`Saat: {{time}}`,refresh:`Yenile`,clearOld:`Eskileri Temizle`,statsSummary:`Son {{days}} gün:`,statsNotifications:`bildirim`,statsSent:`{{count}} gönderildi`,statsFailed:`{{count}} başarısız`,eventTypes:{print_start:`Baskı Başladı`,print_complete:`Baskı Tamamlandı`,print_failed:`Baskı Başarısız`,print_stopped:`Baskı Durduruldu`,print_progress:`İlerleme`,printer_offline:`Yazıcı Çevrimdışı`,printer_error:`Yazıcı Hatası`,filament_low:`Az Filament`,maintenance_due:`Bakım Zamanı`,test:`Test`},userEmail:{title:`Bildirimler`,emailNotifications:`E-posta Bildirimleri`,emailNotificationsDesc:`Kendi baskı işleriniz için e-posta bildirimleri alın. E-postalar Gelişmiş Kimlik Doğrulamada yapılandırılan sistem SMTP ayarları kullanılarak gönderilir.`,sendingTo:`Bildirimler şuraya gönderilecek`,noEmailWarning:`Hesabınızın e-posta adresi yok. Eklemek için bir yöneticiyle iletişime geçin.`,printJobNotifications:`Baskı İşi Bildirimleri`,printJobNotificationsDesc:`Gönderdiğiniz baskı işleri için hangi olayların e-posta bildirimlerini tetikleyeceğini seçin.`,printJobStarts:`Baskı İşi Başlar`,printJobStartsDesc:`Baskı işiniz başladığında bildirim alın.`,printJobFinishes:`Baskı İşi Biter`,printJobFinishesDesc:`Baskı işiniz başarıyla tamamlandığında bildirim alın.`,printErrors:`Baskı Hataları`,printErrorsDesc:`Baskı işiniz başarısız olduğunda veya bir hatayla karşılaştığında bildirim alın.`,printJobStops:`Baskı İşi Durur`,printJobStopsDesc:`Baskı işiniz iptal edildiğinde veya durdurulduğunda bildirim alın.`,saveSuccess:`Bildirim tercihleri kaydedildi.`,saveError:`Bildirim tercihleri kaydedilemedi.`}},richTextEditor:{bold:`Kalın`,italic:`İtalik`,underline:`Altı Çizili`,bulletList:`Madde İşaretli Liste`,numberedList:`Numaralı Liste`,alignLeft:`Sola Hizala`,alignCenter:`Ortaya Hizala`,alignRight:`Sağa Hizala`,addLink:`Bağlantı Ekle`,removeLink:`Bağlantıyı Kaldır`},externalLinks:{title:`Kenar çubuğu bağlantıları`,sidebarLayout:`Kenar çubuğu`,sidebarLayoutDescription:`Yerleşik sayfaları gösterin veya gizleyin, harici bağlantılar ekleyin ve kenar çubuğu gezinmesini yeniden sıralamak için öğeleri sürükleyin.`,systemPages:`Bambuddy sayfaları`,externalLinks:`Harici bağlantılar`,visibleInSidebar:`Kenar çubuğunda görünür`,hiddenFromSidebar:`Kenar çubuğunda gizli`,requiredInSidebar:`Kenar çubuğunda gerekli`,hidePage:`Sayfayı gizle`,showPage:`Sayfayı göster`,settingsCannotBeHidden:`Ayarlar gizlenemez`,noLinksConfigured:`Yapılandırılmış harici bağlantı yok`,deleteLink:`Bağlantıyı Sil`,removeCustomIcon:`Özel simgeyi kaldır`,openInNewTab:`Yeni sekmede aç`,placeholders:{linkName:`Bağlantım`}},keyboardShortcuts:{title:`Klavye Kısayolları`,navigation:`Navigasyon`,archivesSection:`Arşivler`,kProfilesSection:`K-Profilleri`,generalSection:`Genel`,shortcuts:{goToPrinters:`Yazıcılara Git`,goToArchives:`Arşivlere Git`,goToQueue:`Kuyruğa Git`,goToStats:`İstatistiklere Git`,goToProfiles:`Bulut Profillerine Git`,goToSettings:`Ayarlara Git`,focusSearch:`Aramaya odaklan`,openUploadModal:`Yükleme modalini aç`,clearSelection:`Seçimi temizle / odağı kaldır`,contextMenu:`Kartlarda bağlam menüsü`,refreshProfiles:`Profilleri yenile`,newProfile:`Yeni profil`,exitSelectionMode:`Seçim modundan çık`,showHelp:`Bu yardımı göster`},footer:`Kapatmak için Esc'ye basın veya dışarı tıklayın`},notificationLog:{title:`Bildirim Günlüğü`,events:{printStarted:`Baskı Başladı`,printComplete:`Baskı Tamamlandı`,printFailed:`Baskı Başarısız`,printStopped:`Baskı Durduruldu`,progress:`İlerleme`,printerOffline:`Yazıcı Çevrimdışı`,printerError:`Yazıcı Hatası`,lowFilament:`Az Filament`,maintenanceDue:`Bakım Zamanı`,test:`Test`},timeAgo:{justNow:`Az önce`,minutesAgo:`{{minutes}}dk önce`,hoursAgo:`{{hours}}sa önce`}},restoreBackup:{title:`Yedeği Geri Yükle`,restoring:`Geri yükleniyor...`,restoreComplete:`Geri Yükleme Tamamlandı`,restoreFailed:`Geri Yükleme Başarısız`,importSettings:`Ayarları bir yedek dosyasından içe aktar`,pleaseWait:`Verileriniz geri yüklenirken lütfen bekleyin`,clickToSelect:`Yedek dosyası seçmek için tıklayın (.json veya .zip)`,howDuplicateHandling:`Yinelenen yönetiminin nasıl çalıştığı:`,categories:{printers:`Yazıcılar`,smartPlugs:`Akıllı Prizler`,notificationProviders:`Bildirim Sağlayıcıları`,filaments:`Filamentler`,archives:`Arşivler`,pendingUploads:`Bekleyen Yüklemeler`,settingsTemplates:`Ayarlar ve Şablonlar`},matchingInfo:{printers:`seri numarasına göre eşleşti`,smartPlugs:`IP adresine göre eşleşti`,notificationProviders:`ada göre eşleşti`,filaments:`ad + tür + markaya göre eşleşti`,archives:`içerik hash'ine göre eşleşti`,pendingUploads:`dosya adına göre eşleşti`,settingsTemplates:`her zaman üzerine yazılır`},replaceExisting:`Mevcut veriyi değiştir`,keepExisting:`Mevcut veriyi koru`,replaceDescription:`Zaten mevcut olan öğeleri yedek verisiyle üzerine yaz`,keepDescription:`Yalnızca zaten mevcut olmayan öğeleri geri yükle`,caution:`Dikkat:`,cautionText:`Üzerine yazma, mevcut yapılandırmalarınızı yedek verisiyle değiştirecek. Güvenlik için yazıcı erişim kodları asla üzerine yazılmaz.`,itemsRestored:`Geri Yüklenen Öğeler`,itemsSkipped:`Atlanan Öğeler`,restored:`Geri yüklendi`,skipped:`Atlandı (zaten mevcut)`,filesLabel:`Dosyalar (3MF, küçük resimler, vb.)`,newApiKeysGenerated:`Yeni API Anahtarları Oluşturuldu`,newApiKeysWarning:`Bu anahtarlar yalnızca bir kez gösterilir. Şimdi kopyalayın!`,processingBackup:`Yedek dosyası işleniyor...`,noDataFound:`Yedek dosyasında geri yüklenecek veri bulunamadı.`,failedToRestore:`Yedek geri yüklenemedi. Lütfen dosya formatını kontrol edin.`},backupExport:{title:`Yedeği Dışa Aktar`,selectData:`Dahil edilecek veriyi seçin`,selectAll:`Tümünü Seç`,selectNone:`Hiçbirini Seçme`,categoryDescriptions:{settings:`Dil, tema, güncelleme tercihleri`,notifications:`ntfy, Pushover, Discord, vb.`,templates:`Özel mesaj şablonları`,smartPlugs:`Tasmota priz yapılandırmaları`,externalLinks:`Harici servislere kenar çubuğu bağlantıları`,printers:`Yazıcı bilgisi (erişim kodları hariç)`,plateDetection:`Boş plaka referans görüntüleri`,filaments:`Filament türleri ve maliyetleri`,maintenance:`Özel bakım programları`,archives:`Tüm baskı verileri + dosyalar (3MF, küçük resimler, fotoğraflar)`,projects:`Projeler, BOM öğeleri ve ekler`,pendingUploads:`İnceleme bekleyen sanal yazıcı yüklemeleri`,apiKeys:`Webhook API anahtarları (içe aktarımda yeni anahtarlar oluşturulur)`},requiresPrinters:`Yazıcıların seçili olması gerekir`,zipFileWarning:`ZIP dosyası oluşturulacak.`,zipFileDescription:`Tüm 3MF dosyalarını, küçük resimleri, zaman atlamalı videoları ve fotoğrafları içerir. Bu biraz zaman alabilir ve büyük bir dosya oluşturabilir.`,includeAccessCodes:`Erişim Kodlarını Dahil Et`,includeAccessCodesDescription:`Başka bir makineye aktarmak için`,includeAccessCodesWarning:`Erişim kodları düz metin olarak dahil edilecek. Bu yedek dosyasını güvende tutun!`,categoriesSelected:`{{selectedCount}} kategori seçildi`},pendingUploads:{placeholders:{notes:`Bu baskı hakkında notlar ekleyin...`},discardUpload:`Yüklemeyi At`,archiveAllUploads:`Tüm Yüklemeleri Arşivle`,discardAllUploads:`Tüm Yüklemeleri At`,archive:`Arşivle`,timeAgo:{justNow:`Az önce`,minutesAgo:`{{minutes}}dk önce`,hoursAgo:`{{hours}}sa önce`,daysAgo:`{{days}}g önce`}},apiBrowser:{placeholders:{requestBody:`JSON istek gövdesi...`,searchEndpoints:`Uç noktalarda ara...`}},configureAmsSlot:{title:`AMS Yuvasını Yapılandır`,slotConfigured:`Yuva Yapılandırıldı!`,configuringSlot:`Yuva yapılandırılıyor:`,slotLabel:`{{ams}} Yuva {{slot}}`,searchPresets:`Ön ayarlarda ara...`,colorPlaceholder:`Renk adı veya hex (örn., kahverengi, FF8800)`,clearCustomColor:`Özel rengi temizle`,noCloudPresets:`Bulut ön ayarı yok. Senkronize etmek için Bambu Cloud'a giriş yapın.`,noPresetsAvailable:`Kullanılabilir ön ayar yok. Bambu Cloud'a giriş yapın veya yerel profilleri içe aktarın.`,noMatchingPresets:`Eşleşen ön ayar bulunamadı.`,custom:`Özel`,builtin:`Yerleşik`,orcaCloud:`Orca Cloud`,bambuCloud:`Bambu Cloud`,settingsSentToPrinter:`Ayarlar yazıcıya gönderildi`,filamentProfile:`Filament Profili`,kProfileLabel:`K Profili (Basınç İlerlemesi)`,filteringFor:`Şu için filtreleniyor: {{material}}`,noKProfile:`K profili yok (varsayılan 0.020 kullan)`,noMatchingKProfiles:`Eşleşen K profili bulunamadı. Varsayılan K=0.020 kullanılacak.`,selectFilamentFirst:`Önce bir filament profili seçin`,kFromCalibration:`Yazıcı kalibrasyonundan K={{value}}`,customColorLabel:`Özel Renk (isteğe bağlı)`,presetColors:`{{name}} renkleri:`,showLessColors:`Daha az renk göster`,showMoreColors:`Daha fazla renk göster`,clear:`Temizle`,hexLabel:`Hex: #{{hex}}`,resetting:`Sıfırlanıyor...`,resetSlot:`Yuvayı Sıfırla`,cancel:`İptal`,configuring:`Yapılandırılıyor...`,configureSlot:`Yuvayı Yapılandır`},githubBackup:{title:`Git Yedekleme`,history:`Geçmiş`,downloadBackup:`Yedeği İndir`,restoreBackup:`Yedeği Geri Yükle`,noBackupsYet:`Henüz yedek yok`},emailSettings:{placeholders:{fromName:`BamBuddy`}},tagManagement:{searchTags:`Etiketlerde ara...`,renameTag:`Etiketi yeniden adlandır`,deleteTag:`Etiketi sil`},notificationTemplates:{placeholders:{title:`Bildirim başlığı...`,body:`Bildirim gövdesi...`}},batchTag:{placeholders:{newTag:`Yeni etiket girin...`}},photoGallery:{deletePhoto:`Fotoğrafı Sil`},filamentHoverCard:{copySpoolUuid:`Makara UUID'sini kopyala`},kProfilesView:{hasNote:`Notu var`,copyProfile:`Profili kopyala`},layout:{openMenu:`Menüyü aç`,noPermissionSystemInfo:`Sistem bilgisini görüntüleme izniniz yok`},dashboard:{dragToReorder:`Yeniden sıralamak için sürükleyin`,hideWidget:`Widget'ı gizle`},notificationProviderCard:{deleteNotificationProvider:`Bildirim Sağlayıcısını Sil`},fileManagerModal:{closeFileManager:`Dosya yöneticisini kapat`,sortFiles:`Dosyaları sırala`,goToParentFolder:`Üst klasöre git`,threeView:`3B Görünüm`},embeddedCameraViewer:{refreshStream:`Akışı yenile`,close:`Kapat`,zoomOut:`Uzaklaştır`,resetZoom:`Yakınlaştırmayı sıfırla`,zoomIn:`Yakınlaştır`,dragToResize:`Yeniden boyutlandırmak için sürükleyin`},timelapseViewer:{skipBack5s:`5 sn geri al`,skipForward5s:`5 sn ileri al`},notificationProviders:{descriptions:{email:`SMTP e-posta bildirimleri`,telegram:`Telegram botu üzerinden bildirimler`,discord:`Webhook üzerinden Discord kanalına gönder`,ntfy:`Ücretsiz, kendi barındırılabilir push bildirimleri`,pushover:`Basit, güvenilir push bildirimleri`,callmebot:`CallMeBot üzerinden ücretsiz WhatsApp bildirimleri`,webhook:`Herhangi bir URL'ye genel HTTP POST`}},logViewer:{searchPlaceholder:`Mesaj veya günlükçü adı ara...`,noLogEntries:`Günlük kaydı bulunamadı`},switchbarPopover:{noSwitchesInSwitchbar:`Anahtar çubuğunda anahtar yok`},projectPageModal:{placeholders:{title:`Başlık`,designer:`Tasarımcı`,license:`Lisans`,description:`Açıklama girin...`,profileTitle:`Profil Başlığı`,profileDescription:`Profil açıklaması...`}},spoolmanSettings:{},time:{unknown:`-`,waiting:`Bekliyor`,justNow:`Az önce`,now:`Şimdi`,minsAgo:`{{count}}dk önce`,inMins:`{{count}}dk sonra`,hoursAgo:`{{count}}sa önce`,inHours:`{{count}}sa sonra`,daysAgo:`{{count}}g önce`,inDays:`{{count}}g sonra`},spoolbuddy:{nav:{dashboard:`Gösterge Paneli`,ams:`AMS`,inventory:`Envanter`,writeTag:`Yaz`,settings:`Ayarlar`},status:{nfcReady:`NFC Hazır`,nfcOff:`NFC Kapalı`,offline:`Çevrimdışı`,online:`Çevrimiçi`,noPrinters:`Yazıcı yok`,deviceOffline:`Cihaz Çevrimdışı`,waitingConnection:`Cihaz bağlantısı bekleniyor...`,systemReady:`Sistem Hazır`,status:`Durum`},dashboard:{readyToScan:`Taramaya hazır`,idleMessage:`Tanımlamak için bir makarayı tartıya yerleştirin`,nfcHint:`NFC etiketi otomatik olarak okunacak`,device:`Cihaz`,syncWeight:`Ağırlığı Senkronize Et`,weightSynced:`Senkronize edildi!`,unknownTag:`Bilinmeyen Etiket`,newTag:`Yeni Etiket Algılandı`,onScale:`tartıda`,linkSpool:`Makaraya Bağla`,linkTagTitle:`Etiketi Makaraya Bağla`,linkTag:`Etiketi Bağla`,selectSpool:`Bu etiketi bağlamak için bir makara seçin:`,noUntagged:`Etiketsiz makara bulunamadı`,tagDetected:`Etiket algılandı`,noTag:`Etiket yok`,tagId:`Etiket`,grossWeight:`Brüt ağırlık`,spoolSize:`Makara boyutu`,close:`Kapat`,currentSpool:`Mevcut Makara`,plateReady:`Plaka hazır: {{name}}`,plateReadyLabel:`Temizlenmeye hazır plakalar`,plateClearAction:`Temizle`,plateClearedToast:`Plaka temizlendi olarak işaretlendi`,plateClearFailed:`Plaka temizlendi olarak işaretlenemedi`},modal:{spoolDetected:`Makara Algılandı`,assignToAms:`AMS'e Ata`,syncWeight:`Ağırlığı Senkronize Et`,weightSynced:`Senkronize edildi!`,syncing:`Senkronize ediliyor...`,newTagDetected:`Yeni Etiket Algılandı`,addToInventory:`Envantere Ekle`,assignToAmsTitle:`AMS'e Ata`,selectSlot:`Bir yuva seçin`,assign:`Ata`,assigning:`Atanıyor...`,assignSuccess:`Atandı!`,assignPendingInsert:`Atandı. Makarayı yerleştirdiğinizde yuva yapılandırılacak.`,assignError:`Makara atanamadı. Lütfen tekrar deneyin.`,noPrinterSelected:`Bir yazıcı seçin...`,noAmsDetected:`Bu yazıcıda AMS algılanmadı`,slot:`Yuva`},weight:{noReading:`Okuma yok`,stable:`Kararlı`,measuring:`Ölçülüyor...`,tare:`Dara`,calibrate:`Kalibre Et`},spool:{remaining:`Kalan`,material:`Malzeme`,brand:`Marka`,color:`Renk`,coreWeight:`Çekirdek`,labelWeight:`Etiket`,scaleWeight:`Tartı`,netWeight:`Net`,lastUsed:`Son kullanım`},ams:{noData:`AMS algılanmadı`,connectAms:`Filament yuvalarını görmek için bir AMS bağlayın`,noPrinter:`Yazıcı seçilmedi`,selectPrinter:`Üst çubuktan bir yazıcı seçin`,printerDisconnected:`Yazıcı bağlantısı kesildi`,humidity:`Nem`,level:`Seviye`,active:`Aktif`,slot:`Yuva`,empty:`Boş`},inventory:{search:`Makaralarda ara...`,empty:`Envanterde makara yok`,noResults:`Eşleşen makara yok`,spools:`makara`,addSpool:`Makara Ekle`},settings:{tabDevice:`Cihaz`,tabDisplay:`Görüntü`,tabScale:`Tartı`,tabUpdates:`Güncellemeler`,nfcReader:`NFC Okuyucu`,type:`Tür`,connection:`Bağlantı`,notConnected:`N/A`,deviceInfo:`Cihaz Bilgisi`,hostname:`Ana Bilgisayar`,uptime:`Çalışma Süresi`,systemConfig:`Arka Uç ve Kimlik Doğrulama`,backendUrl:`Bambuddy Arka Uç URL'si`,apiToken:`API Belirteci`,apiTokenPlaceholder:`API belirtecini girin`,saveConfig:`Yapılandırmayı Kaydet`,systemQueued:`Yapılandırma kuyruğa alındı.`,nfcDiagnostic:`NFC Tanılaması`,scaleDiagnostic:`Tartı Tanılaması`,readTagDiagnostic:`Etiket Okuma Tanılaması`,testNfc:`Okuyucuyu test et`,testScale:`Doğruluğu test et`,testReadTag:`Etiket oku`,systemFieldsRequired:`Arka uç URL'si gerekli.`,brightness:`Parlaklık`,saved:`Kaydedildi`,noBacklight:`DSI arka ışık algılanmadı. Parlaklık kontrolü DSI ekran gerektirir.`,screenBlank:`Ekran Kapanma Zaman Aşımı`,screenBlankDesc:`Hareketsizlik sonrası ekran kapanır. Uyandırmak için dokunun.`,displayNote:`Parlaklık bir yazılım filtresi olarak uygulanır.`,scaleCalibration:`Tartı Kalibrasyonu`,currentWeight:`Mevcut ağırlık`,tareOffset:`Dara`,calFactor:`Faktör`,knownWeight:`Bilinen ağırlık`,calStep1:`Tartıdan tüm öğeleri kaldırın ve Sıfır Ayarla'ya basın.`,calStep2:`Bilinen ağırlığı tartıya yerleştirin.`,setZero:`Sıfır Ayarla`,calibrateNow:`Kalibre Et`,calibrated:`Kalibre edildi`,tareSet:`Dara komutu gönderildi. Cihaz bekleniyor...`,tareComplete:`Dara tamam!`,tareTimedOut:`Dara zaman aşımına uğradı — SpoolBuddy daemon çalışıyor mu?`,tareFailed:`Dara komutu gönderilemedi`,zeroSet:`Sıfır noktası ayarlandı. Bilinen ağırlığı tartıya yerleştirin.`,calibrationDone:`Kalibrasyon tamamlandı!`,calibrationFailed:`Kalibrasyon başarısız`,lastCalibrated:`Son kalibrasyon`,stable:`Kararlı`,settling:`Sabitleniyor...`,firmware:`Firmware`,scale:`Tartı`,noDevice:`SpoolBuddy cihazı bulunamadı`,daemonVersion:`Daemon Sürümü`,currentVersion:`Mevcut`,versionPending:`Daemon bekleniyor...`,checking:`Kontrol ediliyor...`,checkUpdates:`Güncellemeleri Kontrol Et`,updateAvailable:`Güncelleme mevcut`,updateInstructions:`SSH üzerinden güncelle: yükseltmek için SpoolBuddy yükleme betiğini çalıştırın.`,upToDate:`Güncel`,includeBeta:`Beta sürümleri dahil et`},writeTag:{tabExisting:`Mevcut Makara`,tabNew:`Yeni Makara`,tabReplace:`Etiketi Değiştir`,searchPlaceholder:`Malzeme, renk, marka ile ara...`,noUntaggedSpools:`Etiketsiz makara yok`,noTaggedSpools:`Etiketli makara yok`,selectSpool:`Bir makara seçin, ardından okuyucuya boş bir NTAG yerleştirin`,placeTag:`Okuyucuya bir NTAG yerleştirin`,tagReady:`Etiket algılandı — yazmaya hazır`,writeTag:`Etiketi Yaz`,replaceTag:`Etiketi Değiştir`,writing:`Etiket yazılıyor...`,waiting:`SpoolBuddy bekleniyor...`,writeSuccess:`Etiket başarıyla yazıldı!`,writeFailed:`Yazma başarısız`,queueFailed:`Yazma komutu kuyruğa alınamadı`,tryAgain:`Tekrar Dene`,cancel:`İptal`,replaceWarning:`Eski etiket bağlantısı kaldırılacak. Yeni etiket yerini alacak.`,deviceOffline:`SpoolBuddy çevrimdışı`,material:`Malzeme`,colorName:`Renk Adı`,color:`Renk`,brand:`Marka`,weight:`Ağırlık (g)`,createSpool:`Makara Oluştur`,creating:`Oluşturuluyor...`,spoolCreated:`Makara oluşturuldu! Yazmaya hazır.`,createFailed:`Makara oluşturulamadı`,incompleteDataWarning:`Etiket eksik Spoolman verisiyle yazıldı`},quickMenu:{printerPower:`Yazıcı Gücü`,systemControls:`Sistem`,restartDaemon:`Daemon'u Yeniden Başlat`,restartBrowser:`Tarayıcıyı Yeniden Başlat`,reboot:`Yeniden Başlat`,shutdown:`Kapat`,swipeToClose:`Kapatmak için aşağı kaydır`,confirmTitle:`Onayla`,confirmShutdown:`SpoolBuddy'yi kapatmak istediğinizden emin misiniz? Tekrar açmak için fiziksel erişime ihtiyacınız olacak.`,confirmReboot:`SpoolBuddy'yi yeniden başlatmak istediğinizden emin misiniz?`,confirmRestartDaemon:`SpoolBuddy daemon yeniden başlatılsın mı? NFC ve tartı geçici olarak kullanılamayacak.`,confirmRestartBrowser:`Kiosk tarayıcısı yeniden başlatılsın mı? Ekran kısa bir süre kararacak.`,confirm:`Onayla`,confirmPlugOn:`{{name}} açılsın mı?`,confirmPlugOff:`{{name}} kapatılsın mı?`,turnOn:`Aç`,turnOff:`Kapat`}},diagnostic:{modalTitle:`Bağlantı tanılaması — {{name}}`,running:`Tanılama çalışıyor...`,runningElapsed:`Tanılama çalışıyor... ({{elapsed}}s)`,waitingForReportHint:`Yazıcının durum raporu yayınlamasını bekliyor — bu işlem en fazla {{max}} saniye sürebilir.`,runFailed:`Tanılama çalıştırılamadı: {{error}}`,retry:`Tekrar çalıştır`,runButton:`Tanılamayı çalıştır`,sectionTitle:`Bağlantı Tanılaması`,sectionDescription:`Bir yazıcının neden bağlanmadığını veya yazdırmadığını kontrol edin — port erişilebilirliği, LAN geliştirici modu, Docker ağ modu ve kimlik bilgileri.`,noPrinters:`Yapılandırılmış yazıcı yok.`,overall:{ok:`Sorun bulunamadı — yazıcı bağlantısı sağlıklı görünüyor.`,warnings:`Yazıcı çalışmalı, ancak bazı şeyler dikkat gerektiriyor.`,problems:`Yazıcının neden bağlanmadığını veya yazdırmadığını açıklayan sorunlar bulundu.`},check:{port_mqtt:{title:`Kontrol portu (MQTT 8883)`,pass:`Erişilebilir — yazıcı kontrol bağlantılarını kabul ediyor.`,fail:`Port 8883 erişilemez. Yazıcı kapalı, farklı bir IP adresinde veya bir güvenlik duvarı engelliyor. Yazıcı IP'sini ve hiçbir şeyin port 8883'ü engellemediğini doğrulayın.`},port_ftps:{title:`Dosya aktarım portu (FTPS 990)`,pass:`Erişilebilir — baskı dosyaları gönderme çalışacak.`,warn:`Port 990 erişilemez. İzleme yine çalışabilir, ancak yazıcıya baskı gönderme başarısız olacak. Port 990'ın engellenmediğinden emin olun.`},external_storage:{title:`Gönderilen dosyaları harici depolamada sakla (kurulum adımı 4)`,pass:`Yazıcı bu seçeneğin açık olduğunu bildiriyor — gönderilen dosyalar SD kartta saklanacak ve arşivler küçük resim ve dilimleyici meta verileri içerecek.`,fail:`Yazıcı bu seçeneğin kapalı olduğunu bildiriyor. "Gönderilen dosyaları harici depolamada sakla" seçeneğini etkinleştirin — yeni donanım yazılımlarında (P2S 01.02 / Bambu Studio 2.6+) düğme yazıcının Baskı Ayarları'nda; eski sürümlerde Bambu Studio / OrcaSlicer'in Cihaz sekmesindedir. Bu seçenek olmadan, arşivlenen her baskıda küçük resim ve dilimleyici meta verisi olmayacak.`,skip:`Kontrol edilmedi — etkin bir MQTT bağlantısı gerekli. Bu ayarın yalnızca dilimleyicide bulunduğu eski dilimleyicilerde yazıcı bunu bildirmez, bu nedenle seçenek kapalı olsa bile bu kontrol geçer — kurulum adımı 4'ü manuel olarak doğrulayın.`,skip_unsupported_model:`Bu modelde SD yuvası var ancak seçeneği açmanın bir yolu yok — mevcut P1 serisi bellenim, Bambu Studio'da bu anahtarı göstermiyor ve yazıcının ekranı yok. Burada düzeltilecek bir şey yok; Bambu Lab bellenim desteği ekleyene kadar arşivlenen baskılarda küçük resimler ve dilimleyici meta verileri eksik olabilir.`},port_rtsps:{title:`Kamera portu ({{protocol}} {{port}})`,pass:`Erişilebilir — kamera akışı çalışacak.`,warn:`Port {{port}} erişilemez. Canlı kamera görünümü çalışmayacak. Bu, baskıyı etkilemez.`},network_mode:{title:`Docker ağ modu`,pass:`Ana bilgisayar ağ modunda çalışıyor.`,warn:`Bambuddy, Docker köprü ağı kullanılarak çalışıyor. Yazıcı keşfi ve Sanal Yazıcı, ana bilgisayar ağ modu gerektirir — konteyneri "network_mode: host" ile yeniden oluşturun.`,skip:`Docker'da çalışmıyor — uygulanamaz.`},subnet:{title:`Ağ alt ağı`,pass:`Yazıcı ve Bambuddy aynı alt ağda.`,warn:`Yazıcı ({{printer_ip}}) ve Bambuddy ({{host_ip}}) farklı alt ağlarda. Alt ağlar arasında yönlendirme yapılandırılmazsa birbirlerine erişemeyebilirler.`,skip:`Alt ağ belirlenemedi — atlandı.`},mqtt_auth:{title:`Yazıcı kimlik bilgileri`,pass:`Yazıcı bağlantıyı kabul etti.`,fail:`Yazıcı erişilebilir ancak bağlantıyı reddetti. Büyük olasılıkla erişim kodu veya seri numarası yanlış. Erişim kodu, Geliştirici Modu her açılıp kapatıldığında değişir — yazıcı ekranından yeniden kopyalayın.`,skip:`Kontrol edilmedi — yazıcıya erişilemedi.`},developer_mode:{title:`LAN Geliştirici Modu`,pass:`Geliştirici Modu etkin.`,fail:`Yazıcıda Geliştirici Modu KAPALI. Yazıcının LAN ayarlarında etkinleştirin — ve OK ile onaylayın. Bu olmadan baskılar başlamayacak.`,skip:`Kontrol edilemedi — yazıcıya canlı bir bağlantı gerektirir.`},printer_publishing:{title:`Yazıcı durum yayını yapıyor`,pass:`Yazıcı durum güncellemelerini yayınlıyor — AMS, filamentler ve K profilleri dilimleyiciye doğru şekilde yansıtılacak.`,fail:`MQTT aracısı bağlantıyı kabul etti, ancak yazıcı hiç durum raporu yayınlamadı. Bu neredeyse her zaman yanlış ya da büyük/küçük harf hatalı bir seri numarasından kaynaklanır — device//report konusu büyük/küçük harfe duyarlıdır. Yazıcı ayarlarındaki seri numarasını cihazın ekranındaki ile karşılaştırarak doğrulayın.`,skip:`Kontrol edilemedi — yazıcıya canlı bir bağlantı gerektirir.`}}},systemHealth:{sectionTitle:`Sistem Sağlığı`,sectionDescription:`Bir destek talebine dönüşmeden önce genellikle kendi başınıza düzeltebileceğiniz bilinen sorunlar için son günlükleri tarar.`,rescan:`Yeniden tara`,clean:`Son {{times}} günlük kaydında bilinen sorun bulunamadı.`,logUnavailable:`Dosya günlüğü devre dışı, bu nedenle günlükler taranamıyor. Bu kontrolü kullanmak için dosya günlüğünü etkinleştirin.`,learnMore:`Nasıl düzeltilir`,fixLabel:`Düzeltme:`,occurrences:`{{times}}× görüldü — son {{lastSeen}}'de`,category:{layer8:`Bunu düzeltebilirsiniz`,environment:`Ortam`,bug:`Lütfen bunu bildirin`},signature:{"ftp-auth-rejected":{name:`Yazıcı erişim kodunu reddetti`,cause:`Yazıcı dosya aktarım girişini reddetti. Erişim kodu yanlış veya Geliştirici Modu açılıp kapatıldıktan sonra değişti.`,fix:`Erişim kodunu yazıcı ekranından (LAN ayarları) yeniden kopyalayın ve Bambuddy'deki yazıcının ayarlarında güncelleyin.`},"ftp-connection-timeout":{name:`Dosya aktarım bağlantısı zaman aşımına uğradı`,cause:`Bambuddy yazıcının dosya aktarım portuna (FTPS 990) erişemedi. Port engellendi veya yazıcı kapalı ya da başka bir alt ağda.`,fix:`Bambuddy ile yazıcı arasında hiçbir şeyin port 990'ı engellemediğinden ve her ikisinin de aynı ağda olduğundan emin olun.`},"ftp-ssl-error":{name:`Güvenli dosya aktarım el sıkışması başarısız`,cause:`Yazıcının dosya aktarım sunucusuyla TLS el sıkışması başarısız oldu. Bu genellikle bir güvenlik duvarı veya eski yazıcı firmware'idir.`,fix:`Yazıcı firmware'ini güncelleyin ve port 990'daki bağlantıyı hiçbir güvenlik duvarı veya proxy'nin engellemediğini kontrol edin.`},"mqtt-connection-flapping":{name:`Yazıcı bağlantısı sürekli düşüyor`,cause:`Kontrol bağlantısı (MQTT 8883) tekrar tekrar bağlantısı kesiliyor ve yeniden bağlanıyor — genellikle zayıf bir ağ yolu veya kısmen engellenmiş bir port.`,fix:`Yazıcıdaki Wi-Fi sinyalini kontrol edin, kablolu bağlantı tercih edin ve port 8883'ün güvenilir bir şekilde erişilebilir olduğundan emin olun.`},"camera-connection-refused":{name:`Kamera akışına erişilemez`,cause:`Canlı kameraya RTSPS 322 portunda erişilemedi. Port engellendi veya yazıcıda kamera veya LAN canlı görünümü kapalı.`,fix:`Yazıcıda kamerayı ve LAN canlı görünümünü etkinleştirin ve port 322'nin engellenmediğinden emin olun. Bu, baskıyı etkilemez.`},"database-locked":{name:`Veritabanı yazma çekişmesi`,cause:`SQLite veritabanı yük altında "veritabanı kilitli" hatalarıyla karşılaşıyor — aynı anda birkaç yazıcı çalıştırırken yaygındır.`,fix:`Bambuddy'yi harici bir PostgreSQL veritabanına geçirin. Dokümantasyondaki PostgreSQL kılavuzuna bakın.`}}},vpDiagnostic:{title:`Kurulum kontrolü — {{name}}`,runButton:`Kurulum kontrolünü çalıştır`,running:`Kurulum kontrolü çalışıyor...`,runFailed:`Kurulum kontrolü çalıştırılamadı: {{error}}`,retry:`Tekrar çalıştır`,overall:{ok:`Tüm kontroller geçti — bu sanal yazıcı doğru şekilde kurulmuş.`,warnings:`Sanal yazıcı çalışmalı, ancak bazı şeyler dikkat gerektiriyor.`,problems:`Dilimleyicinin bu sanal yazıcıyı neden göremediğini veya kullanamadığını açıklayan sorunlar bulundu.`},check:{enabled:{title:`Sanal yazıcı etkin`,fail:`Bu sanal yazıcı kapatılmış. Keşfedilebilir hale getirmek için açın.`},running:{title:`Servisler çalışıyor`,fail:`Sanal yazıcı etkin ancak servisleri çalışmıyor. Bambuddy günlüğünü kontrol edin — bir bind IP çakışması veya bir izin hatası genellikle onları durdurur.`},bind_interface:{title:`Bind ağ arayüzü`,fail:`Bind arayüzü ayarlanmamış veya artık bu ana bilgisayarda mevcut değil. Bind Arayüzü açılır menüsünde mevcut bir arayüz seçin.`},access_code:{title:`Erişim kodu ayarlandı`,fail:`Erişim kodu ayarlanmamış. Dilimleyiciye burada ayarladığınız aynı 8 karakterli erişim kodunun verilmesi gerekir.`},target_printer:{title:`Hedef yazıcı`,fail:`Hedef yazıcı seçilmemiş. Proxy modu iletmek için gerçek bir yazıcıya ihtiyaç duyar.`,warn:`Hedef yazıcı şu anda çevrimdışı — yeniden bağlandığında proxy devam edecek.`},port_ftps:{title:`Dosya yükleme servisi (port {{port}})`,fail:`Bind IP'sinin {{port}} portunda hiçbir şey dinlemiyor, bu nedenle dilimleyici dosya yükleyemez. Bu arayüzde bir port çakışması genellikle nedendir.`},port_mqtt:{title:`Kontrol servisi (port {{port}})`,fail:`Bind IP'sinin {{port}} portunda hiçbir şey dinlemiyor, bu nedenle dilimleyici bağlanamaz veya durum gösteremez.`},port_bind:{title:`Keşif servisi (port {{port}})`,fail:`Bind IP'sinin {{port}} portunda hiçbir şey dinlemiyor, bu nedenle dilimleyicinin keşif el sıkışması başarısız oluyor.`},certificate:{title:`TLS sertifikası`,pass:`Sertifika hazır. Bambuddy CA sertifikasının (yukarıda) dilimleyicinizin güven deposuna içe aktarıldığından emin olun.`,fail:`Bu sanal yazıcı için TLS sertifikası eksik. Bambuddy veri dizininin yazılabilir olduğunu kontrol edin.`}}},bugReport:{title:`Hata Bildir`,description:`Açıklama`,descriptionPlaceholder:`Ne ters gitti? Lütfen sorunu tanımlayın...`,email:`E-posta (isteğe bağlı)`,emailPlaceholder:`sizin@email.com`,emailPrivacy:`Sağlanırsa, e-postanız GitHub sorunundaki daraltılmış bir bölümde dahil edilecek, böylece bakımcı takip edebilir.`,screenshot:`Ekran Görüntüsü`,uploadOrPaste:`Bir görüntü yükleyin, yapıştırın veya sürükleyin`,dataCollectedSummary:`Rapora hangi veriler dahil edilir?`,dataIncluded:`Dahil:`,dataIncludedList:`Uygulama sürümü, OS, mimari, Python sürümü, veritabanı istatistikleri (yalnızca sayılar), yazıcı modelleri, nozul sayıları, firmware sürümleri, bağlantı durumu, entegrasyon durumu (Spoolman, MQTT, HA), hassas olmayan ayarlar, ağ arayüzü sayısı, Docker ayrıntıları, bağımlılık sürümleri.`,dataNeverIncluded:`Asla dahil edilmez:`,dataNeverIncludedList:`Yazıcı adları, seri numaraları, erişim kodları, parolalar, IP adresleri, e-posta adresleri, API anahtarları, belirteçler, webhook URL'leri, ana bilgisayar adları veya kullanıcı adları.`,submit:`Gönder`,startLogging:`Hata Ayıklama Kaydını Başlat`,stepEnableLogging:`Hata ayıklama kaydı etkin`,stepReproduce:`Sorunu şimdi yeniden oluşturun`,stepStopLogging:`Durdur ve raporu gönder`,stopAndSubmit:`Durdur ve Gönder`,maxDuration:`{{minutes}} dk sonra otomatik durur`,stoppingLogs:`Günlükler toplanıyor ve gönderiliyor...`,submitting:`Hata raporu gönderiliyor...`,submittingStepConnection:`Yazıcı bağlantı kontrolleri çalıştırılıyor`,submittingStepVirtualPrinters:`Sanal yazıcı kurulum kontrolleri çalıştırılıyor`,submittingStepLogScan:`Son günlüklerde bilinen sorunlar taranıyor`,submittingStepSubmit:`Rapor GitHub'a gönderiliyor`,submitSuccess:`Hata raporu başarıyla gönderildi!`,submitFailed:`Hata raporu gönderilemedi`,diagnosticChecking:`Yazıcı bağlantıları kontrol ediliyor...`,diagnosticHealthy:`Bağlantı kontrolü başarılı — yazıcılarınızda sorun bulunamadı.`,diagnosticSummary:`{{total}} yazıcıdan {{problems}} tanesinde bağlantı sorunu var`,diagnosticIntro:`Bir veya daha fazla yazıcının sorununuza neden olabilecek bir bağlantı sorunu var. Düzeltmeyi görmek için aşağıda bir yazıcıyı genişletin — bunu çözmek, hata raporu olmadan sorunu çözebilir. Yine de aşağıda bir rapor gönderebilirsiniz.`,logHealthSummary:`Günlüklerinizde bilinen sorunlar bulundu`,logHealthIntro:`Son günlükler bilinen sorunlarla eşleşiyor. Aşağıdaki düzeltmeleri kontrol edin — bunları çözmek, hata raporu olmadan sorununuzu çözebilir. Yine de aşağıda bir rapor gönderebilirsiniz.`,thankYou:`Teşekkürler!`,submitted:`Hata raporunuz gönderildi.`,viewIssue:`Sorunu Görüntüle`,unexpectedError:`Beklenmedik bir hata oluştu`},failureDetection:{title:`AI Başarısızlık Algılama`,description:`Baskıları kendi barındırılan bir Obico ML API ile izle ve algılanan başarısızlıklara otomatik olarak yanıt ver.`,mlUrl:`Obico ML API URL'si`,mlUrlHint:`Kendi barındırılan Obico ml_api konteynerinizin temel URL'si (örn. http://192.168.1.10:3333).`,test:`Test`,testSuccess:`ML API erişilebilir ve sağlıklı.`,testFailed:`ML API'ye erişilemedi.`,sensitivity:`Hassasiyet`,sensitivityLow:`Düşük (daha az yanlış pozitif)`,sensitivityMedium:`Orta (dengeli)`,sensitivityHigh:`Yüksek (erken algıla, daha fazla yanlış pozitif)`,sensitivityHint:`Uyarıları ve başarısızlıkları tetikleyen güven eşiklerini ayarlar.`,action:`Algılanan başarısızlıkta eylem`,actionNotify:`Yalnızca bildir`,actionPause:`Baskıyı duraklat`,actionPauseOff:`Duraklat ve gücü kes`,pollInterval:`Sorgulama aralığı (saniye)`,pollIntervalHint:`Baskı yaparken her yazıcının ne sıklıkta kontrol edileceği. Minimum 5sn, maksimum 120sn.`,externalUrlMissing:`Harici URL ayarlanmamış.`,externalUrlHint:`ML API, kamera anlık görüntüsünü URL üzerinden alır. ML API konteyneri Bambuddy'ye erişebilsin diye Genel ayarlarda Harici URL'yi ayarlayın.`,perPrinterTitle:`İzlenen Yazıcılar`,perPrinterHint:`Algılama servisinin hangi yazıcıları izleyeceğini seçin.`,monitorAll:`Tüm bağlı yazıcıları izle`,statusTitle:`Durum`,serviceRunning:`Servis çalışıyor`,thresholds:`Düşük / Yüksek eşikler`,activePrinters:`Aktif baskılar`,noActivePrints:`Şu anda çalışan baskı yok.`,historyTitle:`Son Algılamalar`,noHistory:`Henüz algılama yok.`},makerworld:{title:`MakerWorld`,description:`Bambu Handy uygulamasına gitmeden — doğrudan Bambuddy'den içe aktarmak ve yazdırmak için bir MakerWorld model URL'si yapıştırın.`,pasteUrlHeader:`MakerWorld'den İçe Aktar`,pasteUrlPlaceholder:`https://makerworld.com/en/models/… veya herhangi bir MakerWorld bağlantısını yapıştırın`,resolveButton:`Çöz`,signInRequiredTitle:`İndirme için Bambu Cloud girişi gerekli`,signInRequiredBody:`Model ayrıntılarına anonim olarak göz atabilirsiniz, ancak MakerWorld 3MF dosyalarını indirmek için bir Bambu Cloud hesabı gerektirir.`,signInExpiredTitle:`Bambu Cloud oturumu sona erdi`,signInExpiredBody:`Bambuddy oturumunuz açık kalmaya devam ediyor, ancak Bambu Lab kayıtlı belirteci artık kabul etmediği için indirmeler başarısız olacak. Bambu Cloud oturumunu yeniden açın.`,openCloudSettings:`Bulut ayarlarını aç`,untitledModel:`Adsız model`,byCreator:`{{name}} tarafından`,downloadsCount:`{{count}} indirme`,licensePrefix:`Lisans`,alreadyImported:`Zaten kütüphanede`,openOnMakerworld:`MakerWorld'de aç`,alreadyInLibrary:`Bu model zaten kütüphanenizde — Dosya Yöneticisi → MakerWorld'de bulun`,importSuccess:`{{filename}} içe aktarıldı — Dosya Yöneticisi → MakerWorld'e kaydedildi`,platesHeader:`Plakalar ({{count}})`,plateDefaultName:`Plaka {{n}}`,materialCount:`{{count}} filament`,amsRequired:`AMS gerekli`,slicedFor:`{{printer}} için dilimlendi`,alsoCompatible:`Ayrıca uyumlu olarak işaretlendi: {{printers}}`,importToLibrary:`Kaydet`,sliceIn:`Kaydet ve {{slicer}}'de Dilimle`,disclaimer:`MakerWorld entegrasyonu topluluk tarafından belgelenen API uç noktalarını kullanır. Bambuddy, MakerWorld veya Bambu Lab ile ilişkili veya onaylı değildir.`,lastImportSuccess:`Kütüphanenize içe aktarıldı`,lastImportAlreadyInLibrary:`Zaten kütüphanenizde`,viewInLibrary:`Dosya Yöneticisinde Görüntüle`,openInBambuStudio:`Bambu Studio'da Aç`,openInOrcaSlicer:`OrcaSlicer'da Aç`,importTo:`Dosya yöneticisine içe aktar`,recentImportsHeader:`Son içe aktarımlar`,phaseResolving:`Çözülüyor`,phaseDownloading:`İndiriliyor`,folderAuto:`MakerWorld (varsayılan)`,importAll:`Tümünü içe aktar`,importAllProgress:`{{current}}/{{total}} içe aktarılıyor`,openGallery:`Görüntü galerisini aç`,galleryPrev:`Önceki görüntü`,galleryNext:`Sonraki görüntü`,deleteImport:`Kütüphaneden kaldır`,importDeleting:`Kaldırılıyor…`,importDeleted:`Kütüphaneden kaldırıldı`,confirmDelete:`{{filename}} kütüphaneden kaldırılsın mı? Bu, yerel dosyayı siler ancak plaka MakerWorld'den yeniden içe aktarılabilir.`,errors:{resolveFailed:`O MakerWorld URL'si çözülemedi.`,downloadFailed:`İndirme başarısız. Lütfen tekrar deneyin.`,deleteFailed:`Dosya kütüphaneden kaldırılamadı.`}},gcodeViewer:{back:`Geri`,backToArchives:`Baskı Arşivlerine Dön`,backToFiles:`Dosya Yöneticisine Dön`},libraryTrash:{title:`Çöp Kutusu`,headerButton:`Çöp`,headerTooltip:`Çöpe taşınan dosyaları görüntüle`,backToFiles:`Dosya Yöneticisine Dön`,subtitleAdmin:`Silinen dosyalar burada {{days}} gün kalır, ardından otomatik silinir. Bu görünüm tüm kullanıcılar için çöpteki dosyaları gösterir.`,subtitleUser:`Silinen dosyalar burada {{days}} gün kalır, ardından otomatik silinir.`,loading:`Çöp yükleniyor…`,loadError:`Çöp yüklenemedi.`,empty:`Çöp boş.`,summary:`{{count}} dosya · {{size}}`,emptyTrash:`Çöpü boşalt`,restore:`Geri Yükle`,purgeNow:`Şimdi sil`,autoPurgeIn:`{{when}} içinde otomatik silinir`,days:`gün`,retentionLabel:`Otomatik sil`,selectAll:`Tümünü seç`,selectOne:`{{filename}} seç`,selectionCount:`{{count}} seçildi`,bulkRestore:`Seçilenleri geri yükle`,bulkPurge:`Seçilenleri sil`,col:{filename:`Dosya`,folder:`Klasör`,size:`Boyut`,deleted:`Çöpe taşındı`,autoPurge:`Otomatik silinir`,owner:`Sahip`,actions:`İşlemler`},confirm:{purgeTitle:`Kalıcı olarak silinsin mi?`,purgeBody:`{{filename}} diskten silinecek ve geri yüklenemeyecek.`,emptyTitle:`Çöp boşaltılsın mı?`,emptyBody:`Tüm {{count}} dosya diskten silinecek. Bu geri alınamaz.`,bulkPurgeTitle:`Seçili dosyalar kalıcı olarak silinsin mi?`,bulkPurgeBody:`Seçili {{count}} dosya diskten silinecek ve geri yüklenemeyecek.`,cta:`Kalıcı olarak sil`},toast:{restored:`Dosya geri yüklendi.`,restoreFailed:`Dosya geri yüklenemedi.`,purged:`Dosya kalıcı olarak silindi.`,purgeFailed:`Dosya silinemedi.`,emptied:`{{count}} dosya çöpten silindi.`,emptyFailed:`Çöp boşaltılamadı.`,retentionSaved:`Otomatik silme {{days}} gün olarak ayarlandı.`,retentionFailed:`Saklama ayarı kaydedilemedi.`,bulkRestored:`{{count}} dosya geri yüklendi.`,bulkPurged:`{{count}} dosya silindi.`}},libraryPurge:{title:`Eski dosyaları temizle`,headerButton:`Eskileri temizle`,headerTooltip:`Eski dosyaları toplu olarak çöpe taşı`,description:`Kütüphanenizden eski dosyaları tek seferde temizleyin. Baskı geçmişi olan dosyalar son baskı tarihlerine göre, hiç yazdırılmamış dosyalar yükleme tarihlerine göre yaşlandırılır.`,ageLabel:`Şundan eski dosyaları taşı`,days:`gün`,includeNeverPrinted:`Hiç yazdırılmamış dosyaları dahil et`,effectsTitle:`Temizle'ye tıkladığınızda ne olur`,effect1:`Eşleşen dosyalar Çöp'e taşınır — henüz diskten silinmezler.`,effect2:`Saklama penceresi sona erene kadar Çöp'ten herhangi bir zamanda geri yükleyebilirsiniz.`,effect3:`Saklama sonrası, çöp süpürücü onları kalıcı olarak diskten kaldırır.`,effect4:`Harici (bağlı) klasörlerdeki dosyalar atlanır — Bambuddy asla sahibi olmadığı bayt'ları silmez.`,previewLoading:`Kaç dosyanın eşleştiği kontrol ediliyor…`,previewFailed:`Temizleme önizlenemedi.`,previewSummary:`{{count}} dosya · {{size}} çöpe taşınacak`,andMore:`…ve {{count}} daha`,warning:`Çöpe taşınan dosyalar saklama penceresi sona erene kadar depolama alanını kullanmaya devam eder. Diski hemen boşaltmak için sonradan Çöp'ü boşaltın.`,confirmCta:`{{count}} dosyayı çöpe taşı`,purging:`Çöpe taşınıyor…`,toast:{success:`{{count}} dosya çöpe taşındı.`,failed:`Dosyalar temizlenemedi.`}},libraryAutoPurge:{enableLabel:`Eski dosyaları otomatik temizle`,enableDescription:`Yönetici temizliğini günde bir kez çalıştırır. Dosyalar önce Çöp'e gider — hemen silinmezler.`,ageLabel:`Şundan eski dosyaları otomatik temizle`,ageDescription:`Minimum 7 gün, maksimum 10 yıl. Manuel Temizle düğmesiyle aynı yaş kuralını kullanır.`,days:`gün`,includeNeverPrinted:`Hiç yazdırılmamış dosyaları dahil et`,saveFailed:`Otomatik temizleme ayarları kaydedilemedi.`},archivePurge:{headerButton:`Eskileri temizle`,headerTooltip:`Eski arşivleri toplu olarak sil`,title:`Eski arşivleri temizle`,description:`Eski baskı geçmişini temizleyin. Her arşiv en son baskı tamamlamasına göre yaşlandırılır — bir arşivi yeniden yazdırmak yaşını yeniler, bu nedenle aktif çalışma asla temizlenmez.`,ageLabel:`Son şu kadar günde yazdırılmamış arşivleri sil`,days:`gün`,effectsTitle:`Temizle'ye tıkladığınızda ne olur`,effect1:`Eşleşen her arşiv listelerden gizlenir ve dosyaları diskten kaldırılır (3MF, küçük resim, zaman atlamalı video, kaynak 3MF, F3D tasarım dosyası, fotoğraflar).`,effect2:`Arşiv satırı veritabanında kalır, böylece Hızlı İstatistikler filament, süre, maliyet ve enerji katkısını korur — tek arşiv silme varsayılanı ile aynı.`,effect3:`Hızlı İstatistik katkısını da kaldırmak için aşağıdaki "Ayrıca istatistiklerden kaldır"ı işaretleyin (tek arşiv silme seçeneğiyle eşleşir). O yol geri alınamaz.`,effect4:`Bir arşivi yeniden yazdırmak yaş saatini yeniler, bu nedenle hâlâ kullandığınız arşivler güvendedir.`,purgeStatsLabel:`Ayrıca istatistiklerden kaldır`,purgeStatsHint:`Eşleşen arşivleri Hızlı İstatistiklerden (filament, süre, maliyet, enerji) düşürür. Bu olmadan, Hızlı İstatistikler her katkıyı korur ve yalnızca dosyalar diskten ayrılır.`,previewLoading:`Kaç arşivin eşleştiği kontrol ediliyor…`,previewFailed:`Temizleme önizlenemedi.`,previewSummary:`{{count}} arşiv · {{size}} kaldırılacak`,andMore:`…ve {{count}} daha`,warning:`Dosyalar diskten kaldırılır ve geri yüklenemez. Devam etmeden önce saklamak istediğiniz her şeyi indirin veya favoriye ekleyin.`,confirmCta:`{{count}} arşivi kaldır`,purging:`Kaldırılıyor…`,toast:{success:`{{count}} arşiv kaldırıldı.`,failed:`Arşivler temizlenemedi.`}},archiveAutoPurge:{enableLabel:`Eski arşivleri otomatik temizle`,enableDescription:`Günde bir kez, eşik içinde yazdırılmamışsa arşivleri listelerden gizler ve dosyalarını diskten kaldırır. Bir arşivi yeniden yazdırmak saati sıfırlar.`,ageLabel:`Son şu kadar günde yazdırılmamış arşivleri otomatik sil`,ageDescription:`Minimum 7 gün, maksimum 10 yıl. En son baskı tamamlamasına göre — bir arşivi yeniden yazdırmak yaşını yeniler. 3MF, küçük resim, zaman atlamalı video, kaynak 3MF, F3D ve fotoğrafları kaldırır.`,days:`gün`,purgeStatsLabel:`Ayrıca istatistiklerden kaldır`,purgeStatsDescription:`Etkinleştirildiğinde, günlük süpürücü her temizlenen arşivi de Hızlı İstatistiklerden (filament, süre, maliyet, enerji) düşürür. Varsayılan kapalı — Hızlı İstatistikler katkıyı korur, yalnızca dosyalar diskten ayrılır.`,runNow:`Arşivleri şimdi temizle`,saveFailed:`Otomatik temizleme ayarları kaydedilemedi.`},cameraTokens:{scope:{camera_stream:`Kamera akışı`,camwall:`Kamera duvarı`,overlay:`Yayın bindirmesi`},title:`Kamera API Belirteçleri`,navTitle:`Kamera API belirteçleri`,description:`Kamera akışını Home Assistant, Frigate, kiosk ekranları veya sabit bir adres gerektiren başka araçlara gömmek için uzun ömürlü belirteçler. Kapsam oluşturma sırasında seçilir; belirteç istediğiniz zaman iptal edilebilir.`,loading:`Yükleniyor…`,confirmRevoke:{title:`Bu belirteç iptal edilsin mi?`,body:`"{{name}}" kullanan herhangi bir cihaz hemen erişimini kaybedecek. Bu geri alınamaz.`,cancel:`İptal`,confirm:`İptal Et`},create:{scopeLabel:`Kapsam`,hintCameraStream:`Kamera akışı belirteci yalnızca kamera akışlarını ve anlık görüntüleri alabilir. Home Assistant, Frigate veya tek bir kamerayı gömen her şey için kullanın.`,hintCamWall:`Kamera duvarı belirteci, oturum açmadan bir ekranda /camwall adresini açar. Her yazıcının adını ve durumunu, ayrıca kamera akışlarını görebilir. Dosya adlarını, adresleri veya erişim kodlarını göremez.`,hintOverlay:`Yayın bindirmesi belirteci, oturum açmadan bir ekranda /overlay/{printerId} adresini açar — OBS veya herhangi bir canlı yayın için. Bir yazıcının kamera akışını ve ekranda gösterilen dosya adı dahil canlı yazdırma durumunu görebilir. Adresleri veya erişim kodlarını göremez.`,title:`Yeni belirteç oluştur`,nameLabel:`Belirteç adı`,namePlaceholder:`örn. Home Assistant`,daysLabel:`Sona erene kadar gün`,submit:`Oluştur`,hint:`Maksimum ömür 365 gün. Belirteç değeri oluşturmada yalnızca bir kez gösterilir — şimdi kopyalayın.`},created:{camWallUrlTitle:`Bu ekran için kamera duvarı adresi`,camWallUrlHint:`Bu adresi ekranda açın. Adresi okuyabilen herkes duvarı izleyebilir, bu yüzden onu bir anahtar gibi görün; ekranın erişimini kesmek için belirteci iptal edin.`,overlayUrlTitle:`OBS için bindirme adresi`,overlayUrlHint:`Bunu OBS'ye Tarayıcı Kaynağı olarak ekleyin. /overlay/1 içindeki sayıyı yazıcınızın numarasıyla değiştirin (Yazıcılar sayfasındaki adresinden). Adresi okuyabilen herkes yayını izleyebilir, bu yüzden onu bir anahtar gibi görün — erişimi kesmek için belirteci iptal edin.`,title:`Belirteç oluşturuldu — şimdi kopyalayın`,warning:`Bu, bu belirtecin görünür olacağı tek seferdir. Bu iletişim kutusunu kapattıktan sonra onu bir daha asla görüntüleyemezsiniz.`,copy:`Kopyala`,dismiss:`Kaydettim`},list:{scope:`Kapsam`,myTitle:`Belirteçlerim`,allTitle:`Tüm kullanıcılar (yönetici görünümü)`,empty:`Henüz belirteç yok.`,name:`Ad`,owner:`Sahip`,prefix:`Önek`,created:`Oluşturuldu`,expires:`Sona Erer`,lastUsed:`Son kullanım`,revoke:`İptal Et`,expired:`Süresi Doldu`},toast:{created:`Belirteç oluşturuldu`,createFailed:`Belirteç oluşturulamadı`,revoked:`Belirteç iptal edildi`,revokeFailed:`Belirteç iptal edilemedi`,loadFailed:`Belirteçler yüklenemedi`,copied:`Panoya kopyalandı`,copyFailed:`Kopyalama başarısız — manuel olarak seçip kopyalayın`}},forecast:{title:`Tahmin`,noSpools:`Aktif makara bulunamadı. Tahmin verisini görmek için envanterinize makara ekleyin.`,noUsageData:`Kullanım verisi mevcut değil — stok zaman çizelgesi öngörülemiyor.`,sku:`SKU`,material:`Malzeme`,stock:`Stok`,dailyRate:`Oran`,daysLeft:`Kalan Gün`,emptyBy:`Şu Tarihte Boş`,reorderBy:`Şu Tarihte Sipariş`,actions:`İşlemler`,trend:`Trend`,estimated:`Tahmini`,noData:`Veri yok`,timeframe:`Zaman Aralığı`,chartTitle:`Öngörülen Stok — İlk 5 Malzeme`,dashedLinesROP:`Kesik çizgiler = yeniden sipariş noktaları`,stockLevel:`Stok Seviyesi`,reorderPoint:`Yeniden Sipariş Noktası`,safetyMargin:`Güvenlik Marjı`,trendLegend:`Trend (geçmiş tabanlı, %95 servis seviyesi)`,estimatedLegend:`Tahmini (ağırlık farkı)`,noDataLegend:`Veri yok`,ropLabel:`ROP`,ssLabel:`SS`,safetyStockLegend:`Güvenlik stoku`,stockArrivalLegend:`Stok varışı`,stockoutLegend:`Stok tükenmesi`,alertCount_one:`{{count}} uyarı`,alertCount_other:`{{count}} uyarı`,order:`Sipariş`,save:`Kaydet`,cancel:`İptal`,settingsSaved:`Ayarlar kaydedildi`,failedSaveSettings:`Ayarlar kaydedilemedi`,globalLeadTimeSaved:`Global teslim süresi kaydedildi`,globalLeadTime:`Global teslim süresi`,globalLeadTimeHint:`Global teslim süresi tabanı — tüm SKU'lar için yeniden sipariş noktası hesaplamasında kullanılır`,skuLeadTimeOverride:`SKU Teslim Süresi Geçersiz Kılma`,skuLeadTimeHint:`0 = global teslim süresini kullan. Bu SKU için geçersiz kılmak için >0 ayarlayın.`,safetyMarginLabel:`Güvenlik Marjı`,effectiveLeadTime:`Etkili Teslim Süresi`,effectiveLeadTimeHint:`max(global {{global}}g, SKU {{sku}}g)`,reorderPointHint:`d̄ × LT + güvenlik marjı — stok bu seviyeye geldiğinde sipariş ver`,safetyMarginHint:`İstatistiksel güvenlik stoku (z=1.65 × σ × √LT) + kullanıcı tanımlı tampon`,safetyMarginHintDays:`İstatistiksel güvenlik stokunun üzerine eklenen tampon.{{approx}}`,safetyMarginHintDaysApprox:` ≈ mevcut oranda {{g}}g.`,safetyMarginHintG:`İstatistiksel güvenlik stokunun üzerine eklenen sabit ağırlık tamponu.{{approx}}`,safetyMarginHintGApprox:` ≈ mevcut oranda {{days}}g.`,individualSpools:`Bireysel makaralar`,labelWeight:`Etiket`,spoolCount_one:`{{count}} makara`,spoolCount_other:`{{count}} makara`,stockBreakRisk:`Stok tükenme riski`,stockBreakDetail:`{{days}}g kaldı, teslim süresi {{lt}}g.`,stockBreakBefore:`Yenileme öncesi stok tükenmesi`,reorderNow:`Şimdi sipariş ver`,reorderTriggerPassed:`Tetikleyici tarih {{date}} geçti.`,shoppingList:`Alışveriş Listesi`,shoppingListItems_one:`({{count}} öğe)`,shoppingListItems_other:`({{count}} öğe)`,shoppingListEmpty:`Alışveriş listesi boş. Öğe eklemek için herhangi bir satırdaki sepet simgesine tıklayın.`,addToCart:`Alışveriş listesine ekle`,alertsSnoozed:`Bu SKU için uyarıları sustur`,alertsEnabled:`Bu SKU için uyarıları aç`,addedToCart:`Alışveriş listesine eklendi`,failedAddItem:`Öğe eklenemedi`,listView:`Liste`,logisticsView:`Lojistik`,qty:`Adet`,weight:`Ağırlık`,leadTime:`Teslim Süresi`,expectedRestock:`Beklenen Yenileme`,status:`Durum`,note:`Not`,pending:`Beklemede`,purchased:`Satın Alındı`,received:`Teslim Alındı`,markPurchased:`Satın alındı olarak işaretle`,markReceived:`Teslim alındı olarak işaretle — makaraları Stok envanterine ekler`,resetToPending:`Beklemeye sıfırla`,remove:`Kaldır`,clearAll:`Tümünü temizle`,downloadCsv:`CSV`,addToCartTitle:`Alışveriş Listesine Ekle`,byQuantity:`Miktara Göre`,byDuration:`Süreye Göre`,numberOfSpools:`Makara sayısı`,lastHowManyDays:`Kaç gün dayanmalı?`,noUsageQty:`Kullanım verisi yok — miktar 1 olarak ayarlandı.`,noteOptional:`Not (isteğe bağlı)`,notePlaceholder:`örn. X projesi için, acil…`,addNSpools_one:`{{count}} makara ekle`,addNSpools_other:`{{count}} makara ekle`,onArrival:`Varışta`,stockBreakIn:`{{days}}g içinde stok tükenmesi.`,stockRunsOutBefore:`{{lt}}g teslim süresi dolmadan önce stok tükenir.`,atRate:`{{rate}}g/gün oranında size gerekli`,moreSpools_one:`{{count}} daha makara`,moreSpools_other:`{{count}} daha makara`,bridgeGap:`boşluğu kapatmak için.`,noReadAccess:`Envanter tahminlerini görüntüleme izniniz yok.`,noWriteAccess:`Tahmin ayarlarını değiştirme izniniz yok.`}}},ru:{translation:{nav:{printers:`Принтеры`,archives:`Архив`,queue:`Очередь печати`,stats:`Статистика`,profiles:`Профили`,maintenance:`Обслуживание`,projects:`Проекты`,inventory:`Филамент`,files:`Файловый менеджер`,makerworld:`MakerWorld`,notifications:`Уведомления`,settings:`Настройки`,system:`Система`,collapseSidebar:`Свернуть боковую панель`,expandSidebar:`Развернуть боковую панель`,update:`Обновить`,updateAvailable:`Доступно обновление: v{{version}}`,updateAvailableBanner:`Доступна версия {{version}}!`,viewUpdate:`Посмотреть обновление`,viewOnGithub:`Открыть на GitHub`,keyboardShortcuts:`Горячие клавиши (?)`,switchToLight:`Включить светлую тему`,switchToDark:`Включить тёмную тему`,switchToSystem:`Использовать системную тему`,smartSwitches:`Умные выключатели`,logout:`Выйти`,installApp:`Установить приложение`,installAppSuccess:`Bambuddy установлен`},common:{save:`Сохранить`,saving:`Сохранение...`,cancel:`Отмена`,delete:`Удалить`,edit:`Изменить`,add:`Добавить`,close:`Закрыть`,confirm:`Подтвердить`,loading:`Загрузка...`,error:`Ошибка`,errorLoading:`Не удалось загрузить данные`,retry:`Повторить`,success:`Готово`,warning:`Предупреждение`,enabled:`Включено`,disabled:`Отключено`,yes:`Да`,no:`Нет`,on:`Вкл.`,off:`Выкл.`,all:`Все`,none:`Нет`,search:`Поиск`,filter:`Фильтр`,sort:`Сортировка`,refresh:`Обновить`,download:`Скачать`,upload:`Загрузить`,uploading:`Загрузка...`,uploadFailed:`Ошибка загрузки`,actions:`Действия`,status:`Состояние`,name:`Название`,description:`Описание`,date:`Дата`,time:`Время`,hours:`часов`,minutes:`минут`,seconds:`секунд`,days:`дней`,enable:`Включить`,disable:`Отключить`,permissions:`Разрешения`,noPrinters:`Принтеры не настроены`,noData:`Нет данных`,linkNotFound:`Ссылка не найдена`,required:`Обязательно`,optional:`Необязательно`,dismiss:`Закрыть`,apply:`Применить`,reset:`Сбросить`,export:`Экспорт`,import:`Импорт`,clear:`Очистить`,selectAll:`Выбрать все`,deselectAll:`Снять выделение`,noChange:`— Без изменений —`,unchanged:`Без изменений`,unassigned:`Не назначено`,unknown:`Неизвестно`,unknownError:`Неизвестная ошибка`,today:`Сегодня`,tomorrow:`Завтра`,asap:`Как можно скорее`,overdue:`Просрочено`,now:`Сейчас`,collapse:`Свернуть`,expand:`Развернуть`,previous:`Назад`,next:`Далее`,viewArchive:`Открыть архив`,viewInFileManager:`Открыть в файловом менеджере`,addedBy:`Добавил: {{username}}`,prints:`печатей`,more:`ещё +{{count}}`,ascending:`По возрастанию`,descending:`По убыванию`,back:`Назад`,copy:`Копировать`,copied:`Скопировано!`,printer:`Принтер`,remove:`Удалить`,type:`Тип`,print:`Печать`,rename:`Переименовать`,move:`Переместить`,create:`Создать`,duplicate:`Дублировать`,left:`Левый`,right:`Правый`},printers:{title:`Принтеры`,addPrinter:`Добавить принтер`,addPreflight:{checking:`Проверка подключения...`,warning:`Некоторые проверки подключения не пройдены. Принтер может отображаться как отключённый. Проверьте результаты ниже, исправьте возможные проблемы или сохраните настройки как есть.`,back:`Назад`,saveAnyway:`Всё равно сохранить`},editPrinter:`Изменить принтер`,deletePrinter:`Удалить принтер`,printerName:`Название принтера`,serialNumber:`Серийный номер`,ipAddress:`IP-адрес / имя хоста`,accessCode:`Код доступа`,model:`Модель`,nozzleCount:`Количество сопел`,autoArchive:`Автоматически архивировать`,status:{available:`Доступен`,idle:`Ожидает`,printing:`Печать`,paused:`Приостановлен`,offline:`Не в сети`,problem:`Проблема`,error:`Ошибка`,finished:`Завершено`,unknown:`Неизвестно`},temperatures:{nozzle:`Сопло`,bed:`Стол`,chamber:`Камера`},heaterHistory:{title:`История нагрева`,openLabel:`Открыть историю нагрева`,nozzle:`Сопло`,nozzle2:`Сопло 2`,bed:`Стол`,chamber:`Камера`,error:`Не удалось загрузить историю`,empty:`Данные пока не записывались`},progress:`Выполнено {{percent}}%`,timeRemaining:`Осталось {{time}}`,deleteConfirm:`Удалить принтер «{{name}}»?`,maintenanceOk:`Обслуживание в норме`,maintenanceWarning:`{{count}} предупреждение`,maintenanceWarning_plural:`{{count}} предупреждений`,maintenanceDue:`Требуется: {{count}}`,maintenanceDue_plural:`Требуется: {{count}}`,sort:{name:`Название`,status:`Состояние`,model:`Модель`,location:`Расположение`,eta:`Время завершения`,ascending:`По возрастанию`,descending:`По убыванию`},cardSize:{small:`Маленькие карточки`,medium:`Средние карточки`,large:`Большие карточки`,extraLarge:`Очень большие карточки`},pageView:{openCamWallPage:`Открыть стену камер как отдельную страницу`,cards:`Карточки`,camWall:`Стена камер`},camWall:{page:{tokenRejected:`Эта ссылка на стену камер больше недействительна. Возможно, срок действия токена истёк или он был отозван.`,loadFailed:`Не удалось загрузить принтеры.`},noPrinters:`Нет принтеров для отображения`,noSignal:`Нет сигнала`,live:`Онлайн`,snap:`Снимок`,off:`Выкл.`,summary:`Онлайн: {{live}}, снимки: {{snap}}, всего: {{total}}`,layer:`Слой {{cur}}/{{total}}`,timeLeft:`Осталось {{time}}`,statusMode:{off:`Выкл.`,compact:`Компактный`,full:`Полный`},settings:{title:`Настройки стены камер`,maxLive:`Максимум онлайн-трансляций`,maxLiveHint:`Сколько камер одновременно показывать в реальном времени. Остальные будут обновляться снимками.`,snapshotInterval:`Интервал снимков, с`,snapshotIntervalHint:`Как часто обновлять снимки камер без онлайн-трансляции.`,statusOverlay:`Наложение состояния`,statusOverlayHint:`Компактный режим: только состояние. Полный: прогресс, слой и оставшееся время.`}},hideOffline:`Скрыть принтеры не в сети`,nextAvailable:`Ближайший доступный`,powerOn:`Включить питание`,offlinePrintersWithPlugs:`Принтеры не в сети с умными розетками`,noPrintersConfigured:`Принтеры пока не настроены`,search:`Поиск принтеров...`,noSearchResults:`Нет принтеров, соответствующих поиску или фильтрам`,filter:{allStatuses:`Все состояния`,allLocations:`Все расположения`},toolbar:{filters:`Фильтры`,view:`Вид`,actions:`Действия`},readyToPrint:`Готов к печати`,external:`Внешняя подача`,extL:`Внешняя, левое`,extR:`Внешняя, правое`,deleteArchives:`Удалить архивы печати`,noLabel:`Без метки`,printPreview:`Предпросмотр печати`,width:`Ширина`,height:`Высота`,noObjectsFound:`Объекты не найдены`,objectsLoadedOnPrintStart:`Объекты загрузятся после начала печати`,willBeSkipped:`Будет пропущен`,name:`Название`,serialCannotBeChanged:`Серийный номер нельзя изменить`,locationHelp:`Используется для группировки принтеров и фильтрации заданий в очереди`,wifiSignal:{veryWeak:`Очень слабый`,weak:`Слабый`,fair:`Средний`,good:`Хороший`,excellent:`Отличный`},maintenanceUpToDate:`Обслуживание выполнено — нажмите для просмотра`,maintenance:{title:`На обслуживании`,subtitle:`Принтер приостановлен: подключение отключено, задания из очереди не назначаются, уведомления не отправляются.`,pillLabel:`Обслуживание`,exitButton:`Завершить обслуживание`,menuEnter:`Перевести в режим обслуживания`,menuExit:`Выйти из режима обслуживания`,toastEntered:`Принтер {{name}} переведён в режим обслуживания`,toastExited:`Принтер {{name}} снова в работе`,confirmMidPrintTitle:`Перевести в режим обслуживания во время печати?`,confirmMidPrintMessage:`Принтер {{name}} сейчас печатает. Режим обслуживания отключит MQTT, отслеживание прогресса и уведомление о завершении этого задания. Продолжить?`,editFieldLabel:`Режим обслуживания`,editFieldHelp:`Отключает для принтера MQTT, назначение заданий из очереди и уведомления. Используйте при ремонте, параллельных установках Bambuddy или временной приостановке.`},chamberLightOn:`Включить подсветку камеры`,chamberLightOff:`Выключить подсветку камеры`,files:`Файлы`,browseFiles:`Открыть файлы принтера`,autoOffAfterPrint:`Автовыключение после печати`,autoOffExecuted:`Автовыключение выполнено — включите принтер для сброса состояния`,hmsErrors:`Ошибки HMS`,viewHmsErrors:`Показать ошибки HMS: {{count}}`,resume:`Продолжить`,pause:`Пауза`,stop:`Стоп`,camera:`Камера`,skipObject:`Пропустить объект`,reconnect:`Переподключить`,forceRefresh:`Принудительно обновить`,forceRefreshSuccess:`Запрошено обновление данных`,mqttDebug:`Отладка MQTT`,printerInformation:`Информация о принтере`,copyToClipboard:`Копировать`,copied:`Скопировано!`,state:`Состояние`,wifiSignalLabel:`Сигнал Wi‑Fi`,developerMode:`Режим разработчика`,enabled:`Включён`,disabled:`Отключён`,addedOn:`Добавлен`,sdCard:`SD-карта`,inserted:`Установлена`,notInserted:`Не установлена`,totalPrintHours:`Часов печати`,activeNozzle:`Активное сопло: {{nozzle}}`,nozzleRack:`Держатель сопел`,nozzleDocked:`В держателе`,nozzleMounted:`Установлено`,nozzleActive:`Активно`,nozzleIdle:`Ожидание`,nozzleDiameter:`Диаметр`,nozzleType:`Тип`,nozzleStatus:`Состояние`,nozzleFilament:`Филамент`,nozzleWear:`Износ`,nozzleMaxTemp:`Макс. температура`,nozzleSerial:`Серийный номер`,nozzleHardenedSteel:`Закалённая сталь`,nozzleStainlessSteel:`Нержавеющая сталь`,nozzleTungstenCarbide:`Карбид вольфрама`,nozzleFlow:`Производительность`,nozzleHighFlow:`Высокопоточное`,nozzleStandardFlow:`Стандартное`,firmwareUpdate:`Обновление прошивки`,firmwareInstructions:`На сенсорном экране принтера откройте`,firmwareNav:`Перейдите в раздел`,settings:`Настройки`,firmware:`Прошивка`,discoverPrinters:`Найти принтеры`,searching:`Поиск...`,manualEntry:`Добавить вручную`,addFromCloud:`Добавить из облака`,toast:{printerDeleted:`Принтер удалён`,missingSpoolAssignment:`На принтере {{printer}} началась печать. Не назначены катушки для слотов: {{slots}}`,printerAdded:`Принтер добавлен`,printerUpdated:`Настройки принтера обновлены`,failedToDelete:`Не удалось удалить принтер`,failedToAdd:`Не удалось добавить принтер`,connectionFailedNotAdded:`Не удалось подключиться к принтеру. Проверьте IP-адрес, серийный номер и код доступа, а также убедитесь, что включён режим «Только локальная сеть». Принтер не добавлен.`,failedToUpdate:`Не удалось обновить настройки принтера`,commandSent:`Команда отправлена`,failedToSendCommand:`Не удалось отправить команду`,turnedOn:`Питание {{name}} включено`,failedToPowerOn:`Не удалось включить {{name}}`,scriptTriggered:`Сценарий запущен`,printStopped:`Печать остановлена`,printPaused:`Печать приостановлена`,printResumed:`Печать продолжена`,referenceDeleted:`Эталон удалён`,detectionAreaSaved:`Область обнаружения сохранена`,failedToRunScript:`Не удалось запустить сценарий`,failedToStopPrint:`Не удалось остановить печать`,failedToPausePrint:`Не удалось приостановить печать`,failedToResumePrint:`Не удалось продолжить печать`,failedToControlChamberLight:`Не удалось изменить состояние подсветки камеры`,failedToSetSpeed:`Не удалось изменить скорость печати`,failedToUpdateSetting:`Не удалось изменить настройку`,failedToSkipObjects:`Не удалось пропустить объекты`,failedToRereadRfid:`Не удалось повторно считать RFID`,failedToCheckPlate:`Не удалось проверить пластину`,failedToUpdateLabel:`Не удалось обновить метку`,failedToDeleteReference:`Не удалось удалить эталон`,failedToSaveDetectionArea:`Не удалось сохранить область обнаружения`,plateCheckEnabled:`Проверка пластины включена`,plateCheckDisabled:`Проверка пластины отключена`,calibrationSaved:`Калибровка сохранена`,calibrationFailed:`Не удалось выполнить калибровку`,rfidRereadInitiated:`Запущено повторное считывание RFID`,loadInitiated:`Загрузка филамента…`,unloadInitiated:`Выгрузка филамента…`,failedToLoad:`Не удалось загрузить филамент`,failedToUnload:`Не удалось выгрузить филамент`},connection:{connected:`Подключён`,offline:`Не в сети`},plateStatus:{markCleared:`Отметить пластину как очищенную`,cleared:`Пластина очищена`,notCleared:`Пластина не очищена`,inUse:`Пластина используется`},queue:{inQueue:`В очереди: {{count}} задание`,inQueue_plural:`В очереди: {{count}} заданий`},controls:`Управление`,rfid:{reread:`Повторно считать RFID`},ams:{load:`Загрузить`,unload:`Выгрузить`},bedJog:{limitWarning:`При ручном перемещении ограничения хода не контролируются: из-за ошибки прошивки Bambu программные концевики игнорируются для удалённых команд. Перемещайте осторожно, чтобы избежать столкновения.`,title:`Ручное перемещение`,bed:`Стол`,step:`Шаг (мм)`,up:`Поднять стол`,down:`Опустить стол`,disabledWhilePrinting:`Недоступно во время печати`,notHomedTitle:`Принтер не выполнил парковку по осям`,notHomedMessage:`После последней печати принтер не выполнял Home. Сначала запустите автоматическую парковку для безопасного позиционирования (парковка печатающей головы и поиск нуля по X, Y и Z) либо продолжите перемещение — программные концевики будут отключены.`,homeZ:`Автопарковка`,moveAnyway:`Всё равно переместить`,homingStarted:`Выполняется автопарковка…`},permission:{noAdd:`У вас нет разрешения на добавление принтеров`,noEdit:`У вас нет разрешения на изменение принтеров`,noDelete:`У вас нет разрешения на удаление принтеров`,noControl:`У вас нет разрешения на управление принтерами`,noFiles:`У вас нет разрешения на доступ к файлам принтера`,noAmsRfid:`У вас нет разрешения на повторное считывание RFID AMS`,noSmartPlugControl:`У вас нет разрешения на управление умными розетками`,noCamera:`У вас нет разрешения на просмотр камер`},modal:{addTitle:`Добавить принтер`,editTitle:`Изменить принтер`,myPrinter:`Мой принтер`,selectModel:`Выберите модель…`,locationGroup:`Расположение / группа (необязательно)`,locationPlaceholder:`например: Мастерская, Офис, Подвал`,autoArchiveLabel:`Автоматически архивировать завершённые печати`,fromPrinterSettings:`Из настроек принтера`,modelOptional:`Модель (необязательно)`,saveChanges:`Сохранить изменения`},skipObjects:{tooltip:`Пропустить объекты`,onlyWhilePrinting:`Пропуск объектов доступен только во время печати`,requiresMultiple:`Для пропуска требуется не менее двух объектов`,title:`Пропустить объекты`,matchIdsInfo:`Сопоставьте идентификаторы с экраном принтера`,printerShowsIds:`На экране принтера отображаются идентификаторы объектов на пластине`,skipSelected:`Пропустить выбранные`,skipping:`Пропуск…`,noObjectsSelected:`Объекты не выбраны`,selectObjectsToSkip:`Выберите объекты, которые нужно исключить из текущей печати`,skipped:`пропущен`,objectsSkipped:`Объекты пропущены`,activeCount:`Активно: {{count}}`,waitForLayer:`Пропуск объектов доступен со второго слоя (сейчас слой {{layer}})`,skip:`Пропустить`,confirmTitle:`Пропустить объект?`,confirmMessage:`Пропустить объект «{{name}}»? Это действие нельзя отменить.`},confirm:{deleteTitle:`Удалить принтер`,deleteMessage:`Удалить принтер «{{name}}»? Все параметры подключения будут удалены.`,deleteArchivesNote:`Вся история печати этого принтера будет удалена безвозвратно.`,keepArchivesNote:`История печати сохранится, но больше не будет связана с этим принтером.`,stopTitle:`Остановить печать`,stopMessage:`Остановить текущую печать на принтере «{{name}}»? Задание будет отменено.`,stopButton:`Остановить печать`,pauseTitle:`Приостановить печать`,pauseMessage:`Приостановить текущую печать на принтере «{{name}}»?`,pauseButton:`Приостановить печать`,resumeTitle:`Продолжить печать`,resumeMessage:`Продолжить печать на принтере «{{name}}»?`,resumeButton:`Продолжить печать`,powerOnTitle:`Включить принтер`,powerOnMessage:`Включить питание принтера «{{name}}»?`,powerOnButton:`Включить питание`,powerOffTitle:`Выключить принтер`,powerOffMessage:`Выключить питание принтера «{{name}}»?`,powerOffWarning:`ВНИМАНИЕ: принтер «{{name}}» сейчас печатает. Выключение питания прервёт печать и может повредить принтер. Продолжить?`,powerOffButton:`Выключить питание`,haToggleTitle:`Переключить «{{name}}»`,haToggleMessage:`Переключить сущность Home Assistant {{entity}}? Если она сейчас включена, питание может отключиться.`,haToggleWarning:`ВНИМАНИЕ: принтер «{{name}}» сейчас печатает. Переключение {{entity}} может отключить питание и прервать печать. Продолжить?`,haToggleButton:`Переключить`},bulk:{select:`Выбрать`,selectAll:`Выбрать все`,selectByLocation:`Выбрать по расположению`,selected:`Выбрано: {{count}}`,actions:{stop:`Стоп`,pause:`Пауза`,resume:`Продолжить`,clearPlate:`Освободить стол`,clearHMS:`Очистить уведомления`},confirm:{stopTitle:`Остановить печати: {{count}}`,stopMessage:`Активные печати на {{count}} принтерах будут отменены. Это действие нельзя отменить.`,stopButton:`Остановить все`,pauseTitle:`Приостановить печати: {{count}}`,pauseMessage:`Активные печати на {{count}} принтерах будут приостановлены.`,pauseButton:`Приостановить все`,clearPlateTitle:`Освободить столы: {{count}}`,clearPlateMessage:`Столы на {{count}} принтерах будут отмечены как свободные; после этого могут запуститься задания из очереди.`,clearPlateButton:`Освободить все`},success:`Действие «{{action}}» выполнено на {{count}} принтерах`,partial:`Успешно: {{succeeded}}, с ошибкой: {{failed}}`,noneApplicable:`Ни один из выбранных принтеров не находится в подходящем состоянии`,selectByState:`Выбрать по состоянию`},discovery:{title:`Поиск принтеров`,searching:`Поиск…`,scanning:`Сканирование…`,scanProgress:`Сканирование: {{scanned}}/{{total}}`,foundPrinters:`Найдено принтеров: {{count}}`,noPrintersFound:`Принтеры не найдены`,noPrintersFoundSubnet:`В указанной подсети принтеры не найдены.`,noPrintersFoundNetwork:`Принтеры в сети не найдены.`,allConfigured:`Все найденные принтеры уже настроены.`,alreadyAdded:`Уже добавлен`,select:`Выбрать`,manualEntry:`Добавить вручную`,addFromCloud:`Добавить из облака`,subnetToScan:`Подсеть для сканирования`,dockerNote:`Обнаружен Docker. Укажите подсеть принтера в формате CIDR. В docker-compose.yml требуется network_mode: host.`,scanSubnet:`Сканировать подсеть`,discoverNetwork:`Найти принтеры в сети`,scanningSubnet:`Поиск принтеров Bambu в подсети…`,scanningNetwork:`Сканирование сети…`,serialRequired:`Требуется серийный номер`,unknown:`Неизвестно`,failedToStart:`Не удалось запустить поиск`,customSubnetOption:`Другая подсеть…`,customSubnetLabel:`Другая подсеть (CIDR)`,customSubnetNote:`Используйте другую подсеть, если принтер находится в иной сети. Порты FTP (990) и MQTT (8883) должны быть доступны через маршрутизатор.`},drying:{start:`Начать сушку`,stop:`Остановить сушку`,temperature:`Температура`,duration:`Продолжительность`,hours:`ч`,timeRemaining:`осталось {{time}}`,active:`Сушка`,targetSummary:`{{filament}} при {{temp}} °C`,notSupported:`Сушка не поддерживается`,powerRequired:`Подключите адаптер питания AMS, чтобы включить сушку`,startingDrying:`Запуск сушки...`,toastCommandSent:`Команда сушки отправлена`,toastStopped:`Сушка остановлена`,toastNotStarted:`Принтер принял команду, но AMS не начал сушку. Убедитесь, что адаптер питания AMS подключён, а принтер не занят.`,screenOnly:`На этом принтере управлять сушкой AMS можно только с экрана самого принтера (ограничение Bambu)`,stoppingDrying:`Остановка сушки...`,rotateTray:`Вращать катушку во время сушки`,rotateUnavailableReason:`Недоступно: слот этого AMS сейчас подаёт филамент в печатающую головку. Катушка зафиксирована подающей трубкой и не может вращаться. Сначала выгрузите филамент.`},amsBackup:{titleOn:`Резервный филамент AMS включён. Нажмите, чтобы отключить.`,titleOff:`Резервный филамент AMS выключен. Нажмите, чтобы включить.`,titleUnknown:`Состояние резервного филамента AMS недоступно для этого принтера.`,toastEnabled:`Резервный филамент AMS включён`,toastDisabled:`Резервный филамент AMS отключён`,modalTitle:`Резервный филамент AMS`,modalHelp:`Когда активный слот опустеет, принтер по очереди использует подходящие слоты с тем же профилем и цветом в указанном порядке.`,modalNoSlots:`Филамент не загружен.`,modalNoPairs:`Резервных пар нет: ни у двух слотов не совпадают профиль филамента и цвет.`,extruderRightShort:`П`,extruderLeftShort:`Л`,stateOn:`Включено`,stateOff:`Отключено`,stateUnknown:`Не поддерживается этим принтером`},activeJobSlot:{title:`Этот слот используется как филамент {{n}} в текущей печати`,ariaLabel:`Слот {{n}} текущей печати`},expectedSlot:{title:`Принтер ожидает филамент в этом слоте`,ariaLabel:`Ожидаемый слот филамента {{n}}`,label:`{{ams}} · Слот {{slot}}`,external:`Внешняя катушка`},filaments:`Филаменты`,openCameraOverlay:`Открыть камеру поверх интерфейса`,openCameraWindow:`Открыть камеру в новом окне`,firmwareUpdateAvailable:`Доступно обновление прошивки: {{current}} → {{latest}}`,firmwareUpToDate:`Прошивка {{version}} — актуальная версия`,firmwareUpdateButton:`Обновить`,plateDetection:{noPermission:`У вас нет прав на изменение настроек принтера`,enabledClick:`Проверка пластины включена — нажмите, чтобы отключить`,disabledClick:`Проверка пластины отключена — нажмите, чтобы включить`,manageCalibration:`Управление калибровкой проверки пластины`,calibrationRequired:`Требуется калибровка`,calibrationInstructions:`Убедитесь, что печатная пластина полностью пустая, затем нажмите «Калибровать».`,calibrationDescription:`При калибровке сохраняется эталонное изображение пустой пластины. При последующих проверках система сравнивает снимок с эталоном и обнаруживает посторонние объекты.`,calibrationTip:`Совет: можно сохранить до 5 калибровок для разных пластин. При проверке система автоматически выберет наиболее подходящий эталон.`,plateEmpty:`Пластина выглядит пустой`,objectsDetected:`На пластине обнаружены объекты`,confidence:`Уверенность`,difference:`Различие`,analysisPreview:`Предпросмотр анализа:`,analysisLegend:`Зелёная рамка — область обнаружения, красная заливка — отличия от калибровочного снимка`,savedReferences:`Сохранённые эталоны ({{count}}/{{max}})`,deleteReference:`Удалить эталон`,labelPlaceholder:`Метка...`,clickToEdit:`{{label}} — нажмите для изменения`,clickToAddLabel:`Нажмите, чтобы добавить метку`},speed:{title:`Скорость печати`,silent:`Тихий (50%)`,standard:`Стандартный (100%)`,sport:`Спортивный (124%)`,ludicrous:`Безумный (166%)`},airduct:{title:`Режим воздуховода`,cooling:`Охлаждение`,heating:`Нагрев`},noSdCard:`Нет SD-карты`,door:{open:`Открыта`,closed:`Закрыта`},fans:{partCooling:`Вентилятор обдува модели`,auxiliary:`Дополнительный вентилятор`,chamber:`Вентилятор камеры`},clickToViewHmsErrors:`Нажмите, чтобы посмотреть ошибки HMS`,estimatedCompletion:`Расчётное время завершения`,plateNumber:`Пластина {{number}}`,slotOptions:`Параметры слота`,amsPopup:{friendlyName:`Имя AMS`,friendlyNamePlaceholder:`Например, левый AMS`,serialNumber:`Серийный номер`,firmwareVersion:`Прошивка`,save:`Сохранить`,clear:`Очистить`,noEditPermission:`У вас нет прав на переименование модулей AMS`},firmwareModal:{title:`Обновление прошивки`,titleUpToDate:`Сведения о прошивке`,currentVersion:`Текущая:`,latestVersion:`Последняя:`,releaseNotes:`Примечания к выпуску`,checkingPrereqs:`Проверка условий...`,sdCardReady:`SD-карта готова. Нажмите ниже, чтобы загрузить прошивку.`,uploadedSuccess:`Прошивка загружена на SD-карту!`,applyInstructions:`Чтобы установить обновление на принтер:`,step1:`На экране принтера откройте Настройки`,step2:`Перейдите в раздел Прошивка`,step3:`Выберите Обновить с SD-карты`,step4:`Обновление займёт 10–20 минут`,done:`Готово`,starting:`Запуск...`,uploadFirmware:`Загрузить прошивку`,uploadFailed:`Не удалось начать загрузку: {{error}}`,uploadedToast:`Прошивка загружена. Запустите обновление с экрана принтера.`,availableVersions:`Доступные версии`,usable:`Доступна`,unavailable:`Недоступна`,installed:`Установлена`,newerBadge:`новее`,olderBadge:`старее`,currentBadge:`текущая`},accessCodePlaceholder:`Оставьте пустым, чтобы сохранить текущий`,roi:{title:`Область обнаружения (ROI)`,xStart:`Начало X`,yStart:`Начало Y`,width:`Ширина`,height:`Высота`,instruction:`Настройте область обнаружения так, чтобы она охватывала печатную пластину. Зелёная рамка в предпросмотре показывает текущую область.`},developerModeWarning:`Режим LAN для разработчиков не включён на: {{names}}. Некоторые функции могут не работать.`,howToEnable:`Как включить`,incompatibleFile:`Файл подготовлен для {{slicedFor}}, а выбранный принтер — {{printerModel}}`,dropNotPrintable:`Для печати подходят только файлы .gcode и .gcode.3mf`,dropToPrint:`Перетащите файл для печати`,cannotPrint:`Принтер занят`},archives:{title:`Архив печати`,no3mfBanner:{title:`Некоторые последние задания сохранены без миниатюр`,body:`Слайсер не оставил файл .gcode.3mf на SD-карте принтера, поэтому Bambuddy не смог получить миниатюру и метаданные слайсера. Обычно это происходит, если в слайсере отключена настройка «Сохранять отправленные файлы во внешнем хранилище» (вкладка «Устройство» в Bambu Studio / OrcaSlicer).`,docsLink:`См. шаг 4 установки`,dismissLabel:`Закрыть это уведомление`},searchPlaceholder:`Поиск в архиве...`,filterByPrinter:`Фильтр по принтеру`,filterByStatus:`Фильтр по состоянию`,sortBy:`Сортировать по`,sortNewest:`Сначала новые`,sortOldest:`Сначала старые`,sortName:`Названию`,sortDuration:`Длительности`,sortLargest:`Сначала большие`,sortSmallest:`Сначала маленькие`,sortSize:`Размеру`,noArchives:`Архивы не найдены`,noArchivesSearch:`По вашему запросу ничего не найдено`,originalPrintNotVisible:`Исходная печать не отображается — попробуйте сбросить фильтры`,noArchivesYet:`Архив пока пуст`,prints:`печатей`,pagination:{showing:`Показано`,to:`–`,of:`из`,show:`Показывать`,page:`Страница`,all:`Все`},loadingArchives:`Загрузка архива...`,releaseToUpload:`Отпустите файлы для загрузки`,showAll:`Показать все`,showFavoritesOnly:`Только избранное`,gridView:`Плитка`,listView:`Список`,calendarView:`Календарь`,logView:`Журнал печати`,manageTags:`Управление тегами`,showFailedPrints:`Показывать неудачные печати`,hideFailedPrints:`Скрывать неудачные печати`,hideDuplicates:`Скрывать дубликаты`,viewOriginalPrint:`Открыть исходную печать №{{id}}`,printTime:`Время печати`,filamentUsed:`Израсходовано филамента`,cost:`Стоимость`,preview:`Предпросмотр`,deleteArchive:`Удалить запись из архива`,deleteConfirm:`Удалить эту запись из архива?`,favorite:`В избранное`,unfavorite:`Удалить из избранного`,viewDetails:`Подробнее`,status:{completed:`Завершено`,failed:`Ошибка`,stopped:`Остановлено`},toast:{source3mfAttached:`Исходный 3MF прикреплён: {{filename}}`,failedUploadSource3mf:`Не удалось загрузить исходный 3MF`,source3mfRemoved:`Исходный 3MF удалён`,failedRemoveSource3mf:`Не удалось удалить исходный 3MF`,f3dAttached:`F3D прикреплён: {{filename}}`,failedUploadF3d:`Не удалось загрузить F3D`,f3dRemoved:`F3D удалён`,failedRemoveF3d:`Не удалось удалить F3D`,timelapseAttached:`Таймлапс прикреплён: {{filename}}`,timelapseAlreadyAttached:`Таймлапс уже прикреплён`,noMatchingTimelapse:`Подходящий таймлапс не найден`,failedScanTimelapse:`Не удалось найти таймлапс`,failedAttachTimelapse:`Не удалось прикрепить таймлапс`,timelapseRemoved:`Таймлапс удалён`,failedRemoveTimelapse:`Не удалось удалить таймлапс`,timelapseUploaded:`Таймлапс загружен: {{filename}}`,failedUploadTimelapse:`Не удалось загрузить таймлапс`,archiveDeleted:`Запись удалена из архива`,failedDeleteArchive:`Не удалось удалить запись из архива`,addedToFavorites:`Добавлено в избранное`,removedFromFavorites:`Удалено из избранного`,projectUpdated:`Проект обновлён`,failedUpdateProject:`Не удалось обновить проект`,linkCopied:`Ссылка скопирована`,failedCopyLink:`Не удалось скопировать ссылку`,photoDeleted:`Фотография удалена`,failedDeletePhoto:`Не удалось удалить фотографию`,failedDeleteArchives:`Не удалось удалить записи из архива`,failedUpdateFavorites:`Не удалось обновить избранное`,exportDownloaded:`Экспортированный файл скачан`,exportFailed:`Ошибка экспорта`},menu:{print:`Печать`,openInBambuStudio:`Открыть в слайсере`,slice:`Нарезать`,externalLink:`Внешняя ссылка`,viewOnMakerWorld:`Открыть на MakerWorld`,preview3d:`3D-просмотр`,viewTimelapse:`Посмотреть таймлапс`,scanForTimelapse:`Найти таймлапс`,uploadTimelapse:`Загрузить таймлапс`,removeTimelapse:`Удалить таймлапс`,downloadSource3mf:`Скачать исходный 3MF`,uploadSource3mf:`Загрузить исходный 3MF`,replaceSource3mf:`Заменить исходный 3MF`,removeSource3mf:`Удалить исходный 3MF`,uploadF3d:`Загрузить F3D`,replaceF3d:`Заменить F3D`,downloadF3d:`Скачать F3D`,removeF3d:`Удалить F3D`,download:`Скачать`,copyDownloadLink:`Скопировать ссылку для скачивания`,qrCode:`QR-код`,viewPhotos:`Посмотреть фотографии`,viewPhotosCount:`Фотографии ({{count}})`,projectPage:`Страница проекта`,addToFavorites:`Добавить в избранное`,removeFromFavorites:`Удалить из избранного`,edit:`Изменить`,printLog:`Журнал печати`,goToProject:`Открыть проект: {{name}}`,addToProject:`Добавить в проект`,removeFromProject:`Удалить из проекта`,loading:`Загрузка...`,noProjectsAvailable:`Нет доступных проектов`,searchProjects:`Поиск проектов…`,select:`Выбрать`,deselect:`Снять выделение`,delete:`Удалить`},permission:{noReprint:`У вас нет разрешения на повторную печать этой записи`,noAddToQueue:`У вас нет разрешения на добавление в очередь`,noUpdateArchives:`У вас нет разрешения на изменение архива`,noUploadFiles:`У вас нет разрешения на загрузку файлов`,noDownload:`У вас нет разрешения на скачивание файлов из архива`,noCopyLink:`У вас нет разрешения на копирование ссылок для скачивания`,noDelete:`У вас нет разрешения на удаление этой записи`,noEdit:`У вас нет разрешения на изменение этой записи`,noCreate:`У вас нет разрешения на создание записей в архиве`},platePicker:{title:`Выберите пластину для предпросмотра`,hint:`В этой записи несколько пластин. Выберите пластину, которую нужно открыть в просмотрщике G-code.`,plateLabel:`Пластина {{index}}`,objectCount:`{{count}} объект`,objectCount_plural:`{{count}} объектов`,noGcode:`В этой записи нет нарезанного G-code для предпросмотра. Сначала откройте файл в Bambu Studio и выполните нарезку.`},card:{previousPlate:`Предыдущая пластина`,nextPlate:`Следующая пластина`,plateNumber:`Пластина {{index}}`,moreOptions:`Щёлкните правой кнопкой для дополнительных действий`,addToFavorites:`Добавить в избранное`,removeFromFavorites:`Удалить из избранного`,cancelled:`отменено`,failed:`ошибка`,duplicate:`дубликат`,duplicateTitle:`Эта модель уже печаталась`,openSource3mf:`Открыть исходный 3MF в Bambu Studio (щёлкните правой кнопкой для дополнительных действий)`,downloadF3d:`Скачать файл проекта Fusion 360`,viewTimelapse:`Посмотреть таймлапс`,viewPhoto:`Посмотреть фотографию`,viewPhotos:`Посмотреть фотографии: {{count}}`,openFolder:`Открыть папку: {{name}}`,slicedFile:`Нарезанный файл — готов к печати`,sourceFile:`Только исходный файл — сопоставление AMS недоступно`,gcode:`G-CODE`,source:`ИСХОДНИК`,project:`Проект: {{name}}`,runsBadge:`Печатей: {{count}}`,runsBadgeTitle:`Всего печатей: {{count}}, успешных: {{successful}}, неудачных: {{failed}}. Нажмите, чтобы открыть полный журнал.`,estimated:`Расчётное время: {{time}}`,actual:`Фактическое время: {{time}}`,accuracy:`Точность оценки: {{percent}}%`,filament:`{{weight}} г`,layer:`{{count}} слой`,layers:`{{count}} слоёв`,object:`{{count}} объект`,objects:`{{count}} объектов`,slicedFor:`Нарезано для {{model}}`,uploadedBy:`Загрузил`,noPermissionReprint:`У вас нет разрешения на повторную печать`,noFileForReprint:`Файл 3MF недоступен: при сохранении задания не удалось скачать его с принтера`,noPermissionEdit:`У вас нет разрешения на изменение архива`,noPermissionDelete:`У вас нет разрешения на удаление записей из архива`,openInBambuStudio:`Открыть в слайсере`,openInBambuStudioToSlice:`Открыть в слайсере для нарезки`,slice:`Нарезать`,externalLink:`Внешняя ссылка`,makerWorld:`MakerWorld: {{designer}}`,viewProject:`Открыть проект`,noExternalLink:`Внешняя ссылка не указана`,preview3d:`3D-просмотр`,download:`Скачать`,edit:`Изменить`,delete:`Удалить`},runLog:{title:`Журнал печати`,modalTitle:`Журнал печати — {{name}}`,modalTitleFallback:`эта запись`,empty:`Для этой записи пока нет событий печати.`,col:{date:`Дата`,status:`Состояние`,duration:`Длительность`,filament:`Филамент`,cost:`Стоимость`},status:{completed:`Завершено`,failed:`Ошибка`,cancelled:`Отменено`,stopped:`Остановлено`,skipped:`Пропущено`,printing:`Печать`}},modal:{deleteArchive:`Удаление записи из архива`,deleteConfirm:`Удалить «{{name}}»? Это действие нельзя отменить.`,deleteButton:`Удалить`,deletePurgeStats:`Также исключить эту печать из краткой статистики: филамент, время, стоимость и энергия`,deleteQueueItemsWarning:`Также будут удалены связанные элементы очереди: {{count}}.`,deleteBlockedByPrinting:`Удаление невозможно: сейчас печатаются связанные элементы очереди ({{count}}). Сначала остановите печать.`,removeSource3mf:`Удаление исходного 3MF`,removeSource3mfConfirm:`Удалить исходный файл 3MF из «{{name}}»? Исходный проект слайсера будет удалён.`,removeButton:`Удалить`,removeF3d:`Удаление F3D`,removeF3dConfirm:`Удалить файл проекта Fusion 360 из «{{name}}»?`,removeTimelapse:`Удаление таймлапса`,removeTimelapseConfirm:`Удалить видео таймлапса из «{{name}}»?`,timelapse:`{{name}} — таймлапс`,selectTimelapse:`Выбор таймлапса`,selectTimelapseDesc:`Автоматически найти совпадение не удалось. Выберите таймлапс для этой печати:`,deleteArchives:`Удаление записей из архива`,deleteArchivesConfirm:`Удалить записи из архива ({{count}})? Это действие нельзя отменить.`,deleteCount:`Удалить: {{count}}`},page:{title:`Архив`,printsCount:`Показано {{filtered}} из {{total}} печатей`,dropFilesHere:`Перетащите сюда файлы .3mf`,releaseToUpload:`Отпустите файлы для загрузки`,only3mfSupported:`Поддерживаются только файлы .3mf`,close:`Закрыть`,selected:`Выбрано: {{count}}`,selectAll:`Выбрать все`,tags:`Теги`,project:`Проект`,favorite:`Избранное`,delete:`Удалить`,toggledFavorites:`Избранное изменено для записей: {{count}}`,failedUpdateFavorites:`Не удалось обновить избранное`,archivesDeleted:`Удалено записей: {{count}}`,failedDeleteArchives:`Не удалось удалить записи из архива`,photoDeleted:`Фотография удалена`,failedDeletePhoto:`Не удалось удалить фотографию`},list:{name:`Название`,printer:`Принтер`,date:`Дата`,size:`Размер`,actions:`Действия`,hasTimelapse:`Есть таймлапс`},log:{date:`Дата`,printName:`Название печати`,printer:`Принтер`,user:`Пользователь`,status:`Состояние`,duration:`Длительность`,filament:`Филамент`,allPrinters:`Все принтеры`,allUsers:`Все пользователи`,allStatuses:`Все состояния`,cancelled:`Отменено`,skipped:`Пропущено`,dateFrom:`С`,dateTo:`По`,noEntries:`Записи журнала не найдены`,showing:`Показано {{count}} из {{total}} записей`,rowsPerPage:`Строк`,page:`Страница`,prev:`Назад`,next:`Далее`,clearLog:`Очистить журнал`,clearLogTitle:`Очистка журнала печати`,clearLogConfirm:`Все записи журнала печати будут удалены без возможности восстановления. Архив и очередь не изменятся. Продолжить?`,clearLogButton:`Очистить всё`,cleared:`Удалено записей журнала: {{count}}`,clearFailed:`Не удалось очистить журнал печати`,deleteEntryTitle:`Удаление записи журнала`,deleteEntryConfirm:`Запись будет удалена из журнала, а её вклад в расход филамента, время и стоимость исчезнет из краткой статистики. Связанная запись архива, если она существует, не изменится. Это действие нельзя отменить.`,entryDeleted:`Запись журнала удалена`,entryDeleteFailed:`Не удалось удалить запись журнала`,editEntryTitle:`Изменение записи журнала`,editEntryDescription:`Укажите результат этой печати. Виджет анализа отказов группирует данные по этим значениям, поэтому изменения сразу отразятся в статистике.`,entryUpdated:`Запись журнала обновлена`,entryUpdateFailed:`Не удалось обновить запись журнала`,statuses:{completed:`Завершено`,failed:`Ошибка`,stopped:`Остановлено`,cancelled:`Отменено`,skipped:`Пропущено`}}},dispatchToast:{untitled:`Задание печати`,startingPrints:`Запуск печати`,progressSummary:`Завершено: {{complete}}/{{total}} • Обрабатывается: {{processing}}`,expandDetails:`Показать подробности отправки`,collapseDetails:`Скрыть подробности отправки`,awaitingPrinter:`Ожидание принтера…`,status:{processing:`Обработка`,completed:`Завершено`,failed:`Ошибка`},failed:{generic:`Не удалось отправить задание`,upload_failed:`Не удалось загрузить файл на принтер`,start_command_failed:`Принтер отклонил команду запуска`},dismiss:`Закрыть`},pipelineRuns:{title:`Запуски конвейеров`,loading:`Загрузка…`,empty:`Конвейеры ещё не запускались.`,filter:{pipeline:`Конвейер`,status:`Состояние`,target:`Назначение`,all:`Все`,allPipelines:`Все конвейеры`,allStatus:`Все состояния`,allTargets:`Все назначения`,clear:`Сбросить фильтры`,noMatches:`Нет запусков, соответствующих выбранным фильтрам.`},totalCount_one:`{{n}} запуск`,totalCount_other:`{{n}} запусков`,copies:`Копий: {{n}}`,failedCount:`Ошибок: {{n}}`,copyN:`Копия {{n}}`,retryFailed:`Повторить неудачные`,retryOf:`повтор запуска №{{n}}`,pagination:`{{start}}–{{end}} из {{total}}`,cancelledByUser:`Отменено пользователем`,toast:{cancelled:`Запуск отменён`,cancelFailed:`Не удалось отменить запуск`,retryStarted:`Повторный запуск начат`,retryFailed:`Повторный запуск не удался`,cleared:`Удалено запусков: {{n}}`,clearFailed:`Не удалось очистить журнал`},clearLog:`Очистить журнал`,clearConfirmTitle:`Очистить журнал?`,clearConfirmBody:`Удалить все завершённые, неудачные, отменённые и частично неудачные запуски конвейеров? Выполняющиеся запуски сохранятся. Это действие нельзя отменить.`,clearConfirmAction:`Очистить`,jobStatus:{pending:`ожидание`,awaiting_printer:`ожидание принтера`,queued:`в очереди`,printing:`печать`,completed:`завершено`,failed:`ошибка`,cancelled:`отменено`}},queue:{title:`Очередь печати`,subtitle:`Планирование и управление заданиями печати`,filamentShort:{rowBadge:`Для назначенной катушки недостаточно филамента`,rowTooltip:`Планировщик отметил это задание. Нажмите «Запустить», чтобы увидеть нехватку по каждому слоту и решить, печатать ли всё равно.`,confirmTitle:`Недостаточно филамента`,confirmIntro:`Назначенной катушки недостаточно как минимум для одного слота. Всё равно запустить печать?`,lineItem:`Слот {{slot}}: требуется {{required}} г, осталось {{remaining}} г`,unknown:`неизвестно`,printAnyway:`Всё равно печатать`},editQueueItem:`Изменить задание в очереди`,selectAllPlates:`Выбрать все пластины ({{count}})`,deselectAll:`Снять выделение`,printQueued:`Задание добавлено в очередь`,printQueuedWillStartWhenIdle:`Запустится, когда принтер освободится`,itemsQueued:`Добавлено в очередь: {{count}}`,sending:`Отправка...`,sendingProgress:`Отправка {{current}} из {{total}}...`,adding:`Добавление...`,addingProgress:`Добавление {{current}} из {{total}}...`,savingProgress:`Сохранение {{current}} из {{total}}...`,clearQueue:`Очистить очередь`,clearHistory:`Очистить историю`,emptyQueue:`Очередь пуста`,position:`Позиция`,scheduledTime:`Запланированное время`,moveUp:`Переместить вверх`,moveDown:`Переместить вниз`,startNow:`Запустить сейчас`,printingInProgress:`Идёт печать...`,viewArchive:`Открыть архив`,viewInFileManager:`Открыть в файловом менеджере`,itemCount:`{{count}} задание`,itemCount_plural:`{{count}} заданий`,dragToReorder:`Перетащите для изменения порядка (только задания «как можно скорее»)`,reorderHint:`Позиция влияет только на задания «как можно скорее». Запланированные задания запускаются в указанное время.`,sjf:{label:`SJF`,tooltip:`Shortest Job First — планировщик отдаёт приоритет более коротким заданиям`},addedBy:`Добавил: {{name}}`,nextInQueue:`Следующее в очереди`,clearPlateSuccess:`Пластина очищена — можно запускать следующую печать`,plateNumber:`Пластина {{index}}`,quantity:`Количество`,quantityHint:`Будет создано заданий: {{count}}`,activeBatches:`Активные партии`,batchProgress:`Выполнено {{completed}} из {{total}}`,cancelBatch:`Отменить оставшиеся`,batchCancelled:`Оставшиеся задания партии отменены`,cancelBatchConfirmTitle:`Отменить партию`,cancelBatchConfirmMessage:`Отменить все оставшиеся задания этой партии?`,batch:{defaultName:`Партия`,label:`{{count}} задание`,label_plural:`{{count}} заданий`,pendingCount:`Ожидает: {{count}}`,pendingCount_plural:`Ожидают: {{count}}`,expand:`Развернуть партию`,collapse:`Свернуть партию`,groupAsBatch:`Объединить в партию…`,groupAsBatchDescription:`Объединить выбранные задания ({{count}}) в одну сворачиваемую партию.`,nameLabel:`Название партии`,namePlaceholder:`Например: подарки к пятнице`,create:`Создать партию`,ungroup:`Разгруппировать`,ungroupConfirmTitle:`Разгруппировать партию?`,ungroupConfirmMessage:`Задания останутся в очереди, но больше не будут объединены в одну группу.`,dragGroup:`Перетащить группу`},tabs:{queue:`Очередь`,history:`История`,timeline:`Временная шкала`,pipelines:`Конвейеры`},layout:{flatList:`Список`,byPrinter:`По принтерам`,groupByPrinter:`Группировать по принтерам`},history:{emptyTitle:`История пока пуста`,emptyDescription:`Здесь появятся завершённые, отменённые и неудачные задания.`},dragGhost:{multiCount:`{{count}} заданий`,batch:`{{name}} ({{count}} копия)`,batch_plural:`{{name}} ({{count}} копий)`},sections:{currentlyPrinting:`Сейчас печатается`,queued:`В очереди`,history:`История`},status:{pending:`Ожидает`,waiting:`Ожидание`,printing:`Печать`,paused:`Приостановлено`,completed:`Завершено`,failed:`Ошибка`,skipped:`Пропущено`,cancelled:`Отменено`},summary:{printing:`Печатается`,queued:`В очереди`,totalTime:`Общее время очереди`,totalWeight:`Общий вес очереди`,history:`История`},filter:{allPrinters:`Все принтеры`,unassigned:`Не назначено`,allStatus:`Все состояния`,allLocations:`Все расположения`,any:`Любое`},sort:{byPosition:`По позиции`,byName:`По названию`,byPrinter:`По принтеру`,bySchedule:`По времени запуска`,byDate:`По дате`,ascendingOldest:`По возрастанию (сначала старые)`,descendingNewest:`По убыванию (сначала новые)`},badges:{staged:`Подготовлено`,requiresPrevious:`Требуется успешное предыдущее задание`,autoPowerOff:`Автоотключение питания`,gcodeInjection:`G-code`},empty:{title:`Нет запланированных заданий`,description:`Запланируйте печать на странице архива через пункт «Запланировать» в контекстном меню либо перетащите сюда файлы.`},time:{asap:`Как можно скорее`,overdue:`Просрочено`,now:`Сейчас`,lessThanMinute:`Меньше чем через минуту`,inMinutes:`Через {{count}} мин`,inHours:`Через {{count}} ч`},actions:{startPrint:`Запустить печать`,stopPrint:`Остановить печать`,requeue:`Вернуть в очередь`},bulkEdit:{title:`Изменить {{count}} задание`,title_plural:`Изменить задания: {{count}}`,description:`К выбранным заданиям будут применены только изменённые параметры.`,printer:`Принтер`,noChange:`— Без изменений —`,queueOptions:`Параметры очереди`,staged:`Подготовлено (ручной запуск)`,autoPowerOff:`Отключить питание после печати`,requirePrevious:`Требовать успешного завершения предыдущего задания`,printOptions:`Параметры печати`,bedLevelling:`Калибровка стола`,flowCalibration:`Калибровка потока`,vibrationCalibration:`Калибровка вибраций`,layerInspection:`Проверка первого слоя`,timelapse:`Таймлапс`,useAms:`Использовать AMS`,nozzleOffsetCali:`Калибровка смещения сопел`,applyChanges:`Применить изменения`,selectAll:`Выбрать все`,deselectAll:`Снять выделение`,selected:`Выбрано: {{count}}`,editSelected:`Изменить выбранные`,cancelSelected:`Отменить выбранные`},confirm:{cancelTitle:`Отменить запланированную печать`,cancelMessage:`Отменить задание «{{name}}»?`,stopTitle:`Остановить печать`,stopMessage:`Остановить текущую печать «{{name}}»? Задание на принтере будет отменено.`,removeTitle:`Удалить из истории`,removeMessage:`Удалить «{{name}}» из истории очереди?`,clearHistoryTitle:`Очистить историю`,clearHistoryMessage:`Удалить все записи из истории ({{count}})?`,cancelButton:`Отменить печать`,stopButton:`Остановить печать`,thisPrint:`эту печать`,thisItem:`это задание`},toast:{cancelled:`Задание отменено`,cancelFailed:`Не удалось отменить задание`,removed:`Задание удалено`,removeFailed:`Не удалось удалить задание`,stopped:`Печать остановлена`,stopFailed:`Не удалось остановить печать`,released:`Задание передано в очередь`,startFailed:`Не удалось запустить печать`,reorderFailed:`Не удалось изменить порядок очереди`,historyCleared:`Удалено записей истории: {{count}}`,clearHistoryFailed:`Не удалось очистить историю`,updateFailed:`Не удалось обновить задания`,bulkCancelled:`Отменено заданий: {{count}}`,bulkCancelFailed:`Не удалось отменить задания`,batchCreated:`Партия «{{name}}» создана`,batchCreateFailed:`Не удалось создать партию`,batchUngrouped:`Разгруппировано заданий: {{count}}`,batchUngroupFailed:`Не удалось разгруппировать партию`,resumedAfterFailure:`Очередь возобновлена — восстановлено заданий: {{restored}}`,resumeAfterFailureFailed:`Не удалось возобновить очередь`},resumeAfterFailure:{banner:`Очередь принтера {{printer}} заблокирована из-за ошибки предыдущей печати — пропущено заданий: {{count}}`,bannerHint:`Устраните проблему с принтером, затем возобновите очередь, чтобы вернуть пропущенные задания и снять блокировку.`,button:`Возобновить после ошибки`,confirmTitle:`Возобновить очередь после ошибки?`,confirmMessage:`Вернуть пропущенные задания ({{count}}) для принтера {{printer}} в состояние ожидания и снять блокировку. Перед продолжением убедитесь, что принтер готов.`},timeline:{listView:`Список`,timelineView:`Временная шкала`,unassigned:`Не назначено`,noData:`На этот день печать не запланирована`,nothingCommitted:`В этом интервале нет заданий с фиксированным временем. Подготовленные и ожидающие задания, а также задания «как можно скорее» на свободных принтерах не показываются — задайте время запуска или выпустите подготовленное задание в очередь.`,allDoneBy:`Расчётное завершение всех заданий: {{time}}`,staged:`Подготовлено`,filterAll:`Показать все`,filterPrinting:`Печатается`,filterQueued:`В очереди`,time:{anyMoment:`в любой момент`,minutesLeft:`осталось {{minutes}} мин`,hoursLeft:`осталось {{hours}} ч`,hoursMinutesLeft:`осталось {{hours}} ч {{minutes}} мин`},day:{previous:`Предыдущий день`,next:`Следующий день`,today:`Сегодня`},window:{back12h:`Назад на 12 часов`,forward12h:`Вперёд на 12 часов`,now:`Сейчас`},printerColumnHeader:`Принтер`},permissions:{noStopPrint:`У вас нет разрешения останавливать печать`,noStartPrint:`У вас нет разрешения запускать печать`,noEdit:`У вас нет разрешения изменять это задание`,noCancel:`У вас нет разрешения отменять это задание`,noRequeue:`У вас нет разрешения возвращать задания в очередь`,noRemove:`У вас нет разрешения удалять это задание`,noClearHistory:`У вас нет разрешения очищать историю`,noEditItems:`У вас нет разрешения изменять задания очереди`,noCancelItems:`У вас нет разрешения отменять задания очереди`}},stats:{title:`Статистика`,subtitle:`Перетаскивайте виджеты для изменения порядка. Нажмите значок глаза, чтобы скрыть виджет.`,overview:`Обзор`,totalPrints:`Всего печатей`,successRate:`Успешность`,totalPrintTime:`Общее время печати`,printTime:`Время печати`,totalFilament:`Всего использовано филамента`,filamentUsed:`Использовано филамента`,filamentCost:`Стоимость филамента`,totalCost:`Общая стоимость`,energyUsed:`Потреблено энергии`,energyCost:`Стоимость энергии`,energyWarmingUpTooltip:`Учёт энергии ещё накапливает почасовые снимки. Итоги за выбранный период станут точными, когда появится хотя бы один снимок до начала этого периода. Первые значения могут быть занижены.`,averagePrintTime:`Среднее время печати`,printsPerDay:`Печатей в день`,byPrinter:`По принтерам`,printsByPrinter:`Печати по принтерам`,byMaterial:`По материалам`,byMonth:`По месяцам`,last7Days:`Последние 7 дней`,last30Days:`Последние 30 дней`,last90Days:`Последние 90 дней`,allTime:`За всё время`,quickStats:`Краткая статистика`,printActivity:`Активность печати`,filamentTypes:`Типы филамента`,filamentTrends:`Расход филамента`,failureAnalysis:`Анализ неудач`,timeAccuracy:`Точность оценки времени`,successful:`Успешно:`,failed:`Неудачно:`,cancelled:`Отменено:`,perfectEstimate:`100% — точное совпадение с оценкой`,noTimeAccuracyData:`Данных о точности оценки времени пока нет`,noFilamentData:`Нет данных о филаменте`,noPrinterData:`Нет данных о принтерах`,noPrintData:`Нет данных о печати`,noPrintDataLast30Days:`За последние 30 дней данных о печати нет`,failureReasons:`Причины неудач`,topFailureReasons:`Основные причины неудач`,failedPrintsCount:`Неудачных печатей: {{failed}} из {{total}}`,lastWeekRate:`За прошлую неделю: {{rate}}%`,resetLayout:`Сбросить расположение`,recalculateCosts:`Пересчитать стоимость`,recalculateCostsHint:`Пересчитать стоимость всех архивных заданий по текущим ценам филамента`,exportStats:`Экспорт статистики`,exportAsCsv:`Экспорт в CSV`,exportAsExcel:`Экспорт в Excel`,hiddenCount:`Скрыто: {{count}}`,exportDownloaded:`Файл экспорта скачан`,exportFailed:`Не удалось экспортировать данные`,layoutReset:`Расположение сброшено`,recalculatedCosts:`Пересчитана стоимость архивов: {{count}}`,recalculateFailed:`Не удалось пересчитать стоимость`,loadingStats:`Загрузка статистики...`,noPermissionResetLayout:`У вас нет разрешения сбрасывать расположение`,noPermissionRecalculate:`У вас нет разрешения пересчитывать стоимость`,noPrintDataInRange:`В выбранном периоде нет данных о печати`,periodFilament:`Филамент за период`,periodCost:`Стоимость за период`,avgPerPrint:`В среднем на печать`,usageOverTime:`Расход по времени`,filamentByWeight:`По весу`,printDuration:`Продолжительность печати`,printerUtilization:`Загрузка принтеров`,filamentSuccess:`Успешность по материалам`,printHabits:`Характер печати`,printTimeOfDay:`Время суток`,colorDistribution:`Распределение по цветам`,noColorData:`Нет данных о цветах`,records:`Рекорды`,longestPrint:`Самая долгая печать`,heaviestPrint:`Самая тяжёлая печать`,mostExpensivePrint:`Самая дорогая печать`,busiestDay:`Самый загруженный день`,successStreak:`Серия успешных печатей`,streakPrint:`успешная печать подряд`,streakPrints:`{{count}} успешных печатей подряд`,printerStats:`Статистика принтеров`,hours:`часов`,avgPrints:`В среднем печатей`,noArchiveData:`Нет данных о печати`,filamentByTime:`По времени`,avgWeight:`Средний вес`,avgTime:`Среднее время`,filamentByPrints:`По количеству печатей`,timeframe:{today:`Сегодня`,"this-week":`Эта неделя`,"this-month":`Этот месяц`,"last-7":`Последние 7 дней`,"last-30":`Последние 30 дней`,"last-90":`Последние 90 дней`,"this-year":`Этот год`,"all-time":`За всё время`,custom:`Произвольный период`,from:`С`,to:`По`},allUsers:`Все пользователи`,noUser:`Без пользователя (система)`,filterByUser:`Фильтр по пользователю`},maintenance:{title:`Обслуживание`,overview:`Обзор`,allOk:`Всё обслуживание выполнено вовремя`,dueCount:`Требуется выполнить: {{count}}`,dueCount_plural:`Требуется выполнить: {{count}}`,warningCount:`Предупреждений: {{count}}`,warningCount_plural:`Предупреждений: {{count}}`,totalPrintTime:`Общее время печати`,nextMaintenance:`Следующее обслуживание`,nothingDue:`Пока ничего не требуется`,tasks:`Задачи`,lastPerformed:`Последнее выполнение`,interval:`Интервал`,hoursRemaining:`Осталось {{hours}} ч`,hoursOverdue:`Просрочено на {{hours}} ч`,markDone:`Отметить выполненным`,performMaintenance:`Выполнить обслуживание`,history:`История`,noHistory:`История обслуживания пуста`,editPrintHours:`Изменить часы печати`,currentHours:`Текущие часы`,statusTab:`Состояние`,settingsTab:`Настройки`,overdueCount:`Просрочено: {{count}}`,dueSoonCount:`Скоро потребуется: {{count}}`,dueSoon:`Скоро потребуется`,allGood:`Всё в порядке`,overdueBy:`Просрочено на {{duration}}`,dueIn:`Через {{duration}}`,timeLeft:`Осталось {{duration}}`,day:`1 день`,days:`{{count}} дней`,week:`1 неделя`,weeks:`{{count}} недель`,month:`1 месяц`,months:`{{count}} месяцев`,year:`1 год`,maintenanceTypes:`Виды обслуживания`,maintenanceTypesDescription:`Системные и пользовательские задачи обслуживания`,addCustomType:`Добавить пользовательскую задачу`,restoreDefaults:`Восстановить стандартные задачи`,intervalType:`Тип интервала`,intervalValue:`Интервал ({{type}})`,icon:`Значок`,documentationLink:`Ссылка на документацию (необязательно)`,assignToPrinters:`Назначить принтерам`,selectAtLeastOnePrinter:`Выберите хотя бы один принтер`,addType:`Добавить вид`,custom:`Пользовательский`,printHours:`Часы печати`,calendarDays:`Календарные дни`,exampleName:`Например: заменить HEPA-фильтр`,viewDocumentation:`Открыть документацию`,timeBasedInterval:`Интервал по времени`,intervalOverrides:`Переопределение интервалов`,intervalOverridesDescription:`Настройка отдельных интервалов для конкретных принтеров`,assignedToPrinters:`Назначено принтерам:`,noPrintersAssigned:`Не назначено ни одному принтеру`,addPrinterShort:`Добавить:`,printersAssignedClick:`Назначено принтерам: {{count}} — нажмите для управления`,removeFromPrinter:`Убрать с этого принтера`,types:{lubricateCarbonRods:`Смазать карбоновые валы`,lubricateRails:`Смазать линейные направляющие`,cleanNozzle:`Очистить сопло/хотэнд`,checkBelts:`Проверить натяжение ремней`,cleanBuildPlate:`Очистить печатную пластину`,checkExtruder:`Проверить шестерни экструдера`,checkCooling:`Проверить вентиляторы охлаждения`,generalInspection:`Общий осмотр`,cleanCarbonRods:`Очистить карбоновые валы`,lubricateSteelRods:`Смазать стальные валы`,cleanSteelRods:`Очистить стальные валы`,cleanLinearRails:`Очистить линейные направляющие`,checkPtfeTube:`Проверить PTFE-трубку`,replaceHepaFilter:`Заменить HEPA-фильтр`,replaceCarbonFilter:`Заменить угольный фильтр`,lubricateLeftNozzleRail:`Смазать направляющую левого сопла`},maintenanceComplete:`Обслуживание отмечено выполненным`,typeUpdated:`Вид обслуживания обновлён`,typeDeleted:`Вид обслуживания удалён`,defaultsRestored:`Восстановлено стандартных задач: {{count}}`,printHoursUpdated:`Часы печати обновлены`,printerAssigned:`Принтер назначен`,printerRemoved:`Принтер удалён из назначения`,deleteTypeConfirm:`Удалить «{{name}}»?`,deleteSystemTypeTitle:`Удалить стандартную задачу обслуживания?`,deleteSystemTypeMessage:`Удалить стандартную задачу обслуживания «{{name}}»?`,noPermissionUpdate:`У вас нет разрешения обновлять задачи обслуживания`,noPermissionPerform:`У вас нет разрешения отмечать обслуживание выполненным`,noPermissionEditTypes:`У вас нет разрешения изменять виды обслуживания`,noPermissionDeleteTypes:`У вас нет разрешения удалять виды обслуживания`,noPermissionEditHours:`У вас нет разрешения изменять часы печати`,noPermissionRemovePrinter:`У вас нет разрешения удалять назначения принтеров`,noPermissionAssignPrinter:`У вас нет разрешения назначать принтеры`,noPermissionEditIntervals:`У вас нет разрешения изменять интервалы`,configureSettings:`Настроить виды обслуживания и интервалы`},settings:{title:`Настройки`,general:`Общие`,tabs:{general:`Общие`,smartPlugs:`Умные розетки`,notifications:`Уведомления`,queue:`Рабочий процесс`,queueDispatch:`Очередь и отправка`,queuePipelines:`Конвейеры`,filament:`Филамент`,network:`Сеть`,apiKeys:`Ключи API`,virtualPrinter:`Виртуальный принтер`,spoolbuddy:`SpoolBuddy`,failureDetection:`Обнаружение сбоев`,users:`Аутентификация`,backup:`Резервное копирование`,emailAuth:`Аутентификация по email`,ldap:`LDAP`,twoFa:`Двухфакторная аутентификация`,oidc:`SSO / OIDC`,security:`Безопасность`},spoolbuddy:{infoTitle:`Устройства SpoolBuddy`,infoBody:`Киоски SpoolBuddy регистрируются автоматически по сигналам активности. Удалите регистрацию устройства, если оно больше не используется или после сбоя демона остался устаревший дубликат.`,duplicatesTitle:`Зарегистрировано устройств: {{count}}`,duplicatesBody:`Интерфейс киоска использует только первое зарегистрированное устройство. Если один из экземпляров — устаревший дубликат после сбоя, удалите его регистрацию: работающее устройство зарегистрируется снова при следующем сигнале активности.`,empty:`Устройства SpoolBuddy пока не зарегистрированы.`,online:`В сети`,offline:`Не в сети`,unregister:`Удалить регистрацию`,unregisterSuccess:`Регистрация устройства удалена`,unregisterError:`Не удалось удалить регистрацию устройства`,confirmTitle:`Удалить регистрацию устройства SpoolBuddy?`,confirmBody:`Устройство «{{hostname}}» ({{deviceId}}) будет удалено из базы данных. Если оно работает, то зарегистрируется снова при следующем сигнале активности.`,ipAddress:`IP-адрес`,firmware:`Прошивка`,lastSeen:`Последняя активность`,daemonUptime:`Время работы демона`,systemUptime:`Время работы системы`,never:`никогда`,nfc:`NFC`,scale:`Весы`,cpuTemp:`Температура ЦП`,cpuLoad:`Загрузка ЦП`,memory:`Память`,disk:`Диск`,update:`Обновить`,updateConfirmTitle:`Обновить демон SpoolBuddy?`,updateConfirmBody:`Запустить обновление ПО на «{{hostname}}»? После установки обновления демон будет перезапущен.`,restartBrowser:`Перезапустить браузер`,restartBrowserConfirmTitle:`Перезапустить браузер киоска?`,restartBrowserConfirmBody:`Перезапустить браузер киоска на «{{hostname}}»? Экран ненадолго погаснет.`,restartDaemon:`Перезапустить демон`,restartDaemonConfirmTitle:`Перезапустить демон SpoolBuddy?`,restartDaemonConfirmBody:`Перезапустить демон SpoolBuddy на «{{hostname}}»? Устройство на несколько секунд пропадёт из сети.`,reboot:`Перезагрузить`,rebootConfirmTitle:`Перезагрузить устройство?`,rebootConfirmBody:`Перезагрузить «{{hostname}}»? Устройство будет недоступно около минуты.`,shutdown:`Выключить`,shutdownConfirmTitle:`Выключить устройство?`,shutdownConfirmBody:`Выключить «{{hostname}}»? Для повторного включения потребуется физический доступ.`,commandConfirm:`Подтвердить`,commandQueued:`Команда поставлена в очередь`,commandError:`Не удалось отправить команду`},ldap:{title:`Аутентификация LDAP`,enabledDesc:`Аутентификация LDAP включена`,disabledDesc:`Аутентификация LDAP отключена`,disabledHint:`Настройте и сохраните параметры LDAP ниже, затем включите аутентификацию.`,enabled:`Аутентификация LDAP включена`,disabled:`Аутентификация LDAP отключена`,feature1:`Пользователи могут входить с учётными данными LDAP`,feature2:`Локальная учётная запись администратора остаётся резервным способом входа`,feature3:`При входе группы LDAP сопоставляются с группами Bambuddy`,serverConfig:`Настройка сервера LDAP`,serverUrl:`Адрес сервера`,serverUrlHint:`Используйте ldaps:// для SSL либо ldap:// с StartTLS`,security:`Безопасность`,securityHint:`StartTLS переводит обычное соединение на TLS. LDAPS использует TLS с самого начала.`,bindDn:`Bind DN (служебная учётная запись)`,bindPassword:`Пароль Bind`,searchBase:`Базовый DN поиска`,userFilter:`Фильтр поиска пользователей`,userFilterHint:`{username} заменяется именем пользователя при входе. Для OpenLDAP используйте (uid={username}).`,advanced:`Дополнительно`,autoProvision:`Автоматически создавать пользователей`,autoProvisionHint:`Автоматически создавать учётную запись Bambuddy при первом входе через LDAP`,defaultGroup:`Группа по умолчанию`,defaultGroupNone:`— Нет (без резервной группы) —`,defaultGroupHint:`Резервная группа для пользователя LDAP, который успешно вошёл, но не состоит ни в одной сопоставленной группе LDAP. Оставьте пустым, чтобы такие пользователи не получали разрешений.`,groupMapping:`Сопоставление групп (JSON)`,groupMappingHint:`Сопоставьте DN групп LDAP с группами Bambuddy. Доступные группы: `,testConnection:`Проверить подключение`,settingsSaved:`Настройки LDAP сохранены`,errors:{serverRequired:`Укажите адрес сервера LDAP`,searchBaseRequired:`Укажите базовый DN поиска`,enableAuthFirst:`Сначала включите аутентификацию`,configureLdapFirst:`Сначала сохраните настройки LDAP`}},email:{smtpSettings:`Настройка SMTP`,smtpHost:`SMTP-сервер`,smtpPort:`Порт SMTP`,security:`Безопасность`,authentication:`Аутентификация`,username:`Имя пользователя`,password:`Пароль`,fromEmail:`Адрес отправителя`,fromName:`Имя отправителя`,testConnection:`Проверить подключение SMTP`,testRecipient:`Адрес получателя тестового письма`,sendTest:`Отправить тестовое письмо`,sending:`Отправка...`,save:`Сохранить настройки`,saving:`Сохранение...`,advancedAuth:`Расширенная аутентификация`,advancedAuthEnabled:`Расширенная аутентификация включена`,advancedAuthEnabledDesc:`Функции управления пользователями через email активны. Новые пользователи получают автоматически созданные пароли по почте и могут сбрасывать пароль через функцию восстановления.`,advancedAuthDisabled:`Расширенная аутентификация отключена`,advancedAuthDisabledDesc:`Включите расширенную аутентификацию, чтобы использовать почтовые функции управления пользователями.`,enable:`Включить`,disable:`Отключить`,feature1:`Пароли для новых пользователей создаются автоматически и отправляются по email`,feature2:`Пользователи могут входить по имени или адресу электронной почты`,feature3:`Доступно восстановление забытого пароля`,feature4:`Администраторы могут сбрасывать пароли пользователей по email`,errors:{requiredFields:`Заполните все обязательные поля`,usernameRequired:`При включённой аутентификации требуется имя пользователя`,enterTestEmail:`Введите адрес для тестового письма`,smtpServerAndEmail:`Перед проверкой укажите SMTP-сервер и адрес отправителя`,usernamePasswordRequired:`При включённой аутентификации требуются имя пользователя и пароль`,configureSmtpFirst:`Сначала настройте и проверьте SMTP`,enableAuthFirst:`Чтобы использовать почтовые функции, сначала включите аутентификацию.`},success:{settingsSaved:`Настройки SMTP сохранены`},securityOptions:{starttls:`STARTTLS (порт 587)`,ssl:`SSL/TLS (порт 465)`,none:`Без шифрования (порт 25)`},authOptions:{enabled:`Включена`,disabled:`Отключена`}},appearance:`Внешний вид`,notifications:`Уведомления`,smartPlugs:`Умные розетки`,spoolman:`Spoolman`,updates:`Обновления`,language:`Язык`,languageDescription:`Выберите предпочитаемый язык`,theme:`Тема`,themeLight:`Светлая`,themeDark:`Тёмная`,themeSystem:`Системная`,defaultView:`Страница по умолчанию`,defaultViewDescription:`Страница, которая открывается при запуске приложения`,checkForUpdates:`Проверить обновления`,autoUpdate:`Автоматическое обновление`,currentVersion:`Текущая версия`,latestVersion:`Последняя версия`,upToDate:`Установлена последняя версия`,updateAvailable:`Доступно обновление`,notificationLanguage:`Язык уведомлений`,notificationLanguageDescription:`Язык push-уведомлений`,bedCooledThreshold:`Порог остывания стола`,bedCooledThresholdDescription:`Температура, ниже которой стол после печати считается остывшим`,userNotificationsEnabled:`Пользовательские уведомления`,userNotificationsEnabledDescription:`Включить меню пользовательских и почтовых уведомлений о событиях печати. Требуется расширенная аутентификация.`,userNotificationsDisabledHint:`Для пользовательских уведомлений включите расширенную аутентификацию.`,notificationProviders:`Провайдеры уведомлений`,addProvider:`Добавить провайдера`,editProvider:`Изменить провайдера`,providerType:`Тип провайдера`,testNotification:`Проверить уведомление`,testSuccess:`Тестовое уведомление успешно отправлено`,testFailed:`Не удалось отправить тестовое уведомление`,quietHours:`Тихие часы`,quietHoursDescription:`Не беспокоить в указанный период`,quietHoursStart:`Начало`,quietHoursEnd:`Окончание`,events:{title:`События уведомлений`,printStart:`Печать началась`,printComplete:`Печать завершена`,printFailed:`Ошибка печати`,printStopped:`Печать остановлена`,printProgress:`Этапы выполнения`,printProgressDescription:`Уведомлять при 25%, 50% и 75%`,printerOffline:`Принтер не в сети`,printerError:`Ошибка принтера`,filamentLow:`Филамент заканчивается`,maintenanceDue:`Требуется обслуживание`,maintenanceDueDescription:`Уведомлять, когда наступил срок обслуживания`},smartPlug:{title:`Умные розетки`,add:`Добавить умную розетку`,edit:`Изменить умную розетку`,name:`Название`,ipAddress:`IP-адрес`,linkedPrinter:`Связанный принтер`,autoOn:`Автоматическое включение`,autoOnDescription:`Включать при начале печати`,autoOff:`Автоматическое выключение`,autoOffDescription:`Выключать после завершения печати`,offDelay:`Задержка выключения`,offDelayMinutes:`Минут после печати`,offDelayTemp:`Когда сопло остынет ниже заданной температуры`,currentState:`Текущее состояние`,turnOn:`Включить`,turnOff:`Выключить`},filamentTracking:`Учёт филамента`,filamentTrackingDesc:`Выберите способ учёта катушек: встроенный инвентарь или внешний сервер Spoolman.`,autoAddUnknownRfid:`Автоматически добавлять неизвестные RFID-катушки`,autoAddUnknownRfidDesc:`Автоматически создавать запись в инвентаре при обнаружении катушки с неизвестной RFID-меткой. Отключите, если регистрируете новые катушки заранее, чтобы избежать дубликатов.`,filamentChecks:`Проверки филамента`,disableFilamentWarnings:`Отключить предупреждения о филаменте`,disableFilamentWarningsDesc:`Не показывать предупреждения о нехватке филамента при запуске печати или добавлении в очередь`,preferLowestFilament:`Предпочитать катушку с наименьшим остатком`,preferLowestFilamentDesc:`Если подходят несколько катушек, использовать катушку с наименьшим остатком филамента`,preferLowestFilamentBackupNote:`Работает только при включённом AMS Filament Backup: иначе принтер не сможет переключиться на вторую катушку после окончания выбранной.`,trackingModeBuiltIn:`Встроенный инвентарь`,trackingModeBuiltInDesc:`Автоматическое сопоставление RFID и учёт расхода`,trackingModeSpoolmanDesc:`Внешний сервер управления филаментом`,builtInFeatureRfid:`Автоматически определяет официальные RFID-катушки Bambu Lab в AMS`,builtInFeatureUsage:`Учитывает расход филамента для каждой печати`,builtInFeatureCatalog:`Управление катушками, цветами и профилями K-фактора`,builtInFeatureThirdParty:`Сторонние катушки можно связать с катушками инвентаря`,amsSyncButton:`Синхронизировать вес из AMS`,amsSyncTitle:`Синхронизация веса катушек из AMS`,amsSyncMessage:`Вес всех катушек инвентаря будет заменён текущими значениями остатка из AMS подключённых принтеров. Используйте это для восстановления повреждённых данных о весе. Принтеры должны быть в сети.`,amsSyncing:`Синхронизация...`,amsSyncSuccess:`Синхронизировано катушек: {{synced}}, пропущено: {{skipped}}`,amsSyncError:`Не удалось синхронизировать вес из AMS`,spoolmanAmsSyncButton:`Синхронизировать вес Spoolman из AMS`,spoolmanAmsSyncTitle:`Синхронизация веса катушек Spoolman из AMS`,spoolmanAmsSyncMessage:`Вес всех катушек Spoolman будет обновлён по текущим значениям остатка из AMS подключённых принтеров. Принтеры должны быть в сети.`,spoolmanAmsSyncing:`Синхронизация...`,spoolmanAmsSyncSuccess:`Синхронизировано катушек: {{synced}}, пропущено: {{skipped}}`,spoolmanAmsSyncError:`Не удалось синхронизировать вес Spoolman из AMS`,spoolmanAmsSyncErrorUnreachable:`Не удалось синхронизировать вес Spoolman: сервер недоступен`,spoolmanAmsSyncErrorNotConfigured:`Не удалось синхронизировать вес Spoolman: сервер не настроен`,spoolmanNotConfigured:`Spoolman не настроен`,spoolmanFilamentCatalogTitle:`Каталог филамента Spoolman`,spoolmanFilamentCatalogDesc:`Названия филаментов и масса пустых катушек из Spoolman. Здесь можно изменить название и массу катушки; остальные свойства редактируются непосредственно в Spoolman.`,spoolmanUrl:`Адрес Spoolman`,spoolmanUrlHint:`Адрес сервера Spoolman, например http://localhost:7912`,spoolmanConnected:`Подключён`,spoolmanDisconnected:`Отключён`,status:`Состояние`,connect:`Подключить`,disconnect:`Отключить`,howSyncWorks:`Как работает синхронизация`,syncInfoRfidOnly:`Синхронизируются только официальные RFID-катушки Bambu Lab`,syncInfoAutoCreate:`Новые катушки автоматически создаются в Spoolman при первой синхронизации`,syncInfoThirdPartySkipped:`Неофициальные катушки Bambu Lab, сторонние и перезаправленные катушки пропускаются`,linkingExistingSpools:`Привязка существующих катушек`,linkingExistingSpoolsDesc:`Чтобы привязать существующую катушку Spoolman к AMS, наведите указатель на слот AMS и нажмите «Привязать к Spoolman».`,syncMode:`Режим синхронизации`,syncModeAuto:`Автоматически`,syncModeManual:`Только вручную`,syncModeAutoDesc:`Данные AMS синхронизируются автоматически при обнаружении изменений`,syncModeManualDesc:`Синхронизация выполняется только вручную`,syncAmsData:`Синхронизировать данные AMS`,syncAmsDataDesc:`Вручную синхронизировать данные AMS принтера со Spoolman`,allPrinters:`Все принтеры`,noDefaultPrinter:`Без принтера по умолчанию (спрашивать каждый раз)`,sidebarOrder:`Порядок пунктов боковой панели`,saveThumbnails:`Сохранять миниатюры`,captureFinishPhoto:`Снимок после завершения`,noPrintersConfigured:`Принтеры не настроены`,archiveMode:{always:`Всегда создавать запись в архиве`,never:`Не создавать запись в архиве`,ask:`Спрашивать каждый раз`},checkForUpdatesLabel:`Проверять обновления`,checkPrinterFirmware:`Проверять прошивку принтера`,includeBetaUpdates:`Включать бета-версии`,includeBetaUpdatesDesc:`Уведомлять о бета- и предварительных версиях при проверке обновлений`,localLogin:{disable:`Отключить локальный вход по имени пользователя и паролю`,disableHint:`Если включено, вход возможен только через провайдеров SSO. На LDAP это не влияет. Чтобы сохранить аварийный способ входа, задайте на сервере BAMBUDDY_LOCAL_LOGIN=true.`},enableRetry:`Включить повторные попытки`,homeAssistantDescription:`Управление умными розетками через Home Assistant`,environmentManagedLabel:`(управляется окружением)`,autoEnabledViaEnv:`Автоматически включено переменными окружения`,urlFromEnvReadOnly:`Значение задано переменной окружения HA_URL (только чтение)`,tokenFromEnvReadOnly:`Значение задано переменной окружения HA_TOKEN (только чтение)`,mqttConnectedTo:`Подключено к`,prometheusDescription:`Экспортировать данные принтеров в формате Prometheus`,noSmartPlugsTitle:`Умные розетки не настроены`,noSmartPlugsDescription:`Добавьте умную розетку на базе Tasmota для учёта энергии и автоматизации питания.`,noProvidersTitle:`Провайдеры не настроены`,noProvidersDescription:`Добавьте провайдера для получения уведомлений.`,noTemplatesAvailable:`Шаблоны отсутствуют. Перезапустите бэкенд, чтобы создать стандартные шаблоны.`,apiPermissionView:`Просмотр состояния принтеров и очереди`,apiPermissionEdit:`Добавление и удаление заданий из очереди печати`,apiKeysEmptyTitle:`Ключей API нет`,apiKeysEmptyDescription:`Создайте ключ API для интеграции с внешними сервисами.`,noUsersFound:`Пользователи не найдены`,noGroupsFound:`Группы не найдены`,noGroupsAvailable:`Доступных групп нет`,passwordsDoNotMatch:`Пароли не совпадают`,systemGroupWarning:`Названия системных групп изменить нельзя`,authDisabledTitle:`Аутентификация отключена`,authDisabledFeature1:`Требовать вход для доступа к системе`,authDisabledFeature2:`Создавать нескольких пользователей с групповыми разрешениями`,authDisabledFeature3:`Управлять доступом с помощью более чем 50 отдельных разрешений`,userHasCreated:`Этот пользователь создал:`,userItemsQuestion:`Что сделать с этими объектами?`,deleteUserConfirm:`Удалить этого пользователя?`,actionCannotBeUndone:`Это действие нельзя отменить.`,addFirstSmartPlug:`Добавить первую умную розетку`,providers:`Провайдеры`,log:`Журнал`,testAll:`Проверить все`,testResults:`Результаты проверки`,testPassedCount:`Успешно: {{count}}`,testFailedCount:`Ошибок: {{count}}`,messageTemplates:`Шаблоны сообщений`,messageTemplatesDescription:`Настройте тексты уведомлений для каждого события.`,apiKeys:`Ключи API`,apiKeysDescription:`Создавайте ключи API для внешних интеграций и вебхуков.`,createKey:`Создать ключ`,apiKeyCreated:`Ключ API успешно создан`,apiKeyCopyWarning:`Скопируйте ключ сейчас — повторно он показан не будет!`,useInApiBrowser:`Использовать в обозревателе API`,apiKeyQrButton:`QR-код`,apiKeyQrTitle:`Сканирование для настройки`,apiKeyQrCaption:`Отсканируйте мобильным приложением, чтобы добавить этот сервер и ключ API.`,apiKeyQrWarning:`QR-код содержит секретный ключ API — не передавайте его и не публикуйте снимок экрана.`,createNewApiKey:`Создать ключ API`,keyName:`Название ключа`,keyNamePlaceholder:`например, Home Assistant или OctoPrint`,readStatus:`Чтение состояния`,readStatusDescription:`Просмотр состояния принтеров и очереди`,manageQueue:`Управление очередью`,manageQueueDescription:`Добавление и удаление заданий из очереди печати`,controlPrinter:`Управление принтером`,controlPrinterDescription:`Пауза, продолжение и остановка печати`,manageLibrary:`Управление библиотекой`,manageLibraryDescription:`Загрузка, переименование и удаление файлов библиотеки; импорт моделей из MakerWorld`,manageInventory:`Управление запасами`,manageInventoryDescription:`Создание, изменение и удаление катушек и записей учёта. Требуется для киосков SpoolBuddy: сканирование NFC, показания весов и системные команды киоска.`,manageMaintenance:`Управление обслуживанием`,manageMaintenanceDescription:`Регистрация выполненного обслуживания, сброс счётчиков, изменение интервалов и управление каталогом видов обслуживания. Подходит для автоматизаций Home Assistant, которые отмечают, например, «сопло очищено», без предоставления более широких прав управления принтером.`,manageArchives:`Управление архивом`,manageArchivesDescription:`Изменение и удаление записей архива печати, включая старые задания. Не включает удаление их вклада в статистику. Подходит для автоматизаций очистки истории печати.`,manageProjects:`Управление проектами`,manageProjectsDescription:`Создание, изменение и удаление проектов, а также добавление в них архивных заданий. Подходит для автоматизаций, распределяющих печати по проектам.`,libraryBadge:`Библиотека`,inventoryBadge:`Запасы`,maintenanceBadge:`Обслуживание`,archivesBadge:`Архив`,projectsBadge:`Проекты`,cloudAccess:`Разрешить доступ к облаку`,cloudAccessDescription:`Чтение пресетов и филаментов Bambu Cloud от вашего имени. Требуется вход в Bambu Cloud.`,cloudBadge:`Облако`,updateEnergyCost:`Обновление тарифа на электроэнергию`,updateEnergyCostDescription:`Разрешить этому ключу отправлять новую цену за кВт⋅ч методом POST в /settings/electricity-price. Полезно для автоматизаций динамического тарифа Home Assistant (Tibber, Octopus и т. п.). Это единственный параметр настроек, доступный для записи через ключ API.`,energyCostBadge:`Энергия`,legacyKey:`Устаревший`,legacyKeyTooltip:`Создан до появления привязки к пользователям; пересоздайте для доступа к облаку`,unnamedKey:`Ключ без названия`,lastUsed:`Последнее использование`,read:`Чтение`,control:`Управление`,createFirstKey:`Создать первый ключ`,webhookEndpoints:`Конечные точки вебхуков`,webhookApiKeyHint:`Передавайте ключ API в заголовке X-API-Key.`,webhook:{getAllStatus:`Получить состояние всех принтеров`,getSpecificStatus:`Получить состояние выбранного принтера`,addToQueue:`Добавить в очередь печати`,pausePrint:`Приостановить печать`,resumePrint:`Продолжить печать`,stopPrint:`Остановить печать`},apiBrowser:`Обозреватель API`,apiBrowserDescription:`Просмотр и проверка всех доступных конечных точек API.`,apiKeyForTesting:`Ключ API для проверки`,apiKeyPlaceholder:`Вставьте ключ API для проверки защищённых конечных точек…`,apiKeyHint:`Ключ будет передан в запросе в заголовке X-API-Key.`,deleteApiKeyTitle:`Удаление ключа API`,deleteApiKeyMessage:`Удалить этот ключ API? Все использующие его интеграции перестанут работать.`,deleteKey:`Удалить ключ`,amsDisplayThresholds:`Пороговые значения AMS`,amsThresholdsDescription:`Настройте цветовые пороги индикаторов влажности и температуры AMS.`,humidity:`Влажность`,goodGreen:`Норма (зелёный)`,fairOrange:`Допустимо (оранжевый)`,aboveFairBad:`Выше допустимого порога отображается красным`,fairAlsoDryingThreshold:`Этот порог также запускает автоматическую сушку, если она включена`,temperature:`Температура`,goodBlue:`Норма (синий)`,aboveFairHot:`Выше допустимого порога отображается красным как перегрев`,historyRetention:`Хранение истории`,keepSensorHistory:`Хранить историю датчиков`,historyRetentionDescription:`Более старые данные влажности и температуры будут удаляться автоматически`,defaultPrintOptions:`Параметры печати по умолчанию`,defaultPrintOptionsDescription:`Задайте значения по умолчанию для новых заданий. Их можно изменить отдельно в диалоге запуска печати.`,defaultBedLevelling:`Калибровка стола`,defaultBedLevellingDesc:`Автоматически выровнять стол перед печатью`,defaultFlowCali:`Калибровка потока`,defaultFlowCaliDesc:`Калибровать поток экструзии`,defaultVibrationCali:`Калибровка вибраций`,defaultVibrationCaliDesc:`Уменьшить артефакты звона`,defaultLayerInspect:`Проверка первого слоя`,defaultLayerInspectDesc:`Проверка первого слоя системой компьютерного зрения`,defaultTimelapse:`Таймлапс`,defaultTimelapseDesc:`Записывать таймлапс`,defaultNozzleOffsetCali:`Калибровка смещения сопел`,defaultNozzleOffsetCaliDesc:`Калибровать взаимное смещение сопел экструдеров`,tempFanPresetsTitle:`Пресеты температуры и вентиляторов`,tempFanPresetsDescription:`Настройте значения быстрого выбора в меню температуры и скорости вентиляторов карточки принтера. Кнопка «Выкл.» отображается всегда.`,tempFanPresetsNozzle:`Температура сопла`,tempFanPresetsBed:`Температура стола`,tempFanPresetsChamber:`Температура камеры`,tempFanPresetsFan:`Скорость вентилятора`,tempFanPresetsReset:`Восстановить значения по умолчанию`,concurrentUploadsTitle:`Одновременные загрузки`,concurrentUploadsDescription:`Количество принтеров, на которые очередь может одновременно отправлять файлы. Передача файлов на принтеры выполняется медленно: крупная модель может загружаться несколько минут, а каждый принтер ждёт своей очереди. В большом парке увеличение этого значения сокращает ожидание последних принтеров в группе. Уменьшите его, если сеть или сервер Bambuddy плохо справляются с параллельной передачей.`,concurrentUploadsLabel:`Одновременно загружать на принтеры`,concurrentUploadsHelp:`Значение 1 отправляет файл только на один принтер за раз, как в прежнем режиме. По умолчанию: 4.`,staggeredStart:`Поэтапный запуск`,staggeredStartDescription:`Размер группы и интервал по умолчанию при поэтапном запуске партии на нескольких принтерах. Для каждой партии значения можно изменить в окне запуска печати.`,preheatTitle:`Преднагрев и выдержка`,preheatDescription:`Нагреть стол и, если поддерживается, камеру, затем выдержать температуру перед запуском каждого задания очереди. Полезно для инженерных пластиков (PA, ABS) на принтерах без активного нагревателя камеры: во время выдержки стол прогревает камеру излучением. Целевая температура стола берётся из файла печати; поведение камеры зависит от модели принтера.`,preheatEnabled:`Включить преднагрев и выдержку`,preheatEnabledDesc:`Если выключено, задания очереди отправляются сразу. Для каждого задания можно задать отдельное значение.`,preheatFilamentTargetsLabel:`Целевая температура камеры по типу филамента (°C)`,preheatFilamentTargetsHint:`Bambuddy выбирает наибольшее значение среди задействованных слотов AMS; для печати только PLA автоматически используется 0 и этап прогрева камеры пропускается.`,preheatFilamentTargetsReset:`Восстановить значения по умолчанию`,preheatFilamentTargetsDefaultRow:`Прочее / без сопоставления`,preheatMaxWait:`Максимальное ожидание (с)`,preheatMaxWaitHelp:`Предельное время прогрева камеры, после которого процесс продолжится.`,preheatSoak:`Выдержка (с)`,preheatSoakHelp:`Время выдержки после достижения цели или истечения максимального ожидания.`,preheatHardwareTitle:`Поведение по моделям принтеров:`,preheatHardwareDetail:`H2C/H2D/H2D Pro/H2S/X2D/X1E активно нагревают камеру командой M141. X1C/P2S измеряют температуру камеры, но прогревают её только теплом стола. У P1S/P1P/A1/A1 Mini нет датчика камеры — применяется только таймер выдержки.`,preheatPerItemDesc:`Нагревать стол и камеру перед запуском этого задания. По умолчанию используется общий переключатель «Настройки → Рабочий процесс».`,preheatOverride_inherit:`Наследовать`,preheatOverride_on:`Включено`,preheatOverride_off:`Выключено`,preheatTargetOverride:`Переопределение температуры камеры (°C; пусто — значение для филамента)`,plateClear:`Подтверждение очистки пластины`,requirePlateClear:`Требовать подтверждение очистки пластины`,requirePlateClearDescription:`Если включено, планировщик не запускает следующее задание на принтере с завершённой печатью, пока не подтверждена очистка пластины. Отключение также скрывает индикатор состояния пластины и кнопку «Пластина очищена» на карточках принтеров.`,gcodeInjection:`Вставка G-кода`,gcodeInjectionDescription:`Настройте G-код, добавляемый в начало и/или конец печати для систем автоматического запуска, таких как Farmloop, SwapMod, AutoClear и Printflow 3D. Фрагменты задаются отдельно для каждой модели принтера и применяются, когда для задания очереди включена вставка G-кода.`,gcodeInjectionNoPrinters:`Принтеры не найдены. Добавьте принтеры, чтобы настроить фрагменты G-кода.`,gcodeStartLabel:`Начальный G-код`,gcodeEndLabel:`Завершающий G-код`,gcodeStartPlaceholder:`G-код, добавляемый перед началом печати…`,gcodeEndPlaceholder:`G-код, добавляемый после завершения печати…`,staggerGroupSize:`Размер группы`,staggerGroupSizeHelp:`Количество принтеров, запускаемых одновременно`,staggerInterval:`Интервал (мин)`,staggerIntervalHelp:`Задержка между запуском групп`,queueDrying:`Автоматическая сушка в очереди`,queueDryingDescription:`Автоматически сушить филамент в AMS, когда принтер простаивает между заданиями очереди. Запуск определяется указанным выше порогом влажности.`,queueDryingEnabled:`Включить автоматическую сушку`,queueDryingEnabledDescription:`Автоматически запускать сушку AMS, когда принтер простаивает и влажность выше порога`,queueDryingBlock:`Ожидать завершения сушки`,queueDryingBlockDescription:`Блокировать очередь печати до завершения сушки. Если выключено, печать имеет приоритет.`,ambientDryingEnabled:`Фоновая сушка`,ambientDryingEnabledDescription:`Автоматически сушить филамент на простаивающих принтерах при превышении порога влажности, даже если очередь пуста.`,printDryingEnabled:`Продолжать сушку во время печати`,printDryingEnabledDescription:`Разрешить автоматической сушке продолжаться во время печати на поддерживаемом оборудовании (H2D, H2C, H2S, P2S, H2D Pro, X2D, X1C, A2L с актуальной прошивкой). Для защиты катушек температура автоматически ограничивается на 5 °C ниже пресета сушки в простое.`,dryingPresets:`Пресеты сушки`,dryingPresetsDescription:`Температура и длительность для каждого типа филамента. AMS 2 Pro использует более низкие температуры, AMS-HT поддерживает более высокие.`,dryingFilament:`Филамент`,humidityThresholds:`Пороги влажности`,humidityThresholdsDescription:`Порог запуска автоматической сушки и предупреждений для каждого типа филамента. При смешанной загрузке AMS используется наименьший порог.`,humidityThresholdCol:`Порог`,humidityThresholdDefault:`По умолчанию (неизвестные типы)`,printModal:`Окно запуска печати`,expandCustomMapping:`Разворачивать пользовательское сопоставление`,expandCustomMappingDescription:`При печати на нескольких принтерах сразу показывать развёрнутое сопоставление AMS для каждого принтера`,authentication:`Аутентификация`,authEnabledDescription:`Доступ к экземпляру защищён аутентификацией пользователей`,authDisabledDescription:`Включите, чтобы требовать вход и управлять доступом пользователей`,authDisabledMessage:`Включите аутентификацию, чтобы создавать учётные записи, управлять правами и защитить экземпляр Bambuddy.`,enableAuthentication:`Включить аутентификацию`,currentUser:`Текущий пользователь`,changePassword:`Изменить пароль`,admin:`Администратор`,users:`Пользователи`,addUser:`Добавить пользователя`,groups:`Группы`,addGroup:`Добавить группу`,system:`Система`,noDescription:`Нет описания`,userCount:`Пользователей: {{count}}`,permissionCount:`Разрешений: {{count}}`,createUser:`Создать пользователя`,username:`Имя пользователя`,enterUsername:`Введите имя пользователя`,password:`Пароль`,enterPassword:`Введите пароль`,passwordRequirements:`Не менее 8 символов: одна заглавная и одна строчная буква, одна цифра и один специальный символ.`,confirmPassword:`Подтвердите пароль`,confirmPasswordPlaceholder:`Повторите пароль`,viewReleaseOnGitHub:`Открыть выпуск на GitHub`,turnAllPlugsOn:`Включить все розетки`,turnAllPlugsOff:`Выключить все розетки`,clearNotificationLogs:`Очистить журнал уведомлений`,clearLogsMessage:`Все записи журнала уведомлений старше 30 дней будут безвозвратно удалены. Это действие нельзя отменить.`,clearLogs:`Очистить журнал`,resetUiPreferences:`Сбросить настройки интерфейса`,resetUiPreferencesMessage:`Будут сброшены порядок боковой панели, тема, компоновка панели, режимы отображения и сортировка. Принтеры, архивы и серверные настройки НЕ изменятся. После очистки страница перезагрузится.`,resetPreferences:`Сбросить настройки`,deleteGroupTitle:`Удаление группы`,deleteGroupMessage:`Удалить эту группу? Пользователи группы потеряют назначенные ей разрешения.`,deleteGroup:`Удалить группу`,disableAuthenticationTitle:`Отключение аутентификации`,disableAuthenticationMessage:`Отключить аутентификацию? Bambuddy станет доступен без входа. Все пользователи останутся в базе данных, но проверка учётных данных выполняться не будет.`,disableAuthentication:`Отключить аутентификацию`,configureBambuddy:`Настроить Bambuddy`,systemDefault:`Системное значение`,archiveSettings:`Настройки архива`,newWindow:`Новое окно`,embeddedOverlay:`Встроенное наложение`,preferredSlicer:`Предпочитаемый слайсер`,preferredSlicerDescription:`Слайсер для нарезки внутри приложения через API-службу`,openInSlicerLabel:`Открывать в слайсере`,openInSlicerInherit:`Как для API-слайсера`,openInSlicerDescription:`Настольный слайсер, который открывается кнопкой «Открыть в слайсере». Оставьте «Как для API-слайсера», чтобы наследовать настройку, либо выберите другой локальный слайсер.`,orcaslicerKnownIssuesWarning:`В OrcaSlicer 2.3.2 и 2.4.0-dev известны ошибки CLI, мешающие нарезке многих 3MF от Bambu: #12426 (сбой на раскрашенных файлах с несколькими экструдерами) и #13386 (слишком строгая проверка диапазонов параметров). До исправления рекомендуется Bambu Studio.`,useSlicerApi:`Использовать API слайсера`,useSlicerApiDescription:`Если включено, действия «Нарезать» открывают встроенное окно и обращаются к API-службе слайсера. Если выключено, файл передаётся настольному слайсеру через URI-схему.`,slicerCard:`Слайсер`,orcaslicerApiUrl:`URL API-службы OrcaSlicer`,bambuStudioApiUrl:`URL API-службы Bambu Studio`,slicerApiUrlDescription:`URL контейнера API-службы слайсера. Оставьте пустым, чтобы использовать значения переменных окружения SLICER_API_URL или BAMBU_STUDIO_API_URL.`,slicerBundlesRemoved:{title:`Пакеты профилей слайсера (удалено)`,description:`Импорт пакетов профилей принтера .bbscfg удалён. Экспорт пакета из BambuStudio содержит только пользовательские профили, поэтому стандартные процессы и филаменты не импортировались, а нарезка использовала встроенные настройки.`,alternatives:`Для отдельных пользовательских профилей используйте импорт одного профиля либо синхронизацию через Bambu Cloud или Orca Cloud. Стандартные профили автоматически предоставляет служба слайсера.`,lookupOrder:`Порядок поиска профиля при нарезке: 1) импортированный локально, 2) Orca Cloud, 3) Bambu Cloud, 4) стандартный профиль службы слайсера.`},externalCameras:`Внешние камеры`,costTracking:`Учёт затрат`,printsOnly:`Только печать`,totalConsumption:`Общее потребление`,dataManagement:`Управление данными`,storageUsage:`Использование хранилища`,storageUsageDescription:`Распределение занятого места по категориям`,storageUsageTotal:`Всего`,storageUsageErrors:`Ошибки`,storageUsageOtherBreakdown:`Прочее (статические ресурсы, скрипты и конфигурационные файлы)`,storageUsageSystem:`Система`,storageUsageData:`Данные`,storageUsageUnavailable:`Сведения об использовании хранилища недоступны`,clearNotificationLogsDescription:`Удалить записи журнала уведомлений старше 30 дней`,resetUiPreferencesDescription:`Сбросить порядок боковой панели, тему, режимы отображения и компоновку. Принтеры, архивы и настройки не изменятся.`,enableHomeAssistant:`Включить Home Assistant`,enableMqtt:`Включить MQTT`,useTls:`Использовать TLS`,enableMetricsEndpoint:`Включить endpoint метрик`,availableMetrics:`Доступные метрики`,editUser:`Изменить пользователя`,deleteUserTitle:`Удаление пользователя`,groupName:`Название группы`,leaveEmptyForAnonymous:`Оставьте пустым для анонимного доступа`,leaveEmptyForNoAuth:`Оставьте пустым, чтобы не использовать аутентификацию`,enterNewPassword:`Введите новый пароль`,confirmNewPassword:`Повторите новый пароль`,enterGroupName:`Введите название группы`,enterDescriptionOptional:`Введите описание (необязательно)`,enterCurrentPassword:`Введите текущий пароль`,enterNewPasswordMin6:`Введите новый пароль (не менее 6 символов)`,toast:{keyCopied:`Ключ скопирован в буфер обмена`,copyFailed:`Не удалось скопировать ключ`,keyAddedToBrowser:`Ключ добавлен в обозреватель API`,clearLogsFailed:`Не удалось очистить журнал`,uiPreferencesReset:`Настройки интерфейса сброшены. Обновление страницы…`,authDisabled:`Аутентификация отключена`,authDisableFailed:`Не удалось отключить аутентификацию`,apiKeyCreated:`Ключ API создан`,apiKeyDeleted:`Ключ API удалён`,userCreated:`Пользователь создан`,userUpdated:`Пользователь обновлён`,userDeleted:`Пользователь удалён`,groupCreated:`Группа создана`,groupUpdated:`Группа обновлена`,groupDeleted:`Группа удалена`,fillRequiredFields:`Заполните все обязательные поля`,passwordsDoNotMatch:`Пароли не совпадают`,passwordTooShort:`Пароль должен содержать не менее 8 символов`,passwordNeedsUppercase:`Пароль должен содержать хотя бы одну заглавную букву`,passwordNeedsLowercase:`Пароль должен содержать хотя бы одну строчную букву`,passwordNeedsDigit:`Пароль должен содержать хотя бы одну цифру`,passwordNeedsSpecial:`Пароль должен содержать хотя бы один специальный символ`,enterGroupName:`Введите название группы`,settingsSaved:`Настройки сохранены`,noPermissionUpdate:`У вас нет прав на изменение настроек`,cameraSettingsSaved:`Настройки камеры сохранены`,enterCameraUrl:`Введите URL камеры`,passwordChanged:`Пароль изменён`,connectionFailed:`Не удалось подключиться`,testFailed:`Проверка завершилась ошибкой`,cameraConnected:`Камера подключена{{resolution}}`},testConnection:`Проверить подключение`,catalog:{spoolCatalog:`Каталог катушек`,spoolCatalogDescription:`Масса пустых катушек по производителю и типу. Используется для автоматического определения массы при добавлении катушек.`,searchCatalog:`Поиск по каталогу…`,addNewEntry:`Добавить запись`,namePlaceholder:`Название (например, Bambu Lab — пластик)`,weight:`Масса`,type:`Тип`,default:`Стандартная`,custom:`Пользовательская`,noMatch:`Ничего не найдено`,empty:`Каталог пуст`,deleteEntry:`Удалить запись`,deleteConfirm:`Удалить «{{name}}»?`,resetCatalog:`Сбросить каталог`,resetConfirm:`Сбросить каталог к исходному состоянию? Все пользовательские записи будут удалены.`,loadFailed:`Не удалось загрузить каталог катушек`,nameWeightRequired:`Укажите название и массу`,entryAdded:`Запись добавлена`,addFailed:`Не удалось добавить запись`,entryUpdated:`Запись обновлена`,updateFailed:`Не удалось обновить запись`,entryDeleted:`Запись удалена`,deleteFailed:`Не удалось удалить запись`,resetSuccess:`Каталог сброшен к исходному состоянию`,resetFailed:`Не удалось сбросить каталог`,exported:`Экспортировано записей: {{count}}`,imported:`Импортировано записей: {{added}}, пропущено: {{skipped}}`,importFailed:`Не удалось импортировать: неверный формат JSON`,exportTooltip:`Экспортировать каталог в JSON`,importTooltip:`Импортировать каталог из JSON`,resetTooltip:`Сбросить к исходному состоянию`,selectedCount:`Выбрано: {{count}}`,deleteSelected:`Удалить выбранные`,bulkDeleteConfirm:`Удалить выбранные записи ({{count}})?`,bulkDeleted:`Удалено записей: {{count}}`,bulkDeleteFailed:`Не удалось удалить записи`,material:`Материал`,spoolWeight:`Масса катушки`,color:`Цвет`,updateSpoolWeight:`Обновить массу катушки`,filamentUpdated:`Филамент обновлён`,filamentUpdateFailed:`Не удалось обновить филамент`,filamentUpdateInvalid:`Некорректные данные филамента`,keepExistingSpoolWeight:`Сохранить прежнюю массу у существующих катушек`,keepExistingSpoolWeightDesc:`Катушки, уже созданные с этим типом филамента, сохранят прежнюю массу тары. Для новых катушек будет использоваться обновлённое значение.`,applyToAllSpools:`Применить ко всем катушкам`,applyToAllSpoolsDesc:`Все расчёты массы для катушек этого типа немедленно начнут использовать новую массу тары.`},colorCatalog:{title:`Каталог цветов`,description:`Цвета филамента по производителю и материалу. Используются для автоматического определения цвета при добавлении катушек.`,searchColors:`Поиск цветов…`,allManufacturers:`Все производители`,addNewColor:`Добавить цвет`,manufacturer:`Производитель`,colorName:`Название цвета`,hex:`HEX`,materialOptional:`Материал (необязательно)`,showing:`Показано {{filtered}} из {{total}} цветов`,noMatch:`Подходящие цвета не найдены`,empty:`Каталог цветов пуст`,deleteColor:`Удалить цвет`,deleteConfirm:`Удалить «{{name}}»?`,resetCatalog:`Сбросить каталог цветов`,resetConfirm:`Сбросить каталог к исходному состоянию? Все пользовательские цвета будут удалены.`,sync:`Синхронизировать`,starting:`Запуск…`,syncTooltip:`Синхронизировать с FilamentColors.xyz (более 2000 цветов; может занять около минуты)`,loadFailed:`Не удалось загрузить каталог цветов`,fieldsRequired:`Укажите производителя, название цвета и HEX-код`,colorAdded:`Цвет добавлен`,addFailed:`Не удалось добавить цвет`,colorUpdated:`Цвет обновлён`,updateFailed:`Не удалось обновить цвет`,colorDeleted:`Цвет удалён`,deleteFailed:`Не удалось удалить цвет`,resetSuccess:`Каталог цветов сброшен к исходному состоянию`,resetFailed:`Не удалось сбросить каталог цветов`,syncUpToDate:`Каталог уже актуален (проверено цветов: {{count}})`,syncComplete:`Добавлено новых цветов: {{added}}, уже существовало: {{skipped}}`,syncError:`Ошибка синхронизации`,syncFailed:`Не удалось синхронизировать каталог с FilamentColors.xyz`,exported:`Экспортировано цветов: {{count}}`,imported:`Импортировано цветов: {{added}}, пропущено: {{skipped}}`,importFailed:`Не удалось импортировать: неверный формат JSON`,selectedCount:`Выбрано: {{count}}`,deleteSelected:`Удалить выбранные`,bulkDeleteConfirm:`Удалить выбранные цвета ({{count}})?`,bulkDeleted:`Удалено цветов: {{count}}`,bulkDeleteFailed:`Не удалось удалить цвета`},dateFormat:`Формат даты`,dateFormatUs:`США (ММ/ДД/ГГГГ)`,dateFormatEu:`Европа (ДД/ММ/ГГГГ)`,dateFormatIso:`ISO (ГГГГ-ММ-ДД)`,timeFormat:`Формат времени`,timeFormat12:`12-часовой (3:30 PM)`,timeFormat24:`24-часовой (15:30)`,defaultPrinter:`Принтер по умолчанию`,defaultPrinterDescription:`Предварительно выбирать этот принтер при загрузке файлов, повторной печати и других операциях.`,slicerBambuStudio:`Bambu Studio`,slicerOrcaSlicer:`OrcaSlicer`,sidebarOrderDescription:`Изменяйте порядок, видимость и пользовательские ссылки в настройках боковой панели.`,setDefault:`Сделать стандартным`,sidebarOrderSetDefaultHint:`Текущий порядок меню будет применяться к пользователям, которые ещё не настроили его самостоятельно.`,sidebarDefaultSet:`Стандартный порядок меню сохранён.`,sidebarDefaultCleared:`Стандартный порядок меню сброшен.`,sidebarDefaultFailed:`Не удалось сохранить стандартный порядок меню.`,reset:`Сбросить`,darkMode:`Тёмная тема`,lightMode:`Светлая тема`,active:`(активна)`,background:`Фон`,accent:`Акцент`,style:`Стиль`,bgNeutral:`Нейтральный`,bgWarm:`Тёплый`,bgCool:`Холодный`,bgOled:`Чёрный OLED`,bgSlate:`Сланцево-синий`,bgForest:`Лесной зелёный`,accentGreen:`Зелёный`,accentTeal:`Бирюзовый`,accentBlue:`Синий`,accentOrange:`Оранжевый`,accentPurple:`Фиолетовый`,accentRed:`Красный`,styleClassic:`Классический`,styleGlow:`Свечение`,styleVibrant:`Насыщенный`,themeToggleHint:`Переключайте тёмную, светлую и системную тему значком в боковой панели.`,autoArchivePrints:`Автоматически архивировать печать`,autoArchiveDescription:`Автоматически сохранять 3MF после завершения печати`,saveThumbnailsDescription:`Извлекать и сохранять изображения предпросмотра из 3MF`,captureFinishPhotoDescription:`Сделать снимок камерой принтера после завершения печати. Во время печати Bambuddy записывает короткий таймлапс, чтобы получить кадр до опускания стола. Если таймлапс был включён для задания, файл сохранится; иначе после получения снимка он будет автоматически удалён.`,ffmpegNotInstalled:`ffmpeg не установлен`,ffmpegRequired:`Для захвата изображения требуется ffmpeg. Установите его командой brew install ffmpeg в macOS или apt install ffmpeg в Linux.`,camera:`Камера`,cameraViewMode:`Режим просмотра камеры`,cameraOverlayDescription:`Камера открывается поверх основного экрана в окне с изменяемым размером`,cameraWindowDescription:`Камера открывается в отдельном окне браузера`,externalCamerasDescription:`Настройка внешних камер вместо встроенной камеры принтера. Поддерживаются потоки MJPEG, RTSP, HTTP-снимки и USB-камеры V4L2. Внешняя камера используется для просмотра в реальном времени и снимков после завершения печати.`,cameraPlaceholderUsb:`Путь к устройству (/dev/video0)`,cameraPlaceholderUrl:`URL камеры (rtsp://… или http://…)`,cameraTypeMjpeg:`Поток MJPEG`,cameraTypeRtsp:`Поток RTSP`,cameraTypeSnapshot:`HTTP-снимок`,cameraTypeUsb:`USB-камера (V4L2)`,cameraSnapshotUrl:`URL снимка (необязательно)`,cameraSnapshotUrlPlaceholder:`http://192.168.1.61:1984/api/frame.jpeg?src=printer`,cameraSnapshotUrlHelp:`URL одиночного кадра для миниатюр уведомлений, снимков после печати, кадров послойного таймлапса и распознавания пластины. Для таймлапса и распознавания пластины должны быть отдельно включены соответствующие настройки принтера; этот URL задаёт лишь источник изображения. Оставьте пустым, чтобы получать кадры из указанного выше видеопотока. Полезно для go2rtc (/api/frame.jpeg) и IP-камер с отдельным endpoint снимка.`,cameraRotation:`Поворот`,test:`Проверить`,connected:`Подключено`,disconnected:`Отключено`,currency:`Валюта`,defaultFilamentCost:`Стоимость филамента по умолчанию (за кг)`,electricityCost:`Стоимость электроэнергии за кВт·ч`,energyDisplayMode:`Режим отображения энергии`,energyModePrintDescription:`На панели показывается сумма энергии, израсходованной во время печати`,energyModeTotalDescription:`На панели показывается полный расход энергии по данным умных розеток`,fileManager:`Файловый менеджер`,createArchiveEntry:`Создавать запись в архиве при печати`,createArchiveEntryDescription:`При запуске печати из файлового менеджера при необходимости создавать запись в архиве`,lowDiskSpaceWarning:`Предупреждение о нехватке места`,lowDiskSpaceDescription:`Показывать предупреждение, когда свободного места остаётся меньше указанного порога`,printerFirmware:`Прошивка принтера`,checkFirmwareDescription:`Проверять наличие обновлений прошивки принтера у Bambu Lab`,bambuddySoftware:`Программное обеспечение Bambuddy`,autoCheckDescription:`Автоматически проверять наличие новых версий при запуске`,checkNow:`Проверить сейчас`,updateAvailableVersion:`Доступно обновление: v{{version}}`,releaseNotes:`Примечания к выпуску`,updateViaDocker:`Обновление через Docker Compose:`,updateViaHomeAssistant:`Обновления устанавливаются через Home Assistant Supervisor. Чтобы установить новую версию, откройте в Home Assistant: Настройки → Дополнения → Bambuddy.`,updateViaWindowsInstaller:`В Windows обновление выполняется повторным запуском установщика. Скачайте новую версию ниже — данные, настройки и принтеры сохранятся.`,downloadWindowsInstaller:`Скачать установщик v{{version}}`,installUpdate:`Установить обновление`,latestVersionRunning:`Установлена последняя версия`,failedToCheckUpdates:`Не удалось проверить обновления: {{error}}`,backupRestore:`Резервное копирование и восстановление`,backupRestoreDescription:`Экспорт и импорт настроек, а также резервное копирование в GitHub`,goToBackup:`Перейти к резервным копиям`,externalUrl:`Внешний URL`,externalUrlDescription:`Внешний адрес, по которому доступен Bambuddy. Используется для изображений в уведомлениях и внешних интеграций.`,bambuddyUrl:`URL Bambuddy`,externalUrlHint:`Укажите протокол и порт, например http://192.168.1.100:8000`,ftpRetry:`Повтор FTP-операций`,ftpRetryDescription:`Повторять FTP-операции при нестабильном Wi‑Fi принтера. Применяется к скачиванию 3MF и таймлапсов, загрузке заданий и обновлению прошивки.`,autoRetryDescription:`Автоматически повторять неудачные FTP-операции`,retryAttempts:`Количество попыток`,retryDelay:`Задержка между попытками`,connectionTimeout:`Тайм-аут подключения`,time_one:`{{count}} раз`,time_other:`{{count}} раз`,second_one:`{{count}} секунда`,second_other:`{{count}} секунд`,nSeconds:`{{count}} секунд`,increaseForWeakWifi:`Увеличьте для принтеров со слабым Wi‑Fi`,homeAssistant:`Home Assistant`,homeAssistantFullDescription:`Подключение к Home Assistant для управления умными розетками через REST API. Поддерживаются сущности switch, light, input_boolean и script.`,homeAssistantUrl:`URL Home Assistant`,longLivedAccessToken:`Долгосрочный токен доступа`,haTokenHint:`Создайте токен в Home Assistant: Профиль → Долгосрочные токены доступа → Создать токен`,connectionSuccessful:`Подключение установлено`,connectionFailed:`Подключиться не удалось`,haConnectionSuccess:`Подключение к Home Assistant установлено.`,haConnectionFailed:`Не удалось подключиться к Home Assistant.`,mqttPublishing:`Публикация MQTT`,mqttDescription:`Публикация событий Bambuddy во внешнем MQTT-брокере для интеграции с Node-RED, Home Assistant и другими системами автоматизации.`,mqttEnableDescription:`Публиковать события во внешнем MQTT-брокере`,brokerHostname:`Имя хоста брокера`,port:`Порт`,usernameOptional:`Имя пользователя (необязательно)`,passwordOptional:`Пароль (необязательно)`,topicPrefix:`Префикс топиков`,topicPrefixHint:`Топики будут иметь вид {{prefix}}/printers//status и т. п.`,prometheusMetrics:`Метрики Prometheus`,prometheusEndpointDescription:`Публиковать метрики принтеров по адресу /api/v1/metrics для мониторинга в Prometheus/Grafana.`,bearerTokenOptional:`Bearer-токен (необязательно)`,bearerTokenHint:`Если задан, запросы должны содержать Authorization: Bearer `,metricsConnectionStatus:`Состояние подключения`,metricsPrinterState:`Состояние принтера (ожидание, печать и т. п.)`,metricsPrintProgress:`Прогресс печати, 0–100 %`,metricsBedTemp:`Температура стола`,metricsNozzleTemp:`Температура сопла`,metricsPrintsTotal:`Общее количество заданий по результату`,metricsMore:`…и другие данные: слои, вентиляторы, очередь, расход филамента`,smartPlugsDescription:`Подключение умных розеток Tasmota или Home Assistant для автоматического управления питанием принтеров и учёта энергопотребления.`,allOn:`Включить все`,allOff:`Выключить все`,addSmartPlug:`Добавить умную розетку`,energySummary:`Сводка энергопотребления`,currentPower:`Текущая мощность`,plugsOnline:`Розеток в сети: {{reachable}}/{{total}}`,today:`Сегодня`,yesterday:`Вчера`,total:`Всего`,enablePlugsForSummary:`Включите розетки, чтобы увидеть сводку энергопотребления`,addNotificationProvider:`Добавить`,systemBadge:`(системная)`,creating:`Создание…`,changing:`Изменение…`,deleteUserAndItems:`Удалить пользователя И его объекты`,deleteUserKeepItems:`Удалить пользователя, объекты оставить без владельца`,ok:`ОК`,twoFa:{totpTitle:`Приложение-аутентификатор (TOTP)`,totpDesc:`Использовать приложение-аутентификатор, например Google Authenticator, Aegis или Authy.`,emailOtpTitle:`Одноразовый код по электронной почте`,emailOtpDesc:`Отправлять одноразовый код на {{email}} при входе.`,emailOtpNoEmail:`Добавьте адрес электронной почты в учётную запись, чтобы включить этот способ.`,addEmailFirst:`В вашей учётной записи нет адреса электронной почты. Перед включением одноразовых кодов попросите администратора добавить его.`,setupTotp:`Настроить приложение-аутентификатор`,setupAuthApp:`Настроить приложение-аутентификатор`,setupInstructions:`Отсканируйте QR-код приложением-аутентификатором, затем подтвердите настройку кодом.`,manualEntry:`Не получается отсканировать? Введите этот секрет вручную:`,scannedContinue:`Код отсканирован — продолжить`,enterCodeToConfirm:`Для подтверждения настройки введите шестизначный код из приложения-аутентификатора.`,activate:`Активировать`,disableTotp:`Отключить аутентификатор`,disableConfirmHint:`Чтобы отключить аутентификатор, введите действующий код TOTP или резервный код.`,totpDisabled:`Приложение-аутентификатор отключено.`,emailOtpEnabled:`Одноразовые коды по электронной почте включены.`,emailOtpDisabled:`Одноразовые коды по электронной почте отключены.`,smtpRequired:`Сначала настройте и проверьте SMTP.`,invalidCode:`Неверный код. Повторите попытку.`,enableEmailOtp:`Включить одноразовые коды по электронной почте`,disableEmailOtp:`Отключить одноразовые коды по электронной почте`,emailSetupEnterCode:`Код подтверждения отправлен на вашу электронную почту. Введите его ниже, чтобы подтвердить доступ к этому почтовому ящику.`,verifyAndEnable:`Подтвердить и включить`,emailDisablePasswordHint:`Чтобы подтвердить отключение одноразовых кодов по электронной почте, введите пароль учётной записи.`,passwordPlaceholder:`Введите пароль`,backupCodesTitle:`Сохраните резервные коды`,backupCodesWarning:`Сохраните эти коды в надёжном месте. Каждый код можно использовать только один раз; повторно они показаны не будут.`,backupCodesRemaining:`Осталось резервных кодов: {{count}}`,savedCodes:`Я сохранил коды`,regenBackup:`Создать новые резервные коды`,regenBackupHint:`Введите текущий код TOTP, чтобы создать 10 новых резервных кодов. Все существующие резервные коды станут недействительными.`,newBackupCodes:`Новые резервные коды`,linkedAccounts:`Связанные учётные записи SSO`,linkedAccountsDesc:`Эти внешние провайдеры идентификации связаны с вашей учётной записью.`,oidcUnlinked:`Учётная запись отсоединена.`},sessionPolicy:{title:`Политика сеансов`,description:`Максимальный срок действия сеанса для новых входов пользователей. Уже выданные токены сохраняют исходный срок действия.`,preset24h:`24 часа`,preset7d:`7 дней`,preset30d:`30 дней`,customHoursLabel:`Срок действия сеанса в часах`,hoursSuffix:`часов`,warning:`Длительные сеансы снижают защиту автоматическим выходом. Рекомендуется только для доверенных установок с одним пользователем.`},oidc:{title:`Провайдеры SSO / OIDC`,desc:`Настройка провайдеров OpenID Connect для единого входа через внешние службы идентификации.`,addProvider:`Добавить провайдера`,newProvider:`Новый провайдер`,empty:`Провайдеры OIDC пока не настроены.`,created:`Провайдер создан.`,updated:`Провайдер обновлён.`,deleted:`Провайдер удалён.`,refreshIcon:`Обновить значок`,removeIcon:`Удалить значок`,iconRefreshed:`Значок обновлён.`,iconRemoved:`Значок удалён.`,iconFetchFailed:`Не удалось получить значок по URL провайдера.`,deleteTitle:`Удалить провайдера`,deleteMessage:`Удалить «{{name}}»? Все связанные учётные записи пользователей будут отсоединены.`,form:{name:`Отображаемое имя`,issuerUrl:`URL издателя`,clientId:`Идентификатор клиента`,clientSecret:`Секрет клиента`,scopes:`Области доступа`,iconUrl:`URL значка (необязательно)`,enabled:`Включён`,autoCreate:`Автоматически создавать пользователей`,autoCreateDesc:`Автоматически создавать локальную учётную запись при первом входе.`,autoLink:`Автоматически связывать существующие учётные записи`,autoLinkDesc:`При первом входе связывать локальные учётные записи по совпадающему адресу электронной почты.`,secretHint:`оставьте пустым, чтобы сохранить текущий`,secretPlaceholder:`новый секрет`,emailClaim:`Поле электронной почты`,emailClaimDesc:`Поле JWT, используемое как адрес электронной почты. Для Azure Entra ID, который не передаёт email_verified, используйте preferred_username или upn. Указывайте только доверенные поля.`,emailClaimPlaceholder:`email`,emailClaimCustomClaimAutoLinkWarning:`Пользовательское поле безопасно для автоматического связывания только тогда, когда его значение назначается администратором арендатора, например upn или preferred_username в Azure Entra ID. Не включайте автоматическое связывание, если ваш IdP позволяет пользователям самостоятельно задавать это поле.`,requireEmailVerified:`Требовать подтверждённый адрес электронной почты`,requireEmailVerifiedDesc:`Принимать адрес электронной почты только в том случае, если провайдер пометил его как подтверждённый.`,requireEmailVerifiedWarning:`Предупреждение: адрес будет принят даже без подтверждения. Используйте только с доверенными провайдерами.`,requireEmailVerifiedAutoLink:`Чтобы изменить этот параметр, сначала отключите автоматическое связывание.`,defaultGroup:`Группа по умолчанию`,defaultGroupDesc:`Группа для автоматически созданных пользователей. Если не задана, используется группа «Наблюдатели».`,defaultGroupViewersFallback:`Наблюдатели (по умолчанию)`,autologin:`Автоматический вход`,autologinDesc:`Сразу перенаправлять неавторизованных посетителей к этому провайдеру. Этот флаг может быть установлен только у одного провайдера.`}},encryption:{title:`Состояние шифрования MFA`,enabledFromEnv:`Шифрование данных включено; ключ получен из переменной окружения MFA_ENCRYPTION_KEY`,enabledFromFile:`Шифрование данных включено; ключ загружен из каталога данных`,enabledGenerated:`Шифрование данных включено с автоматически созданным ключом`,notConfigured:`Шифрование хранимых данных не настроено`,notConfiguredDesc:`Секреты TOTP и client_secret провайдеров OIDC хранятся открытым текстом. Задайте MFA_ENCRYPTION_KEY или перезапустите Bambuddy с доступным для записи каталогом данных, чтобы ключ был создан автоматически.`,allEncrypted:`Все секреты MFA зашифрованы при хранении.`,legacyRowsLabel:`Старые записи открытым текстом`,encryptedRowsLabel:`Зашифрованные записи`,legacyRowsWarning:`Обнаружено старых записей открытым текстом: {{count}}. Чтобы перенести их в зашифрованное хранилище, повторно сохраните провайдера OIDC или заново подключите приложение-аутентификатор пользователя.`,backupHint:`Автоматически созданный ключ хранится в DATA_DIR/.mfa_encryption_key и включается в локальные ZIP-копии. Храните резервные копии в безопасном месте либо задайте MFA_ENCRYPTION_KEY явно.`,decryptionBrokenTitle:`Отсутствует ключ шифрования`,decryptionBrokenError:`Невозможно расшифровать записей: {{count}}, поскольку ключ шифрования больше недоступен. Для восстановления верните прежний MFA_ENCRYPTION_KEY или файл DATA_DIR/.mfa_encryption_key.`,migrationErrorWarning:`Не удалось повторно зашифровать старых записей при запуске: {{count}}. Проверьте журнал сервера и перезапустите Bambuddy для повторной попытки.`},pipelineLimits:{title:`Ограничения конвейеров слайсера`,maxCopiesLabel:`Максимум копий за запуск`,maxCopiesDesc:`Верхний предел количества копий, которое оператор может запросить при запуске конвейера. Жёсткое серверное ограничение — 1000.`},pipelines:{title:`Конвейеры слайсера`,subtitle:`Повторно используемые наборы профилей: принтер, процесс, филаменты и тип стола. Сохраните набор в окне нарезки и применяйте его к следующему файлу одним нажатием.`,loading:`Загрузка конвейеров...`,loadError:`Не удалось загрузить конвейеры.`,confirmDelete:`Удалить этот конвейер? Отменить действие нельзя.`,staleWarning:`Один или несколько связанных профилей больше не существуют. Чтобы исправить конвейер, повторно сохраните его из окна нарезки.`,empty:{title:`Конвейеров пока нет.`,howto:`Откройте окно нарезки любого файла, выберите принтер, процесс, филаменты и тип стола, затем нажмите «Сохранить как конвейер». Сохранённые конвейеры появятся здесь.`},field:{name:`Название конвейера`,description:`Описание`,targetPrinter:`Целевой принтер`,noTarget:`— Цель не задана —`,targetKind:`Тип цели`,targetKindSpecific:`Конкретный принтер`,targetKindClass:`Класс принтеров`,targetModelClass:`Модель принтера`,fanoutStrategy:`Стратегия распределения`,fanout:{max_parallel:`Максимум параллельно — распределять между любыми свободными подходящими принтерами`,round_robin:`По кругу — последовательно чередовать подходящие принтеры`,fill_one_first:`Сначала один — назначить все копии одному принтеру`},fanoutShort:{max_parallel:`параллельно`,round_robin:`по кругу`,fill_one_first:`сначала один`}},action:{save:`Сохранить`,cancel:`Отмена`,rename:`Переименовать`,delete:`Удалить`},slot:{printer:`Принтер`,process:`Процесс`,filament:`Филамент`,filamentN:`Филамент {{n}}`,filamentAll:`Все слоты: {{n}}`,bed:`Стол`},group:{profiles:`Профили`,filaments:`Филаменты`},searchPlaceholder:`Поиск конвейеров...`,filterTargetType:`Фильтр по типу цели`,filterTarget:`Фильтр по цели`,filter:{all:`Все цели`,noTarget:`Цель не задана`,count:`{{shown}} из {{total}}`,noMatches:`Нет конвейеров, соответствующих текущим фильтрам.`},toast:{saved:`Конвейер сохранён`,saveFailed:`Не удалось сохранить`,deleted:`Конвейер удалён`,deleteFailed:`Не удалось удалить`},noTargetHint:`Чтобы запустить, задайте целевой принтер`,noTargetWarning:`Перед запуском конвейера задайте целевой принтер.`,runs:{lastRun:`Последний запуск`,status:{queued:`в очереди`,slicing:`нарезка`,dispatching:`назначение`,in_progress:`печать`,completed:`завершено`,failed:`ошибка`,partial_failure:`частичная ошибка`,cancelled:`отменено`}}}},notification:{printStarted:{title:`Печать началась`,body:`{{printer}}: началась печать файла {{filename}}`},printCompleted:{title:`Печать завершена`,body:`{{printer}}: файл {{filename}} успешно напечатан`},printFailed:{title:`Ошибка печати`,body:`{{printer}}: печать файла {{filename}} завершилась ошибкой`},printStopped:{title:`Печать остановлена`,body:`{{printer}}: печать файла {{filename}} остановлена`},printProgress:{title:`Ход печати`,body:`{{printer}}: файл {{filename}} напечатан на {{percent}}%`},printerOffline:{title:`Принтер не в сети`,body:`{{printer}} не в сети`},printerError:{title:`Ошибка принтера`,body:`{{printer}}: {{error}}`},filamentLow:{title:`Заканчивается филамент`,body:`{{printer}}: осталось мало филамента`},maintenanceDue:{title:`Требуется обслуживание`,body:`{{printer}}: требуют внимания: {{items}}`}},errors:{generic:`Что-то пошло не так`,networkError:`Ошибка сети. Проверьте подключение.`,notFound:`Не найдено`,unauthorized:`Доступ не разрешён`,serverError:`Ошибка сервера`,validationError:`Проверьте введённые данные`,printerConnectionFailed:`Не удалось подключиться к принтеру`,saveFailed:`Не удалось сохранить изменения`,deleteFailed:`Не удалось удалить`,loadFailed:`Не удалось загрузить данные`},hmsErrors:{title:`Ошибки — {{name}}`,noErrors:`Ошибок нет`,viewOnWiki:`Открыть в Bambu Lab Wiki`,unknownCode:`Неизвестный код HMS — подробности см. в Bambu Lab Wiki.`,clearInstructions:`Устраните ошибки на принтере, чтобы они исчезли из этого списка.`,clearErrors:`Очистить ошибки`,clearSuccess:`Ошибки HMS очищены`,clearFailed:`Не удалось очистить ошибки HMS`,actionSuccess:`Команда отправлена принтеру`,actionFailed:`Не удалось отправить команду`,runoutExpectedSlot:`Филамент закончился в {{ranOut}}. Теперь принтер ожидает совместимый филамент в {{expected}}. Установите катушку в {{expected}}, затем выберите «Повторить».`,runoutExpectedSlotOnly:`Принтер ожидает совместимый филамент в {{expected}}. Установите туда катушку, затем выберите «Повторить».`,runoutSlotUnknown:`Филамент закончился, и печать приостановлена. Bambuddy не смог определить, какой слот теперь ожидает принтер. Проверьте запрошенный слот на экране принтера.`,actions:{RESUME_PRINTING:`Продолжить печать`,RESUME_PRINTING_DEFECTS:`Продолжить (дефекты допустимы)`,RESUME_PRINTING_PROBELM_SOLVED:`Продолжить (проблема устранена)`,STOP_PRINTING:`Остановить печать`,CHECK_ASSISTANT:`Проверить помощник`,FILAMENT_EXTRUDED:`Филамент выдавливается — продолжить`,RETRY_FILAMENT_EXTRUDED:`Филамент ещё не выходит — повторить`,CONTINUE:`Готово — продолжить`,LOAD_VIRTUAL_TRAY:`Загрузить филамент`,OK_BUTTON:`ОК`,FILAMENT_LOAD_RESUME:`Филамент загружен — продолжить`,JUMP_TO_LIVEVIEW:`Открыть камеру`,NO_REMINDER_NEXT_TIME:`Больше не напоминать`,REFRESH_NOZZLE:`Проверить ещё раз`,IGNORE_NO_REMINDER_NEXT_TIME:`Игнорировать и больше не напоминать`,IGNORE_RESUME:`Игнорировать и продолжить`,PROBLEM_SOLVED_RESUME:`Проблема устранена — продолжить`,TURN_OFF_FIRE_ALARM:`Понятно, отключить пожарную тревогу`,RETRY_PROBLEM_SOLVED:`Повторить (проблема устранена)`,CANCLE:`Отмена`,STOP_DRYING:`Остановить сушку`,PROCEED:`Продолжить`,OK_JUMP_RACK:`ОК`,ABORT:`Прервать`,DISABLE_PURIFICATION:`Отключить очистку воздуха для этой печати`,DONT_REMIND_NEXT_TIME:`Больше не напоминать`,DBL_CHECK_CANCEL:`Отмена`,DBL_CHECK_DONE:`Готово`,DBL_CHECK_RETRY:`Повторить`,DBL_CHECK_RESUME:`Продолжить`,DBL_CHECK_OK:`Подтвердить`,REMOVE_CLOSE_BTN:`Закрыть`}},mqttDebug:{title:`Журнал отладки MQTT`,searchPlaceholder:`Поиск по теме или содержимому...`,noMessages:`Сообщений пока нет`,startLoggingHint:`Нажмите «Начать запись», чтобы перехватывать сообщения MQTT`,noMessagesMatch:`Нет сообщений, соответствующих фильтру`,adjustFilterHint:`Измените запрос или параметры фильтра`,incoming:`Входящие`,outgoing:`Исходящие`,loggingStopped:`Запись остановлена`,loggingActive:`Запись активна — сообщения обновляются автоматически`,startLogging:`Начать запись`,stopLogging:`Остановить запись`,clearLog:`Очистить журнал`,topic:`Тема`,timestamp:`Время`,direction:`Направление`,all:`Все`},printerFiles:{title:`Файлы принтера`,storageUsed:`Занято:`,storageFree:`Свободно:`,filterPlaceholder:`Фильтр файлов...`,deleteButton:`Удалить`,deleteFiles:`Удалить файлы: {{count}}`,deleteFileConfirm:`Удалить «{{name}}»? Это действие нельзя отменить.`,deleteFilesConfirm:`Удалить выбранные файлы ({{count}})? Это действие нельзя отменить.`,noFiles:`На принтере нет файлов`,loadingFiles:`Загрузка файлов...`,failedToLoad:`Не удалось загрузить файлы`,toast:{filesDeleted:`Удалено файлов: {{count}}`,deleteFailed:`Не удалось удалить: {{error}}`}},confirm:{delete:`Удалить этот объект?`,unsavedChanges:`Есть несохранённые изменения. Всё равно уйти со страницы?`,clearQueue:`Очистить очередь печати?`},login:{title:`Вход в Bambuddy`,subtitle:`Войдите в свою учётную запись`,username:`Имя пользователя`,usernamePlaceholder:`Введите имя пользователя`,usernameOrEmail:`Имя пользователя или email`,usernameOrEmailPlaceholder:`Имя пользователя или email`,password:`Пароль`,passwordPlaceholder:`Введите пароль`,signIn:`Войти`,signingIn:`Вход...`,rememberMe:`Запомнить меня`,forgotPassword:`Забыли пароль?`,autologinFailed:`Автоматический вход через SSO не выполнен. Выберите провайдера ниже.`,localDisabledNotice:`Локальный вход отключён. Используйте одного из SSO-провайдеров ниже.`,loginSuccess:`Вход выполнен`,loginFailed:`Не удалось войти`,enterCredentials:`Введите имя пользователя и пароль`,enterEmail:`Введите адрес электронной почты`,oidcLoginFailed:`Ошибка входа через OIDC`,oidcErrors:{providerError:`Провайдер удостоверений вернул ошибку`,missingParameters:`В ответе OIDC отсутствуют обязательные параметры`,invalidState:`Состояние OIDC недействительно или уже использовано`,stateExpired:`Сеанс входа OIDC истёк — повторите попытку`,providerNotFound:`Провайдер OIDC не найден`,discoveryFailed:`Не удалось получить документ обнаружения OIDC`,invalidDiscovery:`Документ обнаружения OIDC недействителен`,networkError:`Сетевая ошибка при обмене токена OIDC`,badResponse:`Неожиданный ответ при обмене токена OIDC`,noIdToken:`Провайдер OIDC не вернул ID-токен`,validationFailed:`Не удалось проверить токен OIDC`,nonceMismatch:`Несовпадение nonce OIDC — возможна атака повторного воспроизведения`,missingSubClaim:`В токене OIDC отсутствует поле sub`,noLinkedAccount:`С этой учётной записью OIDC не связана локальная учётная запись`,accountInactive:`Учётная запись неактивна`,userResolutionFailed:`Не удалось определить учётную запись`,internalError:`Внутренняя ошибка при входе через OIDC`,tokenExchangeFailed:`Не удалось обменять токен OIDC`},forgotPasswordTitle:`Восстановление пароля`,forgotPasswordMessage:`Обратитесь к системному администратору для сброса пароля.`,forgotPasswordEmailMessage:`Введите адрес электронной почты, и мы отправим новый пароль.`,emailAddress:`Адрес электронной почты`,emailPlaceholder:`your.email@example.com`,cancel:`Отмена`,sending:`Отправка...`,sendResetEmail:`Отправить письмо для сброса`,howToReset:`Как сбросить пароль:`,resetStep1:`Свяжитесь с администратором Bambuddy`,resetStep2:`Попросите сбросить пароль в разделе управления пользователями`,resetStep3:`Администратор задаст новый временный пароль`,resetStep4:`Войдите с новым паролем и измените его в настройках`,gotIt:`Понятно`,resetPassword:{title:`Новый пароль`,subtitle:`Введите и подтвердите новый пароль.`,newPassword:`Новый пароль`,newPasswordPlaceholder:`Не менее 8 символов`,confirmPassword:`Подтверждение пароля`,confirmPasswordPlaceholder:`Повторите новый пароль`,saving:`Сохранение…`,submit:`Установить новый пароль`,backToLogin:`Вернуться ко входу`,passwordsDoNotMatch:`Пароли не совпадают`,passwordTooShort:`Пароль должен содержать не менее 8 символов`,resetFailed:`Не удалось сбросить пароль. Возможно, ссылка устарела.`},twoFA:{title:`Двухфакторная аутентификация`,subtitle:`Учётная запись защищена 2FA. Введите код подтверждения.`,methodAuthenticator:`Приложение-аутентификатор`,methodEmail:`Код по email`,methodBackup:`Резервный код`,instructionsTotp:`Откройте приложение-аутентификатор и введите шестизначный код Bambuddy.`,instructionsEmail:`Шестизначный код отправлен на вашу электронную почту. Он действует 10 минут.`,instructionsEmailNotSent:`Нажмите кнопку ниже, чтобы получить код подтверждения по email.`,instructionsBackup:`Введите один из восьмизначных резервных кодов восстановления. Каждый код используется только один раз.`,sendCodeButton:`Отправить код по email`,sendingCode:`Отправка...`,resendCode:`Отправить код повторно`,codeLabel:`Код подтверждения`,backupCodeLabel:`Резервный код`,codePlaceholder:`000000`,backupCodePlaceholder:`XXXXXXXX`,verifyButton:`Подтвердить`,verifyingButton:`Проверка...`,backToLogin:`← Вернуться ко входу`,orContinueWith:`или продолжить через`,signInWith:`Войти через {{provider}}`,enterCode:`Введите код подтверждения`,sendCodeFailed:`Не удалось отправить код подтверждения`,invalidCode:`Неверный код. Повторите попытку.`}},setup:{title:`Настройка Bambuddy`,subtitle:`Настройте аутентификацию для этого экземпляра Bambuddy`,enableAuth:`Включить аутентификацию`,adminAccount:`Учётная запись администратора`,adminAccountDesc:`Если администраторы уже существуют, аутентификация будет включена с использованием существующих учётных записей. Оставьте поля пустыми или введите данные для создания нового администратора.`,adminUsername:`Имя администратора`,adminPassword:`Пароль администратора`,optionalIfAdminExists:`(необязательно, если администратор уже существует)`,adminUsernamePlaceholder:`Введите имя администратора (необязательно)`,adminPasswordPlaceholder:`Введите пароль администратора (необязательно)`,confirmPassword:`Подтвердите пароль`,confirmPasswordPlaceholder:`Повторите пароль администратора`,settingUp:`Настройка...`,completeSetup:`Завершить настройку`,toast:{authEnabledAdminCreated:`Аутентификация включена, администратор создан`,authEnabledExistingAdmins:`Аутентификация включена для существующих администраторов`,setupCompleted:`Настройка завершена`,enterBothCredentials:`Введите имя и пароль администратора либо оставьте оба поля пустыми`,passwordsDoNotMatch:`Пароли не совпадают`,passwordTooShort:`Пароль должен содержать не менее 6 символов`}},changePassword:{title:`Изменение пароля`,currentPassword:`Текущий пароль`,currentPasswordPlaceholder:`Введите текущий пароль`,newPassword:`Новый пароль`,newPasswordPlaceholder:`Введите новый пароль (не менее 6 символов)`,confirmPassword:`Подтвердите новый пароль`,confirmPasswordPlaceholder:`Повторите новый пароль`,passwordsDoNotMatch:`Пароли не совпадают`,passwordTooShort:`Пароль должен содержать не менее 6 символов`,changing:`Изменение...`,success:`Пароль изменён`,failed:`Не удалось изменить пароль`},plateAlert:{title:`Печать приостановлена!`,message:`На печатной пластине обнаружены объекты. Печать автоматически приостановлена. Очистите пластину и продолжите печать.`,understand:`Понятно`},camera:{title:`Камера`,invalidPrinterId:`Неверный идентификатор принтера`,live:`Прямой эфир`,snapshot:`Снимок`,restartStream:`Перезапустить поток`,refreshSnapshot:`Обновить снимок`,fullscreen:`На весь экран`,exitFullscreen:`Выйти из полноэкранного режима`,connectingToCamera:`Подключение к камере...`,capturingSnapshot:`Создание снимка...`,connectionLost:`Соединение потеряно`,connectionFailed:`Не удалось подключиться к камере`,reconnecting:`Повторное подключение через {{countdown}} с... (попытка {{attempt}} из {{max}})`,reconnectNow:`Подключиться сейчас`,cameraUnavailable:`Камера недоступна`,cameraUnavailableDesc:`Убедитесь, что принтер включён и подключён к сети.`,noCamera:`Камера отсутствует`,retry:`Повторить`,cameraStream:`Видеопоток камеры`,zoomOut:`Уменьшить`,zoomIn:`Увеличить`,resetZoom:`Сбросить масштаб`,recording:`Запись`,startRecording:`Начать запись`,stopRecording:`Остановить запись`,chamberLight:`Переключить освещение камеры принтера`,unavailable:`Камера недоступна`,diagnose:{button:`Диагностика`,modalTitle:`Диагностика камеры`,running:`Выполняется диагностика...`,runFailed:`Не удалось выполнить диагностику: {{error}}`,retry:`Запустить снова`,stage:{tcp_reachable:`Доступность по сети`,first_frame:`Получение кадра`,live_stream_active:`Активный видеопоток`},summary:{all_ok:`Камера работает. Все этапы диагностики завершены успешно.`,live_stream_active_healthy:`Камера уже передаёт свежие кадры — дополнительная проверка не требуется.`,printer_unreachable:`Принтер недоступен. Проверьте IP-адрес, сетевое подключение и питание принтера.`,camera_port_closed:`Принтер доступен, но порт камеры закрыт. Убедитесь, что в настройках принтера включены режим «Только LAN» и режим разработчика.`,no_frame:`Подключение к камере установлено, но кадры не поступают. Повторите попытку или проверьте, включена ли камера в настройках принтера.`,unknown_failure:`Диагностика камеры завершилась неизвестной ошибкой. Подробности см. в журнале поддержки.`},meta:{protocol:`Протокол`,port:`Порт`,profile:`Профиль`}}},groups:{title:`Управление группами`,subtitle:`Настройка групп разрешений для контроля доступа`,backToSettings:`Вернуться к настройкам`,createGroup:`Создать группу`,noPermission:`У вас нет доступа к этой странице.`,system:`Системная`,noDescription:`Без описания`,usersCount:`Пользователей: {{count}}`,permissionsCount:`Разрешений: {{count}}`,edit:`Изменить`,delete:`Удалить`,toast:{created:`Группа создана`,updated:`Группа обновлена`,deleted:`Группа удалена`,enterGroupName:`Введите название группы`},modal:{editGroup:`Изменение группы`,createGroup:`Создание группы`,cancel:`Отмена`,saving:`Сохранение...`,creating:`Создание...`,saveChanges:`Сохранить изменения`},form:{groupName:`Название группы`,groupNamePlaceholder:`Введите название группы`,systemGroupWarning:`Названия системных групп изменить нельзя`,description:`Описание`,descriptionPlaceholder:`Введите описание (необязательно)`,permissions:`Разрешения (выбрано: {{count}})`},deleteModal:{title:`Удаление группы`,message:`Удалить эту группу? Входящие в неё пользователи потеряют соответствующие разрешения.`,confirm:`Удалить группу`},editor:{title:`Изменение группы`,createTitle:`Создание группы`,search:`Поиск разрешений...`,selectAll:`Выбрать все`,clearAll:`Очистить выбор`,permissionsSelected:`Выбрано: {{count}}`,noResults:`Нет разрешений, соответствующих запросу`,websocketHint:`Необходимо для обновлений в реальном времени. Без этого интерфейс будет периодически опрашивать сервер.`}},users:{title:`Управление пользователями`,subtitle:`Управление пользователями и их доступом к Bambuddy`,backToSettings:`Вернуться к настройкам`,createUser:`Создать пользователя`,noPermission:`У вас нет доступа к этой странице.`,admin:`Администратор`,noGroups:`Без групп`,active:`Активен`,inactive:`Отключён`,edit:`Изменить`,delete:`Удалить`,system:`Системный`,noGroupsAvailable:`Нет доступных групп`,table:{username:`Имя пользователя`,groups:`Группы`,status:`Состояние`,actions:`Действия`},toast:{created:`Пользователь создан`,updated:`Пользователь обновлён`,deleted:`Пользователь удалён`,fillRequired:`Заполните все обязательные поля`,passwordsDoNotMatch:`Пароли не совпадают`,passwordTooShort:`Пароль должен содержать не менее 6 символов`,ldapProvisioned:`Пользователь LDAP «{{username}}» добавлен`},modal:{createUser:`Создание пользователя`,editUser:`Изменение пользователя`,cancel:`Отмена`,creating:`Создание...`,saving:`Сохранение...`,saveChanges:`Сохранить изменения`,advancedAuthSubtitle:`с расширенной аутентификацией`,tabsAriaLabel:`Источник пользователя`,localTab:`Локальный`,ldapTab:`LDAP`,ldapSearchLabel:`Поиск в каталоге`,ldapSearchPlaceholder:`Введите имя пользователя, имя или email...`,ldapMinChars:`Для поиска введите не менее 2 символов`,ldapTypeToSearch:`Начните вводить запрос для поиска в каталоге LDAP`,ldapSearching:`Поиск в каталоге...`,ldapNoResults:`В каталоге нет подходящих пользователей`,ldapSearchError:`Ошибка поиска в каталоге. Проверьте состояние сервера LDAP.`,ldapAlreadyProvisioned:`Уже добавлен`,ldapSelectedLabel:`Выбран`,ldapProvision:`Добавить пользователя`,ldapProvisioning:`Добавление...`,ldapErrorProvision:`Не удалось добавить пользователя. Проверьте сервер LDAP и повторите попытку.`},form:{username:`Имя пользователя`,usernamePlaceholder:`Введите имя пользователя`,email:`Электронная почта`,emailPlaceholder:`user@example.com`,password:`Пароль`,passwordPlaceholder:`Введите пароль`,confirmPassword:`Подтверждение пароля`,confirmPasswordPlaceholder:`Повторите пароль`,newPasswordPlaceholder:`Введите новый пароль`,confirmNewPasswordPlaceholder:`Повторите новый пароль`,leaveBlankToKeep:`оставьте пустым, чтобы сохранить текущий`,groups:`Группы`,optional:`необязательно`,autoGeneratedPassword:`Надёжный пароль будет создан автоматически и отправлен пользователю по email.`,passwordManagedByAdvancedAuth:`Пароль управляется расширенной аутентификацией. Используйте «Сбросить пароль», чтобы отправить пользователю новый пароль по email.`,resetPassword:`Сбросить пароль`,resettingPassword:`Сброс пароля...`},deleteModal:{title:`Удаление пользователя`,message:`Удалить этого пользователя? Это действие нельзя отменить.`,confirm:`Удалить пользователя`}},streamOverlay:{title:`Оформление трансляции`,invalidPrinterId:`Неверный идентификатор принтера`,cameraStream:`Видеопоток камеры`,progress:`Прогресс`,eta:`Осталось`,printerIdle:`Принтер простаивает`,printerOffline:`Принтер не в сети`,status:{printing:`Печать`,paused:`Приостановлено`,finished:`Завершено`,failed:`Ошибка`,idle:`Ожидание`,unknown:`Неизвестно`}},profiles:{title:`Профили`,subtitle:`Управление профилями слайсера и калибровками Pressure Advance`,tabs:{bambuCloud:`Bambu Cloud`,orcaCloud:`Orca Cloud`,local:`Локальные профили`,kprofiles:`K-профили`},orcaCloud:{connectedAs:`Подключено как`,connectedShort:`Подключено к Orca Cloud`,logout:`Отключиться`,noLogoutPermission:`У вас нет разрешения отключаться от Orca Cloud`,noConnectPermission:`У вас нет разрешения подключаться к Orca Cloud`,retry:`Повторить`,connectButton:`Подключить Orca Cloud`,connect:{title:`Подключение к Orca Cloud`,description:`Войдите в Orca Cloud, чтобы синхронизировать профили слайсера с Bambuddy.`},device:{title:`Разрешите доступ Bambuddy в Orca Cloud`,instruction:`Откройте Orca Cloud и подтвердите этот код. После подтверждения Bambuddy подключится автоматически.`,codeLabel:`Код сопряжения`,openButton:`Открыть страницу подтверждения Orca Cloud`,manualHint:`Либо откройте {{url}} и введите указанный выше код.`,waiting:`Ожидание подтверждения…`,cancel:`Отмена`},profiles:{title:`Ваши профили Orca Cloud ({{count}})`,refresh:`Обновить`,empty:`В вашей учётной записи Orca Cloud пока нет профилей.`},toast:{disconnected:`Orca Cloud отключён`},errors:{startFailed:`Не удалось начать вход в Orca Cloud.`,denied:`Сопряжение отклонено в Orca Cloud.`,expired:`Срок действия кода сопряжения истёк. Нажмите «Подключить», чтобы повторить попытку.`,pollFailed:`Соединение было потеряно во время ожидания подтверждения. Повторите попытку.`}},localProfiles:{title:`Локальные профили`,subtitle:`Импорт профилей OrcaSlicer и управление ими`,import:`Импортировать профили`,importDesc:`Перетащите сюда файлы .bbscfg, .bbsflmt, .orca_filament, .zip или .json`,importing:`Импорт...`,search:`Поиск локальных профилей...`,noPresets:`Локальных профилей пока нет`,noSearchResults:`Нет профилей, соответствующих запросу`,badge:`Локальный`,edit:`Изменить`,delete:`Удалить`,cancel:`Отмена`,deleteConfirmTitle:`Удаление профиля`,deleteConfirm:`Удалить этот профиль? Это действие нельзя отменить.`,source:`Источник`,inheritsFrom:`Наследует`,filamentType:`Тип`,vendor:`Производитель`,compatiblePrinters:`Принтеры`,nozzleTemp:`Температура сопла`,cost:`Стоимость`,density:`Плотность`,pressureAdvance:`Опережение давления`,filament:`Филамент`,process:`Процесс`,printer:`Принтер`,toast:{importSuccess:`Импортировано профилей: {{count}}`,importSkipped:`Пропущено дубликатов: {{count}}`,importError:`Ошибок при импорте: {{count}}`,deleted:`Профиль удалён`,updated:`Профиль обновлён`}},connectedAs:`Подключено как`,signInExpiredTitle:`Срок авторизации в Bambu Cloud истёк`,signInExpiredBody:`Bambu Lab больше не принимает сохранённый токен. Выполните вход снова, чтобы восстановить облачные профили, импорт из MakerWorld и проверку прошивок.`,logout:`Выйти`,noLogoutPermission:`У вас нет разрешения выходить из учётной записи`,failedToLoad:`Не удалось загрузить профили`,retry:`Повторить`,time:{justNow:`Только что`,minsAgo:`{{count}} мин назад`,hoursAgo:`{{count}} ч назад`,daysAgo:`{{count}} дн назад`},toast:{loggedOut:`Вы вышли из учётной записи`},login:{title:`Подключение к Bambu Cloud`,subtitle:`Синхронизация профилей слайсера между устройствами`,email:`Электронная почта`,password:`Пароль`,region:`Регион`,regionGlobal:`Глобальный`,regionChina:`Китай`,verificationCode:`Код подтверждения`,totpCode:`Код приложения-аутентификатора`,checkEmail:`Проверьте почту {{email}}: туда отправлен шестизначный код`,enterTotpHint:`Введите шестизначный код из приложения-аутентификатора`,accessToken:`Токен доступа`,accessTokenHint:`Вставьте токен доступа Bambu Cloud. Для учётных записей китайского региона, привязанных к телефону, доступен только этот способ: вход по email не поддерживается. Инструкцию по получению токена из cookie MakerWorld см. в wiki.`,back:`Назад`,loginButton:`Войти`,verifyButton:`Подтвердить`,setTokenButton:`Сохранить токен`,useToken:`Использовать токен доступа`,useEmail:`Войти по email`,toast:{loggedIn:`Вход выполнен`,codeSent:`Код подтверждения отправлен по email`,enterTotp:`Введите код из приложения-аутентификатора`,tokenSet:`Токен сохранён`}},presets:{myPreset:`Мой профиль (редактируемый)`,duplicate:`Создать копию`,editable:`Редактируемый`,failedToLoadDetails:`Не удалось загрузить сведения о профиле`,deleteConfirm:`Удалить этот профиль?`,deleteWarning:`Профиль «{{name}}» будет безвозвратно удалён из Bambu Cloud. Это действие нельзя отменить.`,noDuplicatePermission:`У вас нет разрешения копировать профили`,noEditPermission:`У вас нет разрешения редактировать профили`,noDeletePermission:`У вас нет разрешения удалять профили`,types:{filament:`Профиль филамента`,printer:`Профиль принтера`,process:`Профиль процесса`},toast:{deleted:`Профиль удалён`,created:`Профиль создан`,updated:`Профиль обновлён`,duplicated:`Копия профиля создана`,fieldAdded:`Добавлено поле «{{key}}»`,exported:`Профиль экспортирован`},baseLabel:`Базовый: {{name}}`,currentLabel:`Текущий: {{name}}`,newPreset:`Новый профиль`,editPreset:`Изменение профиля`,duplicatePreset:`Копирование профиля`,createNewPreset:`Создание профиля`,customizeSettings:`Настройте параметры нового профиля`,compareWithBase:`Сравнить с базовым профилем`,compare:`Сравнить`,basePreset:`Базовый профиль`,selectBasePreset:`Выберите базовый профиль...`,presetName:`Название профиля`,myCustomPreset:`Мой профиль`,inheritsFrom:`Наследует от`,dropJsonToImport:`Перетащите JSON для импорта`,tabs:{common:`Основные`,allFields:`Все поля`},availableFields:`Доступные поля`,searchFieldsPlaceholder:`Поиск полей...`,noMatchingFields:`Нет подходящих полей`,allFieldsAdded:`Все поля добавлены`,addCustomField:`Добавить произвольное поле`,yourOverrides:`Ваши переопределения`,noOverridesYet:`Переопределений пока нет`,clickFieldsToAdd:`Нажимайте поля слева, чтобы добавить их`,saveAsTemplate:`Сохранить как шаблон`,jsonTip:`Совет: перетащите файл .json в это окно, чтобы импортировать настройки`},cloudView:{searchPlaceholder:`Поиск профилей...`,templates:`Шаблоны`,refresh:`Обновить`,newPreset:`Новый профиль`,clearFilters:`Сбросить фильтры`,compareMode:`Режим сравнения`,selectAnotherPreset:`Выберите другой профиль типа «{{type}}»`,clickTwoPresets:`Выберите два профиля одного типа для сравнения`,selectFirst:`1. Выберите первый`,selectSecond:`2. Выберите второй`,compareNow:`Сравнить`,lastSynced:`Последняя синхронизация:`,showingCount:`Показано {{showing}} из {{total}} профилей`,noPresetsFound:`Профили не найдены`,columns:{filament:`Филамент`,process:`Процесс`,printer:`Принтер`},noFilamentPresets:`Нет профилей филамента`,noProcessPresets:`Нет профилей процесса`,noPrinterPresets:`Нет профилей принтера`,filters:{type:`Тип`,owner:`Владелец`,printer:`Принтер`,nozzle:`Сопло`,filament:`Филамент`,layer:`Слой`,all:`Все`,myPresets:`Мои профили`,builtIn:`Встроенные`,process:`Процесс`},noTemplatesPermission:`У вас нет разрешения управлять шаблонами`,noRefreshPermission:`У вас нет разрешения обновлять профили`,noCreatePermission:`У вас нет разрешения создавать профили`},templates:{title:`Быстрые шаблоны`,noTemplates:`Шаблонов пока нет`,createFirst:`Создавайте шаблоны в редакторе профилей`,typeFilter:`Тип:`,deleteTitle:`Удаление шаблона`,deleteWarning:`Это действие нельзя отменить`,deleteConfirm:`Удалить шаблон «{{name}}»?`,namePlaceholder:`Название шаблона`,descriptionPlaceholder:`Описание`,settingsJson:`Настройки (JSON)`,fieldsCount:`Полей: {{count}}`,shownInModals:`Показывается в окнах`,hiddenInModals:`Скрыт в окнах`,apply:`Применить`,toast:{deleted:`Шаблон удалён`,updated:`Шаблон обновлён`,created:`Шаблон создан`,applied:`Шаблон применён`}}},support:{debugLoggingActive:`Отладочное журналирование включено`,manageLogs:`Управление`,collectItem7:`Подключение принтеров и версии прошивок`,collectItem8:`Состояние интеграций (Spoolman, MQTT, HA)`,collectItem9:`Сетевые интерфейсы (только подсети)`,collectItem10:`Версии пакетов Python`,collectItem11:`Проверка состояния базы данных`,collectItem12:`Сведения о среде Docker`,bundleGenerating:`Формирование пакета...`,bundleStepConnection:`Проверка подключения принтеров`,bundleStepVirtualPrinters:`Проверка настройки виртуальных принтеров`,bundleStepLogScan:`Поиск известных проблем в последних журналах`,bundleStepBuild:`Создание ZIP-пакета для поддержки`},fileManager:{title:`Файловый менеджер`,subtitle:`Организация и управление файлами для печати`,uploadFiles:`Загрузить файлы`,newFolder:`Новая папка`,folderName:`Имя папки`,folderNamePlaceholder:`например, Функциональные детали`,renameFile:`Переименовать файл`,renameFolder:`Переименовать папку`,invalidFilenameChar:`Символ «{{char}}» нельзя использовать в именах файлов печати. SD-карта принтера не принимает: < > : " / \\ | ? *`,moveFiles:`Переместить файлы ({{count}})`,rootNoFolder:`Корень (без папки)`,current:`текущая`,linkFolder:`Связать папку`,linkFolderDescription:`Связать «{{name}}» с проектом или архивом для быстрого доступа.`,project:`Проект`,archive:`Архив`,noProjectsFound:`Проекты не найдены`,noArchivesFound:`Архивы не найдены`,unlink:`Отвязать`,link:`Связать`,dragDropFiles:`Перетащите файлы сюда`,dropFilesHere:`Перетащите файлы сюда`,releaseToUpload:`Отпустите для загрузки`,orClickToBrowse:`или нажмите для выбора`,allFileTypesSupported:`Поддерживаются все типы файлов. ZIP-архивы будут распакованы.`,zipFilesDetected:`Обнаружены ZIP-архивы`,zipExtractOptions:`ZIP-архивы будут распакованы. Выберите способ обработки структуры папок:`,preserveZipStructure:`Сохранить структуру папок из ZIP`,createFolderFromZip:`Создать папку с именем ZIP-файла`,stlThumbnailGeneration:`Создание миниатюр STL`,zipMayContainStl:`ZIP-архивы могут содержать STL-файлы. Миниатюры можно создать при распаковке.`,thumbnailsCanBeGenerated:`Для STL-файлов можно создать миниатюры. Обработка крупных моделей может занять больше времени.`,generateThumbnailsForStl:`Создать миниатюры для STL-файлов`,threemfDetected:`Обнаружены файлы 3MF`,threemfExtractionInfo:`Модель принтера, материал, цвет и параметры печати будут автоматически извлечены из файлов 3MF.`,willBeExtracted:`Будут извлечены`,filesExtracted:`Извлечено файлов: {{count}}`,uploadComplete:`Загрузка завершена: успешно — {{succeeded}}`,uploadFailed:`Ошибка загрузки`,zipFilesFailed:`Не удалось обработать файлов: {{count}}`,uploading:`Загрузка...`,changeLink:`Изменить связь...`,linkTo:`Связать с...`,linkToProjectOrArchive:`Связать с проектом или архивом`,generateThumbnail:`Создать миниатюру`,generateThumbnails:`Создать миниатюры`,generateThumbnailsForMissing:`Создать отсутствующие миниатюры для STL-файлов`,gridView:`Плитка`,listView:`Список`,lowDiskSpaceWarning:`Мало свободного места`,lowDiskSpaceDetails:`Свободно только {{free}} из {{total}}. Порог предупреждения в настройках: {{threshold}} ГБ.`,files:`Файлы`,folders:`Папки`,size:`Размер`,free:`Свободно`,allFiles:`Все файлы`,allExternal:`Внешние`,externalIsEmpty:`Внешних файлов нет`,externalEmptyDescription:`Здесь появятся файлы из подключённых внешних папок.`,wrap:`Перенос строк`,enableTextWrapping:`Включить перенос строк`,disableTextWrapping:`Отключить перенос строк`,collapse:`Свернуть`,collapseFoldersByDefault:`Сворачивать папки по умолчанию`,expandFoldersByDefault:`Разворачивать папки по умолчанию`,folderSort:`Сортировка папок`,folderSortByName:`По имени`,folderSortByActivity:`По последней активности`,dragToResizeTooltip:`Перетащите для изменения размера, двойной щелчок — сброс`,searchFiles:`Поиск файлов...`,searchSubfoldersHint:`С учётом вложенных папок`,readme:{truncated:`Показано не полностью`,show:`Показать README`,hide:`Скрыть README`,label:`README`},tags:{title:`Метки`,subtitle:`Помечайте файлы для сквозной фильтрации: игрушки, безопасно для детей, только PETG и что угодно ещё.`,manage:`Метки`,manageTitle:`Управление каталогом меток`,add:`Новая метка`,edit:`Переименовать метку`,name:`Название`,fileCount:`Файлы`,empty:`Меток пока нет. Создайте первую, чтобы начать помечать файлы.`,noMatches:`Подходящие метки не найдены.`,createPlaceholder:`например, игрушки, детям, petg`,createButton:`Создать`,nameRequired:`Укажите название.`,searchPlaceholder:`Фильтр меток...`,created:`Метка создана.`,updated:`Метка переименована.`,deleted:`Метка удалена.`,saveFailed:`Не удалось сохранить метку.`,deleteFailed:`Не удалось удалить метку.`,applyFailed:`Не удалось применить метки.`,applyAdd:`Добавить метки`,applyRemove:`Удалить метки`,applyAddSuccess:`Добавлено меток: {{count}}; обработано файлов: {{files}}.`,applyRemoveSuccess:`Удалено меток: {{count}}; обработано файлов: {{files}}.`,actionAdd:`Добавить к выбранным файлам`,actionRemove:`Удалить с выбранных файлов`,tagAction:`Метки`,bulkTitle:`Метки для выбранных файлов ({{count}})`,bulkTooltip:`Добавить или удалить метки у всех выбранных файлов.`,noPermission:`У вас нет прав на изменение меток файлов.`,filterLabel:`Фильтр по меткам:`,clearAll:`Очистить всё`,confirmDelete:`Удалить метку «{{name}}»?`,confirmDeleteMessage:`Метка будет удалена из каталога. Остальные метки файлов сохранятся.`,confirmDeleteInUseMessage:`Эта метка назначена файлам ({{count}}). При удалении метка исчезнет у всех файлов; сами файлы не изменятся.`,editAria:`Изменить {{name}}`,deleteAria:`Удалить {{name}}`},allTypes:`Все типы`,prints:`Файлы печати`,ascending:`По возрастанию`,descending:`По убыванию`,resultsCount:`Показано {{showing}} из {{total}} файлов`,selectAll:`Выбрать всё`,deselectAll:`Снять выделение`,selected:`Выбрано: {{count}}`,adding:`Добавление...`,loadingFiles:`Загрузка файлов...`,folderIsEmpty:`Папка пуста`,noFilesYet:`Файлов пока нет`,folderEmptyDescription:`Загрузите или переместите файлы в эту папку.`,noFilesDescription:`Загрузите файлы, чтобы начать упорядочивать материалы для печати.`,noMatchingFiles:`Подходящие файлы не найдены`,noMatchingFilesDescription:`Нет файлов, соответствующих текущему поиску или фильтрам.`,clearFilters:`Сбросить фильтры`,printedCount:`Напечатано: {{count}}×`,uploadedBy:`Загрузил`,deleteFolder:`Удалить папку`,deleteFile:`Удалить файл`,deleteFilesCount:`Удалить файлы ({{count}})`,deleteFolderConfirm:`Удалить эту папку? Все находящиеся в ней файлы также будут удалены.`,deleteFileConfirm:`Удалить этот файл?`,deleteFilesConfirm:`Удалить выбранные файлы ({{count}})? Это действие нельзя отменить.`,deleting:`Удаление...`,noPermissionRenameFolder:`У вас нет прав на переименование папок`,noPermissionLinkFolder:`У вас нет прав на связывание папок`,noPermissionDeleteFolder:`У вас нет прав на удаление папок`,noPermissionPrint:`У вас нет прав на запуск печати`,noPermissionAddToQueue:`У вас нет прав на добавление в очередь`,noPermissionSlice:`У вас нет прав на нарезку файлов`,noPermissionDownload:`У вас нет прав на скачивание файлов`,noPermissionRenameFile:`У вас нет прав на переименование этого файла`,noPermissionGenerateThumbnail:`У вас нет прав на создание миниатюр`,noPermissionDeleteFile:`У вас нет прав на удаление этого файла`,noPermissionCreateFolder:`У вас нет прав на создание папок`,noPermissionUpload:`У вас нет прав на загрузку файлов`,noPermissionMoveFiles:`У вас нет прав на перемещение файлов`,noPermissionDeleteFiles:`У вас нет прав на удаление файлов`,linkExternal:`Подключить внешнюю папку`,linkExternalFolder:`Подключить внешнюю папку`,linkExternalFolderDescription:`Подключить каталог хоста (NAS, USB-накопитель или сетевой ресурс) к файловому менеджеру. Файлы не копируются — Bambuddy обращается к ним по исходному пути.`,externalFolderNamePlaceholder:`например, Модели на NAS`,externalPath:`Путь на хосте`,externalPathHelp:`Абсолютный путь к каталогу на хосте Docker. Каталог должен быть подключён к контейнеру через bind mount.`,readOnly:`Только чтение`,readOnlyHelp:`запрещает загрузку и удаление файлов`,showHiddenFiles:`Показывать скрытые файлы (dotfiles)`,externalFolder:`Внешняя папка`,scanFolder:`Сканировать`,toast:{folderCreated:`Папка создана`,folderDeleted:`Папка удалена`,fileDeleted:`Файл удалён`,filesDeleted:`Удалено файлов: {{count}}`,filesMoved:`Файлы перемещены`,folderLinked:`Папка связана`,folderUnlinked:`Связь с папкой удалена`,externalFolderLinked:`Внешняя папка подключена и просканирована`,folderScanned:`Сканирование завершено: добавлено — {{added}}, удалено — {{removed}}`,addedToQueue:`Добавлено в очередь файлов: {{count}}`,addedToQueuePartial:`Добавлено файлов: {{added}}, ошибок: {{failed}}`,failedToAddToQueue:`Не удалось добавить файлы: {{error}}`,fileRenamed:`Файл переименован`,folderRenamed:`Папка переименована`,thumbnailsGenerated:`Создано миниатюр: {{count}}`,thumbnailsGeneratedPartial:`Создано миниатюр: {{succeeded}}, ошибок: {{failed}}`,noStlMissingThumbnails:`Нет STL-файлов без миниатюр`,failedToGenerateThumbnails:`Не удалось создать миниатюры: {{error}}`,thumbnailGenerated:`Миниатюра создана`,failedToGenerateThumbnail:`Не удалось создать миниатюру: {{error}}`}},projects:{title:`Проекты`,subtitle:`Организация и отслеживание проектов 3D-печати`,newProject:`Новый проект`,editProject:`Изменить проект`,deleteProject:`Удалить проект`,projectName:`Название проекта`,description:`Описание`,noProjects:`Проектов пока нет`,noProjectsFiltered:`Нет проектов со статусом «{{status}}»`,noProjectsFilteredHelp:`У вас нет проектов со статусом «{{status}}». Они появятся здесь после изменения статуса.`,createFirst:`Создайте первый проект, чтобы объединять связанные печати, отслеживать ход работ и управлять сборкой.`,createFirstButton:`Создать первый проект`,create:`Создать`,files:`Файлы`,prints:`Печати`,plates:`пластин`,parts:`деталей`,lastModified:`Последнее изменение`,deleteConfirm:`Удалить этот проект? Архивные записи и элементы очереди будут отвязаны, но не удалены.`,addFiles:`Добавить файлы`,removeFile:`Убрать файл`,viewDetails:`Подробнее`,namePlaceholder:`например, Сборка Voron 2.4`,descriptionPlaceholder:`Необязательное описание...`,urlLabel:`URL`,urlPlaceholder:`https://makerworld.com/...`,urlInvalid:`URL должен начинаться с http:// или https://`,openExternalUrl:`Открыть страницу проекта`,coverImageLabel:`Обложка`,coverImageAlt:`Обложка проекта`,coverImageUpload:`Загрузить`,coverImageReplace:`Заменить`,coverImageRemove:`Удалить`,color:`Цвет`,targetPlates:`План по пластинам`,targetPlatesPlaceholder:`например, 25`,targetPlatesHelp:`Количество заданий печати`,targetParts:`План по деталям`,targetPartsPlaceholder:`например, 150`,targetPartsHelp:`Общее требуемое количество объектов`,tagsLabel:`Метки (через запятую)`,tagsPlaceholder:`например, voron, функциональное, подарок`,dueDate:`Срок`,priority:`Приоритет`,priorityLow:`Низкий`,priorityNormal:`Обычный`,priorityHigh:`Высокий`,priorityUrgent:`Срочный`,statusActive:`Активный`,statusCompleted:`Завершён`,statusArchived:`В архиве`,done:`Готово`,completed:`завершено`,failed:`ошибка`,inQueue:`в очереди`,noPrintsYet:`Печатей пока нет`,printJobs:`Задания печати (пластины)`,partsPrinted:`Напечатано деталей`,failedParts:`Неудачных деталей`,import:`Импорт`,export:`Экспорт`,importProject:`Импортировать проект`,exportAll:`Экспортировать все проекты`,loading:`Загрузка проектов...`,noEditPermission:`У вас нет прав на изменение проектов`,noDeletePermission:`У вас нет прав на удаление проектов`,noCreatePermission:`У вас нет прав на создание проектов`,noImportPermission:`У вас нет прав на импорт проектов`,noExportPermission:`У вас нет прав на экспорт проектов`,toast:{created:`Проект создан`,updated:`Проект обновлён`,deleted:`Проект удалён`,imported:`Проект импортирован`,multipleImported:`Импортировано проектов: {{count}}`,importFailed:`Не удалось импортировать проект`,exported:`Проекты экспортированы (только метаданные)`}},projectDetail:{notFound:`Проект не найден`,backToProjects:`Вернуться к проектам`,export:`Экспорт`,exportProject:`Экспортировать проект`,noExportPermission:`У вас нет прав на экспорт проектов`,noEditPermission:`У вас нет прав на изменение проектов`,partOf:`Входит в:`,priorityLabel:`Приоритет:`,noPrints:`В этом проекте пока нет печатей`,status:{active:`Активный`,completed:`Завершён`,archived:`В архиве`},priority:{low:`Низкий`,normal:`Обычный`,high:`Высокий`,urgent:`Срочный`},dueDate:{overdue:`Срок истёк`,today:`Срок сегодня`,daysLeft:`Осталось дней: {{count}}`},progress:{platesProgress:`Выполнение по пластинам`,partsProgress:`Выполнение по деталям`,printJobs:`заданий печати`,parts:`деталей`,percentComplete:`Выполнено {{percent}}%`,remaining:`Осталось: {{count}}`},stats:{printJobs:`Задания печати`,total:`всего`,failed:`Неудачных: {{count}}`,partsPrinted:`Напечатано деталей: {{count}}`,printTime:`Время печати`,filamentUsed:`Израсходовано филамента`},cost:{title:`Учёт стоимости`,filamentCost:`Стоимость филамента`,energy:`Электроэнергия`,totalCost:`Общая стоимость`,total:`Итого`,includesBom:`включая спецификацию`,budget:`Бюджет`,remaining:`Остаток`},subProjects:{title:`Подпроекты ({{count}})`},notes:{title:`Заметки`,noEditPermission:`У вас нет прав на изменение заметок`,placeholder:`Добавьте заметки о проекте...`,empty:`Заметок пока нет. Нажмите «Изменить», чтобы добавить.`},files:{title:`Файлы`,linkFolders:`Свяжите папки из файлового менеджера`,forQuickAccess:`с этим проектом для быстрого доступа.`,fileCount:`Файлов: {{count}}`,empty:`Связанных папок нет. Откройте файловый менеджер и свяжите папку с проектом.`,noFiles:`В этой папке нет файлов.`},bom:{title:`Спецификация`,acquired:`Приобретено: {{completed}}/{{total}}`,showAll:`Показать всё`,hideDone:`Скрыть готовое`,addPart:`Добавить позицию`,noAddPermission:`У вас нет прав на добавление позиций`,partNamePlaceholder:`Название позиции (например, винты M3×8)`,partName:`Название позиции`,qty:`Кол-во`,price:`Цена ({{currency}})`,sourcingUrlPlaceholder:`Ссылка на поставщика (необязательно)`,remarksPlaceholder:`Примечание (необязательно)`,deletePart:`Удалить позицию`,deleteConfirm:`Удалить «{{name}}»?`,noUpdatePermission:`У вас нет прав на обновление позиций`,noEditPermission:`У вас нет прав на изменение позиций`,noDeletePermission:`У вас нет прав на удаление позиций`,totalCost:`Общая стоимость:`,empty:`В спецификации пока нет позиций. Добавьте крепёж, электронику и другие компоненты, закупку которых нужно отслеживать.`},timeline:{title:`Хронология активности`,empty:`Активности пока нет.`},template:{saveAsTemplate:`Сохранить как шаблон`,noCreatePermission:`У вас нет прав на создание шаблонов`},queue:{title:`Очередь`,viewAll:`Показать всё`,printing:`Печатается: {{count}}`,queued:`В очереди: {{count}}`},prints:{title:`Печати ({{count}})`},toast:{projectUpdated:`Проект обновлён`,partAdded:`Позиция добавлена`,partRemoved:`Позиция удалена`,exportFailed:`Не удалось экспортировать`,projectExported:`Проект экспортирован`,templateCreated:`Шаблон создан`}},system:{title:`Информация о системе`,version:`Версия`,uptime:`Время работы`,cpuUsage:`Загрузка процессора`,memoryUsage:`Использование памяти`,diskUsage:`Использование диска`,networkInfo:`Сетевая информация`,logs:`Журналы`,debugMode:`Режим отладки`,enableDebug:`Включить журналирование отладки`,disableDebug:`Отключить журналирование отладки`,downloadLogs:`Скачать журналы`,clearLogs:`Очистить журналы`,dockerInfo:`Информация о Docker`,containerName:`Имя контейнера`,imageName:`Имя образа`,platform:`Платформа`,architecture:`Архитектура`},sponsors:{sectionTitle:`Независимый проект на поддержке сообщества`,tagline:`Bambuddy бесплатен и остаётся таким благодаря добровольной поддержке пользователей. Без венчурного капитала и привязки к облаку.`,viewSupporters:`Посмотреть сторонников проекта`,toastPrints:`С Bambuddy выполнено печатей: {{count}}. Проект остаётся бесплатным благодаря поддержке сообщества.`,toastCost:`С помощью Bambuddy учтено филамента на сумму {{total}}. Посмотрите, кто помогает проекту оставаться независимым.`,toastArchives:`С Bambuddy архивировано печатей: {{count}}. Посмотрите, кто помогает проекту оставаться независимым.`,toastAnniversary:`Вы уже год с Bambuddy! Посмотрите, кто помогает проекту оставаться независимым.`,toastVersionUpdate:`Обновлено до версии {{version}}. Bambuddy остаётся бесплатным благодаря поддержке сообщества.`,toastBusiness:`Используете Bambuddy для {{count}} принтеров? Для команд доступен план поддержки с приоритетным исправлением ошибок, выставлением счетов и прямой связью с разработчиком.`,businessCta:`Bambuddy для бизнеса`,businessTitle:`Bambuddy для бизнеса`,businessTagline:`Вы используете {{count}} принтеров. Для команд и печатных ферм доступны приоритетная поддержка, коммерческая лицензия и выставление счетов.`},library:{title:`Библиотека филаментов`,addFilament:`Добавить филамент`,editFilament:`Изменить филамент`,deleteFilament:`Удалить филамент`,vendor:`Производитель`,material:`Материал`,color:`Цвет`,kFactor:`Коэффициент K`,temperature:`Температура`,noFilaments:`В библиотеке нет филаментов`,deleteConfirm:`Удалить этот филамент?`,importFromPrinter:`Импортировать с принтера`,exportToFile:`Экспортировать в файл`,runWithPipeline:{actionLabel:`Запустить через конвейер`,noPermission:`У вас нет прав на запуск конвейеров`,modalTitle:`Запуск через конвейер`,confirmTitle:`Подтверждение запуска`,confirmIntro:`Предварительная проверка обнаружила проблемы`,sourceHint:`Источник`,pipelineHint:`Конвейер`,targetHint:`Назначение`,pipelineListAria:`Доступные конвейеры`,runAnyway:`Всё равно запустить`,loading:`Загрузка…`,empty:`Сохранённых конвейеров пока нет. Откройте диалог нарезки и нажмите «Сохранить как конвейер».`,noTarget:`Целевой принтер не задан`,noTargetMessage:`Для этого конвейера не задан целевой принтер. Откройте его в настройках и выберите принтер.`,copies:`Копии`,copiesHint:`макс. {{n}}`,classTarget:`Любой {{model}}`,toast:{started:`Конвейер запущен`,failed:`Не удалось запустить конвейер`},issue:{printerNotSet:`Для этого конвейера не задан целевой принтер.`,printerNotFound:`Целевой принтер больше не существует.`,printerDisabled:`Целевой принтер отключён.`,printerOffline:`Целевой принтер не в сети.`,filamentType:`Слот филамента {{slot}}: ожидается {{expected}}, в AMS установлен {{actual}}`,filamentColor:`Слот филамента {{slot}}: цвет отличается (ожидается {{expected}}, в AMS установлен {{actual}})`,amsSlotMissing:`Слот AMS {{slot}} недоступен на этом принтере`,filamentUnverified:`Филамент в слоте {{slot}} выбран из облачного или стандартного профиля и не может быть проверен заранее.`,noClassMatches:`Ни один принтер в этой установке не соответствует целевому классу модели конвейера ({{expected}}).`,classNotSet:`В качестве цели конвейера выбран класс принтера, но модель не указана.`}}},slice:{title:`Нарезка модели`,action:`Нарезать`,actionAll:`Нарезать все пластины ({{count}})`,actionAllTitle:`Нарезать все пластины в один многостольный результат и сохранить в одном архиве. Выбор филаментов охватывает все слоты, используемые проектом.`,allPlatesToggle:`Нарезать все пластины ({{count}})`,slicing:`Нарезка…`,printer:`Профиль принтера`,process:`Профиль процесса`,filament:`Профиль филамента`,filamentSlot:`Филамент {{index}} ({{type}})`,selectPreset:`— Выберите профиль —`,loadingPresets:`Загрузка профилей…`,analyzingPlateFilaments:`Анализ филаментов пластины…`,analyzingPlateFilamentsHint:`Выполняется предварительная нарезка, чтобы определить, какие слоты AMS используются на этой пластине. Результат кэшируется, поэтому повторное открытие будет мгновенным.`,previewToast:`Анализ {{name}} — {{elapsed}}`,previewWithProgress:`Анализ {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}`,notUsedByPlate:`— не используется на этой пластине`,noPresetsForSlot:`Нет доступных профилей`,otherPrinters:`Другие принтеры`,presetsLoadFailed:`Не удалось загрузить профили. Сначала импортируйте их в разделе «Настройки → Профили».`,refreshPresets:`Обновить`,refreshPresetsTitle:`Обновить профили — получить свежие облачные и встроенные списки. Используйте после удаления профиля в Bambu Studio или Bambu Handy.`,allPresetsRequired:`Необходимо выбрать все профили`,useEmbedded:`Использовать встроенные настройки файла`,useEmbeddedHint:`Нарезать так, как задумал автор модели (стенки, заполнение, филамент), вместо профилей выше. Доступно, потому что ваш принтер совпадает с указанным в файле.`,enqueuing:`Отправка задания на нарезку…`,queued:`В очереди…`,failed:`Ошибка нарезки. Проверьте журналы вспомогательного сервиса слайсера.`,startedToast:`Фоновая нарезка {{name}}…`,queuedToast:`В очереди: {{name}} — {{elapsed}}`,runningToast:`Нарезка {{name}} — {{elapsed}}`,runningWithProgress:`{{name}} — {{stage}} ({{percent}}%) — {{elapsed}}`,runningWithProgressMultiPlate:`Пластина {{plateIndex}} из {{plateCount}} • {{name}} — {{stage}} ({{percent}}%) — {{elapsed}}`,completedToast:`Нарезка {{name}} завершена`,failedTitle:`Ошибка нарезки`,failedToast:`Не удалось нарезать {{name}}: {{detail}}`,tier:{local:`Импортированные`,cloud:`Bambu Cloud`,orcaCloud:`Orca Cloud`,standard:`Стандартные`},cloud:{notAuthenticated:`Войдите в Bambu Cloud («Настройки → Профили → Bambu Cloud»), чтобы увидеть облачные профили.`,expired:`Сессия Bambu Cloud истекла. Войдите снова, чтобы обновить облачные профили.`,unreachable:`Bambu Cloud сейчас недоступен. Локальные и стандартные профили продолжат работать.`},orcaCloud:{notAuthenticated:`Войдите в Orca Cloud («Профили → Orca Cloud»), чтобы увидеть профили Orca.`,expired:`Сессия Orca Cloud истекла. Войдите снова, чтобы обновить профили Orca.`,unreachable:`Orca Cloud сейчас недоступен. Остальные профили продолжат работать.`},bedType:{label:`Печатная пластина`,auto:`Авто (из профиля процесса)`,coolPlate:`Холодная пластина`,coolPlateSuperTack:`Холодная пластина SuperTack`,engineering:`Инженерная пластина`,highTemp:`Высокотемпературная пластина`,texturedPEI:`Текстурированная PEI-пластина`,smoothPEI:`Гладкая PEI-пластина`},pipelines:{label:`Конвейер`,applyAria:`Применить конвейер`,applyPrompt:`Применить конвейер…`,empty:`Нет сохранённых конвейеров`,saveButton:`Сохранить как конвейер`,saveTitle:`Сохранить текущий набор из четырёх профилей как повторно используемый конвейер`,namePlaceholder:`Название конвейера`,nameAria:`Название нового конвейера`,toast:{applied:`Применён конвейер «{{name}}»`,saved:`Конвейер сохранён`,saveFailed:`Не удалось сохранить`}}},spoolman:{title:`Интеграция со Spoolman`,enabled:`Spoolman включён`,url:`URL Spoolman`,connected:`Подключено`,disconnected:`Нет подключения`,testConnection:`Проверить подключение`,sync:`Синхронизировать`,syncing:`Синхронизация…`,lastSync:`Последняя синхронизация`,linkToSpoolman:`Связать со Spoolman`,openInSpoolman:`Открыть в Spoolman`,unlinkSpool:`Отвязать катушку`,unlinkConfirmTitle:`Снять назначение катушки?`,unlinkConfirmMessage:`Катушка будет удалена из этого слота. Данные самой катушки останутся без изменений.`,selectSpool:`Выбрать катушку`,noUnlinkedSpools:`Нет свободных катушек`,linkSuccess:`Катушка успешно назначена`,linkFailed:`Не удалось назначить катушку`,unlinkSuccess:`Назначение катушки снято`,unlinkFailed:`Не удалось снять назначение катушки`,linkedSpool:`Назначенная катушка`,spoolId:`ID катушки`,fillSourceLabel:`(Spoolman)`,weight:`Масса`,remaining:`Остаток`,disableWeightSync:`Отключить синхронизацию расчётной массы AMS`,disableWeightSyncDesc:`Не обновлять остаток по оценке AMS. Используйте это, если предпочитаете учёт расхода Spoolman процентной оценке AMS. Для новых катушек оценка AMS всё равно будет использована как начальная масса.`,reportPartialUsage:`Учитывать частичный расход при неудачной печати`,reportPartialUsageDesc:`Если печать завершилась ошибкой или была отменена, учитывать примерный расход филамента до этого момента по прогрессу слоёв.`},locations:{title:`Места хранения`,subtitle:`Управление полками, ящиками и другими физическими местами хранения катушек`,add:`Добавить место`,addShort:`Добавить`,edit:`Изменить место`,name:`Название`,spools:`Катушки`,empty:`Мест хранения пока нет. Создайте первую полку или ящик.`,manage:`Места хранения`,createPlaceholder:`например, Полка A или Ящик 1`,nameRequired:`Укажите название места хранения`,created:`Место хранения создано`,updated:`Место хранения обновлено`,deleted:`Место хранения удалено`,saveFailed:`Не удалось сохранить место хранения`,deleteFailed:`Не удалось удалить место хранения`,deleteBlocked:`Перед удалением переместите из этого места все катушки`,confirmDelete:`Удалить «{{name}}»?`,confirmDeleteMessage:`Это место будет удалено из каталога. Сначала необходимо переместить все катушки.`},inventory:{title:`Учёт катушек`,subtitle:`Управление катушками`,addToInventory:`Добавить в учёт`,addToInventoryPending:`Добавление…`,addToInventorySuccess:`Катушка добавлена в учёт`,addToInventoryFailed:`Не удалось добавить катушку в учёт`,unknownSpoolTitle:`Обнаружен новый филамент`,unknownSpoolMessage:`В {{location}} обнаружена катушка с неизвестной RFID-меткой. Добавить её в учёт?`,unknownSpoolSlot:`Слот`,bulk:{selectAllVisible:`Выбрать все видимые`,selectRow:`Выбрать строку`,selectGroup:`Выбрать группу`,selectionCount:`Выбрано: {{count}}`,edit:`Изменить`,printLabels:`Печать этикеток`,resetUsage:`Сбросить расход`,restore:`Восстановить`,archive:`Архивировать`,delete:`Удалить`,clearSelection:`Снять выделение`,editTitle:`Массовое изменение катушек`,editSubtitle:`Изменения применятся к {{count}} выбранным катушкам. Обновятся только отмеченные поля.`,editHint:`Введите значение в поле, чтобы включить его обновление. Будут отправлены только отмеченные строки. Пустое поле не изменяет катушки; очистить значение можно только при редактировании отдельной катушки.`,useCustom:`Использовать «{{value}}»`,toggleField:`Включить или отключить обновление этого поля`,changeCount:`Будет обновлено полей: {{count}}.`,applyPending:`Применение…`,applyButton:`Применить к {{count}} катушкам`,deleteTitle:`Удалить выбранные катушки`,archiveTitle:`Архивировать выбранные катушки`,restoreTitle:`Восстановить выбранные катушки`,resetUsageTitle:`Сбросить расход выбранных катушек`,deleteMessage:`Безвозвратно удалить {{count}} катушек? Это действие нельзя отменить.`,archiveMessage:`Архивировать {{count}} катушек? Позже их можно будет восстановить.`,restoreMessage:`Восстановить {{count}} архивных катушек?`,resetUsageMessage:`Сбросить счётчик «Израсходовано всего» у {{count}} катушек? Текущий остаток массы сохранится.`,updateSuccess:`Обновлено катушек: {{count}}`,updateFailed:`Ошибка массового обновления`,updatePartial:`Обновлено: {{ok}}, с ошибкой: {{failed}}`,updateAllFailed:`Не удалось обновить все {{count}} катушек. Выделение сохранено для повторной попытки.`,deleteSuccess:`Удалено катушек: {{count}}`,deleteFailed:`Ошибка массового удаления`,deletePartial:`Удалено: {{ok}}, с ошибкой: {{failed}}`,deleteAllFailed:`Не удалось удалить все {{count}} катушек. Выделение сохранено для повторной попытки.`,archiveSuccess:`Архивировано катушек: {{count}}`,archiveFailed:`Ошибка массового архивирования`,archivePartial:`Архивировано: {{ok}}, с ошибкой: {{failed}}`,archiveAllFailed:`Не удалось архивировать все {{count}} катушек. Выделение сохранено для повторной попытки.`,restoreSuccess:`Восстановлено катушек: {{count}}`,restoreFailed:`Ошибка массового восстановления`,restorePartial:`Восстановлено: {{ok}}, с ошибкой: {{failed}}`,restoreAllFailed:`Не удалось восстановить все {{count}} катушек. Выделение сохранено для повторной попытки.`,invalidHex:`Введите 6 шестнадцатеричных символов (RRGGBB) или 8 (RRGGBBAA), иначе поле не будет применено.`},spoolmanMixedContentTitle:`Spoolman не загружается через HTTPS: браузер заблокировал смешанное содержимое`,spoolmanMixedContentBody:`Bambuddy открыт через HTTPS (через обратный прокси), а URL Spoolman всё ещё использует обычный HTTP. Браузер блокирует такое смешанное содержимое, поэтому встроенный интерфейс Spoolman не отображается. Для работы Spoolman должен быть доступен по HTTPS.`,spoolmanMixedContentFixReverseProxy:`Разместите Spoolman за тем же обратным прокси, что и Bambuddy (Traefik / Nginx / Caddy), включите HTTPS и укажите новый HTTPS-адрес Spoolman в настройках.`,spoolmanMixedContentFixOpenNewTab:`В качестве обходного решения откройте Spoolman по HTTP в новой вкладке. Ограничение смешанного содержимого действует только для встроенных фреймов.`,spoolmanOpenInNewTab:`Открыть Spoolman в новой вкладке`,labels:{title:`Печать этикеток катушек`,selectedCount:`Выбрано: {{count}}`,pickSpools:`Выберите катушки для печати этикеток:`,monochrome:`Монохромный режим (чёрно-белый принтер)`,monochromeHint:`Убирает образец цвета и расширяет область текста`,searchPlaceholder:`Поиск по названию, бренду или #ID`,filterByMaterial:`Материал:`,allMaterials:`Все`,selectVisible:`Выбрать все видимые ({{count}})`,deselectVisible:`Снять выделение с видимых`,clearAll:`Очистить выбор`,noSpoolsToShow:`Нет катушек для отображения. Измените фильтр и повторите попытку.`,noMatches:`Нет катушек, соответствующих поиску или фильтру.`,printOne:`Напечатать этикетку этой катушки`,printLabels:`Печать этикеток…`,bulkTitle:`Выберите катушки для печати этикеток из {{count}} отображаемых`,noSpoolsTitle:`Нет катушек для печати этикеток`,error:`Не удалось создать этикетки: {{msg}}`,sortBy:{label:`Сортировка:`,id:`По ID`,color:`По цвету`},templates:{amsHolderSmall:{label:`Держатель AMS — малый (74 × 33 мм)`,hint:`Одна этикетка на страницу; соответствует печатной этикетке для модели MakerWorld 752566 (AMS Filament Label Holder).`},amsHolderLarge:{label:`Держатель AMS — большой (75 × 55 мм)`,hint:`Одна этикетка на страницу; подходит для варианта держателя AMS с картонной вставкой. Достаточно места для образца цвета, бренда, материала, ID и QR-кода.`},box40x30:{label:`Этикетка для коробки (40 × 30 мм)`,hint:`Одна этикетка на страницу; распространённый размер рулона DK/Brother, подходит для пакетов с филаментом и контейнеров хранения.`},box:{label:`Этикетка для коробки (62 × 29 мм)`,hint:`Одна этикетка на страницу; размер для малых этикеток Brother PT/QL и Dymo.`},averyL7160:{label:`Avery L7160 — лист A4 (38,1 × 63,5 мм × 21)`,hint:`Европейский формат: 21 этикетка на листе A4.`},avery5160:{label:`Avery 5160 — лист US Letter (25,4 × 66,7 мм × 30)`,hint:`Американский формат: 30 этикеток на листе Letter.`}}},csv:{importButton:`Импорт CSV`,exportButton:`Экспорт CSV`,modalTitle:`Импорт катушек из CSV`,selectFile:`Выберите CSV-файл или перетащите его сюда`,dragHint:`Заголовок: material (обязательно), brand, subtype, color_name, rgba, …`,parsing:`Чтение файла…`,previewError:`Не удалось прочитать CSV-файл`,validCount:`Корректных: {{count}}`,errorCount:`Ошибок: {{count}}`,skippedCount:`Пропущено: {{count}}`,colRow:`Строка`,colStatus:`Состояние`,colColor:`Цвет`,colorResolved:`Цвет подставлен из каталога`,colorCrossMaterial:`Цвет взят у другого материала: точного совпадения в каталоге нет`,duplicateExisting:`Катушка с таким материалом, брендом и цветом уже существует, но запись всё равно будет импортирована как новая катушка`,spoolmanHint:`В режиме Spoolman используйте встроенный импорт и экспорт CSV в Spoolman.`,importValidRows:`Импортировать {{count}} корректных строк`,noValidRows:`Нет корректных строк`,importing:`Импорт…`,importSuccess:`Импортировано катушек: {{count}}`,importError:`Ошибка импорта`,exportError:`Ошибка экспорта`},addSpool:`Добавить катушку`,editSpool:`Изменить катушку`,copySpool:`Копировать катушку`,material:`Материал`,selectMaterial:`Выберите материал…`,subtype:`Подтип`,brand:`Бренд`,searchBrand:`Поиск бренда…`,useCustomBrand:`Использовать «{{brand}}»`,useCustomMaterial:`Использовать свой материал: {{material}}`,colorName:`Название цвета`,colorNamePlaceholder:`Jade White, Fire Red…`,color:`Цвет`,hexColor:`Цвет HEX`,pickColor:`Выбрать свой цвет`,labelWeight:`Номинальная масса`,coreWeight:`Масса пустой катушки`,searchSpoolWeight:`Поиск массы катушки…`,weightUsed:`Израсходовано`,currentWeight:`Остаток массы`,measuredWeight:`Измеренная масса`,spoolName:`Катушка`,costPerKg:`Стоимость за кг`,storageLocation:`Место хранения`,storageLocationPlaceholder:`например, Полка A, Ящик 1`,openInInventory:`Открыть в учёте`,measuredWeightError:`Измеренная масса должна быть от {{min}} до {{max}} г.`,slicerFilament:`Филамент слайсера`,slicerFilamentName:`Название пресета слайсера`,slicerPreset:`Пресет слайсера`,searchPresets:`Поиск пресетов филамента…`,selectedPreset:`Выбрано`,noPresetsFound:`Пресеты не найдены`,tempOverrides:`Переопределение температур`,note:`Примечание`,notePlaceholder:`Дополнительные сведения об этой катушке…`,category:`Категория`,categoryPlaceholder:`например, Производство, Прототип, Клиент A`,categoryNone:`Без категории`,storageLocationNone:`Место не указано`,lowStockThresholdOverride:`Порог малого остатка (эта катушка)`,lowStockThresholdOverrideHelp:`Оставьте пустым, чтобы использовать общий порог ({{global}}%).`,clearRfid:`Очистить RFID-метку`,rfidCleared:`RFID-метка очищена`,archive:`Архивировать`,restore:`Восстановить`,noSpools:`Катушек пока нет. Добавьте первую катушку.`,noAvailableSpools:`Нет доступных катушек. Добавьте катушку в учёт или сначала освободите её в другом слоте.`,kProfiles:`K-профили`,addKProfile:`Добавить K-профиль`,assignSpool:`Назначить катушку`,unassignSpool:`Снять назначение`,assignSuccess:`Катушка назначена, слот AMS настроен`,assignPendingInsert:`Катушка назначена. Слот будет настроен после её установки.`,assignFailed:`Не удалось назначить катушку`,selectSpool:`Выберите катушку для назначения этому слоту`,assigned:`Назначено`,assigning:`Назначение…`,searchSpools:`Поиск катушек…`,showAllSpools:`Показать все катушки`,spoolmanSpools:`Катушки Spoolman`,allMaterials:`Все материалы`,filterByBrand:`Фильтр по бренду…`,showArchived:`Показывать архивные`,quickAdd:`Быстрое добавление`,quantity:`Количество`,stock:`На складе`,configured:`Настроено`,spoolsCreated:`Создано катушек: {{count}}`,spoolsPartiallyCreated:`Создано {{created}} из {{total}} катушек; часть операций завершилась ошибкой`,spoolCreated:`Катушка создана`,spoolUpdated:`Катушка обновлена`,spoolDeleted:`Катушка удалена`,deepLinkSpoolNotFound:`Катушка не найдена`,deepLinkFetchFailed:`Не удалось загрузить катушку. Повторите попытку.`,spoolArchived:`Катушка архивирована`,spoolRestored:`Катушка восстановлена`,kProfileSaveFailed:`Не удалось сохранить настройки K-профиля`,syncWeightSpoolNotFound:`Катушка не найдена: возможно, она была удалена`,syncWeightSpoolmanUnreachable:`Spoolman недоступен. Повторите попытку позже.`,syncWeightFailed:`Не удалось синхронизировать массу`,spoolmanUnreachable:`Spoolman недоступен. Повторите попытку позже.`,deleteSpoolNotFound:`Катушка не найдена: возможно, она уже удалена`,deleteFailed:`Не удалось удалить катушку`,archiveSpoolNotFound:`Катушка не найдена: возможно, она уже удалена`,archiveFailed:`Не удалось архивировать катушку`,restoreSpoolNotFound:`Катушка не найдена: возможно, она уже удалена`,restoreFailed:`Не удалось восстановить катушку`,saveFailed:`Не удалось сохранить изменения`,tagClearFailed:`Не удалось очистить метку`,deleteConfirm:`Удалить эту катушку без возможности восстановления?`,archiveConfirm:`Архивировать эту катушку?`,advancedSettings:`Расширенные настройки`,filamentInfoTab:`Сведения о филаменте`,paProfileTab:`Профиль PA`,filamentInfo:`Филамент`,additional:`Дополнительно`,loadingPresets:`Загрузка облачных пресетов…`,cloudConnected:`Облако подключено`,cloudNotConnected:`Облако не подключено; используются значения по умолчанию`,recentColors:`Недавние`,searchColors:`Поиск цветов…`,searchResults:`Результаты поиска`,allColors:`Все цвета`,commonColors:`Основные цвета`,showLess:`Показать меньше`,showAll:`Показать все`,noColorsFound:`Нет цветов, соответствующих запросу`,noResults:`Совпадений не найдено`,extraColorsLabel:`Дополнительные цвета`,extraColorsPlaceholder:`EC984C,#6CD4BC,A66EB9,D87694`,extraColorsHint:`Вставьте от 2 до 8 HEX-цветов через запятую. Они будут отображены как градиент.`,extraColorsInvalid:`Пропущены некорректные HEX-значения: {{tokens}}`,colorEffectLabel:`Эффект`,colorEffect:{none:`Нет`,sparkle:`Блёстки`,wood:`Дерево`,marble:`Мрамор`,glow:`Свечение`,matte:`Матовый`,silk:`Шёлк`,galaxy:`Галактика`,rainbow:`Радуга`,metal:`Металл`,translucent:`Полупрозрачный`,gradient:`Градиент`,dualColor:`Двухцветный`,triColor:`Трёхцветный`,multicolor:`Многоцветный`},selectMaterialFirst:`Сначала выберите материал на вкладке «Сведения о филаменте».`,noPrintersConfigured:`Принтеры не настроены. Добавьте принтеры, чтобы использовать профили PA.`,matchingFilter:`Совпадающие`,anyBrand:`Любой бренд`,anyVariant:`Любой вариант`,autoSelect:`Автовыбор`,matches:`совпадений`,match:`совпадение`,noMatches:`Нет совпадений`,connected:`Подключён`,offline:`Не в сети`,printerOffline:`Принтер не в сети. Подключите его для просмотра калибровочных профилей.`,noKProfilesMatch:`Нет K-профилей, соответствующих выбранному филаменту.`,leftNozzle:`Левое сопло`,rightNozzle:`Правое сопло`,profilesSelected:`выбрано калибровочных профилей`,totalInventory:`Всего в учёте`,totalConsumed:`Израсходовано всего`,byMaterial:`По материалам`,inPrinter:`В принтерах`,lowStock:`Малый остаток`,sinceTracking:`С начала учёта`,resetConsumedCounter:`Сбросить счётчик`,resetConsumedCounterTooltip:`Обнулить счётчик израсходованных граммов для этой катушки. Остаток массы не изменится.`,resetConsumedCounterConfirm:`Сбросить счётчик расхода этой катушки до 0? Последующие печати будут учитываться заново. Сама катушка, расчёт остатка и настройки не изменятся.`,resetAllConsumedCounters:`Сбросить все счётчики`,resetAllConsumedCountersTooltip:`Обнулить счётчик израсходованных граммов у всех катушек. Остатки массы не изменятся.`,resetAllConsumedCountersConfirm:`Сбросить счётчик расхода до 0 у всех {{count}} катушек, включая архивные? Показатель «Израсходовано всего» будет очищен, а будущие печати начнут учитываться с нуля. Катушки и их остатки не изменятся.`,consumedCounterReset:`Счётчик сброшен`,allConsumedCountersReset:`Счётчик сброшен у {{count}} катушек`,resetConsumedCounterFailed:`Не удалось сбросить счётчик`,loadedInAms:`Загружено в AMS/внешний слот`,remaining:`Остаток`,weightCheck:`Проверка массы`,lastWeighed:`Последнее взвешивание`,neverWeighed:`Не взвешивалась`,search:`Поиск катушек…`,showing:`Показано`,to:`–`,of:`из`,show:`Показывать`,spools:`катушек`,spool:`катушка`,page:`Страница`,noSpoolsMatch:`Ничего не найдено`,noSpoolsMatchDesc:`Измените поисковый запрос или фильтры.`,active:`Активные`,archived:`Архивные`,all:`Все`,used:`Израсходовано`,new:`Новые`,clearFilters:`Сбросить фильтры`,table:`Таблица`,cards:`Карточки`,net:`Нетто`,groupSimilar:`Группировать`,groupedSpools:`Одинаковых катушек: {{count}}`,groupedRows:`строк`,columns:`Столбцы`,configureColumns:`Настроить столбцы`,configureColumnsDesc:`Перетаскивайте столбцы или используйте стрелки для изменения порядка. Видимость переключается значком глаза.`,visible:`видимых`,reset:`Сбросить`,cancel:`Отмена`,applyChanges:`Применить изменения`,moveUp:`Переместить вверх`,moveDown:`Переместить вниз`,hideColumn:`Скрыть столбец`,showColumn:`Показать столбец`,linkToSpool:`Связать с катушкой`,tagLinked:`Метка связана с катушкой`,tagLinkFailed:`Не удалось связать метку`,tagAlreadyLinked:`Метка уже связана с другой катушкой`,unknownTag:`Обнаружена неизвестная RFID-метка`,usageHistory:`История расхода`,noUsageHistory:`Расход пока не зарегистрирован`,printName:`Название печати`,weightConsumed:`Израсходованная масса`,clearHistory:`Очистить`,historyCleared:`История расхода очищена`,fillSourceLabel:`(Учёт)`,lowStockThresholdError:`Порог должен быть от 0,1 до 99,9`,assignMismatchTitle:`Несоответствие материала`,assignMismatchMessage:`Материал выбранной катушки «{{spoolMaterial}}» не соответствует материалу слота «{{trayMaterial}}» в {{location}}. Всё равно назначить?`,assignMismatchConfirm:`Всё равно назначить`,assignPartialMismatchMessage:`Материал катушки «{{spoolMaterial}}» похож, но не совпадает точно с «{{trayMaterial}}» в {{location}}. Продолжить?`,assignProfileMismatchMessage:`Профиль катушки «{{spoolProfile}}» не соответствует профилю слота «{{trayProfile}}» в {{location}}. Продолжить?`,assignReconfigureNote:`Слот AMS будет перенастроен на профиль катушки.`,spoolmanFilamentCatalog:`Каталог филаментов Spoolman`,pickFromSpoolmanCatalog:`Выбрать из каталога Spoolman…`,spoolmanFilamentSelected:`Филамент выбран из каталога Spoolman`,spoolmanFilamentUnlinked:`Связь с каталогом филаментов удалена`,noSpoolmanFilaments:`В каталоге Spoolman филаменты не найдены`,spoolmanFilamentColorSwatch:`Цвет филамента`,spoolWeightManagedBySpoolman:`Масса пустой катушки задаётся в Spoolman для каждого типа филамента`,spoolmanCatalogLoadFailed:`Не удалось загрузить каталог филаментов Spoolman`},timelapse:{title:`Таймлапс`,create:`Создать таймлапс`,download:`Скачать`,delete:`Удалить`,preview:`Предпросмотр`,frameRate:`Частота кадров`,quality:`Качество`,processing:`Обработка...`,noTimelapses:`Таймлапсы отсутствуют`},ams:{title:`AMS`,slot:`Слот`,empty:`Пусто`,emptySlot:`Пустой слот`,slotEmpty:`Пусто`,slotUnconfigured:`?`,emptySlotReset:`Филамент не назначен`,unknown:`Неизвестно`,humidity:`Влажность`,temperature:`Температура`,filamentType:`Тип филамента`,filamentColor:`Цвет`,remaining:`Остаток`,history:`История AMS`,noHistory:`История отсутствует`,configureSlot:`Настроить слот`,externalSpool:`Внешняя катушка`,profile:`Профиль`,kFactor:`Коэффициент K`,fill:`Заполнить`,configure:`Настроить`,used:`использовано`,remainingUnit:`осталось`},printModal:{selectPrinter:`Выберите принтер`,selectPlate:`Выберите пластину`,filamentMapping:`Сопоставление филаментов`,plateN:`Пластина {{n}}`,plateFilamentsUnreadable:`Не удалось определить филаменты выбранной пластины, поэтому их невозможно сопоставить. Снимите выбор с этой пластины, чтобы добавить остальные в очередь.`,totalCost:`Общая стоимость:`,slotRemainingShort:` — осталось {{grams}} г`,printSettings:`Настройки печати`,bedLeveling:`Калибровка стола`,flowCalibration:`Калибровка потока`,vibrationCalibration:`Калибровка вибраций`,layerInspection:`Проверка первого слоя`,timelapse:`Таймлапс`,cancel:`Отмена`,noPrintersAvailable:`Нет доступных принтеров`,printerBusy:`Принтер занят`,printerOffline:`Принтер не в сети`,sameTypeDifferentColor:`Тот же тип, другой цвет`,filamentTypeNotLoaded:`Филамент этого типа не загружен`,whenToPrint:`Когда печатать`,asap:`Как можно скорее`,queue:`В очередь`,schedule:`По расписанию`,dateTime:`Дата и время`,invalidDateTime:`Введите корректные дату и время`,openCalendar:`Открыть календарь`,requireManualStart:`Требовать ручного запуска`,requirePreviousSuccess:`Запускать только после успешной предыдущей печати`,autoOffAfter:`Выключить принтер после завершения`,helpAsap:`Задание будет добавлено в начало очереди и запустится, как только подходящий принтер освободится.`,helpSchedule:`Задание запустится в указанное время, если принтер свободен. Если принтер занят, оно будет ждать освобождения.`,helpQueue:`Задание будет добавлено в конец очереди.`,leftNozzle:`Л`,rightNozzle:`П`,leftNozzleTooltip:`Левое сопло`,rightNozzleTooltip:`Правое сопло`,filamentOverride:`Переопределение филаментов`,filamentOverrideHint:`При необходимости замените филаменты для назначения по модели. Планировщик будет сопоставлять выбранные филаменты вместо исходных значений из 3MF.`,originalFilament:`Исходный`,overrideWith:`Заменить на`,resetToOriginal:`Вернуть исходный`,insufficientFilamentTitle:`Недостаточно филамента`,waitingForAmsStatus:`Ожидание состояния AMS от принтера {{printer}}…`,insufficientFilamentMessage:`На некоторых назначенных катушках осталось меньше филамента, чем требуется для этой печати:`,insufficientFilamentLine:`{{printer}} — {{slot}}: требуется {{required}} г, осталось {{remaining}} г`,printAnyway:`Всё равно печатать`,forceColorMatch:`Обязательно учитывать цвет`,staggerPrinterStarts:`Запускать принтеры с задержкой`,staggerGroupSize:`Размер группы`,staggerInterval:`Интервал (мин)`,staggerPreview:`{{printers}} принтеров → {{groups}} групп по {{size}}, запуск каждые {{interval}} мин`,staggerLastGroup:`последняя группа: {{count}}`,staggerTotal:`всего: {{minutes}} мин`,staggerToPrinters:`Распределить запуск для {{count}} принтеров`,gcodeInjection:`Добавить G-code автозапуска`},backup:{includesEncryptionKey:`Локальные резервные копии включают файл ключа шифрования MFA (DATA_DIR/.mfa_encryption_key), поэтому ZIP-архив является самодостаточным. Считайте этот ZIP конфиденциальным: любой, у кого есть файл, сможет расшифровать сохранённые в нём секреты клиента OIDC и TOTP.`,title:`Резервное копирование и восстановление`,createBackup:`Создать резервную копию`,restoreBackup:`Восстановить из копии`,restoreDescription:`Заменить все данные данными из резервной копии`,downloadBackup:`Скачать резервную копию`,uploadBackup:`Загрузить резервную копию`,lastBackup:`Последняя копия`,autoBackup:`Автоматическое резервное копирование`,backupNow:`Создать копию сейчас`,restoreWarning:`Внимание: восстановление из резервной копии перезапишет все текущие данные.`,includeArchives:`Включить архивы`,includeSettings:`Включить настройки`,includeProfiles:`Включить профили`,backupSuccess:`Резервная копия успешно создана`,restoreSuccess:`Резервная копия успешно восстановлена`,backupFailed:`Не удалось создать резервную копию`,restoreFailed:`Не удалось выполнить восстановление`,restoreNote:`На время восстановления виртуальный принтер будет остановлен`,githubBackup:`Резервная копия в Git`,enabled:`Включено`,cloudLoginRequired:`Требуется вход в Bambu Cloud. Войдите в разделе «Профили → Облачные профили», чтобы включить резервное копирование в GitHub.`,cloudLoginRequiredShort:`Требуется вход в облако`,githubDescription:`Автоматически синхронизировать профили с приватным репозиторием GitHub для резервного копирования и хранения истории версий.`,repoIsPrivate:`Репозиторий приватный — резервное копирование безопасно.`,repoIsPublicWarning:`Репозиторий ПУБЛИЧНЫЙ. Резервные копии Bambuddy содержат учётные данные MQTT, токены Home Assistant и Prometheus, адрес электронной почты Bambu Cloud и коды доступа к принтерам из K-профилей. Сохранение заблокировано, пока репозиторий не будет сделан приватным в настройках провайдера.`,repoVisibilityUnknown:`Не удалось определить видимость репозитория. Bambuddy отказывается создавать резервные копии в репозитории, приватность которого не подтверждена; сохранение будет заблокировано.`,repositoryUrl:`URL репозитория`,repoUrlPlaceholderGitHub:`https://github.com/username/repo-name`,repoUrlPlaceholderGitea:`https://gitea.example.com/username/repo-name`,repoUrlPlaceholderForgejo:`https://forgejo.example.com/username/repo-name`,repoUrlPlaceholderGitLab:`https://gitlab.com/username/repo-name`,allowInsecureHttp:`Разрешить небезопасный HTTP`,allowInsecureHttpHint:`Включайте для локальных серверов в частной сети без TLS`,personalAccessToken:`Персональный токен доступа`,tokenSaved:`(сохранён)`,enterNewToken:`Введите новый токен для обновления`,tokenHint:`Токен с точечными правами на чтение и запись содержимого`,branch:`Ветка`,provider:`Git-провайдер`,providerGitHub:`GitHub`,providerGitLab:`GitLab`,providerGitea:`Gitea`,providerForgejo:`Forgejo`,manualOnly:`Только вручную`,hourly:`Ежечасно`,daily:`Ежедневно`,weekly:`Еженедельно`,includeInBackup:`Включить в резервную копию`,kProfiles:`K-профили`,kProfilesDescription:`Калибровки Pressure Advance с подключённых принтеров`,noPrintersConnected:`Нет подключённых принтеров`,printersConnected:`Подключено {{connected}} из {{total}}`,cloudProfiles:`Облачные профили`,cloudProfilesDescription:`Предустановки филамента, принтера и процесса из Bambu Cloud`,appSettings:`Настройки приложения`,appSettingsDescription:`Конфигурация Bambuddy (полная база данных)`,spoolInventory:`Учёт катушек`,spoolInventoryDescription:`Катушки филамента, история расхода и учёт стоимости`,printArchives:`Архив печати`,printArchivesDescription:`Метаданные истории печати без файлов G-code и 3MF`,lastBackupAt:`Последняя копия:`,noBackupsYet:`Резервных копий пока нет`,next:`Следующая:`,startingBackup:`Запуск резервного копирования...`,test:`Проверить`,enableBackup:`Включить резервное копирование`,testConnection:`Проверить соединение`,enterRepoUrl:`Введите URL репозитория`,enterRepoAndToken:`Введите URL репозитория и токен доступа`,repoRequired:`Необходимо указать URL репозитория`,tokenRequired:`Необходимо указать токен доступа`,githubBackupEnabled:`Резервное копирование в GitHub включено`,tokenUpdated:`Токен обновлён`,settingsSaved:`Настройки сохранены`,failedToSave:`Не удалось сохранить: {{message}}`,backupCompleteFiles:`Резервное копирование завершено — обновлено файлов: {{count}}`,backupSkippedNoChanges:`Резервное копирование пропущено — изменений нет`,backupFailed2:`Ошибка резервного копирования: {{message}}`,clearedLogs:`Очищено записей журнала: {{count}}`,failedToClearLogs:`Не удалось очистить журнал: {{message}}`,history:`История`,clear:`Очистить`,date:`Дата`,status:`Статус`,commit:`Коммит`,localBackup:`Локальная резервная копия`,localBackupDescription:`Создать полную резервную копию данных Bambuddy, включая базу данных, архивы, загрузки и все файлы.`,downloadBackupLabel:`Скачать резервную копию`,completeBackupZip:`Полная копия: база данных и все файлы (ZIP)`,download:`Скачать`,preparingBackup:`Подготовка резервной копии...`,creatingArchive:`Создание архива резервной копии... Для больших архивов это может занять некоторое время.`,downloadingFile:`Скачивание файла резервной копии...`,backupDownloaded:`Резервная копия успешно скачана`,failedToCreateBackup:`Не удалось создать резервную копию: {{message}}`,restore:`Восстановить`,restoreReplacesAll:`Восстановление заменит все данные.`,restoreReplacesAllDetail:`Текущая база данных и файлы будут полностью заменены. После восстановления потребуется перезапуск.`,restoreConfirmTitle:`Восстановление из резервной копии`,restoreConfirmMessage:`Восстановить данные из файла «{{filename}}»? Текущая база данных и все файлы будут полностью заменены. После восстановления приложение потребуется перезапустить.`,restoreConfirmButton:`Восстановить`,uploadingFile:`Загрузка файла резервной копии...`,backupRestoredRestart:`Резервная копия восстановлена. Перезапустите Bambuddy.`,failedToRestore:`Не удалось восстановить резервную копию. Проверьте формат файла.`,reloadNow:`Перезагрузить сейчас`,creatingBackup:`Создание резервной копии`,restoringBackup:`Восстановление данных`,preparing:`Подготовка...`,processing:`Обработка...`,doNotClosePage:`Не закрывайте эту страницу и не переходите на другую. Для больших резервных копий операция может занять несколько минут.`,restoring:`Восстановление...`,restoreComplete:`Восстановление завершено`,restoreFailed2:`Ошибка восстановления`,importSettings:`Импортировать настройки из файла резервной копии`,pleaseWaitRestoring:`Подождите, пока данные восстанавливаются`,selectBackupFile:`Нажмите, чтобы выбрать файл резервной копии (.json или .zip)`,duplicateHandling:`Правила обработки дубликатов:`,matchPrinters:`Принтеры`,matchPrintersBy:`сопоставляются по серийному номеру`,matchSmartPlugs:`Умные розетки`,matchSmartPlugsBy:`сопоставляются по IP-адресу`,matchNotificationProviders:`Провайдеры уведомлений`,matchNotificationProvidersBy:`сопоставляются по имени`,matchFilaments:`Филаменты`,matchFilamentsBy:`сопоставляются по имени, типу и бренду`,matchArchives:`Архивы`,matchArchivesBy:`сопоставляются по хешу содержимого и всегда пропускаются`,matchPendingUploads:`Ожидающие загрузки`,matchPendingUploadsBy:`сопоставляются по имени файла`,matchSettingsTemplates:`Настройки и шаблоны`,matchSettingsTemplatesBy:`всегда перезаписываются`,replaceExisting:`Заменять существующие данные`,keepExisting:`Сохранять существующие данные`,overwriteDescription:`Перезаписывать существующие элементы данными из резервной копии`,keepDescription:`Восстанавливать только отсутствующие элементы`,overwriteCaution:`Внимание:`,overwriteWarning:`Перезапись заменит текущие настройки данными из резервной копии. В целях безопасности коды доступа к принтерам никогда не перезаписываются.`,cancel:`Отмена`,processingBackup:`Обработка файла резервной копии...`,itemsRestored:`Восстановлено элементов`,itemsSkipped:`Пропущено элементов`,restored:`Восстановлено`,skippedAlreadyExist:`Пропущено — уже существует`,filesCategory:`Файлы (3MF, миниатюры и т. п.)`,andMore:`...и ещё {{count}}`,newApiKeysGenerated:`Созданы новые API-ключи`,keysShownOnce:`Эти ключи показываются только один раз. Скопируйте их сейчас!`,copy:`Копировать`,noDataFound:`В резервной копии не найдено данных для восстановления.`,close:`Закрыть`,scheduledBackup:`Резервные копии по расписанию`,scheduledBackupDescription:`Автоматически создавать снимки резервных копий по расписанию. Каталог назначения можно смонтировать с NAS или внешнего накопителя.`,frequency:`Периодичность`,backupTime:`Время`,retention:`Хранение`,retentionDescription:`Количество сохраняемых резервных копий`,outputPath:`Каталог назначения`,outputPathPlaceholder:`По умолчанию: {{path}}`,outputPathDescription:`Оставьте пустым, чтобы использовать стандартный каталог`,runNow:`Запустить сейчас`,backupFiles:`Файлы резервных копий`,noScheduledBackups:`Резервных копий пока нет`,deleteBackup:`Удалить`,deleteBackupConfirm:`Удалить этот файл резервной копии?`,backupRunning:`Выполняется резервное копирование...`,scheduledBackupComplete:`Резервная копия успешно создана`,scheduledBackupFailed:`Ошибка резервного копирования`,nextBackup:`Следующая копия`,backupSize:`Размер`,localTimeHint:`Местное время ({{tz}})`,defaultPathLabel:`По умолчанию:`,pathCheck:{title:`Bambuddy не может записывать в этот каталог`,howToFix:`Как исправить:`,sandboxed:`Служба Bambuddy не может записывать в {{path}}. Её модуль systemd работает с ProtectSystem=strict, поэтому все каталоги за пределами каталогов установки, данных и журналов доступны службе только для чтения, даже если из вашей командной оболочки запись разрешена.`,read_only:`{{path}} находится в файловой системе, доступной только для чтения.`,permission_denied:`Bambuddy не разрешена запись в {{path}}. Проверьте владельца каталога и права доступа.`,no_space:`В файловой системе, содержащей {{path}}, закончилось свободное место.`,not_a_directory:`{{path}} существует, но не является каталогом.`,missing:`{{path}} не существует, и создать этот каталог не удалось.`,error:`Bambuddy не может записывать в {{path}}.`,ephemeralTitle:`Эти резервные копии не сохранятся после перезапуска контейнера`,container_ephemeral:`{{path}} находится внутри контейнера Bambuddy, а не на хосте. Записанные туда резервные копии будут потеряны при пересоздании контейнера. Подключите каталог с хоста:`},categories:{settings:`Настройки`,notification_providers:`Провайдеры уведомлений`,notification_templates:`Шаблоны уведомлений`,smart_plugs:`Умные розетки`,printers:`Принтеры`,filaments:`Филаменты`,maintenance_types:`Виды обслуживания`,archives:`Архивы`,projects:`Проекты`,pending_uploads:`Ожидающие загрузки`,external_links:`Внешние ссылки`,api_keys:`API-ключи`}},tags:{title:`Метки`,addTag:`Добавить метку`,editTag:`Изменить метку`,deleteTag:`Удалить метку`,tagName:`Название метки`,tagColor:`Цвет метки`,noTags:`Меток нет`,deleteConfirm:`Удалить эту метку?`,manageTags:`Управление метками`},uploadModal:{title:`Загрузка файлов 3MF`,dragDrop:`Перетащите файлы .3mf сюда`,or:`или`,browseFiles:`Выбрать файлы`,extractionInfo:`Модель принтера будет автоматически определена по метаданным файла 3MF.`,uploaded:`загружено`,failed:`ошибок`,uploading:`Загрузка...`,upload:`Загрузить`,uploadFailed:`Не удалось загрузить`},editArchive:{title:`Редактирование архива`,name:`Название`,namePlaceholder:`Название печати`,printer:`Принтер`,noPrinter:`Без принтера`,project:`Проект`,noProject:`Без проекта`,itemsPrinted:`Напечатано изделий`,itemsPrintedHelp:`Количество изделий, полученных в этом задании печати`,notes:`Заметки`,notesPlaceholder:`Добавьте заметки об этой печати...`,externalLink:`Внешняя ссылка`,externalLinkPlaceholder:`https://printables.com/model/...`,externalLinkHelp:`Ссылка на Printables, Thingiverse или другой источник`,tags:`Метки`,tagsPlaceholder:`Добавить метки...`,addMoreTags:`Добавить ещё метки...`,matchingTags:`Совпадения для «{{query}}»`,existingTags:`Существующие метки`,clickToAdd:`(нажмите, чтобы добавить)`,status:`Статус`,failureReason:`Причина сбоя`,selectReason:`Выберите причину...`,photos:`Фотографии результата печати`,photosHelp:`Нажмите +, чтобы добавить фотографии результата`,printResult:`Результат печати`,saving:`Сохранение...`,failureReasons:{adhesionFailure:`Плохая адгезия к столу`,spaghettiDetached:`Спагетти / отрыв детали`,layerShift:`Сдвиг слоёв`,cloggedNozzle:`Засор сопла`,filamentRunout:`Закончился филамент`,warping:`Коробление`,stringing:`Стрингинг`,underExtrusion:`Недоэкструзия`,powerFailure:`Сбой питания`,userCancelled:`Отменено пользователем`,other:`Другое`},statuses:{completed:`Завершено`,failed:`Ошибка`,aborted:`Отменено`,printing:`Печать`}},kProfiles:{title:`K-профили`,noPrintersConfigured:`Принтеры не настроены`,addPrinterInSettings:`Добавьте принтер в настройках, чтобы управлять K-профилями`,noActivePrinters:`Нет активных принтеров`,enablePrinterConnection:`Включите подключение к принтеру, чтобы просматривать его K-профили`,loadingProfiles:`Загрузка K-профилей...`,printerOffline:`Принтер не в сети`,printerOfflineDesc:`Выбранный принтер не подключён. Включите его, чтобы просмотреть K-профили.`,noMatchingProfiles:`Подходящие профили не найдены`,noMatchingProfilesDesc:`Ни один профиль не соответствует условиям поиска`,noKProfiles:`K-профили отсутствуют`,noKProfilesDesc:`Для сопла {{diameter}} мм не найдены профили Pressure Advance`,createFirstProfile:`Создать первый профиль`,printer:`Принтер`,nozzle:`Сопло`,refresh:`Обновить`,addProfile:`Добавить профиль`,export:`Экспорт`,import:`Импорт`,select:`Выбрать`,selectAll:`Выбрать все`,delete:`Удалить`,searchPlaceholder:`Поиск по названию или филаменту...`,allExtruders:`Все экструдеры`,leftOnly:`Только левый`,rightOnly:`Только правый`,allFlow:`Любой тип потока`,hfOnly:`Только HF`,sOnly:`Только S`,sortName:`Сортировка: название`,sortKValue:`Сортировка: K-значение`,sortFilament:`Сортировка: филамент`,leftExtruder:`Левый экструдер`,rightExtruder:`Правый экструдер`,modal:{addTitle:`Добавить K-профиль`,editTitle:`Изменить K-профиль`,profileName:`Название профиля`,profileNamePlaceholder:`Мой профиль PLA`,kValue:`K-значение`,kValuePlaceholder:`0.020`,kValueHelp:`Типичный диапазон: 0,01–0,06 для PLA, 0,02–0,10 для PETG`,filament:`Филамент`,selectFilament:`Выберите филамент...`,noFilamentsHelp:`Филаменты не найдены. Сначала создайте K-профиль в Bambu Studio.`,flowType:`Тип потока`,highFlow:`Высокопоточный`,standard:`Стандартный`,nozzleSize:`Диаметр сопла`,extruder:`Экструдер`,extruders:`Экструдеры`,left:`Левый`,right:`Правый`,notes:`Заметки (хранятся локально)`,notesPlaceholder:`Добавьте заметки об этом профиле...`,notesHelp:`Заметки сохраняются в Bambuddy, а не на принтере`,syncing:`Синхронизация с принтером...`,savingExtruder:`Сохранение в экструдер {{current}}/{{total}}...`,pleaseWait:`Подождите`},deleteConfirm:{title:`Удалить профиль`,cannotUndo:`Это действие нельзя отменить`,message:`Удалить профиль «{{name}}» с принтера?`},bulkDelete:{title:`Удалить профили`,cannotUndo:`Это действие нельзя отменить`,message:`Удалить с принтера выбранные профили ({{count}})?`},toast:{profileSaved:`K-профиль сохранён`,profilesSaved:`K-профиль сохранён для {{count}} экструдеров`,selectAtLeastOneExtruder:`Выберите хотя бы один экструдер`,profileDeleted:`K-профиль удалён`,profilesDeleted:`Удалено профилей: {{count}}`,exportedProfiles:`Экспортировано профилей: {{count}}`,importedProfiles:`Импортировано {{count}} из {{total}} профилей`,noProfilesToExport:`Нет профилей для экспорта`,invalidFileFormat:`Недопустимый формат файла`,failedToParseImport:`Не удалось разобрать файл импорта`,failedToSaveBatch:`Не удалось сохранить K-профили`,noteSaved:`Заметка сохранена`,failedToSaveNote:`Не удалось сохранить заметку`},permission:{noRead:`У вас нет прав на обновление профилей`,noCreate:`У вас нет прав на добавление профилей`,noUpdate:`У вас нет прав на изменение K-профилей`,noDelete:`У вас нет прав на удаление K-профилей`,noExport:`У вас нет прав на экспорт профилей`,noImport:`У вас нет прав на импорт профилей`}},virtualPrinter:{title:`Виртуальный принтер`,running:`Запущен`,stopped:`Остановлен`,description:{default:`Включает виртуальный принтер, который отображается в Bambu Studio и OrcaSlicer. Отправленные на него файлы сразу сохраняются в архив без печати.`,proxy:`Включает прокси, перенаправляющий трафик слайсера на реальный принтер и позволяющий печатать удалённо из любой сети.`},enable:{title:`Включить виртуальный принтер`,visibleInSlicer:`Отображается как «Bambuddy» при обнаружении принтеров в слайсере`,proxyingTo:`Проксирование на {{name}}`,notActive:`Не активен`},model:{title:`Модель принтера`,description:`Выберите модель принтера, которую нужно эмулировать.`,restartWarning:`При изменении модели виртуальный принтер будет перезапущен`},accessCode:{title:`Код доступа`,isSet:`Код доступа задан`,notSet:`Код доступа не задан — он необходим для включения`,placeholder:`Введите 8-значный код`,placeholderChange:`Введите новый код`,hint:`Код должен состоять ровно из 8 символов. Слайсеры используют его для аутентификации.`,charCount:`({{count}}/8)`,inheritedFromTarget:`Унаследован от целевого принтера`,derivedFromTargetHint:`Используется код доступа целевого принтера. Мост перенаправляет аутентификацию слайсера на реальный принтер, поэтому коды должны совпадать. Чтобы изменить значение, измените код доступа самого принтера.`,reveal:`Показать код доступа`,hide:`Скрыть код доступа`},targetPrinter:{title:`Целевой принтер`,configured:`Целевой принтер для прокси настроен`,notConfigured:`Целевой принтер не выбран — он необходим для режима прокси`,placeholder:`Выберите принтер...`,hint:`Выберите принтер, на который будет перенаправляться трафик слайсера. Принтер должен работать в режиме LAN.`,noPrinters:`Нет настроенных принтеров. Сначала добавьте принтер.`},remoteInterface:{title:`Переопределение сетевого интерфейса`,configured:`Переопределение интерфейса активно`,optional:`Необязательно — используйте, если IP определён неверно, например при нескольких сетевых картах, Docker или VPN`,placeholder:`Определять автоматически...`,hint:`Переопределяет IP-адрес, публикуемый через SSDP и используемый в TLS-сертификате. Полезно, если у Bambuddy несколько сетевых интерфейсов.`},mode:{title:`Режим`,archive:`Архив`,archiveDesc:`Сразу сохранять файлы в архив`,review:`Проверка`,reviewDesc:`Проверять перед добавлением в архив`,queue:`Очередь`,queueDesc:`Сохранять в архив и добавлять в очередь`,proxy:`Прокси`,proxyDesc:`Перенаправлять на реальный принтер`},autoDispatch:{title:`Автоматический запуск`,description:`Автоматически запускать задания после добавления в очередь. Если выключено, задания ожидают ручного запуска.`},queueForceColorMatch:{title:`Требовать совпадения цвета`,description:`Не назначать задание принтеру, если загружены филамент другого типа или другого цвета. По умолчанию выключено: без этой проверки очередь сопоставляет только модель принтера и может выбрать принтер с неподходящим цветом.`},gcodeInjection:{title:`Вставка G-code`,description:`Применять к заданиям этого виртуального принтера фрагменты G-code для соответствующей модели, заданные в настройках. По умолчанию выключено.`},tailscaleDisabled:{title:`Интеграция Tailscale`,description:`Отметить этот виртуальный принтер как доступный через Tailscale. Будет показан Tailscale-адрес хоста, который нужно указать в слайсере. Импорт сертификата центра сертификации выполняется как обычно; этот переключатель на сертификаты не влияет.`},setupRequired:{title:`Требуется настройка`,description:`Для работы виртуального принтера требуется дополнительная настройка системы: перенаправление портов, правила межсетевого экрана и параметры, зависящие от платформы.`,readGuide:`Перед включением прочитайте руководство по настройке`},archiveNameSource:{title:`Источник названия архива`,description:`Выберите способ формирования названия новых архивов для файлов, полученных через виртуальный принтер. «Метаданные» использует поле Title, встроенное слайсером в 3MF. «Имя файла» использует имя, переданное Bambu Studio по FTP. Bambu Studio заменяет введённое в окне отправки название значением Title из 3MF, если оно присутствует, поэтому оба режима часто дают одинаковый результат.`,metadata:`Метаданные`,filename:`Имя файла`},caCert:{title:`Сертификат для слайсера`,description:`Виртуальные принтеры используют TLS-сертификат, подписанный центром сертификации Bambuddy. Один раз импортируйте этот сертификат CA в хранилище доверенных сертификатов слайсера, чтобы он принимал соединение.`,copy:`Копировать`,copied:`Скопировано`,download:`Скачать`,fingerprint:`SHA-256`},howItWorks:{title:`Как это работает`,step1:`В одной локальной сети виртуальные принтеры автоматически появляются в Bambu Studio и OrcaSlicer. Из других сетей добавьте их вручную по IP-адресу и коду доступа.`,step2:`В режимах «Архив», «Проверка» и «Очередь» используйте кнопку «Отправить» в слайсере для загрузки 3MF в Bambuddy. Слайсер покажет сообщение об успешной печати, но файл будет только сохранён, без запуска печати.`,step3:`В режиме прокси виртуальный принтер перенаправляет весь трафик на реальный принтер — печать запускается сразу, как при прямом подключении.`},status:{title:`Сведения о состоянии`,printerName:`Имя принтера`,model:`Модель`,serialNumber:`Серийный номер`,mode:`Режим`,pendingFiles:`Ожидающие файлы`,targetPrinter:`Целевой принтер`,ftpPort:`Порт FTP`,mqttPort:`Порт MQTT`,ftpConnections:`Соединения FTP`,mqttConnections:`Соединения MQTT`},toast:{updated:`Настройки виртуального принтера обновлены`,failedToUpdate:`Не удалось обновить настройки`,copyFailed:`Не удалось скопировать — выделите текст вручную`,accessCodeRequired:`Сначала задайте код доступа`,targetPrinterRequired:`Сначала выберите целевой принтер`,bindIpRequired:`Сначала задайте IP-адрес привязки`,accessCodeEmpty:`Код доступа не может быть пустым`,accessCodeLength:`Код доступа должен состоять ровно из 8 символов`,targetCodeChangedRebind:`Код доступа приведён в соответствие с новым целевым принтером. Удалите и снова добавьте устройство в слайсере, чтобы он получил новый код.`,created:`Виртуальный принтер создан`,failedToCreate:`Не удалось создать виртуальный принтер`,deleted:`Виртуальный принтер удалён`,failedToDelete:`Не удалось удалить виртуальный принтер`},list:{title:`Виртуальные принтеры`,add:`Добавить`,addFirst:`Добавить виртуальный принтер`,empty:`Виртуальные принтеры не настроены. Добавьте первый принтер.`},bindIp:{title:`Интерфейс привязки`,placeholder:`Выберите интерфейс...`,hint:`Сетевой интерфейс, к которому будет привязан этот виртуальный принтер. Для каждого принтера он должен быть уникальным.`},proxy:{accessCodeHint:`В режиме прокси используйте в слайсере код доступа целевого принтера. Соединение прозрачно перенаправляется на реальный принтер.`},addDialog:{title:`Добавление виртуального принтера`,name:`Название`,hint:`После создания можно настроить код доступа, целевой принтер и остальные параметры.`,create:`Создать`},deleteConfirm:{title:`Удаление виртуального принтера`,message:`Удалить «{{name}}»? Все службы этого виртуального принтера будут остановлены.`}},modelViewer:{openInSlicer:`Открыть в слайсере`,tabs:{model:`3D-модель`,gcode:`Предпросмотр G-code`},notAvailable:`недоступно`,notSliced:`не нарезано`,plates:`Пластины`,allPlates:`Все пластины`,plateNumber:`Пластина {{number}}`,plateCount:`{{count}} пластина`,plateCount_other:`{{count}} пластин`,objectCount:`{{count}} объект`,objectCount_other:`{{count}} объектов`,filamentCount:`{{count}} филамент`,filamentCount_other:`{{count}} филаментов`,eta:`Осталось {{minutes}} мин`,noPreview:`Для этого файла нет предпросмотра`,pagination:{pageOf:`Страница {{current}} из {{total}}`,prev:`Назад`,next:`Далее`},errors:{failedToLoad:`Не удалось загрузить файл`,noMeshes:`В файле 3MF не найдены сеточные модели`,unsupportedFormat:`Неподдерживаемый формат файла`}},maintenanceDescriptions:{lubricateCarbonRods:`Смазать углепластиковые направляющие для плавного перемещения`,lubricateRails:`Смазать линейные направляющие для плавного перемещения`,cleanNozzle:`Очистить хотэнд и сопло для предотвращения засоров`,checkBelts:`Проверить натяжение ремней для сохранения точности печати`,cleanBuildPlate:`Очистить печатную пластину для улучшения адгезии`,checkExtruder:`Проверить шестерни экструдера на износ`,checkCooling:`Проверить исправность вентиляторов охлаждения`,generalInspection:`Общий осмотр принтера`,cleanCarbonRods:`Очистить углепластиковые направляющие для уменьшения трения`,lubricateSteelRods:`Смазать стальные направляющие для плавного перемещения`,cleanSteelRods:`Очистить стальные направляющие для уменьшения трения`,cleanLinearRails:`Протереть линейные направляющие от пыли и загрязнений`,checkPtfeTube:`Проверить PTFE-трубку на износ и повреждения`,replaceHepaFilter:`Заменить HEPA-фильтр`,replaceCarbonFilter:`Заменить угольный фильтр`,lubricateLeftNozzleRail:`Смазать направляющую левого сопла (серия H2)`},smartPlugs:{offline:`Не в сети`,admin:`Управление`,openPlugAdminPage:`Открыть страницу управления розеткой`,deleteSmartPlug:`Удалить умную розетку`,turnOnSmartPlug:`Включить умную розетку`,turnOffSmartPlug:`Выключить умную розетку`,turnOn:`Включить`,turnOff:`Выключить`,addSmartPlug:{scanningNetwork:`Сканирование сети...`,chooseEntity:`Выберите сущность...`,connectionFailed:`Ошибка подключения`,searchEntities:`Поиск сущностей...`,searchPowerSensors:`Поиск датчиков мощности...`,searchEnergySensors:`Поиск датчиков энергии...`,placeholders:{plugName:`Розетка в гостиной`,mqttStateOnValue:`ON, true, 1`,mqttSameAsPower:`Та же тема, что для мощности, или другая`}},linkedTo:`Связана с:`,monitorOnly:`Только мониторинг`,alerts:`Оповещения`,scheduleOn:`Включение в {{time}}`,scheduleOff:`Выключение в {{time}}`,on:`Включена`,off:`Выключена`,power:`Мощность`,kwhToday:`кВт·ч сегодня`,settings:`Настройки`,automationSettings:`Настройки автоматизации`,showInSwitchbar:`Показывать на панели переключателей`,quickAccessSidebar:`Быстрый доступ с боковой панели`,enabled:`Включено`,enableAutomation:`Включить автоматизацию для этой розетки`,autoOn:`Автовключение`,autoOnDescription:`Включать при начале печати`,autoOff:`Автовыключение`,autoOffDescription:`Выключать после завершения печати (однократно)`,autoOffPersistent:`Оставлять включённым`,autoOffPersistentDescription:`Не сбрасывать автовыключение после печати`,autoOffAfterDrying:`Выключать после сушки`,autoOffAfterDryingDescription:`Выключать после завершения сушки в AMS`,delayAfterDryingMinutes:`Задержка после сушки (мин)`,turnOffDelayMode:`Условие отложенного выключения`,time:`Время`,temp:`Температура`,delayMinutes:`Задержка (мин)`,tempThreshold:`Порог температуры (°C)`,tempThresholdDescription:`Выключать, когда сопло остынет ниже этой температуры`,edit:`Изменить`,deleteConfirm:`Удалить «{{name}}»? Это действие нельзя отменить.`,turnOnConfirm:`Включить «{{name}}»?`,turnOffConfirm:`Выключить «{{name}}»? Питание подключённого устройства будет отключено.`,failedToTurn:`Не удалось {{action}} «{{name}}»`,unknown:`Неизвестно`,addTitle:`Добавление умной розетки`,editTitle:`Редактирование умной розетки`,stopScanning:`Остановить сканирование`,discoverTasmota:`Найти устройства Tasmota`,foundDevices:`Найдено устройств: {{count}}. Нажмите для выбора:`,noDevicesFound:`Устройства Tasmota в сети не найдены`,haNotConfigured:`Home Assistant не настроен. Настройте его в разделе`,haSettingsPath:`Настройки → Сеть → Home Assistant`,selectEntity:`Выберите сущность *`,ipAddress:`IP-адрес *`,nameLabel:`Название *`,username:`Имя пользователя`,password:`Пароль`,authHint:`Оставьте пустым, если устройство Tasmota не требует аутентификации`,linkToPrinter:`Связать с принтером`,noPrinter:`Без принтера — только ручное управление`,linkingDescription:`Связь позволяет автоматически включать и выключать питание при начале и завершении печати`,powerAlerts:`Оповещения о мощности`,alertAbove:`Оповещать выше (Вт)`,alertBelow:`Оповещать ниже (Вт)`,alertDescription:`Отправлять уведомление при пересечении заданных порогов мощности. Оставьте поле пустым, чтобы отключить соответствующий порог.`,dailySchedule:`Ежедневное расписание`,turnOnAt:`Включать в`,turnOffAt:`Выключать в`,scheduleDescription:`Ежедневно включать и выключать розетку в указанное время. Оставьте поле пустым, чтобы не выполнять соответствующее действие.`,showOnPrinterCard:`Показывать в карточке принтера`,displayOnPrinterCard:`Показывать кнопку в карточке принтера`,connectedResult:`Подключено!`,deviceLabel:`Устройство: {{name}} — `,stateLabel:`Состояние: {{state}}`,test:`Проверить`,delete:`Удалить`,save:`Сохранить`,add:`Добавить`,cancel:`Отмена`,failedToStartScan:`Не удалось запустить сканирование`,nameRequired:`Укажите название`,entityRequired:`Для розеток Home Assistant необходимо выбрать сущность`,mqttTopicRequired:`Для мониторинга мощности, энергии или состояния необходимо настроить хотя бы одну тему MQTT`,loadingEntities:`Загрузка сущностей...`,loading:`Загрузка...`,failedToLoadEntities:`Не удалось загрузить сущности: {{error}}`,noEntitiesMatching:`Сущности по запросу «{{search}}» не найдены`,noEntitiesAvailable:`Нет доступных сущностей`,searchingEntities:`Поиск по всем сущностям, найдено: {{count}}`,showingEntities:`Показаны switch, light и input_boolean, доступно: {{count}}`,energyMonitoringOptional:`Мониторинг энергии (необязательно)`,energyMonitoringHint:`Найдите и выберите датчики мощности и энергии.`,powerSensorW:`Датчик мощности (Вт)`,energyTodayKwh:`Энергия за сегодня (кВт·ч)`,totalEnergyKwh:`Общая энергия (кВт·ч)`,noMatchingSensors:`Подходящие датчики не найдены`,none:`Нет`,mqttNotConfigured:`Брокер MQTT не настроен. Укажите его адрес в разделе`,mqttSettingsPath:`Настройки → Сеть → Публикация MQTT`,mqttNotConfiguredSuffix:`Включать публикацию не обязательно — достаточно заполнить параметры брокера.`,mqttMonitorOnlyDescription:`Розетки MQTT получают данные мощности и энергии через подписку MQTT. Управление включением и выключением недоступно — используйте брокер MQTT или систему домашней автоматизации.`,powerMonitoring:`Мониторинг мощности`,energyMonitoring:`Мониторинг энергии`,stateMonitoring:`Мониторинг состояния`,optional:`необязательно`,topic:`Тема`,jsonPath:`Путь JSON`,multiplier:`Множитель`,onValue:`Значение «включено»`,mqttPowerHint:`Путь JSON извлекает значение из полезной нагрузки JSON, например «power_l1». Оставьте пустым, если тема публикует число напрямую.
+Для преобразования мВт→Вт используйте 0.001, для кВт→Вт — 1000.`,mqttEnergyHint:`Путь JSON извлекает значение из полезной нагрузки JSON. Оставьте пустым для числового значения напрямую.
+Для преобразования Вт·ч→кВт·ч используйте 0.001, для МВт·ч→кВт·ч — 1000.`,mqttStateHint:`Путь JSON извлекает значение из полезной нагрузки JSON. Оставьте пустым для значения напрямую.
+Значение «включено» — точная строка, означающая включённое состояние. Оставьте пустым для автоматического распознавания ON, true и 1.`,restControl:`Управление`,restOnUrl:`URL включения`,restOffUrl:`URL выключения`,restOnBody:`Тело запроса включения`,restOffBody:`Тело запроса выключения`,restMethod:`Метод HTTP`,restHeaders:`Пользовательские заголовки (JSON)`,restStatusUrl:`URL состояния`,restStatusPath:`Путь JSON состояния`,restStatusOnValue:`Значение «включено»`,restPowerUrl:`URL мощности`,restPowerPath:`Путь JSON мощности`,restPowerMultiplier:`Множитель мощности`,restEnergyUrl:`URL энергии`,restEnergyPath:`Путь JSON энергии`,restEnergyTotalPath:`Путь JSON полной энергии`,restEnergyTotalMultiplier:`Множитель полной энергии`,restEnergyTotalPathHint:`например, aenergy.total`,restEnergyTotalHint:`Многие розетки, включая все устройства Shelly, передают только накопительный счётчик энергии, который никогда не сбрасывается. Его следует указывать здесь, а не в поле выше: если считать его суточным расходом, значение не сбросится в полночь, а данные за вчера и общий расход останутся пустыми. Bambuddy вычисляет расход за сегодня и вчера по этому счётчику; для накопления данных потребуется один-два дня. Shelly передаёт ватт-часы, поэтому используйте множитель 0.001.`,restEnergyMultiplier:`Множитель энергии`,restUrlRequired:`Для REST-розетки необходимо указать хотя бы один URL: включения или выключения`,restHeadersHint:`например, {"Authorization": "Bearer your-token"}`,restBodyHint:`например, ON или {"state": "on"}`,restStatusHint:`URL для опроса текущего состояния`,restPathHint:`например, state или data.power.status`,restPowerUrlHint:`Отдельный URL данных мощности; если пусто, используется URL состояния`,restEnergyUrlHint:`Отдельный URL данных энергии; если пусто, используется URL состояния`,restEnergyHint:`Для каждого значения можно использовать отдельный URL либо URL состояния. Множители используются для преобразования единиц, например 0.001 для Вт·ч→кВт·ч.`,testConnection:`Проверить подключение`,connectionSuccess:`Подключение успешно`,noSwitchesInSwitchbar:`На панели переключателей нет устройств`,enableSwitchbarHint:`Включите «Показывать на панели переключателей» в разделе «Настройки → Умные розетки»`},notifications:{providerTypes:{callmebot:`CallMeBot/WhatsApp`,ntfy:`ntfy`,pushover:`Pushover`,telegram:`Telegram`,email:`Электронная почта`,discord:`Discord`,webhook:`Вебхук`,homeassistant:`Home Assistant`},providerDescriptions:{email:`Уведомления по электронной почте через SMTP`,telegram:`Уведомления через Telegram-бота`,discord:`Отправка в канал Discord через вебхук`,ntfy:`Бесплатные push-уведомления с возможностью самостоятельного размещения сервера`,pushover:`Простые и надёжные push-уведомления`,callmebot:`Бесплатные уведомления WhatsApp через CallMeBot`,webhook:`Универсальный HTTP POST-запрос на любой URL`,homeassistant:`Постоянные уведомления на панели Home Assistant`},lastSuccess:`Последняя отправка: {{date}}`,error:`Ошибка`,printer:`Принтер:`,allPrinters:`Все принтеры`,sendTestNotification:`Отправить тестовое уведомление`,eventSettings:`Настройки событий`,enabled:`Включено`,sendFromProvider:`Отправлять уведомления через этого провайдера`,printEvents:`События печати`,printerStatus:`Состояние принтера`,amsAlarms:`Предупреждения AMS`,amsHtAlarms:`Предупреждения AMS-HT`,printQueue:`Очередь печати`,start:`Запуск`,plateCheck:`Проверка пластины`,complete:`Завершено`,failed:`Ошибка`,stopped:`Остановлено`,progress:`Ход печати`,offline:`Не в сети`,lowFilament:`Мало филамента`,maintenance:`Обслуживание`,amsHumidity:`Влажность AMS`,amsTemp:`Температура AMS`,amsHtHumidity:`Влажность AMS-HT`,amsHtTemp:`Температура AMS-HT`,bedCooled:`Стол остыл`,firstLayer:`Первый слой`,quiet:`Тихий режим`,digest:`Сводка в {{time}}`,printStarted:`Печать началась`,plateNotEmpty:`Пластина не пуста`,plateNotEmptyDescription:`Перед печатью на пластине обнаружены объекты`,printCompleted:`Печать завершена`,bedCooledLabel:`Стол остыл`,bedCooledDescription:`После печати температура стола опустилась ниже заданного порога`,firstLayerCompleteLabel:`Первый слой завершён`,firstLayerCompleteDescription:`Уведомить со снимком после завершения первого слоя`,missingSpoolAssignmentLabel:`Катушка не назначена`,missingSpoolAssignmentDescription:`Уведомить при запуске печати, если для необходимых слотов не назначены катушки`,printFailed:`Ошибка печати`,printStopped:`Печать остановлена`,progressMilestones:`Этапы выполнения`,progressMilestonesDescription:`Уведомлять при 25%, 50% и 75%`,printerOffline:`Принтер не в сети`,printerError:`Ошибка принтера`,aiFailureDetection:`Обнаружение сбоев с помощью ИИ`,aiFailureDetectionDescription:`Уведомить, если Obico AI обнаружит возможный сбой печати`,lowFilamentLabel:`Заканчивается филамент`,maintenanceDue:`Требуется обслуживание`,maintenanceDueDescription:`Уведомить, когда принтеру потребуется обслуживание`,amsHumidityHigh:`Высокая влажность в AMS`,amsHumidityHighDescription:`Влажность в обычной AMS превысила заданный порог`,amsTemperatureHigh:`Высокая температура в AMS`,amsTemperatureHighDescription:`Температура в обычной AMS превысила заданный порог`,amsHtHumidityHigh:`Высокая влажность в AMS-HT`,amsHtHumidityHighDescription:`Влажность в AMS-HT превысила заданный порог`,amsHtTemperatureHigh:`Высокая температура в AMS-HT`,amsHtTemperatureHighDescription:`Температура в AMS-HT превысила заданный порог`,inventoryAlerts:`Уведомления о запасах`,stockReorderAlert:`Пора заказывать`,stockReorderAlertDescription:`Запас по SKU достиг точки повторного заказа`,stockBreakAlert:`Риск исчерпания запаса`,stockBreakAlertDescription:`Запас закончится раньше, чем поступит пополнение`,jobAdded:`Задание добавлено`,jobAddedDescription:`Задание добавлено в очередь`,jobAssigned:`Задание назначено`,jobAssignedDescription:`Задание по модели назначено принтеру`,jobStarted:`Задание запущено`,jobStartedDescription:`Задание из очереди отправлено на печать`,jobWaiting:`Задание ожидает`,jobWaitingDescription:`Задание ожидает филамент или свободный принтер`,jobSkipped:`Задание пропущено`,jobSkippedDescription:`Задание пропущено из-за ошибки предыдущего`,jobFailed:`Не удалось запустить задание`,jobFailedDescription:`Задание не удалось отправить на печать`,queueComplete:`Очередь завершена`,queueCompleteDescription:`Все задания в очереди завершены`,quietHours:`Тихие часы`,noNotificationsDuring:`Не отправлять уведомления в это время`,editProviderToChangeQuietHours:`Измените провайдера, чтобы настроить тихие часы`,dailyDigest:`Ежедневная сводка`,batchNotifications:`Объединять уведомления в одну ежедневную сводку`,sendAt:`Отправлять в {{time}}`,editProviderToChangeDigestTime:`Измените провайдера, чтобы настроить время сводки`,edit:`Изменить`,deleteProvider:`Удалить провайдера уведомлений`,deleteConfirm:`Удалить «{{name}}»? Это действие нельзя отменить.`,delete:`Удалить`,addTitle:`Добавить провайдера уведомлений`,editTitle:`Изменить провайдера уведомлений`,nameLabel:`Название *`,namePlaceholder:`Мои уведомления`,providerTypeLabel:`Тип провайдера *`,configuration:`Настройка`,testConfiguration:`Проверить настройку`,printerFilter:`Фильтр принтеров`,onlyFromPrinter:`Отправлять уведомления только о событиях этого принтера`,quietHoursDnd:`Тихие часы (не беспокоить)`,quietStart:`Начало`,quietEnd:`Окончание`,dailyDigestLabel:`Ежедневная сводка`,sendDigestAt:`Отправлять сводку в`,digestCollected:`События будут собраны и отправлены одной сводкой в указанное время`,notificationEvents:`События для уведомлений`,progressPercent:`(25%, 50%, 75%)`,bedCooledAfterPrint:`(после завершения печати)`,eventPriority:{sectionTitle:`Приоритет ntfy`,helpNtfy:`Выберите приоритет для каждого включённого события. ntfy использует его для усиления оповещений: звука, видимости и поведения push-уведомлений. Для неуказанных событий используется приоритет по умолчанию сервера ntfy.`,min:`Минимальный`,low:`Низкий`,default:`Обычный`,high:`Высокий`,urgent:`Срочный`},cancel:`Отмена`,save:`Сохранить`,add:`Добавить`,nameRequired:`Укажите название`,fieldRequired:`Поле «{{field}}» обязательно`,phoneNumber:`Номер телефона`,apiKey:`Ключ API`,serverUrl:`URL сервера`,topic:`Тема`,authToken:`Токен авторизации`,userKey:`Ключ пользователя`,appToken:`Токен приложения`,priority:`Приоритет`,pushoverRetry:`Повтор экстренного уведомления (с)`,pushoverExpire:`Срок действия экстренного уведомления (с)`,botToken:`Токен бота`,chatId:`ID чата`,smtpServer:`SMTP-сервер`,smtpPort:`Порт SMTP`,security:`Защита соединения`,authentication:`Аутентификация`,username:`Имя пользователя`,password:`Пароль`,fromEmail:`Адрес отправителя`,toEmail:`Адрес получателя`,webhookUrl:`URL вебхука`,payloadFormat:`Формат данных`,authorization:`Авторизация`,titleFieldName:`Имя поля заголовка`,messageFieldName:`Имя поля сообщения`,editTemplate:`Изменить шаблон: {{name}}`,titleLabel:`Заголовок`,bodyLabel:`Текст`,titlePlaceholder:`Заголовок уведомления...`,bodyPlaceholder:`Текст уведомления...`,availableVariables:`Доступные переменные`,clickToInsert:`Нажмите, чтобы вставить в позицию курсора в тексте`,livePreview:`Предварительный просмотр`,hide:`Скрыть`,show:`Показать`,loadingPreview:`Загрузка предварительного просмотра...`,enterTemplateContent:`Введите содержимое шаблона для предварительного просмотра`,titlePreview:`Заголовок:`,bodyPreview:`Текст:`,resetToDefault:`Восстановить стандартный шаблон`,titleRequired:`Укажите заголовок`,bodyRequired:`Введите текст уведомления`,notificationLog:`Журнал уведомлений`,showFailedOnly:`Только неудачные`,last24Hours:`Последние 24 часа`,last7Days:`Последние 7 дней`,last30Days:`Последние 30 дней`,last90Days:`Последние 90 дней`,justNow:`Только что`,noFailedNotifications:`Неудачных уведомлений нет`,noNotificationsLogged:`В журнале пока нет уведомлений`,unknownProvider:`Неизвестный провайдер`,logTitle:`Заголовок`,logMessage:`Сообщение`,logError:`Ошибка`,logProvider:`Провайдер: {{type}}`,logTime:`Время: {{time}}`,refresh:`Обновить`,clearOld:`Удалить старые`,statsSummary:`За последние {{days}} дней:`,statsNotifications:`уведомлений`,statsSent:`отправлено: {{count}}`,statsFailed:`ошибок: {{count}}`,eventTypes:{print_start:`Печать началась`,print_complete:`Печать завершена`,print_failed:`Ошибка печати`,print_stopped:`Печать остановлена`,print_progress:`Ход печати`,printer_offline:`Принтер не в сети`,printer_error:`Ошибка принтера`,filament_low:`Заканчивается филамент`,maintenance_due:`Требуется обслуживание`,test:`Тест`},userEmail:{title:`Уведомления`,emailNotifications:`Уведомления по электронной почте`,emailNotificationsDesc:`Получать письма о собственных заданиях печати. Для отправки используются системные параметры SMTP из раздела расширенной аутентификации.`,sendingTo:`Уведомления будут отправляться на адрес`,noEmailWarning:`Для вашей учётной записи не указан адрес электронной почты. Обратитесь к администратору.`,printJobNotifications:`Уведомления о заданиях печати`,printJobNotificationsDesc:`Выберите события, при которых будут отправляться письма о запущенных вами заданиях.`,printJobStarts:`Запуск задания печати`,printJobStartsDesc:`Уведомлять о начале вашего задания печати.`,printJobFinishes:`Завершение задания печати`,printJobFinishesDesc:`Уведомлять об успешном завершении вашего задания печати.`,printErrors:`Ошибки печати`,printErrorsDesc:`Уведомлять, если задание завершилось ошибкой или при печати возникла проблема.`,printJobStops:`Остановка задания печати`,printJobStopsDesc:`Уведомлять об отмене или остановке вашего задания печати.`,saveSuccess:`Настройки уведомлений сохранены.`,saveError:`Не удалось сохранить настройки уведомлений.`}},richTextEditor:{bold:`Полужирный`,italic:`Курсив`,underline:`Подчёркивание`,bulletList:`Маркированный список`,numberedList:`Нумерованный список`,alignLeft:`По левому краю`,alignCenter:`По центру`,alignRight:`По правому краю`,addLink:`Добавить ссылку`,removeLink:`Удалить ссылку`},externalLinks:{title:`Ссылки на боковой панели`,sidebarLayout:`Боковая панель`,sidebarLayoutDescription:`Показывайте или скрывайте встроенные страницы, добавляйте внешние ссылки и перетаскивайте пункты, меняя порядок навигации.`,systemPages:`Страницы Bambuddy`,externalLinks:`Внешние ссылки`,visibleInSidebar:`Показывается на боковой панели`,hiddenFromSidebar:`Скрыто с боковой панели`,requiredInSidebar:`Обязательный пункт боковой панели`,hidePage:`Скрыть страницу`,showPage:`Показать страницу`,settingsCannotBeHidden:`Настройки нельзя скрыть`,noLinksConfigured:`Внешние ссылки не настроены`,deleteLink:`Удалить ссылку`,removeCustomIcon:`Удалить пользовательский значок`,openInNewTab:`Открывать в новой вкладке`,placeholders:{linkName:`Моя ссылка`}},keyboardShortcuts:{title:`Горячие клавиши`,navigation:`Навигация`,archivesSection:`Архив`,kProfilesSection:`K-профили`,generalSection:`Общие`,shortcuts:{goToPrinters:`Перейти к принтерам`,goToArchives:`Перейти в архив`,goToQueue:`Перейти к очереди`,goToStats:`Перейти к статистике`,goToProfiles:`Перейти к облачным профилям`,goToSettings:`Перейти к настройкам`,focusSearch:`Перейти в строку поиска`,openUploadModal:`Открыть окно загрузки`,clearSelection:`Снять выделение / убрать фокус с поля`,contextMenu:`Контекстное меню карточки`,refreshProfiles:`Обновить профили`,newProfile:`Новый профиль`,exitSelectionMode:`Выйти из режима выделения`,showHelp:`Показать эту справку`},footer:`Нажмите Esc или щёлкните снаружи, чтобы закрыть`},notificationLog:{title:`Журнал уведомлений`,events:{printStarted:`Печать началась`,printComplete:`Печать завершена`,printFailed:`Ошибка печати`,printStopped:`Печать остановлена`,progress:`Ход выполнения`,printerOffline:`Принтер не в сети`,printerError:`Ошибка принтера`,lowFilament:`Заканчивается филамент`,maintenanceDue:`Требуется обслуживание`,test:`Тест`},timeAgo:{justNow:`Только что`,minutesAgo:`{{minutes}} мин назад`,hoursAgo:`{{hours}} ч назад`}},restoreBackup:{title:`Восстановление резервной копии`,restoring:`Восстановление...`,restoreComplete:`Восстановление завершено`,restoreFailed:`Ошибка восстановления`,importSettings:`Импортировать настройки из файла резервной копии`,pleaseWait:`Подождите, пока данные восстанавливаются`,clickToSelect:`Нажмите, чтобы выбрать файл резервной копии (.json или .zip)`,howDuplicateHandling:`Как обрабатываются совпадения:`,categories:{printers:`Принтеры`,smartPlugs:`Умные розетки`,notificationProviders:`Провайдеры уведомлений`,filaments:`Филаменты`,archives:`Архив`,pendingUploads:`Ожидающие загрузки`,settingsTemplates:`Настройки и шаблоны`},matchingInfo:{printers:`сопоставляются по серийному номеру`,smartPlugs:`сопоставляются по IP-адресу`,notificationProviders:`сопоставляются по названию`,filaments:`сопоставляются по названию, типу и бренду`,archives:`сопоставляются по хешу содержимого`,pendingUploads:`сопоставляются по имени файла`,settingsTemplates:`всегда перезаписываются`},replaceExisting:`Заменить существующие данные`,keepExisting:`Сохранить существующие данные`,replaceDescription:`Перезаписать уже существующие элементы данными из резервной копии`,keepDescription:`Восстановить только отсутствующие элементы`,caution:`Внимание:`,cautionText:`При перезаписи текущая конфигурация будет заменена данными из резервной копии. В целях безопасности коды доступа к принтерам никогда не перезаписываются.`,itemsRestored:`Восстановлено элементов`,itemsSkipped:`Пропущено элементов`,restored:`Восстановлено`,skipped:`Пропущено (уже существует)`,filesLabel:`Файлы (3MF, миниатюры и т. п.)`,newApiKeysGenerated:`Созданы новые ключи API`,newApiKeysWarning:`Эти ключи показываются только один раз. Скопируйте их сейчас!`,processingBackup:`Обработка резервной копии...`,noDataFound:`В резервной копии не найдено данных для восстановления.`,failedToRestore:`Не удалось восстановить резервную копию. Проверьте формат файла.`},backupExport:{title:`Экспорт резервной копии`,selectData:`Выберите данные для включения`,selectAll:`Выбрать всё`,selectNone:`Снять выделение`,categoryDescriptions:{settings:`Язык, тема и настройки обновлений`,notifications:`ntfy, Pushover, Discord и другие`,templates:`Пользовательские шаблоны сообщений`,smartPlugs:`Конфигурация розеток Tasmota`,externalLinks:`Ссылки на внешние сервисы в боковой панели`,printers:`Сведения о принтерах (без кодов доступа)`,plateDetection:`Эталонные изображения пустых пластин`,filaments:`Типы и стоимость филамента`,maintenance:`Пользовательские графики обслуживания`,archives:`Все данные печати и файлы (3MF, миниатюры, фотографии)`,projects:`Проекты, позиции спецификаций и вложения`,pendingUploads:`Загрузки виртуальных принтеров, ожидающие проверки`,apiKeys:`Ключи API вебхуков (при импорте создаются новые)`},requiresPrinters:`Необходимо выбрать раздел «Принтеры»`,zipFileWarning:`Будет создан ZIP-файл.`,zipFileDescription:`В него войдут все файлы 3MF, миниатюры, таймлапсы и фотографии. Операция может занять некоторое время, а файл — получиться большим.`,includeAccessCodes:`Включить коды доступа`,includeAccessCodesDescription:`Для переноса на другой компьютер`,includeAccessCodesWarning:`Коды доступа попадут в файл открытым текстом. Храните резервную копию в безопасном месте!`,categoriesSelected:`Выбрано категорий: {{selectedCount}}`},pendingUploads:{placeholders:{notes:`Добавьте примечания об этой печати...`},discardUpload:`Отклонить загрузку`,archiveAllUploads:`Добавить все загрузки в архив`,discardAllUploads:`Отклонить все загрузки`,archive:`В архив`,timeAgo:{justNow:`Только что`,minutesAgo:`{{minutes}} мин назад`,hoursAgo:`{{hours}} ч назад`,daysAgo:`{{days}} дн. назад`}},apiBrowser:{placeholders:{requestBody:`Тело запроса JSON...`,searchEndpoints:`Поиск конечных точек...`}},configureAmsSlot:{title:`Настройка слота AMS`,slotConfigured:`Слот настроен!`,configuringSlot:`Настраивается слот:`,slotLabel:`{{ams}}, слот {{slot}}`,searchPresets:`Поиск профилей...`,colorPlaceholder:`Название или HEX-код цвета (например: brown, FF8800)`,clearCustomColor:`Очистить пользовательский цвет`,noCloudPresets:`Облачных профилей нет. Войдите в Bambu Cloud для синхронизации.`,noPresetsAvailable:`Нет доступных профилей. Войдите в Bambu Cloud или импортируйте локальные профили.`,noMatchingPresets:`Подходящие профили не найдены.`,custom:`Пользовательский`,builtin:`Встроенный`,orcaCloud:`Orca Cloud`,bambuCloud:`Bambu Cloud`,settingsSentToPrinter:`Настройки отправлены на принтер`,filamentProfile:`Профиль филамента`,kProfileLabel:`K-профиль (Pressure Advance)`,filteringFor:`Фильтр по материалу: {{material}}`,noKProfile:`Без K-профиля (стандартное значение 0,020)`,noMatchingKProfiles:`Подходящие K-профили не найдены. Будет использовано стандартное значение K=0,020.`,selectFilamentFirst:`Сначала выберите профиль филамента`,kFromCalibration:`K={{value}} из калибровки принтера`,customColorLabel:`Пользовательский цвет (необязательно)`,presetColors:`Цвета {{name}}:`,showLessColors:`Показать меньше цветов`,showMoreColors:`Показать больше цветов`,clear:`Очистить`,hexLabel:`HEX: #{{hex}}`,resetting:`Сброс...`,resetSlot:`Сбросить слот`,cancel:`Отмена`,configuring:`Настройка...`,configureSlot:`Настроить слот`},githubBackup:{title:`Резервное копирование в Git`,history:`История`,downloadBackup:`Скачать резервную копию`,restoreBackup:`Восстановить резервную копию`,noBackupsYet:`Резервных копий пока нет`},emailSettings:{placeholders:{fromName:`BamBuddy`}},tagManagement:{searchTags:`Поиск меток...`,renameTag:`Переименовать метку`,deleteTag:`Удалить метку`},notificationTemplates:{placeholders:{title:`Заголовок уведомления...`,body:`Текст уведомления...`}},batchTag:{placeholders:{newTag:`Введите новую метку...`}},photoGallery:{deletePhoto:`Удалить фотографию`},filamentHoverCard:{copySpoolUuid:`Скопировать UUID катушки`},kProfilesView:{hasNote:`Есть примечание`,copyProfile:`Копировать профиль`},layout:{openMenu:`Открыть меню`,noPermissionSystemInfo:`У вас нет разрешения на просмотр системной информации`},dashboard:{dragToReorder:`Перетащите, чтобы изменить порядок`,hideWidget:`Скрыть виджет`},notificationProviderCard:{deleteNotificationProvider:`Удалить провайдера уведомлений`},fileManagerModal:{closeFileManager:`Закрыть файловый менеджер`,sortFiles:`Сортировать файлы`,goToParentFolder:`Перейти в родительскую папку`,threeView:`Просмотр 3D`},embeddedCameraViewer:{refreshStream:`Обновить поток`,close:`Закрыть`,zoomOut:`Уменьшить`,resetZoom:`Сбросить масштаб`,zoomIn:`Увеличить`,dragToResize:`Перетащите, чтобы изменить размер`},timelapseViewer:{skipBack5s:`Назад на 5 с`,skipForward5s:`Вперёд на 5 с`},notificationProviders:{descriptions:{email:`Уведомления по электронной почте через SMTP`,telegram:`Уведомления через Telegram-бота`,discord:`Отправка в канал Discord через вебхук`,ntfy:`Бесплатные push-уведомления с возможностью самостоятельного размещения сервера`,pushover:`Простые и надёжные push-уведомления`,callmebot:`Бесплатные уведомления WhatsApp через CallMeBot`,webhook:`Обычный HTTP POST на любой URL`}},logViewer:{searchPlaceholder:`Поиск по сообщению или имени логгера...`,noLogEntries:`Записи журнала не найдены`},switchbarPopover:{noSwitchesInSwitchbar:`На панели переключателей нет устройств`},projectPageModal:{placeholders:{title:`Название`,designer:`Автор`,license:`Лицензия`,description:`Введите описание...`,profileTitle:`Название профиля`,profileDescription:`Описание профиля...`}},spoolmanSettings:{},time:{unknown:`—`,waiting:`Ожидание`,justNow:`Только что`,now:`Сейчас`,minsAgo:`{{count}} мин назад`,inMins:`через {{count}} мин`,hoursAgo:`{{count}} ч назад`,inHours:`через {{count}} ч`,daysAgo:`{{count}} дн. назад`,inDays:`через {{count}} дн.`},spoolbuddy:{nav:{dashboard:`Панель`,ams:`AMS`,inventory:`Катушки`,writeTag:`Запись метки`,settings:`Настройки`},status:{nfcReady:`NFC готов`,nfcOff:`NFC выключен`,offline:`Не в сети`,online:`В сети`,noPrinters:`Нет принтеров`,deviceOffline:`Устройство не в сети`,waitingConnection:`Ожидание подключения устройства...`,systemReady:`Система готова`,status:`Состояние`},dashboard:{readyToScan:`Готово к сканированию`,idleMessage:`Поставьте катушку на весы для идентификации`,nfcHint:`Метка NFC будет считана автоматически`,device:`Устройство`,syncWeight:`Синхронизировать массу`,weightSynced:`Синхронизировано!`,unknownTag:`Неизвестная метка`,newTag:`Обнаружена новая метка`,onScale:`на весах`,linkSpool:`Связать с катушкой`,linkTagTitle:`Связать метку с катушкой`,linkTag:`Связать метку`,selectSpool:`Выберите катушку, с которой нужно связать эту метку:`,noUntagged:`Катушки без меток не найдены`,tagDetected:`Метка обнаружена`,noTag:`Метка отсутствует`,tagId:`Метка`,grossWeight:`Масса брутто`,spoolSize:`Размер катушки`,close:`Закрыть`,currentSpool:`Текущая катушка`,plateReady:`Пластина готова: {{name}}`,plateReadyLabel:`Пластины, готовые к очистке`,plateClearAction:`Очищено`,plateClearedToast:`Пластина отмечена как очищенная`,plateClearFailed:`Не удалось отметить пластину как очищенную`},modal:{spoolDetected:`Катушка обнаружена`,assignToAms:`Назначить в AMS`,syncWeight:`Синхронизировать массу`,weightSynced:`Синхронизировано!`,syncing:`Синхронизация...`,newTagDetected:`Обнаружена новая метка`,addToInventory:`Добавить в учёт`,assignToAmsTitle:`Назначить в AMS`,selectSlot:`Выберите слот`,assign:`Назначить`,assigning:`Назначение...`,assignSuccess:`Назначено!`,assignPendingInsert:`Назначено. Слот будет настроен после установки катушки.`,assignError:`Не удалось назначить катушку. Повторите попытку.`,noPrinterSelected:`Выберите принтер...`,noAmsDetected:`На этом принтере AMS не обнаружена`,slot:`Слот`},weight:{noReading:`Нет показаний`,stable:`Стабильно`,measuring:`Измерение...`,tare:`Тарировать`,calibrate:`Калибровать`},spool:{remaining:`Остаток`,material:`Материал`,brand:`Бренд`,color:`Цвет`,coreWeight:`Сердечник`,labelWeight:`По этикетке`,scaleWeight:`По весам`,netWeight:`Нетто`,lastUsed:`Последнее использование`},ams:{noData:`AMS не обнаружена`,connectAms:`Подключите AMS, чтобы увидеть слоты филамента`,noPrinter:`Принтер не выбран`,selectPrinter:`Выберите принтер на верхней панели`,printerDisconnected:`Принтер отключён`,humidity:`Влажность`,level:`Уровень`,active:`Активен`,slot:`Слот`,empty:`Пусто`},inventory:{search:`Поиск катушек...`,empty:`В учёте нет катушек`,noResults:`Подходящие катушки не найдены`,spools:`катушек`,addSpool:`Добавить катушку`},settings:{tabDevice:`Устройство`,tabDisplay:`Экран`,tabScale:`Весы`,tabUpdates:`Обновления`,nfcReader:`Считыватель NFC`,type:`Тип`,connection:`Подключение`,notConnected:`Н/Д`,deviceInfo:`Сведения об устройстве`,hostname:`Хост`,uptime:`Время работы`,systemConfig:`Бэкенд и авторизация`,backendUrl:`URL бэкенда Bambuddy`,apiToken:`Токен API`,apiTokenPlaceholder:`Введите токен API`,saveConfig:`Сохранить конфигурацию`,systemQueued:`Конфигурация поставлена в очередь.`,nfcDiagnostic:`Диагностика NFC`,scaleDiagnostic:`Диагностика весов`,readTagDiagnostic:`Диагностика чтения метки`,testNfc:`Проверить считыватель`,testScale:`Проверить точность`,testReadTag:`Считать метку`,systemFieldsRequired:`Необходимо указать URL бэкенда.`,brightness:`Яркость`,saved:`Сохранено`,noBacklight:`Подсветка DSI не обнаружена. Для управления яркостью требуется дисплей DSI.`,screenBlank:`Тайм-аут отключения экрана`,screenBlankDesc:`Экран выключается при бездействии. Коснитесь его для пробуждения.`,displayNote:`Яркость регулируется программным фильтром.`,scaleCalibration:`Калибровка весов`,currentWeight:`Текущая масса`,tareOffset:`Тара`,calFactor:`Коэффициент`,knownWeight:`Эталонная масса`,calStep1:`Уберите всё с весов и нажмите «Установить ноль».`,calStep2:`Положите на весы груз известной массы.`,setZero:`Установить ноль`,calibrateNow:`Калибровать`,calibrated:`Откалибровано`,tareSet:`Команда тарирования отправлена. Ожидание устройства...`,tareComplete:`Тарирование завершено!`,tareTimedOut:`Истекло время ожидания тарирования — демон SpoolBuddy запущен?`,tareFailed:`Не удалось отправить команду тарирования`,zeroSet:`Нулевая точка установлена. Положите на весы груз известной массы.`,calibrationDone:`Калибровка завершена!`,calibrationFailed:`Ошибка калибровки`,lastCalibrated:`Последняя калибровка`,stable:`Стабильно`,settling:`Стабилизация...`,firmware:`Прошивка`,scale:`Весы`,noDevice:`Устройство SpoolBuddy не найдено`,daemonVersion:`Версия демона`,currentVersion:`Текущая`,versionPending:`Ожидание демона...`,checking:`Проверка...`,checkUpdates:`Проверить обновления`,updateAvailable:`Доступно обновление`,updateInstructions:`Обновление по SSH: запустите установочный скрипт SpoolBuddy.`,upToDate:`Установлена актуальная версия`,includeBeta:`Включать бета-версии`},writeTag:{tabExisting:`Существующая катушка`,tabNew:`Новая катушка`,tabReplace:`Заменить метку`,searchPlaceholder:`Поиск по материалу, цвету или бренду...`,noUntaggedSpools:`Нет катушек без меток`,noTaggedSpools:`Нет катушек с метками`,selectSpool:`Выберите катушку, затем положите чистую метку NTAG на считыватель`,placeTag:`Положите метку NTAG на считыватель`,tagReady:`Метка обнаружена — можно записывать`,writeTag:`Записать метку`,replaceTag:`Заменить метку`,writing:`Запись метки...`,waiting:`Ожидание SpoolBuddy...`,writeSuccess:`Метка успешно записана!`,writeFailed:`Ошибка записи`,queueFailed:`Не удалось поставить команду записи в очередь`,tryAgain:`Повторить`,cancel:`Отмена`,replaceWarning:`Старая метка будет отвязана и заменена новой.`,deviceOffline:`SpoolBuddy не в сети`,material:`Материал`,colorName:`Название цвета`,color:`Цвет`,brand:`Бренд`,weight:`Масса (г)`,createSpool:`Создать катушку`,creating:`Создание...`,spoolCreated:`Катушка создана! Можно записывать метку.`,createFailed:`Не удалось создать катушку`,incompleteDataWarning:`Метка записана с неполными данными Spoolman`},quickMenu:{printerPower:`Питание принтера`,systemControls:`Система`,restartDaemon:`Перезапустить демон`,restartBrowser:`Перезапустить браузер`,reboot:`Перезагрузить`,shutdown:`Выключить`,swipeToClose:`Проведите вниз, чтобы закрыть`,confirmTitle:`Подтверждение`,confirmShutdown:`Выключить SpoolBuddy? Для повторного включения потребуется физический доступ.`,confirmReboot:`Перезагрузить SpoolBuddy?`,confirmRestartDaemon:`Перезапустить демон SpoolBuddy? NFC и весы временно будут недоступны.`,confirmRestartBrowser:`Перезапустить браузер киоска? Экран ненадолго погаснет.`,confirm:`Подтвердить`,confirmPlugOn:`Включить {{name}}?`,confirmPlugOff:`Выключить {{name}}?`,turnOn:`Включить`,turnOff:`Выключить`}},diagnostic:{modalTitle:`Диагностика подключения — {{name}}`,running:`Выполняется диагностика...`,runningElapsed:`Выполняется диагностика... ({{elapsed}} с)`,waitingForReportHint:`Ожидание публикации отчёта о состоянии принтера — это может занять до {{max}} секунд.`,runFailed:`Не удалось выполнить диагностику: {{error}}`,retry:`Запустить снова`,runButton:`Запустить диагностику`,sectionTitle:`Диагностика подключения`,sectionDescription:`Проверьте, почему принтер не подключается или не печатает: доступность портов, режим разработчика LAN, сетевой режим Docker и учётные данные.`,noPrinters:`Принтеры не настроены.`,overall:{ok:`Проблем не обнаружено — подключение к принтеру исправно.`,warnings:`Принтер должен работать, но некоторые пункты требуют внимания.`,problems:`Обнаружены проблемы, объясняющие, почему принтер не подключается или не печатает.`},check:{port_mqtt:{title:`Порт управления (MQTT 8883)`,pass:`Доступен — принтер принимает управляющие подключения.`,fail:`Порт 8883 недоступен. Принтер выключен, имеет другой IP-адрес либо подключение блокирует межсетевой экран. Проверьте IP-адрес принтера и доступность порта 8883.`},port_ftps:{title:`Порт передачи файлов (FTPS 990)`,pass:`Доступен — отправка файлов печати будет работать.`,warn:`Порт 990 недоступен. Мониторинг может работать, но отправка заданий на принтер завершится ошибкой. Убедитесь, что порт 990 не заблокирован.`},external_storage:{title:`Сохранять отправленные файлы во внешнем хранилище (шаг 4 установки)`,pass:`Принтер сообщает, что параметр включён: отправленные файлы будут сохраняться на SD-карте, а в архиве появятся миниатюры и метаданные слайсера.`,fail:`Принтер сообщает, что параметр выключен. Включите «Сохранять отправленные файлы во внешнем хранилище»: в новых прошивках (P2S 01.02 / Bambu Studio 2.6+) переключатель находится в настройках печати принтера, в старых — на вкладке «Устройство» Bambu Studio / OrcaSlicer. Без этого у всех архивных заданий не будет миниатюр и метаданных слайсера.`,skip:`Не проверено — требуется активное подключение MQTT. В старых версиях слайсеров этот параметр существует только в слайсере и принтер его не сообщает, поэтому проверка может пройти даже при выключенном параметре. Проверьте шаг 4 установки вручную.`,skip_unsupported_model:`В этой модели есть слот SD-карты, но включить соответствующую функцию невозможно: текущая прошивка серии P1 не предоставляет переключатель в Bambu Studio, а у принтера нет экрана. Исправлять здесь нечего. Пока Bambu Lab не добавит поддержку в прошивку, архивные задания могут сохраняться без миниатюр и метаданных слайсера.`},port_rtsps:{title:`Порт камеры ({{protocol}} {{port}})`,pass:`Доступен — видеопоток камеры будет работать.`,warn:`Порт {{port}} недоступен. Просмотр камеры в реальном времени работать не будет. На печать это не влияет.`},network_mode:{title:`Сетевой режим Docker`,pass:`Используется сетевой режим host.`,warn:`Bambuddy запущен в Docker с сетью bridge. Для обнаружения принтеров и виртуального принтера требуется режим host — пересоздайте контейнер с параметром «network_mode: host».`,skip:`Bambuddy запущен не в Docker — проверка неприменима.`},subnet:{title:`Подсеть`,pass:`Принтер и Bambuddy находятся в одной подсети.`,warn:`Принтер ({{printer_ip}}) и Bambuddy ({{host_ip}}) находятся в разных подсетях. Без настроенной маршрутизации между подсетями они могут быть недоступны друг для друга.`,skip:`Не удалось определить подсеть — проверка пропущена.`},mqtt_auth:{title:`Учётные данные принтера`,pass:`Принтер принял подключение.`,fail:`Принтер доступен, но отклонил подключение. Скорее всего, неверны код доступа или серийный номер. Код доступа изменяется при каждом переключении режима разработчика — снова скопируйте его с экрана принтера.`,skip:`Не проверено — принтер недоступен.`},developer_mode:{title:`Режим разработчика LAN`,pass:`Режим разработчика включён.`,fail:`Режим разработчика на принтере ВЫКЛЮЧЕН. Включите его в настройках LAN принтера и подтвердите кнопкой OK. Без него задания печати не запускаются.`,skip:`Не удалось проверить — требуется активное подключение к принтеру.`},printer_publishing:{title:`Принтер публикует состояние`,pass:`Принтер публикует обновления состояния — AMS, филаменты и K-профили будут корректно передаваться в слайсер.`,fail:`MQTT-брокер принял подключение, но принтер не опубликовал ни одного отчёта о состоянии. Почти всегда причина в неверном регистре или ошибке в серийном номере: тема device//report чувствительна к регистру. Сверьте серийный номер в настройках принтера с номером на его экране.`,skip:`Не удалось проверить — требуется активное подключение к принтеру.`}}},systemHealth:{sectionTitle:`Состояние системы`,sectionDescription:`Проверяет последние журналы на известные проблемы, которые обычно можно исправить самостоятельно до обращения в поддержку.`,rescan:`Проверить снова`,clean:`В последних {{times}} записях журнала известные проблемы не найдены.`,logUnavailable:`Запись журналов в файл отключена, поэтому выполнить проверку невозможно. Включите файловое журналирование.`,learnMore:`Как исправить`,fixLabel:`Исправление:`,occurrences:`Обнаружено {{times}} раз; последний раз — {{lastSeen}}`,category:{layer8:`Можно исправить самостоятельно`,environment:`Окружение`,bug:`Сообщите об ошибке`},signature:{"ftp-auth-rejected":{name:`Принтер отклонил код доступа`,cause:`Принтер отклонил вход в службу передачи файлов. Код доступа неверен либо изменился после переключения режима разработчика.`,fix:`Снова скопируйте код доступа с экрана принтера в настройках LAN и обновите его в настройках принтера Bambuddy.`},"ftp-connection-timeout":{name:`Истекло время подключения к службе передачи файлов`,cause:`Bambuddy не смог подключиться к порту передачи файлов принтера (FTPS 990). Порт заблокирован, принтер выключен либо находится в другой подсети.`,fix:`Убедитесь, что порт 990 между Bambuddy и принтером не блокируется и оба устройства находятся в доступных друг другу сетях.`},"ftp-ssl-error":{name:`Ошибка защищённого соединения с файловой службой`,cause:`Не удалось выполнить TLS-рукопожатие с сервером передачи файлов принтера. Частые причины — межсетевой экран или устаревшая прошивка принтера.`,fix:`Обновите прошивку принтера и убедитесь, что межсетевой экран или прокси не перехватывает соединение на порту 990.`},"mqtt-connection-flapping":{name:`Подключение к принтеру постоянно обрывается`,cause:`Управляющее соединение MQTT 8883 постоянно разрывается и восстанавливается. Обычно причина в нестабильной сети или частично заблокированном порте.`,fix:`Проверьте уровень Wi‑Fi у принтера, по возможности используйте проводное подключение и убедитесь в стабильной доступности порта 8883.`},"camera-connection-refused":{name:`Видеопоток камеры недоступен`,cause:`Камера недоступна по порту RTSPS 322. Порт заблокирован либо на принтере выключены камера или просмотр по LAN.`,fix:`Включите камеру и просмотр по LAN на принтере и убедитесь, что порт 322 не заблокирован. На печать это не влияет.`},"database-locked":{name:`Конфликт записи в базу данных`,cause:`Под нагрузкой SQLite выдаёт ошибки «database is locked». Это часто происходит при одновременной работе с несколькими принтерами.`,fix:`Переведите Bambuddy на внешнюю базу PostgreSQL. См. руководство по PostgreSQL в документации.`}}},vpDiagnostic:{title:`Проверка настройки — {{name}}`,runButton:`Запустить проверку`,running:`Выполняется проверка настройки...`,runFailed:`Не удалось выполнить проверку: {{error}}`,retry:`Запустить снова`,overall:{ok:`Все проверки пройдены — виртуальный принтер настроен правильно.`,warnings:`Виртуальный принтер должен работать, но некоторые пункты требуют внимания.`,problems:`Обнаружены проблемы, из-за которых слайсер не видит или не может использовать виртуальный принтер.`},check:{enabled:{title:`Виртуальный принтер включён`,fail:`Виртуальный принтер выключен. Включите его, чтобы он обнаруживался в сети.`},running:{title:`Службы запущены`,fail:`Виртуальный принтер включён, но его службы не работают. Проверьте журнал Bambuddy: обычно запуску мешает конфликт IP-адреса привязки или ошибка прав доступа.`},bind_interface:{title:`Сетевой интерфейс привязки`,fail:`Интерфейс привязки не задан или больше не существует на этом хосте. Выберите актуальный интерфейс в списке «Интерфейс привязки».`},access_code:{title:`Код доступа задан`,fail:`Код доступа не задан. В слайсере необходимо указать тот же восьмизначный код, который задан здесь.`},target_printer:{title:`Целевой принтер`,fail:`Целевой принтер не выбран. Для режима прокси необходимо указать реальный принтер.`,warn:`Целевой принтер сейчас не в сети. Перенаправление возобновится после его подключения.`},port_ftps:{title:`Служба загрузки файлов (порт {{port}})`,fail:`На порту {{port}} выбранного IP-адреса никто не слушает, поэтому слайсер не сможет загружать файлы. Обычно причина в конфликте порта на этом интерфейсе.`},port_mqtt:{title:`Служба управления (порт {{port}})`,fail:`На порту {{port}} выбранного IP-адреса никто не слушает, поэтому слайсер не сможет подключиться и отображать состояние.`},port_bind:{title:`Служба обнаружения (порт {{port}})`,fail:`На порту {{port}} выбранного IP-адреса никто не слушает, поэтому сетевое обнаружение слайсером не работает.`},certificate:{title:`Сертификат TLS`,pass:`Сертификат готов. Убедитесь, что сертификат центра сертификации Bambuddy, указанный выше, импортирован в доверенное хранилище слайсера.`,fail:`Сертификат TLS для этого виртуального принтера отсутствует. Проверьте права записи в каталог данных Bambuddy.`}}},bugReport:{title:`Сообщить об ошибке`,description:`Описание`,descriptionPlaceholder:`Что пошло не так? Опишите проблему...`,email:`Электронная почта (необязательно)`,emailPlaceholder:`your@email.com`,emailPrivacy:`Указанный адрес будет добавлен в сворачиваемый раздел задачи GitHub, чтобы сопровождающий мог с вами связаться.`,screenshot:`Снимок экрана`,uploadOrPaste:`Загрузите, вставьте или перетащите изображение`,dataCollectedSummary:`Какие данные включаются в отчёт?`,dataIncluded:`Включаются:`,dataIncludedList:`Версия приложения, ОС, архитектура, версия Python, статистика базы данных (только количества), модели принтеров, количество сопел, версии прошивок, состояние подключений, состояние интеграций (Spoolman, MQTT, HA), неконфиденциальные настройки, количество сетевых интерфейсов, сведения о Docker и версии зависимостей.`,dataNeverIncluded:`Никогда не включаются:`,dataNeverIncludedList:`Имена принтеров, серийные номера, коды доступа, пароли, IP-адреса, адреса электронной почты, ключи API, токены, URL вебхуков, имена хостов и пользователей.`,submit:`Отправить`,startLogging:`Начать отладочную запись`,stepEnableLogging:`Отладочная запись включена`,stepReproduce:`Теперь воспроизведите проблему`,stepStopLogging:`Остановить и отправить отчёт`,stopAndSubmit:`Остановить и отправить`,maxDuration:`Автоматическая остановка через {{minutes}} мин`,stoppingLogs:`Сбор журналов и отправка...`,submitting:`Отправка отчёта об ошибке...`,submittingStepConnection:`Проверка подключений к принтерам`,submittingStepVirtualPrinters:`Проверка настройки виртуальных принтеров`,submittingStepLogScan:`Поиск известных проблем в последних журналах`,submittingStepSubmit:`Отправка отчёта в GitHub`,submitSuccess:`Отчёт об ошибке успешно отправлен!`,submitFailed:`Не удалось отправить отчёт об ошибке`,diagnosticChecking:`Проверка подключений к принтерам...`,diagnosticHealthy:`Проверка подключения пройдена — проблем с принтерами не обнаружено.`,diagnosticSummary:`Проблемы с подключением обнаружены у {{problems}} из {{total}} принтеров`,diagnosticIntro:`У одного или нескольких принтеров есть проблема подключения, которая может быть причиной сбоя. Разверните сведения о принтере ниже и посмотрите способ исправления — возможно, отчёт об ошибке не потребуется. При необходимости его всё равно можно отправить ниже.`,logHealthSummary:`В журналах найдены известные проблемы`,logHealthIntro:`Последние записи журнала совпадают с известными проблемами. Посмотрите способы исправления ниже — возможно, отчёт об ошибке не потребуется. При необходимости его всё равно можно отправить.`,thankYou:`Спасибо!`,submitted:`Отчёт об ошибке отправлен.`,viewIssue:`Открыть задачу`,unexpectedError:`Произошла непредвиденная ошибка`},failureDetection:{title:`Обнаружение сбоев с помощью ИИ`,description:`Контролируйте печать через собственный сервер Obico ML API и автоматически реагируйте на обнаруженные сбои.`,mlUrl:`URL Obico ML API`,mlUrlHint:`Базовый URL собственного контейнера Obico ml_api, например http://192.168.1.10:3333.`,test:`Проверить`,testSuccess:`ML API доступен и работает.`,testFailed:`Не удалось подключиться к ML API.`,sensitivity:`Чувствительность`,sensitivityLow:`Низкая (меньше ложных срабатываний)`,sensitivityMedium:`Средняя (сбалансированная)`,sensitivityHigh:`Высокая (раннее обнаружение, больше ложных срабатываний)`,sensitivityHint:`Определяет пороги уверенности, при которых создаются предупреждения и фиксируются сбои.`,action:`Действие при обнаружении сбоя`,actionNotify:`Только уведомить`,actionPause:`Приостановить печать`,actionPauseOff:`Приостановить печать и отключить питание`,pollInterval:`Интервал проверки (секунды)`,pollIntervalHint:`Как часто проверять каждый принтер во время печати. Минимум 5 с, максимум 120 с.`,externalUrlMissing:`Внешний URL не задан.`,externalUrlHint:`ML API получает снимок камеры по URL. Укажите внешний URL в общих настройках, чтобы контейнер ML API мог обращаться к Bambuddy.`,perPrinterTitle:`Контролируемые принтеры`,perPrinterHint:`Выберите принтеры, за которыми будет следить служба обнаружения.`,monitorAll:`Контролировать все подключённые принтеры`,statusTitle:`Состояние`,serviceRunning:`Служба работает`,thresholds:`Низкий / высокий порог`,activePrinters:`Активные задания`,noActivePrints:`Сейчас ничего не печатается.`,historyTitle:`Последние обнаружения`,noHistory:`Обнаружений пока нет.`},makerworld:{title:`MakerWorld`,description:`Вставьте URL модели MakerWorld, чтобы импортировать и напечатать её прямо из Bambuddy — без перехода в приложение Bambu Handy.`,pasteUrlHeader:`Импорт из MakerWorld`,pasteUrlPlaceholder:`https://makerworld.com/en/models/… или любая ссылка MakerWorld`,resolveButton:`Получить данные`,signInRequiredTitle:`Для загрузки требуется вход в Bambu Cloud`,signInRequiredBody:`Просматривать сведения о модели можно анонимно, но для загрузки файлов 3MF MakerWorld требует учётную запись Bambu Cloud.`,signInExpiredTitle:`Срок авторизации в Bambu Cloud истёк`,signInExpiredBody:`Вы по-прежнему авторизованы в Bambuddy, но Bambu Lab перестал принимать сохранённый токен, поэтому загрузки завершатся ошибкой. Выполните вход в Bambu Cloud снова.`,openCloudSettings:`Открыть настройки облака`,untitledModel:`Модель без названия`,byCreator:`Автор: {{name}}`,downloadsCount:`Загрузок: {{count}}`,licensePrefix:`Лицензия`,alreadyImported:`Уже в библиотеке`,openOnMakerworld:`Открыть на MakerWorld`,alreadyInLibrary:`Эта модель уже есть в библиотеке — найдите её в разделе «Файлы → MakerWorld».`,importSuccess:`Импортирован файл {{filename}} — сохранён в «Файлы → MakerWorld».`,platesHeader:`Пластины ({{count}})`,plateDefaultName:`Пластина {{n}}`,materialCount:`Филаментов: {{count}}`,amsRequired:`Требуется AMS`,slicedFor:`Нарезано для {{printer}}`,alsoCompatible:`Также отмечено как совместимое: {{printers}}`,importToLibrary:`Сохранить`,sliceIn:`Сохранить и нарезать в {{slicer}}`,disclaimer:`Интеграция с MakerWorld использует документированные сообществом конечные точки API. Bambuddy не связан с MakerWorld или Bambu Lab и не одобрен ими.`,lastImportSuccess:`Импортировано в библиотеку`,lastImportAlreadyInLibrary:`Уже в библиотеке`,viewInLibrary:`Открыть в файловом менеджере`,openInBambuStudio:`Открыть в Bambu Studio`,openInOrcaSlicer:`Открыть в OrcaSlicer`,importTo:`Импортировать в файловый менеджер`,recentImportsHeader:`Недавние импорты`,phaseResolving:`Получение данных`,phaseDownloading:`Загрузка`,folderAuto:`MakerWorld (по умолчанию)`,importAll:`Импортировать всё`,importAllProgress:`Импорт {{current}} из {{total}}`,openGallery:`Открыть галерею изображений`,galleryPrev:`Предыдущее изображение`,galleryNext:`Следующее изображение`,deleteImport:`Удалить из библиотеки`,importDeleting:`Удаление…`,importDeleted:`Удалено из библиотеки`,confirmDelete:`Удалить {{filename}} из библиотеки? Локальный файл будет удалён, но пластину можно снова импортировать из MakerWorld.`,errors:{resolveFailed:`Не удалось обработать эту ссылку MakerWorld.`,downloadFailed:`Ошибка загрузки. Повторите попытку.`,deleteFailed:`Не удалось удалить файл из библиотеки.`}},gcodeViewer:{back:`Назад`,backToArchives:`Вернуться в архив печати`,backToFiles:`Вернуться в файловый менеджер`},libraryTrash:{title:`Корзина`,headerButton:`Корзина`,headerTooltip:`Просмотреть файлы, перемещённые в корзину`,backToFiles:`Вернуться к файлам`,subtitleAdmin:`Удалённые файлы хранятся здесь {{days}} дней, затем удаляются автоматически. Показаны файлы всех пользователей.`,subtitleUser:`Удалённые файлы хранятся здесь {{days}} дней, затем удаляются автоматически.`,loading:`Загрузка корзины…`,loadError:`Не удалось загрузить корзину.`,empty:`Корзина пуста.`,summary:`{{count}} файлов · {{size}}`,emptyTrash:`Очистить корзину`,restore:`Восстановить`,purgeNow:`Удалить сейчас`,autoPurgeIn:`Автоудаление через {{when}}`,days:`дней`,retentionLabel:`Автоудаление через`,selectAll:`Выбрать всё`,selectOne:`Выбрать {{filename}}`,selectionCount:`Выбрано: {{count}}`,bulkRestore:`Восстановить выбранные`,bulkPurge:`Удалить выбранные`,col:{filename:`Файл`,folder:`Папка`,size:`Размер`,deleted:`Перемещён в корзину`,autoPurge:`Автоудаление`,owner:`Владелец`,actions:`Действия`},confirm:{purgeTitle:`Удалить навсегда?`,purgeBody:`Файл {{filename}} будет удалён с диска без возможности восстановления.`,emptyTitle:`Очистить корзину?`,emptyBody:`Все файлы ({{count}}) будут удалены с диска. Отменить это действие нельзя.`,bulkPurgeTitle:`Удалить выбранные файлы навсегда?`,bulkPurgeBody:`Выбранные файлы ({{count}}) будут удалены с диска без возможности восстановления.`,cta:`Удалить навсегда`},toast:{restored:`Файл восстановлен.`,restoreFailed:`Не удалось восстановить файл.`,purged:`Файл удалён навсегда.`,purgeFailed:`Не удалось удалить файл.`,emptied:`Из корзины удалено файлов: {{count}}.`,emptyFailed:`Не удалось очистить корзину.`,retentionSaved:`Срок автоудаления: {{days}} дней.`,retentionFailed:`Не удалось сохранить срок хранения.`,bulkRestored:`Восстановлено файлов: {{count}}.`,bulkPurged:`Удалено файлов: {{count}}.`}},libraryPurge:{title:`Очистить старые файлы`,headerButton:`Очистить старые`,headerTooltip:`Массово переместить старые файлы в корзину`,description:`За один проход убирает старые файлы из библиотеки. Для печатавшихся файлов возраст считается от даты последней печати, для ни разу не печатавшихся — от даты загрузки.`,ageLabel:`Переместить файлы старше`,days:`дней`,includeNeverPrinted:`Включить файлы, которые ни разу не печатались`,effectsTitle:`Что произойдёт после нажатия «Очистить»`,effect1:`Подходящие файлы будут перемещены в корзину, но пока не удалены с диска.`,effect2:`Их можно восстановить из корзины до окончания срока хранения.`,effect3:`После окончания срока хранения очистка корзины окончательно удалит их с диска.`,effect4:`Файлы во внешних подключённых папках пропускаются: Bambuddy не удаляет чужие данные.`,previewLoading:`Подсчёт подходящих файлов…`,previewFailed:`Не удалось выполнить предварительный расчёт.`,previewSummary:`В корзину будет перемещено: {{count}} файлов · {{size}}`,andMore:`…и ещё {{count}}`,warning:`Файлы в корзине продолжают занимать место до окончания срока хранения. Чтобы освободить диск сразу, после операции очистите корзину.`,confirmCta:`Переместить в корзину: {{count}}`,purging:`Перемещение в корзину…`,toast:{success:`Перемещено в корзину файлов: {{count}}.`,failed:`Не удалось очистить файлы.`}},libraryAutoPurge:{enableLabel:`Автоматически очищать старые файлы`,enableDescription:`Раз в сутки запускает административную очистку. Сначала файлы попадают в корзину и не удаляются немедленно.`,ageLabel:`Автоматически очищать файлы старше`,ageDescription:`Минимум 7 дней, максимум 10 лет. Используется тот же способ расчёта возраста, что и при ручной очистке.`,days:`дней`,includeNeverPrinted:`Включить файлы, которые ни разу не печатались`,saveFailed:`Не удалось сохранить настройки автоочистки.`},archivePurge:{headerButton:`Очистить старые`,headerTooltip:`Массово удалить старые записи архива`,title:`Очистить старые записи архива`,description:`Удаляет старую историю печати. Возраст записи считается от последнего завершения печати; повторная печать обновляет дату, поэтому используемые записи не удаляются.`,ageLabel:`Удалить записи, которые не печатались последние`,days:`дней`,effectsTitle:`Что произойдёт после нажатия «Очистить»`,effect1:`Каждая подходящая запись будет скрыта из списков, а связанные файлы удалены с диска: 3MF, миниатюра, таймлапс, исходный 3MF, проект F3D и фотографии.`,effect2:`Строка архива останется в базе, поэтому быстрая статистика сохранит вклад по филаменту, времени, стоимости и энергии — как при обычном удалении отдельной записи.`,effect3:`Установите флажок «Также удалить из статистики», чтобы исключить вклад из быстрой статистики. Это действие необратимо.`,effect4:`Повторная печать обновляет дату записи, поэтому используемые архивы не удаляются.`,purgeStatsLabel:`Также удалить из статистики`,purgeStatsHint:`Исключает соответствующие записи из быстрой статистики по филаменту, времени, стоимости и энергии. Без этого удаляются только файлы, а статистика сохраняется.`,previewLoading:`Подсчёт подходящих записей…`,previewFailed:`Не удалось выполнить предварительный расчёт.`,previewSummary:`Будет удалено: {{count}} записей · {{size}}`,andMore:`…и ещё {{count}}`,warning:`Файлы будут удалены с диска без возможности восстановления. Перед продолжением скачайте или добавьте в избранное всё, что нужно сохранить.`,confirmCta:`Удалить записей: {{count}}`,purging:`Удаление…`,toast:{success:`Удалено записей архива: {{count}}.`,failed:`Не удалось очистить архив.`}},archiveAutoPurge:{enableLabel:`Автоматически очищать старые записи архива`,enableDescription:`Раз в сутки скрывает записи из списков и удаляет их файлы с диска, если они не печатались в течение заданного срока. Повторная печать сбрасывает отсчёт.`,ageLabel:`Автоматически удалять записи, которые не печатались последние`,ageDescription:`Минимум 7 дней, максимум 10 лет. Срок считается от последнего завершения печати; повторная печать обновляет дату. Удаляются 3MF, миниатюра, таймлапс, исходный 3MF, F3D и фотографии.`,days:`дней`,purgeStatsLabel:`Также удалить из статистики`,purgeStatsDescription:`Если включено, ежедневная очистка исключает удалённые записи из быстрой статистики по филаменту, времени, стоимости и энергии. По умолчанию выключено: статистика сохраняется, удаляются только файлы.`,runNow:`Очистить архив сейчас`,saveFailed:`Не удалось сохранить настройки автоочистки.`},cameraTokens:{scope:{camera_stream:`Поток камеры`,camwall:`Стена камер`,overlay:`Оверлей для стрима`},title:`Токены API камеры`,navTitle:`Токены API камеры`,description:`Долгоживущие токены для встраивания видеопотока в Home Assistant, Frigate, киоски и другие системы, которым нужен постоянный URL. Каждый токен даёт доступ только к потоку камеры и может быть отозван в любой момент.`,loading:`Загрузка...`,confirmRevoke:{title:`Отозвать этот токен?`,body:`Все устройства, использующие «{{name}}», немедленно потеряют доступ. Отменить это действие нельзя.`,cancel:`Отмена`,confirm:`Отозвать`},create:{scopeLabel:`Область действия`,hintCameraStream:`Токен потока камеры позволяет получать только видеопотоки и снимки. Используйте его для Home Assistant, Frigate и других систем, встраивающих изображение с одной камеры.`,hintCamWall:`Токен стены камер открывает страницу /camwall на экране без авторизации. Он позволяет видеть названия и состояния всех принтеров, а также видеопотоки с их камер. Имена файлов, адреса и коды доступа недоступны.`,hintOverlay:`Токен оверлея для стрима открывает страницу /overlay/{printerId} на экране без авторизации — для OBS или любой прямой трансляции. Он даёт доступ к видеопотоку одного принтера и его текущему статусу печати, включая имя файла, отображаемое на экране. Адреса и коды доступа недоступны.`,title:`Создать токен`,nameLabel:`Название токена`,namePlaceholder:`Например, Home Assistant`,daysLabel:`Срок действия, дней`,submit:`Создать`,hint:`Максимальный срок действия — 365 дней. Значение токена показывается только один раз при создании — скопируйте его сейчас.`},created:{camWallUrlTitle:`URL стены камер для этого экрана`,camWallUrlHint:`Откройте этот адрес на экране. Любой, кто получит URL, сможет наблюдать за стеной камер, поэтому обращайтесь с ним как с ключом. Отзовите токен, чтобы отключить экран.`,overlayUrlTitle:`URL оверлея для OBS`,overlayUrlHint:`Добавьте этот адрес как источник браузера (Browser Source) в OBS. Замените число в /overlay/1 на номер вашего принтера (его можно узнать из URL на странице «Принтеры»). Любой, кто получит URL, сможет смотреть трансляцию, поэтому обращайтесь с ним как с ключом — отзовите токен, чтобы прекратить доступ.`,title:`Токен создан — скопируйте его сейчас`,warning:`Это единственный раз, когда токен отображается. После закрытия окна посмотреть его снова будет невозможно.`,copy:`Копировать`,dismiss:`Я сохранил токен`},list:{scope:`Область действия`,myTitle:`Мои токены`,allTitle:`Все пользователи (режим администратора)`,empty:`Токенов пока нет.`,name:`Название`,owner:`Владелец`,prefix:`Префикс`,created:`Создан`,expires:`Истекает`,lastUsed:`Последнее использование`,revoke:`Отозвать`,expired:`Истёк`},toast:{created:`Токен создан`,createFailed:`Не удалось создать токен`,revoked:`Токен отозван`,revokeFailed:`Не удалось отозвать токен`,loadFailed:`Не удалось загрузить токены`,copied:`Скопировано в буфер обмена`,copyFailed:`Не удалось скопировать — выделите и скопируйте вручную`}},forecast:{title:`Прогноз`,noSpools:`Активные катушки не найдены. Добавьте катушки в учёт, чтобы увидеть прогноз.`,noUsageData:`Нет данных о расходе — невозможно спрогнозировать остатки.`,sku:`Артикул`,material:`Материал`,stock:`Запас`,dailyRate:`Расход`,daysLeft:`Осталось дней`,emptyBy:`Закончится к`,reorderBy:`Заказать до`,actions:`Действия`,trend:`Тренд`,estimated:`Оценка`,noData:`Нет данных`,timeframe:`Период`,chartTitle:`Прогноз запаса — 5 основных материалов`,dashedLinesROP:`Пунктирные линии — точки заказа`,stockLevel:`Уровень запаса`,reorderPoint:`Точка заказа`,safetyMargin:`Страховой запас`,trendLegend:`Тренд (по истории, уровень обслуживания 95%)`,estimatedLegend:`Оценка (по изменению массы)`,noDataLegend:`Нет данных`,ropLabel:`ТЗ`,ssLabel:`СЗ`,safetyStockLegend:`Страховой запас`,stockArrivalLegend:`Поступление`,stockoutLegend:`Исчерпание запаса`,alertCount_one:`{{count}} предупреждение`,alertCount_other:`{{count}} предупреждений`,order:`Заказать`,save:`Сохранить`,cancel:`Отмена`,settingsSaved:`Настройки сохранены`,failedSaveSettings:`Не удалось сохранить настройки`,globalLeadTimeSaved:`Общий срок поставки сохранён`,globalLeadTime:`Общий срок поставки`,globalLeadTimeHint:`Минимальный общий срок поставки, используемый при расчёте точки заказа для всех артикулов`,skuLeadTimeOverride:`Переопределение срока поставки`,skuLeadTimeHint:`0 — использовать общий срок поставки. Значение больше 0 переопределяет его для этого артикула.`,safetyMarginLabel:`Страховой запас`,effectiveLeadTime:`Фактический срок поставки`,effectiveLeadTimeHint:`макс. (общий {{global}} дн., для артикула {{sku}} дн.)`,reorderPointHint:`средний расход × срок поставки + страховой запас — заказывайте, когда остаток достигнет этого уровня`,safetyMarginHint:`Статистический страховой запас (z=1,65 × σ × √LT) плюс заданный пользователем резерв`,safetyMarginHintDays:`Резерв поверх статистического страхового запаса.{{approx}}`,safetyMarginHintDaysApprox:` ≈ {{g}} г при текущем расходе.`,safetyMarginHintG:`Фиксированный весовой резерв поверх статистического страхового запаса.{{approx}}`,safetyMarginHintGApprox:` ≈ {{days}} дн. при текущем расходе.`,individualSpools:`Отдельные катушки`,labelWeight:`Метка`,spoolCount_one:`{{count}} катушка`,spoolCount_other:`{{count}} катушек`,stockBreakRisk:`Риск исчерпания запаса`,stockBreakDetail:`Осталось {{days}} дн., срок поставки {{lt}} дн.`,stockBreakBefore:`Запас закончится до пополнения`,reorderNow:`Заказать сейчас`,reorderTriggerPassed:`Дата заказа {{date}} уже прошла.`,shoppingList:`Список покупок`,shoppingListItems_one:`({{count}} позиция)`,shoppingListItems_other:`({{count}} позиций)`,shoppingListEmpty:`Список покупок пуст. Нажмите значок корзины в нужной строке, чтобы добавить позицию.`,addToCart:`Добавить в список покупок`,alertsSnoozed:`Отключить предупреждения для артикула`,alertsEnabled:`Включить предупреждения для артикула`,addedToCart:`Добавлено в список покупок`,failedAddItem:`Не удалось добавить позицию`,listView:`Список`,logisticsView:`Логистика`,qty:`Кол-во`,weight:`Масса`,leadTime:`Срок поставки`,expectedRestock:`Ожидаемое пополнение`,status:`Состояние`,note:`Примечание`,pending:`Ожидается`,purchased:`Куплено`,received:`Получено`,markPurchased:`Отметить как купленное`,markReceived:`Отметить как полученное — катушки будут добавлены в запас`,resetToPending:`Вернуть в ожидание`,remove:`Удалить`,clearAll:`Очистить всё`,downloadCsv:`CSV`,addToCartTitle:`Добавить в список покупок`,byQuantity:`По количеству`,byDuration:`По сроку`,numberOfSpools:`Количество катушек`,lastHowManyDays:`На сколько дней должно хватить?`,noUsageQty:`Нет данных о расходе — количество установлено равным 1.`,noteOptional:`Примечание (необязательно)`,notePlaceholder:`например, для проекта X, срочно…`,addNSpools_one:`Добавить {{count}} катушку`,addNSpools_other:`Добавить {{count}} катушек`,onArrival:`После поступления`,stockBreakIn:`Запас закончится через {{days}} дн.`,stockRunsOutBefore:`Запас закончится раньше, чем истекут {{lt}} дн. срока поставки.`,atRate:`При расходе {{rate}} г/день требуется`,moreSpools_one:`ещё {{count}} катушка`,moreSpools_other:`ещё {{count}} катушек`,bridgeGap:`чтобы перекрыть дефицит.`,noReadAccess:`У вас нет прав на просмотр прогноза запасов.`,noWriteAccess:`У вас нет прав на изменение настроек прогноза.`}}}},Tt=[`en`,`de`,`es`,`fr`,`ja`,`it`,`ko`,`pt-BR`,`ru`,`tr`,`zh-CN`,`zh-TW`],Et=`bambuddy_appliance_locale_consumed`;De.use(Ct).use(Ke).init({resources:wt,fallbackLng:`en`,supportedLngs:Tt,detection:{order:[`localStorage`,`navigator`,`htmlTag`],lookupLocalStorage:`bambutrack_language`,caches:[`localStorage`]},interpolation:{escapeValue:!1},react:{useSuspense:!1}});function Dt(){if(typeof window>`u`||!window.localStorage)return;let e=window.localStorage;typeof e.getItem!=`function`||typeof e.setItem!=`function`||e.getItem(Et)||fetch(`/api/v1/system/appliance`).then(e=>e.ok?e.json():null).then(t=>{!t||typeof t.locale!=`string`||Tt.includes(t.locale)&&(De.changeLanguage(t.locale),e.setItem(Et,`1`))}).catch(()=>{})}Dt();var Ot=[{code:`en`,name:`English`,nativeName:`English`},{code:`de`,name:`German`,nativeName:`Deutsch`},{code:`es`,name:`Spanish`,nativeName:`Español`},{code:`fr`,name:`French`,nativeName:`Français`},{code:`ja`,name:`Japanese`,nativeName:`日本語`},{code:`it`,name:`Italian`,nativeName:`Italiano`},{code:`ko`,name:`Korean`,nativeName:`한국어`},{code:`pt-BR`,name:`Portuguese (Brazil)`,nativeName:`Português (Brasil)`},{code:`zh-CN`,name:`Chinese (Simplified)`,nativeName:`简体中文`},{code:`zh-TW`,name:`Chinese (Traditional)`,nativeName:`繁體中文`},{code:`tr`,name:`Turkish`,nativeName:`Türkçe`},{code:`ru`,name:`Russian`,nativeName:`Русский`}],kt=`modulepreload`,At=function(e){return`/`+e},jt={},Mt=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}r=o(t.map(t=>{if(t=At(t,n),t in jt)return;jt[t]=!0;let r=t.endsWith(`.css`),i=r?`[rel="stylesheet"]`:``;if(n)for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}else if(document.querySelector(`link[href="${t}"]${i}`))return;let o=document.createElement(`link`);if(o.rel=r?`stylesheet`:kt,r||(o.as=`script`),o.crossOrigin=``,o.href=t,a&&o.setAttribute(`nonce`,a),document.head.appendChild(o),r)return new Promise((e,n)=>{o.addEventListener(`load`,e),o.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},G=`popstate`;function Nt(e){return typeof e==`object`&&!!e&&`pathname`in e&&`search`in e&&`hash`in e&&`state`in e&&`key`in e}function Pt(e={}){function t(e,t){let n=t.state?.masked,{pathname:r,search:i,hash:a}=n||e.location;return zt(``,{pathname:r,search:i,hash:a},t.state&&t.state.usr||null,t.state&&t.state.key||`default`,n?{pathname:e.location.pathname,search:e.location.search,hash:e.location.hash}:void 0)}function n(e,t){return typeof t==`string`?t:Bt(t)}return Ht(t,n,null,e)}function Ft(e,t){if(e===!1||e==null)throw Error(t)}function It(e,t){if(!e){typeof console<`u`&&console.warn(t);try{throw Error(t)}catch{}}}function Lt(){return Math.random().toString(36).substring(2,10)}function Rt(e,t){return{usr:e.state,key:e.key,idx:t,masked:e.mask?{pathname:e.pathname,search:e.search,hash:e.hash}:void 0}}function zt(e,t,n=null,r,i){return{pathname:typeof e==`string`?e:e.pathname,search:``,hash:``,...typeof t==`string`?Vt(t):t,state:n,key:t&&t.key||r||Lt(),mask:i}}function Bt({pathname:e=`/`,search:t=``,hash:n=``}){return t&&t!==`?`&&(e+=t.charAt(0)===`?`?t:`?`+t),n&&n!==`#`&&(e+=n.charAt(0)===`#`?n:`#`+n),e}function Vt(e){let t={};if(e){let n=e.indexOf(`#`);n>=0&&(t.hash=e.substring(n),e=e.substring(0,n));let r=e.indexOf(`?`);r>=0&&(t.search=e.substring(r),e=e.substring(0,r)),e&&(t.pathname=e)}return t}function Ht(e,t,n,r={}){let{window:i=document.defaultView,v5Compat:a=!1}=r,o=i.history,s=`POP`,c=null,l=u();l??(l=0,o.replaceState({...o.state,idx:l},``));function u(){return(o.state||{idx:null}).idx}function d(){s=`POP`;let e=u(),t=e==null?null:e-l;l=e,c&&c({action:s,location:h.location,delta:t})}function f(e,t){s=`PUSH`;let r=Nt(e)?e:zt(h.location,e,t);n&&n(r,e),l=u()+1;let d=Rt(r,l),f=h.createHref(r.mask||r);try{o.pushState(d,``,f)}catch(e){if(e instanceof DOMException&&e.name===`DataCloneError`)throw e;i.location.assign(f)}a&&c&&c({action:s,location:h.location,delta:1})}function p(e,t){s=`REPLACE`;let r=Nt(e)?e:zt(h.location,e,t);n&&n(r,e),l=u();let i=Rt(r,l),d=h.createHref(r.mask||r);o.replaceState(i,``,d),a&&c&&c({action:s,location:h.location,delta:0})}function m(e){return Ut(i,e)}let h={get action(){return s},get location(){return e(i,o)},listen(e){if(c)throw Error(`A history only accepts one active listener`);return i.addEventListener(G,d),c=e,()=>{i.removeEventListener(G,d),c=null}},createHref(e){return t(i,e)},createURL:m,encodeLocation(e){let t=m(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:f,replace:p,go(e){return o.go(e)}};return h}function Ut(e,t,n=!1){let r=`http://localhost`;e&&(r=e.location.origin===`null`?e.location.href:e.location.origin),Ft(r,`No window.location.(origin|href) available to create URL`);let i=typeof t==`string`?t:Bt(t);return i=i.replace(/ $/,`%20`),!n&&i.startsWith(`//`)&&(i=r+i),new URL(i,r)}function Wt(e,t,n=`/`){return Gt(e,t,n,!1)}function Gt(e,t,n,r,i){let a=dn((typeof t==`string`?Vt(t):t).pathname||`/`,n);if(a==null)return null;let o=i??qt(e),s=null,c=un(a);for(let e=0;s==null&&e{let c={relativePath:s===void 0?e.path||``:s,caseSensitive:e.caseSensitive===!0,childrenIndex:a,route:e};if(c.relativePath.startsWith(`/`)){if(!c.relativePath.startsWith(r)&&o)return;Ft(c.relativePath.startsWith(r),`Absolute route path "${c.relativePath}" nested under path "${r}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),c.relativePath=c.relativePath.slice(r.length)}let l=bn([r,c.relativePath]),u=n.concat(c);e.children&&e.children.length>0&&(Ft(e.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${l}".`),Jt(e.children,t,u,l,o)),!(e.path==null&&!e.index)&&t.push({path:l,score:an(l,e.index),routesMeta:u})};return e.forEach((e,t)=>{if(e.path===``||!e.path?.includes(`?`))a(e,t);else for(let n of Yt(e.path))a(e,t,!0,n)}),t}function Yt(e){let t=e.split(`/`);if(t.length===0)return[];let[n,...r]=t,i=n.endsWith(`?`),a=n.replace(/\?$/,``);if(r.length===0)return i?[a,``]:[a];let o=Yt(r.join(`/`)),s=[];return s.push(...o.map(e=>e===``?a:[a,e].join(`/`))),i&&s.push(...o),s.map(t=>e.startsWith(`/`)&&t===``?`/`:t)}function Xt(e){e.sort((e,t)=>e.score===t.score?on(e.routesMeta.map(e=>e.childrenIndex),t.routesMeta.map(e=>e.childrenIndex)):t.score-e.score)}var Zt=/^:[\w-]+$/,Qt=3,$t=2,en=1,tn=10,nn=-2,rn=e=>e===`*`;function an(e,t){let n=e.split(`/`),r=n.length;return n.some(rn)&&(r+=nn),t&&(r+=$t),n.filter(e=>!rn(e)).reduce((e,t)=>e+(Zt.test(t)?Qt:t===``?en:tn),r)}function on(e,t){return e.length===t.length&&e.slice(0,-1).every((e,n)=>e===t[n])?e[e.length-1]-t[t.length-1]:0}function sn(e,t,n=!1){let{routesMeta:r}=e,i={},a=`/`,o=[];for(let e=0;e{if(t===`*`){let e=s[r]||``;o=a.slice(0,a.length-e.length).replace(/(.)\/+$/,`$1`)}let i=s[r];return n&&!i?e[t]=void 0:e[t]=(i||``).replace(/%2F/g,`/`),e},{}),pathname:a,pathnameBase:o,pattern:e}}function ln(e,t=!1,n=!0){It(e===`*`||!e.endsWith(`*`)||e.endsWith(`/*`),`Route path "${e}" will be treated as if it were "${e.replace(/\*$/,`/*`)}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${e.replace(/\*$/,`/*`)}".`);let r=[],i=`^`+e.replace(/\/*\*?$/,``).replace(/^\/*/,`/`).replace(/[\\.*+^${}|()[\]]/g,`\\$&`).replace(/\/:([\w-]+)(\?)?/g,(e,t,n,i,a)=>{if(r.push({paramName:t,isOptional:n!=null}),n){let t=a.charAt(i+e.length);return t&&t!==`/`?`/([^\\/]*)`:`(?:/([^\\/]*))?`}return`/([^\\/]+)`}).replace(/\/([\w-]+)\?(\/|$)/g,`(/$1)?$2`);return e.endsWith(`*`)?(r.push({paramName:`*`}),i+=e===`*`||e===`/*`?`(.*)$`:`(?:\\/(.+)|\\/*)$`):n?i+=`\\/*$`:e!==``&&e!==`/`&&(i+=`(?:(?=\\/|$))`),[new RegExp(i,t?void 0:`i`),r]}function un(e){try{return e.split(`/`).map(e=>decodeURIComponent(e).replace(/\//g,`%2F`)).join(`/`)}catch(t){return It(!1,`The URL path "${e}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${t}).`),e}}function dn(e,t){if(t===`/`)return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let n=t.endsWith(`/`)?t.length-1:t.length,r=e.charAt(n);return r&&r!==`/`?null:e.slice(n)||`/`}var fn=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;function pn(e,t=`/`){let{pathname:n,search:r=``,hash:i=``}=typeof e==`string`?Vt(e):e,a;return n?(n=yn(n),a=n.startsWith(`/`)?mn(n.substring(1),`/`):mn(n,t)):a=t,{pathname:a,search:Cn(r),hash:wn(i)}}function mn(e,t){let n=xn(t).split(`/`);return e.split(`/`).forEach(e=>{e===`..`?n.length>1&&n.pop():e!==`.`&&n.push(e)}),n.length>1?n.join(`/`):`/`}function hn(e,t,n,r){return`Cannot include a '${e}' character in a manually specified \`to.${t}\` field [${JSON.stringify(r)}]. Please separate it out to the \`to.${n}\` field. Alternatively you may provide the full path as a string in and the router will parse it for you.`}function gn(e){return e.filter((e,t)=>t===0||e.route.path&&e.route.path.length>0)}function _n(e){let t=gn(e);return t.map((e,n)=>n===t.length-1?e.pathname:e.pathnameBase)}function vn(e,t,n,r=!1){let i;typeof e==`string`?i=Vt(e):(i={...e},Ft(!i.pathname||!i.pathname.includes(`?`),hn(`?`,`pathname`,`search`,i)),Ft(!i.pathname||!i.pathname.includes(`#`),hn(`#`,`pathname`,`hash`,i)),Ft(!i.search||!i.search.includes(`#`),hn(`#`,`search`,`hash`,i)));let a=e===``||i.pathname===``,o=a?`/`:i.pathname,s;if(o==null)s=n;else{let e=t.length-1;if(!r&&o.startsWith(`..`)){let t=o.split(`/`);for(;t[0]===`..`;)t.shift(),--e;i.pathname=t.join(`/`)}s=e>=0?t[e]:`/`}let c=pn(i,s),l=o&&o!==`/`&&o.endsWith(`/`),u=(a||o===`.`)&&n.endsWith(`/`);return!c.pathname.endsWith(`/`)&&(l||u)&&(c.pathname+=`/`),c}var yn=e=>e.replace(/\/\/+/g,`/`),bn=e=>yn(e.join(`/`)),xn=e=>e.replace(/\/+$/,``),Sn=e=>xn(e).replace(/^\/*/,`/`),Cn=e=>!e||e===`?`?``:e.startsWith(`?`)?e:`?`+e,wn=e=>!e||e===`#`?``:e.startsWith(`#`)?e:`#`+e,Tn=class{constructor(e,t,n,r=!1){this.status=e,this.statusText=t||``,this.internal=r,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}};function En(e){return e!=null&&typeof e.status==`number`&&typeof e.statusText==`string`&&typeof e.internal==`boolean`&&`data`in e}function Dn(e){return bn(e.map(e=>e.route.path).filter(Boolean))||`/`}var On=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function kn(e,t){let n=e;if(typeof n!=`string`||!fn.test(n))return{absoluteURL:void 0,isExternal:!1,to:n};let r=n,i=!1;if(On)try{let e=new URL(window.location.href),r=n.startsWith(`//`)?new URL(e.protocol+n):new URL(n),a=dn(r.pathname,t);r.origin===e.origin&&a!=null?n=a+r.search+r.hash:i=!0}catch{It(!1,` contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:r,isExternal:i,to:n}}Object.getOwnPropertyNames(Object.prototype).sort().join(`\0`);var An=[`POST`,`PUT`,`PATCH`,`DELETE`];new Set(An);var jn=[`GET`,...An];new Set(jn);var Mn=y.createContext(null);Mn.displayName=`DataRouter`;var Nn=y.createContext(null);Nn.displayName=`DataRouterState`;var Pn=y.createContext(!1);function Fn(){return y.useContext(Pn)}var In=y.createContext({isTransitioning:!1});In.displayName=`ViewTransition`;var Ln=y.createContext(new Map);Ln.displayName=`Fetchers`;var Rn=y.createContext(null);Rn.displayName=`Await`;var zn=y.createContext(null);zn.displayName=`Navigation`;var Bn=y.createContext(null);Bn.displayName=`Location`;var Vn=y.createContext({outlet:null,matches:[],isDataRoute:!1});Vn.displayName=`Route`;var Hn=y.createContext(null);Hn.displayName=`RouteError`;var Un=`REACT_ROUTER_ERROR`,Wn=`REDIRECT`,Gn=`ROUTE_ERROR_RESPONSE`;function Kn(e){if(e.startsWith(`${Un}:${Wn}:{`))try{let t=JSON.parse(e.slice(28));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`&&typeof t.location==`string`&&typeof t.reloadDocument==`boolean`&&typeof t.replace==`boolean`)return t}catch{}}function qn(e){if(e.startsWith(`${Un}:${Gn}:{`))try{let t=JSON.parse(e.slice(40));if(typeof t==`object`&&t&&typeof t.status==`number`&&typeof t.statusText==`string`)return new Tn(t.status,t.statusText,t.data)}catch{}}function Jn(e,{relative:t}={}){Ft(Yn(),`useHref() may be used only in the context of a component.`);let{basename:n,navigator:r}=y.useContext(zn),{hash:i,pathname:a,search:o}=ar(e,{relative:t}),s=a;return n!==`/`&&(s=a===`/`?n:bn([n,a])),r.createHref({pathname:s,search:o,hash:i})}function Yn(){return y.useContext(Bn)!=null}function Xn(){return Ft(Yn(),`useLocation() may be used only in the context of a component.`),y.useContext(Bn).location}var Zn=`You should call navigate() in a React.useEffect(), not when your component is first rendered.`;function Qn(e){y.useContext(zn).static||y.useLayoutEffect(e)}function $n(){let{isDataRoute:e}=y.useContext(Vn);return e?wr():er()}function er(){Ft(Yn(),`useNavigate() may be used only in the context of a component.`);let e=y.useContext(Mn),{basename:t,navigator:n}=y.useContext(zn),{matches:r}=y.useContext(Vn),{pathname:i}=Xn(),a=JSON.stringify(_n(r)),o=y.useRef(!1);return Qn(()=>{o.current=!0}),y.useCallback((r,s={})=>{if(It(o.current,Zn),!o.current)return;if(typeof r==`number`){n.go(r);return}let c=vn(r,JSON.parse(a),i,s.relative===`path`);e==null&&t!==`/`&&(c.pathname=c.pathname===`/`?t:bn([t,c.pathname])),(s.replace?n.replace:n.push)(c,s.state,s)},[t,n,a,i,e])}var tr=y.createContext(null);function nr(){return y.useContext(tr)}function rr(e){let t=y.useContext(Vn).outlet;return y.useMemo(()=>t&&y.createElement(tr.Provider,{value:e},t),[t,e])}function ir(){let{matches:e}=y.useContext(Vn);return e[e.length-1]?.params??{}}function ar(e,{relative:t}={}){let{matches:n}=y.useContext(Vn),{pathname:r}=Xn(),i=JSON.stringify(_n(n));return y.useMemo(()=>vn(e,JSON.parse(i),r,t===`path`),[e,i,r,t])}function or(e,t){return sr(e,t)}function sr(e,t,n){Ft(Yn(),`useRoutes() may be used only in the context of a component.`);let{navigator:r}=y.useContext(zn),{matches:i}=y.useContext(Vn),a=i[i.length-1],o=a?a.params:{},s=a?a.pathname:`/`,c=a?a.pathnameBase:`/`,l=a&&a.route;{let e=l&&l.path||``;Er(s,!l||e.endsWith(`*`)||e.endsWith(`*?`),`You rendered descendant (or called \`useRoutes()\`) at "${s}" (under ) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
Please change the parent to .`)}let u=Xn(),d;if(t){let e=typeof t==`string`?Vt(t):t;Ft(c===`/`||e.pathname?.startsWith(c),`When overriding the location using \`\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${c}" but pathname "${e.pathname}" was given in the \`location\` prop.`),d=e}else d=u;let f=d.pathname||`/`,p=f;if(c!==`/`){let e=c.replace(/^\//,``).split(`/`);p=`/`+f.replace(/^\//,``).split(`/`).slice(e.length).join(`/`)}let m=n&&n.state.matches.length?n.state.matches.map(e=>Object.assign(e,{route:n.manifest[e.route.id]||e.route})):Wt(e,{pathname:p});It(l||m!=null,`No routes matched location "${d.pathname}${d.search}${d.hash}" `),It(m==null||m[m.length-1].route.element!==void 0||m[m.length-1].route.Component!==void 0||m[m.length-1].route.lazy!==void 0,`Matched leaf route at location "${d.pathname}${d.search}${d.hash}" does not have an element or Component. This means it will render an with a null value by default resulting in an "empty" page.`);let h=mr(m&&m.map(e=>Object.assign({},e,{params:Object.assign({},o,e.params),pathname:bn([c,r.encodeLocation?r.encodeLocation(e.pathname.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathname]),pathnameBase:e.pathnameBase===`/`?c:bn([c,r.encodeLocation?r.encodeLocation(e.pathnameBase.replace(/%/g,`%25`).replace(/\?/g,`%3F`).replace(/#/g,`%23`)).pathname:e.pathnameBase])})),i,n);return t&&h?y.createElement(Bn.Provider,{value:{location:{pathname:`/`,search:``,hash:``,state:null,key:`default`,mask:void 0,...d},navigationType:`POP`}},h):h}function cr(){let e=Cr(),t=En(e)?`${e.status} ${e.statusText}`:e instanceof Error?e.message:JSON.stringify(e),n=e instanceof Error?e.stack:null,r=`rgba(200,200,200, 0.5)`,i={padding:`0.5rem`,backgroundColor:r},a={padding:`2px 4px`,backgroundColor:r},o=null;return console.error(`Error handled by React Router default ErrorBoundary:`,e),o=y.createElement(y.Fragment,null,y.createElement(`p`,null,`💿 Hey developer 👋`),y.createElement(`p`,null,`You can provide a way better UX than this when your app throws errors by providing your own `,y.createElement(`code`,{style:a},`ErrorBoundary`),` or`,` `,y.createElement(`code`,{style:a},`errorElement`),` prop on your route.`)),y.createElement(y.Fragment,null,y.createElement(`h2`,null,`Unexpected Application Error!`),y.createElement(`h3`,{style:{fontStyle:`italic`}},t),n?y.createElement(`pre`,{style:i},n):null,o)}var lr=y.createElement(cr,null),ur=class extends y.Component{constructor(e){super(e),this.state={location:e.location,revalidation:e.revalidation,error:e.error}}static getDerivedStateFromError(e){return{error:e}}static getDerivedStateFromProps(e,t){return t.location!==e.location||t.revalidation!==`idle`&&e.revalidation===`idle`?{error:e.error,location:e.location,revalidation:e.revalidation}:{error:e.error===void 0?t.error:e.error,location:t.location,revalidation:e.revalidation||t.revalidation}}componentDidCatch(e,t){this.props.onError?this.props.onError(e,t):console.error(`React Router caught the following error during render`,e)}render(){let e=this.state.error;if(this.context&&typeof e==`object`&&e&&`digest`in e&&typeof e.digest==`string`){let t=qn(e.digest);t&&(e=t)}let t=e===void 0?this.props.children:y.createElement(Vn.Provider,{value:this.props.routeContext},y.createElement(Hn.Provider,{value:e,children:this.props.component}));return this.context?y.createElement(fr,{error:e},t):t}};ur.contextType=Pn;var dr=new WeakMap;function fr({children:e,error:t}){let{basename:n}=y.useContext(zn);if(typeof t==`object`&&t&&`digest`in t&&typeof t.digest==`string`){let e=Kn(t.digest);if(e){let r=dr.get(t);if(r)throw r;let i=kn(e.location,n);if(On&&!dr.get(t))if(i.isExternal||e.reloadDocument)window.location.href=i.absoluteURL||i.to;else{let n=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(i.to,{replace:e.replace}));throw dr.set(t,n),n}return y.createElement(`meta`,{httpEquiv:`refresh`,content:`0;url=${i.absoluteURL||i.to}`})}}return e}function pr({routeContext:e,match:t,children:n}){let r=y.useContext(Mn);return r&&r.static&&r.staticContext&&(t.route.errorElement||t.route.ErrorBoundary)&&(r.staticContext._deepestRenderedBoundaryId=t.route.id),y.createElement(Vn.Provider,{value:e},n)}function mr(e,t=[],n){let r=n?.state;if(e==null){if(!r)return null;if(r.errors)e=r.matches;else if(t.length===0&&!r.initialized&&r.matches.length>0)e=r.matches;else return null}let i=e,a=r?.errors;if(a!=null){let e=i.findIndex(e=>e.route.id&&a?.[e.route.id]!==void 0);Ft(e>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(a).join(`,`)}`),i=i.slice(0,Math.min(i.length,e+1))}let o=!1,s=-1;if(n&&r){o=r.renderFallback;for(let e=0;e=0?i.slice(0,s+1):[i[0]];break}}}}let c=n?.onError,l=r&&c?(e,t)=>{c(e,{location:r.location,params:r.matches?.[0]?.params??{},pattern:Dn(r.matches),errorInfo:t})}:void 0;return i.reduceRight((e,n,c)=>{let u,d=!1,f=null,p=null;r&&(u=a&&n.route.id?a[n.route.id]:void 0,f=n.route.errorElement||lr,o&&(s<0&&c===0?(Er(`route-fallback`,!1,"No `HydrateFallback` element provided to render during initial hydration"),d=!0,p=null):s===c&&(d=!0,p=n.route.hydrateFallbackElement||null)));let m=t.concat(i.slice(0,c+1)),h=()=>{let t;return t=u?f:d?p:n.route.Component?y.createElement(n.route.Component,null):n.route.element?n.route.element:e,y.createElement(pr,{match:n,routeContext:{outlet:e,matches:m,isDataRoute:r!=null},children:t})};return r&&(n.route.ErrorBoundary||n.route.errorElement||c===0)?y.createElement(ur,{location:r.location,revalidation:r.revalidation,component:f,error:u,children:h(),routeContext:{outlet:null,matches:m,isDataRoute:!0},onError:l}):h()},null)}function hr(e){return`${e} must be used within a data router. See https://reactrouter.com/en/main/routers/picking-a-router.`}function gr(e){let t=y.useContext(Mn);return Ft(t,hr(e)),t}function _r(e){let t=y.useContext(Nn);return Ft(t,hr(e)),t}function vr(e){let t=y.useContext(Vn);return Ft(t,hr(e)),t}function yr(e){let t=vr(e),n=t.matches[t.matches.length-1];return Ft(n.route.id,`${e} can only be used on routes that contain a unique "id"`),n.route.id}function br(){return yr(`useRouteId`)}function xr(){let e=_r(`useNavigation`);return y.useMemo(()=>{let{matches:t,historyAction:n,...r}=e.navigation;return r},[e.navigation])}function Sr(){let{matches:e,loaderData:t}=_r(`useMatches`);return y.useMemo(()=>e.map(e=>Kt(e,t)),[e,t])}function Cr(){let e=y.useContext(Hn),t=_r(`useRouteError`),n=yr(`useRouteError`);return e===void 0?t.errors?.[n]:e}function wr(){let{router:e}=gr(`useNavigate`),t=yr(`useNavigate`),n=y.useRef(!1);return Qn(()=>{n.current=!0}),y.useCallback(async(r,i={})=>{It(n.current,Zn),n.current&&(typeof r==`number`?await e.navigate(r):await e.navigate(r,{fromRouteId:t,...i}))},[e,t])}var Tr={};function Er(e,t,n){!t&&!Tr[e]&&(Tr[e]=!0,It(!1,n))}y.memo(Dr);function Dr({routes:e,manifest:t,future:n,state:r,isStatic:i,onError:a}){return sr(e,void 0,{manifest:t,state:r,isStatic:i,onError:a,future:n})}function Or({to:e,replace:t,state:n,relative:r}){Ft(Yn(),` may be used only in the context of a component.`);let{static:i}=y.useContext(zn);It(!i,` must not be used on the initial render in a . This is a no-op, but you should modify your code so the is only ever rendered in response to some user interaction or state change.`);let{matches:a}=y.useContext(Vn),{pathname:o}=Xn(),s=$n(),c=vn(e,_n(a),o,r===`path`),l=JSON.stringify(c);return y.useEffect(()=>{s(JSON.parse(l),{replace:t,state:n,relative:r})},[s,l,r,t,n]),null}function kr(e){return rr(e.context)}function Ar(e){Ft(!1,`A is only ever to be used as the child of element, never rendered directly. Please wrap your in a .`)}function jr({basename:e=`/`,children:t=null,location:n,navigationType:r=`POP`,navigator:i,static:a=!1,useTransitions:o}){Ft(!Yn(),`You cannot render a inside another . You should never have more than one in your app.`);let s=e.replace(/^\/*/,`/`),c=y.useMemo(()=>({basename:s,navigator:i,static:a,useTransitions:o,future:{}}),[s,i,a,o]);typeof n==`string`&&(n=Vt(n));let{pathname:l=`/`,search:u=``,hash:d=``,state:f=null,key:p=`default`,mask:m}=n,h=y.useMemo(()=>{let e=dn(l,s);return e==null?null:{location:{pathname:e,search:u,hash:d,state:f,key:p,mask:m},navigationType:r}},[s,l,u,d,f,p,r,m]);return It(h!=null,` is not able to match the URL "${l}${u}${d}" because it does not start with the basename, so the won't render anything.`),h==null?null:y.createElement(zn.Provider,{value:c},y.createElement(Bn.Provider,{children:t,value:h}))}function Mr({children:e,location:t}){return or(Nr(e),t)}y.Component;function Nr(e,t=[]){let n=[];return y.Children.forEach(e,(e,r)=>{if(!y.isValidElement(e))return;let i=[...t,r];if(e.type===y.Fragment){n.push.apply(n,Nr(e.props.children,i));return}Ft(e.type===Ar,`[${typeof e.type==`string`?e.type:e.type.name}] is not a component. All component children of must be a or `),Ft(!e.props.index||!e.props.children,`An index route cannot have child routes.`);let a={id:e.props.id||i.join(`-`),caseSensitive:e.props.caseSensitive,element:e.props.element,Component:e.props.Component,index:e.props.index,path:e.props.path,middleware:e.props.middleware,loader:e.props.loader,action:e.props.action,hydrateFallbackElement:e.props.hydrateFallbackElement,HydrateFallback:e.props.HydrateFallback,errorElement:e.props.errorElement,ErrorBoundary:e.props.ErrorBoundary,hasErrorBoundary:e.props.hasErrorBoundary===!0||e.props.ErrorBoundary!=null||e.props.errorElement!=null,shouldRevalidate:e.props.shouldRevalidate,handle:e.props.handle,lazy:e.props.lazy};e.props.children&&(a.children=Nr(e.props.children,i)),n.push(a)}),n}var Pr=`get`,Fr=`application/x-www-form-urlencoded`;function Ir(e){return typeof HTMLElement<`u`&&e instanceof HTMLElement}function Lr(e){return Ir(e)&&e.tagName.toLowerCase()===`button`}function Rr(e){return Ir(e)&&e.tagName.toLowerCase()===`form`}function zr(e){return Ir(e)&&e.tagName.toLowerCase()===`input`}function Br(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function Vr(e,t){return e.button===0&&(!t||t===`_self`)&&!Br(e)}function Hr(e=``){return new URLSearchParams(typeof e==`string`||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let r=e[n];return t.concat(Array.isArray(r)?r.map(e=>[n,e]):[[n,r]])},[]))}function Ur(e,t){let n=Hr(e);return t&&t.forEach((e,r)=>{n.has(r)||t.getAll(r).forEach(e=>{n.append(r,e)})}),n}var Wr=null;function Gr(){if(Wr===null)try{new FormData(document.createElement(`form`),0),Wr=!1}catch{Wr=!0}return Wr}var Kr=new Set([`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`]);function qr(e){return e!=null&&!Kr.has(e)?(It(!1,`"${e}" is not a valid \`encType\` for \`