Skip to content

Conversation

@lollipopkit
Copy link
Owner

@lollipopkit lollipopkit commented Jan 29, 2026

Fixes #1035


Open with Devin

Summary by CodeRabbit

  • New Features

    • Added full internationalization with locales and localized sidebar/content for multiple languages.
  • Documentation

    • Renamed product references from "Flutter Server Box" to "Server Box".
    • Added extensive translated docs (de, es, fr, ja, zh) covering installation, quick-start, troubleshooting, development, architecture, SFTP/SSH/principles, and more.
    • Removed multiple legacy docs covering appearance, backup/restore, jump server, server config, terminal, SFTP, watchOS, Docker, monitoring, network, PVE, process, and snippets.
  • Chores

    • Documentation restructure and sidebar translation updates.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 29, 2026

📝 Walkthrough

Walkthrough

Adds i18n configuration and translations to the Astro docs site, renames product references from "Flutter Server Box" to "Server Box", deletes multiple legacy English documentation pages, and adds extensive localized documentation pages (de, es, fr, ja, zh) across advanced, platforms, development, and principles sections.

Changes

Cohort / File(s) Summary
Astro config / i18n
docs/astro.config.mjs
Added defaultLocale: 'root' and locales map; introduced extensive sidebar translations at group/item level; renamed integration title to "Server Box".
English docs removed
docs/src/content/docs/configuration/..., docs/src/content/docs/features/..., docs/src/content/docs/platforms/watchos.md
Deleted multiple legacy English pages (appearance, backup, jump-server, localizations, server, sftp, terminal, docker, monitoring, network, pve, process, snippets, watchOS). Check broken links/TOC.
Localized docs — German (de)
docs/src/content/docs/de/...
Added many German docs: index, intro, installation, quick-start, advanced guides, platforms, development, principles, SFTP/SSH/state/terminal, troubleshooting, widgets.
Localized docs — Spanish (es)
docs/src/content/docs/es/...
Added Spanish equivalents: index, intro, installation, quick-start, advanced guides, platforms, development, principles, SFTP/SSH/state/terminal, troubleshooting, widgets.
Localized docs — French (fr)
docs/src/content/docs/fr/...
Added French equivalents across index, intro, installation, quick-start, advanced, platforms, development, principles, SFTP/SSH/state/terminal, troubleshooting, widgets.
Localized docs — Japanese (ja)
docs/src/content/docs/ja/...
Added Japanese equivalents across index, intro, installation, quick-start, advanced, platforms, development, principles, SFTP/SSH/state/terminal, troubleshooting, widgets.
Localized docs — Chinese (zh)
docs/src/content/docs/zh/...
Added Chinese equivalents across index, intro, installation, quick-start, advanced, platforms, development, principles, SFTP/SSH/state/terminal, troubleshooting, widgets.
English branding & minor edits
docs/src/content/docs/*.mdx, docs/src/content/docs/development/*, docs/src/content/docs/platforms/*, docs/src/styles/custom.css
Replaced "Flutter Server Box" with "Server Box" in many English docs and CSS comment; updated App Store URL(s) and minor phrasing changes.
Configuration docs edits
docs/src/content/docs/advanced/json-settings.md
Removed serverTabUseOldUI entry and renamed JSON example key timeouttimeOut; ensure references/examples elsewhere are consistent.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • new: docs website #1033 — Prior docs/site config PR that introduced the Starlight/Astro setup; directly related as both modify docs/astro.config.mjs.
🚥 Pre-merge checks | ✅ 3 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The pull request addresses issue #1035 with substantial documentation localization work, but has blocking issues identified by the reviewer that must be resolved before approval: SSH docs Dart snippet errors, Japanese JSON settings mistakes, and unimplemented desktop shortcuts. Resolve the three blocking items: fix SSH Dart snippets in all language ssh.md files, correct Japanese JSON settings (remove serverTabUseOldUI, fix timeOut key), and remove unimplemented shortcuts from Japanese desktop.md.
Title check ❓ Inconclusive The title 'opt.: docs l10n' is vague and does not clearly convey the main change. While it refers to documentation localization, it lacks specificity about what was optimized or localized. Expand the title to be more descriptive, e.g., 'docs: add localized documentation for multiple languages' or 'docs: implement i18n configuration and multi-language documentation pages'.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Out of Scope Changes check ✅ Passed The pull request primarily focuses on documentation localization (i18n) with changes to astro.config.mjs for i18n setup and removal of English documentation pages. Changes are largely in-scope with the exception of several English docs deletions that may warrant clarification of scope.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch lollipopkit/issue1035

📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f28a13a and 7bc53b0.

📒 Files selected for processing (5)
  • docs/src/content/docs/de/principles/ssh.md
  • docs/src/content/docs/es/principles/ssh.md
  • docs/src/content/docs/fr/principles/ssh.md
  • docs/src/content/docs/ja/principles/ssh.md
  • docs/src/content/docs/zh/principles/ssh.md
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/l10n/**/*.arb : Keep localized strings in ARB files under lib/l10n/ (Flutter i18n)
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/data/model/ssh/**/*.dart : Place SSH models under lib/data/model/ssh/

Applied to files:

  • docs/src/content/docs/es/principles/ssh.md
🪛 LanguageTool
docs/src/content/docs/de/principles/ssh.md

[grammar] ~6-~6: Korrigiere das Wort
Context: ...-- Verständnis der SSH-Verbindungen in Server Box. ## Verbindungsablauf ```text Benutze...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_MULTIPLE)


[style] ~16-~16: ‚Info‘ ist umgangssprachlich.
Context: ...figuration Das Spi (Server Parameter Info) Modell enthält: ```dart class Spi { ...

(MATHE)


[grammar] ~89-~89: Passe die Groß- und Kleinschreibung an
Context: ...ort verschlüsselt in Hive gespeichert - Bei Verbindung entschlüsselt - Zur Verifizi...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~90-~90: Passe die Groß- und Kleinschreibung an
Context: ...ichert - Bei Verbindung entschlüsselt - Zur Verifizierung an den Server gesendet #...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~108-~108: Passe den Tippfehler an
Context: ...entifizierung zurückgeben ### Tastatur-Interaktiv (Keyboard-Interactive) ```dart onUserI...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_OTHERCASE)


[grammar] ~108-~108: Passe den Tippfehler an
Context: ...eben ### Tastatur-Interaktiv (Keyboard-Interactive) ```dart onUserInfoRequest: (instructi...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_OTHERCASE)


[grammar] ~126-~126: Entferne ein Leerzeichen
Context: ...izieren? Verhindert Man-in-the-Middle (MITM) Angriffe, indem sichergestellt ...

(QB_NEW_DE_OTHER_ERROR_IDS_UNNECESSARY_ORTHOGRAPHY_SPACE)


[style] ~126-~126: Möglicherweise ist es stilistisch besser, eine standardsprachliche Alternative zu benutzen.
Context: ...ieren? Verhindert Man-in-the-Middle (MITM) Angriffe, indem sichergestellt wird,...

(HINTERM_MOND)


[grammar] ~126-~126: Entferne ein Leerzeichen
Context: ... Verhindert Man-in-the-Middle (MITM) Angriffe, indem sichergestellt wird, das...

(QB_NEW_DE_OTHER_ERROR_IDS_UNNECESSARY_ORTHOGRAPHY_SPACE)


[grammar] ~126-~126: Ersetze das Satzzeichen
Context: ...ird, dass Sie sich mit demselben Server verbinden. ### Speicherformat ```text {spi.id}::{keyTy...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_PUNCTUATION_PERIOD_QUESTION_MARK)


[grammar] ~297-~297: Korrigiere die Fehler
Context: ... - Timeout: 30 Sekunden (anpassbar) - Keep-Alive: Alle 30 Sekunden - **Wiede...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_MULTITOKEN)


[grammar] ~298-~298: Passe die Groß- und Kleinschreibung an
Context: ... Sekunden (anpassbar) - Keep-Alive: Alle 30 Sekunden - **Wiederholungsverzögerun...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~298-~298: Korrigiere das Wort
Context: ...sbar) - Keep-Alive: Alle 30 Sekunden - Wiederholungsverzögerung: 5 Sekunden ...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_SPACE)

docs/src/content/docs/es/principles/ssh.md

[grammar] ~8-~8: Corrige la mayúscula.
Context: ...exiones SSH en Server Box. ## Flujo de Conexión text Entrada de Usuario → Configuración Spi → genClient() → Cliente SSH → Sesión ### Paso 1: Configuración El modelo Spi (...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~32-~32: Corrige la mayúscula.
Context: ...ativa } ### Paso 2: Generación del Cliente `genClient(spi)` crea el cliente SSH: dart Future<SS...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~34-~34: Aquí puede haber un error.
Context: ...Generación del Cliente genClient(spi) crea el cliente SSH: ```dart Future<SSH...

(QB_NEW_ES)


[grammar] ~34-~34: Corrige la minúscula.
Context: ...eneración del Cliente genClient(spi) crea el cliente SSH: ```dart Future<SSHClie...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_LOWERCASE)


[grammar] ~65-~65: Corrige la mayúscula.
Context: ... client; } ``` ### Paso 3: Servidor de Salto (si está configurado) Para servidores ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~80-~80: Corrige la mayúscula.
Context: ...l socket reenviado } ## Métodos de Autenticación ### Autenticación por Contraseña dart on...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~82-~82: Corrige la mayúscula.
Context: ...de Autenticación ### Autenticación por Contraseña dart onPasswordRequest: () => spi.pwd - Contraseña almacenada cifrada en Hive - ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~88-~88: Cambia la palabra o signo.
Context: ... - Contraseña almacenada cifrada en Hive - Descifrada al conectar - Enviada al serv...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~89-~89: Cambia la palabra o signo.
Context: ...cifrada en Hive - Descifrada al conectar - Enviada al servidor para verificación #...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~90-~90: Aquí puede haber un error.
Context: ... - Enviada al servidor para verificación ### Autenticación por Clave Privada ```dart...

(QB_NEW_ES)


[grammar] ~92-~92: Corrige la mayúscula.
Context: ...ara verificación ### Autenticación por Clave Privada ```dart onIdentityRequest: () ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~92-~92: Aquí puede haber un error.
Context: ...rificación ### Autenticación por Clave Privada dart onIdentityRequest: () async { final key = await KeyStore.get(spi.keyId); return decyptPem(key.pem, key.password); } Proceso de Carga de Clave: 1. Recupera...

(QB_NEW_ES)


[grammar] ~101-~101: Corrige la mayúscula.
Context: ...pem, key.password); } ``` Proceso de Carga de Clave: 1. Recuperar clave cifrada ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~101-~101: Corrige la mayúscula.
Context: ...password); } ``` Proceso de Carga de Clave: 1. Recuperar clave cifrada de KeyStore 2....

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~102-~102: Cambia la palabra o signo.
Context: ... Clave:** 1. Recuperar clave cifrada de KeyStore 2. Descifrar contraseña (biometría/aviso) 3...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~103-~103: Cambia la palabra o signo.
Context: .... Descifrar contraseña (biometría/aviso) 3. Analizar formato PEM 4. Estandarizar fin...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~104-~104: Cambia la palabra o signo.
Context: ...biometría/aviso) 3. Analizar formato PEM 4. Estandarizar finales de línea (LF) 5. Re...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~105-~105: Cambia la palabra o signo.
Context: ...EM 4. Estandarizar finales de línea (LF) 5. Retornar para autenticación ### Interac...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~106-~106: Aquí puede haber un error.
Context: ...ínea (LF) 5. Retornar para autenticación ### Interacción por Teclado (Keyboard-Intera...

(QB_NEW_ES)


[grammar] ~108-~108: Corrige la mayúscula.
Context: ...para autenticación ### Interacción por Teclado (Keyboard-Interactive) ```dart onUserI...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~118-~118: Cambia la palabra o signo.
Context: ... Soporta: - Autenticación por contraseña - Tokens OTP - Autenticación de doble fact...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~119-~119: Cambia la palabra o signo.
Context: ...utenticación por contraseña - Tokens OTP - Autenticación de doble factor (2FA) ## ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~122-~122: Corrige la mayúscula.
Context: ... doble factor (2FA) ## Verificación de Clave de Host ### ¿Por qué verificar las cla...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~122-~122: Corrige la mayúscula.
Context: ...ctor (2FA) ## Verificación de Clave de Host ### ¿Por qué verificar las claves de host? ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~128-~128: Corrige la mayúscula.
Context: ...ctas al mismo servidor. ### Formato de Almacenamiento text {spi.id}::{keyType} Ejemplo: ```text mi-servidor::ssh-ed2551...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~140-~140: Corrige la mayúscula.
Context: ...cdsa-sha2-nistp256 ### Formatos de Huella Digital (Fingerprint) **MD5 Hex:**...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~140-~140: Corrige la mayúscula.
Context: ...a2-nistp256 ### Formatos de Huella Digital (Fingerprint) **MD5 Hex:**text aa:...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~140-~140: Corrige la mayúscula.
Context: ...56 ### Formatos de Huella Digital (Fingerprint) **MD5 Hex:**text aa:bb:cc:dd:ee:f...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~152-~152: Corrige la mayúscula.
Context: ...:AbCdEf1234567890...= ### Flujo de Verificación dart Future verifyHostKey(SSHClient client, Spi spi) async { final key = await client.hostKey; final keyType = key.type; final fingerprint = md5Hex(key); // o base64 final stored = SettingStore.sshKnownHostsFingerprints ['${spi.id}::$keyType']; if (stored == null) { // Nuevo host - preguntar al usuario final trust = await promptUser( 'Host desconocido', 'Huella: $fingerprint', ); if (trust) { SettingStore.sshKnownHostsFingerprints ['${spi.id}::$keyType'] = fingerprint; } } else if (stored != fingerprint) { // Ha cambiado - advertir al usuario await warnUser( '¡La clave de host ha cambiado!', 'Posible ataque MITM', ); } } ``` ## Gestión de Sesiones ### Pool de Conexio...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~183-~183: Corrige la mayúscula.
Context: ... MITM', ); } } ``` ## Gestión de Sesiones ### Pool de Conexiones Clientes activos man...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~185-~185: Corrige la mayúscula.
Context: ...`` ## Gestión de Sesiones ### Pool de Conexiones Clientes activos mantenidos en `ServerPr...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~210-~210: Corrige la mayúscula.
Context: ...sendKeepAlive(), ); ### Reconexión Automática Al perder la conexión: dart client.o...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~221-~221: Corrige la mayúscula.
Context: ...)); reconnect(); }); ## Ciclo de Vida de la Conexión text ┌─────────────┐...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~221-~221: Corrige la mayúscula.
Context: ...nect(); }); ## Ciclo de Vida de la Conexión text ┌─────────────┐ │ Inicial │ └──────┬──────┘ │ connect() ↓ ┌─────────────┐ │ Conectando │ ←──┐ └──────┬──────┘ │ │ éxito │ ↓ │ fallo (reintento) ┌─────────────┐ │ │ Conectado │───┘ └──────┬──────┘ │ ↓ ┌─────────────┐ │ Activo │ ──→ Enviar comandos └──────┬──────┘ │ ↓ (error/desconexión) ┌─────────────┐ │ Desconectado│ └─────────────┘ ``` ## Gestión de Errores ### Tiempo de Espera...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~249-~249: Corrige la mayúscula.
Context: ...ado│ └─────────────┘ ## Gestión de Errores ### Tiempo de Espera Agotado (Timeout) d...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~251-~251: Corrige la mayúscula.
Context: ...` ## Gestión de Errores ### Tiempo de Espera Agotado (Timeout) ```dart try { awai...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~251-~251: Corrige la mayúscula.
Context: ...estión de Errores ### Tiempo de Espera Agotado (Timeout) ```dart try { await client...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~251-~251: Corrige la mayúscula.
Context: ... Errores ### Tiempo de Espera Agotado (Timeout) ```dart try { await client.connect(...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~263-~263: Corrige la mayúscula.
Context: ...conexión agotado'); } ### Fallo de Autenticación dart onAuthFail: (error) { if (error.contains('password')) { return 'Contraseña no válida'; } else if (error.contains('key')) { return 'Clave SSH no válida'; } return 'Fallo de autenticación'; } ### Discrepancia en Clave de Host dart o...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~276-~276: Corrige la mayúscula.
Context: ...enticación'; } ### Discrepancia en Clave de Host dart onHostKeyMismatch: (st...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~276-~276: Corrige la mayúscula.
Context: ...n'; } ### Discrepancia en Clave de Host dart onHostKeyMismatch: (stored, current) { showSecurityWarning( '¡La clave de host ha cambiado!', 'Posible ataque MITM', ); } ``` ## Consideraciones de Rendimiento ### Reut...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~287-~287: Corrige la mayúscula.
Context: ...ITM', ); } ``` ## Consideraciones de Rendimiento ### Reutilización de Conexiones - Reutiliza...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~289-~289: Corrige la mayúscula.
Context: ...es de Rendimiento ### Reutilización de Conexiones - Reutilizar clientes entre funciones - No...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~291-~291: Cambia la palabra o signo.
Context: ...s - Reutilizar clientes entre funciones - No desconectar/reconectar innecesariamen...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~292-~292: Cambia la palabra o signo.
Context: ... desconectar/reconectar innecesariamente - Pool de conexiones para operaciones conc...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~293-~293: Aquí puede haber un error.
Context: ...conexiones para operaciones concurrentes ### Ajustes Óptimos - Timeout: 30 segun...

(QB_NEW_ES)


[grammar] ~295-~295: Corrige la mayúscula.
Context: ...a operaciones concurrentes ### Ajustes Óptimos - Timeout: 30 segundos (ajustable) - **K...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~297-~297: Cambia la palabra o signo.
Context: ... - Timeout: 30 segundos (ajustable) - Keep-alive: Cada 30 segundos - **Retra...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~298-~298: Cambia la palabra o signo.
Context: ...able) - Keep-alive: Cada 30 segundos - Retraso de reintento: 5 segundos ### ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~301-~301: Corrige la mayúscula.
Context: ...ntento**: 5 segundos ### Eficiencia de Red - Conexión única para múltiples operacione...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~303-~303: Cambia la palabra o signo.
Context: ...onexión única para múltiples operaciones - Comandos en tubería (pipeline) cuando se...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~304-~304: Cambia la palabra o signo.
Context: ...en tubería (pipeline) cuando sea posible - Evitar abrir múltiples conexiones

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~305-~305: Aquí puede haber un error.
Context: ...ible - Evitar abrir múltiples conexiones

(QB_NEW_ES)

docs/src/content/docs/fr/principles/ssh.md

[grammar] ~34-~34: Il y a peut-être une erreur ici
Context: ...: Génération du client genClient(spi) crée le client SSH : ```dart Future<SSH...

(QB_NEW_FR)


[grammar] ~34-~34: «  crée  » semble plus probable dans ce contexte
Context: ... Génération du client genClient(spi) crée le client SSH : ```dart Future<SSHClie...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_LOWERCASE)


[grammar] ~34-~34: Il y a peut-être une erreur ici
Context: ...client genClient(spi) crée le client SSH : dart Future<SSHClient> genClient(Spi spi) async { // 1. Établir le socket var socket = await connect(spi.ip, spi.port); // 2. Essayer l'URL alternative en cas d'échec if (socket == null && spi.alterUrl != null) { socket = await connect(spi.alterUrl, spi.port); } if (socket == null) { throw ConnectionException('Unable to connect'); } // 3. Authentifier final client = SSHClient( socket: socket, username: spi.user, onPasswordRequest: () => spi.pwd, onIdentityRequest: () => loadKey(spi.keyId), ); // 4. Vérifier la clé d'hôte await verifyHostKey(client, spi); return client; } ### Étape 3 : Serveur de rebond (si configur...

(QB_NEW_FR)


[grammar] ~67-~67: Il y a peut-être une erreur ici
Context: ... Pour les serveurs de rebond, connexion récursive : dart if (spi.jumpId != null) { final jumpClient = await genClient(getJumpSpi(spi.jumpId)); final forwarded = await jumpClient.forwardLocal( spi.ip, spi.port, ); // Se connecter via le socket transféré } ## Méthodes d'authentification ### Authent...

(QB_NEW_FR)


[grammar] ~101-~101: Il y a peut-être une erreur ici
Context: ... } ``` Processus de chargement de la clé : 1. Récupérer la clé chiffrée depuis `...

(QB_NEW_FR)


[grammar] ~102-~102: Élément manquant
Context: ...la clé :** 1. Récupérer la clé chiffrée depuis KeyStore 2. Déchiffrer le mot de passe...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_OTHER)


[grammar] ~103-~103: Il y a peut-être une erreur ici
Context: ...iffrer le mot de passe (biométrie/invite) 3. Analyser le format PEM 4. Standardis...

(QB_NEW_FR)


[grammar] ~104-~104: Élément manquant
Context: ...biométrie/invite) 3. Analyser le format PEM 4. Standardiser les fins de ligne (LF) ...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_OTHER)


[grammar] ~105-~105: Il y a peut-être une erreur ici
Context: ...EM 4. Standardiser les fins de ligne (LF) 5. Retourner pour l'authentification #...

(QB_NEW_FR)


[grammar] ~124-~124: Il y a peut-être une erreur ici
Context: ... d'hôte ### Pourquoi vérifier les clés d'hôte ? Empêche les attaques de type **Man-in-th...

(QB_NEW_FR)


[grammar] ~133-~133: Il y a peut-être une erreur ici
Context: ...ckage text {spi.id}::{keyType} Exemple : text mon-serveur::ssh-ed25519 mon-serveur::ecdsa-sha2-nistp256 ### Formats d'empreinte MD5 Hex : ```te...

(QB_NEW_FR)


[grammar] ~187-~187: Il y a peut-être une erreur ici
Context: ...Pooling) Clients actifs maintenus dans ServerProvider : dart class ServerProvider { final Map<String, SSHClient> _clients = {}; SSHClient getClient(String spiId) { return _clients[spiId] ??= connect(spiId); } } ### Keep-Alive Maintenir la connexion penda...

(QB_NEW_FR)


[grammar] ~201-~201: Il y a peut-être une erreur ici
Context: ...p-Alive Maintenir la connexion pendant l'inactivité : dart Timer.periodic( Duration(seconds: 30), (_) => client.sendKeepAlive(), ); ### Reconnexion automatique En cas de perte...

(QB_NEW_FR)


[grammar] ~297-~297: Il y a peut-être une erreur ici
Context: ...es ### Paramètres optimaux - Timeout : 30 secondes (ajustable) - **Keep-aliv...

(QB_NEW_FR)


[grammar] ~297-~297: Il y a peut-être une erreur ici
Context: ... ### Paramètres optimaux - Timeout : 30 secondes (ajustable) - Keep-alive : Toutes l...

(QB_NEW_FR)


[grammar] ~297-~297: Envisagez un remplacement
Context: ... - Timeout : 30 secondes (ajustable) - Keep-alive : Toutes les 30 secondes - ...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_SPACE_CLOSE_PARENTHESIS
CLOSE_PARENTHESIS_
)


[grammar] ~298-~298: Il y a peut-être une erreur ici
Context: ...: 30 secondes (ajustable) - Keep-alive : Toutes les 30 secondes - **Délai de r...

(QB_NEW_FR)


[grammar] ~298-~298: «  toutes  » semble plus probable dans ce contexte
Context: ...0 secondes (ajustable) - Keep-alive : Toutes les 30 secondes - *Délai de relecture...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~298-~298: Envisagez un remplacement
Context: ...justable) - Keep-alive : Toutes les 30 secondes - Délai de relecture : 5 secondes ### E...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_SPACE_
__
)


[grammar] ~299-~299: Il y a peut-être une erreur ici
Context: ...s les 30 secondes - Délai de relecture : 5 secondes ### Efficacité du réseau ...

(QB_NEW_FR)


[grammar] ~299-~299: Il y a peut-être une erreur ici
Context: ...es 30 secondes - Délai de relecture : 5 secondes ### Efficacité du réseau - Connexion unique...

(QB_NEW_FR)


[grammar] ~303-~303: Élément manquant
Context: ...seau - Connexion unique pour plusieurs opérations - Commandes en pipeline si possible - É...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_PUNCTUATION_PERIOD)


[grammar] ~304-~304: Élément manquant
Context: ...s opérations - Commandes en pipeline si possible - Éviter d'ouvrir plusieurs connexions ...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_PUNCTUATION_PERIOD)


[grammar] ~305-~305: Il y a peut-être une erreur ici
Context: ...e - Éviter d'ouvrir plusieurs connexions

(QB_NEW_FR)

docs/src/content/docs/zh/principles/ssh.md

[uncategorized] ~292-~292: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:必要"地"断开
Context: ...## 性能考量 ### 连接复用 - 在不同功能间复用客户端 - 避免不必要的断开和重连 - 为并发操作建立连接池 ### 最佳设置 - 超时时间...

(wb4)

🔇 Additional comments (10)
docs/src/content/docs/zh/principles/ssh.md (2)

36-48: Good fix: retry + fail-fast on socket creation.

Matches the required behavior (primary connect, fallback to alterUrl, throw on both failures).


154-172: Good fix: known-hosts key uses spi.id + key.type.

This removes the undefined identifiers and aligns storage with the model.

docs/src/content/docs/ja/principles/ssh.md (2)

36-48: Good fix: retry + fail-fast on socket creation.

The socket is mutable, retries alterUrl, and throws when both attempts fail.


154-172: Good fix: known-hosts key uses spi.id + key.type.

This resolves the undefined key identifiers in the example.

docs/src/content/docs/de/principles/ssh.md (2)

36-48: Good fix: retry + fail-fast on socket creation.

Primary attempt + alterUrl fallback + throw on failure is now documented.


154-172: Good fix: known-hosts key uses spi.id + key.type.

Consistent with the rest of the doc and avoids undefined identifiers.

docs/src/content/docs/fr/principles/ssh.md (2)

36-48: Good fix: retry + fail-fast on socket creation.

The example now correctly retries the alternate URL and throws if both fail.


154-172: Good fix: known-hosts key uses spi.id + key.type.

This resolves the undefined identifier issue in the snippet.

docs/src/content/docs/es/principles/ssh.md (2)

36-48: Good fix: retry + fail-fast on socket creation.

The fallback and error handling are now correctly documented.


154-172: Good fix: known-hosts key uses spi.id + key.type.

This aligns the snippet with the model and storage format.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Jan 29, 2026

Deploying serverbox with  Cloudflare Pages  Cloudflare Pages

Latest commit: 7bc53b0
Status: ✅  Deploy successful!
Preview URL: https://e4384909.serverbox.pages.dev
Branch Preview URL: https://lollipopkit-issue1035.serverbox.pages.dev

View logs

Copy link

@devin-ai-integration devin-ai-integration bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Devin Review: No Issues Found

Devin Review analyzed this PR and found no potential bugs to report.

View in Devin Review to see 3 additional flags.

Open in Devin Review

@gemini-code-assist
Copy link

Summary of Changes

Hello @lollipopkit, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request focuses on a significant enhancement to the project's documentation by implementing full localization for several languages. It involves a major overhaul of the documentation structure, transitioning from unlocalized individual files to a well-organized, language-specific directory system. Additionally, the project's branding has been updated throughout the documentation, ensuring consistency with the new 'Server Box' name.

Highlights

  • Documentation Localization: Introduced comprehensive localization support for the documentation, adding German, Spanish, French, and Japanese translations for various sections including advanced features, development, core features, introduction, installation, platform-specific functionalities, and architectural principles.
  • Documentation Restructuring: Restructured the documentation by removing several old, unlocalized .md files from the configuration directory and the watchos.md file, replacing them with new, localized versions under language-specific directories (e.g., de/, es/, fr/, ja/, zh/).
  • Project Name Update: Updated the project name from 'Flutter Server Box' to 'Server Box' across the documentation configuration, main landing pages, installation guides, and custom CSS, reflecting a branding change.
  • Sidebar Navigation Enhancements: Modified the astro.config.mjs file to include a default locale and define multiple locales, along with adding translation keys for all sidebar navigation labels and their respective items, ensuring a fully localized navigation experience.
  • Download Link Updates: Adjusted download links on the main and installation pages, removing the Google Play Store link and watchOS mentions from the primary introduction, streamlining the available download options.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces internationalization (i18n) to the documentation, adding support for multiple languages. The changes include configuring locales in Astro, adding translated markdown files, and updating the sidebar with translations. Additionally, the project name has been consistently updated from 'Flutter Server Box' to 'Server Box' across the documentation, and some outdated links and sections have been removed.

While the localization effort is a great improvement, I've noticed that with the removal of the 'Configuration' section, documentation for several key features like Jump Server, Backup & Restore, and Appearance seems to be missing from the new structure. Please see my detailed comment.

Comment on lines 37 to 48
@@ -17,73 +44,102 @@ export default defineConfig({
sidebar: [
{
label: 'Getting Started',
translations: {
zh: '开始使用',
de: 'Erste Schritte',
fr: 'Mise en route',
es: 'Primeros pasos',
ja: 'はじめに',
},
items: [
{ label: 'Introduction', slug: 'introduction' },
{ label: 'Installation', slug: 'installation' },
{ label: 'Quick Start', slug: 'quick-start' },
{ label: 'Introduction', translations: { zh: '介绍', de: 'Einführung', fr: 'Introduction', es: 'Introducción', ja: 'はじめに' }, slug: 'introduction' },
{ label: 'Installation', translations: { zh: '安装', de: 'Installation', fr: 'Installation', es: 'Instalación', ja: 'インストール' }, slug: 'installation' },
{ label: 'Quick Start', translations: { zh: '快速开始', de: 'Schnellstart', fr: 'Démarrage rapide', es: 'Inicio rápido', ja: 'クイックスタート' }, slug: 'quick-start' },
],
},
{
label: 'Features',
translations: {
zh: '特性',
de: 'Funktionen',
fr: 'Fonctionnalités',
es: 'Características',
ja: '特徴',
},
items: [
{ label: 'Server Monitoring', slug: 'features/monitoring' },
{ label: 'Docker Management', slug: 'features/docker' },
{ label: 'Process & Services', slug: 'features/process' },
{ label: 'Command Snippets', slug: 'features/snippets' },
{ label: 'Network Tools', slug: 'features/network' },
{ label: 'PVE (Proxmox)', slug: 'features/pve' },
],
},
{
label: 'Configuration',
items: [
{ label: 'Server Setup', slug: 'configuration/server' },
{ label: 'Terminal & SSH', slug: 'configuration/terminal' },
{ label: 'SFTP File Browser', slug: 'configuration/sftp' },
{ label: 'Jump Server', slug: 'configuration/jump-server' },
{ label: 'Backup & Restore', slug: 'configuration/backup' },
{ label: 'Appearance', slug: 'configuration/appearance' },
{ label: 'Localizations', slug: 'configuration/localizations' },
{ label: 'Server Monitoring', translations: { zh: '服务器监控', de: 'Server-Überwachung', fr: 'Surveillance du serveur', es: 'Monitoreo de servidor', ja: 'サーバー監視' }, slug: 'features/monitoring' },
{ label: 'Docker Management', translations: { zh: 'Docker 管理', de: 'Docker-Verwaltung', fr: 'Gestion Docker', es: 'Gestión de Docker', ja: 'Docker 管理' }, slug: 'features/docker' },
{ label: 'Process & Services', translations: { zh: '进程与服务', de: 'Prozesse & Dienste', fr: 'Processus et services', es: 'Procesos y servicios', ja: 'プロセスとサービス' }, slug: 'features/process' },
{ label: 'Command Snippets', translations: { zh: '命令片段', de: 'Befehls-Snippets', fr: 'Extraits de commande', es: 'Fragmentos de comando', ja: 'コマンドスニペット' }, slug: 'features/snippets' },
{ label: 'Network Tools', translations: { zh: '网络工具', de: 'Netzwerk-Tools', fr: 'Outils réseau', es: 'Herramientas de red', ja: 'ネットワークツール' }, slug: 'features/network' },
{ label: 'PVE (Proxmox)', translations: { zh: 'PVE (Proxmox)', de: 'PVE (Proxmox)', fr: 'PVE (Proxmox)', es: 'PVE (Proxmox)', ja: 'PVE (Proxmox)' }, slug: 'features/pve' },
],
},

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This change removes the 'Configuration' section from the sidebar, and the corresponding documentation files have also been deleted. While some topics like 'Terminal & SSH' and 'SFTP' have been moved to the 'How It Works' section, documentation for the following important configuration features appears to be missing entirely from the new structure:

  • Server Setup
  • Jump Server
  • Backup & Restore
  • Appearance
  • Localizations

If this content has been moved to other pages, please ensure they are still easily discoverable. If the removal was intentional, it might be worth considering if this information is still valuable to users. If it was an oversight, please restore the documentation for these features.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
docs/src/content/docs/principles/ssh.md (2)

36-43: Fix the invalid final reassignment in the code snippet.

Line 38 declares final socket, but line 42 reassigns it. Dart does not allow reassigning final variables. Change final socket to var socket or restructure the fallback logic to avoid reassignment.


154-156: Undefined variables in host-key storage example—inconsistent with documented format.
The documentation states the storage format as {spi.id}::{keyType}, but the code example uses undefined variables $keyId and $keyType. Replace with ${spi.id}::${key.type} or similar derived from available parameters (client, spi, key).

docs/src/content/docs/features/pve.md (1)

93-96: Update PVE version requirements—documentation is significantly outdated.

The documented requirement of PVE "6.x or 7.x" is no longer accurate. As of January 2026:

  • PVE 7 is unsupported (security support ended July 31, 2024)
  • PVE 8.x remains supported until August 31, 2026
  • PVE 9.x is the latest version (released August 5, 2025)

Update the requirements to reflect supported versions: PVE 8.x and 9.x.

docs/src/content/docs/development/architecture.md (1)

68-72: Fix duplicated step number in data-flow list.

Line 71 repeats “3.”; renumber to keep the sequence consistent (e.g., 3 → 4 → 5).

🤖 Fix all issues with AI agents
In `@docs/src/content/docs/de/principles/sftp.md`:
- Around line 292-305: The speedFormatted getter can divide by zero because
elapsed.inSeconds may be 0; update TransferProgress.speedFormatted to compute
elapsed as a floating-second value (using elapsed.inMilliseconds / 1000.0) and
guard against zero by falling back to a small nonzero denominator or using
transferred as the instantaneous rate when seconds == 0; change the calculation
in the speedFormatted getter (referencing TransferProgress, elapsed,
transferred, and formatSpeed) to use that guarded seconds value before calling
formatSpeed.
- Around line 199-211: The setPermissions example builds a shell command via
string interpolation (in setPermissions using ssh.exec('chmod $mode "$path"')),
which allows command injection; instead call the SSH client API in a way that
passes argv (avoid a single interpolated shell string) or properly
escape/validate the path and permissions before executing, or use the SFTP
client's chmod method returned by getSftpClient(spiId); update setPermissions to
either (1) use sftp.chmod(path, mode) or (2) use getSshClient(spiId) with an
exec/run method that accepts command and arguments (not a single shell string)
and validate/parsePermissions(permissions) output to ensure only numeric mode
bits are used.

In `@docs/src/content/docs/es/features/pve.md`:
- Line 95: Update the PVE version text that currently reads "Versión de PVE: 6.x
o 7.x" to reflect supported releases "PVE 8.x y 9.x" (update the visible string
"Versión de PVE" in docs content such as the Spanish entry and its counterparts
in other languages), and audit all localized/translated docs where the PVE
version is mentioned to replace the outdated 6.x/7.x constraint with "8.x y 9.x"
so it matches the code's version detection expecting PVE 8.0 or later.

In `@docs/src/content/docs/ja/advanced/json-settings.md`:
- Around line 14-61: Remove the obsolete serverTabUseOldUI section from the
document and update the timeout examples and description to use the correct JSON
key "timeOut" (capital O) everywhere (e.g., change {"timeout": 10} to
{"timeOut": 10}), leaving recordHistory and textFactor as-is; verify against the
StoreProperty definitions (e.g., occurrences of settingName = StoreProperty(...,
'timeOut', ...)) to ensure default, type and range values match the actual
setting.

In `@docs/src/content/docs/ja/features/pve.md`:
- Line 95: The docs currently state the supported Proxmox VE versions as the
text "**PVE バージョン**: 6.x または 7.x" — update this text to include current stable
releases (e.g., "**PVE バージョン**: 6.x、7.x、8.x、9.x" or similar phrasing) and scan
all language variants of the documentation for the same phrase and update them
consistently; ensure any related compatibility notes or requirements in
functions/sections referencing "PVE バージョン" are adjusted to reflect support for
8.x and 9.x as well.

In `@docs/src/content/docs/ja/platforms/desktop.md`:
- Around line 53-80: The keyboard shortcuts and multi-window claims in the
"キーボードショートカット" and "マルチウィンドウ" sections are inaccurate; update the docs to remove
or correct entries for the unimplemented shortcuts (remove "Cmd/Ctrl + N",
"Cmd/Ctrl + W", "Cmd/Ctrl + T") and the tab-drag-to-new-window statement, and
instead list only the confirmed shortcuts ("Cmd/Ctrl + ," for settings, "Cmd +
Q" for quit, and "Cmd + 1-9" for tab navigation) and explicitly note platform
limitations (menu/shortcut implementation present only on macOS / no
cross-platform menu support for Windows/Linux). Make the changes inside the
headings "### キーボードショートカット" and "### マルチウィンドウ" and retain the confirmed theme
entries (AMOLED, ライト/ダーク/システム).

In `@docs/src/content/docs/zh/features/pve.md`:
- Line 95: The doc currently lists "**PVE 版本**:6.x 或 7.x" which is outdated;
update that string to reflect supported Proxmox VE releases (e.g., "**PVE
版本**:8.x 或 9.x") and adjust any surrounding wording if necessary to indicate
"最新受支持版本(截至 2025)". Locate the exact markdown sentence containing "**PVE
版本**:6.x 或 7.x" in the PVE feature page and replace the version numbers with 8.x
or 9.x (or both) so the requirement accurately reflects current supported
releases.
🟡 Minor comments (44)
docs/src/content/docs/de/development/structure.md-10-23 (1)

10-23: Add a language to the fenced code block.
markdownlint flags this block for missing a language tag.

🔧 Suggested fix
-```
+```text
 lib/
 ├── core/              # Kern-Dienstprogramme und Erweiterungen
 ├── data/              # Datenschicht
 │   ├── model/         # Datenmodelle nach Funktionen
 │   ├── provider/      # Riverpod Provider
 │   └── store/         # Lokale Speicherung (Hive)
 ├── view/              # UI-Schicht
 │   ├── page/          # Hauptseiten
 │   └── widget/        # Wiederverwendbare Widgets
 ├── generated/         # Generierte Lokalisierung
 ├── l10n/              # Lokalisierungs-ARB-Dateien
 └── hive/              # Hive-Adapter

</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/fr/principles/sftp.md-10-37 (1)</summary><blockquote>

`10-37`: **Add a fenced code language for the architecture block (MD040).**

Markdownlint flags the ASCII diagram because the fenced block has no language. Use `text` for the diagram.

<details>
<summary>Proposed fix</summary>

```diff
-```
+```text
 ┌─────────────────────────────────────────────┐
 │              Couche UI SFTP                 │
 │  - Navigateur de fichiers (distant)         │
 │  - Navigateur de fichiers (local)           │
 │  - File d'attente de transfert              │
 └─────────────────────────────────────────────┘
                 ↓
 ┌─────────────────────────────────────────────┐
 │          Gestion de l'état SFTP             │
 │  - sftpProvider                             │
 │  - Gestion des chemins                      │
 │  - File d'attente d'opérations              │
 └─────────────────────────────────────────────┘
                 ↓
 ┌─────────────────────────────────────────────┐
 │         Couche protocole SFTP               │
 │  - Sous-système SSH                         │
 │  - Opérations sur les fichiers              │
 │  - Liste des répertoires                    │
 └─────────────────────────────────────────────┘
                 ↓
 ┌─────────────────────────────────────────────┐
 │            Transport SSH                    │
 │  - Canal sécurisé                           │
 │  - Streaming de données                     │
 └─────────────────────────────────────────────┘
-```
+```
docs/src/content/docs/fr/platforms/desktop.md-51-51 (1)

51-51: Avoid mixing English and French terms.

The phrase "au boot" mixes English with French. Use fully French terminology such as "au démarrage" or "lors du démarrage" for consistency.

📝 Proposed fix
-- Option de démarrage automatique au boot
+- Option de démarrage automatique au démarrage du système
docs/src/content/docs/fr/platforms/desktop.md-20-20 (1)

20-20: Grammar consistency: Use consistent verb form in bullet points.

The bullet point uses the infinitive "Restaurer" while other bullets use either nouns or third-person verbs (e.g., "Mémorise" on line 19). For consistency, this should be either "Restaure la session précédente au lancement" or "Restauration de la session précédente au lancement".

📝 Proposed fix for consistency
-- Restaurer la session précédente au lancement
+- Restaure la session précédente au lancement

or

-- Restaurer la session précédente au lancement
+- Restauration de la session précédente au lancement
docs/src/content/docs/de/platforms/desktop.md-49-49 (1)

49-49: Consider hyphenating the compound term for better German grammar.

In German compound nouns that incorporate English technical terms, hyphens improve readability and conform to standard orthography. "Jump List Schnellaktionen" would be clearer as "Jump-List-Schnellaktionen".

📝 Proposed fix
-- Jump List Schnellaktionen
+- Jump-List-Schnellaktionen
docs/src/content/docs/de/principles/sftp.md-10-37 (1)

10-37: Specify language for the fenced code block.

The ASCII architecture diagram should use a language identifier (e.g., text) to improve rendering and comply with markdown best practices.

📝 Proposed fix
-```
+```text
 ┌─────────────────────────────────────────────┐
 │              SFTP UI Schicht                │
docs/src/content/docs/de/features/pve.md-93-96 (1)

93-96: Update PVE version requirements to reflect current support.

The documentation specifies PVE 6.x or 7.x, but PVE 7.x support ended on 31 July 2024 and PVE 6.x is significantly older. PVE 8.x has been available since June 2023 and is currently supported (through August 2026), with PVE 9.x released in August 2025. Update the requirements to accurately reflect that PVE 8.x or 9.x are the currently supported versions.

docs/src/content/docs/ja/features/snippets.md-40-42 (1)

40-42: Keep section headings consistent in Japanese.

“### Disk Cleanup” stands out as English in an otherwise Japanese list. Consider translating it (e.g., 「ディスククリーンアップ」) for consistency.

docs/src/content/docs/zh/advanced/custom-logo.md-19-21 (1)

19-21: Add language identifiers to fenced code blocks to satisfy MD040.

🔧 Suggested diff
-```
+```text
 https://example.com/{DIST}.png

@@
- +text
https://example.com/{BRIGHT}.png

@@
-```
+```text
https://example.com/{DIST}-{BRIGHT}.png
</details>



Also applies to: 29-31, 37-39

</blockquote></details>
<details>
<summary>docs/src/content/docs/de/advanced/widgets.md-19-21 (1)</summary><blockquote>

`19-21`: **Add a language identifier to the URL example block (MD040).**

<details>
<summary>🔧 Suggested diff</summary>

```diff
-```
+```text
 https://ihr-server.com/status
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/es/advanced/widgets.md-19-21 (1)</summary><blockquote>

`19-21`: **Add a language identifier to the URL example block (MD040).**

<details>
<summary>🔧 Suggested diff</summary>

```diff
-```
+```text
 https://tu-servidor.com/status
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/ja/advanced/widgets.md-19-21 (1)</summary><blockquote>

`19-21`: **Add a language identifier to the URL example block (MD040).**

<details>
<summary>🔧 Suggested diff</summary>

```diff
-```
+```text
 https://your-server.com/status
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/ja/principles/state.md-18-36 (1)</summary><blockquote>

`18-36`: **Specify a language for the diagram block (MD040).**

<details>
<summary>🔧 Suggested diff</summary>

```diff
-```
+```text
 ┌─────────────────────────────────────────────┐
 │          UI レイヤー (Widget)               │
@@
 │  - ビジネスロジック                         │
 │  - データアクセス                           │
 └─────────────────────────────────────────────┘
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/es/development/testing.md-23-31 (1)</summary><blockquote>

`23-31`: **Add language specifier to code block.**

The code block at line 23 should specify a language for proper syntax highlighting and improved readability.



<details>
<summary>📝 Proposed fix</summary>

```diff
 

+text
test/
├── data/

</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/zh/features/snippets.md-20-22 (1)</summary><blockquote>

`20-22`: **Keep the tab label consistent (“Snippets”).**

Line 21 uses “Snippet” while Line 10 uses “Snippets”. If the UI tab is labeled “Snippets”, keep it consistent here to avoid confusing users.

</blockquote></details>
<details>
<summary>docs/src/content/docs/de/advanced/bulk-import.md-36-38 (1)</summary><blockquote>

`36-38`: **Fix markdown table separator spacing to satisfy MD060.**

markdownlint flags the separator row at Line 37 for missing spaces around pipes.  


<details>
<summary>Suggested fix</summary>

```diff
-|-------|----------|-------------|
+| ------- | ---------- | ------------- |
docs/src/content/docs/zh/advanced/bulk-import.md-36-38 (1)

36-38: Fix markdown table separator spacing to satisfy MD060.

markdownlint flags the separator row at Line 37 for missing spaces around pipes.

Suggested fix
-|-------|----------|-------------|
+| ------- | ---------- | ------------- |
docs/src/content/docs/ja/advanced/bulk-import.md-36-38 (1)

36-38: Fix markdown table separator spacing to satisfy MD060.

markdownlint flags the separator row at Line 37 for missing spaces around pipes.

Suggested fix
-|-------|----------|-------------|
+| ------- | ---------- | ------------- |
docs/src/content/docs/es/development/architecture.md-10-29 (1)

10-29: Specify languages for fenced blocks to satisfy MD040.

Both blocks are plain text diagrams; add text for clarity and lint compliance.

✅ Suggested change
-```
+```text
 ┌─────────────────────────────────────┐
 │          Capa de Presentación       │
 │         (lib/view/page/)            │
 │  - Páginas, Widgets, Controladores  │
 └─────────────────────────────────────┘
                  ↓
 ┌─────────────────────────────────────┐
 │      Capa de Lógica de Negocio      │
 │      (lib/data/provider/)           │
 │  - Riverpod Providers               │
 │  - Gestión de Estado                │
 └─────────────────────────────────────┘
                  ↓
 ┌─────────────────────────────────────┐
 │           Capa de Datos             │
 │      (lib/data/model/, store/)      │
 │  - Modelos, Almacén, Servicios      │
 └─────────────────────────────────────┘

...
- +text
Acción de Usuario → Widget → Provider → Servicio/Almacén → Actualización de Modelo → Reconstrucción de UI

Also applies to: 64-66

docs/src/content/docs/zh/advanced/widgets.md-19-21 (1)

19-21: Add a language identifier to the fenced block.

Markdownlint MD040 recommends specifying a language for fenced code blocks. Here it’s a URL, so text or url works.

✅ Suggested change
-```
+```text
 https://your-server.com/status
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/fr/development/architecture.md-64-66 (1)</summary><blockquote>

`64-66`: **Add language specifier to fenced code block.**

The data flow diagram should have a language specifier for proper rendering.


<details>
<summary>📝 Proposed fix</summary>

```diff
-```
+```text
 Action Utilisateur → Widget → Provider → Service/Store → Mise à jour Modèle → Reconstruction UI
docs/src/content/docs/fr/development/architecture.md-10-29 (1)

10-29: Add language specifier to fenced code block.

The ASCII diagram should have a language specifier for proper rendering and accessibility.

📝 Proposed fix
-```
+```text
 ┌─────────────────────────────────────┐
 │          Couche Présentation        │
docs/src/content/docs/es/development/structure.md-10-23 (1)

10-23: Add a language identifier to the fenced code block.

Markdownlint flags fenced blocks without a language tag. This will keep lint clean and improve readability.

Suggested fix
-```
+```text
 lib/
 ├── core/              # Utilidades centrales y extensiones
 ├── data/              # Capa de datos
 │   ├── model/         # Modelos de datos por función
 │   ├── provider/      # Riverpod providers
 │   └── store/         # Almacenamiento local (Hive)
 ├── view/              # Capa de UI
 │   ├── page/          # Páginas principales
 │   └── widget/        # Widgets reutilizables
 ├── generated/         # Localización generada
 ├── l10n/              # Archivos ARB de localización
 └── hive/              # Adaptadores de Hive

</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/es/advanced/troubleshooting.md-116-116 (1)</summary><blockquote>

`116-116`: **Avoid bare URLs to satisfy markdownlint (MD034).**

Replace the raw URL with a proper link.

<details>
<summary>Suggested fix</summary>

```diff
-1. **Buscar en GitHub Issues:** https://github.com/lollipopkit/flutter_server_box/issues
+1. **Buscar en GitHub Issues:** [GitHub Issues](https://github.com/lollipopkit/flutter_server_box/issues)
docs/src/content/docs/fr/advanced/troubleshooting.md-112-116 (1)

112-116: Replace the bare URL with a Markdown link.

This avoids the MD034 lint warning and improves scanability in lists.

✅ Suggested fix
-1. **Rechercher dans les Issues GitHub :** https://github.com/lollipopkit/flutter_server_box/issues
+1. **Rechercher dans les Issues GitHub :** [GitHub Issues](https://github.com/lollipopkit/flutter_server_box/issues)
docs/src/content/docs/ja/development/architecture.md-10-29 (1)

10-29: Specify a language for fenced code blocks.

This resolves MD040 and keeps markdownlint clean.

✅ Suggested fix
-```
+```text
┌─────────────────────────────────────┐
│          プレゼンテーション層       │
│         (lib/view/page/)            │
│  - ページ、ウィジェット、コントローラー  │
└─────────────────────────────────────┘
                 ↓
┌─────────────────────────────────────┐
│         ビジネスロジック層          │
│      (lib/data/provider/)           │
│  - Riverpod Provider                │
│  - 状態管理                         │
└─────────────────────────────────────┘
                 ↓
┌─────────────────────────────────────┐
│           データ層                  │
│      (lib/data/model/, store/)      │
│  - モデル、ストレージ、サービス      │
└─────────────────────────────────────┘
-```
+```

-```
+```text
ユーザーアクション → Widget → Provider → サービス/ストア → モデル更新 → UI 再構築
-```
+```

Also applies to: 64-66

docs/src/content/docs/fr/advanced/widgets.md-17-22 (1)

17-22: Add a language to the fenced URL example.

This resolves MD040.

✅ Suggested fix
-```
+```text
https://votre-serveur.com/status
-```
+```
docs/src/content/docs/zh/development/structure.md-10-23 (1)

10-23: Add a language tag to the fenced code block to satisfy MD040.

The code fence lacks a language identifier and will trigger markdownlint.

✅ Suggested fix
-```
+```text
 lib/
 ├── core/              # 核心工具类和扩展
 ├── data/              # 数据层
 │   ├── model/         # 按功能划分的数据模型
 │   ├── provider/      # Riverpod provider
 │   └── store/         # 本地存储 (Hive)
 ├── view/              # UI 层
 │   ├── page/          # 主要页面
 │   └── widget/        # 可复用组件
 ├── generated/         # 生成的本地化代码
 ├── l10n/              # 本地化 ARB 文件
 └── hive/              # Hive 适配器
-```
+```
docs/src/content/docs/ja/principles/architecture.md-10-34 (1)

10-34: Add language identifiers to fenced code blocks (MD040).

This file has multiple fenced blocks without language tags, which breaks markdownlint and reduces rendering clarity.

🧩 Proposed fix
-```
+```text
 ┌─────────────────────────────────────────────────┐
 │          プレゼンテーション層 (UI)              │
 │          lib/view/page/, lib/view/widget/       │
 │  - ページ、ウィジェット、コントローラー          │
 └─────────────────────────────────────────────────┘
                       ↓
 ┌─────────────────────────────────────────────────┐
 │         ビジネスロジック層                      │
 │         lib/data/provider/                      │
 │  - Riverpod Provider, State Notifier            │
 └─────────────────────────────────────────────────┘
                       ↓
 ┌─────────────────────────────────────────────────┐
 │           データアクセス層                      │
 │         lib/data/store/, lib/data/model/        │
 │  - Hive Store, データモデル                     │
 └─────────────────────────────────────────────────┘
                       ↓
 ┌─────────────────────────────────────────────────┐
 │         外部統合層                              │
 │  - SSH (dartssh2), ターミナル (xterm), SFTP     │
 │  - プラットフォーム固有コード (iOS, Android等)  │
 └─────────────────────────────────────────────────┘
-```
+```

-```
+```text
 make.dart (バージョン計算) → fl_build (ビルド実行) → プラットフォーム別出力
-```
+```

-```
+```text
 1. タイマーが発火 →
 2. Provider がサービスを呼び出す →
 3. サービスが SSH コマンドを実行 →
 4. レスポンスをモデルにパース →
 5. 状態が更新される →
 6. 新しいデータで UI が再構築される
-```
+```

-```
+```text
 1. ユーザーがボタンをタップ →
 2. ウィジェットが Provider のメソッドを呼び出す →
 3. Provider が状態を更新 →
 4. 状態の変化により再構築がトリガーされる →
 5. 新しい状態が UI に反映される
-```
+```

Also applies to: 170-172, 182-189, 193-199

docs/src/content/docs/de/principles/state.md-210-210 (1)

210-210: Normalize “Keep-Alive” vs keepAlive wording.

The bullet title uses “Keep-Alive” while the API uses keepAlive; consider aligning the label to avoid mixed terminology.

🔧 Suggested tweak
-- **Provider Keep-Alive**: `@Riverpod(keepAlive: true)` verwenden, um automatische Entsorgung ohne Listener zu verhindern.
+- **Provider keepAlive**: `@Riverpod(keepAlive: true)` verwenden, um automatische Entsorgung ohne Listener zu verhindern.
docs/src/content/docs/zh/development/testing.md-23-31 (1)

23-31: Add a language tag to the fenced code block.

The directory tree block lacks a language specifier, which trips MD040 and can reduce renderer consistency.

🔧 Suggested fix
-```
+```text
 test/
 ├── data/
 │   ├── model/
 │   └── provider/
 ├── view/
 │   └── widget/
 └── test_helpers.dart

</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/de/principles/state.md-18-36 (1)</summary><blockquote>

`18-36`: **Specify a language for the architecture diagram fence.**

This block currently has no language tag; `text` keeps linters and renderers happy.

<details>
<summary>🔧 Suggested fix</summary>

```diff
-```
+```text
 ┌─────────────────────────────────────────────┐
 │         UI-Schicht (Widgets)                │
 │  - ConsumerWidget / ConsumerStatefulWidget  │
 │  - ref.watch() / ref.read()                 │
 └─────────────────────────────────────────────┘
                 ↓ beobachtet (watches)
 ┌─────────────────────────────────────────────┐
 │         Provider-Schicht                    │
 │  - `@riverpod` Annotationen                   │
 │  - Generierte *.g.dart Dateien              │
 └─────────────────────────────────────────────┘
                 ↓ nutzt (uses)
 ┌─────────────────────────────────────────────┐
 │         Service- / Store-Schicht            │
 │  - Business-Logik                           │
 │  - Datenzugriff                             │
 └─────────────────────────────────────────────┘

</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/es/advanced/bulk-import.md-36-38 (1)</summary><blockquote>

`36-38`: **Fix markdown table spacing to satisfy MD060.**

The table row lacks spaces around pipes, which triggers the markdownlint rule. Consider updating the header and separator row formatting.



<details>
<summary>Proposed fix</summary>

```diff
-| Campo | Requerido | Descripción |
-|-------|-----------|-------------|
+| Campo | Requerido | Descripción |
+| ----- | --------- | ----------- |
docs/src/content/docs/zh/development/architecture.md-10-29 (1)

10-29: Add language to fenced code blocks.

MD040 requires a language tag; text is appropriate for ASCII diagrams.

Proposed fix
-```
+```text
 ┌─────────────────────────────────────┐
 │          表现层 (Presentation)      │
 │         (lib/view/page/)            │
 │  - 页面、组件、控制器                │
 └─────────────────────────────────────┘
                  ↓
 ┌─────────────────────────────────────┐
 │         业务逻辑层 (Business Logic) │
 │      (lib/data/provider/)           │
 │  - Riverpod Provider                │
 │  - 状态管理                         │
 └─────────────────────────────────────┘
                  ↓
 ┌─────────────────────────────────────┐
 │           数据层 (Data)             │
 │      (lib/data/model/, store/)      │
 │  - 模型、存储、服务                  │
 └─────────────────────────────────────┘

@@
- +text
用户操作 → Widget → Provider → 服务/存储 → 模型更新 → UI 重构

Also applies to: 64-66

docs/src/content/docs/de/advanced/troubleshooting.md-116-116 (1)

116-116: Replace bare URL with a Markdown link.

MD034 flags bare URLs; use a Markdown link to satisfy linting and improve readability.

Proposed fix
-1. **GitHub Issues durchsuchen:** https://github.com/lollipopkit/flutter_server_box/issues
+1. **GitHub Issues durchsuchen:** [GitHub Issues](https://github.com/lollipopkit/flutter_server_box/issues)
docs/src/content/docs/es/principles/state.md-18-36 (1)

18-36: Add a language tag to the ASCII diagram block.

MD040 requires a fenced language; text fits here.

Proposed fix
-```
+```text
 ┌─────────────────────────────────────────────┐
 │          Capa UI (Widgets)                  │
 │  - ConsumerWidget / ConsumerStatefulWidget  │
 │  - ref.watch() / ref.read()                 │
 └─────────────────────────────────────────────┘
                 ↓ observa (watches)
 ┌─────────────────────────────────────────────┐
 │          Capa de Provider                   │
 │  - Anotaciones `@riverpod`                    │
 │  - Archivos *.g.dart generados              │
 └─────────────────────────────────────────────┘
                 ↓ usa (uses)
 ┌─────────────────────────────────────────────┐
 │          Capa de Servicio / Store           │
 │  - Lógica de negocio                        │
 │  - Acceso a datos                           │
 └─────────────────────────────────────────────┘
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/es/principles/sftp.md-419-419 (1)</summary><blockquote>

`419-419`: **Fix typo in heading.**

There's a spelling error: "Erreores" should be "Errores" (Errors).



<details>
<summary>📝 Proposed fix</summary>

```diff
-### Erreores de Conexión
+### Errores de Conexión
docs/src/content/docs/zh/principles/terminal.md-226-248 (1)

226-248: Additional "Special Features" section only in Chinese version.

The Chinese documentation includes a "特色功能" (Special Features) section with executeSnippet and openSftp examples (lines 226-248) that other language versions lack. This should be synchronized across all documentation.

Consider either:

  • Adding this valuable "Special Features" section to all other language versions (de, es, fr, ja), or
  • Moving it to a separate advanced features page that can be referenced from all versions

This ensures users of all languages have access to the same level of documentation detail.

docs/src/content/docs/zh/principles/terminal.md-118-140 (1)

118-140: Documentation inconsistency: Chinese version contains additional content not present in other language versions.

The Chinese documentation (248 lines) includes extra sections not found in de, es, fr, and ja versions (all 198 lines):

  • TerminalTabs class implementation (lines 118-140)
  • executeSnippet section (included in "特色功能" section starting around line 226)

Decide whether this additional content should be:

  1. Added to all other language versions for consistency, or
  2. Removed from the Chinese version to maintain parity with other languages
docs/astro.config.mjs-9-10 (1)

9-10: Doc site title still uses the old brand name.

Most docs pages now use “Server Box”; consider updating the site title to keep navigation and SEO consistent.

Suggested fix
-			title: 'Flutter Server Box',
+			title: 'Server Box',
docs/src/content/docs/es/principles/ssh.md-150-166 (1)

150-166: Fix undefined variables in storage key to match documented {spi.id}::{keyType} format.

The code references undefined keyId and keyType variables. keyId should use spi.id and keyType should be extracted from key.type, as specified in the documentation.

Suggested fix
 Future<void> verifyHostKey(SSHClient client, Spi spi) async {
   final key = await client.hostKey;
   final fingerprint = md5Hex(key); // o base64

+  final keyType = key.type;
   final stored = SettingStore.sshKnownHostsFingerprints
-      ['$keyId::$keyType'];
+      ['${spi.id}::$keyType'];

   if (stored == null) {
     // Nuevo host - preguntar al usuario
     final trust = await promptUser(
       'Host desconocido',
       'Huella: $fingerprint',
     );
     if (trust) {
       SettingStore.sshKnownHostsFingerprints
-          ['$keyId::$keyType'] = fingerprint;
+          ['${spi.id}::$keyType'] = fingerprint;
     }
docs/src/content/docs/es/principles/ssh.md-36-43 (1)

36-43: Change final to var and add null check before creating SSHClient.

Line 38: final socket cannot be reassigned on line 42; use var instead. Additionally, if both connect() calls fail, socket remains null and is passed to SSHClient without validation, which will cause a runtime error.

Suggested fix
-Future<SSHClient> genClient(Spi spi) async {
-  // 1. Establecer socket
-  final socket = await connect(spi.ip, spi.port);
+Future<SSHClient> genClient(Spi spi) async {
+  // 1. Establecer socket
+  var socket = await connect(spi.ip, spi.port);

   // 2. Probar URL alternativa si falla
   if (socket == null && spi.alterUrl != null) {
     socket = await connect(spi.alterUrl, spi.port);
   }
+
+  if (socket == null) {
+    throw ConnectionException('No se pudo conectar');
+  }
docs/src/content/docs/ja/introduction.mdx-3-3 (1)

3-3: Minor grammatical issue in the description.

The phrase "とはその何か" is grammatically awkward in Japanese. The word "その" is unnecessary here.

Proposed fix
-description: Server Box とはその何か、何ができるのかを学ぶ
+description: Server Box とは何か、何ができるのかを学ぶ
docs/src/content/docs/introduction.mdx-23-28 (1)

23-28: Add watchOS back to the Supported Platforms section.

The watchOS platform was removed from introduction.mdx but remains listed in index.mdx (line 35) and all localized versions. Extensive watchOS documentation exists throughout the codebase, including installation guides, widgets, and troubleshooting sections. Restore watchOS to maintain consistency with the rest of the documentation.

🧹 Nitpick comments (17)
docs/src/content/docs/de/platforms/desktop.md (1)

62-67: Consider using German terminology for "Themes" for consistency.

The section uses the English term "Themes" while the rest of the document is in German. Consider using a German equivalent such as "Designs" or "Farbschemas" for better linguistic consistency, unless "Theme" matches the actual UI terminology.

💡 Alternative German terminology
-### Themes
+### Designs

-- Helles Theme
-- Dunkles Theme
-- AMOLED Theme (reines Schwarz)
-- System-Theme (folgt dem Betriebssystem)
+- Helles Design
+- Dunkles Design
+- AMOLED-Design (reines Schwarz)
+- System-Design (folgt dem Betriebssystem)
docs/src/content/docs/es/advanced/custom-logo.md (3)

19-21: Add language specifier to fenced code block.

The fenced code block should have a language identifier for proper rendering and accessibility.

📝 Suggested improvement
-```
+```text
 https://ejemplo.com/{DIST}.png
</details>

---

`29-31`: **Add language specifier to fenced code block.**

The fenced code block should have a language identifier for proper rendering.

<details>
<summary>📝 Suggested improvement</summary>

```diff
-```
+```text
 https://ejemplo.com/{BRIGHT}.png
</details>

---

`37-39`: **Add language specifier to fenced code block.**

The fenced code block should have a language identifier for proper rendering.

<details>
<summary>📝 Suggested improvement</summary>

```diff
-```
+```text
 https://ejemplo.com/{DIST}-{BRIGHT}.png
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/ja/advanced/custom-logo.md (3)</summary><blockquote>

`19-21`: **Add language specifier to fenced code block.**

The fenced code block should have a language identifier for proper rendering and consistency with markdown best practices.

<details>
<summary>📝 Suggested improvement</summary>

```diff
-```
+```text
 https://example.com/{DIST}.png
</details>

---

`29-31`: **Add language specifier to fenced code block.**

The fenced code block should have a language identifier for proper rendering.

<details>
<summary>📝 Suggested improvement</summary>

```diff
-```
+```text
 https://example.com/{BRIGHT}.png
</details>

---

`37-39`: **Add language specifier to fenced code block.**

The fenced code block should have a language identifier for proper rendering.

<details>
<summary>📝 Suggested improvement</summary>

```diff
-```
+```text
 https://example.com/{DIST}-{BRIGHT}.png
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/fr/development/testing.md (1)</summary><blockquote>

`23-31`: **Add language specifier to directory structure block.**

The fenced code block displaying the directory tree should have a language identifier for consistent rendering.

<details>
<summary>📝 Suggested improvement</summary>

```diff
-```
+```text
 test/
 ├── data/
 │   ├── model/
 │   └── provider/
 ├── view/
 │   └── widget/
 └── test_helpers.dart
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/de/advanced/custom-logo.md (1)</summary><blockquote>

`19-41`: **Consider adding language specifiers to code blocks for better syntax highlighting.**

The URL example code blocks (lines 19, 29, 37) could benefit from a language specifier like `text` or `url` for consistent rendering, though this is a minor enhancement.

<details>
<summary>📝 Optional improvement for code blocks</summary>

```diff
-```
+```text
 https://example.com/{DIST}.png

Apply similar changes to the other URL examples at lines 29 and 37.
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/ja/development/testing.md (1)</summary><blockquote>

`23-31`: **Consider adding a language identifier to the fenced code block.**

The directory structure is clear, but adding a language identifier (e.g., `text` or `bash`) would satisfy linting tools and improve consistency.



<details>
<summary>📝 Optional improvement</summary>

```diff
-```
+```text
 test/
 ├── data/
 │   ├── model/
docs/src/content/docs/zh/advanced/troubleshooting.md (1)

116-116: Consider formatting the raw URL as a Markdown link.

This improves readability and consistency with the rest of the docs.

🔧 Suggested tweak
-1. **搜索 GitHub Issues:** https://github.com/lollipopkit/flutter_server_box/issues
+1. **搜索 GitHub Issues:** [GitHub Issues](https://github.com/lollipopkit/flutter_server_box/issues)
docs/src/content/docs/fr/principles/ssh.md (1)

10-12: Add language tags to plaintext fences to satisfy markdownlint.

These fenced blocks are plaintext/diagrams and currently omit a language tag, which triggers MD040. Consider adding text (or plaintext) to each non-code fence.

✅ Example fix
-```
+```text
 Entrée utilisateur → Configuration Spi → genClient() → Client SSH → Session
-```
+```

Also applies to: 125-133, 138-145, 217-241

docs/src/content/docs/ja/principles/sftp.md (1)

10-37: Add a language tag to the ASCII diagram fence.

This diagram fence appears to be plaintext; adding text avoids MD040 linting.

✅ Example fix
-```
+```text
┌─────────────────────────────────────────────┐
│              SFTP UI レイヤー               │
│  - ファイルブラウザ (リモート)              │
│  - ファイルブラウザ (ローカル)              │
│  - 転送キュー                               │
└─────────────────────────────────────────────┘
                ↓
┌─────────────────────────────────────────────┐
│          SFTP 状態管理                      │
│  - sftpProvider                             │
│  - パス管理                                 │
│  - 操作キュー                               │
└─────────────────────────────────────────────┘
                ↓
┌─────────────────────────────────────────────┐
│         SFTP プロトコルレイヤー             │
│  - SSH サブシステム                         │
│  - ファイル操作                             │
│  - ディレクトリ一覧取得                     │
└─────────────────────────────────────────────┘
                ↓
┌─────────────────────────────────────────────┐
│            SSH 転送                         │
│  - セキュアチャネル                         │
│  - データストリーミング                     │
└─────────────────────────────────────────────┘
-```
+```
docs/src/content/docs/fr/principles/architecture.md (1)

10-34: Add language tags to plaintext fences to satisfy markdownlint.

These fenced blocks are diagrams/steps and omit a language tag. Adding text (or plaintext) will prevent MD040 warnings.

✅ Example fix
-```
+```text
┌─────────────────────────────────────────────────┐
│          Couche de présentation (UI)            │
│          lib/view/page/, lib/view/widget/       │
│  - Pages, Widgets, Contrôleurs                   │
└─────────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────┐
│         Couche logique métier                   │
│         lib/data/provider/                      │
│  - Riverpod Providers, State Notifiers          │
└─────────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────┐
│           Couche d'accès aux données            │
│         lib/data/store/, lib/data/model/        │
│  - Hive Stores, Modèles de données              │
└─────────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────────┐
│         Couche d'intégration externe            │
│  - SSH (dartssh2), Terminal (xterm), SFTP       │
│  - Code spécifique à la plateforme (iOS, etc.)  │
└─────────────────────────────────────────────────┘
-```
+```

Also applies to: 170-172, 182-189, 194-199

docs/src/content/docs/es/index.mdx (1)

44-44: Consider using the direct F-Droid app link.

Same issue as in the French index page - the F-Droid link points to the root domain rather than the specific app page.

Suggested fix
-- **Descarga**: Disponible en [App Store](https://apps.apple.com/app/id1586449703), [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) y [F-Droid](https://f-droid.org/)
++ **Descarga**: Disponible en [App Store](https://apps.apple.com/app/id1586449703), [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) y [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox/)
docs/src/content/docs/es/features/pve.md (1)

48-51: Consider using a placeholder for the password in the example.

The example shows a plaintext password (mypass) in the command. While this is documentation, it would be better practice to use a placeholder or environment variable to encourage secure password handling.

Suggested improvement
 ```bash
-pveum useradd myuser -password mypass
+pveum useradd myuser -password <YOUR_SECURE_PASSWORD>
 pveum aclmod /vms -user myuser@pve -role VMAdmin
</details>

</blockquote></details>
<details>
<summary>docs/src/content/docs/fr/index.mdx (1)</summary><blockquote>

`44-44`: **Link to the specific F-Droid app page.**

The F-Droid link points to the root domain instead of the Server Box app page. For consistency with the App Store and GitHub links, use the direct app link.

<details>
<summary>Suggested fix</summary>

```diff
-- **Téléchargement**: Disponible sur l'[App Store](https://apps.apple.com/app/id1586449703), [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) et [F-Droid](https://f-droid.org/)
++ **Téléchargement**: Disponible sur l'[App Store](https://apps.apple.com/app/id1586449703), [GitHub](https://github.com/lollipopkit/flutter_server_box/releases) et [F-Droid](https://f-droid.org/packages/tech.lolli.toolbox/)

@lollipopkit
Copy link
Owner Author

@coderabbitai 还有什么需要修改才能approve?

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 29, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check the PR details and any review comments from coderabbitai
gh pr view 1036 --repo lollipopkit/flutter_server_box --json reviews,reviewRequests,comments,statusCheckRollup,state | jq '.'

# Get review comments from coderabbitai specifically
gh api repos/lollipopkit/flutter_server_box/pulls/1036/comments --jq '.[] | select(.user.login == "coderabbitai[bot]") | {path: .path, line: .line, body: .body}'

Length of output: 170372


@lollipopkit 需要的修改很少了。为尽快 approve,我这边把“阻断项”和“可选项”分开如下:

必须修复后我才能 approve(阻断项)

  1. 修正 SSH 文档里的 Dart 代码片段

    • 文件:docs/src/content/docs/(zh|de|fr|es|ja)/principles/ssh.md
    • 问题A:final 变量被二次赋值。将 socket 声明改为 var,并在两次 connect 都失败时抛错。
      示例(dart):
      Future<SSHClient> genClient(Spi spi) async {
        var socket = await connect(spi.ip, spi.port);
        if (socket == null && spi.alterUrl != null) {
          socket = await connect(spi.alterUrl, spi.port);
        }
        if (socket == null) {
          throw ConnectionException('Unable to connect');
        }
        return SSHClient(socket: socket, ...);
      }
    • 问题B:已知主机指纹示例中使用了未定义变量 keyId/keyType。请改为使用 spi.id 和 key.type:
      final keyType = key.type;
      final stored = SettingStore.sshKnownHostsFingerprints['${spi.id}::$keyType'];
      // 首次信任后:
      SettingStore.sshKnownHostsFingerprints['${spi.id}::$keyType'] = fingerprint;
  2. 更新 Proxmox VE 版本要求

    • 文件:docs/src/content/docs/(zh|de|fr|es|ja)/features/pve.md
    • 现有文字仍写 6.x/7.x,请更新为当前受支持版本 8.x/9.x(按各语言改写)。
  3. 修正 JSON 隐藏设置(日文页)

    • 文件:docs/src/content/docs/ja/advanced/json-settings.md
    • 删除不存在的 serverTabUseOldUI 段落;将 timeout 键统一为 "timeOut"(例如 {"timeOut": 10})。recordHistory、textFactor 保持不变。
    • 如方便,也一并自查其他语言同页是否有同样问题。
  4. 纠正桌面快捷键说明(日文页)

    • 文件:docs/src/content/docs/ja/platforms/desktop.md
    • 去掉当前未实现的 Cmd/Ctrl + N / W / T 和“拖拽标签到新窗口”表述,仅保留已实现的:
      • Cmd/Ctrl + ,(设置)
      • Cmd + Q(退出)
      • Cmd/Ctrl + 1–9(标签切换)
        并注明 Windows/Linux 目前无跨平台菜单/快捷键实现的限制。
  5. 站点标题品牌一致性

    • 文件:docs/astro.config.mjs
    • 将 site title 从 'Flutter Server Box' 改为 'Server Box'。

可选项(不阻断,可后续 PR 处理)

  • 为大量 ASCII/URL 代码块补上 fenced language(text/url)以消除 markdownlint MD040/MD034 提示(多语言多文件,列表已在我的评论里逐一指明)。
  • 术语/语法微调(例:fr “au boot”→“au démarrage”、de “Jump-List-Schnellaktionen”、fr/es 的 F‑Droid 链接指向具体包页等)。
  • de/development/architecture.md 的序号重复;introduction.mdx 与各语言对 watchOS 的一致性;中文 terminal 文档含“特色功能”等额外段落,考虑同步到其他语言或抽到独立页面。

PR 元信息小建议(非阻断)

  • 标题更具体:例如
    docs: add full i18n (de, es, fr, ja, zh), rebrand to “Server Box”, remove legacy features chapter
  • 描述中简单列出范围与影响,保留 Fixes #1035

请确认是否按以上“阻断项”修一下。我这边在你推送这些修复后立即复审并给出 approve。如需,我也可以把“可选项”拆成跟进 issues。

@lollipopkit
Copy link
Owner Author

@coderabbitai 已经没有features chapter了

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 29, 2026

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Search for any PVE-related documentation files in the docs directory
echo "=== Searching for PVE-related files ==="
fd -e md -e mdx pve docs/

echo -e "\n=== Searching for PVE content in any files ==="
rg -l "Proxmox|PVE" docs/ --type md

echo -e "\n=== Check SSH principle files exist for code fix ==="
fd "ssh.md" docs/src/content/docs/

echo -e "\n=== Check JSON settings files exist ==="
fd "json-settings.md" docs/src/content/docs/

echo -e "\n=== Check desktop platform files exist ==="
fd "desktop.md" docs/src/content/docs/platforms/

Length of output: 827


🏁 Script executed:

#!/bin/bash
# Search for all desktop.md files in translated docs
echo "=== All desktop.md files ==="
fd "desktop.md" docs/src/content/docs/

echo -e "\n=== Check astro.config.mjs for site title ==="
grep -n "title:" docs/astro.config.mjs | head -20

Length of output: 374


@lollipopkit 非常抱歉!你说得对,features chapter 已经完全删除了,包括 PVE 文档也不存在了。我犯了个错误。

让我更正一下阻断项清单,实际上只剩下 3 项

必须修复的阻断项(3项)

1) 修正 SSH 文档里的 Dart 代码片段

  • 文件:docs/src/content/docs/(zh|de|fr|es|ja)/principles/ssh.md
  • 问题A:final socket 被二次赋值。改为 var socket
    Future<SSHClient> genClient(Spi spi) async {
      var socket = await connect(spi.ip, spi.port);
      if (socket == null && spi.alterUrl != null) {
        socket = await connect(spi.alterUrl, spi.port);
      }
      if (socket == null) {
        throw ConnectionException('Unable to connect');
      }
      return SSHClient(socket: socket, ...);
    }
  • 问题B:主机指纹示例使用未定义的 keyId/keyType,改为 spi.idkey.type
    final keyType = key.type;
    final stored = SettingStore.sshKnownHostsFingerprints['${spi.id}::$keyType'];

2) 修正 JSON 隐藏设置(日文页)

  • 文件:docs/src/content/docs/ja/advanced/json-settings.md
  • 删除不存在的 serverTabUseOldUI 段落
  • timeout 键统一为 "timeOut"(例如 {"timeOut": 10}
  • 如方便,也检查其他语言版本是否有同样问题

3) 纠正桌面快捷键说明(日文页)

  • 文件:docs/src/content/docs/ja/platforms/desktop.md
  • 去掉未实现的 Cmd/Ctrl + N / W / T 和"拖拽标签到新窗口"
  • 仅保留已实现的快捷键:
    • Cmd/Ctrl + ,(设置)
    • Cmd + Q(退出)
    • Cmd/Ctrl + 1–9(标签切换)

站点标题已经正确:我刚查看了 astro.config.mjs,title 已经是 'Server Box' 了,不需要修改。

❌ PVE 版本要求:此项无效,PVE 文档已删除。

修复这 3 项后我立即 approve!

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🤖 Fix all issues with AI agents
In `@docs/src/content/docs/de/principles/ssh.md`:
- Around line 18-28: Add the missing id field to the Spi model snippet: update
the class Spi declaration to include a unique identifier property (e.g., add
`String id; // eindeutige ID / unique identifier`) so that later references to
`spi.id` in the doc are consistent with the model; ensure the new `id` field
appears alongside existing properties like `name`, `ip`, `port`, `user`, `pwd`,
`keyId`, `jumpId`, and `alterUrl`.
- Around line 10-12: Several fenced code blocks are missing language specifiers
(MD040); find the fences containing the lines "Benutzereingabe →
Spi-Konfiguration → genClient() → SSH-Client → Sitzung", "{spi.id}::{keyType}",
"mein-server::ssh-ed25519", "aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99",
"SHA256:AbCdEf1234567890...=", and the ASCII-art box and update each opening ```
to include a language tag (use ```text for these examples) so every fenced block
has a language specifier; apply the same change to the other similar fences in
this file.

In `@docs/src/content/docs/es/principles/ssh.md`:
- Around line 18-28: The Spi model snippet is missing the id property referenced
later as spi.id; update the Dart class Spi by adding a unique identifier field
(e.g., String id; // ID del servidor) so the example matches later usage, and
apply the same addition to the other identical Spi snippets in the file (the
other occurrence around lines 129-171) to keep examples consistent.
- Around line 10-12: Several fenced code blocks in
docs/src/content/docs/es/principles/ssh.md are missing language specifiers
(causing MD040); update each triple-backtick fence around the shown examples
(e.g., the block containing "Entrada de Usuario → Configuración Spi →
genClient() → Cliente SSH → Sesión", the blocks with "{spi.id}::{keyType}",
"mi-servidor::ssh-ed25519", the MAC "aa:bb:...", the fingerprint
"SHA256:AbCdEf...", and the ASCII art table) to include a language tag such as
text (i.e., change ``` to ```text) and apply the same change to the other ranges
noted (lines ~129-149 and ~222-246) so every fenced block has a language
specifier.

In `@docs/src/content/docs/fr/principles/ssh.md`:
- Around line 18-28: The Spi model snippet is missing the id property used later
as spi.id; update the class Spi declaration to include an id field (e.g., String
id) alongside the other properties so the example matches usages elsewhere —
locate the class Spi in the snippet and add the id member with the same
type/nullable semantics as your other identifiers.
- Around line 10-12: Several fenced code blocks in
docs/src/content/docs/fr/principles/ssh.md are missing language specifiers
(MD040); update each triple-backtick fence shown (e.g., the block containing
"Entrée utilisateur → Configuration Spi → genClient() → Client SSH → Session",
the blocks with "{spi.id}::{keyType}", "mon-serveur::ssh-ed25519" /
"ecdsa-sha2-nistp256", the hex/mac/SHA256 fingerprint blocks, and the ASCII
diagram) to include a language tag such as ```text (apply the same change to the
other ranges noted: 129-149 and 222-246) so every fenced code block has a
language identifier.

In `@docs/src/content/docs/ja/principles/ssh.md`:
- Around line 18-28: The Spi model snippet is missing the identifier field used
later as spi.id; add a unique id property to the Spi class definition (e.g.,
include a field named id or spiId) so examples referencing spi.id match the
model; update the class declaration (class Spi) to include this identifier
alongside name, ip, port, user, pwd, keyId, jumpId, and alterUrl and ensure the
same field name is used throughout the docs where spi.id is referenced.
- Around line 10-12: Several fenced code blocks in
docs/src/content/docs/ja/principles/ssh.md are missing language specifiers
(MD040); locate each triple-backtick block (``` ... ```) — including the
examples containing "ユーザー入力 → Spi 構成 → genClient() → SSH クライアント → セッション",
"{spi.id}::{keyType}", "my-server::ssh-ed25519", "aa:bb:...:99",
"SHA256:AbCdEf1234567890...=", and the ASCII diagram — and add a language tag
(e.g., ```text) to each opening fence so all code blocks include a language
specifier; apply the same change to the other fenced blocks mentioned in the
comment (the ranges around the ASCII diagram and the other examples).

In `@docs/src/content/docs/zh/principles/ssh.md`:
- Around line 18-28: The Spi model snippet is missing the unique identifier used
elsewhere; update the class Spi declaration (the Spi model snippet) to include a
String id field with comment like "唯一标识" so later references to spi.id are valid
and consistent with fingerprint storage; make the same addition to the other Spi
snippet occurrence referenced in the doc to keep both examples consistent.
- Around line 10-12: Several fenced code blocks (e.g., the blocks containing
"用户输入 → Spi 配置 → genClient() → SSH 客户端 → 会话 (Session)", "{spi.id}::{keyType}",
"my-server::ssh-ed25519", "aa:bb:cc:dd:ee:ff:00:11:22:33:44:55:66:77:88:99",
"SHA256:AbCdEf1234567890...=", and the ASCII diagram) are missing a language tag
and trigger MD040; update each opening fence from ``` to ```text (or another
appropriate language) so every fenced block has a language specifier—apply the
same change to all similar fences in the file (including the other ranges noted)
to satisfy the linter.
🧹 Nitpick comments (1)
docs/src/content/docs/advanced/json-settings.md (1)

58-58: Consider adding this guideline to other language versions.

The English version includes an additional best practice: "Change one at a time - Test each setting". This helpful guidance is missing from the French, German, Spanish, and Japanese versions. Consider adding it for consistency.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 701d969 and f28a13a.

📒 Files selected for processing (13)
  • docs/astro.config.mjs
  • docs/src/content/docs/advanced/json-settings.md
  • docs/src/content/docs/de/advanced/json-settings.md
  • docs/src/content/docs/de/principles/ssh.md
  • docs/src/content/docs/es/advanced/json-settings.md
  • docs/src/content/docs/es/principles/ssh.md
  • docs/src/content/docs/fr/advanced/json-settings.md
  • docs/src/content/docs/fr/principles/ssh.md
  • docs/src/content/docs/ja/advanced/json-settings.md
  • docs/src/content/docs/ja/platforms/desktop.md
  • docs/src/content/docs/ja/principles/ssh.md
  • docs/src/content/docs/zh/advanced/json-settings.md
  • docs/src/content/docs/zh/principles/ssh.md
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/src/content/docs/zh/advanced/json-settings.md
🧰 Additional context used
🧠 Learnings (3)
📓 Common learnings
Learnt from: GT-610
Repo: lollipopkit/flutter_server_box PR: 0
File: :0-0
Timestamp: 2026-01-22T05:10:54.502Z
Learning: For all future pull requests in the flutter_server_box repository, check if participants from issues resolved by the PR are added to the `participants` field in `lib/data/res/github_id.dart`. If any participants are missing, propose adding them. First verify if they already exist or have been added in the PR commits.
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/l10n/**/*.arb : Keep localized strings in ARB files under lib/l10n/ (Flutter i18n)
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/l10n/**/*.arb : Keep localized strings in ARB files under lib/l10n/ (Flutter i18n)

Applied to files:

  • docs/astro.config.mjs
📚 Learning: 2025-10-08T09:36:41.682Z
Learnt from: CR
Repo: lollipopkit/flutter_server_box PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-10-08T09:36:41.682Z
Learning: Applies to lib/data/model/ssh/**/*.dart : Place SSH models under lib/data/model/ssh/

Applied to files:

  • docs/src/content/docs/es/principles/ssh.md
🪛 LanguageTool
docs/src/content/docs/es/principles/ssh.md

[grammar] ~8-~8: Corrige la mayúscula.
Context: ...exiones SSH en Server Box. ## Flujo de Conexión Entrada de Usuario → Configuración Spi → genClient() → Cliente SSH → Sesión ### Paso 1: Configuración El modelo Spi (...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~31-~31: Corrige la mayúscula.
Context: ...ativa } ### Paso 2: Generación del Cliente `genClient(spi)` crea el cliente SSH: dart Future<SS...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~33-~33: Aquí puede haber un error.
Context: ...Generación del Cliente genClient(spi) crea el cliente SSH: ```dart Future<SSH...

(QB_NEW_ES)


[grammar] ~33-~33: Corrige la minúscula.
Context: ...eneración del Cliente genClient(spi) crea el cliente SSH: ```dart Future<SSHClie...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_LOWERCASE)


[grammar] ~64-~64: Corrige la mayúscula.
Context: ... client; } ``` ### Paso 3: Servidor de Salto (si está configurado) Para servidores ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~79-~79: Corrige la mayúscula.
Context: ...l socket reenviado } ## Métodos de Autenticación ### Autenticación por Contraseña dart on...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~81-~81: Corrige la mayúscula.
Context: ...de Autenticación ### Autenticación por Contraseña dart onPasswordRequest: () => spi.pwd - Contraseña almacenada cifrada en Hive - ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~87-~87: Cambia la palabra o signo.
Context: ... - Contraseña almacenada cifrada en Hive - Descifrada al conectar - Enviada al serv...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~88-~88: Cambia la palabra o signo.
Context: ...cifrada en Hive - Descifrada al conectar - Enviada al servidor para verificación #...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~89-~89: Aquí puede haber un error.
Context: ... - Enviada al servidor para verificación ### Autenticación por Clave Privada ```dart...

(QB_NEW_ES)


[grammar] ~91-~91: Corrige la mayúscula.
Context: ...ara verificación ### Autenticación por Clave Privada ```dart onIdentityRequest: () ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~91-~91: Aquí puede haber un error.
Context: ...rificación ### Autenticación por Clave Privada dart onIdentityRequest: () async { final key = await KeyStore.get(spi.keyId); return decyptPem(key.pem, key.password); } Proceso de Carga de Clave: 1. Recupera...

(QB_NEW_ES)


[grammar] ~100-~100: Corrige la mayúscula.
Context: ...pem, key.password); } ``` Proceso de Carga de Clave: 1. Recuperar clave cifrada ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~100-~100: Corrige la mayúscula.
Context: ...password); } ``` Proceso de Carga de Clave: 1. Recuperar clave cifrada de KeyStore 2....

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~101-~101: Cambia la palabra o signo.
Context: ... Clave:** 1. Recuperar clave cifrada de KeyStore 2. Descifrar contraseña (biometría/aviso) 3...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~102-~102: Cambia la palabra o signo.
Context: .... Descifrar contraseña (biometría/aviso) 3. Analizar formato PEM 4. Estandarizar fin...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~103-~103: Cambia la palabra o signo.
Context: ...biometría/aviso) 3. Analizar formato PEM 4. Estandarizar finales de línea (LF) 5. Re...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~104-~104: Cambia la palabra o signo.
Context: ...EM 4. Estandarizar finales de línea (LF) 5. Retornar para autenticación ### Interac...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~105-~105: Aquí puede haber un error.
Context: ...ínea (LF) 5. Retornar para autenticación ### Interacción por Teclado (Keyboard-Intera...

(QB_NEW_ES)


[grammar] ~107-~107: Corrige la mayúscula.
Context: ...para autenticación ### Interacción por Teclado (Keyboard-Interactive) ```dart onUserI...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~117-~117: Cambia la palabra o signo.
Context: ... Soporta: - Autenticación por contraseña - Tokens OTP - Autenticación de doble fact...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~118-~118: Cambia la palabra o signo.
Context: ...utenticación por contraseña - Tokens OTP - Autenticación de doble factor (2FA) ## ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~121-~121: Corrige la mayúscula.
Context: ... doble factor (2FA) ## Verificación de Clave de Host ### ¿Por qué verificar las cla...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~121-~121: Corrige la mayúscula.
Context: ...ctor (2FA) ## Verificación de Clave de Host ### ¿Por qué verificar las claves de host? ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~127-~127: Corrige la mayúscula.
Context: ...ctas al mismo servidor. ### Formato de Almacenamiento {spi.id}::{keyType} Ejemplo: ``` mi-servidor::ssh-ed25519 mi...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~139-~139: Corrige la mayúscula.
Context: ...cdsa-sha2-nistp256 ### Formatos de Huella Digital (Fingerprint) **MD5 Hex:**...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~139-~139: Corrige la mayúscula.
Context: ...a2-nistp256 ### Formatos de Huella Digital (Fingerprint) **MD5 Hex:** aa:bb:c...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~139-~139: Corrige la mayúscula.
Context: ...56 ### Formatos de Huella Digital (Fingerprint) **MD5 Hex:** aa:bb:cc:dd:ee:ff:00...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~151-~151: Corrige la mayúscula.
Context: ...:AbCdEf1234567890...= ### Flujo de Verificación dart Future verifyHostKey(SSHClient client, Spi spi) async { final key = await client.hostKey; final keyType = key.type; final fingerprint = md5Hex(key); // o base64 final stored = SettingStore.sshKnownHostsFingerprints ['${spi.id}::$keyType']; if (stored == null) { // Nuevo host - preguntar al usuario final trust = await promptUser( 'Host desconocido', 'Huella: $fingerprint', ); if (trust) { SettingStore.sshKnownHostsFingerprints ['${spi.id}::$keyType'] = fingerprint; } } else if (stored != fingerprint) { // Ha cambiado - advertir al usuario await warnUser( '¡La clave de host ha cambiado!', 'Posible ataque MITM', ); } } ``` ## Gestión de Sesiones ### Pool de Conexio...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~182-~182: Corrige la mayúscula.
Context: ... MITM', ); } } ``` ## Gestión de Sesiones ### Pool de Conexiones Clientes activos man...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~184-~184: Corrige la mayúscula.
Context: ...`` ## Gestión de Sesiones ### Pool de Conexiones Clientes activos mantenidos en `ServerPr...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~209-~209: Corrige la mayúscula.
Context: ...sendKeepAlive(), ); ### Reconexión Automática Al perder la conexión: dart client.o...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~220-~220: Corrige la mayúscula.
Context: ...)); reconnect(); }); ## Ciclo de Vida de la Conexión ┌─────────────┐ │ ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~220-~220: Corrige la mayúscula.
Context: ...nect(); }); ## Ciclo de Vida de la Conexión ┌─────────────┐ │ Inicial │ └──────┬──────┘ │ connect() ↓ ┌─────────────┐ │ Conectando │ ←──┐ └──────┬──────┘ │ │ éxito │ ↓ │ fallo (reintento) ┌─────────────┐ │ │ Conectado │───┘ └──────┬──────┘ │ ↓ ┌─────────────┐ │ Activo │ ──→ Enviar comandos └──────┬──────┘ │ ↓ (error/desconexión) ┌─────────────┐ │ Desconectado│ └─────────────┘ ``` ## Gestión de Errores ### Tiempo de Espera...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~248-~248: Corrige la mayúscula.
Context: ...ado│ └─────────────┘ ## Gestión de Errores ### Tiempo de Espera Agotado (Timeout) d...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~250-~250: Corrige la mayúscula.
Context: ...` ## Gestión de Errores ### Tiempo de Espera Agotado (Timeout) ```dart try { awai...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~250-~250: Corrige la mayúscula.
Context: ...estión de Errores ### Tiempo de Espera Agotado (Timeout) ```dart try { await client...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~250-~250: Corrige la mayúscula.
Context: ... Errores ### Tiempo de Espera Agotado (Timeout) ```dart try { await client.connect(...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~262-~262: Corrige la mayúscula.
Context: ...conexión agotado'); } ### Fallo de Autenticación dart onAuthFail: (error) { if (error.contains('password')) { return 'Contraseña no válida'; } else if (error.contains('key')) { return 'Clave SSH no válida'; } return 'Fallo de autenticación'; } ### Discrepancia en Clave de Host dart o...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~275-~275: Corrige la mayúscula.
Context: ...enticación'; } ### Discrepancia en Clave de Host dart onHostKeyMismatch: (st...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~275-~275: Corrige la mayúscula.
Context: ...n'; } ### Discrepancia en Clave de Host dart onHostKeyMismatch: (stored, current) { showSecurityWarning( '¡La clave de host ha cambiado!', 'Posible ataque MITM', ); } ``` ## Consideraciones de Rendimiento ### Reut...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~286-~286: Corrige la mayúscula.
Context: ...ITM', ); } ``` ## Consideraciones de Rendimiento ### Reutilización de Conexiones - Reutiliza...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~288-~288: Corrige la mayúscula.
Context: ...es de Rendimiento ### Reutilización de Conexiones - Reutilizar clientes entre funciones - No...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~290-~290: Cambia la palabra o signo.
Context: ...s - Reutilizar clientes entre funciones - No desconectar/reconectar innecesariamen...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~291-~291: Cambia la palabra o signo.
Context: ... desconectar/reconectar innecesariamente - Pool de conexiones para operaciones conc...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~292-~292: Aquí puede haber un error.
Context: ...conexiones para operaciones concurrentes ### Ajustes Óptimos - Timeout: 30 segun...

(QB_NEW_ES)


[grammar] ~294-~294: Corrige la mayúscula.
Context: ...a operaciones concurrentes ### Ajustes Óptimos - Timeout: 30 segundos (ajustable) - **K...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~296-~296: Cambia la palabra o signo.
Context: ... - Timeout: 30 segundos (ajustable) - Keep-alive: Cada 30 segundos - **Retra...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~297-~297: Cambia la palabra o signo.
Context: ...able) - Keep-alive: Cada 30 segundos - Retraso de reintento: 5 segundos ### ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_SPACE)


[grammar] ~300-~300: Corrige la mayúscula.
Context: ...ntento**: 5 segundos ### Eficiencia de Red - Conexión única para múltiples operacione...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~302-~302: Cambia la palabra o signo.
Context: ...onexión única para múltiples operaciones - Comandos en tubería (pipeline) cuando se...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~303-~303: Cambia la palabra o signo.
Context: ...en tubería (pipeline) cuando sea posible - Evitar abrir múltiples conexiones

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~304-~304: Aquí puede haber un error.
Context: ...ible - Evitar abrir múltiples conexiones

(QB_NEW_ES)

docs/src/content/docs/fr/principles/ssh.md

[grammar] ~16-~16: Il y a peut-être une erreur ici
Context: ...Le modèle Spi (Server Parameter Info) contient : dart class Spi { String name; // Nom du serveur String ip; // Adresse IP int port; // Port SSH (par défaut 22) String user; // Nom d'utilisateur String? pwd; // Mot de passe (chiffré) String? keyId; // ID de la clé SSH String? jumpId; // ID du serveur de rebond (Jump server) String? alterUrl; // URL alternative } ### Étape 2 : Génération du client `genClie...

(QB_NEW_FR)


[grammar] ~33-~33: Il y a peut-être une erreur ici
Context: ...: Génération du client genClient(spi) crée le client SSH : ```dart Future<SSH...

(QB_NEW_FR)


[grammar] ~33-~33: «  crée  » semble plus probable dans ce contexte
Context: ... Génération du client genClient(spi) crée le client SSH : ```dart Future<SSHClie...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_LOWERCASE)


[grammar] ~33-~33: Il y a peut-être une erreur ici
Context: ...client genClient(spi) crée le client SSH : dart Future<SSHClient> genClient(Spi spi) async { // 1. Établir le socket var socket = await connect(spi.ip, spi.port); // 2. Essayer l'URL alternative en cas d'échec if (socket == null && spi.alterUrl != null) { socket = await connect(spi.alterUrl, spi.port); } if (socket == null) { throw ConnectionException('Unable to connect'); } // 3. Authentifier final client = SSHClient( socket: socket, username: spi.user, onPasswordRequest: () => spi.pwd, onIdentityRequest: () => loadKey(spi.keyId), ); // 4. Vérifier la clé d'hôte await verifyHostKey(client, spi); return client; } ### Étape 3 : Serveur de rebond (si configur...

(QB_NEW_FR)


[grammar] ~66-~66: Il y a peut-être une erreur ici
Context: ... Pour les serveurs de rebond, connexion récursive : dart if (spi.jumpId != null) { final jumpClient = await genClient(getJumpSpi(spi.jumpId)); final forwarded = await jumpClient.forwardLocal( spi.ip, spi.port, ); // Se connecter via le socket transféré } ## Méthodes d'authentification ### Authent...

(QB_NEW_FR)


[grammar] ~100-~100: Il y a peut-être une erreur ici
Context: ... } ``` Processus de chargement de la clé : 1. Récupérer la clé chiffrée depuis `...

(QB_NEW_FR)


[grammar] ~101-~101: Élément manquant
Context: ...la clé :** 1. Récupérer la clé chiffrée depuis KeyStore 2. Déchiffrer le mot de passe...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_OTHER)


[grammar] ~102-~102: Il y a peut-être une erreur ici
Context: ...iffrer le mot de passe (biométrie/invite) 3. Analyser le format PEM 4. Standardis...

(QB_NEW_FR)


[grammar] ~103-~103: Élément manquant
Context: ...biométrie/invite) 3. Analyser le format PEM 4. Standardiser les fins de ligne (LF) ...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_OTHER)


[grammar] ~104-~104: Il y a peut-être une erreur ici
Context: ...EM 4. Standardiser les fins de ligne (LF) 5. Retourner pour l'authentification #...

(QB_NEW_FR)


[grammar] ~123-~123: Il y a peut-être une erreur ici
Context: ... d'hôte ### Pourquoi vérifier les clés d'hôte ? Empêche les attaques de type **Man-in-th...

(QB_NEW_FR)


[grammar] ~132-~132: Il y a peut-être une erreur ici
Context: ... stockage {spi.id}::{keyType} Exemple : mon-serveur::ssh-ed25519 mon-serveur::ecdsa-sha2-nistp256 ### Formats d'empreinte MD5 Hex : ``` a...

(QB_NEW_FR)


[grammar] ~186-~186: Il y a peut-être une erreur ici
Context: ...Pooling) Clients actifs maintenus dans ServerProvider : dart class ServerProvider { final Map<String, SSHClient> _clients = {}; SSHClient getClient(String spiId) { return _clients[spiId] ??= connect(spiId); } } ### Keep-Alive Maintenir la connexion penda...

(QB_NEW_FR)


[grammar] ~200-~200: Il y a peut-être une erreur ici
Context: ...p-Alive Maintenir la connexion pendant l'inactivité : dart Timer.periodic( Duration(seconds: 30), (_) => client.sendKeepAlive(), ); ### Reconnexion automatique En cas de perte...

(QB_NEW_FR)


[grammar] ~296-~296: Il y a peut-être une erreur ici
Context: ...es ### Paramètres optimaux - Timeout : 30 secondes (ajustable) - **Keep-aliv...

(QB_NEW_FR)


[grammar] ~296-~296: Il y a peut-être une erreur ici
Context: ... ### Paramètres optimaux - Timeout : 30 secondes (ajustable) - Keep-alive : Toutes l...

(QB_NEW_FR)


[grammar] ~296-~296: Envisagez un remplacement
Context: ... - Timeout : 30 secondes (ajustable) - Keep-alive : Toutes les 30 secondes - ...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_SPACE_CLOSE_PARENTHESIS
CLOSE_PARENTHESIS_
)


[grammar] ~297-~297: Il y a peut-être une erreur ici
Context: ...: 30 secondes (ajustable) - Keep-alive : Toutes les 30 secondes - **Délai de r...

(QB_NEW_FR)


[grammar] ~297-~297: «  toutes  » semble plus probable dans ce contexte
Context: ...0 secondes (ajustable) - Keep-alive : Toutes les 30 secondes - *Délai de relecture...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~297-~297: Envisagez un remplacement
Context: ...justable) - Keep-alive : Toutes les 30 secondes - Délai de relecture : 5 secondes ### E...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_SPACE_
__
)


[grammar] ~298-~298: Il y a peut-être une erreur ici
Context: ...s les 30 secondes - Délai de relecture : 5 secondes ### Efficacité du réseau ...

(QB_NEW_FR)


[grammar] ~298-~298: Il y a peut-être une erreur ici
Context: ...es 30 secondes - Délai de relecture : 5 secondes ### Efficacité du réseau - Connexion unique...

(QB_NEW_FR)


[grammar] ~302-~302: Élément manquant
Context: ...seau - Connexion unique pour plusieurs opérations - Commandes en pipeline si possible - É...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_PUNCTUATION_PERIOD)


[grammar] ~303-~303: Élément manquant
Context: ...s opérations - Commandes en pipeline si possible - Éviter d'ouvrir plusieurs connexions ...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_PUNCTUATION_PERIOD)


[grammar] ~304-~304: Il y a peut-être une erreur ici
Context: ...e - Éviter d'ouvrir plusieurs connexions

(QB_NEW_FR)

docs/src/content/docs/de/principles/ssh.md

[grammar] ~6-~6: Korrigiere das Wort
Context: ...-- Verständnis der SSH-Verbindungen in Server Box. ## Verbindungsablauf ``` Benutzerein...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_MULTIPLE)


[style] ~16-~16: ‚Info‘ ist umgangssprachlich.
Context: ...figuration Das Spi (Server Parameter Info) Modell enthält: ```dart class Spi { ...

(MATHE)


[grammar] ~88-~88: Passe die Groß- und Kleinschreibung an
Context: ...ort verschlüsselt in Hive gespeichert - Bei Verbindung entschlüsselt - Zur Verifizi...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~89-~89: Passe die Groß- und Kleinschreibung an
Context: ...ichert - Bei Verbindung entschlüsselt - Zur Verifizierung an den Server gesendet #...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~107-~107: Passe den Tippfehler an
Context: ...entifizierung zurückgeben ### Tastatur-Interaktiv (Keyboard-Interactive) ```dart onUserI...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_OTHERCASE)


[grammar] ~107-~107: Passe den Tippfehler an
Context: ...eben ### Tastatur-Interaktiv (Keyboard-Interactive) ```dart onUserInfoRequest: (instructi...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_OTHERCASE)


[grammar] ~125-~125: Entferne ein Leerzeichen
Context: ...izieren? Verhindert Man-in-the-Middle (MITM) Angriffe, indem sichergestellt ...

(QB_NEW_DE_OTHER_ERROR_IDS_UNNECESSARY_ORTHOGRAPHY_SPACE)


[style] ~125-~125: Möglicherweise ist es stilistisch besser, eine standardsprachliche Alternative zu benutzen.
Context: ...ieren? Verhindert Man-in-the-Middle (MITM) Angriffe, indem sichergestellt wird,...

(HINTERM_MOND)


[grammar] ~125-~125: Entferne ein Leerzeichen
Context: ... Verhindert Man-in-the-Middle (MITM) Angriffe, indem sichergestellt wird, das...

(QB_NEW_DE_OTHER_ERROR_IDS_UNNECESSARY_ORTHOGRAPHY_SPACE)


[grammar] ~125-~125: Ersetze das Satzzeichen
Context: ...ird, dass Sie sich mit demselben Server verbinden. ### Speicherformat ``` {spi.id}::{keyType} ...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_PUNCTUATION_PERIOD_QUESTION_MARK)


[grammar] ~296-~296: Korrigiere die Fehler
Context: ... - Timeout: 30 Sekunden (anpassbar) - Keep-Alive: Alle 30 Sekunden - **Wiede...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_MULTITOKEN)


[grammar] ~297-~297: Passe die Groß- und Kleinschreibung an
Context: ... Sekunden (anpassbar) - Keep-Alive: Alle 30 Sekunden - **Wiederholungsverzögerun...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~297-~297: Korrigiere das Wort
Context: ...sbar) - Keep-Alive: Alle 30 Sekunden - Wiederholungsverzögerung: 5 Sekunden ...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_SPACE)

docs/src/content/docs/de/advanced/json-settings.md

[grammar] ~22-~22: Ergänze ein Wort
Context: ...kunden. json {"timeOut": 10} Typ: Integer | Standard: 5 | **Bereich...

(QB_NEW_DE_OTHER_ERROR_IDS_MISSING_NOUN)


[grammar] ~22-~22: Ersetze das Satzzeichen
Context: ...nteger | Standard: 5 | Bereich: 1-60 ### recordHistory Verlauf speichern (SFTP-P...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_PUNCTUATION_DASH_–)


[grammar] ~32-~32: Ergänze ein Wort
Context: ... json {"recordHistory": true} Typ: Boolean | Standard: true ### tex...

(QB_NEW_DE_OTHER_ERROR_IDS_MISSING_NOUN)


[grammar] ~36-~36: Entferne ein Satzzeichen
Context: ...e ### textFactor Textskalierungsfaktor. json {"textFactor": 1.2} Typ: Double | Standard: 1.0 | **Be...

(QB_NEW_DE_OTHER_ERROR_IDS_UNNECESSARY_PUNCTUATION_PERIOD)


[grammar] ~42-~42: Ergänze ein Wort
Context: ...or. json {"textFactor": 1.2} Typ: Double | Standard: 1.0 | **Bereic...

(QB_NEW_DE_OTHER_ERROR_IDS_MISSING_NOUN)


[grammar] ~42-~42: Ersetze das Satzzeichen
Context: ...le | Standard: 1.0 | Bereich: 0.8-1.5 ## Weitere Einstellungen finden All...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_PUNCTUATION_DASH_–)


[grammar] ~56-~56: Hier könnte ein Fehler sein.
Context: ...tig Vor dem Bearbeiten: - Backup erstellen - Falsche Einstellungen können dazu füh...

(QB_NEW_DE)


[grammar] ~56-~56: Entferne ein Wort
Context: ...em Bearbeiten:** - Backup erstellen - Falsche Einstellungen können dazu führen, dass ...

(QB_NEW_DE_OTHER_ERROR_IDS_UNNECESSARY_NOUN)


[grammar] ~57-~57: Passe das Symbol an
Context: ...ie App nicht mehr öffnet - Sorgfältig bearbeiten - JSON muss gültig sein ## Wiederherstel...

(QB_NEW_DE_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~61-~61: Hier könnte ein Fehler sein.
Context: ...iederherstellung Wenn die App nach dem Bearbeiten nicht mehr öffnet: 1. App-Daten löschen...

(QB_NEW_DE)

docs/src/content/docs/es/advanced/json-settings.md

[grammar] ~6-~6: Agrega un signo de puntuación.
Context: ...ajustes están ocultos en la interfaz de usuario pero son accesibles a través del editor...

(QB_NEW_ES_OTHER_ERROR_IDS_MISSING_PUNCTUATION)


[grammar] ~12-~12: Corrige la mayúscula.
Context: ... para abrir el editor JSON. ## Ajustes Ocultos Comunes ### timeOut Tiempo de espera ...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~12-~12: Aquí puede haber un error.
Context: ...rir el editor JSON. ## Ajustes Ocultos Comunes ### timeOut Tiempo de espera de conexión en...

(QB_NEW_ES)


[grammar] ~22-~22: Aquí puede haber un error.
Context: ...gundos. json {"timeOut": 10} Tipo: entero | Predeterminado: 5 | **Ra...

(QB_NEW_ES)


[grammar] ~22-~22: Agrega un espacio.
Context: ... json {"timeOut": 10} Tipo: entero | Predeterminado: 5 | **Rango...

(QB_NEW_ES_OTHER_ERROR_IDS_MISSING_ORTHOGRAPHY_SPACE)


[grammar] ~22-~22: Agrega una palabra o signo.
Context: ... json {"timeOut": 10} Tipo: entero | Predeterminado: 5 | Rango: 1-...

(QB_NEW_ES_OTHER_ERROR_IDS_MISSING_OTHER)


[grammar] ~32-~32: Aquí puede haber un error.
Context: ... json {"recordHistory": true} Tipo: booleano | Predeterminado: true ...

(QB_NEW_ES)


[grammar] ~32-~32: Agrega un espacio.
Context: ...n {"recordHistory": true} ``` Tipo: booleano | Predeterminado: true ###...

(QB_NEW_ES_OTHER_ERROR_IDS_MISSING_ORTHOGRAPHY_SPACE)


[grammar] ~32-~32: Agrega una palabra o signo.
Context: ... {"recordHistory": true} ``` Tipo: booleano | Predeterminado: true ### textFac...

(QB_NEW_ES_OTHER_ERROR_IDS_MISSING_OTHER)


[grammar] ~44-~44: Corrige la mayúscula.
Context: ... 1.0 | Rango: 0.8-1.5 ## Encontrar Más Ajustes Todos los ajustes están defini...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_ORTHOGRAPHY_UPPERCASE)


[grammar] ~44-~44: Aquí puede haber un error.
Context: ... | Rango: 0.8-1.5 ## Encontrar Más Ajustes Todos los ajustes están definidos en [`s...

(QB_NEW_ES)


[grammar] ~56-~56: Cambia la palabra o signo.
Context: ...ectos pueden hacer que la app no se abra - Edita con cuidado: el JSON debe ser vá...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~57-~57: Aquí puede haber un error.
Context: ...a con cuidado**: el JSON debe ser válido ## Recuperación Si la aplicación no se abr...

(QB_NEW_ES)


[grammar] ~62-~62: Cambia la palabra o signo.
Context: ... datos de la aplicación (último recurso) 2. Reinstala la aplicación 3. Restaura desd...

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~63-~63: Cambia la palabra o signo.
Context: ...timo recurso) 2. Reinstala la aplicación 3. Restaura desde una copia de seguridad

(QB_NEW_ES_OTHER_ERROR_IDS_REPLACEMENT_OTHER)


[grammar] ~64-~64: Aquí puede haber un error.
Context: ...3. Restaura desde una copia de seguridad

(QB_NEW_ES)

docs/src/content/docs/fr/advanced/json-settings.md

[grammar] ~22-~22: Il y a peut-être une erreur ici
Context: ...condes. json {"timeOut": 10} Type : entier | Par défaut : 5 | **Plag...

(QB_NEW_FR)


[grammar] ~22-~22: Typographie
Context: ... json {"timeOut": 10} Type : entier | Par défaut : 5 | **Plage :*...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_ORTHOGRAPHY_SPACE)


[grammar] ~22-~22: Mot manquant
Context: ...json {"timeOut": 10} Type : entier | Par défaut : 5 | Plage : 1-60...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_ADJECTIVE)


[grammar] ~32-~32: Il y a peut-être une erreur ici
Context: ... json {"recordHistory": true} Type : booléen | Par défaut : true ###...

(QB_NEW_FR)


[grammar] ~32-~32: Typographie
Context: ... {"recordHistory": true} ``` Type : booléen | Par défaut : true ### tex...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_ORTHOGRAPHY_SPACE)


[grammar] ~42-~42: Typographie
Context: ...json {"textFactor": 1.2} Type : double | Par défaut : 1.0 | **Pla...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_ORTHOGRAPHY_SPACE)


[grammar] ~42-~42: Typographie
Context: ...json {"textFactor": 1.2} ``` Type : double | Par défaut : 1.0 | **Plage ...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_ORTHOGRAPHY_SPACE)


[grammar] ~42-~42: Mot manquant
Context: ...son {"textFactor": 1.2} ``` Type : double | Par défaut : 1.0 | Plage : 0....

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_ADJECTIVE)


[typographical] ~46-~46: Caractère d’apostrophe incorrect.
Context: ... Tous les paramètres sont définis dans [setting.dart](https://github.com/lollip...

(APOS_INCORRECT)


[grammar] ~47-~47: Il y a peut-être une erreur ici
Context: ...lob/main/lib/data/store/setting.dart). Recherchez : dart late final settingName = StoreProperty(box, 'settingKey', defaultValue); ## ⚠️ Important Avant d'éditer : - **C...

(QB_NEW_FR)


[grammar] ~56-~56: Envisagez un remplacement
Context: ...d'éditer :** - Créer une sauvegarde - De mauvais paramètres peuvent empêcher ...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_PUNCTUATION_DASH_–)


[grammar] ~56-~56: Élément manquant
Context: ...amètres peuvent empêcher l'ouverture de l'application - Éditer avec soin - Le JSON doit ê...

(QB_NEW_FR_OTHER_ERROR_IDS_MISSING_PUNCTUATION_PERIOD)


[grammar] ~57-~57: Envisagez un remplacement
Context: ...de l'application - Éditer avec soin - Le JSON doit être valide ## Récupérati...

(QB_NEW_FR_OTHER_ERROR_IDS_REPLACEMENT_PUNCTUATION_DASH_–)


[grammar] ~57-~57: Il y a peut-être une erreur ici
Context: ...r avec soin** - Le JSON doit être valide ## Récupération Si l'application ne s'ouvr...

(QB_NEW_FR)

docs/src/content/docs/zh/principles/ssh.md

[uncategorized] ~291-~291: 动词的修饰一般为‘形容词(副词)+地+动词’。您的意思是否是:必要"地"断开
Context: ...## 性能考量 ### 连接复用 - 在不同功能间复用客户端 - 避免不必要的断开和重连 - 为并发操作建立连接池 ### 最佳设置 - 超时时间...

(wb4)

🪛 markdownlint-cli2 (0.20.0)
docs/src/content/docs/ja/principles/ssh.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


129-129: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


134-134: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


142-142: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


147-147: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


222-222: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/src/content/docs/es/principles/ssh.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


129-129: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


134-134: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


142-142: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


147-147: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


222-222: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

docs/src/content/docs/zh/principles/ssh.md

10-10: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


129-129: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


134-134: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


142-142: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


147-147: Fenced code blocks should have a language specified

(MD040, fenced-code-language)


222-222: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 180000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Cloudflare Pages
🔇 Additional comments (12)
docs/astro.config.mjs (2)

9-37: LGTM! Title change and i18n configuration look correct.

The title change from 'Flutter Server Box' to 'Server Box' addresses the branding consistency requirement from the PR review. The i18n configuration follows Starlight conventions properly:

  • Using root as defaultLocale with English is the recommended pattern
  • All locale entries have the required label and lang properties
  • Six languages configured (en, zh, de, fr, es, ja)

44-126: Sidebar translations are well-structured.

The translations are properly organized with:

  • Group-level translations for section headers
  • Item-level translations for individual navigation entries
  • Consistent translation coverage across all supported locales
  • Proper JavaScript string escaping (e.g., 'Gestion d\'état' on line 106)
docs/src/content/docs/advanced/json-settings.md (1)

14-42: LGTM! JSON settings documentation is accurate.

All three documented hidden settings (timeOut, recordHistory, textFactor) use the correct JSON keys and have accurate type/default/range information.

docs/src/content/docs/fr/advanced/json-settings.md (1)

14-42: LGTM! French documentation is accurate.

All JSON setting keys (timeOut, recordHistory, textFactor) and their examples are correct and consistent with the codebase.

docs/src/content/docs/ja/advanced/json-settings.md (1)

14-42: LGTM! Previous blocking issues have been resolved.

The Japanese documentation now correctly uses:

  • timeOut with proper capitalization ({"timeOut": 10})
  • Only valid settings (serverTabUseOldUI has been removed)

All settings are accurate and consistent with the verified codebase definitions.

docs/src/content/docs/es/advanced/json-settings.md (1)

14-42: LGTM! Spanish documentation is accurate.

All JSON setting keys and examples are correct. The documentation properly uses timeOut (with capital O) and includes only valid settings.

docs/src/content/docs/de/advanced/json-settings.md (1)

14-42: LGTM! German documentation is accurate.

All JSON setting keys and examples are correct. The documentation properly documents the three valid hidden settings with accurate types, defaults, and ranges.

docs/src/content/docs/ja/platforms/desktop.md (4)

55-64: Keyboard shortcuts section is now accurate and complete! ✓

The keyboard shortcuts documentation correctly lists only the implemented shortcuts (Cmd + ,, Cmd + Q, Cmd + 1-9), properly scopes them to macOS only, and includes an appropriate note about Windows/Linux limitations. This resolves the previously flagged blocking issue.


8-51: Platform-specific features are well-documented.

The macOS, Linux, and Windows sections appropriately describe standard platform capabilities (menu bar integration, system tray, jump lists, Touch Bar, etc.) with proper platform scoping. The optional/device-specific qualifications (e.g., Touch Bar for compatible devices) are appropriately noted.


66-78: Cross-platform features and desktop advantages accurately described.

The themes section correctly lists the available theme options (confirmed in previous code verification), and the desktop advantages section provides appropriate general guidance about desktop platform benefits.


1-78: Documentation accurately reflects desktop platform capabilities.

This Japanese desktop documentation file correctly describes the platform-specific and cross-platform features, with accurate scoping of capabilities to their respective platforms. The previously identified blocking issue regarding keyboard shortcuts has been successfully resolved, and all feature claims align with the application's actual implementation.

docs/src/content/docs/zh/principles/ssh.md (1)

1-4: Verify issue participants are recorded in lib/data/res/github_id.dart.

This PR fixes #1035. Confirm that participants from that issue are added to the participants field in lib/data/res/github_id.dart, or add them if missing. (Requires access to issue details to identify participants.)

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

@lollipopkit
Copy link
Owner Author

@coderabbitai 可以approve了吗

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 29, 2026

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check SSH docs for the socket and keyId/keyType issues in all translated versions
echo "=== Checking SSH docs for socket declaration issue ==="
for lang in zh de fr es ja; do
  echo -e "\n--- $lang/principles/ssh.md ---"
  if [ -f "docs/src/content/docs/$lang/principles/ssh.md" ]; then
    echo "Socket declaration pattern:"
    rg -A5 "socket.*connect.*spi\.ip" "docs/src/content/docs/$lang/principles/ssh.md" || echo "Pattern not found"
    echo -e "\nKeyId/keyType usage:"
    rg "keyId|keyType|spi\.id.*key\.type" "docs/src/content/docs/$lang/principles/ssh.md" || echo "Pattern not found"
  else
    echo "File not found"
  fi
done

echo -e "\n\n=== Checking Japanese JSON settings page ==="
if [ -f "docs/src/content/docs/ja/advanced/json-settings.md" ]; then
  echo "Checking for serverTabUseOldUI:"
  rg -i "serverTabUseOldUI" "docs/src/content/docs/ja/advanced/json-settings.md" || echo "NOT FOUND (good)"
  echo -e "\nChecking timeout vs timeOut:"
  rg "timeout|timeOut" "docs/src/content/docs/ja/advanced/json-settings.md"
else
  echo "File not found"
fi

echo -e "\n\n=== Checking Japanese desktop page for shortcuts ==="
if [ -f "docs/src/content/docs/ja/platforms/desktop.md" ]; then
  echo "Checking for Cmd/Ctrl + N/W/T shortcuts:"
  rg "Cmd.*\+.*[NWT]|Ctrl.*\+.*[NWT]" "docs/src/content/docs/ja/platforms/desktop.md" || echo "NOT FOUND (good)"
  echo -e "\nChecking for drag tab mention:"
  rg -i "drag|ドラッグ|拖" "docs/src/content/docs/ja/platforms/desktop.md" || echo "NOT FOUND (good)"
  echo -e "\nShowing keyboard shortcuts section:"
  rg -A20 "キーボードショートカット|Keyboard|ショートカット" "docs/src/content/docs/ja/platforms/desktop.md" | head -30
else
  echo "File not found"
fi

Length of output: 3418


@lollipopkit はい、すべて確認しました!✅

修正確認結果

✅ 1) SSH ドキュメント (zh|de|fr|es|ja)/principles/ssh.md

  • var socket を使用(final の再代入エラー解消)
  • spi.idkey.type を使用(未定義変数 keyId/keyType 削除)

✅ 2) 日本語 JSON 設定ページ

  • serverTabUseOldUI 削除済み
  • "timeOut" キーを使用("timeout" から修正)

✅ 3) 日本語デスクトップページ

  • 未実装のショートカット(Cmd/Ctrl + N/W/T、タブのドラッグ)削除済み
  • 実装済みのショートカットのみ記載(Cmd+,、Cmd+Q、Cmd+1-9)

すべての必須修正が完了していますので、approve します!🎉

✅ Actions performed

Comments resolved and changes approved.

@lollipopkit lollipopkit merged commit 6338c6c into main Jan 29, 2026
3 checks passed
@lollipopkit lollipopkit deleted the lollipopkit/issue1035 branch January 29, 2026 12:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

opt.: docs l10n

1 participant