Просмотр исходного кода

fix(diagnostic): skip external-storage check on P1S/P1P instead of fail (#2524)

P1-series printers have a MicroSD slot but no reachable control to enable
"Store sent files on external storage": current P1 firmware (through
01.10.00.00) never publishes support_save_remote_print_file_to_storage, so
the Bambu Studio toggle never renders, and the P1S has no screen — leaving
store_to_sdcard stuck False with no way for the user to change it. The
external_storage check reported a permanently-unresolvable fail.

Add NO_REMOTE_STORAGE_TOGGLE_MODELS (P1S, P1P) + has_remote_storage_toggle(),
kept distinct from the no-slot NO_EXTERNAL_STORAGE_MODELS. When a model has a
slot but no reachable toggle and the option is off, the check now emits skip
with params reason=unsupported_model rather than fail, and overall no longer
escalates. A P1S reporting the option on still passes. Model-scoped and
default-open, so X1/P2S/H2 (where the fail is actionable) are unaffected; if
a future firmware surfaces the capability, drop the model and it reactivates.
The frontend DiagnosticChecklist renders a reason-specific message variant
(external_storage.skip_unsupported_model) so P1 users see an accurate
explanation instead of the generic "needs a live MQTT connection" skip text.
The fix propagates to the support-bundle diagnostic snapshot automatically.
maziggy 2 месяцев назад
Родитель
Сommit
6127e30abf

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
CHANGELOG.md


+ 24 - 4
backend/app/services/printer_diagnostic.py

@@ -19,7 +19,7 @@ from backend.app.schemas.printer import DiagnosticCheck, PrinterDiagnosticResult
 from backend.app.services.camera import get_camera_port
 from backend.app.services.discovery import is_running_in_docker
 from backend.app.services.printer_manager import printer_manager
-from backend.app.utils.printer_models import has_external_storage
+from backend.app.utils.printer_models import has_external_storage, has_remote_storage_toggle
 
 logger = logging.getLogger(__name__)
 
@@ -204,13 +204,33 @@ async def run_connection_diagnostic(
     # and A1 Mini). They never set home_flag bit 11, so a naive read of
     # `store_to_sdcard` would fall through to a false `fail` for every
     # A1-series user (#1703).
+    #
+    # Some models (P1-series) DO have a slot but no reachable control to turn
+    # the option on: the Bambu Studio toggle only appears when the printer
+    # publishes `support_save_remote_print_file_to_storage`, which current
+    # P1 firmware never does, and the P1S/P1P have no screen. For those,
+    # `store_to_sdcard` is stuck False with no way to fix it — report `skip`
+    # (with a reason the UI explains) instead of a permanently-red `fail`
+    # (#2524).
     state = printer_manager.get_status(printer.id) if printer else None
-    model_has_slot = has_external_storage(getattr(printer, "model", None)) if printer else True
+    model = getattr(printer, "model", None) if printer else None
+    model_has_slot = has_external_storage(model) if printer else True
+    store_to_sdcard = getattr(state, "store_to_sdcard", None) if state else None
     if not model_has_slot or state is None or not state.connected:
         checks.append(DiagnosticCheck(id="external_storage", status="skip"))
-    elif getattr(state, "store_to_sdcard", None) is True:
+    elif store_to_sdcard is True:
         checks.append(DiagnosticCheck(id="external_storage", status="pass"))
-    elif getattr(state, "store_to_sdcard", None) is False:
+    elif store_to_sdcard is False and not has_remote_storage_toggle(model):
+        # Slot present but no way to enable it on this firmware — don't nag
+        # with an unresolvable fail; explain why via the reason param.
+        checks.append(
+            DiagnosticCheck(
+                id="external_storage",
+                status="skip",
+                params={"reason": "unsupported_model"},
+            )
+        )
+    elif store_to_sdcard is False:
         checks.append(DiagnosticCheck(id="external_storage", status="fail"))
     else:
         # State exists but the field was never populated — skip rather than

+ 38 - 0
backend/app/utils/printer_models.py

@@ -137,6 +137,27 @@ NO_EXTERNAL_STORAGE_MODELS = frozenset(
 )
 
 
+# Models that HAVE a MicroSD slot but expose NO reachable control to enable
+# the "Store sent files on external storage" option. The toggle only renders
+# in Bambu Studio when the printer publishes the
+# `support_save_remote_print_file_to_storage` capability in its live status;
+# current P1-series firmware (through 01.10.00.00) never publishes it, and
+# the P1S/P1P have no on-printer screen, so `store_to_sdcard` (home_flag bit
+# 11) is stuck at False with no way for the user to change it. The
+# external_storage diagnostic must therefore skip (not fail) on these models
+# — a hard fail would be permanently unresolvable (#2524). If a future
+# firmware surfaces the capability, remove the model here and the check
+# reactivates. Bambu Lab's own storage-cache wiki lists P1 Series as "Not
+# Supported", corroborating this.
+NO_REMOTE_STORAGE_TOGGLE_MODELS = frozenset(
+    [
+        # Display names (uppercase, no spaces)
+        "P1S",
+        "P1P",
+    ]
+)
+
+
 # Models with an ethernet port.
 # X1, P1P, A1, A1 Mini do NOT have ethernet.
 ETHERNET_MODELS = frozenset(
@@ -214,6 +235,23 @@ def has_external_storage(model: str | None) -> bool:
     return normalized not in NO_EXTERNAL_STORAGE_MODELS
 
 
+def has_remote_storage_toggle(model: str | None) -> bool:
+    """Return True if the model exposes a reachable control for the
+    "Store sent files on external storage" option.
+
+    False for P1-series (has an SD slot, but no on-printer screen and no
+    published `support_save_remote_print_file_to_storage` capability, so the
+    Bambu Studio toggle never renders). The external_storage diagnostic uses
+    this to skip rather than report an unresolvable fail (#2524). Defaults to
+    True for unknown models so the check keeps working on anything not
+    explicitly listed.
+    """
+    if not model:
+        return True
+    normalized = model.strip().upper().replace(" ", "").replace("-", "")
+    return normalized not in NO_REMOTE_STORAGE_TOGGLE_MODELS
+
+
 def is_dual_nozzle_model(model: str | None) -> bool:
     """Return True if the printer model has two nozzles (H2D family / X2D)."""
     if not model:

+ 28 - 0
backend/tests/unit/services/test_printer_diagnostic.py

@@ -341,3 +341,31 @@ class TestExternalStorageCheck:
         with _Env(state=_state(store_to_sdcard=False)):
             result = await run_connection_diagnostic("192.168.1.50", printer=_printer(model="X1C"))
         assert _statuses(result)["external_storage"] == "fail"
+
+    async def test_skips_on_p1s_no_reachable_toggle(self):
+        # #2524: P1S HAS a MicroSD slot (so has_external_storage is True and
+        # the check proceeds), but current P1 firmware never publishes the
+        # capability that renders the toggle in Bambu Studio and the P1S has
+        # no screen — store_to_sdcard is stuck False with no way to fix it.
+        # Report an informational skip (with a reason the UI explains), not a
+        # permanently-unresolvable fail; overall must not escalate.
+        with _Env(state=_state(store_to_sdcard=False)):
+            result = await run_connection_diagnostic("192.168.1.50", printer=_printer(model="P1S"))
+        check = next(c for c in result.checks if c.id == "external_storage")
+        assert check.status == "skip"
+        assert check.params == {"reason": "unsupported_model"}
+        assert result.overall == "ok"
+
+    async def test_skips_on_p1p_no_reachable_toggle(self):
+        with _Env(state=_state(store_to_sdcard=False)):
+            result = await run_connection_diagnostic("192.168.1.50", printer=_printer(model="P1P"))
+        check = next(c for c in result.checks if c.id == "external_storage")
+        assert check.status == "skip"
+        assert check.params == {"reason": "unsupported_model"}
+
+    async def test_p1s_still_passes_when_store_to_sdcard_true(self):
+        # If a P1S somehow reports the option ON, respect it — pass, don't
+        # mask it as an unsupported-model skip.
+        with _Env(state=_state(store_to_sdcard=True)):
+            result = await run_connection_diagnostic("192.168.1.50", printer=_printer(model="P1S"))
+        assert _statuses(result)["external_storage"] == "pass"

+ 26 - 0
backend/tests/unit/test_printer_models.py

@@ -10,6 +10,7 @@ from backend.app.utils.printer_models import (
     get_rod_type,
     has_ethernet,
     has_external_storage,
+    has_remote_storage_toggle,
     is_dual_nozzle_model,
     normalize_printer_model,
     normalize_printer_model_id,
@@ -242,3 +243,28 @@ class TestHasExternalStorage:
     def test_none_and_empty_default_to_true(self):
         assert has_external_storage(None) is True
         assert has_external_storage("") is True
+
+
+class TestHasRemoteStorageToggle:
+    """#2524: P1-series have a slot but no reachable control to enable the
+    "Store sent files on external storage" option. The diagnostic uses this
+    to skip (not fail) on those models. A false add here would silently
+    disable the genuine fail signal for X1/P2S/H2 users."""
+
+    @pytest.mark.parametrize("model", ["P1S", "P1P", "p1s", "P1-S", "P1 S"])
+    def test_p1_series_has_no_reachable_toggle(self, model: str):
+        assert has_remote_storage_toggle(model) is False
+
+    @pytest.mark.parametrize(
+        "model",
+        ["X1C", "X1E", "X1", "P2S", "H2D", "H2D Pro", "H2C", "H2S", "X2D", "A1", "A1 Mini"],
+    )
+    def test_other_models_have_reachable_toggle(self, model: str):
+        assert has_remote_storage_toggle(model) is True
+
+    def test_unknown_and_empty_default_to_true(self):
+        # Default-true keeps the fail signal active for models not explicitly
+        # listed — the skip only applies to known no-toggle firmware.
+        assert has_remote_storage_toggle("BrandNewModel2027") is True
+        assert has_remote_storage_toggle(None) is True
+        assert has_remote_storage_toggle("") is True

+ 35 - 0
frontend/src/__tests__/components/ConnectionDiagnosticModal.test.tsx

@@ -122,4 +122,39 @@ describe('ConnectionDiagnosticModal', () => {
 
     spy.mockRestore();
   });
+
+  it('shows the unsupported-model explanation for the external_storage skip reason (#2524)', async () => {
+    const spy = vi.spyOn(api, 'diagnosePrinter').mockResolvedValue({
+      ...PROBLEM_RESULT,
+      overall: 'warnings',
+      checks: [
+        { id: 'external_storage', status: 'skip', params: { reason: 'unsupported_model' } },
+      ],
+    });
+
+    renderModal({ printerId: 1, printerName: 'Test P1S', onClose: vi.fn() });
+
+    await waitFor(() => expect(spy).toHaveBeenCalledTimes(1));
+    // The reason-specific variant renders, NOT the generic "needs a live
+    // MQTT connection" skip text.
+    expect(await screen.findByText(/no way to turn the option on/i)).toBeInTheDocument();
+    expect(screen.queryByText(/needs a live MQTT connection/i)).not.toBeInTheDocument();
+
+    spy.mockRestore();
+  });
+
+  it('falls back to the generic skip text when no reason is present', async () => {
+    const spy = vi.spyOn(api, 'diagnosePrinter').mockResolvedValue({
+      ...PROBLEM_RESULT,
+      overall: 'warnings',
+      checks: [{ id: 'external_storage', status: 'skip', params: {} }],
+    });
+
+    renderModal({ printerId: 1, printerName: 'Test X1C', onClose: vi.fn() });
+
+    await waitFor(() => expect(spy).toHaveBeenCalledTimes(1));
+    expect(await screen.findByText(/needs a live MQTT connection/i)).toBeInTheDocument();
+
+    spy.mockRestore();
+  });
 });

+ 13 - 4
frontend/src/components/ConnectionDiagnostic.tsx

@@ -44,10 +44,19 @@ export function DiagnosticChecklist({ result }: { result: PrinterDiagnosticResul
       check.id === 'port_rtsps'
         ? { protocol: 'RTSPS', port: 322, ...check.params }
         : check.params;
-    const detail = t(`diagnostic.check.${check.id}.${check.status}`, {
-      ...params,
-      defaultValue: '',
-    });
+    // A check may carry a `reason` to select a more specific message variant
+    // (e.g. external_storage skip on P1-series → skip_unsupported_model #2524);
+    // fall back to the plain per-status text when no variant key exists.
+    const reason = (check.params as { reason?: string } | undefined)?.reason;
+    const detail = t(
+      `diagnostic.check.${check.id}.${check.status}${reason ? `_${reason}` : ''}`,
+      {
+        ...params,
+        defaultValue: reason
+          ? t(`diagnostic.check.${check.id}.${check.status}`, { ...params, defaultValue: '' })
+          : '',
+      },
+    );
     return (
       <li
         key={check.id}

+ 1 - 0
frontend/src/i18n/locales/de.ts

@@ -6238,6 +6238,7 @@ export default {
         pass: 'Der Drucker meldet, dass diese Option aktiv ist — gesendete Dateien werden auf der SD-Karte gespeichert und Archive enthalten Vorschaubilder und Slicer-Metadaten.',
         fail: 'Der Drucker meldet, dass diese Option deaktiviert ist. Aktivieren Sie "Gesendete Dateien auf externem Speicher speichern" — bei neuer Firmware (P2S 01.02 / Bambu Studio 2.6+) liegt der Schalter in den Druckeinstellungen des Druckers, bei älteren Versionen im Geräte-Tab von Bambu Studio / OrcaSlicer. Ohne diese Option fehlen jedem archivierten Druck Vorschaubild und Slicer-Metadaten.',
         skip: 'Nicht geprüft — eine aktive MQTT-Verbindung ist erforderlich. Bei älteren Slicern, in denen diese Einstellung nur im Slicer existiert, meldet sie der Drucker nicht — diese Prüfung besteht auch dann, wenn die Option deaktiviert ist. Prüfen Sie Installationsschritt 4 in diesem Fall manuell.',
+        skip_unsupported_model: 'Dieses Modell hat einen SD-Slot, aber keine Möglichkeit, die Option zu aktivieren — die aktuelle P1-Firmware zeigt den Schalter in Bambu Studio nicht an und der Drucker hat kein Display. Hier gibt es nichts zu beheben; archivierten Drucken fehlen möglicherweise Vorschaubilder und Slicer-Metadaten, bis Bambu Lab dies per Firmware unterstützt.',
       },
       port_rtsps: {
         title: 'Kameraport ({{protocol}} {{port}})',

+ 1 - 0
frontend/src/i18n/locales/en.ts

@@ -6282,6 +6282,7 @@ export default {
         pass: 'The printer reports this option is on — sent files will be stored on the SD card and archives will have thumbnails and slicer metadata.',
         fail: 'The printer reports this option is off. Enable "Store sent files on external storage" — on newer firmware (P2S 01.02 / Bambu Studio 2.6+) the toggle lives on the printer\'s Print Settings; on older versions it\'s in Bambu Studio / OrcaSlicer\'s Device tab. Without it, every archived print is missing its thumbnail and slicer metadata.',
         skip: 'Not checked — needs a live MQTT connection. On older slicers where this setting lives only in the slicer the printer never reports it, so this check will pass even when the option is off — verify install step 4 manually.',
+        skip_unsupported_model: 'This model has an SD slot but no way to turn the option on — current P1-series firmware doesn\'t expose the toggle in Bambu Studio and the printer has no screen. Nothing to fix here; archived prints may lack thumbnails and slicer metadata until Bambu Lab adds firmware support.',
       },
       port_rtsps: {
         title: 'Camera port ({{protocol}} {{port}})',

+ 1 - 0
frontend/src/i18n/locales/es.ts

@@ -6247,6 +6247,7 @@ export default {
         pass: 'La impresora informa que esta opción está activada — los archivos enviados se guardarán en la tarjeta SD y los archivos tendrán miniaturas y metadatos del slicer.',
         fail: 'La impresora informa que esta opción está desactivada. Active "Almacenar archivos enviados en almacenamiento externo" — en firmware reciente (P2S 01.02 / Bambu Studio 2.6+) el conmutador está en los Ajustes de Impresión de la impresora; en versiones anteriores está en la pestaña Dispositivo de Bambu Studio / OrcaSlicer. Sin esta opción, cada impresión archivada queda sin miniatura ni metadatos del slicer.',
         skip: 'No comprobado — se necesita una conexión MQTT activa. En slicers más antiguos donde este ajuste solo existe en el slicer, la impresora no lo reporta, así que esta comprobación pasa aunque la opción esté desactivada — verifique el paso 4 de la instalación manualmente.',
+        skip_unsupported_model: 'Este modelo tiene ranura SD pero no hay forma de activar la opción — el firmware actual de la serie P1 no muestra el interruptor en Bambu Studio y la impresora no tiene pantalla. Aquí no hay nada que arreglar; a las impresiones archivadas pueden faltarles miniaturas y metadatos del slicer hasta que Bambu Lab lo admita por firmware.',
       },
       port_rtsps: {
         title: 'Puerto de la cámara ({{protocol}} {{port}})',

+ 1 - 0
frontend/src/i18n/locales/fr.ts

@@ -6228,6 +6228,7 @@ export default {
         pass: 'L\'imprimante signale que cette option est activée — les fichiers envoyés seront stockés sur la carte SD et les archives auront des miniatures et des métadonnées slicer.',
         fail: 'L\'imprimante signale que cette option est désactivée. Activez « Stocker les fichiers envoyés sur stockage externe » — sur les firmwares récents (P2S 01.02 / Bambu Studio 2.6+) l\'interrupteur se trouve dans les Paramètres d\'impression de l\'imprimante ; sur les versions antérieures, il est dans l\'onglet Périphérique de Bambu Studio / OrcaSlicer. Sans cette option, chaque impression archivée est dépourvue de miniature et de métadonnées slicer.',
         skip: 'Non vérifié — une connexion MQTT active est requise. Sur les slicers plus anciens où ce paramètre n\'existe que dans le slicer, l\'imprimante ne le signale pas, donc cette vérification passe même si l\'option est désactivée — vérifiez l\'étape 4 de l\'installation manuellement.',
+        skip_unsupported_model: 'Ce modèle a un emplacement SD mais aucun moyen d\'activer l\'option — le firmware actuel de la série P1 n\'affiche pas le bouton dans Bambu Studio et l\'imprimante n\'a pas d\'écran. Il n\'y a rien à corriger ici ; les impressions archivées peuvent manquer de miniatures et de métadonnées du slicer jusqu\'à ce que Bambu Lab l\'ajoute par firmware.',
       },
       port_rtsps: {
         title: 'Port caméra ({{protocol}} {{port}})',

+ 1 - 0
frontend/src/i18n/locales/it.ts

@@ -6227,6 +6227,7 @@ export default {
         pass: 'La stampante segnala che questa opzione è attiva — i file inviati saranno memorizzati sulla scheda SD e gli archivi avranno miniature e metadati dello slicer.',
         fail: 'La stampante segnala che questa opzione è disattivata. Abilita "Memorizza file inviati su archiviazione esterna" — nei firmware recenti (P2S 01.02 / Bambu Studio 2.6+) l\'interruttore si trova nelle Impostazioni di stampa della stampante; nelle versioni precedenti è nella scheda Dispositivo di Bambu Studio / OrcaSlicer. Senza questa opzione, ogni stampa archiviata è priva di miniatura e di metadati dello slicer.',
         skip: 'Non verificato — è necessaria una connessione MQTT attiva. Negli slicer più vecchi dove questa impostazione esiste solo nello slicer, la stampante non la segnala, quindi questo controllo passa anche se l\'opzione è disattivata — verifica manualmente il passo 4 dell\'installazione.',
+        skip_unsupported_model: 'Questo modello ha uno slot SD ma nessun modo per attivare l\'opzione — il firmware attuale della serie P1 non mostra l\'interruttore in Bambu Studio e la stampante non ha uno schermo. Non c\'è nulla da correggere qui; alle stampe archiviate potrebbero mancare miniature e metadati dello slicer finché Bambu Lab non aggiungerà il supporto via firmware.',
       },
       port_rtsps: {
         title: 'Porta fotocamera ({{protocol}} {{port}})',

+ 1 - 0
frontend/src/i18n/locales/ja.ts

@@ -6239,6 +6239,7 @@ export default {
         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}})',

+ 2 - 1
frontend/src/i18n/locales/ko.ts

@@ -6285,7 +6285,8 @@ export default {
         title: '전송된 파일을 외부 저장소에 저장 (설치 단계 4)',
         pass: '프린터가 이 옵션이 켜져 있다고 보고합니다 — 전송된 파일이 SD 카드에 저장되며 아카이브에 썸네일과 슬라이서 메타데이터가 포함됩니다.',
         fail: '프린터가 이 옵션이 꺼져 있다고 보고합니다. "전송된 파일을 외부 저장소에 저장"을 활성화하세요 — 최신 펌웨어 (P2S 01.02 / Bambu Studio 2.6 이상)에서는 프린터의 인쇄 설정에 토글이 있고, 이전 버전에서는 Bambu Studio / OrcaSlicer의 장치 탭에 있습니다. 이 옵션이 없으면 아카이브된 모든 인쇄물에 썸네일과 슬라이서 메타데이터가 없습니다.',
-        skip: '확인되지 않음 — 활성 MQTT 연결이 필요합니다. 이 설정이 슬라이서에만 존재하는 이전 슬라이서에서는 프린터가 보고하지 않으므로, 옵션이 꺼져 있어도 이 검사는 통과합니다 — 설치 단계 4를 수동으로 확인하세요.'
+        skip: '확인되지 않음 — 활성 MQTT 연결이 필요합니다. 이 설정이 슬라이서에만 존재하는 이전 슬라이서에서는 프린터가 보고하지 않으므로, 옵션이 꺼져 있어도 이 검사는 통과합니다 — 설치 단계 4를 수동으로 확인하세요.',
+        skip_unsupported_model: '이 모델에는 SD 슬롯이 있지만 옵션을 켤 방법이 없습니다 — 현재 P1 시리즈 펌웨어는 Bambu Studio에 토글을 표시하지 않으며 프린터에 화면도 없습니다. 여기서 고칠 것은 없습니다. Bambu Lab이 펌웨어로 지원할 때까지 보관된 출력물에는 썸네일과 슬라이서 메타데이터가 없을 수 있습니다.'
       },
       port_rtsps: {
         title: '카메라 포트 ({{protocol}} {{port}})',

+ 1 - 0
frontend/src/i18n/locales/pt-BR.ts

@@ -6227,6 +6227,7 @@ export default {
         pass: 'A impressora informa que esta opção está ligada — os arquivos enviados serão armazenados no cartão SD e os arquivos terão miniaturas e metadados do fatiador.',
         fail: 'A impressora informa que esta opção está desligada. Ative "Armazenar arquivos enviados no armazenamento externo" — em firmwares recentes (P2S 01.02 / Bambu Studio 2.6+) o interruptor fica nas Configurações de Impressão da impressora; em versões mais antigas, está na aba Dispositivo do Bambu Studio / OrcaSlicer. Sem essa opção, cada impressão arquivada fica sem miniatura nem metadados do fatiador.',
         skip: 'Não verificado — é necessária uma conexão MQTT ativa. Em fatiadores mais antigos onde essa configuração existe apenas no fatiador, a impressora não a reporta, então esta verificação passa mesmo com a opção desligada — verifique o passo 4 da instalação manualmente.',
+        skip_unsupported_model: 'Este modelo tem slot SD mas nenhuma forma de ativar a opção — o firmware atual da série P1 não mostra o botão no Bambu Studio e a impressora não tem tela. Não há nada a corrigir aqui; as impressões arquivadas podem ficar sem miniaturas e metadados do fatiador até que a Bambu Lab adicione suporte por firmware.',
       },
       port_rtsps: {
         title: 'Porta da câmera ({{protocol}} {{port}})',

+ 1 - 0
frontend/src/i18n/locales/tr.ts

@@ -6178,6 +6178,7 @@ export default {
         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}})',

+ 1 - 0
frontend/src/i18n/locales/zh-CN.ts

@@ -6226,6 +6226,7 @@ export default {
         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}})',

+ 1 - 0
frontend/src/i18n/locales/zh-TW.ts

@@ -6226,6 +6226,7 @@ export default {
         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}})',

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
static/assets/index-CJ6VzpV2.js


+ 1 - 1
static/index.html

@@ -26,7 +26,7 @@
 
     <!-- Splash screens for iOS -->
     <link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
-    <script type="module" crossorigin src="/assets/index-aVVJQik4.js"></script>
+    <script type="module" crossorigin src="/assets/index-CJ6VzpV2.js"></script>
     <link rel="stylesheet" crossorigin href="/assets/index-blSspT6K.css">
   </head>
   <body>

Некоторые файлы не были показаны из-за большого количества измененных файлов