Explorar el Código

feat(i18n): localize doctor module output messages

Added doctor-* keys to all 6 locale FTL files for:
  - doctor-header: header with name/engine/backend
  - doctor-node-section: node section separator
  - doctor-all-passed: success summary
  - doctor-checks-failed: failure summary
  - doctor-repairing: repair start message
  - doctor-repaired: repair completion
  - doctor-dry-build: dry-run build message

Note: the individual check names (Docker, NVIDIA GPU, NCCL libs,
Engine, Entrypoint) and their detail lines (OK/error output from
the commands) remain in English since they embed dynamic command
output that is not easily localizable.
Alexander Korolev hace 4 meses
padre
commit
5019c1cb34
Se han modificado 7 ficheros con 69 adiciones y 9 borrados
  1. 7 0
      locales/de/main.ftl
  2. 7 0
      locales/en/main.ftl
  3. 7 0
      locales/es/main.ftl
  4. 7 0
      locales/fr/main.ftl
  5. 7 0
      locales/it/main.ftl
  6. 7 0
      locales/ru/main.ftl
  7. 27 9
      src/doctor.rs

+ 7 - 0
locales/de/main.ftl

@@ -14,3 +14,10 @@ no-sm121-containers = (keine sm121-Container)
 docker-unavailable = ✗ Docker nicht verfügbar
 ssh-error = { $node } ({ $ip }): ✗ SSH-Fehler: { $error }
 task-join-error = ✗ Task-Join-Fehler: { $error }
+doctor-header = 🩺 Diagnose: { $name } ({ $engine }) [backend: { $backend }]
+doctor-node-section = --- { $name } ---
+doctor-all-passed = ✅ Alle Prüfungen bestanden!
+doctor-checks-failed = ⚠ Einige Prüfungen fehlgeschlagen. Führen Sie mit --repair zur Selbstreparatur aus.
+doctor-repairing = 🔧 Image-Reparatur läuft...
+doctor-repaired = ✅ Image repariert: { $tag }
+doctor-dry-build = (dry-run) Würde { $tag } auf { $node } bauen

+ 7 - 0
locales/en/main.ftl

@@ -14,3 +14,10 @@ no-sm121-containers = (no sm121 containers)
 docker-unavailable = ✗ Docker unavailable
 ssh-error = { $node } ({ $ip }): ✗ SSH error: { $error }
 task-join-error = ✗ Task join error: { $error }
+doctor-header = 🩺 Doctor: { $name } ({ $engine }) [backend: { $backend }]
+doctor-node-section = --- { $name } ---
+doctor-all-passed = ✅ All checks passed!
+doctor-checks-failed = ⚠ Some checks failed. Run with --repair to auto-fix.
+doctor-repairing = 🔧 Repairing image...
+doctor-repaired = ✅ Repaired image: { $tag }
+doctor-dry-build = (dry-run) Would build { $tag } on { $node }

+ 7 - 0
locales/es/main.ftl

@@ -14,3 +14,10 @@ no-sm121-containers = (sin contenedores sm121)
 docker-unavailable = ✗ Docker no disponible
 ssh-error = { $node } ({ $ip }): ✗ Error SSH: { $error }
 task-join-error = ✗ Error al unir tarea: { $error }
+doctor-header = 🩺 Diagnóstico: { $name } ({ $engine }) [backend: { $backend }]
+doctor-node-section = --- { $name } ---
+doctor-all-passed = ✅ ¡Todas las comprobaciones superadas!
+doctor-checks-failed = ⚠ Algunas comprobaciones fallaron. Ejecute con --repair para auto-corregir.
+doctor-repairing = 🔧 Reparando imagen...
+doctor-repaired = ✅ Imagen reparada: { $tag }
+doctor-dry-build = (dry-run) Se construiría { $tag } en { $node }

+ 7 - 0
locales/fr/main.ftl

@@ -14,3 +14,10 @@ no-sm121-containers = (aucun conteneur sm121)
 docker-unavailable = ✗ Docker indisponible
 ssh-error = { $node } ({ $ip }): ✗ Erreur SSH : { $error }
 task-join-error = ✗ Erreur de jonction de tâche : { $error }
+doctor-header = 🩺 Diagnostic : { $name } ({ $engine }) [backend: { $backend }]
+doctor-node-section = --- { $name } ---
+doctor-all-passed = ✅ Toutes les vérifications réussies !
+doctor-checks-failed = ⚠ Certaines vérifications ont échoué. Exécutez avec --repair pour auto-corriger.
+doctor-repairing = 🔧 Réparation de l'image en cours...
+doctor-repaired = ✅ Image réparée : { $tag }
+doctor-dry-build = (dry-run) Construirait { $tag } sur { $node }

+ 7 - 0
locales/it/main.ftl

@@ -14,3 +14,10 @@ no-sm121-containers = (nessun contenitore sm121)
 docker-unavailable = ✗ Docker non disponibile
 ssh-error = { $node } ({ $ip }): ✗ Errore SSH: { $error }
 task-join-error = ✗ Errore di unione attività: { $error }
+doctor-header = 🩺 Diagnostica: { $name } ({ $engine }) [backend: { $backend }]
+doctor-node-section = --- { $name } ---
+doctor-all-passed = ✅ Tutti i controlli superati!
+doctor-checks-failed = ⚠ Alcuni controlli non sono riusciti. Esegui con --repair per auto-correggere.
+doctor-repairing = 🔧 Riparazione immagine in corso...
+doctor-repaired = ✅ Immagine riparata: { $tag }
+doctor-dry-build = (dry-run) Verrebbe costruito { $tag } su { $node }

+ 7 - 0
locales/ru/main.ftl

@@ -15,3 +15,10 @@ no-sm121-containers = (нет контейнеров sm121)
 docker-unavailable = ✗ Docker недоступен
 ssh-error = { $node } ({ $ip }): ✗ SSH ошибка: { $error }
 task-join-error = ✗ Task join error: { $error }
+doctor-header = 🩺 Диагностика: { $name } ({ $engine }) [backend: { $backend }]
+doctor-node-section = --- { $name } ---
+doctor-all-passed = ✅ Все проверки пройдены!
+doctor-checks-failed = ⚠ Некоторые проверки не пройдены. Запустите с --repair для авто-исправления.
+doctor-repairing = 🔧 Восстанавливаю образ...
+doctor-repaired = ✅ Образ восстановлен: { $tag }
+doctor-dry-build = (dry-run) Был бы собран { $tag } на { $node }

+ 27 - 9
src/doctor.rs

@@ -42,9 +42,16 @@ pub async fn doctor(
     dry_run: bool,
 ) -> Result<()> {
     let recipe = load_recipe(recipe_name).await?;
+    let dn = recipe.name.clone();
+    let de = recipe.engine.clone();
+    let db = recipe.distributed_backend.clone();
     println!(
-        "\n🩺 Doctor: {} ({}) [backend: {}]",
-        recipe.name, recipe.engine, recipe.distributed_backend
+        "{}",
+        fluent_i18n::t!("doctor-header", {
+            "name" => dn,
+            "engine" => de,
+            "backend" => db,
+        })
     );
 
     let (cluster, _nccl) = resolve_cluster(config, &recipe, cluster_name)?;
@@ -72,7 +79,10 @@ pub async fn doctor(
     // Print results
     let mut has_failures = false;
     for result in &all_results {
-        println!("\n--- {} ---", result.node_name);
+        println!(
+            "{}",
+            fluent_i18n::t!("doctor-node-section", { "name" => &result.node_name })
+        );
         for check in &result.checks {
             println!("  {} {} {}", check.status, check.name, check.detail);
             if check.status == DoctorStatus::Fail {
@@ -83,15 +93,18 @@ pub async fn doctor(
 
     if has_failures {
         if repair {
-            println!("\n🔧 Repairing image...");
+            println!("{}", fluent_i18n::t!("doctor-repairing"));
             let repaired = run_cluster_repair(config, &cluster, &recipe, dry_run).await?;
-            println!("✅ Repaired image: {}", repaired);
+            println!(
+                "{}",
+                fluent_i18n::t!("doctor-repaired", { "tag" => &repaired })
+            );
         } else {
-            println!("\n⚠ Some checks failed. Run with --repair to auto-fix.");
+            println!("{}", fluent_i18n::t!("doctor-checks-failed"));
             std::process::exit(1);
         }
     } else {
-        println!("\n✅ All checks passed!");
+        println!("{}", fluent_i18n::t!("doctor-all-passed"));
     }
 
     Ok(())
@@ -249,9 +262,14 @@ async fn run_cluster_repair(
             .context("Failed to build repaired image")?;
         println!("Build output: {}", output.lines().last().unwrap_or(&output));
     } else {
+        let dtag = repaired_tag.clone();
+        let dnode = head_node.name.clone();
         println!(
-            "  (dry-run) Would build {} on {}",
-            repaired_tag, head_node.name
+            "{}",
+            fluent_i18n::t!("doctor-dry-build", {
+                "tag" => dtag,
+                "node" => dnode,
+            })
         );
     }